@betterportal/tunnels 1.0.25 → 1.0.27
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.
- package/lib/.bsb/clients/service-tunnels-client.d.ts +1 -1
- package/lib/.bsb/clients/service-tunnels-client.js +1 -1
- package/lib/.bsb/clients/service-tunnels-proxy.d.ts +1 -1
- package/lib/.bsb/clients/service-tunnels-proxy.js +1 -1
- package/lib/cli.js +2 -0
- package/lib/cli.js.map +1 -1
- package/lib/plugins/service-tunnels-admin/.bp-generated/registry.d.ts.map +1 -1
- package/lib/plugins/service-tunnels-admin/.bp-generated/registry.js +6 -2
- package/lib/plugins/service-tunnels-admin/.bp-generated/registry.js.map +1 -1
- package/lib/plugins/service-tunnels-admin/.bp-generated/route-runtime.d.ts +9 -0
- package/lib/plugins/service-tunnels-admin/.bp-generated/route-runtime.d.ts.map +1 -0
- package/lib/plugins/service-tunnels-admin/.bp-generated/route-runtime.js +6 -0
- package/lib/plugins/service-tunnels-admin/.bp-generated/route-runtime.js.map +1 -0
- package/lib/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/GET.d.ts.map +1 -1
- package/lib/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/GET.js +2 -2
- package/lib/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/GET.js.map +1 -1
- package/lib/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/index.d.ts +1 -1
- package/lib/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/index.d.ts.map +1 -1
- package/lib/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/index.js +1 -1
- package/lib/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/index.js.map +1 -1
- package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/GET.d.ts +38 -16
- package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/GET.d.ts.map +1 -1
- package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/GET.js +36 -30
- package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/GET.js.map +1 -1
- package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/GET.sse.d.ts +20 -0
- package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/GET.sse.d.ts.map +1 -0
- package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/GET.sse.js +10 -0
- package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/GET.sse.js.map +1 -0
- package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/_theme.bootstrap1/GET.d.ts +3 -2
- package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/_theme.bootstrap1/GET.d.ts.map +1 -1
- package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/_theme.bootstrap1/GET.js +8 -7
- package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/_theme.bootstrap1/GET.js.map +1 -1
- package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/_theme.bootstrap1/_body.live.GET.d.ts +5 -0
- package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/_theme.bootstrap1/_body.live.GET.d.ts.map +1 -0
- package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/_theme.bootstrap1/_body.live.GET.js +5 -0
- package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/_theme.bootstrap1/_body.live.GET.js.map +1 -0
- package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/_theme.bootstrap1/_body.live.GET.sse.d.ts +5 -0
- package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/_theme.bootstrap1/_body.live.GET.sse.d.ts.map +1 -0
- package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/_theme.bootstrap1/_body.live.GET.sse.js +5 -0
- package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/_theme.bootstrap1/_body.live.GET.sse.js.map +1 -0
- package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/index.d.ts +2 -2
- package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/index.d.ts.map +1 -1
- package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/index.js +3 -3
- package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/index.js.map +1 -1
- package/lib/plugins/service-tunnels-admin/bp-routes/downloads/GET.d.ts.map +1 -1
- package/lib/plugins/service-tunnels-admin/bp-routes/downloads/GET.js +2 -2
- package/lib/plugins/service-tunnels-admin/bp-routes/downloads/GET.js.map +1 -1
- package/lib/plugins/service-tunnels-admin/bp-routes/downloads/_theme.bootstrap1/GET.js +1 -1
- package/lib/plugins/service-tunnels-admin/bp-routes/downloads/_theme.bootstrap1/GET.js.map +1 -1
- package/lib/plugins/service-tunnels-admin/bp-routes/downloads/index.d.ts +1 -1
- package/lib/plugins/service-tunnels-admin/bp-routes/downloads/index.d.ts.map +1 -1
- package/lib/plugins/service-tunnels-admin/bp-routes/downloads/index.js +1 -1
- package/lib/plugins/service-tunnels-admin/bp-routes/downloads/index.js.map +1 -1
- package/lib/plugins/service-tunnels-admin/bp-routes/landing/GET.d.ts.map +1 -1
- package/lib/plugins/service-tunnels-admin/bp-routes/landing/GET.js +2 -2
- package/lib/plugins/service-tunnels-admin/bp-routes/landing/GET.js.map +1 -1
- package/lib/plugins/service-tunnels-admin/bp-routes/landing/index.d.ts +1 -1
- package/lib/plugins/service-tunnels-admin/bp-routes/landing/index.d.ts.map +1 -1
- package/lib/plugins/service-tunnels-admin/bp-routes/landing/index.js +1 -1
- package/lib/plugins/service-tunnels-admin/bp-routes/landing/index.js.map +1 -1
- package/lib/plugins/service-tunnels-admin/bp-routes/tunnels/GET.d.ts.map +1 -1
- package/lib/plugins/service-tunnels-admin/bp-routes/tunnels/GET.js +2 -2
- package/lib/plugins/service-tunnels-admin/bp-routes/tunnels/GET.js.map +1 -1
- package/lib/plugins/service-tunnels-admin/bp-routes/tunnels/_theme.bootstrap1/GET.js +1 -1
- package/lib/plugins/service-tunnels-admin/bp-routes/tunnels/_theme.bootstrap1/GET.js.map +1 -1
- package/lib/plugins/service-tunnels-admin/bp-routes/tunnels/index.d.ts +1 -1
- package/lib/plugins/service-tunnels-admin/bp-routes/tunnels/index.d.ts.map +1 -1
- package/lib/plugins/service-tunnels-admin/bp-routes/tunnels/index.js +1 -1
- package/lib/plugins/service-tunnels-admin/bp-routes/tunnels/index.js.map +1 -1
- package/lib/plugins/service-tunnels-admin/index.js +2 -2
- package/lib/plugins/service-tunnels-admin/index.js.map +1 -1
- package/lib/plugins/service-tunnels-client/index.d.ts.map +1 -1
- package/lib/plugins/service-tunnels-client/index.js +40 -4
- package/lib/plugins/service-tunnels-client/index.js.map +1 -1
- package/lib/plugins/service-tunnels-client/registry.d.ts +3 -0
- package/lib/plugins/service-tunnels-client/registry.d.ts.map +1 -1
- package/lib/plugins/service-tunnels-client/registry.js +6 -0
- package/lib/plugins/service-tunnels-client/registry.js.map +1 -1
- package/lib/plugins/service-tunnels-client/schemas.d.ts +1 -0
- package/lib/plugins/service-tunnels-client/schemas.d.ts.map +1 -1
- package/lib/plugins/service-tunnels-client/schemas.js +9 -8
- package/lib/plugins/service-tunnels-client/schemas.js.map +1 -1
- package/lib/plugins/service-tunnels-proxy/index.d.ts.map +1 -1
- package/lib/plugins/service-tunnels-proxy/index.js +26 -13
- package/lib/plugins/service-tunnels-proxy/index.js.map +1 -1
- package/lib/plugins/service-tunnels-proxy/verification.d.ts +3 -5
- package/lib/plugins/service-tunnels-proxy/verification.d.ts.map +1 -1
- package/lib/plugins/service-tunnels-proxy/verification.js +32 -7
- package/lib/plugins/service-tunnels-proxy/verification.js.map +1 -1
- package/lib/schemas/service-tunnels-admin.json +1 -1
- package/lib/schemas/service-tunnels-admin.plugin.json +1 -1
- package/lib/schemas/service-tunnels-client.json +2 -2
- package/lib/schemas/service-tunnels-client.plugin.json +2 -2
- package/lib/schemas/service-tunnels-proxy.json +2 -2
- package/lib/schemas/service-tunnels-proxy.plugin.json +2 -2
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_body.live.GET.d.ts","sourceRoot":"","sources":["../../../../../../src/plugins/service-tunnels-admin/bp-routes/dashboard/_theme.bootstrap1/_body.live.GET.tsx"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAG/C,wBAAgB,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,cAAc,CAE1D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_body.live.GET.js","sourceRoot":"","sources":["../../../../../../src/plugins/service-tunnels-admin/bp-routes/dashboard/_theme.bootstrap1/_body.live.GET.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,MAAM,UAAU,MAAM,CAAC,IAAmB;IACxC,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** @jsxImportSource jsx-htmx */
|
|
2
|
+
import type { HtmlRenderable } from "@betterportal/framework";
|
|
3
|
+
import type { DashboardData } from "../GET.js";
|
|
4
|
+
export declare function renderTick(data: DashboardData): HtmlRenderable;
|
|
5
|
+
//# sourceMappingURL=_body.live.GET.sse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_body.live.GET.sse.d.ts","sourceRoot":"","sources":["../../../../../../src/plugins/service-tunnels-admin/bp-routes/dashboard/_theme.bootstrap1/_body.live.GET.sse.tsx"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAG/C,wBAAgB,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,cAAc,CAE9D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_body.live.GET.sse.js","sourceRoot":"","sources":["../../../../../../src/plugins/service-tunnels-admin/bp-routes/dashboard/_theme.bootstrap1/_body.live.GET.sse.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,MAAM,UAAU,UAAU,CAAC,IAAmB;IAC5C,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type ApiAuthRequirement, type CacheHints } from "@betterportal/framework";
|
|
2
2
|
export declare const viewId = "better-tunnels.dashboard";
|
|
3
|
-
export declare const title = "
|
|
4
|
-
export declare const description = "
|
|
3
|
+
export declare const title = "Tunnel Dashboard";
|
|
4
|
+
export declare const description = "Live BetterTunnels activity.";
|
|
5
5
|
export declare const auth: ApiAuthRequirement;
|
|
6
6
|
export declare const cacheHints: CacheHints;
|
|
7
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/service-tunnels-admin/bp-routes/dashboard/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,UAAU,EAChB,MAAM,yBAAyB,CAAC;AAEjC,eAAO,MAAM,MAAM,6BAA6B,CAAC;AACjD,eAAO,MAAM,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/service-tunnels-admin/bp-routes/dashboard/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,UAAU,EAChB,MAAM,yBAAyB,CAAC;AAEjC,eAAO,MAAM,MAAM,6BAA6B,CAAC;AACjD,eAAO,MAAM,KAAK,qBAAqB,CAAC;AACxC,eAAO,MAAM,WAAW,iCAAiC,CAAC;AAE1D,eAAO,MAAM,IAAI,EAAE,kBAKlB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,UAGxB,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export const viewId = "better-tunnels.dashboard";
|
|
2
|
-
export const title = "
|
|
3
|
-
export const description = "
|
|
2
|
+
export const title = "Tunnel Dashboard";
|
|
3
|
+
export const description = "Live BetterTunnels activity.";
|
|
4
4
|
export const auth = {
|
|
5
5
|
required: true,
|
|
6
6
|
permissions: [
|
|
@@ -8,7 +8,7 @@ export const auth = {
|
|
|
8
8
|
]
|
|
9
9
|
};
|
|
10
10
|
export const cacheHints = {
|
|
11
|
-
ttlSeconds:
|
|
11
|
+
ttlSeconds: 0,
|
|
12
12
|
varyBy: ["accept", "authorization", "x-bp-tenant-id", "x-bp-app-id"]
|
|
13
13
|
};
|
|
14
14
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/plugins/service-tunnels-admin/bp-routes/dashboard/index.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,MAAM,GAAG,0BAA0B,CAAC;AACjD,MAAM,CAAC,MAAM,KAAK,GAAG,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/plugins/service-tunnels-admin/bp-routes/dashboard/index.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,MAAM,GAAG,0BAA0B,CAAC;AACjD,MAAM,CAAC,MAAM,KAAK,GAAG,kBAAkB,CAAC;AACxC,MAAM,CAAC,MAAM,WAAW,GAAG,8BAA8B,CAAC;AAE1D,MAAM,CAAC,MAAM,IAAI,GAAuB;IACtC,QAAQ,EAAE,IAAI;IACd,WAAW,EAAE;QACX,EAAE,SAAS,EAAE,8BAA8B,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,MAAM,CAAC,EAAE;KAC7E;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAe;IACpC,UAAU,EAAE,CAAC;IACb,MAAM,EAAE,CAAC,QAAQ,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,CAAC;CACrE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GET.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/service-tunnels-admin/bp-routes/downloads/GET.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAUrC,eAAO,MAAM,cAAc;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"GET.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/service-tunnels-admin/bp-routes/downloads/GET.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAUrC,eAAO,MAAM,cAAc;;;;;;;;;EAKzB,CAAC;AACH,MAAM,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;;;;;;;;;;;AAExD,wBAsBE"}
|
|
@@ -5,13 +5,13 @@ const DownloadSchema = av.object({
|
|
|
5
5
|
os: av.string(),
|
|
6
6
|
arch: av.string(),
|
|
7
7
|
artifact: av.string()
|
|
8
|
-
}
|
|
8
|
+
});
|
|
9
9
|
export const ResponseSchema = av.object({
|
|
10
10
|
latestTag: av.string(),
|
|
11
11
|
logoUrl: av.string(),
|
|
12
12
|
examples: av.array(av.string()),
|
|
13
13
|
downloads: av.array(DownloadSchema)
|
|
14
|
-
}
|
|
14
|
+
});
|
|
15
15
|
export default createHandler({ response: ResponseSchema }, async () => {
|
|
16
16
|
const brand = await loadBrandAssets();
|
|
17
17
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GET.js","sourceRoot":"","sources":["../../../../../src/plugins/service-tunnels-admin/bp-routes/downloads/GET.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,cAAc,GAAG,EAAE,CAAC,MAAM,CAAC;IAC/B,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE;IACf,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE;IACjB,QAAQ,EAAE,EAAE,CAAC,MAAM,EAAE;CACtB,
|
|
1
|
+
{"version":3,"file":"GET.js","sourceRoot":"","sources":["../../../../../src/plugins/service-tunnels-admin/bp-routes/downloads/GET.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,cAAc,GAAG,EAAE,CAAC,MAAM,CAAC;IAC/B,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE;IACf,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE;IACjB,QAAQ,EAAE,EAAE,CAAC,MAAM,EAAE;CACtB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC,MAAM,CAAC;IACtC,SAAS,EAAE,EAAE,CAAC,MAAM,EAAE;IACtB,OAAO,EAAE,EAAE,CAAC,MAAM,EAAE;IACpB,QAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;IAC/B,SAAS,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC;CACpC,CAAC,CAAC;AAGH,eAAe,aAAa,CAC1B,EAAE,QAAQ,EAAE,cAAc,EAAE,EAC5B,KAAK,IAAI,EAAE;IACT,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAC;IAEtC,OAAO;QACL,SAAS,EAAE,QAAQ;QACnB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,QAAQ,EAAE;YACR,mCAAmC;YACnC,oDAAoD;YACpD,8CAA8C;SAC/C;QACD,SAAS,EAAE;YACT,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,kCAAkC,EAAE;YAC9E,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,4BAA4B,EAAE;YACtE,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,4BAA4B,EAAE;YACtE,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,6BAA6B,EAAE;YACvE,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,6BAA6B,EAAE;SACxE;KACF,CAAC;AACJ,CAAC,CACF,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "jsx-htmx/jsx-runtime";
|
|
2
2
|
export function render(data) {
|
|
3
|
-
return (_jsxs("section", { class: "container-fluid px-0", children: [_jsxs("div", { class: "mb-4", children: [_jsx("img", { src: data.logoUrl, alt: "BetterTunnels", class: "img-fluid mb-3", style: "max-width: 280px; height: auto;" }), _jsx("h1", { class: "h3 mb-1", children: "
|
|
3
|
+
return (_jsxs("section", { class: "container-fluid px-0", children: [_jsxs("div", { class: "mb-4", children: [_jsx("img", { src: data.logoUrl, alt: "BetterTunnels", class: "img-fluid mb-3", style: "max-width: 280px; height: auto;" }), _jsx("h1", { class: "h3 mb-1", children: "CLI Downloads" }), _jsx("p", { class: "text-body-secondary mb-0", children: "Download the CLI and start a public development tunnel." })] }), _jsxs("div", { class: "row g-4", children: [_jsx("div", { class: "col-lg-5", children: _jsxs("div", { class: "border rounded-3 p-4 bg-body h-100", children: [_jsx("h2", { class: "h5 mb-3", children: "Quick start" }), data.examples.map((example) => (_jsx("pre", { class: "small bg-body-tertiary border rounded-2 p-3 mb-2", children: _jsx("code", { children: example }) })))] }) }), _jsx("div", { class: "col-lg-7", children: _jsxs("div", { class: "border rounded-3 bg-body h-100", children: [_jsxs("div", { class: "px-3 py-2 border-bottom d-flex justify-content-between", children: [_jsx("span", { class: "fw-semibold", children: "Release assets" }), _jsx("span", { class: "text-body-secondary", children: data.latestTag })] }), _jsx("div", { class: "table-responsive", children: _jsxs("table", { class: "table table-sm align-middle mb-0", children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { children: "OS" }), _jsx("th", { children: "Arch" }), _jsx("th", { children: "Artifact" })] }) }), _jsx("tbody", { children: data.downloads.map((download) => (_jsxs("tr", { children: [_jsx("td", { children: download.os }), _jsx("td", { children: download.arch }), _jsx("td", { children: _jsx("code", { children: download.artifact }) })] }))) })] }) })] }) })] })] }));
|
|
4
4
|
}
|
|
5
5
|
//# sourceMappingURL=GET.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GET.js","sourceRoot":"","sources":["../../../../../../src/plugins/service-tunnels-admin/bp-routes/downloads/_theme.bootstrap1/GET.tsx"],"names":[],"mappings":";AAIA,MAAM,UAAU,MAAM,CAAC,IAAkB;IACvC,OAAO,CACL,mBAAS,KAAK,EAAC,sBAAsB,aACnC,eAAK,KAAK,EAAC,MAAM,aACf,cACE,GAAG,EAAE,IAAI,CAAC,OAAO,EACjB,GAAG,EAAC,eAAe,EACnB,KAAK,EAAC,gBAAgB,EACtB,KAAK,EAAC,iCAAiC,GACvC,EACF,aAAI,KAAK,EAAC,SAAS,
|
|
1
|
+
{"version":3,"file":"GET.js","sourceRoot":"","sources":["../../../../../../src/plugins/service-tunnels-admin/bp-routes/downloads/_theme.bootstrap1/GET.tsx"],"names":[],"mappings":";AAIA,MAAM,UAAU,MAAM,CAAC,IAAkB;IACvC,OAAO,CACL,mBAAS,KAAK,EAAC,sBAAsB,aACnC,eAAK,KAAK,EAAC,MAAM,aACf,cACE,GAAG,EAAE,IAAI,CAAC,OAAO,EACjB,GAAG,EAAC,eAAe,EACnB,KAAK,EAAC,gBAAgB,EACtB,KAAK,EAAC,iCAAiC,GACvC,EACF,aAAI,KAAK,EAAC,SAAS,8BAAmB,EACtC,YAAG,KAAK,EAAC,0BAA0B,wEAA4D,IAC3F,EAEN,eAAK,KAAK,EAAC,SAAS,aAClB,cAAK,KAAK,EAAC,UAAU,YACnB,eAAK,KAAK,EAAC,oCAAoC,aAC7C,aAAI,KAAK,EAAC,SAAS,4BAAiB,EACnC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAC9B,cAAK,KAAK,EAAC,kDAAkD,YAAC,yBAAO,OAAO,GAAQ,GAAM,CAC3F,CAAC,IACE,GACF,EACN,cAAK,KAAK,EAAC,UAAU,YACnB,eAAK,KAAK,EAAC,gCAAgC,aACzC,eAAK,KAAK,EAAC,wDAAwD,aACjE,eAAM,KAAK,EAAC,aAAa,+BAAsB,EAC/C,eAAM,KAAK,EAAC,qBAAqB,YAAE,IAAI,CAAC,SAAS,GAAQ,IACrD,EACN,cAAK,KAAK,EAAC,kBAAkB,YAC3B,iBAAO,KAAK,EAAC,kCAAkC,aAC7C,0BACE,yBACE,8BAAW,EACX,gCAAa,EACb,oCAAiB,IACd,GACC,EACR,0BACG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAChC,yBACE,uBAAK,QAAQ,CAAC,EAAE,GAAM,EACtB,uBAAK,QAAQ,CAAC,IAAI,GAAM,EACxB,uBAAI,yBAAO,QAAQ,CAAC,QAAQ,GAAQ,GAAK,IACtC,CACN,CAAC,GACI,IACF,GACJ,IACF,GACF,IACF,IACE,CACX,CAAC;AACJ,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type ApiAuthRequirement, type CacheHints } from "@betterportal/framework";
|
|
2
2
|
export declare const viewId = "better-tunnels.downloads";
|
|
3
|
-
export declare const title = "
|
|
3
|
+
export declare const title = "CLI Downloads";
|
|
4
4
|
export declare const description = "CLI download and setup commands.";
|
|
5
5
|
export declare const auth: ApiAuthRequirement;
|
|
6
6
|
export declare const cacheHints: CacheHints;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/service-tunnels-admin/bp-routes/downloads/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,UAAU,EAChB,MAAM,yBAAyB,CAAC;AAEjC,eAAO,MAAM,MAAM,6BAA6B,CAAC;AACjD,eAAO,MAAM,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/service-tunnels-admin/bp-routes/downloads/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,UAAU,EAChB,MAAM,yBAAyB,CAAC;AAEjC,eAAO,MAAM,MAAM,6BAA6B,CAAC;AACjD,eAAO,MAAM,KAAK,kBAAkB,CAAC;AACrC,eAAO,MAAM,WAAW,qCAAqC,CAAC;AAE9D,eAAO,MAAM,IAAI,EAAE,kBAGlB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,UAGxB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/plugins/service-tunnels-admin/bp-routes/downloads/index.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,MAAM,GAAG,0BAA0B,CAAC;AACjD,MAAM,CAAC,MAAM,KAAK,GAAG,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/plugins/service-tunnels-admin/bp-routes/downloads/index.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,MAAM,GAAG,0BAA0B,CAAC;AACjD,MAAM,CAAC,MAAM,KAAK,GAAG,eAAe,CAAC;AACrC,MAAM,CAAC,MAAM,WAAW,GAAG,kCAAkC,CAAC;AAE9D,MAAM,CAAC,MAAM,IAAI,GAAuB;IACtC,QAAQ,EAAE,KAAK;IACf,WAAW,EAAE,EAAE;CAChB,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAe;IACpC,UAAU,EAAE,EAAE;IACd,MAAM,EAAE,CAAC,QAAQ,EAAE,gBAAgB,EAAE,aAAa,CAAC;CACpD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GET.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/service-tunnels-admin/bp-routes/landing/GET.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAIrC,eAAO,MAAM,cAAc;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"GET.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/service-tunnels-admin/bp-routes/landing/GET.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAIrC,eAAO,MAAM,cAAc;;;;;;;;;;;;;;EAczB,CAAC;AACH,MAAM,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;;;;;;;;;;;;;;;;AAExD,wBAoCE"}
|
|
@@ -13,9 +13,9 @@ export const ResponseSchema = av.object({
|
|
|
13
13
|
highlights: av.array(av.object({
|
|
14
14
|
title: av.string(),
|
|
15
15
|
body: av.string()
|
|
16
|
-
}
|
|
16
|
+
})),
|
|
17
17
|
limits: av.array(av.string())
|
|
18
|
-
}
|
|
18
|
+
});
|
|
19
19
|
export default createHandler({ response: ResponseSchema }, async () => {
|
|
20
20
|
const brand = await loadBrandAssets();
|
|
21
21
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GET.js","sourceRoot":"","sources":["../../../../../src/plugins/service-tunnels-admin/bp-routes/landing/GET.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC,MAAM,CAAC;IACtC,OAAO,EAAE,EAAE,CAAC,MAAM,EAAE;IACpB,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE;IACnB,WAAW,EAAE,EAAE,CAAC,MAAM,EAAE;IACxB,OAAO,EAAE,EAAE,CAAC,MAAM,EAAE;IACpB,OAAO,EAAE,EAAE,CAAC,MAAM,EAAE;IACpB,OAAO,EAAE,EAAE,CAAC,MAAM,EAAE;IACpB,UAAU,EAAE,EAAE,CAAC,MAAM,EAAE;IACvB,UAAU,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;IACjC,UAAU,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC;QAC7B,KAAK,EAAE,EAAE,CAAC,MAAM,EAAE;QAClB,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE;KAClB,
|
|
1
|
+
{"version":3,"file":"GET.js","sourceRoot":"","sources":["../../../../../src/plugins/service-tunnels-admin/bp-routes/landing/GET.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC,MAAM,CAAC;IACtC,OAAO,EAAE,EAAE,CAAC,MAAM,EAAE;IACpB,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE;IACnB,WAAW,EAAE,EAAE,CAAC,MAAM,EAAE;IACxB,OAAO,EAAE,EAAE,CAAC,MAAM,EAAE;IACpB,OAAO,EAAE,EAAE,CAAC,MAAM,EAAE;IACpB,OAAO,EAAE,EAAE,CAAC,MAAM,EAAE;IACpB,UAAU,EAAE,EAAE,CAAC,MAAM,EAAE;IACvB,UAAU,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;IACjC,UAAU,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC;QAC7B,KAAK,EAAE,EAAE,CAAC,MAAM,EAAE;QAClB,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE;KAClB,CAAC,CAAC;IACH,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;CAC9B,CAAC,CAAC;AAGH,eAAe,aAAa,CAC1B,EAAE,QAAQ,EAAE,cAAc,EAAE,EAC5B,KAAK,IAAI,EAAE;IACT,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAC;IAEtC,OAAO;QACL,OAAO,EAAE,eAAe;QACxB,MAAM,EAAE,0BAA0B;QAClC,WAAW,EAAE,kCAAkC;QAC/C,OAAO,EAAE,uCAAuC;QAChD,GAAG,KAAK;QACR,UAAU,EAAE;YACV,mCAAmC;YACnC,8CAA8C;SAC/C;QACD,UAAU,EAAE;YACV;gBACE,KAAK,EAAE,wBAAwB;gBAC/B,IAAI,EAAE,8EAA8E;aACrF;YACD;gBACE,KAAK,EAAE,2BAA2B;gBAClC,IAAI,EAAE,oFAAoF;aAC3F;YACD;gBACE,KAAK,EAAE,sBAAsB;gBAC7B,IAAI,EAAE,0FAA0F;aACjG;SACF;QACD,MAAM,EAAE;YACN,mCAAmC;YACnC,kDAAkD;YAClD,+EAA+E;SAChF;KACF,CAAC;AACJ,CAAC,CACF,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type ApiAuthRequirement, type CacheHints } from "@betterportal/framework";
|
|
2
2
|
export declare const viewId = "better-tunnels.landing";
|
|
3
|
-
export declare const title = "
|
|
3
|
+
export declare const title = "Development Tunnels";
|
|
4
4
|
export declare const description = "Public landing page for BetterTunnels.";
|
|
5
5
|
export declare const auth: ApiAuthRequirement;
|
|
6
6
|
export declare const cacheHints: CacheHints;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/service-tunnels-admin/bp-routes/landing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,UAAU,EAChB,MAAM,yBAAyB,CAAC;AAEjC,eAAO,MAAM,MAAM,2BAA2B,CAAC;AAC/C,eAAO,MAAM,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/service-tunnels-admin/bp-routes/landing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,UAAU,EAChB,MAAM,yBAAyB,CAAC;AAEjC,eAAO,MAAM,MAAM,2BAA2B,CAAC;AAC/C,eAAO,MAAM,KAAK,wBAAwB,CAAC;AAC3C,eAAO,MAAM,WAAW,2CAA2C,CAAC;AAEpE,eAAO,MAAM,IAAI,EAAE,kBAGlB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,UAGxB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/plugins/service-tunnels-admin/bp-routes/landing/index.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,MAAM,GAAG,wBAAwB,CAAC;AAC/C,MAAM,CAAC,MAAM,KAAK,GAAG,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/plugins/service-tunnels-admin/bp-routes/landing/index.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,MAAM,GAAG,wBAAwB,CAAC;AAC/C,MAAM,CAAC,MAAM,KAAK,GAAG,qBAAqB,CAAC;AAC3C,MAAM,CAAC,MAAM,WAAW,GAAG,wCAAwC,CAAC;AAEpE,MAAM,CAAC,MAAM,IAAI,GAAuB;IACtC,QAAQ,EAAE,KAAK;IACf,WAAW,EAAE,EAAE;CAChB,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAe;IACpC,UAAU,EAAE,EAAE;IACd,MAAM,EAAE,CAAC,QAAQ,EAAE,gBAAgB,EAAE,aAAa,CAAC;CACpD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GET.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/service-tunnels-admin/bp-routes/tunnels/GET.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAkBrC,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"GET.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/service-tunnels-admin/bp-routes/tunnels/GET.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAkBrC,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;EAIzB,CAAC;AACH,MAAM,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;;;;;;;;;;;;;;;;;;AAExD,wBA2BE"}
|
|
@@ -13,12 +13,12 @@ const TunnelRowSchema = av.object({
|
|
|
13
13
|
requests: av.number(),
|
|
14
14
|
bytesIn: av.number(),
|
|
15
15
|
bytesOut: av.number()
|
|
16
|
-
}
|
|
16
|
+
});
|
|
17
17
|
export const ResponseSchema = av.object({
|
|
18
18
|
active: av.number(),
|
|
19
19
|
total: av.number(),
|
|
20
20
|
tunnels: av.array(TunnelRowSchema)
|
|
21
|
-
}
|
|
21
|
+
});
|
|
22
22
|
export default createHandler({ response: ResponseSchema }, async () => {
|
|
23
23
|
const rows = await prisma.tunnel.findMany({
|
|
24
24
|
orderBy: { createdAt: "desc" },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GET.js","sourceRoot":"","sources":["../../../../../src/plugins/service-tunnels-admin/bp-routes/tunnels/GET.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,MAAM,eAAe,GAAG,EAAE,CAAC,MAAM,CAAC;IAChC,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE;IACf,SAAS,EAAE,EAAE,CAAC,MAAM,EAAE;IACtB,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE;IACnB,aAAa,EAAE,EAAE,CAAC,IAAI,EAAE;IACxB,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE;IACnB,aAAa,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;IACvC,SAAS,EAAE,EAAE,CAAC,MAAM,EAAE;IACtB,SAAS,EAAE,EAAE,CAAC,MAAM,EAAE;IACtB,QAAQ,EAAE,EAAE,CAAC,MAAM,EAAE;IACrB,OAAO,EAAE,EAAE,CAAC,MAAM,EAAE;IACpB,QAAQ,EAAE,EAAE,CAAC,MAAM,EAAE;CACtB,
|
|
1
|
+
{"version":3,"file":"GET.js","sourceRoot":"","sources":["../../../../../src/plugins/service-tunnels-admin/bp-routes/tunnels/GET.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,MAAM,eAAe,GAAG,EAAE,CAAC,MAAM,CAAC;IAChC,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE;IACf,SAAS,EAAE,EAAE,CAAC,MAAM,EAAE;IACtB,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE;IACnB,aAAa,EAAE,EAAE,CAAC,IAAI,EAAE;IACxB,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE;IACnB,aAAa,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;IACvC,SAAS,EAAE,EAAE,CAAC,MAAM,EAAE;IACtB,SAAS,EAAE,EAAE,CAAC,MAAM,EAAE;IACtB,QAAQ,EAAE,EAAE,CAAC,MAAM,EAAE;IACrB,OAAO,EAAE,EAAE,CAAC,MAAM,EAAE;IACpB,QAAQ,EAAE,EAAE,CAAC,MAAM,EAAE;CACtB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC,MAAM,CAAC;IACtC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE;IACnB,KAAK,EAAE,EAAE,CAAC,MAAM,EAAE;IAClB,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC;CACnC,CAAC,CAAC;AAGH,eAAe,aAAa,CAC1B,EAAE,QAAQ,EAAE,cAAc,EAAE,EAC5B,KAAK,IAAI,EAAE;IACT,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;QACxC,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE;QAC9B,IAAI,EAAE,EAAE;QACR,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;KACzB,CAAC,CAAC;IAEH,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,MAAM;QAC5D,KAAK,EAAE,IAAI,CAAC,MAAM;QAClB,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC1B,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,MAAM,EAAE,GAAG,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,UAAU,EAAE;YAC7C,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,aAAa,EAAE,GAAG,CAAC,aAAa,IAAI,SAAS;YAC7C,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE;YACtC,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE;YACtC,QAAQ,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ,IAAI,CAAC;YAClC,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,IAAI,EAAE,CAAC;YACzC,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,IAAI,EAAE,CAAC;SAC5C,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC,CACF,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "jsx-htmx/jsx-runtime";
|
|
2
2
|
export function render(data) {
|
|
3
|
-
return (_jsxs("section", { class: "container-fluid px-0", children: [_jsxs("div", { class: "d-flex justify-content-between align-items-start mb-4", children: [_jsxs("div", { children: [_jsx("h1", { class: "h3 mb-1", children: "
|
|
3
|
+
return (_jsxs("section", { class: "container-fluid px-0", children: [_jsxs("div", { class: "d-flex justify-content-between align-items-start mb-4", children: [_jsxs("div", { children: [_jsx("h1", { class: "h3 mb-1", children: "Tunnel Sessions" }), _jsx("p", { class: "text-body-secondary mb-0", children: "Live tunnel sessions and recent usage." })] }), _jsxs("div", { class: "text-end", children: [_jsx("div", { class: "h4 mb-0", children: String(data.active) }), _jsxs("div", { class: "small text-body-secondary", children: ["active / ", String(data.total), " shown"] })] })] }), _jsx("div", { class: "card border-0 shadow-sm", children: _jsx("div", { class: "table-responsive", children: _jsxs("table", { class: "table table-sm table-hover align-middle mb-0", children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { children: "Subdomain" }), _jsx("th", { children: "Target" }), _jsx("th", { children: "Status" }), _jsx("th", { children: "Mode" }), _jsx("th", { class: "text-end", children: "Requests" }), _jsx("th", { children: "Expires" })] }) }), _jsx("tbody", { children: data.tunnels.length === 0 ? (_jsx("tr", { children: _jsx("td", { colspan: "6", class: "text-center text-body-secondary py-4", children: "No tunnels yet." }) })) : data.tunnels.map((tunnel) => (_jsxs("tr", { children: [_jsxs("td", { children: [_jsx("code", { children: tunnel.subdomain }), _jsx("div", { class: "small text-body-secondary", children: tunnel.ownerServerId ?? "no owner" })] }), _jsx("td", { children: tunnel.target }), _jsx("td", { children: _jsx("span", { class: `badge ${tunnel.status === "active" ? "text-bg-success" : "text-bg-secondary"}`, children: tunnel.status }) }), _jsx("td", { children: tunnel.authenticated ? "authenticated" : "anonymous" }), _jsx("td", { class: "text-end", children: String(tunnel.requests) }), _jsx("td", { class: "small text-body-secondary", children: new Date(tunnel.expiresAt).toLocaleString() })] }))) })] }) }) })] }));
|
|
4
4
|
}
|
|
5
5
|
//# sourceMappingURL=GET.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GET.js","sourceRoot":"","sources":["../../../../../../src/plugins/service-tunnels-admin/bp-routes/tunnels/_theme.bootstrap1/GET.tsx"],"names":[],"mappings":";AAIA,MAAM,UAAU,MAAM,CAAC,IAAkB;IACvC,OAAO,CACL,mBAAS,KAAK,EAAC,sBAAsB,aACnC,eAAK,KAAK,EAAC,uDAAuD,aAChE,0BACE,aAAI,KAAK,EAAC,SAAS,
|
|
1
|
+
{"version":3,"file":"GET.js","sourceRoot":"","sources":["../../../../../../src/plugins/service-tunnels-admin/bp-routes/tunnels/_theme.bootstrap1/GET.tsx"],"names":[],"mappings":";AAIA,MAAM,UAAU,MAAM,CAAC,IAAkB;IACvC,OAAO,CACL,mBAAS,KAAK,EAAC,sBAAsB,aACnC,eAAK,KAAK,EAAC,uDAAuD,aAChE,0BACE,aAAI,KAAK,EAAC,SAAS,gCAAqB,EACxC,YAAG,KAAK,EAAC,0BAA0B,uDAA2C,IAC1E,EACN,eAAK,KAAK,EAAC,UAAU,aACnB,cAAK,KAAK,EAAC,SAAS,YAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAO,EAChD,eAAK,KAAK,EAAC,2BAA2B,0BAAW,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,cAAa,IAC5E,IACF,EAEN,cAAK,KAAK,EAAC,yBAAyB,YAClC,cAAK,KAAK,EAAC,kBAAkB,YAC3B,iBAAO,KAAK,EAAC,8CAA8C,aACzD,0BACE,yBACE,qCAAkB,EAClB,kCAAe,EACf,kCAAe,EACf,gCAAa,EACb,aAAI,KAAK,EAAC,UAAU,yBAAc,EAClC,mCAAgB,IACb,GACC,EACR,0BACG,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAC3B,uBACE,aAAI,OAAO,EAAC,GAAG,EAAC,KAAK,EAAC,sCAAsC,gCAAqB,GAC9E,CACN,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAC/B,yBACE,yBACE,yBAAO,MAAM,CAAC,SAAS,GAAQ,EAC/B,cAAK,KAAK,EAAC,2BAA2B,YAAE,MAAM,CAAC,aAAa,IAAI,UAAU,GAAO,IAC9E,EACL,uBAAK,MAAM,CAAC,MAAM,GAAM,EACxB,uBAAI,eAAM,KAAK,EAAE,SAAS,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,mBAAmB,EAAE,YAAG,MAAM,CAAC,MAAM,GAAQ,GAAK,EAC7H,uBAAK,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,WAAW,GAAM,EAC/D,aAAI,KAAK,EAAC,UAAU,YAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAM,EACnD,aAAI,KAAK,EAAC,2BAA2B,YAAE,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,GAAM,IACrF,CACN,CAAC,GACI,IACF,GACJ,GACF,IACE,CACX,CAAC;AACJ,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type ApiAuthRequirement, type CacheHints } from "@betterportal/framework";
|
|
2
2
|
export declare const viewId = "better-tunnels.tunnels";
|
|
3
|
-
export declare const title = "
|
|
3
|
+
export declare const title = "Tunnel Sessions";
|
|
4
4
|
export declare const description = "Tunnel sessions, status, and recent activity.";
|
|
5
5
|
export declare const auth: ApiAuthRequirement;
|
|
6
6
|
export declare const cacheHints: CacheHints;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/service-tunnels-admin/bp-routes/tunnels/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,UAAU,EAChB,MAAM,yBAAyB,CAAC;AAEjC,eAAO,MAAM,MAAM,2BAA2B,CAAC;AAC/C,eAAO,MAAM,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/service-tunnels-admin/bp-routes/tunnels/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,UAAU,EAChB,MAAM,yBAAyB,CAAC;AAEjC,eAAO,MAAM,MAAM,2BAA2B,CAAC;AAC/C,eAAO,MAAM,KAAK,oBAAoB,CAAC;AACvC,eAAO,MAAM,WAAW,kDAAkD,CAAC;AAE3E,eAAO,MAAM,IAAI,EAAE,kBAKlB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,UAGxB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/plugins/service-tunnels-admin/bp-routes/tunnels/index.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,MAAM,GAAG,wBAAwB,CAAC;AAC/C,MAAM,CAAC,MAAM,KAAK,GAAG,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/plugins/service-tunnels-admin/bp-routes/tunnels/index.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,MAAM,GAAG,wBAAwB,CAAC;AAC/C,MAAM,CAAC,MAAM,KAAK,GAAG,iBAAiB,CAAC;AACvC,MAAM,CAAC,MAAM,WAAW,GAAG,+CAA+C,CAAC;AAE3E,MAAM,CAAC,MAAM,IAAI,GAAuB;IACtC,QAAQ,EAAE,IAAI;IACd,WAAW,EAAE;QACX,EAAE,SAAS,EAAE,8BAA8B,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,MAAM,CAAC,EAAE;KAC7E;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAe;IACpC,UAAU,EAAE,CAAC;IACb,MAAM,EAAE,CAAC,QAAQ,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,CAAC;CACrE,CAAC"}
|
|
@@ -8,9 +8,9 @@ const PluginConfigSchema = av.object({
|
|
|
8
8
|
port: av.int().min(1).default(8083),
|
|
9
9
|
database: av.object({
|
|
10
10
|
connectionString: av.string().minLength(1).describe("PostgreSQL connection string")
|
|
11
|
-
}
|
|
11
|
+
}).describe("Database configuration"),
|
|
12
12
|
betterportal: BetterPortalConfigSchema
|
|
13
|
-
}
|
|
13
|
+
});
|
|
14
14
|
const Config = createConfigSchema({
|
|
15
15
|
name: "service-tunnels-admin",
|
|
16
16
|
description: "BetterPortal public and management UI for BetterTunnels",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/service-tunnels-admin/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,wBAAwB,EAAE,SAAS,EAA4B,MAAM,0BAA0B,CAAC;AACzG,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,kBAAkB,GAAG,EAAE,CAAC,MAAM,CAAC;IACnC,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IACjD,IAAI,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IACnC,QAAQ,EAAE,EAAE,CAAC,MAAM,CAAC;QAClB,gBAAgB,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,8BAA8B,CAAC;KACpF,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/service-tunnels-admin/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/service-tunnels-client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,KAAK,qBAAqB,EAC1B,KAAK,UAAU,EAOhB,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAuB9B,eAAO,MAAM,MAAM;;;;;;;;;GAgBlB,CAAC;AAEF,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwDvB,CAAC;AAEH,qBAAa,MAAO,SAAQ,UAAU,CAAC,YAAY,CAAC,OAAO,MAAM,CAAC,EAAE,OAAO,YAAY,CAAC;IACtF,MAAM,CAAC,MAAM;;;;;;;;;QAAU;IACvB,MAAM,CAAC,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAAgB;IACnC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,EAAE,CAAM;IAC1C,QAAQ,CAAC,gBAAgB,EAAE,MAAM,EAAE,CAAM;IACzC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,EAAE,CAAM;IACzC,QAAQ,CAAC,eAAe,EAAE,MAAM,EAAE,CAAM;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwB;IACjD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAK;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAkB;IACtC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAkB;IACtC,OAAO,CAAC,oBAAoB,CAAW;gBAE3B,GAAG,EAAE,qBAAqB,CAAC,YAAY,CAAC,OAAO,MAAM,CAAC,EAAE,OAAO,YAAY,CAAC;IAQlF,IAAI,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IA+
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/service-tunnels-client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,KAAK,qBAAqB,EAC1B,KAAK,UAAU,EAOhB,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAuB9B,eAAO,MAAM,MAAM;;;;;;;;;GAgBlB,CAAC;AAEF,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwDvB,CAAC;AAEH,qBAAa,MAAO,SAAQ,UAAU,CAAC,YAAY,CAAC,OAAO,MAAM,CAAC,EAAE,OAAO,YAAY,CAAC;IACtF,MAAM,CAAC,MAAM;;;;;;;;;QAAU;IACvB,MAAM,CAAC,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAAgB;IACnC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,EAAE,CAAM;IAC1C,QAAQ,CAAC,gBAAgB,EAAE,MAAM,EAAE,CAAM;IACzC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,EAAE,CAAM;IACzC,QAAQ,CAAC,eAAe,EAAE,MAAM,EAAE,CAAM;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwB;IACjD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAK;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAkB;IACtC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAkB;IACtC,OAAO,CAAC,oBAAoB,CAAW;gBAE3B,GAAG,EAAE,qBAAqB,CAAC,YAAY,CAAC,OAAO,MAAM,CAAC,EAAE,OAAO,YAAY,CAAC;IAQlF,IAAI,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IA+MpC,GAAG,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAQnC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAehB,kBAAkB;YAwKlB,YAAY;IA0E1B,OAAO,CAAC,iBAAiB;IA0DzB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,kBAAkB;CAK3B;AAwCD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,QAAQ,CAG/F"}
|
|
@@ -10,7 +10,7 @@ import { buildTunnelSubdomain, hashValue, randomPrefix } from "./ids.js";
|
|
|
10
10
|
import { prisma } from "../../prisma.js";
|
|
11
11
|
import { initializePrisma } from "../../prisma.js";
|
|
12
12
|
import { AUTH_SESSION_TTL_MS, DEVICE_TOKEN_TTL_MS, bearerToken, hashSecret, normalizeIpRange, randomToken, shortBrowserKey, verifySecret } from "../../auth.js";
|
|
13
|
-
import { TunnelRegistry } from "./registry.js";
|
|
13
|
+
import { TunnelRegistry, tunnelStatusAfterDisconnect } from "./registry.js";
|
|
14
14
|
import TunnelWebClient from "../../.bsb/clients/service-tunnels-proxy.js";
|
|
15
15
|
export const Config = createConfigSchema({
|
|
16
16
|
name: "service-tunnels-client",
|
|
@@ -19,7 +19,7 @@ export const Config = createConfigSchema({
|
|
|
19
19
|
}, av.object({
|
|
20
20
|
database: av.object({
|
|
21
21
|
connectionString: av.string().minLength(1).describe("PostgreSQL connection string")
|
|
22
|
-
}
|
|
22
|
+
}).describe("Database configuration"),
|
|
23
23
|
port: av.number().default(8081).describe("Client API listener port"),
|
|
24
24
|
domain: av.string().default("tunnels.betterportal.dev").describe("Default public tunnel domain"),
|
|
25
25
|
publicUrl: av.string().default("https://tunnels.betterportal.dev").describe("Public base URL"),
|
|
@@ -95,6 +95,22 @@ export class Plugin extends BSBService {
|
|
|
95
95
|
async init(obs) {
|
|
96
96
|
await initializePrisma(this.config.database.connectionString, obs);
|
|
97
97
|
this.pluginPackageVersion = await loadPluginPackageVersion(this.packageCwd);
|
|
98
|
+
const now = new Date();
|
|
99
|
+
const [expired, disconnected] = await prisma.$transaction([
|
|
100
|
+
prisma.tunnel.updateMany({
|
|
101
|
+
where: { status: "active", expiresAt: { lte: now } },
|
|
102
|
+
data: { status: "expired" }
|
|
103
|
+
}),
|
|
104
|
+
// ponytail: single client-api replica; add owner heartbeats before horizontal scaling.
|
|
105
|
+
prisma.tunnel.updateMany({
|
|
106
|
+
where: { status: "active" },
|
|
107
|
+
data: { status: "disconnected" }
|
|
108
|
+
})
|
|
109
|
+
]);
|
|
110
|
+
obs.log.info("CLIENT SESSION reconciled expired={expired} disconnected={disconnected}", {
|
|
111
|
+
expired: expired.count,
|
|
112
|
+
disconnected: disconnected.count
|
|
113
|
+
});
|
|
98
114
|
obs.log.info("init {plugin}", { plugin: this.pluginName });
|
|
99
115
|
await this.events.onReturnableEvent("proxy.request", obs, async (_handlerObs, input) => {
|
|
100
116
|
_handlerObs.log.info("CLIENT API proxy.request {method} {hostname}{path}", {
|
|
@@ -281,6 +297,14 @@ export class Plugin extends BSBService {
|
|
|
281
297
|
obs.log.info(`client-api listening on port ${port}`);
|
|
282
298
|
}
|
|
283
299
|
async dispose() {
|
|
300
|
+
for (const tunnel of this.registry.values()) {
|
|
301
|
+
clearTimeout(tunnel.expiryTimer);
|
|
302
|
+
tunnel.ws.close(1001, "server shutting down");
|
|
303
|
+
}
|
|
304
|
+
await prisma.tunnel.updateMany({
|
|
305
|
+
where: { status: "active", ownerServerId: this.appId },
|
|
306
|
+
data: { status: "disconnected" }
|
|
307
|
+
});
|
|
284
308
|
this.wss.close();
|
|
285
309
|
await new Promise((resolve, reject) => {
|
|
286
310
|
this.server.close((error) => error ? reject(error) : resolve());
|
|
@@ -383,6 +407,12 @@ export class Plugin extends BSBService {
|
|
|
383
407
|
expiresAt
|
|
384
408
|
}
|
|
385
409
|
});
|
|
410
|
+
const expiryTimer = setTimeout(() => {
|
|
411
|
+
if (this.registry.get(subdomain)?.ws === ws) {
|
|
412
|
+
ws.close(1008, "tunnel expired");
|
|
413
|
+
}
|
|
414
|
+
}, Math.max(0, expiresAt.getTime() - Date.now()));
|
|
415
|
+
expiryTimer.unref();
|
|
386
416
|
const tunnel = {
|
|
387
417
|
id: tunnelRow.id,
|
|
388
418
|
subdomain,
|
|
@@ -391,6 +421,7 @@ export class Plugin extends BSBService {
|
|
|
391
421
|
authenticated,
|
|
392
422
|
expiresAt,
|
|
393
423
|
ws,
|
|
424
|
+
expiryTimer,
|
|
394
425
|
pending: new Map(),
|
|
395
426
|
sessionObs
|
|
396
427
|
};
|
|
@@ -405,10 +436,12 @@ export class Plugin extends BSBService {
|
|
|
405
436
|
publicUrl: publicUrl.replace(/\/$/, "").replace(`://${domain}`, `://${subdomain}.${domain}`),
|
|
406
437
|
subdomain,
|
|
407
438
|
expiresAt: expiresAt.toISOString(),
|
|
408
|
-
serverVersion: this.pluginPackageVersion
|
|
439
|
+
serverVersion: this.pluginPackageVersion,
|
|
440
|
+
validation
|
|
409
441
|
}));
|
|
410
442
|
ws.on("message", (raw) => this.handleClientFrame(tunnel, raw.toString()));
|
|
411
443
|
ws.on("close", (code, reason) => {
|
|
444
|
+
clearTimeout(tunnel.expiryTimer);
|
|
412
445
|
sessionObs.log.warn("CLIENT TUNNEL disconnected {subdomain}", { subdomain });
|
|
413
446
|
for (const [requestId, pending] of tunnel.pending.entries()) {
|
|
414
447
|
this.failPending(tunnel, requestId, pending, new Error("Tunnel client disconnected."));
|
|
@@ -416,7 +449,10 @@ export class Plugin extends BSBService {
|
|
|
416
449
|
// A reconnect may already own this subdomain; only tear down if this socket is still the registered one.
|
|
417
450
|
if (this.registry.get(subdomain)?.ws === ws) {
|
|
418
451
|
this.registry.delete(subdomain);
|
|
419
|
-
void prisma.tunnel.update({
|
|
452
|
+
void prisma.tunnel.update({
|
|
453
|
+
where: { id: tunnel.id },
|
|
454
|
+
data: { status: tunnelStatusAfterDisconnect(tunnel.expiresAt) }
|
|
455
|
+
}).catch(() => undefined);
|
|
420
456
|
}
|
|
421
457
|
sessionObs.end({ "bt.client.disconnect": true });
|
|
422
458
|
sessionObs.log.warn("CLIENT TUNNEL socket closed {subdomain} code={code} reason={reason}", {
|