@vex-chat/spire 2.5.0 → 2.6.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/dist/BillingVerification.d.ts +40 -0
- package/dist/BillingVerification.js +535 -0
- package/dist/BillingVerification.js.map +1 -0
- package/dist/ClientManager.js +1 -8
- package/dist/ClientManager.js.map +1 -1
- package/dist/Database.d.ts +41 -4
- package/dist/Database.js +285 -8
- package/dist/Database.js.map +1 -1
- package/dist/NotificationService.d.ts +0 -2
- package/dist/NotificationService.js +4 -321
- package/dist/NotificationService.js.map +1 -1
- package/dist/Spire.js +5 -21
- package/dist/Spire.js.map +1 -1
- package/dist/db/schema.d.ts +50 -0
- package/dist/migrations/2026-06-24_account-entitlements.d.ts +8 -0
- package/dist/migrations/2026-06-24_account-entitlements.js +20 -0
- package/dist/migrations/2026-06-24_account-entitlements.js.map +1 -0
- package/dist/migrations/2026-07-02_store-subscriptions.d.ts +8 -0
- package/dist/migrations/2026-07-02_store-subscriptions.js +83 -0
- package/dist/migrations/2026-07-02_store-subscriptions.js.map +1 -0
- package/dist/server/billing.d.ts +14 -0
- package/dist/server/billing.js +234 -0
- package/dist/server/billing.js.map +1 -0
- package/dist/server/entitlements.d.ts +8 -0
- package/dist/server/entitlements.js +71 -0
- package/dist/server/entitlements.js.map +1 -0
- package/dist/server/index.js +6 -0
- package/dist/server/index.js.map +1 -1
- package/package.json +4 -4
- package/src/BillingVerification.ts +800 -0
- package/src/ClientManager.ts +9 -23
- package/src/Database.ts +423 -12
- package/src/NotificationService.ts +4 -428
- package/src/Spire.ts +21 -52
- package/src/__tests__/Database.spec.ts +6 -3
- package/src/__tests__/billing.spec.ts +282 -0
- package/src/__tests__/entitlements.spec.ts +241 -0
- package/src/__tests__/notifyFanout.spec.ts +0 -136
- package/src/db/schema.ts +66 -1
- package/src/migrations/2026-06-24_account-entitlements.ts +23 -0
- package/src/migrations/2026-07-02_store-subscriptions.ts +92 -0
- package/src/server/billing.ts +361 -0
- package/src/server/entitlements.ts +104 -0
- package/src/server/index.ts +6 -0
- package/dist/server/callWake.d.ts +0 -13
- package/dist/server/callWake.js +0 -18
- package/dist/server/callWake.js.map +0 -1
- 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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"}
|
package/dist/Database.d.ts
CHANGED
|
@@ -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:
|
|
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:
|
|
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
|
/**
|
|
@@ -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
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
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:
|
|
1577
|
+
channel: "expo",
|
|
1301
1578
|
enabled: Boolean(row.enabled),
|
|
1302
1579
|
events: decodeNotificationEvents(row.events),
|
|
1303
1580
|
};
|