@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,46 @@
1
+ CREATE TYPE "AuthSessionStatus" AS ENUM ('pending', 'approved', 'consumed', 'expired', 'denied');
2
+
3
+ CREATE TABLE "ClientAuthSession" (
4
+ "id" TEXT NOT NULL,
5
+ "browserKeyHash" TEXT NOT NULL,
6
+ "pollSecretHash" TEXT NOT NULL,
7
+ "status" "AuthSessionStatus" NOT NULL DEFAULT 'pending',
8
+ "tenantId" TEXT,
9
+ "appId" TEXT,
10
+ "bpUserSubject" TEXT,
11
+ "bpUserEmail" TEXT,
12
+ "clientIpHash" TEXT,
13
+ "userAgentHash" TEXT,
14
+ "expiresAt" TIMESTAMP(3) NOT NULL,
15
+ "approvedAt" TIMESTAMP(3),
16
+ "consumedAt" TIMESTAMP(3),
17
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
18
+
19
+ CONSTRAINT "ClientAuthSession_pkey" PRIMARY KEY ("id")
20
+ );
21
+
22
+ CREATE TABLE "ClientDeviceToken" (
23
+ "id" TEXT NOT NULL,
24
+ "accountId" TEXT,
25
+ "tenantId" TEXT NOT NULL,
26
+ "bpUserSubject" TEXT NOT NULL,
27
+ "tokenHash" TEXT NOT NULL,
28
+ "name" TEXT,
29
+ "ipRangeHash" TEXT NOT NULL,
30
+ "ipFamily" TEXT NOT NULL,
31
+ "userAgentHash" TEXT,
32
+ "expiresAt" TIMESTAMP(3) NOT NULL,
33
+ "revokedAt" TIMESTAMP(3),
34
+ "lastUsedAt" TIMESTAMP(3),
35
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
36
+
37
+ CONSTRAINT "ClientDeviceToken_pkey" PRIMARY KEY ("id")
38
+ );
39
+
40
+ CREATE INDEX "ClientAuthSession_status_expiresAt_idx" ON "ClientAuthSession"("status", "expiresAt");
41
+
42
+ CREATE UNIQUE INDEX "ClientDeviceToken_tokenHash_key" ON "ClientDeviceToken"("tokenHash");
43
+
44
+ CREATE INDEX "ClientDeviceToken_tenantId_bpUserSubject_idx" ON "ClientDeviceToken"("tenantId", "bpUserSubject");
45
+
46
+ CREATE INDEX "ClientDeviceToken_expiresAt_idx" ON "ClientDeviceToken"("expiresAt");
@@ -0,0 +1,3 @@
1
+ # Please do not edit this file manually
2
+ # It should be added in your version-control system (e.g., Git)
3
+ provider = "postgresql"
@@ -0,0 +1,141 @@
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
+ status TunnelStatus @default(created)
40
+ createdAt DateTime @default(now())
41
+ expiresAt DateTime
42
+ account Account? @relation(fields: [accountId], references: [id])
43
+ session ClientSession @relation(fields: [sessionId], references: [id])
44
+ validations VisitorValidation[]
45
+ usage UsageCounter?
46
+
47
+ @@index([sessionId])
48
+ @@index([expiresAt])
49
+ }
50
+
51
+ model VisitorValidation {
52
+ id String @id @default(cuid())
53
+ tunnelId String
54
+ visitorIpHash String
55
+ userAgentHash String
56
+ validationCookieHash String
57
+ validatedAt DateTime @default(now())
58
+ expiresAt DateTime
59
+ tunnel Tunnel @relation(fields: [tunnelId], references: [id])
60
+
61
+ @@index([tunnelId, visitorIpHash, userAgentHash])
62
+ }
63
+
64
+ model UsageCounter {
65
+ tunnelId String @id
66
+ requests Int @default(0)
67
+ bytesIn BigInt @default(0)
68
+ bytesOut BigInt @default(0)
69
+ updatedAt DateTime @updatedAt
70
+ tunnel Tunnel @relation(fields: [tunnelId], references: [id])
71
+ }
72
+
73
+ model AuditEvent {
74
+ id String @id @default(cuid())
75
+ event String
76
+ subjectId String?
77
+ data Json?
78
+ createdAt DateTime @default(now())
79
+ }
80
+
81
+ model ClientAuthSession {
82
+ id String @id @default(cuid())
83
+ browserKeyHash String
84
+ pollSecretHash String
85
+ status AuthSessionStatus @default(pending)
86
+ tenantId String?
87
+ appId String?
88
+ bpUserSubject String?
89
+ bpUserEmail String?
90
+ clientIpHash String?
91
+ userAgentHash String?
92
+ expiresAt DateTime
93
+ approvedAt DateTime?
94
+ consumedAt DateTime?
95
+ createdAt DateTime @default(now())
96
+
97
+ @@index([status, expiresAt])
98
+ }
99
+
100
+ model ClientDeviceToken {
101
+ id String @id @default(cuid())
102
+ accountId String?
103
+ tenantId String
104
+ bpUserSubject String
105
+ tokenHash String @unique
106
+ name String?
107
+ ipRangeHash String
108
+ ipFamily String
109
+ userAgentHash String?
110
+ expiresAt DateTime
111
+ revokedAt DateTime?
112
+ lastUsedAt DateTime?
113
+ createdAt DateTime @default(now())
114
+
115
+ @@index([tenantId, bpUserSubject])
116
+ @@index([expiresAt])
117
+ }
118
+
119
+ enum TunnelStatus {
120
+ created
121
+ active
122
+ draining
123
+ disconnected
124
+ expired
125
+ closed
126
+ }
127
+
128
+ enum AccountPlan {
129
+ anonymous
130
+ free
131
+ paid
132
+ admin
133
+ }
134
+
135
+ enum AuthSessionStatus {
136
+ pending
137
+ approved
138
+ consumed
139
+ expired
140
+ denied
141
+ }