@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,57 @@
1
+ import { type BSBServiceConstructor } from "@bsb/base";
2
+ import * as av from "anyvali";
3
+ import { BPService, type BPServiceDefinition } from "@betterportal/plugin-bsb";
4
+ declare const Config: import("@bsb/base").BSBPluginConfigClass<av.ObjectSchema<{
5
+ host: av.StringSchema;
6
+ port: av.IntSchema;
7
+ betterportal: av.OptionalSchema<av.ObjectSchema<{
8
+ bpConfigPath: av.OptionalSchema<av.StringSchema>;
9
+ configApiToken: av.OptionalSchema<av.StringSchema>;
10
+ configEncryptionKey: av.OptionalSchema<av.StringSchema>;
11
+ controlPlaneUrl: av.OptionalSchema<av.StringSchema>;
12
+ serviceApiKey: av.OptionalSchema<av.StringSchema>;
13
+ bootstrapStatePath: av.StringSchema;
14
+ scopedConfigCachePath: av.StringSchema;
15
+ trustedProxyHeaders: av.BoolSchema;
16
+ cfProxy: av.BoolSchema;
17
+ trustedProxyIps: av.ArraySchema<av.StringSchema>;
18
+ }>>;
19
+ }>>;
20
+ declare const EventSchemas: {
21
+ readonly emitEvents: {};
22
+ readonly onEvents: {};
23
+ readonly emitReturnableEvents: {};
24
+ readonly onReturnableEvents: {};
25
+ readonly emitBroadcast: {};
26
+ readonly onBroadcast: {};
27
+ };
28
+ export declare class Plugin extends BPService<InstanceType<typeof Config>, typeof EventSchemas> {
29
+ static Config: import("@bsb/base").BSBPluginConfigClass<av.ObjectSchema<{
30
+ host: av.StringSchema;
31
+ port: av.IntSchema;
32
+ betterportal: av.OptionalSchema<av.ObjectSchema<{
33
+ bpConfigPath: av.OptionalSchema<av.StringSchema>;
34
+ configApiToken: av.OptionalSchema<av.StringSchema>;
35
+ configEncryptionKey: av.OptionalSchema<av.StringSchema>;
36
+ controlPlaneUrl: av.OptionalSchema<av.StringSchema>;
37
+ serviceApiKey: av.OptionalSchema<av.StringSchema>;
38
+ bootstrapStatePath: av.StringSchema;
39
+ scopedConfigCachePath: av.StringSchema;
40
+ trustedProxyHeaders: av.BoolSchema;
41
+ cfProxy: av.BoolSchema;
42
+ trustedProxyIps: av.ArraySchema<av.StringSchema>;
43
+ }>>;
44
+ }>>;
45
+ static EventSchemas: {
46
+ readonly emitEvents: {};
47
+ readonly onEvents: {};
48
+ readonly emitReturnableEvents: {};
49
+ readonly onReturnableEvents: {};
50
+ readonly emitBroadcast: {};
51
+ readonly onBroadcast: {};
52
+ };
53
+ constructor(cfg: BSBServiceConstructor<InstanceType<typeof Config>, typeof EventSchemas>);
54
+ protected definition(): BPServiceDefinition;
55
+ }
56
+ export { Config, EventSchemas };
57
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/service-betterportal/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,qBAAqB,EAG3B,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,OAAO,EAA4B,SAAS,EAAE,KAAK,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AASzG,QAAA,MAAM,MAAM;;;;;;;;;;;;;;;GAQX,CAAC;AAEF,QAAA,MAAM,YAAY;;;;;;;CAOhB,CAAC;AA6DH,qBAAa,MAAO,SAAQ,SAAS,CAAC,YAAY,CAAC,OAAO,MAAM,CAAC,EAAE,OAAO,YAAY,CAAC;IACrF,MAAM,CAAC,MAAM;;;;;;;;;;;;;;;QAAU;IACvB,MAAM,CAAC,YAAY;;;;;;;MAAgB;gBAEvB,GAAG,EAAE,qBAAqB,CAAC,YAAY,CAAC,OAAO,MAAM,CAAC,EAAE,OAAO,YAAY,CAAC;IAIxF,SAAS,CAAC,UAAU,IAAI,mBAAmB;CAkB5C;AAED,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,108 @@
1
+ import { createConfigSchema, createEventSchemas } from "@bsb/base";
2
+ import * as av from "anyvali";
3
+ import { BetterPortalConfigSchema, BPService } from "@betterportal/plugin-bsb";
4
+ import { registry } from "./.bp-generated/registry.js";
5
+ const PluginConfigSchema = av.object({
6
+ host: av.string().minLength(1).default("0.0.0.0"),
7
+ port: av.int().min(1).default(8083),
8
+ betterportal: BetterPortalConfigSchema
9
+ }, { unknownKeys: "strip" });
10
+ const Config = createConfigSchema({
11
+ name: "service-betterportal",
12
+ description: "BetterPortal public and management UI for BetterTunnels",
13
+ image: "./betterportal-logo.png",
14
+ tags: ["betterportal", "web", "management", "tunnels"]
15
+ }, PluginConfigSchema);
16
+ const EventSchemas = createEventSchemas({
17
+ emitEvents: {},
18
+ onEvents: {},
19
+ emitReturnableEvents: {},
20
+ onReturnableEvents: {},
21
+ emitBroadcast: {},
22
+ onBroadcast: {}
23
+ });
24
+ const ConfigSchemas = [
25
+ {
26
+ id: "better-tunnels.tenant",
27
+ title: "BetterTunnels",
28
+ description: "Tenant-level BetterTunnels settings.",
29
+ scope: "tenant",
30
+ jsonSchema: {
31
+ type: "object",
32
+ properties: {
33
+ mainAuthAppPublicUrl: { type: "string" },
34
+ mainAuthAppId: { type: "string" }
35
+ },
36
+ required: ["mainAuthAppPublicUrl"]
37
+ },
38
+ groups: [
39
+ {
40
+ id: "cli-auth",
41
+ title: "CLI authentication",
42
+ description: "The BetterPortal app used for BetterTunnels CLI login.",
43
+ order: 10
44
+ }
45
+ ],
46
+ fields: [
47
+ {
48
+ key: "mainAuthAppPublicUrl",
49
+ title: "Main auth app public URL",
50
+ description: "Public BetterPortal app URL used to start CLI authentication.",
51
+ scope: "tenant",
52
+ visibility: "protected",
53
+ ownership: "bp",
54
+ sourceOfTruth: "bp",
55
+ groupId: "cli-auth",
56
+ order: 10,
57
+ required: true,
58
+ ui: {
59
+ control: "url",
60
+ placeholder: "https://betterportal.cloud"
61
+ }
62
+ },
63
+ {
64
+ key: "mainAuthAppId",
65
+ title: "Main auth app id",
66
+ description: "Optional BetterPortal app id to enforce on CLI verification.",
67
+ scope: "tenant",
68
+ visibility: "protected",
69
+ ownership: "bp",
70
+ sourceOfTruth: "bp",
71
+ groupId: "cli-auth",
72
+ order: 20,
73
+ required: false,
74
+ ui: {
75
+ control: "text",
76
+ placeholder: "app id"
77
+ }
78
+ }
79
+ ]
80
+ }
81
+ ];
82
+ export class Plugin extends BPService {
83
+ static Config = Config;
84
+ static EventSchemas = EventSchemas;
85
+ constructor(cfg) {
86
+ super({ ...cfg, eventSchemas: EventSchemas });
87
+ }
88
+ definition() {
89
+ return {
90
+ manifest: {
91
+ pluginId: "service.betterportal.tunnels",
92
+ title: "BetterTunnels",
93
+ description: "Public site and management surface for BetterTunnels.",
94
+ category: "service",
95
+ capabilities: [
96
+ "tunnels.public-landing",
97
+ "tunnels.management",
98
+ "tunnels.observability",
99
+ "tunnels.client-auth"
100
+ ],
101
+ configSchemas: ConfigSchemas
102
+ },
103
+ registry
104
+ };
105
+ }
106
+ }
107
+ export { Config, EventSchemas };
108
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/service-betterportal/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,wBAAwB,EAAE,SAAS,EAA4B,MAAM,0BAA0B,CAAC;AACzG,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAEvD,MAAM,kBAAkB,GAAG,EAAE,CAAC,MAAM,CAAC;IACnC,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IACjD,IAAI,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IACnC,YAAY,EAAE,wBAAwB;CACvC,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;AAE7B,MAAM,MAAM,GAAG,kBAAkB,CAC/B;IACE,IAAI,EAAE,sBAAsB;IAC5B,WAAW,EAAE,yDAAyD;IACtE,KAAK,EAAE,yBAAyB;IAChC,IAAI,EAAE,CAAC,cAAc,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,CAAC;CACvD,EACD,kBAAkB,CACnB,CAAC;AAEF,MAAM,YAAY,GAAG,kBAAkB,CAAC;IACtC,UAAU,EAAE,EAAE;IACd,QAAQ,EAAE,EAAE;IACZ,oBAAoB,EAAE,EAAE;IACxB,kBAAkB,EAAE,EAAE;IACtB,aAAa,EAAE,EAAE;IACjB,WAAW,EAAE,EAAE;CAChB,CAAC,CAAC;AAEH,MAAM,aAAa,GAA6B;IAC9C;QACE,EAAE,EAAE,uBAAuB;QAC3B,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,sCAAsC;QACnD,KAAK,EAAE,QAAQ;QACf,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,oBAAoB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACxC,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aAClC;YACD,QAAQ,EAAE,CAAC,sBAAsB,CAAC;SACnC;QACD,MAAM,EAAE;YACN;gBACE,EAAE,EAAE,UAAU;gBACd,KAAK,EAAE,oBAAoB;gBAC3B,WAAW,EAAE,wDAAwD;gBACrE,KAAK,EAAE,EAAE;aACV;SACF;QACD,MAAM,EAAE;YACN;gBACE,GAAG,EAAE,sBAAsB;gBAC3B,KAAK,EAAE,0BAA0B;gBACjC,WAAW,EAAE,+DAA+D;gBAC5E,KAAK,EAAE,QAAQ;gBACf,UAAU,EAAE,WAAW;gBACvB,SAAS,EAAE,IAAI;gBACf,aAAa,EAAE,IAAI;gBACnB,OAAO,EAAE,UAAU;gBACnB,KAAK,EAAE,EAAE;gBACT,QAAQ,EAAE,IAAI;gBACd,EAAE,EAAE;oBACF,OAAO,EAAE,KAAK;oBACd,WAAW,EAAE,4BAA4B;iBAC1C;aACF;YACD;gBACE,GAAG,EAAE,eAAe;gBACpB,KAAK,EAAE,kBAAkB;gBACzB,WAAW,EAAE,8DAA8D;gBAC3E,KAAK,EAAE,QAAQ;gBACf,UAAU,EAAE,WAAW;gBACvB,SAAS,EAAE,IAAI;gBACf,aAAa,EAAE,IAAI;gBACnB,OAAO,EAAE,UAAU;gBACnB,KAAK,EAAE,EAAE;gBACT,QAAQ,EAAE,KAAK;gBACf,EAAE,EAAE;oBACF,OAAO,EAAE,MAAM;oBACf,WAAW,EAAE,QAAQ;iBACtB;aACF;SACF;KACF;CACF,CAAC;AAEF,MAAM,OAAO,MAAO,SAAQ,SAA2D;IACrF,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,MAAM,CAAC,YAAY,GAAG,YAAY,CAAC;IAEnC,YAAY,GAA4E;QACtF,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC;IAChD,CAAC;IAES,UAAU;QAClB,OAAO;YACL,QAAQ,EAAE;gBACR,QAAQ,EAAE,8BAA8B;gBACxC,KAAK,EAAE,eAAe;gBACtB,WAAW,EAAE,uDAAuD;gBACpE,QAAQ,EAAE,SAAS;gBACnB,YAAY,EAAE;oBACZ,wBAAwB;oBACxB,oBAAoB;oBACpB,uBAAuB;oBACvB,qBAAqB;iBACtB;gBACD,aAAa,EAAE,aAAa;aAC7B;YACD,QAAQ;SACT,CAAC;IACJ,CAAC;;AAGH,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare function randomPrefix(): string;
2
+ export declare function hashValue(value: string): string;
3
+ export declare function normalizeHostPart(value: string): string;
4
+ export declare function buildSubdomain(prefix: string, port: number, host: string): string;
5
+ export declare function buildTunnelSubdomain(prefix: string, port: number, creatorIp: string): string;
6
+ //# sourceMappingURL=ids.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ids.d.ts","sourceRoot":"","sources":["../../../src/plugins/service-tunnel-client-api/ids.ts"],"names":[],"mappings":"AAEA,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjF;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE5F"}
@@ -0,0 +1,17 @@
1
+ import { createHash, randomBytes } from "node:crypto";
2
+ export function randomPrefix() {
3
+ return randomBytes(4).toString("base64url").toLowerCase().replace(/[^a-z0-9]/g, "").slice(0, 6).padEnd(6, "0");
4
+ }
5
+ export function hashValue(value) {
6
+ return createHash("sha256").update(value).digest("hex");
7
+ }
8
+ export function normalizeHostPart(value) {
9
+ return value.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 40) || "host";
10
+ }
11
+ export function buildSubdomain(prefix, port, host) {
12
+ return `${prefix}-port${port}-${normalizeHostPart(host)}`;
13
+ }
14
+ export function buildTunnelSubdomain(prefix, port, creatorIp) {
15
+ return buildSubdomain(prefix, port, creatorIp);
16
+ }
17
+ //# sourceMappingURL=ids.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ids.js","sourceRoot":"","sources":["../../../src/plugins/service-tunnel-client-api/ids.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEtD,MAAM,UAAU,YAAY;IAC1B,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACjH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC;AACxG,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,IAAY,EAAE,IAAY;IACvE,OAAO,GAAG,MAAM,QAAQ,IAAI,IAAI,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAc,EAAE,IAAY,EAAE,SAAiB;IAClF,OAAO,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,158 @@
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
+ publicUrl: av.StringSchema;
7
+ authAppBaseUrl: av.StringSchema;
8
+ authVerifyPath: av.StringSchema;
9
+ }>>;
10
+ export declare const EventSchemas: {
11
+ readonly emitEvents: {};
12
+ readonly onEvents: {
13
+ readonly "ws.toOrigin": {
14
+ input: av.ObjectSchema<{
15
+ publicServerId: av.StringSchema;
16
+ publicSocketId: av.StringSchema;
17
+ hostname: av.StringSchema;
18
+ path: 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
+ readonly "proxy.metrics": {
27
+ input: av.ObjectSchema<{
28
+ hostname: av.StringSchema;
29
+ requestId: av.StringSchema;
30
+ totalMs: import("@bsb/base").BSBType;
31
+ clientApiRoundtripMs: av.OptionalSchema<import("@bsb/base").BSBType>;
32
+ cliOverheadMs: av.OptionalSchema<import("@bsb/base").BSBType>;
33
+ originMs: av.OptionalSchema<import("@bsb/base").BSBType>;
34
+ internalServerMs: av.OptionalSchema<import("@bsb/base").BSBType>;
35
+ }>;
36
+ description?: string;
37
+ readonly __brand: "fire-and-forget";
38
+ };
39
+ };
40
+ readonly emitReturnableEvents: {};
41
+ readonly onReturnableEvents: {
42
+ readonly "proxy.request": {
43
+ input: av.ObjectSchema<{
44
+ hostname: av.StringSchema;
45
+ method: av.StringSchema;
46
+ path: av.StringSchema;
47
+ headers: av.RecordSchema<av.StringSchema>;
48
+ body: av.OptionalSchema<av.StringSchema>;
49
+ webStartedAt: import("@bsb/base").BSBType;
50
+ }>;
51
+ output: av.ObjectSchema<{
52
+ requestId: av.StringSchema;
53
+ ownerServerId: av.StringSchema;
54
+ status: import("@bsb/base").BSBType;
55
+ headers: av.RecordSchema<av.StringSchema>;
56
+ body: av.StringSchema;
57
+ webStartedAt: import("@bsb/base").BSBType;
58
+ clientApiRoundtripMs: import("@bsb/base").BSBType;
59
+ cliOverheadMs: av.OptionalSchema<import("@bsb/base").BSBType>;
60
+ originMs: av.OptionalSchema<import("@bsb/base").BSBType>;
61
+ }>;
62
+ description?: string;
63
+ defaultTimeout?: number;
64
+ readonly __brand: "returnable";
65
+ };
66
+ };
67
+ readonly emitBroadcast: {};
68
+ readonly onBroadcast: {};
69
+ };
70
+ export declare class Plugin extends BSBService<InstanceType<typeof Config>, typeof EventSchemas> {
71
+ static Config: import("@bsb/base").BSBPluginConfigClass<av.ObjectSchema<{
72
+ port: av.NumberSchema;
73
+ domain: av.StringSchema;
74
+ publicUrl: av.StringSchema;
75
+ authAppBaseUrl: av.StringSchema;
76
+ authVerifyPath: av.StringSchema;
77
+ }>>;
78
+ static EventSchemas: {
79
+ readonly emitEvents: {};
80
+ readonly onEvents: {
81
+ readonly "ws.toOrigin": {
82
+ input: av.ObjectSchema<{
83
+ publicServerId: av.StringSchema;
84
+ publicSocketId: av.StringSchema;
85
+ hostname: av.StringSchema;
86
+ path: av.StringSchema;
87
+ frameType: av.StringSchema;
88
+ event: av.OptionalSchema<av.StringSchema>;
89
+ body: av.OptionalSchema<av.StringSchema>;
90
+ }>;
91
+ description?: string;
92
+ readonly __brand: "fire-and-forget";
93
+ };
94
+ readonly "proxy.metrics": {
95
+ input: av.ObjectSchema<{
96
+ hostname: av.StringSchema;
97
+ requestId: av.StringSchema;
98
+ totalMs: import("@bsb/base").BSBType;
99
+ clientApiRoundtripMs: av.OptionalSchema<import("@bsb/base").BSBType>;
100
+ cliOverheadMs: av.OptionalSchema<import("@bsb/base").BSBType>;
101
+ originMs: av.OptionalSchema<import("@bsb/base").BSBType>;
102
+ internalServerMs: av.OptionalSchema<import("@bsb/base").BSBType>;
103
+ }>;
104
+ description?: string;
105
+ readonly __brand: "fire-and-forget";
106
+ };
107
+ };
108
+ readonly emitReturnableEvents: {};
109
+ readonly onReturnableEvents: {
110
+ readonly "proxy.request": {
111
+ input: av.ObjectSchema<{
112
+ hostname: av.StringSchema;
113
+ method: av.StringSchema;
114
+ path: av.StringSchema;
115
+ headers: av.RecordSchema<av.StringSchema>;
116
+ body: av.OptionalSchema<av.StringSchema>;
117
+ webStartedAt: import("@bsb/base").BSBType;
118
+ }>;
119
+ output: av.ObjectSchema<{
120
+ requestId: av.StringSchema;
121
+ ownerServerId: av.StringSchema;
122
+ status: import("@bsb/base").BSBType;
123
+ headers: av.RecordSchema<av.StringSchema>;
124
+ body: av.StringSchema;
125
+ webStartedAt: import("@bsb/base").BSBType;
126
+ clientApiRoundtripMs: import("@bsb/base").BSBType;
127
+ cliOverheadMs: av.OptionalSchema<import("@bsb/base").BSBType>;
128
+ originMs: av.OptionalSchema<import("@bsb/base").BSBType>;
129
+ }>;
130
+ description?: string;
131
+ defaultTimeout?: number;
132
+ readonly __brand: "returnable";
133
+ };
134
+ };
135
+ readonly emitBroadcast: {};
136
+ readonly onBroadcast: {};
137
+ };
138
+ readonly initBeforePlugins: string[];
139
+ readonly initAfterPlugins: string[];
140
+ readonly runBeforePlugins: string[];
141
+ readonly runAfterPlugins: string[];
142
+ private readonly registry;
143
+ private readonly app;
144
+ private readonly server;
145
+ private readonly wss;
146
+ private readonly web;
147
+ constructor(cfg: BSBServiceConstructor<InstanceType<typeof Config>, typeof EventSchemas>);
148
+ init(obs: Observable): Promise<void>;
149
+ run(obs: Observable): Promise<void>;
150
+ dispose(): Promise<void>;
151
+ private handleTunnelSocket;
152
+ private proxyRequest;
153
+ private handleClientFrame;
154
+ private resetIdleTimer;
155
+ private failPending;
156
+ private clearPendingTimers;
157
+ }
158
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugins/service-tunnel-client-api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,KAAK,qBAAqB,EAC1B,KAAK,UAAU,EAOhB,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAoB9B,eAAO,MAAM,MAAM;;;;;;GAalB,CAAC;AAEF,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwDvB,CAAC;AAEH,qBAAa,MAAO,SAAQ,UAAU,CAAC,YAAY,CAAC,OAAO,MAAM,CAAC,EAAE,OAAO,YAAY,CAAC;IACtF,MAAM,CAAC,MAAM;;;;;;QAAU;IACvB,MAAM,CAAC,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAAgB;IACnC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,EAAE,CAAM;IAC1C,QAAQ,CAAC,gBAAgB,EAAE,MAAM,EAAE,CAAM;IACzC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,EAAE,CAAM;IACzC,QAAQ,CAAC,eAAe,EAAE,MAAM,EAAE,CAAM;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwB;IACjD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAK;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAkB;IACtC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAkB;gBAE1B,GAAG,EAAE,qBAAqB,CAAC,YAAY,CAAC,OAAO,MAAM,CAAC,EAAE,OAAO,YAAY,CAAC;IAQlF,IAAI,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAsKpC,GAAG,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAQnC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAOhB,kBAAkB;YAuHlB,YAAY;IA0E1B,OAAO,CAAC,iBAAiB;IAyDzB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,kBAAkB;CAK3B"}