Open History to see the last commit
1import type {
2 RelayAgentActivityAggregateState,
3 RelayAgentActivityState,
4 RelayAgentAwarenessPreferences,
5 RelayManagedEndpointOrigin,
6} from "@t3tools/contracts/relay";
7import {
8 bigint,
9 boolean,
10 index,
11 integer,
12 jsonb,
13 pgTable,
14 primaryKey,
15 text,
16 uniqueIndex,
17 varchar,
18} from "drizzle-orm/pg-core";
19
20export const relayMobileDevices = pgTable(
21 "relay_mobile_devices",
22 {
23 userId: varchar("user_id", { length: 255 }).notNull(),
24 deviceId: varchar("device_id", { length: 255 }).notNull(),
25 label: text("label").notNull().default("iOS device"),
26 platform: varchar("platform", { length: 16 }).notNull().$type<"ios" | "android">(),
27 iosMajorVersion: integer("ios_major_version"),
28 androidApiLevel: integer("android_api_level"),
29 appVersion: varchar("app_version", { length: 64 }),
30 bundleId: varchar("bundle_id", { length: 255 }),
31 apsEnvironment: varchar("aps_environment", { length: 16 }).$type<"sandbox" | "production">(),
32 pushToken: text("push_token"),
33 pushToStartToken: text("push_to_start_token"),
34 preferencesJson: jsonb("preferences_json").notNull().$type<RelayAgentAwarenessPreferences>(),
35 createdAt: varchar("created_at", { length: 64 }).notNull(),
36 updatedAt: varchar("updated_at", { length: 64 }).notNull(),
37 },
38 (table) => [
39 primaryKey({ columns: [table.userId, table.deviceId] }),
40 uniqueIndex("idx_relay_mobile_devices_push_token").on(table.pushToken),
41 uniqueIndex("idx_relay_mobile_devices_push_to_start_token").on(table.pushToStartToken),
42 ],
43);
44
45export const relayLiveActivities = pgTable(
46 "relay_live_activities",
47 {
48 userId: varchar("user_id", { length: 255 }).notNull(),
49 deviceId: varchar("device_id", { length: 255 }).notNull(),
50 activityPushToken: text("activity_push_token"),
51 remoteStartQueuedAt: varchar("remote_start_queued_at", { length: 64 }),
52 remoteStartedAt: varchar("remote_started_at", { length: 64 }),
53 endedAt: varchar("ended_at", { length: 64 }),
54 lastAggregateJson: jsonb("last_aggregate_json").$type<RelayAgentActivityAggregateState>(),
55 lastLiveActivityDeliveryAt: varchar("last_live_activity_delivery_at", { length: 64 }),
56 createdAt: varchar("created_at", { length: 64 }).notNull(),
57 updatedAt: varchar("updated_at", { length: 64 }).notNull(),
58 },
59 (table) => [
60 primaryKey({ columns: [table.userId, table.deviceId] }),
61 uniqueIndex("idx_relay_live_activities_activity_push_token").on(table.activityPushToken),
62 ],
63);
64
65export const relayEnvironmentLinks = pgTable(
66 "relay_environment_links",
67 {
68 userId: varchar("user_id", { length: 191 }).notNull(),
69 environmentId: varchar("environment_id", { length: 191 }).notNull(),
70 environmentLabel: text("environment_label").notNull().default("T3 Environment"),
71 environmentPublicKey: text("environment_public_key").notNull(),
72 endpointHttpBaseUrl: text("endpoint_http_base_url").notNull(),
73 endpointWsBaseUrl: text("endpoint_ws_base_url").notNull(),
74 endpointProviderKind: varchar("endpoint_provider_kind", { length: 32 }).notNull(),
75 notificationsEnabled: boolean("notifications_enabled").notNull().default(true),
76 liveActivitiesEnabled: boolean("live_activities_enabled").notNull().default(true),
77 managedTunnelsEnabled: boolean("managed_tunnels_enabled").notNull().default(false),
78 holdWebhooksWhileOffline: boolean("hold_webhooks_while_offline").notNull().default(false),
79 createdByDeviceId: varchar("created_by_device_id", { length: 191 }),
80 revokedAt: varchar("revoked_at", { length: 64 }),
81 createdAt: varchar("created_at", { length: 64 }).notNull(),
82 updatedAt: varchar("updated_at", { length: 64 }).notNull(),
83 },
84 (table) => [
85 primaryKey({ columns: [table.userId, table.environmentId] }),
86 index("idx_relay_environment_links_environment").on(table.environmentId, table.revokedAt),
87 ],
88);
89
90export const relayManagedEndpointAllocations = pgTable(
91 "relay_managed_endpoint_allocations",
92 {
93 userId: varchar("user_id", { length: 191 }).notNull(),
94 environmentId: varchar("environment_id", { length: 191 }).notNull(),
95 hostname: text("hostname").notNull(),
96 tunnelId: varchar("tunnel_id", { length: 191 }),
97 tunnelName: text("tunnel_name").notNull(),
98 dnsRecordId: varchar("dns_record_id", { length: 191 }),
99 readyAt: varchar("ready_at", { length: 64 }),
100 recoveryEnabledAt: varchar("recovery_enabled_at", { length: 64 }),
101 recoveryEnvironmentPublicKey: text("recovery_environment_public_key"),
102 tunnelReleasedAt: varchar("tunnel_released_at", { length: 64 }),
103 origin: jsonb("origin").$type<RelayManagedEndpointOrigin>(),
104 generation: integer("generation").notNull().default(0),
105 createdAt: varchar("created_at", { length: 64 }).notNull(),
106 updatedAt: varchar("updated_at", { length: 64 }).notNull(),
107 },
108 (table) => [
109 primaryKey({ columns: [table.userId, table.environmentId] }),
110 uniqueIndex("idx_relay_managed_endpoint_allocations_hostname").on(table.hostname),
111 uniqueIndex("idx_relay_managed_endpoint_allocations_tunnel_name").on(table.tunnelName),
112 ],
113);
114
115// One row per upstream API whose rate limit is shared by every Worker
116// isolate, so a 429 seen by one isolate pauses the rest.
117export const relayUpstreamApiPauses = pgTable("relay_upstream_api_pauses", {
118 api: varchar("api", { length: 64 }).primaryKey(),
119 pausedUntilMs: bigint("paused_until_ms", { mode: "number" }).notNull(),
120});
121
122export const relayManagedTunnelLimits = pgTable("relay_managed_tunnel_limits", {
123 userId: varchar("user_id", { length: 191 }).primaryKey(),
124 maxTunnels: integer("max_tunnels").notNull(),
125 createdAt: varchar("created_at", { length: 64 }).notNull(),
126 updatedAt: varchar("updated_at", { length: 64 }).notNull(),
127});
128
129export const relayEnvironmentCredentials = pgTable(
130 "relay_environment_credentials",
131 {
132 credentialId: varchar("credential_id", { length: 64 }).primaryKey(),
133 environmentId: varchar("environment_id", { length: 191 }).notNull(),
134 environmentPublicKey: text("environment_public_key").notNull(),
135 credentialHash: varchar("credential_hash", { length: 191 }).notNull(),
136 revokedAt: varchar("revoked_at", { length: 64 }),
137 createdAt: varchar("created_at", { length: 64 }).notNull(),
138 updatedAt: varchar("updated_at", { length: 64 }).notNull(),
139 },
140 (table) => [
141 uniqueIndex("idx_relay_environment_credentials_hash").on(table.credentialHash),
142 index("idx_relay_environment_credentials_environment_key").on(
143 table.environmentId,
144 table.environmentPublicKey,
145 table.revokedAt,
146 ),
147 ],
148);
149
150export const relayAgentActivityRows = pgTable(
151 "relay_agent_activity_rows",
152 {
153 environmentId: varchar("environment_id", { length: 191 }).notNull(),
154 environmentPublicKey: text("environment_public_key").notNull(),
155 threadId: varchar("thread_id", { length: 512 }).notNull(),
156 stateJson: jsonb("state_json").notNull().$type<RelayAgentActivityState>(),
157 updatedAt: varchar("updated_at", { length: 64 }).notNull(),
158 createdAt: varchar("created_at", { length: 64 }).notNull(),
159 },
160 (table) => [
161 primaryKey({ columns: [table.environmentId, table.environmentPublicKey, table.threadId] }),
162 ],
163);
164
165export const relayDeliveryAttempts = pgTable(
166 "relay_delivery_attempts",
167 {
168 id: varchar("id", { length: 36 }).primaryKey(),
169 createdAt: varchar("created_at", { length: 64 }).notNull(),
170 userId: varchar("user_id", { length: 255 }),
171 environmentId: varchar("environment_id", { length: 191 }),
172 threadId: varchar("thread_id", { length: 512 }),
173 deviceId: varchar("device_id", { length: 255 }),
174 kind: varchar("kind", { length: 64 }).notNull(),
175 sourceJobId: varchar("source_job_id", { length: 64 }),
176 tokenSuffix: varchar("token_suffix", { length: 16 }),
177 apnsStatus: integer("apns_status"),
178 apnsReason: text("apns_reason"),
179 apnsId: varchar("apns_id", { length: 128 }),
180 transportError: text("transport_error"),
181 },
182 (table) => [
183 index("idx_relay_delivery_attempts_created").on(table.createdAt),
184 uniqueIndex("idx_relay_delivery_attempts_source_job").on(table.sourceJobId),
185 ],
186);
187
188export const relayDpopProofs = pgTable(
189 "relay_dpop_proofs",
190 {
191 thumbprint: varchar("thumbprint", { length: 128 }).notNull(),
192 jti: varchar("jti", { length: 255 }).notNull(),
193 iat: integer("iat").notNull(),
194 expiresAt: varchar("expires_at", { length: 64 }).notNull(),
195 createdAt: varchar("created_at", { length: 64 }).notNull(),
196 },
197 (table) => [
198 primaryKey({ columns: [table.thumbprint, table.jti] }),
199 index("idx_relay_dpop_proofs_expires_at").on(table.expiresAt),
200 ],
201);