@betterportal/tunnels 1.0.0

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 (116) hide show
  1. package/README.md +76 -0
  2. package/SPEC.md +524 -0
  3. package/lib/.bsb/clients/service-tunnel-client-api.d.ts +133 -0
  4. package/lib/.bsb/clients/service-tunnel-client-api.d.ts.map +1 -0
  5. package/lib/.bsb/clients/service-tunnel-client-api.js +102 -0
  6. package/lib/.bsb/clients/service-tunnel-client-api.js.map +1 -0
  7. package/lib/.bsb/clients/service-tunnel-web.d.ts +43 -0
  8. package/lib/.bsb/clients/service-tunnel-web.d.ts.map +1 -0
  9. package/lib/.bsb/clients/service-tunnel-web.js +47 -0
  10. package/lib/.bsb/clients/service-tunnel-web.js.map +1 -0
  11. package/lib/auth.d.ts +12 -0
  12. package/lib/auth.d.ts.map +1 -0
  13. package/lib/auth.js +59 -0
  14. package/lib/auth.js.map +1 -0
  15. package/lib/cli.d.ts +2 -0
  16. package/lib/cli.d.ts.map +1 -0
  17. package/lib/cli.js +295 -0
  18. package/lib/cli.js.map +1 -0
  19. package/lib/plugins/service-betterportal/.bp-generated/registry.d.ts +3 -0
  20. package/lib/plugins/service-betterportal/.bp-generated/registry.d.ts.map +1 -0
  21. package/lib/plugins/service-betterportal/.bp-generated/registry.js +127 -0
  22. package/lib/plugins/service-betterportal/.bp-generated/registry.js.map +1 -0
  23. package/lib/plugins/service-betterportal/assets/brand/bettertunnels-horizontal-light.svg +18 -0
  24. package/lib/plugins/service-betterportal/assets/brand/bettertunnels-square-dark-1024x1024.png +0 -0
  25. package/lib/plugins/service-betterportal/assets/brand/favicon.svg +12 -0
  26. package/lib/plugins/service-betterportal/betterportal-logo.png +0 -0
  27. package/lib/plugins/service-betterportal/bp-routes/cli-auth/verify/_theme.bootstrap1/index.d.ts +5 -0
  28. package/lib/plugins/service-betterportal/bp-routes/cli-auth/verify/_theme.bootstrap1/index.d.ts.map +1 -0
  29. package/lib/plugins/service-betterportal/bp-routes/cli-auth/verify/_theme.bootstrap1/index.js +6 -0
  30. package/lib/plugins/service-betterportal/bp-routes/cli-auth/verify/_theme.bootstrap1/index.js.map +1 -0
  31. package/lib/plugins/service-betterportal/bp-routes/cli-auth/verify/index.d.ts +25 -0
  32. package/lib/plugins/service-betterportal/bp-routes/cli-auth/verify/index.d.ts.map +1 -0
  33. package/lib/plugins/service-betterportal/bp-routes/cli-auth/verify/index.js +59 -0
  34. package/lib/plugins/service-betterportal/bp-routes/cli-auth/verify/index.js.map +1 -0
  35. package/lib/plugins/service-betterportal/bp-routes/dashboard/_theme.bootstrap1/index.d.ts +5 -0
  36. package/lib/plugins/service-betterportal/bp-routes/dashboard/_theme.bootstrap1/index.d.ts.map +1 -0
  37. package/lib/plugins/service-betterportal/bp-routes/dashboard/_theme.bootstrap1/index.js +22 -0
  38. package/lib/plugins/service-betterportal/bp-routes/dashboard/_theme.bootstrap1/index.js.map +1 -0
  39. package/lib/plugins/service-betterportal/bp-routes/dashboard/index.d.ts +40 -0
  40. package/lib/plugins/service-betterportal/bp-routes/dashboard/index.d.ts.map +1 -0
  41. package/lib/plugins/service-betterportal/bp-routes/dashboard/index.js +57 -0
  42. package/lib/plugins/service-betterportal/bp-routes/dashboard/index.js.map +1 -0
  43. package/lib/plugins/service-betterportal/bp-routes/downloads/_theme.bootstrap1/index.d.ts +5 -0
  44. package/lib/plugins/service-betterportal/bp-routes/downloads/_theme.bootstrap1/index.d.ts.map +1 -0
  45. package/lib/plugins/service-betterportal/bp-routes/downloads/_theme.bootstrap1/index.js +5 -0
  46. package/lib/plugins/service-betterportal/bp-routes/downloads/_theme.bootstrap1/index.js.map +1 -0
  47. package/lib/plugins/service-betterportal/bp-routes/downloads/index.d.ts +30 -0
  48. package/lib/plugins/service-betterportal/bp-routes/downloads/index.d.ts.map +1 -0
  49. package/lib/plugins/service-betterportal/bp-routes/downloads/index.js +45 -0
  50. package/lib/plugins/service-betterportal/bp-routes/downloads/index.js.map +1 -0
  51. package/lib/plugins/service-betterportal/bp-routes/landing/_theme.bootstrap1/index.d.ts +5 -0
  52. package/lib/plugins/service-betterportal/bp-routes/landing/_theme.bootstrap1/index.d.ts.map +1 -0
  53. package/lib/plugins/service-betterportal/bp-routes/landing/_theme.bootstrap1/index.js +5 -0
  54. package/lib/plugins/service-betterportal/bp-routes/landing/_theme.bootstrap1/index.js.map +1 -0
  55. package/lib/plugins/service-betterportal/bp-routes/landing/index.d.ts +40 -0
  56. package/lib/plugins/service-betterportal/bp-routes/landing/index.d.ts.map +1 -0
  57. package/lib/plugins/service-betterportal/bp-routes/landing/index.js +63 -0
  58. package/lib/plugins/service-betterportal/bp-routes/landing/index.js.map +1 -0
  59. package/lib/plugins/service-betterportal/bp-routes/tunnels/_theme.bootstrap1/index.d.ts +5 -0
  60. package/lib/plugins/service-betterportal/bp-routes/tunnels/_theme.bootstrap1/index.d.ts.map +1 -0
  61. package/lib/plugins/service-betterportal/bp-routes/tunnels/_theme.bootstrap1/index.js +5 -0
  62. package/lib/plugins/service-betterportal/bp-routes/tunnels/_theme.bootstrap1/index.js.map +1 -0
  63. package/lib/plugins/service-betterportal/bp-routes/tunnels/index.d.ts +44 -0
  64. package/lib/plugins/service-betterportal/bp-routes/tunnels/index.d.ts.map +1 -0
  65. package/lib/plugins/service-betterportal/bp-routes/tunnels/index.js +59 -0
  66. package/lib/plugins/service-betterportal/bp-routes/tunnels/index.js.map +1 -0
  67. package/lib/plugins/service-betterportal/brand-assets.d.ts +7 -0
  68. package/lib/plugins/service-betterportal/brand-assets.d.ts.map +1 -0
  69. package/lib/plugins/service-betterportal/brand-assets.js +24 -0
  70. package/lib/plugins/service-betterportal/brand-assets.js.map +1 -0
  71. package/lib/plugins/service-betterportal/index.d.ts +57 -0
  72. package/lib/plugins/service-betterportal/index.d.ts.map +1 -0
  73. package/lib/plugins/service-betterportal/index.js +108 -0
  74. package/lib/plugins/service-betterportal/index.js.map +1 -0
  75. package/lib/plugins/service-tunnel-client-api/ids.d.ts +6 -0
  76. package/lib/plugins/service-tunnel-client-api/ids.d.ts.map +1 -0
  77. package/lib/plugins/service-tunnel-client-api/ids.js +17 -0
  78. package/lib/plugins/service-tunnel-client-api/ids.js.map +1 -0
  79. package/lib/plugins/service-tunnel-client-api/index.d.ts +158 -0
  80. package/lib/plugins/service-tunnel-client-api/index.d.ts.map +1 -0
  81. package/lib/plugins/service-tunnel-client-api/index.js +591 -0
  82. package/lib/plugins/service-tunnel-client-api/index.js.map +1 -0
  83. package/lib/plugins/service-tunnel-client-api/registry.d.ts +36 -0
  84. package/lib/plugins/service-tunnel-client-api/registry.d.ts.map +1 -0
  85. package/lib/plugins/service-tunnel-client-api/registry.js +14 -0
  86. package/lib/plugins/service-tunnel-client-api/registry.js.map +1 -0
  87. package/lib/plugins/service-tunnel-client-api/schemas.d.ts +66 -0
  88. package/lib/plugins/service-tunnel-client-api/schemas.d.ts.map +1 -0
  89. package/lib/plugins/service-tunnel-client-api/schemas.js +56 -0
  90. package/lib/plugins/service-tunnel-client-api/schemas.js.map +1 -0
  91. package/lib/plugins/service-tunnel-web/http.d.ts +4 -0
  92. package/lib/plugins/service-tunnel-web/http.d.ts.map +1 -0
  93. package/lib/plugins/service-tunnel-web/http.js +119 -0
  94. package/lib/plugins/service-tunnel-web/http.js.map +1 -0
  95. package/lib/plugins/service-tunnel-web/index.d.ts +79 -0
  96. package/lib/plugins/service-tunnel-web/index.d.ts.map +1 -0
  97. package/lib/plugins/service-tunnel-web/index.js +278 -0
  98. package/lib/plugins/service-tunnel-web/index.js.map +1 -0
  99. package/lib/plugins/service-tunnel-web/verification.d.ts +27 -0
  100. package/lib/plugins/service-tunnel-web/verification.d.ts.map +1 -0
  101. package/lib/plugins/service-tunnel-web/verification.js +209 -0
  102. package/lib/plugins/service-tunnel-web/verification.js.map +1 -0
  103. package/lib/prisma.d.ts +6 -0
  104. package/lib/prisma.d.ts.map +1 -0
  105. package/lib/prisma.js +10 -0
  106. package/lib/prisma.js.map +1 -0
  107. package/lib/schemas/service-betterportal.json +109 -0
  108. package/lib/schemas/service-tunnel-client-api.json +300 -0
  109. package/lib/schemas/service-tunnel-web.json +140 -0
  110. package/package.json +60 -0
  111. package/prisma/migrations/0001_init/migration.sql +63 -0
  112. package/prisma/migrations/0002_account_plan/migration.sql +6 -0
  113. package/prisma/migrations/0003_tunnel_owner_server/migration.sql +1 -0
  114. package/prisma/migrations/20260701000000_add_client_auth/migration.sql +46 -0
  115. package/prisma/migrations/migration_lock.toml +3 -0
  116. package/prisma/schema.prisma +141 -0
