@vex-chat/spire 2.5.0 → 3.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 (54) hide show
  1. package/dist/BillingVerification.d.ts +40 -0
  2. package/dist/BillingVerification.js +535 -0
  3. package/dist/BillingVerification.js.map +1 -0
  4. package/dist/ClientManager.js +1 -8
  5. package/dist/ClientManager.js.map +1 -1
  6. package/dist/Database.d.ts +41 -4
  7. package/dist/Database.js +291 -14
  8. package/dist/Database.js.map +1 -1
  9. package/dist/NotificationService.d.ts +0 -2
  10. package/dist/NotificationService.js +4 -321
  11. package/dist/NotificationService.js.map +1 -1
  12. package/dist/Spire.js +43 -52
  13. package/dist/Spire.js.map +1 -1
  14. package/dist/db/schema.d.ts +50 -0
  15. package/dist/migrations/2026-06-24_account-entitlements.d.ts +8 -0
  16. package/dist/migrations/2026-06-24_account-entitlements.js +20 -0
  17. package/dist/migrations/2026-06-24_account-entitlements.js.map +1 -0
  18. package/dist/migrations/2026-07-02_store-subscriptions.d.ts +8 -0
  19. package/dist/migrations/2026-07-02_store-subscriptions.js +83 -0
  20. package/dist/migrations/2026-07-02_store-subscriptions.js.map +1 -0
  21. package/dist/server/billing.d.ts +14 -0
  22. package/dist/server/billing.js +234 -0
  23. package/dist/server/billing.js.map +1 -0
  24. package/dist/server/cliPasskeyPage.js +1 -1
  25. package/dist/server/entitlements.d.ts +8 -0
  26. package/dist/server/entitlements.js +71 -0
  27. package/dist/server/entitlements.js.map +1 -0
  28. package/dist/server/index.js +7 -11
  29. package/dist/server/index.js.map +1 -1
  30. package/dist/server/passkey.js +3 -4
  31. package/dist/server/passkey.js.map +1 -1
  32. package/package.json +4 -4
  33. package/src/BillingVerification.ts +800 -0
  34. package/src/ClientManager.ts +9 -23
  35. package/src/Database.ts +433 -20
  36. package/src/NotificationService.ts +4 -428
  37. package/src/Spire.ts +77 -103
  38. package/src/__tests__/Database.spec.ts +36 -3
  39. package/src/__tests__/billing.spec.ts +282 -0
  40. package/src/__tests__/connectAuth.spec.ts +120 -0
  41. package/src/__tests__/entitlements.spec.ts +241 -0
  42. package/src/__tests__/notifyFanout.spec.ts +0 -136
  43. package/src/db/schema.ts +66 -1
  44. package/src/migrations/2026-06-24_account-entitlements.ts +23 -0
  45. package/src/migrations/2026-07-02_store-subscriptions.ts +92 -0
  46. package/src/server/billing.ts +361 -0
  47. package/src/server/cliPasskeyPage.ts +1 -1
  48. package/src/server/entitlements.ts +104 -0
  49. package/src/server/index.ts +7 -16
  50. package/src/server/passkey.ts +3 -4
  51. package/dist/server/callWake.d.ts +0 -13
  52. package/dist/server/callWake.js +0 -18
  53. package/dist/server/callWake.js.map +0 -1
  54. package/src/server/callWake.ts +0 -30
