Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/__tests__/bot-commands.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,9 @@ describe("bot messages", () => {
expect(message).toContain("https://example.com/preview/demo-app");
expect(message).not.toContain("Pairing Token:");
expect(message).toContain("1. Запусти bootstrap-команду локально:");
expect(message).toContain("Эту команду можно запускать повторно для этого проекта.");
expect(message).toContain("2. После bootstrap запусти:");
expect(message).toContain("<code>pnpm run dev</code>");
});

it("includes TMA and preview links in launchMessage", () => {
Expand All @@ -61,5 +63,6 @@ describe("bot messages", () => {
expect(message).toContain("Telegram Link:");
expect(message).toContain("Preview URL:");
expect(message).toContain("Tunnel Status:");
expect(message).toContain("<code>pnpm run dev</code>");
});
});
3 changes: 1 addition & 2 deletions src/__tests__/projects.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,9 @@ describe("createProject", () => {
expect(result.project.title).toBe("Test App");
expect(result.project.status).toBe("draft");
expect(result.pairingToken.claimedAt).toBeNull();
expect(result.pairingToken.expiresAt).toBeNull();
expect(result.state.projects).toHaveLength(1);
expect(result.state.pairingTokens).toHaveLength(1);
expect(new Date(result.pairingToken.expiresAt).getTime() - new Date(result.pairingToken.createdAt).getTime())
.toBe(30 * 60 * 1000);
});

it("normalizes slug from title", () => {
Expand Down
7 changes: 4 additions & 3 deletions src/bot/commands.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ export function launchUsageMessage(): string {
export function createdMessage(
slug: string,
bootstrapCmd: string,
pairingToken: string,
_pairingToken: string,
tmaUrl: string,
previewUrl: string,
telegramMiniAppUrl: string,
Expand All @@ -65,9 +65,10 @@ export function createdMessage(
"",
"1. Запусти bootstrap-команду локально:",
`<code>${esc(bootstrapCmd)}</code>`,
"Эту команду можно запускать повторно для этого проекта.",
"",
"2. После bootstrap запусти:",
"<code>npm run dev</code>",
"<code>pnpm run dev</code>",
"",
"Ссылки:",
`Preview URL: ${renderLink(previewUrl)}`,
Expand All @@ -91,6 +92,6 @@ export function launchMessage(
`Telegram Link: ${renderLink(telegramMiniAppUrl)}`,
`Preview URL: ${renderLink(previewUrl)}`,
"",
"Если preview офлайн, подними локально проект командой <code>npm run dev</code>.",
"Если preview офлайн, подними локально проект командой <code>pnpm run dev</code>.",
].join("\n");
}
10 changes: 7 additions & 3 deletions src/projects.ts
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ export function createProject(
token: makeId("pair"),
projectId,
createdAt: now,
expiresAt: addMinutes(now, 30),
expiresAt: null,
claimedAt: null,
claimedDeviceId: null,
};
Expand Down Expand Up @@ -97,7 +97,9 @@ export function inspectPairingToken(
const project = state.projects.find((p) => p.id === tokenRecord.projectId) ?? null;
if (!project) return { error: "ProjectNotFound" };
if (tokenRecord.claimedAt) return { error: "TokenAlreadyClaimed" };
if (Date.parse(tokenRecord.expiresAt) <= Date.now()) return { error: "TokenExpired" };
if (tokenRecord.expiresAt !== null && Date.parse(tokenRecord.expiresAt) <= Date.now()) {
return { error: "TokenExpired" };
}

return {
project,
Expand Down Expand Up @@ -135,7 +137,9 @@ export function claimPairingToken(
};
}

if (Date.parse(tokenRecord.expiresAt) <= Date.now()) return { error: "TokenExpired" };
if (tokenRecord.expiresAt !== null && Date.parse(tokenRecord.expiresAt) <= Date.now()) {
return { error: "TokenExpired" };
}

const deviceId = makeId("device");
const deviceSecret = makeId("secret");
Expand Down
2 changes: 1 addition & 1 deletion src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ export interface PairingToken {
token: string;
projectId: string;
createdAt: string;
expiresAt: string;
expiresAt: string | null;
claimedAt: string | null;
claimedDeviceId: string | null;
}
Expand Down