linkshell-cli 0.10.44 → 0.10.46
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/README.md +2 -0
- package/dist/cli/src/auth.js +4 -0
- package/dist/cli/src/auth.js.map +1 -1
- package/dist/cli/src/commands/desktop.d.ts +5 -5
- package/dist/cli/src/commands/desktop.js +67 -5
- package/dist/cli/src/commands/desktop.js.map +1 -1
- package/dist/cli/src/commands/login.js +10 -17
- package/dist/cli/src/commands/login.js.map +1 -1
- package/dist/cli/src/pro-membership.d.ts +16 -0
- package/dist/cli/src/pro-membership.js +91 -0
- package/dist/cli/src/pro-membership.js.map +1 -0
- package/dist/cli/tsconfig.tsbuildinfo +1 -1
- package/dist/client-core/src/pro-membership.d.ts +17 -0
- package/dist/client-core/src/pro-membership.js +107 -0
- package/dist/client-core/src/pro-membership.js.map +1 -0
- package/dist/host/src/drivers/acp/antigravity.js +9 -15
- package/dist/host/src/drivers/acp/antigravity.js.map +1 -1
- package/dist/host/src/drivers/acp/driver.d.ts +2 -0
- package/dist/host/src/drivers/acp/driver.js +18 -6
- package/dist/host/src/drivers/acp/driver.js.map +1 -1
- package/dist/host/src/drivers/claude/transcript.d.ts +6 -0
- package/dist/host/src/host.js +1 -1
- package/dist/host/src/host.js.map +1 -1
- package/dist/host/src/store.d.ts +4 -0
- package/dist/host/src/store.js +10 -0
- package/dist/host/src/store.js.map +1 -1
- package/dist/host/src/usage.d.ts +20 -5
- package/dist/host/src/usage.js +55 -3
- package/dist/host/src/usage.js.map +1 -1
- package/dist/wire/src/rpc.d.ts +190 -3
- package/dist/wire/src/updates.d.ts +68 -0
- package/dist/wire/src/updates.js +2 -0
- package/dist/wire/src/updates.js.map +1 -1
- package/dist/wire/src/usage.d.ts +46 -3
- package/dist/wire/src/usage.js +5 -1
- package/dist/wire/src/usage.js.map +1 -1
- package/package.json +4 -4
- package/src/auth.ts +3 -0
- package/src/commands/desktop.ts +60 -6
- package/src/commands/login.ts +7 -25
- package/src/pro-membership.ts +82 -0
package/README.md
CHANGED
|
@@ -25,6 +25,8 @@ Connect your phone one of two ways:
|
|
|
25
25
|
linkshell pair # scan the QR code in the app
|
|
26
26
|
```
|
|
27
27
|
|
|
28
|
+
Signed-in Free accounts can redeem a Pro activation code in the LinkShell phone app, Mac app or web workspace's account controls, or under Connection Settings → Membership & activation codes in Apple Watch independent mode. [Buy a code on Liandong Xiaopu](https://pay.ldxp.cn/item/7lgv1s). [iTool Settings → Upgrade to Pro](https://itool.tech/en/settings) remains available with the same account, including for renewing an active Pro membership.
|
|
29
|
+
|
|
28
30
|
Start sessions from the phone, or launch agents from your terminal so they can be handed over at any time:
|
|
29
31
|
|
|
30
32
|
```bash
|
package/dist/cli/src/auth.js
CHANGED
|
@@ -72,6 +72,10 @@ export async function refreshAccessToken() {
|
|
|
72
72
|
userId: body.user.id,
|
|
73
73
|
email: body.user.email ?? auth.email,
|
|
74
74
|
};
|
|
75
|
+
// A login or logout may finish while the refresh is in flight.
|
|
76
|
+
const current = loadAuth();
|
|
77
|
+
if (tokens.userId !== auth.userId || current?.userId !== auth.userId || current.refreshToken !== auth.refreshToken)
|
|
78
|
+
return null;
|
|
75
79
|
saveAuth(tokens);
|
|
76
80
|
return tokens;
|
|
77
81
|
}
|
package/dist/cli/src/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/auth.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -235,13 +235,13 @@ export declare function desktopSnapshot(version: string): Promise<{
|
|
|
235
235
|
hasMoreSessions: boolean;
|
|
236
236
|
status: string;
|
|
237
237
|
account: {
|
|
238
|
+
plan: "pro" | "free" | "unknown";
|
|
239
|
+
planExpiresAt: string | null;
|
|
238
240
|
state: string;
|
|
239
241
|
email: string | undefined;
|
|
240
242
|
userId: string;
|
|
241
243
|
} | {
|
|
242
244
|
state: string;
|
|
243
|
-
email?: undefined;
|
|
244
|
-
userId?: undefined;
|
|
245
245
|
};
|
|
246
246
|
schema: number;
|
|
247
247
|
cliVersion: string;
|
|
@@ -253,13 +253,13 @@ export declare function desktopSnapshot(version: string): Promise<{
|
|
|
253
253
|
} | {
|
|
254
254
|
status: string;
|
|
255
255
|
account: {
|
|
256
|
+
plan: "pro" | "free" | "unknown";
|
|
257
|
+
planExpiresAt: string | null;
|
|
256
258
|
state: string;
|
|
257
259
|
email: string | undefined;
|
|
258
260
|
userId: string;
|
|
259
261
|
} | {
|
|
260
262
|
state: string;
|
|
261
|
-
email?: undefined;
|
|
262
|
-
userId?: undefined;
|
|
263
263
|
};
|
|
264
264
|
schema: number;
|
|
265
265
|
cliVersion: string;
|
|
@@ -269,5 +269,5 @@ export declare function desktopSnapshot(version: string): Promise<{
|
|
|
269
269
|
hostOwner: string;
|
|
270
270
|
appBundle: string | undefined;
|
|
271
271
|
}>;
|
|
272
|
-
export declare function runDesktop(version: string, action: string): Promise<void>;
|
|
272
|
+
export declare function runDesktop(version: string, action: string, input?: AsyncIterable<string | Buffer>): Promise<void>;
|
|
273
273
|
export declare function openDesktop(): Promise<void>;
|
|
@@ -10,9 +10,14 @@ import { prepareDesktopUpdate, recoverDesktopUpdate } from "./desktop-update.js"
|
|
|
10
10
|
import { sep } from "node:path";
|
|
11
11
|
import { ensureHostRunning, silenceSqliteWarning, withRunningHost } from "./host.js";
|
|
12
12
|
import { linkshellDir, readHostLaunch, readHostOwner, readPid, stopDaemonAndWait } from "../utils/daemon.js";
|
|
13
|
+
import { cachedMembership, redeemDesktopPro, refreshMembership } from "../pro-membership.js";
|
|
13
14
|
export function installationSource(path) {
|
|
14
15
|
return path.includes(`${sep}Cellar${sep}linkshell${sep}`) ? "homebrew" : "npm";
|
|
15
16
|
}
|
|
17
|
+
function desktopAccount() {
|
|
18
|
+
const auth = loadAuth();
|
|
19
|
+
return auth?.userId ? { state: "signed-in", email: auth.email, userId: auth.userId, ...cachedMembership(auth.userId) } : { state: "signed-out" };
|
|
20
|
+
}
|
|
16
21
|
/** A versioned, read-only snapshot. Missing sections stay unknown, never healthy. */
|
|
17
22
|
export async function desktopSnapshot(version) {
|
|
18
23
|
let executable = process.argv[1];
|
|
@@ -20,8 +25,7 @@ export async function desktopSnapshot(version) {
|
|
|
20
25
|
executable = realpathSync(executable);
|
|
21
26
|
}
|
|
22
27
|
catch { /* Retain the launch path for diagnosis. */ }
|
|
23
|
-
const
|
|
24
|
-
const account = auth?.userId ? { state: "signed-in", email: auth.email, userId: auth.userId } : { state: "signed-out" };
|
|
28
|
+
const account = desktopAccount();
|
|
25
29
|
const base = { account, schema: 1, cliVersion: version, home: linkshellDir(), source: standaloneBundle() ? "standalone" : installationSource(executable), executable, hostOwner: readPid("host") ? readHostOwner(readPid("host")) ?? "external" : "none", appBundle: standaloneBundle() };
|
|
26
30
|
const result = await withRunningHost(async (client) => {
|
|
27
31
|
const machine = await client.call("machine.info", {}, 5000);
|
|
@@ -33,11 +37,69 @@ export async function desktopSnapshot(version) {
|
|
|
33
37
|
});
|
|
34
38
|
return result ? { ...base, status: "running", ...result } : { ...base, status: readPid("host") ? "unreachable" : "stopped" };
|
|
35
39
|
}
|
|
36
|
-
|
|
40
|
+
async function redemptionInput(input) {
|
|
41
|
+
const chunks = [];
|
|
42
|
+
let length = 0;
|
|
43
|
+
for await (const chunk of input) {
|
|
44
|
+
const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
45
|
+
length += buffer.length;
|
|
46
|
+
if (length > 4096)
|
|
47
|
+
throw new Error("激活码内容过长,请检查后重试");
|
|
48
|
+
chunks.push(buffer);
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
const value = JSON.parse(Buffer.concat(chunks).toString("utf8"));
|
|
52
|
+
if (typeof value?.code === "string" && typeof value?.userId === "string" && value.userId.trim())
|
|
53
|
+
return { code: value.code, userId: value.userId };
|
|
54
|
+
}
|
|
55
|
+
catch { /* Never echo an input that contains the activation code. */ }
|
|
56
|
+
throw new Error("激活码请求无效,请刷新账号后重试");
|
|
57
|
+
}
|
|
58
|
+
export async function runDesktop(version, action, input = process.stdin) {
|
|
37
59
|
silenceSqliteWarning();
|
|
38
60
|
try {
|
|
61
|
+
if (action === "redeem-pro") {
|
|
62
|
+
const { code, userId } = await redemptionInput(input);
|
|
63
|
+
const result = await redeemDesktopPro(code, userId);
|
|
64
|
+
if (loadAuth()?.userId === userId) {
|
|
65
|
+
try {
|
|
66
|
+
const gateway = await refreshGateway(15_000);
|
|
67
|
+
if (gateway && gateway.status !== "online" && gateway.status !== "off")
|
|
68
|
+
result.accountWarning ??= "兑换已成功,网关尚未连接,请稍后重新连接";
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
result.accountWarning ??= "兑换已成功,本机服务暂未刷新,请稍后重新连接网关";
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// A host query failing cannot turn a confirmed redemption into a failed redemption.
|
|
75
|
+
const snapshot = await desktopSnapshot(version).catch(() => {
|
|
76
|
+
result.accountWarning ??= "兑换已成功,本机服务状态暂时无法读取,请稍后刷新";
|
|
77
|
+
return { schema: 1, cliVersion: version, status: "unknown", account: desktopAccount() };
|
|
78
|
+
});
|
|
79
|
+
snapshot.account = desktopAccount();
|
|
80
|
+
if (snapshot.account.state === "signed-in" && "userId" in snapshot.account && snapshot.account.userId === userId)
|
|
81
|
+
Object.assign(snapshot.account, { plan: "pro", planExpiresAt: result.redemption.planExpiresAt });
|
|
82
|
+
else
|
|
83
|
+
result.accountWarning = "兑换已成功,登录账号已变更,请切回兑换时的账号查看会员状态";
|
|
84
|
+
process.stdout.write(`${JSON.stringify({ ...snapshot, ...result })}\n`);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (action === "account-refresh")
|
|
88
|
+
await refreshMembership();
|
|
89
|
+
else if (action === "pair") {
|
|
90
|
+
const result = await withRunningHost(async (client) => {
|
|
91
|
+
const gateway = await client.call("gateway.status", {});
|
|
92
|
+
if (gateway.status !== "online")
|
|
93
|
+
throw new Error("请先连接网关。官方网关需要登录 Pro 账号;自建网关可以免登录配对。");
|
|
94
|
+
return client.call("pairing.start", {}, 20_000);
|
|
95
|
+
});
|
|
96
|
+
if (!result)
|
|
97
|
+
throw new Error("请先启动本机服务");
|
|
98
|
+
process.stdout.write(`${JSON.stringify(result)}\n`);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
39
101
|
if (action.startsWith("usage-")) {
|
|
40
|
-
const match = /^usage-(1|7|30)-(
|
|
102
|
+
const match = /^usage-(1|7|30)-(.{1,128})$/.exec(action);
|
|
41
103
|
if (!match)
|
|
42
104
|
throw new Error("无效的用量筛选条件");
|
|
43
105
|
const result = await withRunningHost(client => client.call("usage.summary", { days: Number(match[1]), agent: match[2] }, 120_000));
|
|
@@ -80,7 +142,7 @@ export async function runDesktop(version, action) {
|
|
|
80
142
|
if (action === "restart")
|
|
81
143
|
await ensureHostRunning(env);
|
|
82
144
|
}
|
|
83
|
-
else if (action !== "snapshot")
|
|
145
|
+
else if (action !== "snapshot" && action !== "account-refresh")
|
|
84
146
|
throw new Error("Unknown desktop action");
|
|
85
147
|
process.stdout.write(`${JSON.stringify(await desktopSnapshot(version))}\n`);
|
|
86
148
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"desktop.js","sourceRoot":"","sources":["../../../../src/commands/desktop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACnG,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAChC,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"desktop.js","sourceRoot":"","sources":["../../../../src/commands/desktop.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import * as http from "node:http";
|
|
2
2
|
import { execSync } from "node:child_process";
|
|
3
3
|
import { saveAuth, SUPABASE_URL, SUPABASE_ANON_KEY } from "../auth.js";
|
|
4
|
+
import { cacheMembership } from "../pro-membership.js";
|
|
5
|
+
import { fetchProMembership } from "../../../client-core/src/pro-membership.js";
|
|
4
6
|
const ITOOL_AUTH_URL = "https://itool.tech/en/auth/linkshell";
|
|
5
7
|
export async function runLogin() {
|
|
6
8
|
process.stderr.write("\n LinkShell Login\n\n");
|
|
@@ -51,6 +53,7 @@ export async function runLogin() {
|
|
|
51
53
|
let userId = "";
|
|
52
54
|
let email = "";
|
|
53
55
|
let plan = "free";
|
|
56
|
+
let membership = { plan: "unknown", planExpiresAt: null };
|
|
54
57
|
try {
|
|
55
58
|
const userRes = await fetch(`${SUPABASE_URL}/auth/v1/user`, {
|
|
56
59
|
headers: {
|
|
@@ -63,23 +66,9 @@ export async function runLogin() {
|
|
|
63
66
|
const user = (await userRes.json());
|
|
64
67
|
userId = user.id;
|
|
65
68
|
email = user.email ?? "";
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
Authorization: `Bearer ${accessToken}`,
|
|
70
|
-
apikey: SUPABASE_ANON_KEY,
|
|
71
|
-
},
|
|
72
|
-
signal: AbortSignal.timeout(5_000),
|
|
73
|
-
});
|
|
74
|
-
if (profileRes.ok) {
|
|
75
|
-
const profiles = (await profileRes.json());
|
|
76
|
-
if (profiles.length > 0 &&
|
|
77
|
-
profiles[0].plan === "pro" &&
|
|
78
|
-
profiles[0].plan_expires_at &&
|
|
79
|
-
new Date(profiles[0].plan_expires_at) > new Date()) {
|
|
80
|
-
plan = "pro";
|
|
81
|
-
}
|
|
82
|
-
}
|
|
69
|
+
const profile = await fetchProMembership({ userId, accessToken, supabaseUrl: SUPABASE_URL, anonKey: SUPABASE_ANON_KEY });
|
|
70
|
+
plan = profile.plan;
|
|
71
|
+
membership = { plan: profile.plan, planExpiresAt: profile.expiresAt ?? null };
|
|
83
72
|
}
|
|
84
73
|
}
|
|
85
74
|
catch { }
|
|
@@ -96,6 +85,10 @@ export async function runLogin() {
|
|
|
96
85
|
email,
|
|
97
86
|
};
|
|
98
87
|
saveAuth(tokens);
|
|
88
|
+
try {
|
|
89
|
+
cacheMembership(userId, membership);
|
|
90
|
+
}
|
|
91
|
+
catch { /* A cache write cannot invalidate a completed login. */ }
|
|
99
92
|
res.writeHead(200);
|
|
100
93
|
res.end("ok");
|
|
101
94
|
const planLabel = plan === "pro" ? "\x1b[32mPro\x1b[0m" : "Free";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface DesktopMembership {
|
|
2
|
+
plan: "pro" | "free" | "unknown";
|
|
3
|
+
planExpiresAt: string | null;
|
|
4
|
+
}
|
|
5
|
+
/** Snapshot polling stays offline; the dashboard refreshes this account-scoped cache separately. */
|
|
6
|
+
export declare function cachedMembership(userId: string): DesktopMembership;
|
|
7
|
+
export declare function cacheMembership(userId: string, membership: DesktopMembership, observedAt?: number): void;
|
|
8
|
+
export declare function refreshMembership(): Promise<DesktopMembership>;
|
|
9
|
+
export declare function redeemDesktopPro(code: string, userId: string): Promise<{
|
|
10
|
+
redemption: {
|
|
11
|
+
userId: string;
|
|
12
|
+
idempotent: boolean;
|
|
13
|
+
planExpiresAt: string;
|
|
14
|
+
};
|
|
15
|
+
accountWarning: string | undefined;
|
|
16
|
+
}>;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { fetchProMembership, redeemProCode } from "../../client-core/src/pro-membership.js";
|
|
4
|
+
import { getValidToken, loadAuth, SUPABASE_ANON_KEY, SUPABASE_URL } from "./auth.js";
|
|
5
|
+
import { linkshellDir } from "./utils/daemon.js";
|
|
6
|
+
const unknownMembership = { plan: "unknown", planExpiresAt: null };
|
|
7
|
+
const changedAccount = "登录账号已变更,请刷新账号后重试";
|
|
8
|
+
const cachePath = () => join(linkshellDir(), "account-pro.json");
|
|
9
|
+
/** Snapshot polling stays offline; the dashboard refreshes this account-scoped cache separately. */
|
|
10
|
+
export function cachedMembership(userId) {
|
|
11
|
+
try {
|
|
12
|
+
const value = JSON.parse(readFileSync(cachePath(), "utf8"));
|
|
13
|
+
if (value.userId !== userId || !["pro", "free", "unknown"].includes(value.plan))
|
|
14
|
+
return { ...unknownMembership };
|
|
15
|
+
const expiry = typeof value.planExpiresAt === "string" && Number.isFinite(Date.parse(value.planExpiresAt)) ? value.planExpiresAt : null;
|
|
16
|
+
if (value.plan === "pro" && !expiry)
|
|
17
|
+
return { ...unknownMembership };
|
|
18
|
+
return { plan: value.plan === "pro" ? expiry && Date.parse(expiry) > Date.now() ? "pro" : "free" : value.plan, planExpiresAt: expiry };
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return { ...unknownMembership };
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export function cacheMembership(userId, membership, observedAt = Date.now()) {
|
|
25
|
+
try {
|
|
26
|
+
const previous = JSON.parse(readFileSync(cachePath(), "utf8"));
|
|
27
|
+
// A profile request begun before redemption cannot replace its confirmed result.
|
|
28
|
+
if (previous.userId === userId && previous.observedAt > observedAt)
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
catch { /* There may not be a prior account observation. */ }
|
|
32
|
+
mkdirSync(linkshellDir(), { recursive: true });
|
|
33
|
+
writeFileSync(cachePath(), JSON.stringify({ userId, ...membership, observedAt }) + "\n", { encoding: "utf8", mode: 0o600 });
|
|
34
|
+
}
|
|
35
|
+
async function accountToken(expectedUserId) {
|
|
36
|
+
const auth = loadAuth();
|
|
37
|
+
if (!auth?.userId)
|
|
38
|
+
throw new Error("请先登录账号");
|
|
39
|
+
if (expectedUserId !== undefined && auth.userId !== expectedUserId)
|
|
40
|
+
throw new Error(changedAccount);
|
|
41
|
+
const accessToken = await getValidToken();
|
|
42
|
+
const current = loadAuth();
|
|
43
|
+
if (current?.userId !== auth.userId)
|
|
44
|
+
throw new Error(changedAccount);
|
|
45
|
+
if (!accessToken || current.accessToken !== accessToken)
|
|
46
|
+
throw new Error("登录已失效,请重新登录后再试");
|
|
47
|
+
return { userId: auth.userId, accessToken };
|
|
48
|
+
}
|
|
49
|
+
export async function refreshMembership() {
|
|
50
|
+
const userId = loadAuth()?.userId;
|
|
51
|
+
const observedAt = Date.now();
|
|
52
|
+
try {
|
|
53
|
+
const account = await accountToken(userId);
|
|
54
|
+
const membership = await fetchProMembership({ ...account, supabaseUrl: SUPABASE_URL, anonKey: SUPABASE_ANON_KEY });
|
|
55
|
+
if (loadAuth()?.userId !== account.userId)
|
|
56
|
+
throw new Error(changedAccount);
|
|
57
|
+
const result = { plan: membership.plan, planExpiresAt: membership.expiresAt ?? null };
|
|
58
|
+
cacheMembership(account.userId, result, observedAt);
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
if (userId && loadAuth()?.userId === userId) {
|
|
63
|
+
try {
|
|
64
|
+
cacheMembership(userId, unknownMembership, observedAt);
|
|
65
|
+
}
|
|
66
|
+
catch { /* Preserve the request's error. */ }
|
|
67
|
+
}
|
|
68
|
+
throw error;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
export async function redeemDesktopPro(code, userId) {
|
|
72
|
+
if (!code.trim())
|
|
73
|
+
throw new Error("请输入激活码");
|
|
74
|
+
if (Buffer.byteLength(code, "utf8") > 512)
|
|
75
|
+
throw new Error("激活码内容过长,请检查后重试");
|
|
76
|
+
const account = await accountToken(userId);
|
|
77
|
+
const redeemed = await redeemProCode(account.accessToken, code);
|
|
78
|
+
const redemption = { userId, idempotent: redeemed.idempotent, planExpiresAt: redeemed.expiresAt };
|
|
79
|
+
let accountWarning;
|
|
80
|
+
try {
|
|
81
|
+
if (loadAuth()?.userId === userId)
|
|
82
|
+
cacheMembership(userId, { plan: "pro", planExpiresAt: redeemed.expiresAt });
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
accountWarning = "兑换已成功,会员状态暂未保存,请刷新会员状态";
|
|
86
|
+
}
|
|
87
|
+
if (loadAuth()?.userId !== userId)
|
|
88
|
+
accountWarning = "兑换已成功,登录账号已变更,请切回兑换时的账号查看会员状态";
|
|
89
|
+
return { redemption, accountWarning };
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=pro-membership.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pro-membership.js","sourceRoot":"","sources":["../../../src/pro-membership.ts"],"names":[],"mappings":"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"}
|