fix: improve inngest support

This commit is contained in:
Mythie
2024-06-17 16:59:14 +10:00
parent 6977381e00
commit b8d6484ff0
7 changed files with 31 additions and 30 deletions

View File

@ -13,7 +13,7 @@ export abstract class BaseJobProvider {
throw new Error('Not implemented');
}
public getApiHandler(): (req: NextApiRequest, res: NextApiResponse) => Promise<void> {
public getApiHandler(): (req: NextApiRequest, res: NextApiResponse) => Promise<Response | void> {
throw new Error('Not implemented');
}
}

View File

@ -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<T extends Array<JobDefinition> = []> {
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<T>) {
return this._provider.triggerJob(options);
}
// public defineJob<N extends string, T>(job: JobDefinition<N, T>) {
// return this._provider.defineJob(job);
// }
public getApiHandler() {
return this._provider.getApiHandler();
}

View File

@ -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<N extends string, T>(job: JobDefinition<N, T>): 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<void> {
// !: 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 }) {

View File

@ -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<void> {
public getApiHandler() {
const { handler } = createPagesRoute(this._client);
return handler;