@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.
- package/README.md +76 -0
- package/SPEC.md +524 -0
- package/lib/.bsb/clients/service-tunnel-client-api.d.ts +133 -0
- package/lib/.bsb/clients/service-tunnel-client-api.d.ts.map +1 -0
- package/lib/.bsb/clients/service-tunnel-client-api.js +102 -0
- package/lib/.bsb/clients/service-tunnel-client-api.js.map +1 -0
- package/lib/.bsb/clients/service-tunnel-web.d.ts +43 -0
- package/lib/.bsb/clients/service-tunnel-web.d.ts.map +1 -0
- package/lib/.bsb/clients/service-tunnel-web.js +47 -0
- package/lib/.bsb/clients/service-tunnel-web.js.map +1 -0
- package/lib/auth.d.ts +12 -0
- package/lib/auth.d.ts.map +1 -0
- package/lib/auth.js +59 -0
- package/lib/auth.js.map +1 -0
- package/lib/cli.d.ts +2 -0
- package/lib/cli.d.ts.map +1 -0
- package/lib/cli.js +295 -0
- package/lib/cli.js.map +1 -0
- package/lib/plugins/service-betterportal/.bp-generated/registry.d.ts +3 -0
- package/lib/plugins/service-betterportal/.bp-generated/registry.d.ts.map +1 -0
- package/lib/plugins/service-betterportal/.bp-generated/registry.js +127 -0
- package/lib/plugins/service-betterportal/.bp-generated/registry.js.map +1 -0
- package/lib/plugins/service-betterportal/assets/brand/bettertunnels-horizontal-light.svg +18 -0
- package/lib/plugins/service-betterportal/assets/brand/bettertunnels-square-dark-1024x1024.png +0 -0
- package/lib/plugins/service-betterportal/assets/brand/favicon.svg +12 -0
- package/lib/plugins/service-betterportal/betterportal-logo.png +0 -0
- package/lib/plugins/service-betterportal/bp-routes/cli-auth/verify/_theme.bootstrap1/index.d.ts +5 -0
- package/lib/plugins/service-betterportal/bp-routes/cli-auth/verify/_theme.bootstrap1/index.d.ts.map +1 -0
- package/lib/plugins/service-betterportal/bp-routes/cli-auth/verify/_theme.bootstrap1/index.js +6 -0
- package/lib/plugins/service-betterportal/bp-routes/cli-auth/verify/_theme.bootstrap1/index.js.map +1 -0
- package/lib/plugins/service-betterportal/bp-routes/cli-auth/verify/index.d.ts +25 -0
- package/lib/plugins/service-betterportal/bp-routes/cli-auth/verify/index.d.ts.map +1 -0
- package/lib/plugins/service-betterportal/bp-routes/cli-auth/verify/index.js +59 -0
- package/lib/plugins/service-betterportal/bp-routes/cli-auth/verify/index.js.map +1 -0
- package/lib/plugins/service-betterportal/bp-routes/dashboard/_theme.bootstrap1/index.d.ts +5 -0
- package/lib/plugins/service-betterportal/bp-routes/dashboard/_theme.bootstrap1/index.d.ts.map +1 -0
- package/lib/plugins/service-betterportal/bp-routes/dashboard/_theme.bootstrap1/index.js +22 -0
- package/lib/plugins/service-betterportal/bp-routes/dashboard/_theme.bootstrap1/index.js.map +1 -0
- package/lib/plugins/service-betterportal/bp-routes/dashboard/index.d.ts +40 -0
- package/lib/plugins/service-betterportal/bp-routes/dashboard/index.d.ts.map +1 -0
- package/lib/plugins/service-betterportal/bp-routes/dashboard/index.js +57 -0
- package/lib/plugins/service-betterportal/bp-routes/dashboard/index.js.map +1 -0
- package/lib/plugins/service-betterportal/bp-routes/downloads/_theme.bootstrap1/index.d.ts +5 -0
- package/lib/plugins/service-betterportal/bp-routes/downloads/_theme.bootstrap1/index.d.ts.map +1 -0
- package/lib/plugins/service-betterportal/bp-routes/downloads/_theme.bootstrap1/index.js +5 -0
- package/lib/plugins/service-betterportal/bp-routes/downloads/_theme.bootstrap1/index.js.map +1 -0
- package/lib/plugins/service-betterportal/bp-routes/downloads/index.d.ts +30 -0
- package/lib/plugins/service-betterportal/bp-routes/downloads/index.d.ts.map +1 -0
- package/lib/plugins/service-betterportal/bp-routes/downloads/index.js +45 -0
- package/lib/plugins/service-betterportal/bp-routes/downloads/index.js.map +1 -0
- package/lib/plugins/service-betterportal/bp-routes/landing/_theme.bootstrap1/index.d.ts +5 -0
- package/lib/plugins/service-betterportal/bp-routes/landing/_theme.bootstrap1/index.d.ts.map +1 -0
- package/lib/plugins/service-betterportal/bp-routes/landing/_theme.bootstrap1/index.js +5 -0
- package/lib/plugins/service-betterportal/bp-routes/landing/_theme.bootstrap1/index.js.map +1 -0
- package/lib/plugins/service-betterportal/bp-routes/landing/index.d.ts +40 -0
- package/lib/plugins/service-betterportal/bp-routes/landing/index.d.ts.map +1 -0
- package/lib/plugins/service-betterportal/bp-routes/landing/index.js +63 -0
- package/lib/plugins/service-betterportal/bp-routes/landing/index.js.map +1 -0
- package/lib/plugins/service-betterportal/bp-routes/tunnels/_theme.bootstrap1/index.d.ts +5 -0
- package/lib/plugins/service-betterportal/bp-routes/tunnels/_theme.bootstrap1/index.d.ts.map +1 -0
- package/lib/plugins/service-betterportal/bp-routes/tunnels/_theme.bootstrap1/index.js +5 -0
- package/lib/plugins/service-betterportal/bp-routes/tunnels/_theme.bootstrap1/index.js.map +1 -0
- package/lib/plugins/service-betterportal/bp-routes/tunnels/index.d.ts +44 -0
- package/lib/plugins/service-betterportal/bp-routes/tunnels/index.d.ts.map +1 -0
- package/lib/plugins/service-betterportal/bp-routes/tunnels/index.js +59 -0
- package/lib/plugins/service-betterportal/bp-routes/tunnels/index.js.map +1 -0
- package/lib/plugins/service-betterportal/brand-assets.d.ts +7 -0
- package/lib/plugins/service-betterportal/brand-assets.d.ts.map +1 -0
- package/lib/plugins/service-betterportal/brand-assets.js +24 -0
- package/lib/plugins/service-betterportal/brand-assets.js.map +1 -0
- package/lib/plugins/service-betterportal/index.d.ts +57 -0
- package/lib/plugins/service-betterportal/index.d.ts.map +1 -0
- package/lib/plugins/service-betterportal/index.js +108 -0
- package/lib/plugins/service-betterportal/index.js.map +1 -0
- package/lib/plugins/service-tunnel-client-api/ids.d.ts +6 -0
- package/lib/plugins/service-tunnel-client-api/ids.d.ts.map +1 -0
- package/lib/plugins/service-tunnel-client-api/ids.js +17 -0
- package/lib/plugins/service-tunnel-client-api/ids.js.map +1 -0
- package/lib/plugins/service-tunnel-client-api/index.d.ts +158 -0
- package/lib/plugins/service-tunnel-client-api/index.d.ts.map +1 -0
- package/lib/plugins/service-tunnel-client-api/index.js +591 -0
- package/lib/plugins/service-tunnel-client-api/index.js.map +1 -0
- package/lib/plugins/service-tunnel-client-api/registry.d.ts +36 -0
- package/lib/plugins/service-tunnel-client-api/registry.d.ts.map +1 -0
- package/lib/plugins/service-tunnel-client-api/registry.js +14 -0
- package/lib/plugins/service-tunnel-client-api/registry.js.map +1 -0
- package/lib/plugins/service-tunnel-client-api/schemas.d.ts +66 -0
- package/lib/plugins/service-tunnel-client-api/schemas.d.ts.map +1 -0
- package/lib/plugins/service-tunnel-client-api/schemas.js +56 -0
- package/lib/plugins/service-tunnel-client-api/schemas.js.map +1 -0
- package/lib/plugins/service-tunnel-web/http.d.ts +4 -0
- package/lib/plugins/service-tunnel-web/http.d.ts.map +1 -0
- package/lib/plugins/service-tunnel-web/http.js +119 -0
- package/lib/plugins/service-tunnel-web/http.js.map +1 -0
- package/lib/plugins/service-tunnel-web/index.d.ts +79 -0
- package/lib/plugins/service-tunnel-web/index.d.ts.map +1 -0
- package/lib/plugins/service-tunnel-web/index.js +278 -0
- package/lib/plugins/service-tunnel-web/index.js.map +1 -0
- package/lib/plugins/service-tunnel-web/verification.d.ts +27 -0
- package/lib/plugins/service-tunnel-web/verification.d.ts.map +1 -0
- package/lib/plugins/service-tunnel-web/verification.js +209 -0
- package/lib/plugins/service-tunnel-web/verification.js.map +1 -0
- package/lib/prisma.d.ts +6 -0
- package/lib/prisma.d.ts.map +1 -0
- package/lib/prisma.js +10 -0
- package/lib/prisma.js.map +1 -0
- package/lib/schemas/service-betterportal.json +109 -0
- package/lib/schemas/service-tunnel-client-api.json +300 -0
- package/lib/schemas/service-tunnel-web.json +140 -0
- package/package.json +60 -0
- package/prisma/migrations/0001_init/migration.sql +63 -0
- package/prisma/migrations/0002_account_plan/migration.sql +6 -0
- package/prisma/migrations/0003_tunnel_owner_server/migration.sql +1 -0
- package/prisma/migrations/20260701000000_add_client_auth/migration.sql +46 -0
- package/prisma/migrations/migration_lock.toml +3 -0
- 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":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAG9B,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC,MAAM,CAAC;IAC1C,SAAS,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IACnC,UAAU,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;IACzD,UAAU,EAAE,EAAE,CAAC,MAAM,EAAE;IACvB,aAAa,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACvC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;IAChC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;CAChC,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;AAG7B,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC,MAAM,CAAC;IACzC,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9B,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;IAC9B,SAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;IACnC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;IAChC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;IAC9B,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;IACjC,cAAc,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;IACxC,cAAc,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;IACxC,SAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;IACnC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;IAC9B,YAAY,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;IACtC,oBAAoB,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;IAC9C,aAAa,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;IACvC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;IAClC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;IACjC,gBAAgB,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;CAC3C,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;AAE7B,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC,MAAM,CAAC;IAC1C,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;IACnD,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE;IACjB,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;IAChC,WAAW,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;CACtC,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;AAG7B,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC,MAAM,CAAC;IACxC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CAClD,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;AAG7B,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC,MAAM,CAAC;IAC9C,UAAU,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;IACpC,cAAc,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;CACzC,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;AAG7B,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,CAAC,MAAM,CAAC;IAC/C,SAAS,EAAE,EAAE,CAAC,MAAM,EAAE;IACtB,UAAU,EAAE,EAAE,CAAC,MAAM,EAAE;IACvB,UAAU,EAAE,EAAE,CAAC,MAAM,EAAE;IACvB,SAAS,EAAE,EAAE,CAAC,MAAM,EAAE;CACvB,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;AAE7B,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAC,MAAM,CAAC;IAChD,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE;IACnB,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;IAC/B,SAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;IACnC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;IAClC,aAAa,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;IACvC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;CAClC,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC"}
|
|
@@ -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"}
|