This commit is contained in:
Benjamin Toby 2026-03-12 15:41:11 +01:00
parent b4aa34a109
commit 25f966250c
18 changed files with 30 additions and 23 deletions

2
dist/web/BUILD_ID vendored
View File

@ -1 +1 @@
6OhPnSAl3Wt2w-eNVYzZ_ EOJ93GZV05yhDPpOS-XSu

View File

@ -5,8 +5,8 @@
"devFiles": [], "devFiles": [],
"ampDevFiles": [], "ampDevFiles": [],
"lowPriorityFiles": [ "lowPriorityFiles": [
"static/6OhPnSAl3Wt2w-eNVYzZ_/_buildManifest.js", "static/EOJ93GZV05yhDPpOS-XSu/_buildManifest.js",
"static/6OhPnSAl3Wt2w-eNVYzZ_/_ssgManifest.js" "static/EOJ93GZV05yhDPpOS-XSu/_ssgManifest.js"
], ],
"rootMainFiles": [], "rootMainFiles": [],
"pages": { "pages": {

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
{"version":4,"routes":{},"dynamicRoutes":{},"preview":{"previewModeId":"16a5efec8bbed95c9eebf7c87e9e7350","previewModeSigningKey":"707684f0d688d54cdbdb6f722e62c544a84222f349e48857bafe14c4f98b7a19","previewModeEncryptionKey":"cd46053a9861af4c047576815847ffeb05e9135ea8610c37489a9c9ab9e15f1f"},"notFoundRoutes":[]} {"version":4,"routes":{},"dynamicRoutes":{},"preview":{"previewModeId":"7d51d6c766b8ae916a6c8c7de09c09b6","previewModeSigningKey":"6daef08ee159f3ebbc5fa089874386a7416d53350a1e791fca31ad58129b3c26","previewModeEncryptionKey":"4a44fac0d65f0b5466f5233046909e07a65f30e9fe4f42988885fce089d034d9"},"notFoundRoutes":[]}

View File

@ -1 +1 @@
{"version":3,"pages404":true,"caseSensitive":false,"basePath":"","redirects":[{"source":"/:path+/","destination":"/:path+","internal":true,"statusCode":308,"regex":"^(?:/((?:[^/]+?)(?:/(?:[^/]+?))*))/$"}],"headers":[],"dynamicRoutes":[{"page":"/admin/services/[service_name]","regex":"^/admin/services/([^/]+?)(?:/)?$","routeKeys":{"nxtPservice_name":"nxtPservice_name"},"namedRegex":"^/admin/services/(?<nxtPservice_name>[^/]+?)(?:/)?$"},{"page":"/admin/users/[deployment_user_id]","regex":"^/admin/users/([^/]+?)(?:/)?$","routeKeys":{"nxtPdeployment_user_id":"nxtPdeployment_user_id"},"namedRegex":"^/admin/users/(?<nxtPdeployment_user_id>[^/]+?)(?:/)?$"}],"staticRoutes":[{"page":"/","regex":"^/(?:/)?$","routeKeys":{},"namedRegex":"^/(?:/)?$"},{"page":"/404","regex":"^/404(?:/)?$","routeKeys":{},"namedRegex":"^/404(?:/)?$"},{"page":"/admin","regex":"^/admin(?:/)?$","routeKeys":{},"namedRegex":"^/admin(?:/)?$"},{"page":"/admin/services","regex":"^/admin/services(?:/)?$","routeKeys":{},"namedRegex":"^/admin/services(?:/)?$"},{"page":"/admin/settings","regex":"^/admin/settings(?:/)?$","routeKeys":{},"namedRegex":"^/admin/settings(?:/)?$"},{"page":"/admin/users","regex":"^/admin/users(?:/)?$","routeKeys":{},"namedRegex":"^/admin/users(?:/)?$"},{"page":"/admin/users/add-user","regex":"^/admin/users/add\\-user(?:/)?$","routeKeys":{},"namedRegex":"^/admin/users/add\\-user(?:/)?$"},{"page":"/auth/login","regex":"^/auth/login(?:/)?$","routeKeys":{},"namedRegex":"^/auth/login(?:/)?$"},{"page":"/auth/logout","regex":"^/auth/logout(?:/)?$","routeKeys":{},"namedRegex":"^/auth/logout(?:/)?$"},{"page":"/auth/signup","regex":"^/auth/signup(?:/)?$","routeKeys":{},"namedRegex":"^/auth/signup(?:/)?$"}],"dataRoutes":[{"page":"/","dataRouteRegex":"^/_next/data/6OhPnSAl3Wt2w\\-eNVYzZ_/index.json$"},{"page":"/admin","dataRouteRegex":"^/_next/data/6OhPnSAl3Wt2w\\-eNVYzZ_/admin.json$"},{"page":"/admin/services","dataRouteRegex":"^/_next/data/6OhPnSAl3Wt2w\\-eNVYzZ_/admin/services.json$"},{"page":"/admin/services/[service_name]","routeKeys":{"nxtPservice_name":"nxtPservice_name"},"dataRouteRegex":"^/_next/data/6OhPnSAl3Wt2w\\-eNVYzZ_/admin/services/([^/]+?)\\.json$","namedDataRouteRegex":"^/_next/data/6OhPnSAl3Wt2w\\-eNVYzZ_/admin/services/(?<nxtPservice_name>[^/]+?)\\.json$"},{"page":"/admin/settings","dataRouteRegex":"^/_next/data/6OhPnSAl3Wt2w\\-eNVYzZ_/admin/settings.json$"},{"page":"/admin/users","dataRouteRegex":"^/_next/data/6OhPnSAl3Wt2w\\-eNVYzZ_/admin/users.json$"},{"page":"/admin/users/add-user","dataRouteRegex":"^/_next/data/6OhPnSAl3Wt2w\\-eNVYzZ_/admin/users/add-user.json$"},{"page":"/admin/users/[deployment_user_id]","routeKeys":{"nxtPdeployment_user_id":"nxtPdeployment_user_id"},"dataRouteRegex":"^/_next/data/6OhPnSAl3Wt2w\\-eNVYzZ_/admin/users/([^/]+?)\\.json$","namedDataRouteRegex":"^/_next/data/6OhPnSAl3Wt2w\\-eNVYzZ_/admin/users/(?<nxtPdeployment_user_id>[^/]+?)\\.json$"},{"page":"/auth/login","dataRouteRegex":"^/_next/data/6OhPnSAl3Wt2w\\-eNVYzZ_/auth/login.json$"},{"page":"/auth/logout","dataRouteRegex":"^/_next/data/6OhPnSAl3Wt2w\\-eNVYzZ_/auth/logout.json$"},{"page":"/auth/signup","dataRouteRegex":"^/_next/data/6OhPnSAl3Wt2w\\-eNVYzZ_/auth/signup.json$"}],"rsc":{"header":"RSC","varyHeader":"RSC, Next-Router-State-Tree, Next-Router-Prefetch","prefetchHeader":"Next-Router-Prefetch","didPostponeHeader":"x-nextjs-postponed","contentTypeHeader":"text/x-component","suffix":".rsc","prefetchSuffix":".prefetch.rsc"},"rewrites":[]} {"version":3,"pages404":true,"caseSensitive":false,"basePath":"","redirects":[{"source":"/:path+/","destination":"/:path+","internal":true,"statusCode":308,"regex":"^(?:/((?:[^/]+?)(?:/(?:[^/]+?))*))/$"}],"headers":[],"dynamicRoutes":[{"page":"/admin/services/[service_name]","regex":"^/admin/services/([^/]+?)(?:/)?$","routeKeys":{"nxtPservice_name":"nxtPservice_name"},"namedRegex":"^/admin/services/(?<nxtPservice_name>[^/]+?)(?:/)?$"},{"page":"/admin/users/[deployment_user_id]","regex":"^/admin/users/([^/]+?)(?:/)?$","routeKeys":{"nxtPdeployment_user_id":"nxtPdeployment_user_id"},"namedRegex":"^/admin/users/(?<nxtPdeployment_user_id>[^/]+?)(?:/)?$"}],"staticRoutes":[{"page":"/","regex":"^/(?:/)?$","routeKeys":{},"namedRegex":"^/(?:/)?$"},{"page":"/404","regex":"^/404(?:/)?$","routeKeys":{},"namedRegex":"^/404(?:/)?$"},{"page":"/admin","regex":"^/admin(?:/)?$","routeKeys":{},"namedRegex":"^/admin(?:/)?$"},{"page":"/admin/services","regex":"^/admin/services(?:/)?$","routeKeys":{},"namedRegex":"^/admin/services(?:/)?$"},{"page":"/admin/settings","regex":"^/admin/settings(?:/)?$","routeKeys":{},"namedRegex":"^/admin/settings(?:/)?$"},{"page":"/admin/users","regex":"^/admin/users(?:/)?$","routeKeys":{},"namedRegex":"^/admin/users(?:/)?$"},{"page":"/admin/users/add-user","regex":"^/admin/users/add\\-user(?:/)?$","routeKeys":{},"namedRegex":"^/admin/users/add\\-user(?:/)?$"},{"page":"/auth/login","regex":"^/auth/login(?:/)?$","routeKeys":{},"namedRegex":"^/auth/login(?:/)?$"},{"page":"/auth/logout","regex":"^/auth/logout(?:/)?$","routeKeys":{},"namedRegex":"^/auth/logout(?:/)?$"},{"page":"/auth/signup","regex":"^/auth/signup(?:/)?$","routeKeys":{},"namedRegex":"^/auth/signup(?:/)?$"}],"dataRoutes":[{"page":"/","dataRouteRegex":"^/_next/data/EOJ93GZV05yhDPpOS\\-XSu/index.json$"},{"page":"/admin","dataRouteRegex":"^/_next/data/EOJ93GZV05yhDPpOS\\-XSu/admin.json$"},{"page":"/admin/services","dataRouteRegex":"^/_next/data/EOJ93GZV05yhDPpOS\\-XSu/admin/services.json$"},{"page":"/admin/services/[service_name]","routeKeys":{"nxtPservice_name":"nxtPservice_name"},"dataRouteRegex":"^/_next/data/EOJ93GZV05yhDPpOS\\-XSu/admin/services/([^/]+?)\\.json$","namedDataRouteRegex":"^/_next/data/EOJ93GZV05yhDPpOS\\-XSu/admin/services/(?<nxtPservice_name>[^/]+?)\\.json$"},{"page":"/admin/settings","dataRouteRegex":"^/_next/data/EOJ93GZV05yhDPpOS\\-XSu/admin/settings.json$"},{"page":"/admin/users","dataRouteRegex":"^/_next/data/EOJ93GZV05yhDPpOS\\-XSu/admin/users.json$"},{"page":"/admin/users/add-user","dataRouteRegex":"^/_next/data/EOJ93GZV05yhDPpOS\\-XSu/admin/users/add-user.json$"},{"page":"/admin/users/[deployment_user_id]","routeKeys":{"nxtPdeployment_user_id":"nxtPdeployment_user_id"},"dataRouteRegex":"^/_next/data/EOJ93GZV05yhDPpOS\\-XSu/admin/users/([^/]+?)\\.json$","namedDataRouteRegex":"^/_next/data/EOJ93GZV05yhDPpOS\\-XSu/admin/users/(?<nxtPdeployment_user_id>[^/]+?)\\.json$"},{"page":"/auth/login","dataRouteRegex":"^/_next/data/EOJ93GZV05yhDPpOS\\-XSu/auth/login.json$"},{"page":"/auth/logout","dataRouteRegex":"^/_next/data/EOJ93GZV05yhDPpOS\\-XSu/auth/logout.json$"},{"page":"/auth/signup","dataRouteRegex":"^/_next/data/EOJ93GZV05yhDPpOS\\-XSu/auth/signup.json$"}],"rsc":{"header":"RSC","varyHeader":"RSC, Next-Router-State-Tree, Next-Router-Prefetch","prefetchHeader":"Next-Router-Prefetch","didPostponeHeader":"x-nextjs-postponed","contentTypeHeader":"text/x-component","suffix":".rsc","prefetchSuffix":".prefetch.rsc"},"rewrites":[]}

View File

@ -1 +1 @@
{"version":1,"functions":{"/admin/services/[service_name]":{},"/admin/settings":{},"/admin":{},"/_app":{},"/admin/services":{},"/auth/login":{},"/admin/users":{},"/admin/users/add-user":{},"/admin/users/[deployment_user_id]":{},"/auth/logout":{},"/":{},"/auth/signup":{}}} {"version":1,"functions":{"/_app":{},"/admin/settings":{},"/admin":{},"/admin/services/[service_name]":{},"/admin/services":{},"/admin/users/[deployment_user_id]":{},"/auth/logout":{},"/admin/users/add-user":{},"/admin/users":{},"/auth/signup":{},"/auth/login":{},"/":{}}}

View File

@ -1 +1 @@
{"/_error":"pages/_error.js","/_document":"pages/_document.js","/404":"pages/404.html","/api/admin/delete-user":"pages/api/admin/delete-user.js","/api/admin/download-private-ssh-key":"pages/api/admin/download-private-ssh-key.js","/api/admin/edit-user":"pages/api/admin/edit-user.js","/api/admin/settings":"pages/api/admin/settings.js","/api/auth/login":"pages/api/auth/login.js","/api/auth/signup":"pages/api/auth/signup.js","/api/hello":"pages/api/hello.js","/_app":"pages/_app.js","/admin":"pages/admin.js","/admin/services":"pages/admin/services.js","/admin/settings":"pages/admin/settings.js","/admin/services/[service_name]":"pages/admin/services/[service_name].js","/admin/users":"pages/admin/users.js","/admin/users/add-user":"pages/admin/users/add-user.js","/admin/users/[deployment_user_id]":"pages/admin/users/[deployment_user_id].js","/auth/logout":"pages/auth/logout.js","/auth/signup":"pages/auth/signup.js","/auth/login":"pages/auth/login.js","/":"pages/index.js"} {"/_error":"pages/_error.js","/_document":"pages/_document.js","/404":"pages/404.html","/api/admin/delete-user":"pages/api/admin/delete-user.js","/api/admin/download-private-ssh-key":"pages/api/admin/download-private-ssh-key.js","/api/admin/edit-user":"pages/api/admin/edit-user.js","/api/admin/settings":"pages/api/admin/settings.js","/api/auth/login":"pages/api/auth/login.js","/api/auth/signup":"pages/api/auth/signup.js","/api/hello":"pages/api/hello.js","/_app":"pages/_app.js","/admin":"pages/admin.js","/admin/services":"pages/admin/services.js","/admin/services/[service_name]":"pages/admin/services/[service_name].js","/admin/settings":"pages/admin/settings.js","/admin/users/add-user":"pages/admin/users/add-user.js","/admin/users/[deployment_user_id]":"pages/admin/users/[deployment_user_id].js","/admin/users":"pages/admin/users.js","/auth/login":"pages/auth/login.js","/auth/logout":"pages/auth/logout.js","/":"pages/index.js","/auth/signup":"pages/auth/signup.js"}

View File

@ -1 +1 @@
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/_next/static/css/08e6997802749ec3.css" as="style"/><link rel="stylesheet" href="/_next/static/css/08e6997802749ec3.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" noModule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-38cee4c0e358b1a3.js" defer=""></script><script src="/_next/static/chunks/framework-bfa817c72d812316.js" defer=""></script><script src="/_next/static/chunks/main-761b7faf59ba862f.js" defer=""></script><script src="/_next/static/chunks/pages/_app-0610d36404ed5f1e.js" defer=""></script><script src="/_next/static/chunks/29107295-2819ba6e51dbf961.js" defer=""></script><script src="/_next/static/chunks/664-e347d64e56042a02.js" defer=""></script><script src="/_next/static/chunks/pages/404-8292e1046538596b.js" defer=""></script><script src="/_next/static/6OhPnSAl3Wt2w-eNVYzZ_/_buildManifest.js" defer=""></script><script src="/_next/static/6OhPnSAl3Wt2w-eNVYzZ_/_ssgManifest.js" defer=""></script></head><body class="antialiased"><div id="__next"><main class="flex flex-col items-center twui-main w-screen h-screen overflow-hidden"><section class="flex flex-col items-center px-4 sm:px-10 py-10 twui-section w-full h-full"><div class="flex w-full max-w-container gap-4 justify-between flex-wrap flex-col xl:flex-row items-start xl:items-center twui-container grid-frame grid-cols-1 h-full"><div class="flex flex-col items-start gap-4 twui-stack w-full justify-between h-full grid-cell"><div class="flex flex-col items-start twui-stack gap-0"><div class="flex flex-row gap-2 flex-wrap items-center twui-row"><div class="flex flex-row gap-2 flex-wrap items-center twui-row p-6"><a aria-label="TurboCI home" class="inline-flex items-center gap-3" href="/"><svg viewBox="0 0 48 48" aria-hidden="true" class="h-10 w-10 shrink-0"><defs><linearGradient id="_R_1am_" x1="9" y1="9" x2="31" y2="34" gradientUnits="userSpaceOnUse"><stop offset="0%" stop-color="#9cf0c0"></stop><stop offset="100%" stop-color="#42d392"></stop></linearGradient><linearGradient id="_R_1amH1_" x1="22" y1="22" x2="36" y2="40" gradientUnits="userSpaceOnUse"><stop offset="0%" stop-color="#2bc67e"></stop><stop offset="100%" stop-color="#1f8458"></stop></linearGradient></defs><path d="M35 6H23.6c-2 0-3.8 1-4.8 2.7L7.5 28.3c-1.4 2.5.4 5.7 3.2 5.7h9.1c2 0 3.8-1 4.8-2.7l11.2-19.6C39.6 9.2 37.8 6 35 6Z" fill="url(#_R_1am_)"></path><path d="M23.9 24h13.4c2.8 0 4.6 3.1 3.2 5.6l-4.1 7.1c-1 1.7-2.8 2.7-4.8 2.7H18.2c-2.8 0-4.6-3.1-3.2-5.6l4.1-7.1c1-1.7 2.8-2.7 4.8-2.7Z" fill="url(#_R_1amH1_)"></path></svg><span class="font-display text-[1.02rem] font-semibold tracking-tight text-foreground">TurboCI</span></a></div><div class="border-slate-200 dark:border-white/10 border-0 border-l h-full min-h-5 twui-divider twui-divider-vertical border-solid"></div></div><div class="border-slate-200 dark:border-white/10 border-0 border-t w-full twui-divider twui-divider-horizontal border-solid"></div></div><div class="flex flex-col items-center justify-center gap-4 w-full h-full twui-center p-10"><h2 class="text-2xl md:text-3xl mb-4 twui-headings twui-heading twui-h2">Page Not Found!</h2></div><div class="flex flex-col items-start gap-4 twui-stack"><div class="border-slate-200 dark:border-white/10 border-0 border-t w-full twui-divider twui-divider-horizontal border-solid"></div><div class="twui-spacer h-20 w-full"></div></div></div></div></section></main></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/404","query":{},"buildId":"6OhPnSAl3Wt2w-eNVYzZ_","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html> <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link rel="preload" href="/_next/static/css/08e6997802749ec3.css" as="style"/><link rel="stylesheet" href="/_next/static/css/08e6997802749ec3.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" noModule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-38cee4c0e358b1a3.js" defer=""></script><script src="/_next/static/chunks/framework-bfa817c72d812316.js" defer=""></script><script src="/_next/static/chunks/main-761b7faf59ba862f.js" defer=""></script><script src="/_next/static/chunks/pages/_app-0610d36404ed5f1e.js" defer=""></script><script src="/_next/static/chunks/29107295-2819ba6e51dbf961.js" defer=""></script><script src="/_next/static/chunks/664-e347d64e56042a02.js" defer=""></script><script src="/_next/static/chunks/pages/404-8292e1046538596b.js" defer=""></script><script src="/_next/static/EOJ93GZV05yhDPpOS-XSu/_buildManifest.js" defer=""></script><script src="/_next/static/EOJ93GZV05yhDPpOS-XSu/_ssgManifest.js" defer=""></script></head><body class="antialiased"><div id="__next"><main class="flex flex-col items-center twui-main w-screen h-screen overflow-hidden"><section class="flex flex-col items-center px-4 sm:px-10 py-10 twui-section w-full h-full"><div class="flex w-full max-w-container gap-4 justify-between flex-wrap flex-col xl:flex-row items-start xl:items-center twui-container grid-frame grid-cols-1 h-full"><div class="flex flex-col items-start gap-4 twui-stack w-full justify-between h-full grid-cell"><div class="flex flex-col items-start twui-stack gap-0"><div class="flex flex-row gap-2 flex-wrap items-center twui-row"><div class="flex flex-row gap-2 flex-wrap items-center twui-row p-6"><a aria-label="TurboCI home" class="inline-flex items-center gap-3" href="/"><svg viewBox="0 0 48 48" aria-hidden="true" class="h-10 w-10 shrink-0"><defs><linearGradient id="_R_1am_" x1="9" y1="9" x2="31" y2="34" gradientUnits="userSpaceOnUse"><stop offset="0%" stop-color="#9cf0c0"></stop><stop offset="100%" stop-color="#42d392"></stop></linearGradient><linearGradient id="_R_1amH1_" x1="22" y1="22" x2="36" y2="40" gradientUnits="userSpaceOnUse"><stop offset="0%" stop-color="#2bc67e"></stop><stop offset="100%" stop-color="#1f8458"></stop></linearGradient></defs><path d="M35 6H23.6c-2 0-3.8 1-4.8 2.7L7.5 28.3c-1.4 2.5.4 5.7 3.2 5.7h9.1c2 0 3.8-1 4.8-2.7l11.2-19.6C39.6 9.2 37.8 6 35 6Z" fill="url(#_R_1am_)"></path><path d="M23.9 24h13.4c2.8 0 4.6 3.1 3.2 5.6l-4.1 7.1c-1 1.7-2.8 2.7-4.8 2.7H18.2c-2.8 0-4.6-3.1-3.2-5.6l4.1-7.1c1-1.7 2.8-2.7 4.8-2.7Z" fill="url(#_R_1amH1_)"></path></svg><span class="font-display text-[1.02rem] font-semibold tracking-tight text-foreground">TurboCI</span></a></div><div class="border-slate-200 dark:border-white/10 border-0 border-l h-full min-h-5 twui-divider twui-divider-vertical border-solid"></div></div><div class="border-slate-200 dark:border-white/10 border-0 border-t w-full twui-divider twui-divider-horizontal border-solid"></div></div><div class="flex flex-col items-center justify-center gap-4 w-full h-full twui-center p-10"><h2 class="text-2xl md:text-3xl mb-4 twui-headings twui-heading twui-h2">Page Not Found!</h2></div><div class="flex flex-col items-start gap-4 twui-stack"><div class="border-slate-200 dark:border-white/10 border-0 border-t w-full twui-divider twui-divider-horizontal border-solid"></div><div class="twui-spacer h-20 w-full"></div></div></div></div></section></main></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/404","query":{},"buildId":"EOJ93GZV05yhDPpOS-XSu","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>

View File

@ -1 +1 @@
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><title>500: Internal Server Error</title><meta name="next-head-count" content="3"/><link rel="preload" href="/_next/static/css/08e6997802749ec3.css" as="style"/><link rel="stylesheet" href="/_next/static/css/08e6997802749ec3.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" noModule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-38cee4c0e358b1a3.js" defer=""></script><script src="/_next/static/chunks/framework-bfa817c72d812316.js" defer=""></script><script src="/_next/static/chunks/main-761b7faf59ba862f.js" defer=""></script><script src="/_next/static/chunks/pages/_app-0610d36404ed5f1e.js" defer=""></script><script src="/_next/static/chunks/pages/_error-10090a8ee211d5fd.js" defer=""></script><script src="/_next/static/6OhPnSAl3Wt2w-eNVYzZ_/_buildManifest.js" defer=""></script><script src="/_next/static/6OhPnSAl3Wt2w-eNVYzZ_/_ssgManifest.js" defer=""></script></head><body class="antialiased"><div id="__next"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error<!-- -->.</h2></div></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":500}},"page":"/_error","query":{},"buildId":"6OhPnSAl3Wt2w-eNVYzZ_","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html> <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><title>500: Internal Server Error</title><meta name="next-head-count" content="3"/><link rel="preload" href="/_next/static/css/08e6997802749ec3.css" as="style"/><link rel="stylesheet" href="/_next/static/css/08e6997802749ec3.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" noModule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-38cee4c0e358b1a3.js" defer=""></script><script src="/_next/static/chunks/framework-bfa817c72d812316.js" defer=""></script><script src="/_next/static/chunks/main-761b7faf59ba862f.js" defer=""></script><script src="/_next/static/chunks/pages/_app-0610d36404ed5f1e.js" defer=""></script><script src="/_next/static/chunks/pages/_error-10090a8ee211d5fd.js" defer=""></script><script src="/_next/static/EOJ93GZV05yhDPpOS-XSu/_buildManifest.js" defer=""></script><script src="/_next/static/EOJ93GZV05yhDPpOS-XSu/_ssgManifest.js" defer=""></script></head><body class="antialiased"><div id="__next"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error<!-- -->.</h2></div></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":500}},"page":"/_error","query":{},"buildId":"EOJ93GZV05yhDPpOS-XSu","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>