@@ -1 +1 @@
1
- {"version":3,"file":"ClientManager.js","sourceRoot":"","sources":["../src/ClientManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ClientManager.js","sourceRoot":"","sources":["../src/ClientManager.ts"],"names":[],"mappings":"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"}
@@ -5,15 +5,35 @@
5
5
  */
6
6
  import type { PasskeyRow } from "./db/schema.ts";
7
7
  import type { SpireOptions } from "./Spire.ts";
8
- import type { Channel, Device, DevicePayload, Emoji, FileSQL, Invite, KeyBundle, MailWS, Passkey, Permission, PreKeysWS, RegistrationPayload, Server, UserRecord } from "@vex-chat/types";
8
+ import type { AccountEntitlements, AccountEntitlementSource, AccountTier, BillingAccountState, BillingEnvironment, BillingPlatform, BillingSubscription, BillingSubscriptionStatus, Channel, Device, DevicePayload, Emoji, FileSQL, Invite, KeyBundle, MailWS, Passkey, Permission, PreKeysWS, RegistrationPayload, Server, UserRecord } from "@vex-chat/types";
9
9
  import { EventEmitter } from "events";
10
+ export interface StoreSubscriptionUpsertInput {
11
+ environment: BillingEnvironment;
12
+ expiresAt: null | string;
13
+ externalOriginalID?: null | string | undefined;
14
+ externalTransactionID?: null | string | undefined;
15
+ platform: BillingPlatform;
16
+ productID: string;
17
+ purchaseToken?: null | string | undefined;
18
+ rawPayload: unknown;
19
+ status: BillingSubscriptionStatus;
20
+ storeProductID: string;
21
+ tier: AccountTier;
22
+ userID: string;
23
+ }
24
+ export interface StoreTransactionRecordInput {
25
+ eventType: string;
26
+ externalTransactionID?: null | string | undefined;
27
+ rawPayload: unknown;
28
+ subscriptionID: string;
29
+ userID: string;
30
+ }
10
31
  /** Internal record that includes the hash algorithm discriminator. */
11
32
  export interface InternalUserRecord extends UserRecord {
12
33
  hashAlgo: string;
13
34
  }
14
- export type NotificationChannel = "apnsVoip" | "expo" | "fcmCall";
15
35
  export interface NotificationSubscription {
16
- channel: NotificationChannel;
36
+ channel: "expo";
17
37
  createdAt: string;
18
38
  deviceID: string;
19
39
  enabled: boolean;
@@ -25,7 +45,7 @@ export interface NotificationSubscription {
25
45
  userID: string;
26
46
  }
27
47
  export interface SaveNotificationSubscriptionInput {
28
- channel: NotificationChannel;
48
+ channel: "expo";
29
49
  deviceID: string;
30
50
  events: string[];
31
51
  platform?: null | string;
@@ -101,6 +121,8 @@ export declare class Database extends EventEmitter {
101
121
  markUserSeen(user: UserRecord): Promise<void>;
102
122
  /** Deletes server-side mail older than the configured retention window. */
103
123
  pruneExpiredMail(): Promise<void>;
124
+ recalculateStoreEntitlements(userID: string): Promise<AccountEntitlements>;
125
+ recordStoreTransaction(input: StoreTransactionRecordInput): Promise<void>;
104
126
  recoverDevice(owner: string, payload: DevicePayload, passkeyApproval?: DevicePasskeyApprovalInput): Promise<{
105
127
  device: Device;
106
128
  revokedDeviceIDs: string[];
@@ -112,6 +134,7 @@ export declare class Database extends EventEmitter {
112
134
  userID: string;
113
135
  }): Promise<boolean>;
114
136
  replacePreKey(userID: string, deviceID: string, preKey: PreKeysWS): Promise<void>;
137
+ retrieveAccountEntitlements(userID: string): Promise<AccountEntitlements>;
115
138
  /**
116
139
  * Retrives a list of users that should be notified when a specific resourceID
117
140
  * experiences changes.
@@ -119,6 +142,8 @@ export declare class Database extends EventEmitter {
119
142
  * @param resourceID
120
143
  */
121
144
  retrieveAffectedUsers(resourceID: string): Promise<UserRecord[]>;
145
+ retrieveBillingAccountState(userID: string): Promise<BillingAccountState>;
146
+ retrieveBillingSubscriptions(userID: string): Promise<BillingSubscription[]>;
122
147
  retrieveChannel(channelID: string): Promise<Channel | null>;
123
148
  retrieveChannels(serverID: string): Promise<Channel[]>;
124
149
  retrieveDevice(deviceID: string): Promise<Device | null>;
@@ -160,6 +185,12 @@ export declare class Database extends EventEmitter {
160
185
  }>;
161
186
  retrieveServerInvites(serverID: string): Promise<Invite[]>;
162
187
  retrieveServers(userID: string): Promise<Server[]>;
188
+ retrieveStoreSubscriptionOwner(args: {
189
+ environment: BillingEnvironment;
190
+ externalOriginalID?: null | string | undefined;
191
+ platform: BillingPlatform;
192
+ purchaseToken?: null | string | undefined;
193
+ }): Promise<null | string>;
163
194
  retrieveUser(userIdentifier: string): Promise<InternalUserRecord | null>;
164
195
  /**
165
196
  * All devices for the given user ID(s), **no in-process cache** — a prior
@@ -178,6 +209,12 @@ export declare class Database extends EventEmitter {
178
209
  }[]): Promise<void>;
179
210
  saveNotificationSubscription(input: SaveNotificationSubscriptionInput): Promise<NotificationSubscription>;
180
211
  saveOTK(userID: string, deviceID: string, otks: PreKeysWS[]): Promise<void>;
212
+ setAccountEntitlementTier(userID: string, tier: AccountTier, options?: {
213
+ expiresAt?: null | string | undefined;
214
+ source?: AccountEntitlementSource | undefined;
215
+ }): Promise<AccountEntitlements>;
216
+ upsertStoreSubscription(input: StoreSubscriptionUpsertInput): Promise<BillingSubscription>;
217
+ private findExistingStoreSubscription;
181
218
  private init;
182
219
  private mailSqlEntry;
183
220
  }
package/dist/Database.js CHANGED
@@ -12,13 +12,13 @@ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExte
12
12
  return path;
13
13
  };
14
14
  import { EventEmitter } from "events";
15
- import { pbkdf2Sync } from "node:crypto";
15
+ import { createHash, pbkdf2Sync } from "node:crypto";
16
16
  import { statSync } from "node:fs";
17
17
  import * as fs from "node:fs/promises";
18
18
  import path from "node:path";
19
19
  import { fileURLToPath, pathToFileURL } from "node:url";
20
20
  import { fipsEcdhRawPublicKeyFromEcdsaSpkiAsync, getCryptoProfile, XUtils, } from "@vex-chat/crypto";
21
- import { MailType } from "@vex-chat/types";
21
+ import { AccountEntitlementSourceSchema, AccountTierSchema, BillingEnvironmentSchema, BillingPlatformSchema, BillingSubscriptionStatusSchema, buildAccountEntitlements, MailType, } from "@vex-chat/types";
22
22
  import argon2 from "argon2";
23
23
  import { serverMailRetentionCutoffIso } from "./mailRetention.js";
24
24
  /**
@@ -285,11 +285,11 @@ export class Database extends EventEmitter {
285
285
  try {
286
286
  const userID = uuidStringify(regKey);
287
287
  const username = normalizeRegistrationUsername(regPayload.username, userID);
288
- const passwordHash = typeof regPayload.password === "string" &&
289
- regPayload.password.length > 0
290
- ? await hashPasswordArgon2(regPayload.password)
291
- : "";
292
- const hashAlgo = passwordHash.length > 0 ? "argon2id" : "keycluster";
288
+ if (typeof regPayload.password !== "string" ||
289
+ regPayload.password.trim().length === 0) {
290
+ throw new Error("Password is required to register a new account.");
291
+ }
292
+ const passwordHash = await hashPasswordArgon2(regPayload.password);
293
293
  const user = {
294
294
  lastSeen: new Date().toISOString(),
295
295
  passwordHash,
@@ -301,7 +301,7 @@ export class Database extends EventEmitter {
301
301
  .insertInto("users")
302
302
  .values({
303
303
  ...user,
304
- hashAlgo,
304
+ hashAlgo: "argon2id",
305
305
  lastSeen: user.lastSeen,
306
306
  })
307
307
  .execute();
@@ -623,6 +623,65 @@ export class Database extends EventEmitter {
623
623
  .where("time", "<", cutoff)
624
624
  .executeTakeFirst();
625
625
  }
626
+ async recalculateStoreEntitlements(userID) {
627
+ const subscriptions = await this.retrieveBillingSubscriptions(userID);
628
+ const nowMs = Date.now();
629
+ const active = subscriptions
630
+ .filter((subscription) => billingStatusCarriesEntitlement(subscription.status))
631
+ .filter((subscription) => {
632
+ if (!subscription.expiresAt) {
633
+ return true;
634
+ }
635
+ const expiresAtMs = Date.parse(subscription.expiresAt);
636
+ return Number.isFinite(expiresAtMs) && expiresAtMs > nowMs;
637
+ })
638
+ .sort((a, b) => {
639
+ const tierDelta = accountTierRank(b.tier) - accountTierRank(a.tier);
640
+ if (tierDelta !== 0) {
641
+ return tierDelta;
642
+ }
643
+ return expiryRank(b.expiresAt) - expiryRank(a.expiresAt);
644
+ });
645
+ const best = active[0];
646
+ if (best) {
647
+ return this.setAccountEntitlementTier(userID, best.tier, {
648
+ expiresAt: best.expiresAt,
649
+ source: "store",
650
+ });
651
+ }
652
+ const current = await this.retrieveAccountEntitlements(userID);
653
+ if (current.source !== "store") {
654
+ return current;
655
+ }
656
+ return this.setAccountEntitlementTier(userID, "free", {
657
+ expiresAt: null,
658
+ source: "store",
659
+ });
660
+ }
661
+ async recordStoreTransaction(input) {
662
+ const subscription = await this.db
663
+ .selectFrom("billing_store_subscriptions")
664
+ .selectAll()
665
+ .where("subscriptionID", "=", input.subscriptionID)
666
+ .limit(1)
667
+ .executeTakeFirstOrThrow();
668
+ await this.db
669
+ .insertInto("billing_store_transactions")
670
+ .values({
671
+ environment: subscription.environment,
672
+ eventType: input.eventType,
673
+ externalTransactionID: input.externalTransactionID ?? null,
674
+ platform: subscription.platform,
675
+ processedAt: new Date().toISOString(),
676
+ purchaseTokenHash: subscription.purchaseTokenHash,
677
+ rawPayload: JSON.stringify(input.rawPayload),
678
+ storeProductID: subscription.storeProductID,
679
+ subscriptionID: input.subscriptionID,
680
+ transactionID: crypto.randomUUID(),
681
+ userID: input.userID,
682
+ })
683
+ .execute();
684
+ }
626
685
  async recoverDevice(owner, payload, passkeyApproval) {
627
686
  const now = new Date().toISOString();
628
687
  const device = {
@@ -735,6 +794,24 @@ export class Database extends EventEmitter {
735
794
  await trx.insertInto("preKeys").values(newPreKey).execute();
736
795
  });
737
796
  }
797
+ async retrieveAccountEntitlements(userID) {
798
+ const row = await this.db
799
+ .selectFrom("account_entitlements")
800
+ .selectAll()
801
+ .where("userID", "=", userID)
802
+ .limit(1)
803
+ .executeTakeFirst();
804
+ if (!row) {
805
+ return buildAccountEntitlements({ userID });
806
+ }
807
+ return buildAccountEntitlements({
808
+ expiresAt: row.expiresAt,
809
+ refreshedAt: row.updatedAt,
810
+ source: parseAccountEntitlementSource(row.source),
811
+ tier: parseAccountTier(row.tier),
812
+ userID,
813
+ });
814
+ }
738
815
  /**
739
816
  * Retrives a list of users that should be notified when a specific resourceID
740
817
  * experiences changes.
@@ -752,6 +829,21 @@ export class Database extends EventEmitter {
752
829
  }
753
830
  return users;
754
831
  }
832
+ async retrieveBillingAccountState(userID) {
833
+ return {
834
+ entitlements: await this.retrieveAccountEntitlements(userID),
835
+ subscriptions: await this.retrieveBillingSubscriptions(userID),
836
+ };
837
+ }
838
+ async retrieveBillingSubscriptions(userID) {
839
+ const rows = await this.db
840
+ .selectFrom("billing_store_subscriptions")
841
+ .selectAll()
842
+ .where("userID", "=", userID)
843
+ .orderBy("updatedAt", "desc")
844
+ .execute();
845
+ return rows.map(toBillingSubscription);
846
+ }
755
847
  async retrieveChannel(channelID) {
756
848
  const channels = await this.db
757
849
  .selectFrom("channels")
@@ -1057,6 +1149,27 @@ export class Database extends EventEmitter {
1057
1149
  .execute();
1058
1150
  return rows.map(toServer);
1059
1151
  }
1152
+ async retrieveStoreSubscriptionOwner(args) {
1153
+ const purchaseTokenHash = args.purchaseToken
1154
+ ? billingPurchaseTokenHash(args.platform, args.environment, args.purchaseToken)
1155
+ : null;
1156
+ const existing = await this.findExistingStoreSubscription({
1157
+ environment: args.environment,
1158
+ externalOriginalID: args.externalOriginalID ?? null,
1159
+ platform: args.platform,
1160
+ purchaseTokenHash,
1161
+ });
1162
+ if (!existing) {
1163
+ return null;
1164
+ }
1165
+ const row = await this.db
1166
+ .selectFrom("billing_store_subscriptions")
1167
+ .select(["userID"])
1168
+ .where("subscriptionID", "=", existing.subscriptionID)
1169
+ .limit(1)
1170
+ .executeTakeFirst();
1171
+ return row?.userID ?? null;
1172
+ }
1060
1173
  // The identifier is matched as either a userID (UUID branch) or a
1061
1174
  // username (string branch). Username comparison is case-folded so
1062
1175
  // `User` and `user` resolve to the same row regardless of how the
@@ -1179,6 +1292,116 @@ export class Database extends EventEmitter {
1179
1292
  await this.db.insertInto("oneTimeKeys").values(newOTK).execute();
1180
1293
  }
1181
1294
  }
1295
+ async setAccountEntitlementTier(userID, tier, options) {
1296
+ const parsedTier = AccountTierSchema.parse(tier);
1297
+ const source = AccountEntitlementSourceSchema.parse(options?.source ?? "dev_override");
1298
+ const expiresAt = options?.expiresAt ?? null;
1299
+ const updatedAt = new Date().toISOString();
1300
+ await this.db
1301
+ .insertInto("account_entitlements")
1302
+ .values({
1303
+ expiresAt,
1304
+ source,
1305
+ tier: parsedTier,
1306
+ updatedAt,
1307
+ userID,
1308
+ })
1309
+ .onConflict((oc) => oc.column("userID").doUpdateSet({
1310
+ expiresAt,
1311
+ source,
1312
+ tier: parsedTier,
1313
+ updatedAt,
1314
+ }))
1315
+ .execute();
1316
+ return buildAccountEntitlements({
1317
+ expiresAt,
1318
+ refreshedAt: updatedAt,
1319
+ source,
1320
+ tier: parsedTier,
1321
+ userID,
1322
+ });
1323
+ }
1324
+ async upsertStoreSubscription(input) {
1325
+ const now = new Date().toISOString();
1326
+ const purchaseTokenHash = input.purchaseToken
1327
+ ? billingPurchaseTokenHash(input.platform, input.environment, input.purchaseToken)
1328
+ : null;
1329
+ const existing = await this.findExistingStoreSubscription({
1330
+ environment: input.environment,
1331
+ externalOriginalID: input.externalOriginalID ?? null,
1332
+ platform: input.platform,
1333
+ purchaseTokenHash,
1334
+ });
1335
+ const subscriptionID = existing?.subscriptionID ?? crypto.randomUUID();
1336
+ const row = {
1337
+ environment: input.environment,
1338
+ expiresAt: input.expiresAt,
1339
+ externalOriginalID: input.externalOriginalID ?? null,
1340
+ externalTransactionID: input.externalTransactionID ?? null,
1341
+ platform: input.platform,
1342
+ productID: input.productID,
1343
+ purchaseToken: input.purchaseToken ?? null,
1344
+ purchaseTokenHash,
1345
+ rawPayload: JSON.stringify(input.rawPayload),
1346
+ status: input.status,
1347
+ storeProductID: input.storeProductID,
1348
+ tier: input.tier,
1349
+ updatedAt: now,
1350
+ userID: input.userID,
1351
+ };
1352
+ if (existing) {
1353
+ await this.db
1354
+ .updateTable("billing_store_subscriptions")
1355
+ .set(row)
1356
+ .where("subscriptionID", "=", subscriptionID)
1357
+ .execute();
1358
+ }
1359
+ else {
1360
+ await this.db
1361
+ .insertInto("billing_store_subscriptions")
1362
+ .values({
1363
+ ...row,
1364
+ createdAt: now,
1365
+ subscriptionID,
1366
+ })
1367
+ .execute();
1368
+ }
1369
+ const saved = await this.db
1370
+ .selectFrom("billing_store_subscriptions")
1371
+ .selectAll()
1372
+ .where("subscriptionID", "=", subscriptionID)
1373
+ .executeTakeFirstOrThrow();
1374
+ return toBillingSubscription(saved);
1375
+ }
1376
+ async findExistingStoreSubscription(args) {
1377
+ if (args.externalOriginalID) {
1378
+ const byOriginal = await this.db
1379
+ .selectFrom("billing_store_subscriptions")
1380
+ .select(["subscriptionID"])
1381
+ .where("platform", "=", args.platform)
1382
+ .where("environment", "=", args.environment)
1383
+ .where("externalOriginalID", "=", args.externalOriginalID)
1384
+ .limit(1)
1385
+ .executeTakeFirst();
1386
+ if (byOriginal) {
1387
+ return byOriginal;
1388
+ }
1389
+ }
1390
+ if (args.purchaseTokenHash) {
1391
+ const byToken = await this.db
1392
+ .selectFrom("billing_store_subscriptions")
1393
+ .select(["subscriptionID"])
1394
+ .where("platform", "=", args.platform)
1395
+ .where("environment", "=", args.environment)
1396
+ .where("purchaseTokenHash", "=", args.purchaseTokenHash)
1397
+ .limit(1)
1398
+ .executeTakeFirst();
1399
+ if (byToken) {
1400
+ return byToken;
1401
+ }
1402
+ }
1403
+ return null;
1404
+ }
1182
1405
  async init() {
1183
1406
  const migrator = new Migrator({
1184
1407
  db: this.db,
@@ -1246,6 +1469,38 @@ export async function verifyPassword(password, stored) {
1246
1469
  const valid = timingSafeEqual(computed, storedBuf);
1247
1470
  return { needsRehash: valid, valid };
1248
1471
  }
1472
+ function accountTierRank(tier) {
1473
+ switch (tier) {
1474
+ case "free":
1475
+ return 0;
1476
+ case "plus":
1477
+ return 1;
1478
+ case "pro":
1479
+ return 2;
1480
+ }
1481
+ }
1482
+ function billingEnvironmentFromRow(environment) {
1483
+ const parsed = BillingEnvironmentSchema.safeParse(environment);
1484
+ return parsed.success ? parsed.data : "production";
1485
+ }
1486
+ function billingPlatformFromRow(platform) {
1487
+ const parsed = BillingPlatformSchema.safeParse(platform);
1488
+ return parsed.success ? parsed.data : "apple_app_store";
1489
+ }
1490
+ function billingPurchaseTokenHash(platform, environment, token) {
1491
+ return createHash("sha256")
1492
+ .update(`${platform}:${environment}:${token}`)
1493
+ .digest("hex");
1494
+ }
1495
+ function billingStatusCarriesEntitlement(status) {
1496
+ return (status === "active" ||
1497
+ status === "billing_retry" ||
1498
+ status === "grace_period");
1499
+ }
1500
+ function billingSubscriptionStatusFromRow(status) {
1501
+ const parsed = BillingSubscriptionStatusSchema.safeParse(status);
1502
+ return parsed.success ? parsed.data : "pending";
1503
+ }
1249
1504
  function decodeNotificationEvents(events) {
1250
1505
  try {
1251
1506
  const parsed = JSON.parse(events);
@@ -1263,6 +1518,13 @@ function encodeNotificationEvents(events) {
1263
1518
  const unique = [...new Set(events.map((event) => event.trim()))].filter((event) => event.length > 0);
1264
1519
  return JSON.stringify(unique.length > 0 ? unique : ["mail"]);
1265
1520
  }
1521
+ function expiryRank(expiresAt) {
1522
+ if (!expiresAt) {
1523
+ return Number.MAX_SAFE_INTEGER;
1524
+ }
1525
+ const value = Date.parse(expiresAt);
1526
+ return Number.isFinite(value) ? value : 0;
1527
+ }
1266
1528
  // Mirrors `Spire.normalizeRegistrationUsername` — kept in sync so a
1267
1529
  // caller invoking `createUser` directly (e.g. tests, future internal
1268
1530
  // flows) gets the same lowercase canonicalization the public
@@ -1276,11 +1538,26 @@ function normalizeRegistrationUsername(providedUsername, userID) {
1276
1538
  const seed = userID.replaceAll("-", "").slice(0, 12);
1277
1539
  return `key_${seed}`;
1278
1540
  }
1279
- function parseNotificationChannel(channel) {
1280
- if (channel === "apnsVoip" || channel === "expo" || channel === "fcmCall") {
1281
- return channel;
1282
- }
1283
- return "expo";
1541
+ function parseAccountEntitlementSource(source) {
1542
+ const parsed = AccountEntitlementSourceSchema.safeParse(source);
1543
+ return parsed.success ? parsed.data : "default";
1544
+ }
1545
+ function parseAccountTier(tier) {
1546
+ const parsed = AccountTierSchema.safeParse(tier);
1547
+ return parsed.success ? parsed.data : "free";
1548
+ }
1549
+ function toBillingSubscription(row) {
1550
+ return {
1551
+ environment: billingEnvironmentFromRow(row.environment),
1552
+ expiresAt: row.expiresAt,
1553
+ platform: billingPlatformFromRow(row.platform),
1554
+ productID: row.productID,
1555
+ status: billingSubscriptionStatusFromRow(row.status),
1556
+ storeProductID: row.storeProductID,
1557
+ subscriptionID: row.subscriptionID,
1558
+ tier: parseAccountTier(row.tier),
1559
+ updatedAt: row.updatedAt,
1560
+ };
1284
1561
  }
1285
1562
  function toDevice(row) {
1286
1563
  return { ...row, deleted: Boolean(row.deleted) };
@@ -1297,7 +1574,7 @@ function toMailSQL(row) {
1297
1574
  function toNotificationSubscription(row) {
1298
1575
  return {
1299
1576
  ...row,
1300
- channel: parseNotificationChannel(row.channel),
1577
+ channel: "expo",
1301
1578
  enabled: Boolean(row.enabled),
1302
1579
  events: decodeNotificationEvents(row.events),
1303
1580
  };