Promote AgentCompany-New to the repository root and retire the old app
The legacy application - its src, tests, landing site, promo assets, docs, release tooling, CI workflows, and root configs - leaves the tree; it stays reachable in history. Everything under AgentCompany-New moves up unchanged: same package name, so the production userData/database path is untouched, and e2e/build scripts already resolved paths relative to the project. The developer cred.txt stays gitignored at its new location. Full verify:ci passes from the new root.
This commit is contained in:
1 parent
2350f744e3
commit
07d0b4587d
1904 files changed
+1133
-282075
No files matched your search
@@ -1,34 +0,0 @@
|
||||
import type { CounterDatabase, PagesHandler } from "../types";
|
||||
import { DOWNLOAD_COUNT_SEED } from "../../lib/downloads";
|
||||
|
||||
interface Env {
|
||||
DOWNLOAD_COUNTER_DB: CounterDatabase;
|
||||
}
|
||||
|
||||
async function readDownloadCount(db: CounterDatabase) {
|
||||
const result = await db
|
||||
.prepare(`
|
||||
SELECT
|
||||
COALESCE(
|
||||
(SELECT value FROM download_counter_settings WHERE key = 'base_downloads'),
|
||||
?
|
||||
) + COUNT(*) AS downloads
|
||||
FROM unique_download_windows
|
||||
`)
|
||||
.bind(DOWNLOAD_COUNT_SEED)
|
||||
.first<{ downloads: number }>();
|
||||
|
||||
return result?.downloads ?? DOWNLOAD_COUNT_SEED;
|
||||
}
|
||||
|
||||
export const onRequestGet: PagesHandler<Env> = async (context) => {
|
||||
const downloads = await readDownloadCount(context.env.DOWNLOAD_COUNTER_DB);
|
||||
return Response.json(
|
||||
{ downloads },
|
||||
{
|
||||
headers: {
|
||||
"Cache-Control": "no-store",
|
||||
},
|
||||
},
|
||||
);
|
||||
};
|
||||
@@ -1,73 +0,0 @@
|
||||
import {
|
||||
DOWNLOAD_DEDUP_WINDOW_MS,
|
||||
getDownloadAsset,
|
||||
} from "../../lib/downloads";
|
||||
import type { CounterDatabase, PagesHandler } from "../types";
|
||||
|
||||
interface Env {
|
||||
DOWNLOAD_COUNTER_DB: CounterDatabase;
|
||||
DOWNLOAD_COUNTER_SALT?: string;
|
||||
}
|
||||
|
||||
function getClientIp(request: Request) {
|
||||
const cfConnectingIp = request.headers.get("CF-Connecting-IP")?.trim();
|
||||
if (cfConnectingIp) {
|
||||
return cfConnectingIp;
|
||||
}
|
||||
|
||||
const forwardedFor = request.headers.get("X-Forwarded-For")?.split(",")[0]?.trim();
|
||||
return forwardedFor || null;
|
||||
}
|
||||
|
||||
function getWindowKey(now = Date.now()) {
|
||||
return Math.floor(now / DOWNLOAD_DEDUP_WINDOW_MS);
|
||||
}
|
||||
|
||||
async function sha256Hex(input: string) {
|
||||
const buffer = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(input));
|
||||
return Array.from(new Uint8Array(buffer), (byte) => byte.toString(16).padStart(2, "0")).join("");
|
||||
}
|
||||
|
||||
async function countUniqueDownload(db: CounterDatabase, request: Request, assetId: string, salt: string | undefined) {
|
||||
const clientIp = getClientIp(request);
|
||||
if (!clientIp) {
|
||||
return;
|
||||
}
|
||||
|
||||
const ipHash = await sha256Hex(`${salt ?? ""}:${clientIp}`);
|
||||
const windowKey = getWindowKey();
|
||||
|
||||
await db
|
||||
.prepare(`
|
||||
INSERT OR IGNORE INTO unique_download_windows (
|
||||
ip_hash,
|
||||
window_key,
|
||||
first_asset_id,
|
||||
created_at
|
||||
) VALUES (?, ?, ?, datetime('now'))
|
||||
`)
|
||||
.bind(ipHash, windowKey, assetId)
|
||||
.run();
|
||||
}
|
||||
|
||||
export const onRequestGet: PagesHandler<Env> = async (context) => {
|
||||
const url = new URL(context.request.url);
|
||||
const assetId = url.searchParams.get("asset")?.trim();
|
||||
if (!assetId) {
|
||||
return new Response("Missing asset parameter.", { status: 400 });
|
||||
}
|
||||
|
||||
const asset = getDownloadAsset(assetId);
|
||||
if (!asset) {
|
||||
return new Response("Unknown asset.", { status: 404 });
|
||||
}
|
||||
|
||||
await countUniqueDownload(
|
||||
context.env.DOWNLOAD_COUNTER_DB,
|
||||
context.request,
|
||||
asset.id,
|
||||
context.env.DOWNLOAD_COUNTER_SALT,
|
||||
);
|
||||
|
||||
return Response.redirect(asset.href, 302);
|
||||
};
|
||||
Reference in new issue
Block a user