make webhook

This commit is contained in:
2026-07-13 18:50:38 +02:00
parent 2f128550fc
commit 40c822d3bf
67 changed files with 6286 additions and 2053 deletions
@@ -0,0 +1,105 @@
import assert from "node:assert/strict";
import { createHmac } from "node:crypto";
import { mkdtemp, rm } from "node:fs/promises";
import { createServer } from "node:http";
import { tmpdir } from "node:os";
import { join } from "node:path";
import test from "node:test";
import { AgentStore } from "../../adapters/database/store.js";
import { handleHttp } from "../../application/controller/server.js";
test("signed webhooks are durably admitted before acknowledgment", async () => {
const root = await mkdtemp(join(tmpdir(), "agent-http-"));
const store = new AgentStore(join(root, "agent.db"));
const server = createServer((request, response) => {
handleHttp(request, response, {
store,
webhookSecret: "test-secret",
repositoryId: 9,
repositoryFullName: "owner/repo",
}).catch((error) => {
response.writeHead(500);
response.end(String(error));
});
});
try {
await new Promise<void>((resolve) =>
server.listen(0, "127.0.0.1", resolve),
);
const address = server.address();
assert.ok(address && typeof address === "object");
const body = JSON.stringify({
action: "created",
comment: { body: "/agent plan" },
repository: { id: 9, full_name: "owner/repo" },
});
const signature = createHmac("sha256", "test-secret")
.update(body)
.digest("hex");
const response = await fetch(
`http://127.0.0.1:${address.port}/webhooks/gitea`,
{
method: "POST",
headers: {
"content-type": "application/json",
"x-gitea-signature": signature,
"x-gitea-delivery": "delivery-http-1",
"x-gitea-event": "issue_comment",
"x-gitea-event-type": "issue_comment",
},
body,
},
);
assert.equal(response.status, 204);
assert.equal(store.leaseDelivery()?.id, "delivery-http-1");
} finally {
await new Promise<void>((resolve) => server.close(() => resolve()));
store.close();
await rm(root, { recursive: true, force: true });
}
});
test("invalid webhook signatures are rejected without persistence", async () => {
const root = await mkdtemp(join(tmpdir(), "agent-http-auth-"));
const store = new AgentStore(join(root, "agent.db"));
const server = createServer((request, response) => {
handleHttp(request, response, {
store,
webhookSecret: "test-secret",
repositoryId: 9,
repositoryFullName: "owner/repo",
}).catch(() => {
response.writeHead(500);
response.end();
});
});
try {
await new Promise<void>((resolve) =>
server.listen(0, "127.0.0.1", resolve),
);
const address = server.address();
assert.ok(address && typeof address === "object");
const response = await fetch(
`http://127.0.0.1:${address.port}/webhooks/gitea`,
{
method: "POST",
headers: {
"content-type": "application/json",
"x-gitea-signature": "0".repeat(64),
"x-gitea-delivery": "delivery-http-2",
"x-gitea-event": "issues",
"x-gitea-event-type": "issue_label",
},
body: JSON.stringify({
repository: { id: 9, full_name: "owner/repo" },
}),
},
);
assert.equal(response.status, 401);
assert.equal(store.leaseDelivery(), undefined);
} finally {
await new Promise<void>((resolve) => server.close(() => resolve()));
store.close();
await rm(root, { recursive: true, force: true });
}
});