@betterportal/tunnels 1.0.24 → 1.0.26

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 (160) hide show
  1. package/lib/.bsb/clients/service-tunnels-client.d.ts +133 -0
  2. package/lib/.bsb/clients/service-tunnels-client.d.ts.map +1 -0
  3. package/lib/.bsb/clients/service-tunnels-client.js +102 -0
  4. package/lib/.bsb/clients/service-tunnels-client.js.map +1 -0
  5. package/lib/.bsb/clients/service-tunnels-proxy.d.ts +43 -0
  6. package/lib/.bsb/clients/service-tunnels-proxy.d.ts.map +1 -0
  7. package/lib/.bsb/clients/service-tunnels-proxy.js +47 -0
  8. package/lib/.bsb/clients/service-tunnels-proxy.js.map +1 -0
  9. package/lib/auth.d.ts +12 -0
  10. package/lib/auth.d.ts.map +1 -0
  11. package/lib/auth.js +59 -0
  12. package/lib/auth.js.map +1 -0
  13. package/lib/cli.d.ts +2 -0
  14. package/lib/cli.d.ts.map +1 -0
  15. package/lib/cli.js +406 -0
  16. package/lib/cli.js.map +1 -0
  17. package/lib/generated/prisma/client.d.ts +1 -0
  18. package/lib/generated/prisma/client.js +5 -0
  19. package/lib/generated/prisma/default.d.ts +1 -0
  20. package/lib/generated/prisma/default.js +5 -0
  21. package/lib/generated/prisma/edge.d.ts +1 -0
  22. package/lib/generated/prisma/edge.js +278 -0
  23. package/lib/generated/prisma/index-browser.js +304 -0
  24. package/lib/generated/prisma/index.d.ts +13885 -0
  25. package/lib/generated/prisma/index.js +278 -0
  26. package/lib/generated/prisma/package.json +144 -0
  27. package/lib/generated/prisma/query_compiler_fast_bg.js +2 -0
  28. package/lib/generated/prisma/query_compiler_fast_bg.wasm +0 -0
  29. package/lib/generated/prisma/query_compiler_fast_bg.wasm-base64.js +2 -0
  30. package/lib/generated/prisma/runtime/client.d.ts +3386 -0
  31. package/lib/generated/prisma/runtime/client.js +86 -0
  32. package/lib/generated/prisma/runtime/index-browser.d.ts +90 -0
  33. package/lib/generated/prisma/runtime/index-browser.js +6 -0
  34. package/lib/generated/prisma/runtime/wasm-compiler-edge.js +76 -0
  35. package/lib/generated/prisma/schema.prisma +142 -0
  36. package/lib/generated/prisma/wasm-edge-light-loader.mjs +5 -0
  37. package/lib/generated/prisma/wasm-worker-loader.mjs +5 -0
  38. package/lib/plugins/service-tunnels-admin/.bp-generated/registry.d.ts +3 -0
  39. package/lib/plugins/service-tunnels-admin/.bp-generated/registry.d.ts.map +1 -0
  40. package/lib/plugins/service-tunnels-admin/.bp-generated/registry.js +152 -0
  41. package/lib/plugins/service-tunnels-admin/.bp-generated/registry.js.map +1 -0
  42. package/lib/plugins/service-tunnels-admin/.bp-generated/route-runtime.d.ts +9 -0
  43. package/lib/plugins/service-tunnels-admin/.bp-generated/route-runtime.d.ts.map +1 -0
  44. package/lib/plugins/service-tunnels-admin/.bp-generated/route-runtime.js +6 -0
  45. package/lib/plugins/service-tunnels-admin/.bp-generated/route-runtime.js.map +1 -0
  46. package/lib/plugins/service-tunnels-admin/assets/brand/bettertunnels-horizontal-light.svg +18 -0
  47. package/lib/plugins/service-tunnels-admin/assets/brand/bettertunnels-square-dark-1024x1024.png +0 -0
  48. package/lib/plugins/service-tunnels-admin/assets/brand/favicon.svg +12 -0
  49. package/lib/plugins/service-tunnels-admin/betterportal-logo.png +0 -0
  50. package/lib/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/GET.d.ts +20 -0
  51. package/lib/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/GET.d.ts.map +1 -0
  52. package/lib/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/GET.js +51 -0
  53. package/lib/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/GET.js.map +1 -0
  54. package/lib/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/_theme.bootstrap1/GET.d.ts +5 -0
  55. package/lib/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/_theme.bootstrap1/GET.d.ts.map +1 -0
  56. package/lib/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/_theme.bootstrap1/GET.js +6 -0
  57. package/lib/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/_theme.bootstrap1/GET.js.map +1 -0
  58. package/lib/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/index.d.ts +7 -0
  59. package/lib/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/index.d.ts.map +1 -0
  60. package/lib/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/index.js +12 -0
  61. package/lib/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/index.js.map +1 -0
  62. package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/GET.d.ts +40 -0
  63. package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/GET.d.ts.map +1 -0
  64. package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/GET.js +57 -0
  65. package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/GET.js.map +1 -0
  66. package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/_theme.bootstrap1/GET.d.ts +6 -0
  67. package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/_theme.bootstrap1/GET.d.ts.map +1 -0
  68. package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/_theme.bootstrap1/GET.js +30 -0
  69. package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/_theme.bootstrap1/GET.js.map +1 -0
  70. package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/_theme.bootstrap1/index.stream.d.ts +6 -0
  71. package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/_theme.bootstrap1/index.stream.d.ts.map +1 -0
  72. package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/_theme.bootstrap1/index.stream.js +9 -0
  73. package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/_theme.bootstrap1/index.stream.js.map +1 -0
  74. package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/index.d.ts +7 -0
  75. package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/index.d.ts.map +1 -0
  76. package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/index.js +14 -0
  77. package/lib/plugins/service-tunnels-admin/bp-routes/dashboard/index.js.map +1 -0
  78. package/lib/plugins/service-tunnels-admin/bp-routes/downloads/GET.d.ts +25 -0
  79. package/lib/plugins/service-tunnels-admin/bp-routes/downloads/GET.d.ts.map +1 -0
  80. package/lib/plugins/service-tunnels-admin/bp-routes/downloads/GET.js +34 -0
  81. package/lib/plugins/service-tunnels-admin/bp-routes/downloads/GET.js.map +1 -0
  82. package/lib/plugins/service-tunnels-admin/bp-routes/downloads/_theme.bootstrap1/GET.d.ts +5 -0
  83. package/lib/plugins/service-tunnels-admin/bp-routes/downloads/_theme.bootstrap1/GET.d.ts.map +1 -0
  84. package/lib/plugins/service-tunnels-admin/bp-routes/downloads/_theme.bootstrap1/GET.js +5 -0
  85. package/lib/plugins/service-tunnels-admin/bp-routes/downloads/_theme.bootstrap1/GET.js.map +1 -0
  86. package/lib/plugins/service-tunnels-admin/bp-routes/downloads/index.d.ts +7 -0
  87. package/lib/plugins/service-tunnels-admin/bp-routes/downloads/index.d.ts.map +1 -0
  88. package/lib/plugins/service-tunnels-admin/bp-routes/downloads/index.js +12 -0
  89. package/lib/plugins/service-tunnels-admin/bp-routes/downloads/index.js.map +1 -0
  90. package/lib/plugins/service-tunnels-admin/bp-routes/landing/GET.d.ts +35 -0
  91. package/lib/plugins/service-tunnels-admin/bp-routes/landing/GET.d.ts.map +1 -0
  92. package/lib/plugins/service-tunnels-admin/bp-routes/landing/GET.js +52 -0
  93. package/lib/plugins/service-tunnels-admin/bp-routes/landing/GET.js.map +1 -0
  94. package/lib/plugins/service-tunnels-admin/bp-routes/landing/_theme.bootstrap1/GET.d.ts +5 -0
  95. package/lib/plugins/service-tunnels-admin/bp-routes/landing/_theme.bootstrap1/GET.d.ts.map +1 -0
  96. package/lib/plugins/service-tunnels-admin/bp-routes/landing/_theme.bootstrap1/GET.js +5 -0
  97. package/lib/plugins/service-tunnels-admin/bp-routes/landing/_theme.bootstrap1/GET.js.map +1 -0
  98. package/lib/plugins/service-tunnels-admin/bp-routes/landing/index.d.ts +7 -0
  99. package/lib/plugins/service-tunnels-admin/bp-routes/landing/index.d.ts.map +1 -0
  100. package/lib/plugins/service-tunnels-admin/bp-routes/landing/index.js +12 -0
  101. package/lib/plugins/service-tunnels-admin/bp-routes/landing/index.js.map +1 -0
  102. package/lib/plugins/service-tunnels-admin/bp-routes/tunnels/GET.d.ts +39 -0
  103. package/lib/plugins/service-tunnels-admin/bp-routes/tunnels/GET.d.ts.map +1 -0
  104. package/lib/plugins/service-tunnels-admin/bp-routes/tunnels/GET.js +46 -0
  105. package/lib/plugins/service-tunnels-admin/bp-routes/tunnels/GET.js.map +1 -0
  106. package/lib/plugins/service-tunnels-admin/bp-routes/tunnels/_theme.bootstrap1/GET.d.ts +5 -0
  107. package/lib/plugins/service-tunnels-admin/bp-routes/tunnels/_theme.bootstrap1/GET.d.ts.map +1 -0
  108. package/lib/plugins/service-tunnels-admin/bp-routes/tunnels/_theme.bootstrap1/GET.js +5 -0
  109. package/lib/plugins/service-tunnels-admin/bp-routes/tunnels/_theme.bootstrap1/GET.js.map +1 -0
  110. package/lib/plugins/service-tunnels-admin/bp-routes/tunnels/index.d.ts +7 -0
  111. package/lib/plugins/service-tunnels-admin/bp-routes/tunnels/index.d.ts.map +1 -0
  112. package/lib/plugins/service-tunnels-admin/bp-routes/tunnels/index.js +14 -0
  113. package/lib/plugins/service-tunnels-admin/bp-routes/tunnels/index.js.map +1 -0
  114. package/lib/plugins/service-tunnels-admin/brand-assets.d.ts +7 -0
  115. package/lib/plugins/service-tunnels-admin/brand-assets.d.ts.map +1 -0
  116. package/lib/plugins/service-tunnels-admin/brand-assets.js +24 -0
  117. package/lib/plugins/service-tunnels-admin/brand-assets.js.map +1 -0
  118. package/lib/plugins/service-tunnels-admin/index.d.ts +64 -0
  119. package/lib/plugins/service-tunnels-admin/index.d.ts.map +1 -0
  120. package/lib/plugins/service-tunnels-admin/index.js +116 -0
  121. package/lib/plugins/service-tunnels-admin/index.js.map +1 -0
  122. package/lib/plugins/service-tunnels-client/ids.d.ts +6 -0
  123. package/lib/plugins/service-tunnels-client/ids.d.ts.map +1 -0
  124. package/lib/plugins/service-tunnels-client/ids.js +17 -0
  125. package/lib/plugins/service-tunnels-client/ids.js.map +1 -0
  126. package/lib/plugins/service-tunnels-client/index.d.ts +166 -0
  127. package/lib/plugins/service-tunnels-client/index.d.ts.map +1 -0
  128. package/lib/plugins/service-tunnels-client/index.js +733 -0
  129. package/lib/plugins/service-tunnels-client/index.js.map +1 -0
  130. package/lib/plugins/service-tunnels-client/registry.d.ts +39 -0
  131. package/lib/plugins/service-tunnels-client/registry.d.ts.map +1 -0
  132. package/lib/plugins/service-tunnels-client/registry.js +20 -0
  133. package/lib/plugins/service-tunnels-client/registry.js.map +1 -0
  134. package/lib/plugins/service-tunnels-client/schemas.d.ts +91 -0
  135. package/lib/plugins/service-tunnels-client/schemas.d.ts.map +1 -0
  136. package/lib/plugins/service-tunnels-client/schemas.js +73 -0
  137. package/lib/plugins/service-tunnels-client/schemas.js.map +1 -0
  138. package/lib/plugins/service-tunnels-proxy/http.d.ts +5 -0
  139. package/lib/plugins/service-tunnels-proxy/http.d.ts.map +1 -0
  140. package/lib/plugins/service-tunnels-proxy/http.js +125 -0
  141. package/lib/plugins/service-tunnels-proxy/http.js.map +1 -0
  142. package/lib/plugins/service-tunnels-proxy/index.d.ts +85 -0
  143. package/lib/plugins/service-tunnels-proxy/index.d.ts.map +1 -0
  144. package/lib/plugins/service-tunnels-proxy/index.js +288 -0
  145. package/lib/plugins/service-tunnels-proxy/index.js.map +1 -0
  146. package/lib/plugins/service-tunnels-proxy/verification.d.ts +31 -0
  147. package/lib/plugins/service-tunnels-proxy/verification.d.ts.map +1 -0
  148. package/lib/plugins/service-tunnels-proxy/verification.js +211 -0
  149. package/lib/plugins/service-tunnels-proxy/verification.js.map +1 -0
  150. package/lib/prisma.d.ts +7 -0
  151. package/lib/prisma.d.ts.map +1 -0
  152. package/lib/prisma.js +149 -0
  153. package/lib/prisma.js.map +1 -0
  154. package/lib/schemas/service-tunnels-admin.json +129 -0
  155. package/lib/schemas/service-tunnels-admin.plugin.json +140 -0
  156. package/lib/schemas/service-tunnels-client.json +320 -0
  157. package/lib/schemas/service-tunnels-client.plugin.json +97 -0
  158. package/lib/schemas/service-tunnels-proxy.json +160 -0
  159. package/lib/schemas/service-tunnels-proxy.plugin.json +123 -0
  160. package/package.json +1 -1
