Ctrl K
ComunidadGuías…

tests/support/sandbox-resume-race-harness.ts

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
import { readFile } from "node:fs/promises";
import path from "node:path";
import { PGlite } from "@electric-sql/pglite";
import { createPostgrestShim, type Queryable } from "@/lib/db/postgrest-shim";
import { SHIM_TYPE_PARSERS } from "@/lib/db/pool";
import { supabaseAdmin } from "@/lib/supabase/admin";
import { createSandboxResumeHandler } from "@/lib/sandbox/resume/route";
import { RESUME_SELECT } from "@/lib/sandbox/resume/_lib/constants";
import { buildLoadedResumeContext } from "../unit/helpers/sandbox-resume-route-fixtures";

export async function withResumeDatabase(
  run: (input: {
    pg: PGlite;
    resume: () => Promise<Response>;
  }) => Promise<void>,
  recordId = "sandbox-1",
  duringWake: (pg: PGlite) => Promise<void> = async () => {}
) {
  const pg = new PGlite({
    parsers: Object.fromEntries(
      Object.entries(SHIM_TYPE_PARSERS).map(([oid, parse]) => [
        Number(oid),
        parse,
      ])
    ),
  });
  const previous = Object.getOwnPropertyDescriptor(supabaseAdmin, "from");
  try {
    await pg.exec(`
      create table workspaces(id text primary key);
      create table repos(id text primary key, workspace_id text references workspaces(id), root_directory text,
        dev_command text, dev_port integer, dev_port_auto boolean, runtime text);
      create table sandboxes(
        id text primary key, repo_id text references repos(id), user_id text, sandbox_id text,
        base_branch text, working_branch text, status text, stop_reason text, health_status text,
        preview_url text, snapshot_id text, snapshot_billing_project_id text, snapshot_billing_team_id text,
        install_log text, dev_log text, runtime text, terminal_cwd text, root_directory text,
        error text, last_preview_error text, last_boot_error text, created_at timestamptz default now(),
        last_active_at timestamptz, billing_source text, billing_team_id text, billing_project_id text,
        vercel_team_id text, vercel_project_id text, persistent boolean, limit_claim_id text,
        last_boot_started_at timestamptz, last_boot_completed_at timestamptz
      );
      insert into repos(id, dev_port, dev_port_auto, runtime) values ('repo-1',3000,true,'node22');
    `);
    await pg.query(
      `insert into sandboxes(id,repo_id,user_id,sandbox_id,base_branch,working_branch,status,health_status,persistent,snapshot_id)
      values($1,'repo-1','user-1','vm_123','main','saved-work','paused','paused',true,'snap_saved')`,
      [recordId]
    );
    await pg.exec(
      await readFile(
        path.join(
          process.cwd(),
          "neon/migrations/20261011173500_sandbox_boot_reconciliation.sql"
        ),
        "utf8"
      )
    );
    const queryable: Queryable = {
      query: async (sql, values) => {
        const result = await pg.query(sql, values);
        return { rows: result.rows as Record<string, unknown>[] };
      },
    };
    const db = createPostgrestShim(queryable);
    Object.defineProperty(supabaseAdmin, "from", {
      configurable: true,
      value: db.from.bind(db),
    });
    const handler = createSandboxResumeHandler({
      loadOwnedSandboxRouteContext: (async () => {
        const { data, error } = await db
          .from("sandboxes")
          .select(RESUME_SELECT)
          .eq("id", recordId)
          .single();
        if (error) throw new Error(error.message);
        return { ...buildLoadedResumeContext(), record: data };
      }) as never,
      enforceSandboxBootLimits: async () => ({ allowed: true }) as never,
      getSandbox: async () => {
        await duringWake(pg);
        return { stop: async () => {} } as never;
      },
      requireSandboxBillingSession: async () =>
        ({ metered: false, reason: "not_platform" }) as never,
      resolveRepoSandboxEnv: async () =>
        ({ envVars: {}, sync: { mode: "sandbox-only" } }) as never,
      async *bootstrapFromSnapshotStreaming() {
        yield { type: "preview_url", url: "https://preview.example.com" };
        yield { type: "status", status: "running" };
      },
      prepareSandboxBillingClose: async () => null,
      finalizeSandboxBillingClose: async () => ({
        finalized: false,
        metered: false,
      }),
    });
    await run({
      pg,
      resume: () =>
        handler(
          new Request(`http://localhost/api/sandbox/${recordId}/resume`, {
            method: "POST",
          }),
          { params: Promise.resolve({ id: recordId }) }
        ),
    });
  } finally {
    if (previous) Object.defineProperty(supabaseAdmin, "from", previous);
    else Reflect.deleteProperty(supabaseAdmin, "from");
    await pg.close();
  }
}

export async function legacyMissingVmWrite(pg: PGlite) {
  await pg.exec(
    "update sandboxes set status='stopped',health_status='stopped',stop_reason='vm_gone' where status in ('creating','installing','running')"
  );
}