From eb30b8695eca172450b3db53e38e425eb21742b2 Mon Sep 17 00:00:00 2001 From: Mohammad Bagher Abiyat Date: Wed, 27 Mar 2024 10:52:38 +0330 Subject: [PATCH] CR_BUCKET --- packages/backend/nitro.config.ts | 2 +- .../[repo]/[ref]/[package].get.ts | 2 +- .../[repo]/[ref]/[sha]/[package].get.ts | 2 +- .../backend/server/routes/publish.post.ts | 6 ++-- .../backend/server/routes/webhook.post.ts | 30 +++++++++-------- packages/backend/server/utils/bucket.ts | 32 +++++++++++-------- 6 files changed, 41 insertions(+), 33 deletions(-) diff --git a/packages/backend/nitro.config.ts b/packages/backend/nitro.config.ts index fd10a47c..6deeceee 100644 --- a/packages/backend/nitro.config.ts +++ b/packages/backend/nitro.config.ts @@ -3,7 +3,7 @@ import ncb from "nitro-cloudflare-dev"; declare module "nitro-cloudflare-dev" { interface Env { - BUCKET: R2Bucket; + CR_BUCKET: R2Bucket; } } diff --git a/packages/backend/server/routes/[orgOrAuthor]/[repo]/[ref]/[package].get.ts b/packages/backend/server/routes/[orgOrAuthor]/[repo]/[ref]/[package].get.ts index 56ac7c57..d073fe99 100644 --- a/packages/backend/server/routes/[orgOrAuthor]/[repo]/[ref]/[package].get.ts +++ b/packages/backend/server/routes/[orgOrAuthor]/[repo]/[ref]/[package].get.ts @@ -11,7 +11,7 @@ export default eventHandler(async (event) => { const { package: packageName, ...hashPrefixMetadata } = params; const metadataHash = sha256(objectHash(hashPrefixMetadata)); - const cursorBucket = useCursorBucket(); + const cursorBucket = useCursorBucket(event); if (!(await cursorBucket.hasItem(metadataHash))) { throw createError({ status: 404, diff --git a/packages/backend/server/routes/[orgOrAuthor]/[repo]/[ref]/[sha]/[package].get.ts b/packages/backend/server/routes/[orgOrAuthor]/[repo]/[ref]/[sha]/[package].get.ts index 79f9acd5..b945ece7 100644 --- a/packages/backend/server/routes/[orgOrAuthor]/[repo]/[ref]/[sha]/[package].get.ts +++ b/packages/backend/server/routes/[orgOrAuthor]/[repo]/[ref]/[sha]/[package].get.ts @@ -7,7 +7,7 @@ type Params = WorkflowData & { export default eventHandler(async (event) => { const params = getRouterParams(event) as Params; - const packagesBucket = usePackagesBucket(); + const packagesBucket = usePackagesBucket(event); const { sha, package: packageName, ...hashPrefixMetadata } = params; const metadataHash = sha256(objectHash(hashPrefixMetadata)); diff --git a/packages/backend/server/routes/publish.post.ts b/packages/backend/server/routes/publish.post.ts index 45880e01..2589db7c 100644 --- a/packages/backend/server/routes/publish.post.ts +++ b/packages/backend/server/routes/publish.post.ts @@ -20,9 +20,9 @@ export default eventHandler(async (event) => { }) } - const workflowsBucket = useWorkflowsBucket(); - const packagesBucket = usePackagesBucket(); - const cursorBucket = useCursorBucket(); + const workflowsBucket = useWorkflowsBucket(event); + const packagesBucket = usePackagesBucket(event); + const cursorBucket = useCursorBucket(event); if (!(await workflowsBucket.hasItem(key))) { throw createError({ statusCode: 401, diff --git a/packages/backend/server/routes/webhook.post.ts b/packages/backend/server/routes/webhook.post.ts index 70c933d1..57a90079 100644 --- a/packages/backend/server/routes/webhook.post.ts +++ b/packages/backend/server/routes/webhook.post.ts @@ -3,16 +3,16 @@ import type { WorkflowData } from "../types"; import { hash } from "ohash"; export default eventHandler(async (event) => { - const app = useOctokitApp(event) + const app = useOctokitApp(event); - const { test } = useRuntimeConfig(event) - const { setItem, removeItem } = useWorkflowsBucket(); + const { test } = useRuntimeConfig(event); + const { setItem, removeItem } = useWorkflowsBucket(event); const workflowHandler: HandlerFunction<"workflow_job", unknown> = async ({ payload, }) => { const metadata = { - url: payload.workflow_job.html_url.split('/job/')[0], // run url: (https://github.com/stackblitz-labs/stackblitz-ci/actions/runs/8390507718)/job/23004786296 + url: payload.workflow_job.html_url.split("/job/")[0], // run url: (https://github.com/stackblitz-labs/stackblitz-ci/actions/runs/8390507718)/job/23004786296 attempt: payload.workflow_job.run_attempt, actor: payload.sender.id, }; @@ -23,14 +23,14 @@ export default eventHandler(async (event) => { orgOrAuthor, repo, sha: payload.workflow_job.head_sha, - ref: payload.workflow_job.head_branch, + ref: payload.workflow_job.head_branch!, }; // octokit.request('POST /repos/{owner}/{repo}/pulls/{pull_number}/comments', { // body: '', // owner: payload.repository.owner, // repo: payload.repository.repo - + // }) // Publishing is only available throughout the lifetime of a worklow_job await setItem(key, data); @@ -45,12 +45,12 @@ export default eventHandler(async (event) => { type EmitterWebhookEvent = Parameters< typeof app.webhooks.receive | typeof app.webhooks.verifyAndReceive >[0]; - const id: EmitterWebhookEvent["id"] = event.headers.get("x-github-delivery"); + const id: EmitterWebhookEvent["id"] = event.headers.get("x-github-delivery")!; const name = event.headers.get( "x-github-event" ) as EmitterWebhookEvent["name"]; const signature = event.headers.get("x-hub-signature-256") ?? ""; - const payload = await readRawBody(event); + const payload = (await readRawBody(event))!; try { if (test) { @@ -64,13 +64,15 @@ export default eventHandler(async (event) => { await app.webhooks.verifyAndReceive({ id, name, payload, signature }); } - return {ok: true} + return { ok: true }; } catch (error) { - // app.log.error(error.message); - throw createError({ - status: 500, - message: error.message - }) + if (error instanceof Error) { + app.log.error(error.message); + throw createError({ + status: 500, + message: error?.message, + }); + } } finally { app.webhooks.removeListener("workflow_job", workflowHandler); } diff --git a/packages/backend/server/utils/bucket.ts b/packages/backend/server/utils/bucket.ts index fa5ae6f8..234666e7 100644 --- a/packages/backend/server/utils/bucket.ts +++ b/packages/backend/server/utils/bucket.ts @@ -1,27 +1,33 @@ import type { R2Bucket } from "@cloudflare/workers-types"; -import { prefixStorage } from "unstorage"; +import { prefixStorage, createStorage } from "unstorage"; +import cloudflareR2BindingDriver from "unstorage/drivers/cloudflare-r2-binding"; import { WorkflowData, Cursor } from "../types"; +import type { H3Event } from "h3"; type Binary = Parameters[1]; -export function useBucket() { - return useStorage("bucket"); +export function useBucket(event: H3Event) { + console.log(event.context.cloudflare.env) + return createStorage({ + driver: cloudflareR2BindingDriver({ + base: "bucket", + // @ts-ignore TODO(upstream): fix type mismatch + binding: event.context.cloudflare.env.CR_BUCKET, + }), + }); } -export function useWorkflowsBucket() { - const storage = useBucket(); - return prefixStorage( - storage, - "workflows" - ); +export function useWorkflowsBucket(event: H3Event) { + const storage = useBucket(event); + return prefixStorage(storage, "workflows"); } -export function usePackagesBucket() { - const storage = useBucket(); +export function usePackagesBucket(event: H3Event) { + const storage = useBucket(event); return prefixStorage(storage, "packages"); } -export function useCursorBucket() { - const storage = useBucket(); +export function useCursorBucket(event: H3Event) { + const storage = useBucket(event); return prefixStorage(storage, "cursor"); }