Prepare time-bound Setup URI integration for Commonlib release

Add Time-bound and Compatible generation to the Obsidian dialogue, browser peer check, and setup tools, with boundary and compatibility coverage. Show the fixed window end before sharing a Time-bound URI.

This review branch depends on unpublished @vrtmrz/livesync-commonlib 0.1.32-next.0. The root npm pin and Deno lockfile remain unchanged until that candidate is available; a fresh install of this commit is not yet expected to build.
This commit is contained in:
vorotamoroz
2026-09-28 10:22:28 +00:00
parent 2c2b9c90e4
commit 3a478cce3f
23 changed files with 1361 additions and 119 deletions
+14 -1
View File
@@ -1,7 +1,7 @@
import { decodeSettingsFromSetupURI } from "@vrtmrz/livesync-commonlib/compat/API/processSetting";
import { DEFAULT_SETTINGS, REMOTE_P2P } from "@vrtmrz/livesync-commonlib/compat/common/types";
import { ConnectionStringParser } from "@vrtmrz/livesync-commonlib/compat/common/ConnectionString";
import { describe, expect, it } from "vitest";
import { describe, expect, it, vi } from "vitest";
import {
P2P_CHECK_APP_ID,
@@ -25,6 +25,7 @@ describe("P2P connection-check setup", () => {
expect(generated.target).toBe(target);
expect(generated.setupPassphrase).toMatch(/^[a-z2-9]{4}(?:-[a-z2-9]{4}){3}$/);
expect(generated.setupURI).toMatch(/^obsidian:\/\/setuplivesync\?settings=/);
expect(generated.setupURIUsableUntil).toBeGreaterThan(Date.now());
expect(effective).toEqual(
expect.objectContaining({
remoteType: REMOTE_P2P,
@@ -94,6 +95,18 @@ describe("P2P connection-check setup", () => {
}
);
it("uses the current UTC window and rejects the generated URI at its boundary", async () => {
const clock = vi.spyOn(Date, "now").mockReturnValue(Date.parse("2026-09-28T12:00:00Z"));
try {
const generated = await generateP2PCheckSetup("desktop");
expect(generated.setupURIUsableUntil).toBe(Date.parse("2026-10-01T00:00:00Z"));
clock.mockReturnValue(generated.setupURIUsableUntil);
await expect(decodeSettingsFromSetupURI(generated.setupURI, generated.setupPassphrase)).rejects.toThrow();
} finally {
clock.mockRestore();
}
});
it("creates independent rooms and secrets for separate checks", async () => {
const first = await generateP2PCheckSetup("desktop");
const second = await generateP2PCheckSetup("desktop");