@@ -0,0 +1,36 @@
1
+ import type { Observable } from "@bsb/base";
2
+ import type { WebSocket } from "ws";
3
+ export interface ActiveTunnel {
4
+ id: string;
5
+ subdomain: string;
6
+ targetHost: string;
7
+ targetPort: number;
8
+ authenticated: boolean;
9
+ expiresAt: Date;
10
+ ws: WebSocket;
11
+ pending: Map<string, PendingRequest>;
12
+ sessionObs: Observable;
13
+ }
14
+ export interface PendingRequest {
15
+ resolve: (response: Response) => void;
16
+ reject: (error: Error) => void;
17
+ chunks: string[];
18
+ status?: number;
19
+ headers?: Record<string, string>;
20
+ webStartedAt: number;
21
+ clientApiSentAt: number;
22
+ clientApiRoundtripMs?: number;
23
+ cliOverheadMs?: number;
24
+ originMs?: number;
25
+ totalTimer: NodeJS.Timeout;
26
+ firstByteTimer: NodeJS.Timeout;
27
+ idleTimer?: NodeJS.Timeout;
28
+ idleTimeoutMs: number;
29
+ }
30
+ export declare class TunnelRegistry {
31
+ private readonly tunnels;
32
+ set(tunnel: ActiveTunnel): void;
33
+ get(hostname: string): ActiveTunnel | undefined;
34
+ delete(subdomain: string): void;
35
+ }
36
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/plugins/service-tunnel-client-api/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAEpC,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,IAAI,CAAC;IAChB,EAAE,EAAE,SAAS,CAAC;IACd,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACrC,UAAU,EAAE,UAAU,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAC;IACtC,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAC/B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmC;IAE3D,GAAG,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAI/B,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAK/C,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;CAGhC"}
@@ -0,0 +1,14 @@
1
+ export class TunnelRegistry {
2
+ tunnels = new Map();
3
+ set(tunnel) {
4
+ this.tunnels.set(tunnel.subdomain, tunnel);
5
+ }
6
+ get(hostname) {
7
+ const subdomain = hostname.split(".")[0] ?? "";
8
+ return this.tunnels.get(subdomain);
9
+ }
10
+ delete(subdomain) {
11
+ this.tunnels.delete(subdomain);
12
+ }
13
+ }
14
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/plugins/service-tunnel-client-api/registry.ts"],"names":[],"mappings":"AAgCA,MAAM,OAAO,cAAc;IACR,OAAO,GAAG,IAAI,GAAG,EAAwB,CAAC;IAE3D,GAAG,CAAC,MAAoB;QACtB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;IAED,GAAG,CAAC,QAAgB;QAClB,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/C,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,CAAC,SAAiB;QACtB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;CACF"}
@@ -0,0 +1,66 @@
1
+ import * as av from "anyvali";
2
+ import type { Infer } from "anyvali";
3
+ export declare const TunnelCreateSchema: av.ObjectSchema<{
4
+ sessionId: av.StringSchema;
5
+ targetHost: av.StringSchema;
6
+ targetPort: av.NumberSchema;
7
+ authenticated: av.BoolSchema;
8
+ prefix: av.OptionalSchema<av.StringSchema>;
9
+ token: av.OptionalSchema<av.StringSchema>;
10
+ }>;
11
+ export type TunnelCreateInput = Infer<typeof TunnelCreateSchema>;
12
+ export declare const ClientFrameSchema: av.ObjectSchema<{
13
+ type: av.StringSchema;
14
+ code: av.OptionalSchema<av.NumberSchema>;
15
+ requestId: av.OptionalSchema<av.StringSchema>;
16
+ status: av.OptionalSchema<av.NumberSchema>;
17
+ headers: av.OptionalSchema<av.RecordSchema<av.StringSchema>>;
18
+ body: av.OptionalSchema<av.StringSchema>;
19
+ message: av.OptionalSchema<av.StringSchema>;
20
+ publicServerId: av.OptionalSchema<av.StringSchema>;
21
+ publicSocketId: av.OptionalSchema<av.StringSchema>;
22
+ frameType: av.OptionalSchema<av.StringSchema>;
23
+ path: av.OptionalSchema<av.StringSchema>;
24
+ webStartedAt: av.OptionalSchema<av.NumberSchema>;
25
+ clientApiRoundtripMs: av.OptionalSchema<av.NumberSchema>;
26
+ cliOverheadMs: av.OptionalSchema<av.NumberSchema>;
27
+ originMs: av.OptionalSchema<av.NumberSchema>;
28
+ totalMs: av.OptionalSchema<av.NumberSchema>;
29
+ internalServerMs: av.OptionalSchema<av.NumberSchema>;
30
+ }>;
31
+ export declare const TunnelConfigSchema: av.ObjectSchema<{
32
+ host: av.StringSchema;
33
+ port: av.NumberSchema;
34
+ prefix: av.OptionalSchema<av.StringSchema>;
35
+ host_header: av.OptionalSchema<av.StringSchema>;
36
+ }>;
37
+ export type TunnelConfig = Infer<typeof TunnelConfigSchema>;
38
+ export declare const FileConfigSchema: av.ObjectSchema<{
39
+ tunnels: av.ArraySchema<av.ObjectSchema<{
40
+ host: av.StringSchema;
41
+ port: av.NumberSchema;
42
+ prefix: av.OptionalSchema<av.StringSchema>;
43
+ host_header: av.OptionalSchema<av.StringSchema>;
44
+ }>>;
45
+ }>;
46
+ export type FileConfig = Infer<typeof FileConfigSchema>;
47
+ export declare const AuthStartRequestSchema: av.ObjectSchema<{
48
+ deviceName: av.OptionalSchema<av.StringSchema>;
49
+ authAppBaseUrl: av.OptionalSchema<av.StringSchema>;
50
+ }>;
51
+ export type AuthStartRequest = Infer<typeof AuthStartRequestSchema>;
52
+ export declare const AuthStartResponseSchema: av.ObjectSchema<{
53
+ sessionId: av.StringSchema;
54
+ pollSecret: av.StringSchema;
55
+ browserUrl: av.StringSchema;
56
+ expiresAt: av.StringSchema;
57
+ }>;
58
+ export declare const AuthStatusResponseSchema: av.ObjectSchema<{
59
+ status: av.StringSchema;
60
+ token: av.OptionalSchema<av.StringSchema>;
61
+ expiresAt: av.OptionalSchema<av.StringSchema>;
62
+ tenantId: av.OptionalSchema<av.StringSchema>;
63
+ bpUserSubject: av.OptionalSchema<av.StringSchema>;
64
+ message: av.OptionalSchema<av.StringSchema>;
65
+ }>;
66
+ //# sourceMappingURL=schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../../src/plugins/service-tunnel-client-api/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAErC,eAAO,MAAM,kBAAkB;;;;;;;EAOH,CAAC;AAC7B,MAAM,MAAM,iBAAiB,GAAG,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEjE,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;EAkBF,CAAC;AAE7B,eAAO,MAAM,kBAAkB;;;;;EAKH,CAAC;AAC7B,MAAM,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE5D,eAAO,MAAM,gBAAgB;;;;;;;EAED,CAAC;AAC7B,MAAM,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAExD,eAAO,MAAM,sBAAsB;;;EAGP,CAAC;AAC7B,MAAM,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEpE,eAAO,MAAM,uBAAuB;;;;;EAKR,CAAC;AAE7B,eAAO,MAAM,wBAAwB;;;;;;;EAOT,CAAC"}
@@ -0,0 +1,56 @@
1
+ import * as av from "anyvali";
2
+ export const TunnelCreateSchema = av.object({
3
+ sessionId: av.string().minLength(1),
4
+ targetHost: av.string().minLength(1).default("127.0.0.1"),
5
+ targetPort: av.number(),
6
+ authenticated: av.bool().default(false),
7
+ prefix: av.optional(av.string()),
8
+ token: av.optional(av.string())
9
+ }, { unknownKeys: "strip" });
10
+ export const ClientFrameSchema = av.object({
11
+ type: av.string().minLength(1),
12
+ code: av.optional(av.number()),
13
+ requestId: av.optional(av.string()),
14
+ status: av.optional(av.number()),
15
+ headers: av.optional(av.record(av.string())),
16
+ body: av.optional(av.string()),
17
+ message: av.optional(av.string()),
18
+ publicServerId: av.optional(av.string()),
19
+ publicSocketId: av.optional(av.string()),
20
+ frameType: av.optional(av.string()),
21
+ path: av.optional(av.string()),
22
+ webStartedAt: av.optional(av.number()),
23
+ clientApiRoundtripMs: av.optional(av.number()),
24
+ cliOverheadMs: av.optional(av.number()),
25
+ originMs: av.optional(av.number()),
26
+ totalMs: av.optional(av.number()),
27
+ internalServerMs: av.optional(av.number())
28
+ }, { unknownKeys: "strip" });
29
+ export const TunnelConfigSchema = av.object({
30
+ host: av.string().minLength(1).default("127.0.0.1"),
31
+ port: av.number(),
32
+ prefix: av.optional(av.string()),
33
+ host_header: av.optional(av.string())
34
+ }, { unknownKeys: "strip" });
35
+ export const FileConfigSchema = av.object({
36
+ tunnels: av.array(TunnelConfigSchema).default([])
37
+ }, { unknownKeys: "strip" });
38
+ export const AuthStartRequestSchema = av.object({
39
+ deviceName: av.optional(av.string()),
40
+ authAppBaseUrl: av.optional(av.string())
41
+ }, { unknownKeys: "strip" });
42
+ export const AuthStartResponseSchema = av.object({
43
+ sessionId: av.string(),
44
+ pollSecret: av.string(),
45
+ browserUrl: av.string(),
46
+ expiresAt: av.string()
47
+ }, { unknownKeys: "strip" });
48
+ export const AuthStatusResponseSchema = av.object({
49
+ status: av.string(),
50
+ token: av.optional(av.string()),
51
+ expiresAt: av.optional(av.string()),
52
+ tenantId: av.optional(av.string()),
53
+ bpUserSubject: av.optional(av.string()),
54
+ message: av.optional(av.string())
55
+ }, { unknownKeys: "strip" });
56
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../../src/plugins/service-tunnel-client-api/schemas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function forwardedHeaders(headers: Headers, hostname: string): Record<string, string>;
2
+ export declare function proxyClientIp(headers: Headers): string | undefined;
3
+ export declare function tunnelUnavailable(headers: Headers, status?: number): Response;
4
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/plugins/service-tunnel-web/http.ts"],"names":[],"mappings":"AAWA,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgB3F;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAKlE;AAkBD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAM,GAAG,QAAQ,CAwC1E"}
@@ -0,0 +1,119 @@
1
+ const HOP_BY_HOP = new Set([
2
+ "connection",
3
+ "keep-alive",
4
+ "proxy-authenticate",
5
+ "proxy-authorization",
6
+ "te",
7
+ "trailer",
8
+ "transfer-encoding",
9
+ "upgrade"
10
+ ]);
11
+ export function forwardedHeaders(headers, hostname) {
12
+ const out = {};
13
+ const clientIp = proxyClientIp(headers);
14
+ headers.forEach((value, name) => {
15
+ const key = name.toLowerCase();
16
+ if (HOP_BY_HOP.has(key))
17
+ return;
18
+ if (key === "cookie")
19
+ return;
20
+ out[key] = value;
21
+ });
22
+ out["x-forwarded-host"] = hostname;
23
+ out["x-forwarded-proto"] = "https";
24
+ if (clientIp) {
25
+ out["x-forwarded-for"] = clientIp;
26
+ out["x-real-ip"] = clientIp;
27
+ }
28
+ return out;
29
+ }
30
+ export function proxyClientIp(headers) {
31
+ const forwardedFor = firstPublicForwardedIp(headers.get("x-forwarded-for") ?? undefined);
32
+ if (forwardedFor)
33
+ return forwardedFor;
34
+ return headers.get("x-real-ip")?.trim() || undefined;
35
+ }
36
+ function firstPublicForwardedIp(value) {
37
+ return value?.split(",").map((ip) => ip.trim()).find((ip) => ip && !isPrivateIp(ip));
38
+ }
39
+ function isPrivateIp(ip) {
40
+ return ip === "unknown"
41
+ || ip.startsWith("10.")
42
+ || ip.startsWith("192.168.")
43
+ || /^172\.(1[6-9]|2\d|3[0-1])\./.test(ip)
44
+ || ip.startsWith("127.")
45
+ || ip.startsWith("::1")
46
+ || ip.startsWith("fc")
47
+ || ip.startsWith("fd")
48
+ || ip.startsWith("fe80:");
49
+ }
50
+ export function tunnelUnavailable(headers, status = 503) {
51
+ const accept = headers.get("accept")?.toLowerCase() ?? "";
52
+ const payload = {
53
+ error: "tunnel_unavailable",
54
+ message: "This development tunnel is not available right now.",
55
+ status
56
+ };
57
+ if (!accept || accept.includes("text/html") || accept.includes("application/xhtml+xml") || accept.includes("*/*")) {
58
+ return tunnelUnavailableHtml(status);
59
+ }
60
+ if (accept.includes("application/json")) {
61
+ return new Response(JSON.stringify(payload), {
62
+ status,
63
+ headers: { "content-type": "application/json; charset=utf-8" }
64
+ });
65
+ }
66
+ if (accept.includes("xml")) {
67
+ return new Response(`<?xml version="1.0" encoding="UTF-8"?>
68
+ <error>
69
+ <code>${payload.error}</code>
70
+ <message>${payload.message}</message>
71
+ <status>${status}</status>
72
+ </error>
73
+ `, {
74
+ status,
75
+ headers: { "content-type": "application/xml; charset=utf-8" }
76
+ });
77
+ }
78
+ if (accept.includes("text/plain")) {
79
+ return new Response(`${payload.message}\n`, {
80
+ status,
81
+ headers: { "content-type": "text/plain; charset=utf-8" }
82
+ });
83
+ }
84
+ return tunnelUnavailableHtml(status);
85
+ }
86
+ function tunnelUnavailableHtml(status) {
87
+ return new Response(`<!doctype html>
88
+ <html lang="en">
89
+ <head>
90
+ <meta charset="utf-8">
91
+ <meta name="viewport" content="width=device-width, initial-scale=1">
92
+ <title>Development tunnel unavailable</title>
93
+ <style>
94
+ :root { color-scheme: dark; --bg: #120506; --panel: #1b0b0d; --line: #5b2027; --text: #fff6f6; --muted: #f0b8bd; --danger: #ff344c; --danger2: #ff6b7b; }
95
+ * { box-sizing: border-box; }
96
+ body { margin: 0; min-height: 100vh; display: grid; place-items: center; padding: 24px; background: radial-gradient(circle at top, #3b0c13 0, #120506 46%, #080203 100%); color: var(--text); font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; }
97
+ main { width: min(560px, 100%); border: 1px solid var(--line); background: linear-gradient(180deg, rgba(255,52,76,.14), rgba(255,255,255,.02)), var(--panel); border-radius: 12px; box-shadow: 0 28px 90px rgba(0,0,0,.5); padding: 30px; }
98
+ .brand { color: var(--danger2); font-weight: 900; letter-spacing: .1em; text-transform: uppercase; font-size: 12px; }
99
+ h1 { margin: 18px 0 0; font-size: clamp(34px, 7vw, 62px); line-height: .95; letter-spacing: 0; }
100
+ p { margin: 18px 0 0; color: var(--muted); font-size: 18px; line-height: 1.45; }
101
+ .notice { border: 1px solid var(--danger); background: rgba(255,52,76,.12); padding: 16px; border-radius: 8px; margin-top: 22px; font-weight: 800; }
102
+ small { display: block; margin-top: 18px; color: #d8969d; line-height: 1.45; }
103
+ </style>
104
+ </head>
105
+ <body>
106
+ <main>
107
+ <div class="brand">BetterTunnels</div>
108
+ <h1>Unavailable.</h1>
109
+ <p>This is a temporary developer tunnel. It is not a real login, bank, Microsoft, or production service.</p>
110
+ <div class="notice">This tunnel is not available right now, or the local service is not responding.</div>
111
+ <small>Status ${status}. Close this tab unless you expected this exact developer tunnel.</small>
112
+ </main>
113
+ </body>
114
+ </html>`, {
115
+ status,
116
+ headers: { "content-type": "text/html; charset=utf-8" }
117
+ });
118
+ }
119
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/plugins/service-tunnel-web/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ import { BSBService, type BSBServiceConstructor, type Observable } from "@bsb/base";
2
+ import * as av from "anyvali";
3
+ export declare const Config: import("@bsb/base").BSBPluginConfigClass<av.ObjectSchema<{
4
+ port: av.NumberSchema;
5
+ domain: av.StringSchema;
6
+ verificationHost: av.StringSchema;
7
+ cookieSecret: av.StringSchema;
8
+ turnstileSiteKey: av.OptionalSchema<av.StringSchema>;
9
+ turnstileSecretKey: av.OptionalSchema<av.StringSchema>;
10
+ maxHeaderBytes: av.NumberSchema;
11
+ maxBodyBytes: av.NumberSchema;
12
+ }>>;
13
+ export declare const EventSchemas: {
14
+ readonly emitEvents: {};
15
+ readonly onEvents: {
16
+ readonly "ws.fromOrigin": {
17
+ input: av.ObjectSchema<{
18
+ publicSocketId: av.StringSchema;
19
+ frameType: av.StringSchema;
20
+ event: av.OptionalSchema<av.StringSchema>;
21
+ body: av.OptionalSchema<av.StringSchema>;
22
+ }>;
23
+ description?: string;
24
+ readonly __brand: "fire-and-forget";
25
+ };
26
+ };
27
+ readonly emitReturnableEvents: {};
28
+ readonly onReturnableEvents: {};
29
+ readonly emitBroadcast: {};
30
+ readonly onBroadcast: {};
31
+ };
32
+ export declare class Plugin extends BSBService<InstanceType<typeof Config>, typeof EventSchemas> {
33
+ static Config: import("@bsb/base").BSBPluginConfigClass<av.ObjectSchema<{
34
+ port: av.NumberSchema;
35
+ domain: av.StringSchema;
36
+ verificationHost: av.StringSchema;
37
+ cookieSecret: av.StringSchema;
38
+ turnstileSiteKey: av.OptionalSchema<av.StringSchema>;
39
+ turnstileSecretKey: av.OptionalSchema<av.StringSchema>;
40
+ maxHeaderBytes: av.NumberSchema;
41
+ maxBodyBytes: av.NumberSchema;
42
+ }>>;
43
+ static EventSchemas: {
44
+ readonly emitEvents: {};
45
+ readonly onEvents: {
46
+ readonly "ws.fromOrigin": {
47
+ input: av.ObjectSchema<{
48
+ publicSocketId: av.StringSchema;
49
+ frameType: av.StringSchema;
50
+ event: av.OptionalSchema<av.StringSchema>;
51
+ body: av.OptionalSchema<av.StringSchema>;
52
+ }>;
53
+ description?: string;
54
+ readonly __brand: "fire-and-forget";
55
+ };
56
+ };
57
+ readonly emitReturnableEvents: {};
58
+ readonly onReturnableEvents: {};
59
+ readonly emitBroadcast: {};
60
+ readonly onBroadcast: {};
61
+ };
62
+ readonly initBeforePlugins: string[];
63
+ readonly initAfterPlugins: string[];
64
+ readonly runBeforePlugins: string[];
65
+ readonly runAfterPlugins: string[];
66
+ private readonly clientApi;
67
+ private readonly app;
68
+ private readonly server;
69
+ private readonly wss;
70
+ private readonly publicSockets;
71
+ private readonly verification;
72
+ constructor(cfg: BSBServiceConstructor<InstanceType<typeof Config>, typeof EventSchemas>);
73
+ init(obs: Observable): Promise<void>;
74
+ run(obs: Observable): Promise<void>;
75
+ dispose(): Promise<void>;
76
+ private handlePublicSocket;
77
+ private sendProxyMetrics;
78
+ }
79
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/service-tunnel-web/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,KAAK,qBAAqB,EAC1B,KAAK,UAAU,EAMhB,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAU9B,eAAO,MAAM,MAAM;;;;;;;;;GAgBlB,CAAC;AAEF,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;CAiBvB,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,SAAS,CAAwB;IAClD,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,aAAa,CAAgC;IAC9D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAmB;gBAEpC,GAAG,EAAE,qBAAqB,CAAC,YAAY,CAAC,OAAO,MAAM,CAAC,EAAE,OAAO,YAAY,CAAC;IAelF,IAAI,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAiIpC,GAAG,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAQnC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAOhB,kBAAkB;IA2ChC,OAAO,CAAC,gBAAgB;CAmBzB"}