From b8d6484ff07d94f20b55223f4785148bdaf24021 Mon Sep 17 00:00:00 2001 From: Mythie Date: Mon, 17 Jun 2024 16:59:14 +1000 Subject: [PATCH] fix: improve inngest support --- package-lock.json | 1 + packages/lib/jobs/client/base.ts | 2 +- packages/lib/jobs/client/client.ts | 26 +++++++------------------- packages/lib/jobs/client/inngest.ts | 25 +++++++++++++++++++------ packages/lib/jobs/client/trigger.ts | 4 +--- packages/lib/package.json | 1 + packages/tsconfig/process-env.d.ts | 2 +- 7 files changed, 31 insertions(+), 30 deletions(-) diff --git a/package-lock.json b/package-lock.json index 34f543c95..fb96310ef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31833,6 +31833,7 @@ "inngest": "^3.19.13", "kysely": "^0.26.3", "luxon": "^3.4.0", + "micro": "^10.0.1", "nanoid": "^4.0.2", "next": "14.0.3", "next-auth": "4.24.5", diff --git a/packages/lib/jobs/client/base.ts b/packages/lib/jobs/client/base.ts index d50ba3bc2..3a60c2797 100644 --- a/packages/lib/jobs/client/base.ts +++ b/packages/lib/jobs/client/base.ts @@ -13,7 +13,7 @@ export abstract class BaseJobProvider { throw new Error('Not implemented'); } - public getApiHandler(): (req: NextApiRequest, res: NextApiResponse) => Promise { + public getApiHandler(): (req: NextApiRequest, res: NextApiResponse) => Promise { throw new Error('Not implemented'); } } diff --git a/packages/lib/jobs/client/client.ts b/packages/lib/jobs/client/client.ts index 2455459df..eec92acb3 100644 --- a/packages/lib/jobs/client/client.ts +++ b/packages/lib/jobs/client/client.ts @@ -1,5 +1,8 @@ +import { match } from 'ts-pattern'; + import type { JobDefinition, TriggerJobOptions } from './_internal/job'; import type { BaseJobProvider as JobClientProvider } from './base'; +import { InngestJobProvider } from './inngest'; import { LocalJobProvider } from './local'; import { TriggerJobProvider } from './trigger'; @@ -9,35 +12,20 @@ export class JobClient = []> { private _provider: JobClientProvider; public constructor(definitions: T) { - if (process.env.NEXT_PRIVATE_JOBS_PROVIDER === 'trigger') { - this._provider = TriggerJobProvider.getInstance(); - - return; - } - - this._provider = LocalJobProvider.getInstance(); + this._provider = match(process.env.NEXT_PRIVATE_JOBS_PROVIDER) + .with('inngest', () => InngestJobProvider.getInstance()) + .with('trigger', () => TriggerJobProvider.getInstance()) + .otherwise(() => LocalJobProvider.getInstance()); definitions.forEach((definition) => { this._provider.defineJob(definition); }); } - // public static getInstance() { - // if (!this._instance) { - // this._instance = new JobClient(); - // } - - // return this._instance; - // } - public async triggerJob(options: TriggerJobOptions) { return this._provider.triggerJob(options); } - // public defineJob(job: JobDefinition) { - // return this._provider.defineJob(job); - // } - public getApiHandler() { return this._provider.getApiHandler(); } diff --git a/packages/lib/jobs/client/inngest.ts b/packages/lib/jobs/client/inngest.ts index b2994072b..1841b3876 100644 --- a/packages/lib/jobs/client/inngest.ts +++ b/packages/lib/jobs/client/inngest.ts @@ -1,9 +1,11 @@ import type { NextApiRequest, NextApiResponse } from 'next'; +import type { NextRequest } from 'next/server'; import type { Context, Handler, InngestFunction } from 'inngest'; import { Inngest as InngestClient } from 'inngest'; import type { Logger } from 'inngest/middleware/logger'; import { serve as createPagesRoute } from 'inngest/next'; +import { json } from 'micro'; import type { JobDefinition, JobRunIO, SimpleTriggerJobOptions } from './_internal/job'; import { BaseJobProvider } from './base'; @@ -35,6 +37,7 @@ export class InngestJobProvider extends BaseJobProvider { } public defineJob(job: JobDefinition): void { + console.log('defining job', job.id); const fn = this._client.createFunction( { id: job.id, @@ -70,15 +73,25 @@ export class InngestJobProvider extends BaseJobProvider { }); } - public getApiHandler(): (req: NextApiRequest, res: NextApiResponse) => Promise { - // !: Ignoring the error here since this is designed to work with the Next.js pages router - // !: but wants a more strict type. - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error - return createPagesRoute({ + public getApiHandler() { + const handler = createPagesRoute({ client: this._client, functions: this._functions, }); + + return async (req: NextApiRequest, res: NextApiResponse) => { + // Since body-parser is disabled for this route we need to patch in the parsed body + if (req.headers['content-type'] === 'application/json') { + Object.assign(req, { + body: await json(req), + }); + } + + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + const nextReq = req as unknown as NextRequest; + + return await handler(nextReq, res); + }; } private convertInngestIoToJobRunIo(ctx: Context.Any & { logger: Logger }) { diff --git a/packages/lib/jobs/client/trigger.ts b/packages/lib/jobs/client/trigger.ts index d5545e781..4cd64b5b1 100644 --- a/packages/lib/jobs/client/trigger.ts +++ b/packages/lib/jobs/client/trigger.ts @@ -1,5 +1,3 @@ -import type { NextApiRequest, NextApiResponse } from 'next'; - import { createPagesRoute } from '@trigger.dev/nextjs'; import type { IO } from '@trigger.dev/sdk'; import { TriggerClient, eventTrigger } from '@trigger.dev/sdk'; @@ -54,7 +52,7 @@ export class TriggerJobProvider extends BaseJobProvider { }); } - public getApiHandler(): (req: NextApiRequest, res: NextApiResponse) => Promise { + public getApiHandler() { const { handler } = createPagesRoute(this._client); return handler; diff --git a/packages/lib/package.json b/packages/lib/package.json index 21c62b56b..7c4009d26 100644 --- a/packages/lib/package.json +++ b/packages/lib/package.json @@ -39,6 +39,7 @@ "inngest": "^3.19.13", "kysely": "^0.26.3", "luxon": "^3.4.0", + "micro": "^10.0.1", "nanoid": "^4.0.2", "next": "14.0.3", "next-auth": "4.24.5", diff --git a/packages/tsconfig/process-env.d.ts b/packages/tsconfig/process-env.d.ts index f3efa4ec9..9e21eba4f 100644 --- a/packages/tsconfig/process-env.d.ts +++ b/packages/tsconfig/process-env.d.ts @@ -68,7 +68,7 @@ declare namespace NodeJS { // NEXT_PRIVATE_BROWSERLESS_URL?: string; - NEXT_PRIVATE_JOBS_PROVIDER?: 'trigger' | 'local'; + NEXT_PRIVATE_JOBS_PROVIDER?: 'trigger' | 'inngest' | 'local'; /** * Trigger.dev environment variables