6
dist/web/trace vendored

File diff suppressed because one or more lines are too long

View File

@ -46,7 +46,7 @@ export default async function grabTtydServerInfo({
); );
} }
const available_port = getNextAvailablePort(); const available_port = await getNextAvailablePort();
let url = `/ttyd/${available_port}`; let url = `/ttyd/${available_port}`;

View File

@ -25,19 +25,26 @@ function makeSockaddr(port: number): Buffer {
return buf; return buf;
} }
export default function getNextAvailablePort( export default async function getNextAvailablePort(
startPort = AppData["DynamicPortStart"], startPort = AppData["DynamicPortStart"],
maxPort = 65535, maxPort = 65535,
): number { ): Promise<number> {
for (let port = startPort; port <= maxPort; port++) { const MAX_RETRIES = 5;
const fd = libc.symbols.socket(AF_INET, SOCK_STREAM, 0); let retries = 0;
if (fd < 0) continue;
const addr = makeSockaddr(port); while (retries < MAX_RETRIES) {
const result = libc.symbols.bind(fd, ptr(addr), addr.byteLength); for (let port = startPort; port <= maxPort; port++) {
libc.symbols.close(fd); const fd = libc.symbols.socket(AF_INET, SOCK_STREAM, 0);
if (fd < 0) continue;
if (result === 0) return port; const addr = makeSockaddr(port);
const result = libc.symbols.bind(fd, ptr(addr), addr.byteLength);
libc.symbols.close(fd);
if (result === 0) return port;
await Bun.sleep(2000);
}
} }
throw new Error(`No available port found in range ${startPort}-${maxPort}`); throw new Error(`No available port found in range ${startPort}-${maxPort}`);