@@ -0,0 +1,142 @@
1
+ generator client {
2
+ provider = "prisma-client-js"
3
+ output = "../src/generated/prisma"
4
+ }
5
+
6
+ datasource db {
7
+ provider = "postgresql"
8
+ }
9
+
10
+ model Account {
11
+ id String @id @default(cuid())
12
+ email String? @unique
13
+ plan AccountPlan @default(anonymous)
14
+ verificationBypass Boolean @default(false)
15
+ ipVerification Boolean @default(false)
16
+ createdAt DateTime @default(now())
17
+ tunnels Tunnel[]
18
+ }
19
+
20
+ model ClientSession {
21
+ id String @id @default(cuid())
22
+ accountId String?
23
+ ipHash String?
24
+ userAgent String?
25
+ createdAt DateTime @default(now())
26
+ expiresAt DateTime?
27
+ tunnels Tunnel[]
28
+ }
29
+
30
+ model Tunnel {
31
+ id String @id @default(cuid())
32
+ accountId String?
33
+ sessionId String
34
+ subdomain String @unique
35
+ ownerServerId String?
36
+ targetHost String
37
+ targetPort Int
38
+ authenticated Boolean @default(false)
39
+ validation String @default("cookie")
40
+ status TunnelStatus @default(created)
41
+ createdAt DateTime @default(now())
42
+ expiresAt DateTime
43
+ account Account? @relation(fields: [accountId], references: [id])
44
+ session ClientSession @relation(fields: [sessionId], references: [id])
45
+ validations VisitorValidation[]
46
+ usage UsageCounter?
47
+
48
+ @@index([sessionId])
49
+ @@index([expiresAt])
50
+ }
51
+
52
+ model VisitorValidation {
53
+ id String @id @default(cuid())
54
+ tunnelId String
55
+ visitorIpHash String
56
+ userAgentHash String
57
+ validationCookieHash String
58
+ validatedAt DateTime @default(now())
59
+ expiresAt DateTime
60
+ tunnel Tunnel @relation(fields: [tunnelId], references: [id])
61
+
62
+ @@index([tunnelId, visitorIpHash, userAgentHash])
63
+ }
64
+
65
+ model UsageCounter {
66
+ tunnelId String @id
67
+ requests Int @default(0)
68
+ bytesIn BigInt @default(0)
69
+ bytesOut BigInt @default(0)
70
+ updatedAt DateTime @updatedAt
71
+ tunnel Tunnel @relation(fields: [tunnelId], references: [id])
72
+ }
73
+
74
+ model AuditEvent {
75
+ id String @id @default(cuid())
76
+ event String
77
+ subjectId String?
78
+ data Json?
79
+ createdAt DateTime @default(now())
80
+ }
81
+
82
+ model ClientAuthSession {
83
+ id String @id @default(cuid())
84
+ browserKeyHash String
85
+ pollSecretHash String
86
+ status AuthSessionStatus @default(pending)
87
+ tenantId String?
88
+ appId String?
89
+ bpUserSubject String?
90
+ bpUserEmail String?
91
+ clientIpHash String?
92
+ userAgentHash String?
93
+ expiresAt DateTime
94
+ approvedAt DateTime?
95
+ consumedAt DateTime?
96
+ createdAt DateTime @default(now())
97
+
98
+ @@index([status, expiresAt])
99
+ }
100
+
101
+ model ClientDeviceToken {
102
+ id String @id @default(cuid())
103
+ accountId String?
104
+ tenantId String
105
+ bpUserSubject String
106
+ tokenHash String @unique
107
+ name String?
108
+ ipRangeHash String
109
+ ipFamily String
110
+ userAgentHash String?
111
+ expiresAt DateTime
112
+ revokedAt DateTime?
113
+ lastUsedAt DateTime?
114
+ createdAt DateTime @default(now())
115
+
116
+ @@index([tenantId, bpUserSubject])
117
+ @@index([expiresAt])
118
+ }
119
+
120
+ enum TunnelStatus {
121
+ created
122
+ active
123
+ draining
124
+ disconnected
125
+ expired
126
+ closed
127
+ }
128
+
129
+ enum AccountPlan {
130
+ anonymous
131
+ free
132
+ paid
133
+ admin
134
+ }
135
+
136
+ enum AuthSessionStatus {
137
+ pending
138
+ approved
139
+ consumed
140
+ expired
141
+ denied
142
+ }
@@ -0,0 +1,5 @@
1
+
2
+ /* !!! This is code generated by Prisma. Do not edit directly. !!!
3
+ /* eslint-disable */
4
+ // biome-ignore-all lint: generated file
5
+ export default import('./query_compiler_fast_bg.wasm?module')
@@ -0,0 +1,5 @@
1
+
2
+ /* !!! This is code generated by Prisma. Do not edit directly. !!!
3
+ /* eslint-disable */
4
+ // biome-ignore-all lint: generated file
5
+ export default import('./query_compiler_fast_bg.wasm')
@@ -0,0 +1,3 @@
1
+ import type { BetterPortalRegistry } from "@betterportal/framework";
2
+ export declare const registry: BetterPortalRegistry;
3
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../../src/plugins/service-tunnels-admin/.bp-generated/registry.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAEpE,eAAO,MAAM,QAAQ,EAAE,oBAqItB,CAAC"}
@@ -0,0 +1,152 @@
1
+ // AUTO-GENERATED by BetterPortal codegen - DO NOT EDIT
2
+ import * as betterTunnelsCliAuthVerifyRoute from "../bp-routes/cli-auth/verify/index.js";
3
+ import * as betterTunnelsCliAuthVerifyGETRoute from "../bp-routes/cli-auth/verify/GET.js";
4
+ import * as betterTunnelsCliAuthVerifyBootstrap1PageGET from "../bp-routes/cli-auth/verify/_theme.bootstrap1/GET.js";
5
+ import * as betterTunnelsDashboardRoute from "../bp-routes/dashboard/index.js";
6
+ import * as betterTunnelsDashboardGETRoute from "../bp-routes/dashboard/GET.js";
7
+ import * as betterTunnelsDashboardBootstrap1PageGET from "../bp-routes/dashboard/_theme.bootstrap1/GET.js";
8
+ import * as betterTunnelsDashboardBootstrap1Stream from "../bp-routes/dashboard/_theme.bootstrap1/index.stream.js";
9
+ import * as betterTunnelsDownloadsRoute from "../bp-routes/downloads/index.js";
10
+ import * as betterTunnelsDownloadsGETRoute from "../bp-routes/downloads/GET.js";
11
+ import * as betterTunnelsDownloadsBootstrap1PageGET from "../bp-routes/downloads/_theme.bootstrap1/GET.js";
12
+ import * as betterTunnelsLandingRoute from "../bp-routes/landing/index.js";
13
+ import * as betterTunnelsLandingGETRoute from "../bp-routes/landing/GET.js";
14
+ import * as betterTunnelsLandingBootstrap1PageGET from "../bp-routes/landing/_theme.bootstrap1/GET.js";
15
+ import * as betterTunnelsTunnelsRoute from "../bp-routes/tunnels/index.js";
16
+ import * as betterTunnelsTunnelsGETRoute from "../bp-routes/tunnels/GET.js";
17
+ import * as betterTunnelsTunnelsBootstrap1PageGET from "../bp-routes/tunnels/_theme.bootstrap1/GET.js";
18
+ export const registry = {
19
+ routes: [
20
+ {
21
+ viewId: "better-tunnels.cli-auth.verify",
22
+ path: "/cli-auth/verify",
23
+ methods: ["GET"],
24
+ paramNames: [],
25
+ schemas: {
26
+ response: betterTunnelsCliAuthVerifyGETRoute.ResponseSchema,
27
+ query: betterTunnelsCliAuthVerifyGETRoute.QuerySchema
28
+ },
29
+ methodRoutes: { GET: { method: "GET", schemas: {
30
+ response: betterTunnelsCliAuthVerifyGETRoute.ResponseSchema,
31
+ query: betterTunnelsCliAuthVerifyGETRoute.QuerySchema
32
+ }, handler: betterTunnelsCliAuthVerifyGETRoute.default } },
33
+ handlers: { GET: betterTunnelsCliAuthVerifyGETRoute.default },
34
+ title: betterTunnelsCliAuthVerifyRoute.title,
35
+ description: betterTunnelsCliAuthVerifyRoute.description,
36
+ auth: betterTunnelsCliAuthVerifyRoute.auth,
37
+ cacheHints: betterTunnelsCliAuthVerifyRoute.cacheHints,
38
+ demoScenarios: [],
39
+ themeRenderers: {
40
+ "bootstrap1": {
41
+ pages: [{ rendererId: "default", type: "page", method: "GET", render: betterTunnelsCliAuthVerifyBootstrap1PageGET.render }],
42
+ components: [],
43
+ fragments: []
44
+ }
45
+ }
46
+ },
47
+ {
48
+ viewId: "better-tunnels.dashboard",
49
+ path: "/dashboard",
50
+ methods: ["GET"],
51
+ paramNames: [],
52
+ schemas: {
53
+ response: betterTunnelsDashboardGETRoute.default.responseSchema,
54
+ item: betterTunnelsDashboardGETRoute.ItemSchema
55
+ },
56
+ methodRoutes: { GET: { method: "GET", schemas: {
57
+ response: betterTunnelsDashboardGETRoute.default.responseSchema,
58
+ item: betterTunnelsDashboardGETRoute.ItemSchema
59
+ }, handler: betterTunnelsDashboardGETRoute.default } },
60
+ handlers: { GET: betterTunnelsDashboardGETRoute.default },
61
+ title: betterTunnelsDashboardRoute.title,
62
+ description: betterTunnelsDashboardRoute.description,
63
+ auth: betterTunnelsDashboardRoute.auth,
64
+ cacheHints: betterTunnelsDashboardRoute.cacheHints,
65
+ demoScenarios: [],
66
+ themeRenderers: {
67
+ "bootstrap1": {
68
+ pages: [{ rendererId: "default", type: "page", method: "GET", render: betterTunnelsDashboardBootstrap1PageGET.render }],
69
+ components: [],
70
+ fragments: [],
71
+ stream: { renderShell: betterTunnelsDashboardBootstrap1Stream.renderShell, renderItem: betterTunnelsDashboardBootstrap1Stream.renderItem }
72
+ }
73
+ }
74
+ },
75
+ {
76
+ viewId: "better-tunnels.downloads",
77
+ path: "/downloads",
78
+ methods: ["GET"],
79
+ paramNames: [],
80
+ schemas: {
81
+ response: betterTunnelsDownloadsGETRoute.ResponseSchema
82
+ },
83
+ methodRoutes: { GET: { method: "GET", schemas: {
84
+ response: betterTunnelsDownloadsGETRoute.ResponseSchema
85
+ }, handler: betterTunnelsDownloadsGETRoute.default } },
86
+ handlers: { GET: betterTunnelsDownloadsGETRoute.default },
87
+ title: betterTunnelsDownloadsRoute.title,
88
+ description: betterTunnelsDownloadsRoute.description,
89
+ auth: betterTunnelsDownloadsRoute.auth,
90
+ cacheHints: betterTunnelsDownloadsRoute.cacheHints,
91
+ demoScenarios: [],
92
+ themeRenderers: {
93
+ "bootstrap1": {
94
+ pages: [{ rendererId: "default", type: "page", method: "GET", render: betterTunnelsDownloadsBootstrap1PageGET.render }],
95
+ components: [],
96
+ fragments: []
97
+ }
98
+ }
99
+ },
100
+ {
101
+ viewId: "better-tunnels.landing",
102
+ path: "/landing",
103
+ methods: ["GET"],
104
+ paramNames: [],
105
+ schemas: {
106
+ response: betterTunnelsLandingGETRoute.ResponseSchema
107
+ },
108
+ methodRoutes: { GET: { method: "GET", schemas: {
109
+ response: betterTunnelsLandingGETRoute.ResponseSchema
110
+ }, handler: betterTunnelsLandingGETRoute.default } },
111
+ handlers: { GET: betterTunnelsLandingGETRoute.default },
112
+ title: betterTunnelsLandingRoute.title,
113
+ description: betterTunnelsLandingRoute.description,
114
+ auth: betterTunnelsLandingRoute.auth,
115
+ cacheHints: betterTunnelsLandingRoute.cacheHints,
116
+ demoScenarios: [],
117
+ themeRenderers: {
118
+ "bootstrap1": {
119
+ pages: [{ rendererId: "default", type: "page", method: "GET", render: betterTunnelsLandingBootstrap1PageGET.render }],
120
+ components: [],
121
+ fragments: []
122
+ }
123
+ }
124
+ },
125
+ {
126
+ viewId: "better-tunnels.tunnels",
127
+ path: "/tunnels",
128
+ methods: ["GET"],
129
+ paramNames: [],
130
+ schemas: {
131
+ response: betterTunnelsTunnelsGETRoute.ResponseSchema
132
+ },
133
+ methodRoutes: { GET: { method: "GET", schemas: {
134
+ response: betterTunnelsTunnelsGETRoute.ResponseSchema
135
+ }, handler: betterTunnelsTunnelsGETRoute.default } },
136
+ handlers: { GET: betterTunnelsTunnelsGETRoute.default },
137
+ title: betterTunnelsTunnelsRoute.title,
138
+ description: betterTunnelsTunnelsRoute.description,
139
+ auth: betterTunnelsTunnelsRoute.auth,
140
+ cacheHints: betterTunnelsTunnelsRoute.cacheHints,
141
+ demoScenarios: [],
142
+ themeRenderers: {
143
+ "bootstrap1": {
144
+ pages: [{ rendererId: "default", type: "page", method: "GET", render: betterTunnelsTunnelsBootstrap1PageGET.render }],
145
+ components: [],
146
+ fragments: []
147
+ }
148
+ }
149
+ }
150
+ ]
151
+ };
152
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../../src/plugins/service-tunnels-admin/.bp-generated/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { Plugin } from "../index.js";
2
+ type ServiceConfig = Record<string, unknown>;
3
+ export declare const createHandler: <TResponse extends import("anyvali").BaseSchema<unknown, unknown>, TQuery extends import("anyvali").BaseSchema<unknown, unknown> | undefined = undefined, THeaders extends import("anyvali").BaseSchema<unknown, unknown> | undefined = undefined, TRequest extends import("anyvali").BaseSchema<unknown, unknown> | undefined = undefined, TParams = Record<string, string>>(schemas: import("@betterportal/framework").HandlerSchemas<TResponse, TQuery, THeaders, TRequest>, handler: (ctx: import("@betterportal/framework").RouteHandlerContext<TParams, Record<string, unknown> | (TQuery extends import("anyvali").BaseSchema<unknown, unknown> ? import("anyvali").Infer<TQuery> : Record<string, unknown>), Record<string, string> | (THeaders extends import("anyvali").BaseSchema<unknown, unknown> ? import("anyvali").Infer<THeaders> : Record<string, string>), Record<string, unknown> | (TRequest extends import("anyvali").BaseSchema<unknown, unknown> ? import("anyvali").Infer<TRequest> : Record<string, unknown>), Plugin, ServiceConfig>) => import("anyvali").Infer<TResponse> | Promise<import("anyvali").Infer<TResponse>>) => import("@betterportal/framework").RouteHandler<TParams, TQuery extends import("anyvali").BaseSchema<unknown, unknown> ? import("anyvali").Infer<TQuery> : Record<string, unknown>, THeaders extends import("anyvali").BaseSchema<unknown, unknown> ? import("anyvali").Infer<THeaders> : Record<string, string>, TRequest extends import("anyvali").BaseSchema<unknown, unknown> ? import("anyvali").Infer<TRequest> : Record<string, unknown>, import("anyvali").Infer<TResponse>, Plugin, ServiceConfig>;
4
+ export declare const createRawHandler: <TQuery extends import("anyvali").BaseSchema<unknown, unknown> | undefined = undefined, THeaders extends import("anyvali").BaseSchema<unknown, unknown> | undefined = undefined, TRequest extends import("anyvali").BaseSchema<unknown, unknown> | undefined = undefined, TMultipart extends import("anyvali").BaseSchema<unknown, unknown> | undefined = undefined, TParams = Record<string, string>>(schemas: import("@betterportal/framework").RawHandlerSchemas<TQuery, THeaders, TRequest, TMultipart>, handler: (ctx: import("@betterportal/framework").RouteHandlerContext<TParams, TQuery extends import("anyvali").BaseSchema<unknown, unknown> ? import("anyvali").Infer<TQuery> : Record<string, unknown>, THeaders extends import("anyvali").BaseSchema<unknown, unknown> ? import("anyvali").Infer<THeaders> : Record<string, string>, TRequest extends import("anyvali").BaseSchema<unknown, unknown> ? import("anyvali").Infer<TRequest> : Record<string, unknown>, Plugin, ServiceConfig> & {
5
+ readonly multipart: TMultipart extends import("anyvali").BaseSchema<unknown, unknown> ? import("anyvali").Infer<TMultipart> : never;
6
+ }) => Response | Promise<Response>) => import("@betterportal/framework").RawRouteHandler<TParams, TQuery extends import("anyvali").BaseSchema<unknown, unknown> ? import("anyvali").Infer<TQuery> : Record<string, unknown>, THeaders extends import("anyvali").BaseSchema<unknown, unknown> ? import("anyvali").Infer<THeaders> : Record<string, string>, TRequest extends import("anyvali").BaseSchema<unknown, unknown> ? import("anyvali").Infer<TRequest> : Record<string, unknown>, Plugin, ServiceConfig>;
7
+ export declare const createStreamHandler: <TItem extends import("anyvali").BaseSchema<unknown, unknown>, TSummary extends import("anyvali").BaseSchema<unknown, unknown> | undefined = undefined, TQuery extends import("anyvali").BaseSchema<unknown, unknown> | undefined = undefined, THeaders extends import("anyvali").BaseSchema<unknown, unknown> | undefined = undefined, TParams = Record<string, string>>(schemas: import("@betterportal/framework").StreamHandlerSchemas<TItem, TSummary, TQuery, THeaders>, handler: (ctx: import("@betterportal/framework").RouteHandlerContext<TParams, TQuery extends import("anyvali").BaseSchema<unknown, unknown> ? import("anyvali").Infer<TQuery> : Record<string, unknown>, THeaders extends import("anyvali").BaseSchema<unknown, unknown> ? import("anyvali").Infer<THeaders> : Record<string, string>, Record<string, unknown>, Plugin, ServiceConfig>) => AsyncGenerator<import("anyvali").Infer<TItem>, TSummary extends import("anyvali").BaseSchema<unknown, unknown> ? import("anyvali").Infer<TSummary> : void, void>) => import("@betterportal/framework").BpStreamHandler<import("anyvali").Infer<TItem>, TSummary extends import("anyvali").BaseSchema<unknown, unknown> ? import("anyvali").Infer<TSummary> : void, TParams, TQuery extends import("anyvali").BaseSchema<unknown, unknown> ? import("anyvali").Infer<TQuery> : Record<string, unknown>, THeaders extends import("anyvali").BaseSchema<unknown, unknown> ? import("anyvali").Infer<THeaders> : Record<string, string>>;
8
+ export {};
9
+ //# sourceMappingURL=route-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-runtime.d.ts","sourceRoot":"","sources":["../../../../src/plugins/service-tunnels-admin/.bp-generated/route-runtime.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,KAAK,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE7C,eAAO,MAAM,aAAa,qkDAAwD,CAAC;AACnF,eAAO,MAAM,gBAAgB;;gfAA2D,CAAC;AACzF,eAAO,MAAM,mBAAmB,+6CAA8D,CAAC"}
@@ -0,0 +1,6 @@
1
+ // AUTO-GENERATED by BetterPortal codegen - DO NOT EDIT
2
+ import { createHandler as baseCreateHandler, createRawHandler as baseCreateRawHandler, createStreamHandler as baseCreateStreamHandler } from "@betterportal/framework";
3
+ export const createHandler = baseCreateHandler.forContext();
4
+ export const createRawHandler = baseCreateRawHandler.forContext();
5
+ export const createStreamHandler = baseCreateStreamHandler.forContext();
6
+ //# sourceMappingURL=route-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-runtime.js","sourceRoot":"","sources":["../../../../src/plugins/service-tunnels-admin/.bp-generated/route-runtime.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,OAAO,EACL,aAAa,IAAI,iBAAiB,EAClC,gBAAgB,IAAI,oBAAoB,EACxC,mBAAmB,IAAI,uBAAuB,EAC/C,MAAM,yBAAyB,CAAC;AAIjC,MAAM,CAAC,MAAM,aAAa,GAAG,iBAAiB,CAAC,UAAU,EAAyB,CAAC;AACnF,MAAM,CAAC,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,UAAU,EAAyB,CAAC;AACzF,MAAM,CAAC,MAAM,mBAAmB,GAAG,uBAAuB,CAAC,UAAU,EAAyB,CAAC"}
@@ -0,0 +1,18 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1600" height="420" viewBox="0 0 1600 420" role="img" aria-label="BetterTunnels logo">
2
+
3
+ <g transform="translate(70 42) scale(0.66)">
4
+ <defs>
5
+ <linearGradient id="g" x1="120" y1="80" x2="390" y2="430" gradientUnits="userSpaceOnUse">
6
+ <stop offset="0" stop-color="#1495FF"/>
7
+ <stop offset="1" stop-color="#004DE6"/>
8
+ </linearGradient>
9
+ </defs>
10
+
11
+ <path d="M126 344V226c0-73 57-132 130-132s130 59 130 132v118" fill="none" stroke="url(#g)" stroke-width="72" stroke-linecap="butt" stroke-linejoin="round"/>
12
+ <path d="M194 346L112 448H188L256 356L324 448H400L318 346" fill="#0B6CFF"/>
13
+ <path d="M226 304V226c0-17 13-30 30-30s30 13 30 30v78" fill="#0B6CFF"/>
14
+ </g>
15
+ <text x="420" y="252" font-family="Inter, Arial, Helvetica, sans-serif" font-size="132" font-weight="800" letter-spacing="-5">
16
+ <tspan fill="#071A3A">Better</tspan><tspan fill="#0B6CFF">Tunnels</tspan>
17
+ </text>
18
+ </svg>
@@ -0,0 +1,12 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="512" height="512" viewBox="0 0 512 512" role="img" aria-label="BetterTunnels mark">
2
+ <defs>
3
+ <linearGradient id="g" x1="120" y1="80" x2="390" y2="430" gradientUnits="userSpaceOnUse">
4
+ <stop offset="0" stop-color="#1495FF"/>
5
+ <stop offset="1" stop-color="#004DE6"/>
6
+ </linearGradient>
7
+ </defs>
8
+ <rect width="512" height="512" rx="96" fill="#0B6CFF"/>
9
+ <path d="M126 344V226c0-73 57-132 130-132s130 59 130 132v118" fill="none" stroke="url(#g)" stroke-width="72" stroke-linecap="butt" stroke-linejoin="round"/>
10
+ <path d="M194 346L112 448H188L256 356L324 448H400L318 346" fill="#FFFFFF"/>
11
+ <path d="M226 304V226c0-17 13-30 30-30s30 13 30 30v78" fill="#FFFFFF"/>
12
+ </svg>
@@ -0,0 +1,20 @@
1
+ import * as av from "anyvali";
2
+ import type { Infer } from "anyvali";
3
+ export declare const QuerySchema: av.ObjectSchema<{
4
+ session: av.OptionalSchema<av.StringSchema>;
5
+ key: av.OptionalSchema<av.StringSchema>;
6
+ }>;
7
+ export declare const ResponseSchema: av.ObjectSchema<{
8
+ status: av.StringSchema;
9
+ message: av.StringSchema;
10
+ }>;
11
+ export type ResponseData = Infer<typeof ResponseSchema>;
12
+ declare const _default: import("@betterportal/framework").RouteHandler<Record<string, string>, {
13
+ session?: string | undefined;
14
+ key?: string | undefined;
15
+ }, Record<string, string>, Record<string, unknown>, {
16
+ status: string;
17
+ message: string;
18
+ }, unknown, Record<string, unknown>>;
19
+ export default _default;
20
+ //# sourceMappingURL=GET.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GET.d.ts","sourceRoot":"","sources":["../../../../../../src/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/GET.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAKrC,eAAO,MAAM,WAAW;;;EAGI,CAAC;AAE7B,eAAO,MAAM,cAAc;;;EAGC,CAAC;AAC7B,MAAM,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;;;;;;;;AAExD,wBA+CE"}
@@ -0,0 +1,51 @@
1
+ import * as av from "anyvali";
2
+ import { createHandler } from "@betterportal/framework";
3
+ import { hashSecret, verifySecret } from "../../../../../auth.js";
4
+ import { prisma } from "../../../../../prisma.js";
5
+ export const QuerySchema = av.object({
6
+ session: av.optional(av.string().minLength(1)),
7
+ key: av.optional(av.string().minLength(1))
8
+ }, { unknownKeys: "strip" });
9
+ export const ResponseSchema = av.object({
10
+ status: av.string(),
11
+ message: av.string()
12
+ }, { unknownKeys: "strip" });
13
+ export default createHandler({ query: QuerySchema, response: ResponseSchema }, async (ctx) => {
14
+ const query = ctx.query;
15
+ if (!query.session || !query.key) {
16
+ return { status: "invalid", message: "This CLI authentication link is missing required session details." };
17
+ }
18
+ const session = await prisma.clientAuthSession.findUnique({
19
+ where: { id: query.session }
20
+ });
21
+ if (!session || session.status !== "pending" || session.expiresAt <= new Date()) {
22
+ return { status: "invalid", message: "This CLI authentication request is no longer valid." };
23
+ }
24
+ if (!verifySecret(query.key, session.browserKeyHash)) {
25
+ return { status: "invalid", message: "This CLI authentication request is no longer valid." };
26
+ }
27
+ const configuredAppId = typeof ctx.config?.mainAuthAppId === "string" ? ctx.config.mainAuthAppId : undefined;
28
+ if (configuredAppId && ctx.app.id !== configuredAppId) {
29
+ return { status: "invalid", message: "This BetterPortal app is not configured for BetterTunnels CLI authentication." };
30
+ }
31
+ const user = ctx.user;
32
+ const subject = String(user?.sub ?? user?.subject ?? user?.id ?? "unknown");
33
+ const email = typeof user?.email === "string" ? user.email : undefined;
34
+ await prisma.clientAuthSession.update({
35
+ where: { id: session.id },
36
+ data: {
37
+ status: "approved",
38
+ tenantId: ctx.tenant.id,
39
+ appId: ctx.app.id,
40
+ bpUserSubject: subject,
41
+ bpUserEmail: email,
42
+ approvedAt: new Date(),
43
+ userAgentHash: typeof ctx.headers["user-agent"] === "string" ? hashSecret(ctx.headers["user-agent"]) : session.userAgentHash
44
+ }
45
+ });
46
+ return {
47
+ status: "approved",
48
+ message: "BetterTunnels CLI authenticated. You can close this tab."
49
+ };
50
+ });
51
+ //# sourceMappingURL=GET.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GET.js","sourceRoot":"","sources":["../../../../../../src/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/GET.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAElD,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC,MAAM,CAAC;IACnC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC9C,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;CAC3C,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;AAE7B,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC,MAAM,CAAC;IACtC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE;IACnB,OAAO,EAAE,EAAE,CAAC,MAAM,EAAE;CACrB,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;AAG7B,eAAe,aAAa,CAC1B,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE,EAChD,KAAK,EAAE,GAAG,EAAE,EAAE;IACZ,MAAM,KAAK,GAAG,GAAG,CAAC,KAA2C,CAAC;IAC9D,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QACjC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,mEAAmE,EAAE,CAAC;IAC7G,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,UAAU,CAAC;QACxD,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,OAAO,EAAE;KAC7B,CAAC,CAAC;IAEH,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC;QAChF,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,qDAAqD,EAAE,CAAC;IAC/F,CAAC;IAED,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;QACrD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,qDAAqD,EAAE,CAAC;IAC/F,CAAC;IAED,MAAM,eAAe,GAAG,OAAO,GAAG,CAAC,MAAM,EAAE,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7G,IAAI,eAAe,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,eAAe,EAAE,CAAC;QACtD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,+EAA+E,EAAE,CAAC;IACzH,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,CAAC,IAA2C,CAAC;IAC7D,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,OAAO,IAAI,IAAI,EAAE,EAAE,IAAI,SAAS,CAAC,CAAC;IAC5E,MAAM,KAAK,GAAG,OAAO,IAAI,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAEvE,MAAM,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC;QACpC,KAAK,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE;QACzB,IAAI,EAAE;YACJ,MAAM,EAAE,UAAU;YAClB,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE;YACvB,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE;YACjB,aAAa,EAAE,OAAO;YACtB,WAAW,EAAE,KAAK;YAClB,UAAU,EAAE,IAAI,IAAI,EAAE;YACtB,aAAa,EAAE,OAAO,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa;SAC7H;KACF,CAAC,CAAC;IAEH,OAAO;QACL,MAAM,EAAE,UAAU;QAClB,OAAO,EAAE,0DAA0D;KACpE,CAAC;AACJ,CAAC,CACF,CAAC"}
@@ -0,0 +1,5 @@
1
+ /** @jsxImportSource jsx-htmx */
2
+ import type { HtmlRenderable } from "@betterportal/framework";
3
+ import type { ResponseData } from "../GET.js";
4
+ export declare function render(data: ResponseData): HtmlRenderable;
5
+ //# sourceMappingURL=GET.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GET.d.ts","sourceRoot":"","sources":["../../../../../../../src/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/_theme.bootstrap1/GET.tsx"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9C,wBAAgB,MAAM,CAAC,IAAI,EAAE,YAAY,GAAG,cAAc,CAazD"}
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "jsx-htmx/jsx-runtime";
2
+ export function render(data) {
3
+ const ok = data.status === "approved";
4
+ return (_jsx("section", { class: "container py-5", children: _jsxs("div", { class: `border rounded-3 p-4 ${ok ? "bg-body" : "bg-danger-subtle border-danger"}`, children: [_jsx("div", { class: `text-uppercase fw-semibold small mb-2 ${ok ? "text-success" : "text-danger"}`, children: "BetterTunnels CLI" }), _jsx("h1", { class: "h3 mb-3", children: ok ? "Authenticated" : "Authentication failed" }), _jsx("p", { class: "lead mb-0", children: data.message })] }) }));
5
+ }
6
+ //# sourceMappingURL=GET.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GET.js","sourceRoot":"","sources":["../../../../../../../src/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/_theme.bootstrap1/GET.tsx"],"names":[],"mappings":";AAIA,MAAM,UAAU,MAAM,CAAC,IAAkB;IACvC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC;IACtC,OAAO,CACL,kBAAS,KAAK,EAAC,gBAAgB,YAC7B,eAAK,KAAK,EAAE,wBAAwB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gCAAgC,EAAE,aACrF,cAAK,KAAK,EAAE,yCAAyC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,EAAE,kCAEpF,EACN,aAAI,KAAK,EAAC,SAAS,YAAE,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,uBAAuB,GAAM,EACzE,YAAG,KAAK,EAAC,WAAW,YAAE,IAAI,CAAC,OAAO,GAAK,IACnC,GACE,CACX,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { type ApiAuthRequirement, type CacheHints } from "@betterportal/framework";
2
+ export declare const viewId = "better-tunnels.cli-auth.verify";
3
+ export declare const title = "BetterTunnels CLI Authentication";
4
+ export declare const description = "Approves a pending BetterTunnels CLI login session.";
5
+ export declare const auth: ApiAuthRequirement;
6
+ export declare const cacheHints: CacheHints;
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,UAAU,EAChB,MAAM,yBAAyB,CAAC;AAEjC,eAAO,MAAM,MAAM,mCAAmC,CAAC;AACvD,eAAO,MAAM,KAAK,qCAAqC,CAAC;AACxD,eAAO,MAAM,WAAW,wDAAwD,CAAC;AAEjF,eAAO,MAAM,IAAI,EAAE,kBAGlB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,UAGxB,CAAC"}
@@ -0,0 +1,12 @@
1
+ export const viewId = "better-tunnels.cli-auth.verify";
2
+ export const title = "BetterTunnels CLI Authentication";
3
+ export const description = "Approves a pending BetterTunnels CLI login session.";
4
+ export const auth = {
5
+ required: true,
6
+ permissions: []
7
+ };
8
+ export const cacheHints = {
9
+ ttlSeconds: 0,
10
+ varyBy: ["accept", "authorization", "x-bp-tenant-id", "x-bp-app-id"]
11
+ };
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/plugins/service-tunnels-admin/bp-routes/cli-auth/verify/index.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,MAAM,GAAG,gCAAgC,CAAC;AACvD,MAAM,CAAC,MAAM,KAAK,GAAG,kCAAkC,CAAC;AACxD,MAAM,CAAC,MAAM,WAAW,GAAG,qDAAqD,CAAC;AAEjF,MAAM,CAAC,MAAM,IAAI,GAAuB;IACtC,QAAQ,EAAE,IAAI;IACd,WAAW,EAAE,EAAE;CAChB,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"}
@@ -0,0 +1,40 @@
1
+ import * as av from "anyvali";
2
+ import type { Infer } from "anyvali";
3
+ export declare const ItemSchema: av.ObjectSchema<{
4
+ activeTunnels: av.NumberSchema;
5
+ requests: av.NumberSchema;
6
+ bytesIn: av.NumberSchema;
7
+ bytesOut: av.NumberSchema;
8
+ tunnels: av.ArraySchema<av.ObjectSchema<{
9
+ id: av.StringSchema;
10
+ subdomain: av.StringSchema;
11
+ target: av.StringSchema;
12
+ authenticated: av.BoolSchema;
13
+ expiresAt: av.StringSchema;
14
+ requests: av.NumberSchema;
15
+ bytesIn: av.NumberSchema;
16
+ bytesOut: av.NumberSchema;
17
+ }>>;
18
+ }>;
19
+ export type DashboardData = Infer<typeof ItemSchema>;
20
+ export type ResponseData = {
21
+ items: DashboardData[];
22
+ };
23
+ declare const _default: import("@betterportal/framework").BpStreamHandler<{
24
+ activeTunnels: number;
25
+ requests: number;
26
+ bytesIn: number;
27
+ bytesOut: number;
28
+ tunnels: {
29
+ id: string;
30
+ subdomain: string;
31
+ target: string;
32
+ authenticated: boolean;
33
+ expiresAt: string;
34
+ requests: number;
35
+ bytesIn: number;
36
+ bytesOut: number;
37
+ }[];
38
+ }, void, Record<string, string>, Record<string, unknown>, Record<string, string>>;
39
+ export default _default;
40
+ //# sourceMappingURL=GET.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GET.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/service-tunnels-admin/bp-routes/dashboard/GET.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAgBrC,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;EAMK,CAAC;AAC7B,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AACrD,MAAM,MAAM,YAAY,GAAG;IAAE,KAAK,EAAE,aAAa,EAAE,CAAA;CAAE,CAAC;;;;;;;;;;;;;;;;;AA+BtD,wBASE"}