@beignet/provider-inngest 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -0
- package/README.md +12 -6
- package/dist/index.d.ts +58 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -5
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +79 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,34 @@
|
|
|
1
1
|
# @beignet/provider-inngest
|
|
2
2
|
|
|
3
|
+
## 0.0.3
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 4cb1784: Add first-class upload router primitives, a typed browser upload client, a
|
|
8
|
+
React upload adapter, Next.js upload route helper, S3-compatible direct upload
|
|
9
|
+
signing, devtools upload watcher support, an upload generator, and a
|
|
10
|
+
first-class `beignet make feature` command with optional policy, event, job,
|
|
11
|
+
and upload artifacts for the standard vertical slice. Add first-class job retry
|
|
12
|
+
helpers, outbox retry policy integration, and job retry/dead-letter devtools
|
|
13
|
+
events. Add a Next.js outbox drain route helper and doctor warnings for
|
|
14
|
+
serverless background-work footguns.
|
|
15
|
+
- Updated dependencies [3160184]
|
|
16
|
+
- Updated dependencies [254ef6d]
|
|
17
|
+
- Updated dependencies [4cb1784]
|
|
18
|
+
- Updated dependencies [8bd9085]
|
|
19
|
+
- @beignet/core@0.0.3
|
|
20
|
+
|
|
21
|
+
## 0.0.2
|
|
22
|
+
|
|
23
|
+
### Patch Changes
|
|
24
|
+
|
|
25
|
+
- Updated dependencies [90b29ad]
|
|
26
|
+
- Updated dependencies [07fa19c]
|
|
27
|
+
- Updated dependencies [08bae67]
|
|
28
|
+
- Updated dependencies [730a818]
|
|
29
|
+
- Updated dependencies [a79f60c]
|
|
30
|
+
- @beignet/core@0.0.2
|
|
31
|
+
|
|
3
32
|
## 0.0.1
|
|
4
33
|
|
|
5
34
|
- Initial Beignet release under the `@beignet` npm scope.
|
package/README.md
CHANGED
|
@@ -47,7 +47,7 @@ Define jobs with `@beignet/core/jobs`, then dispatch them through
|
|
|
47
47
|
`ctx.ports.jobs`:
|
|
48
48
|
|
|
49
49
|
```typescript
|
|
50
|
-
import { createJobHandlers } from "@beignet/core/jobs";
|
|
50
|
+
import { createJobHandlers, retry } from "@beignet/core/jobs";
|
|
51
51
|
import { z } from "zod";
|
|
52
52
|
|
|
53
53
|
const jobs = createJobHandlers<AppCtx>();
|
|
@@ -57,9 +57,9 @@ export const SendInviteEmailJob = jobs.defineJob("mail.invite.send", {
|
|
|
57
57
|
inviteId: z.string(),
|
|
58
58
|
inviteeEmail: z.string().email(),
|
|
59
59
|
}),
|
|
60
|
-
retry: {
|
|
60
|
+
retry: retry.exponential({
|
|
61
61
|
attempts: 3,
|
|
62
|
-
},
|
|
62
|
+
}),
|
|
63
63
|
async handle({ payload, ctx }) {
|
|
64
64
|
await ctx.ports.mailer.send({
|
|
65
65
|
to: payload.inviteeEmail,
|
|
@@ -222,9 +222,15 @@ Use `createInngestJobFunction(...)` to turn a first-class Beignet job into
|
|
|
222
222
|
an Inngest function. The helper subscribes to `job.name`, validates incoming
|
|
223
223
|
event data with `parseJobPayload`, and then calls `job.handle(...)`.
|
|
224
224
|
|
|
225
|
-
If the job defines
|
|
226
|
-
function-level `retries` option. Inngest
|
|
227
|
-
|
|
225
|
+
If the job defines a retry policy, the helper maps Beignet's total
|
|
226
|
+
`retry.attempts` value to Inngest's function-level `retries` option. Inngest
|
|
227
|
+
supports retry values from `0` to `20`, so Beignet accepts total attempt counts
|
|
228
|
+
from `1` to `21` for Inngest-backed jobs.
|
|
229
|
+
|
|
230
|
+
Inngest-backed jobs support Beignet's retry attempt count only. Custom Beignet
|
|
231
|
+
backoff fields, jitter, and `retryIf` classification are outbox-worker
|
|
232
|
+
semantics; `createInngestJobFunction(...)` fails fast if a job policy includes
|
|
233
|
+
retry behavior that the adapter cannot honor.
|
|
228
234
|
|
|
229
235
|
Define functions separately from your Beignet server, usually in a
|
|
230
236
|
serverless function or route handler:
|
package/dist/index.d.ts
CHANGED
|
@@ -69,29 +69,87 @@ export interface InngestPort {
|
|
|
69
69
|
data: TData;
|
|
70
70
|
}): Promise<void>;
|
|
71
71
|
}
|
|
72
|
+
/**
|
|
73
|
+
* Options for `createInngestJobDispatcher(...)`.
|
|
74
|
+
*/
|
|
72
75
|
export interface InngestJobDispatcherOptions {
|
|
76
|
+
/**
|
|
77
|
+
* Optional provider instrumentation target.
|
|
78
|
+
*/
|
|
73
79
|
instrumentation?: ProviderInstrumentationTarget;
|
|
74
80
|
}
|
|
81
|
+
/**
|
|
82
|
+
* Retry attempts accepted by Inngest function definitions.
|
|
83
|
+
*/
|
|
75
84
|
export type InngestFunctionRetryAttempts = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20;
|
|
85
|
+
/**
|
|
86
|
+
* Static or request-aware context for an Inngest job function.
|
|
87
|
+
*/
|
|
76
88
|
export type InngestJobFunctionContext<Ctx> = Ctx | ((args: InngestJobFunctionContextArgs) => MaybePromise<Ctx>);
|
|
89
|
+
/**
|
|
90
|
+
* Arguments passed to an Inngest job function context factory.
|
|
91
|
+
*/
|
|
77
92
|
export interface InngestJobFunctionContextArgs {
|
|
93
|
+
/**
|
|
94
|
+
* Inngest event payload wrapper.
|
|
95
|
+
*/
|
|
78
96
|
event: {
|
|
79
97
|
name: string;
|
|
80
98
|
data: unknown;
|
|
81
99
|
};
|
|
100
|
+
/**
|
|
101
|
+
* Raw Inngest step object.
|
|
102
|
+
*/
|
|
82
103
|
step: unknown;
|
|
83
104
|
}
|
|
105
|
+
/**
|
|
106
|
+
* Instrumentation target for Inngest job functions.
|
|
107
|
+
*/
|
|
84
108
|
export type InngestJobFunctionInstrumentation = ProviderInstrumentationTarget;
|
|
109
|
+
/**
|
|
110
|
+
* Options for creating an Inngest function from a Beignet job definition.
|
|
111
|
+
*/
|
|
85
112
|
export interface CreateInngestJobFunctionOptions<J extends JobDef<string, StandardSchema, Ctx>, Ctx> {
|
|
113
|
+
/**
|
|
114
|
+
* Raw Inngest client.
|
|
115
|
+
*/
|
|
86
116
|
client: Inngest;
|
|
117
|
+
/**
|
|
118
|
+
* Beignet job definition.
|
|
119
|
+
*/
|
|
87
120
|
job: J;
|
|
121
|
+
/**
|
|
122
|
+
* Inngest function ID. Defaults to the job name.
|
|
123
|
+
*/
|
|
88
124
|
id?: string;
|
|
125
|
+
/**
|
|
126
|
+
* Inngest function display name. Defaults to the job name.
|
|
127
|
+
*/
|
|
89
128
|
name?: string;
|
|
129
|
+
/**
|
|
130
|
+
* Inngest function description. Defaults to the job description.
|
|
131
|
+
*/
|
|
90
132
|
description?: string;
|
|
133
|
+
/**
|
|
134
|
+
* Static app context or context factory evaluated for each function run.
|
|
135
|
+
*/
|
|
91
136
|
ctx?: InngestJobFunctionContext<Ctx>;
|
|
137
|
+
/**
|
|
138
|
+
* Optional provider instrumentation target.
|
|
139
|
+
*/
|
|
92
140
|
instrumentation?: InngestJobFunctionInstrumentation;
|
|
93
141
|
}
|
|
142
|
+
/**
|
|
143
|
+
* Create a Beignet job dispatcher that schedules jobs through Inngest events.
|
|
144
|
+
*/
|
|
94
145
|
export declare function createInngestJobDispatcher(client: Inngest, options?: InngestJobDispatcherOptions): JobDispatcherPort;
|
|
146
|
+
/**
|
|
147
|
+
* Create an Inngest function from a Beignet job definition.
|
|
148
|
+
*
|
|
149
|
+
* The function validates the incoming Inngest event data against the job payload
|
|
150
|
+
* schema before calling the job handler. `job.retry.attempts` is the total
|
|
151
|
+
* attempt count and is mapped to Inngest retries.
|
|
152
|
+
*/
|
|
95
153
|
export declare function createInngestJobFunction<Ctx, J extends JobDef<string, StandardSchema, Ctx>>(options: CreateInngestJobFunctionOptions<J, Ctx>): InngestFunction.Any;
|
|
96
154
|
/**
|
|
97
155
|
* Inngest provider that extends ports with background job and event capabilities.
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAEV,MAAM,EACN,YAAY,EACZ,cAAc,EACf,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAGL,KAAK,6BAA6B,EACnC,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AACxD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;GAGG;AACH,QAAA,MAAM,mBAAmB;;;iBAYvB,CAAC;AAEH;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,MAAM,EAAE,OAAO,CAAC;IAEhB;;;;;;;;;;;OAWG;IACH,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,KAAK,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjE;AAED,MAAM,WAAW,2BAA2B;IAC1C,eAAe,CAAC,EAAE,6BAA6B,CAAC;CACjD;AAED,MAAM,MAAM,4BAA4B,GACpC,CAAC,GACD,CAAC,GACD,CAAC,GACD,CAAC,GACD,CAAC,GACD,CAAC,GACD,CAAC,GACD,CAAC,GACD,CAAC,GACD,CAAC,GACD,EAAE,GACF,EAAE,GACF,EAAE,GACF,EAAE,GACF,EAAE,GACF,EAAE,GACF,EAAE,GACF,EAAE,GACF,EAAE,GACF,EAAE,GACF,EAAE,CAAC;AAEP,MAAM,MAAM,yBAAyB,CAAC,GAAG,IACrC,GAAG,GACH,CAAC,CAAC,IAAI,EAAE,6BAA6B,KAAK,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;AAEjE,MAAM,WAAW,6BAA6B;IAC5C,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,OAAO,CAAC;KACf,CAAC;IACF,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,MAAM,iCAAiC,GAAG,6BAA6B,CAAC;AAE9E,MAAM,WAAW,+BAA+B,CAC9C,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,CAAC,EAC7C,GAAG;IAEH,MAAM,EAAE,OAAO,CAAC;IAChB,GAAG,EAAE,CAAC,CAAC;IACP,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,yBAAyB,CAAC,GAAG,CAAC,CAAC;IACrC,eAAe,CAAC,EAAE,iCAAiC,CAAC;CACrD;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -68,14 +68,28 @@ function errorDetails(phase, error) {
|
|
|
68
68
|
};
|
|
69
69
|
}
|
|
70
70
|
function resolveRetryAttempts(job) {
|
|
71
|
-
const
|
|
72
|
-
|
|
71
|
+
const retry = job.retry;
|
|
72
|
+
const attempts = retry?.attempts;
|
|
73
|
+
if (!retry || attempts === undefined)
|
|
73
74
|
return undefined;
|
|
74
|
-
if (!Number.isInteger(attempts) || attempts <
|
|
75
|
-
throw new Error(`[provider-inngest] Job "${job.name}" retry.attempts must be an integer between
|
|
75
|
+
if (!Number.isInteger(attempts) || attempts < 1 || attempts > 21) {
|
|
76
|
+
throw new Error(`[provider-inngest] Job "${job.name}" retry.attempts must be an integer between 1 and 21.`);
|
|
76
77
|
}
|
|
77
|
-
|
|
78
|
+
const hasUnsupportedRetryBehavior = retry.strategy === "fixed" ||
|
|
79
|
+
retry.delay !== undefined ||
|
|
80
|
+
retry.initialDelay !== undefined ||
|
|
81
|
+
retry.maxDelay !== undefined ||
|
|
82
|
+
retry.factor !== undefined ||
|
|
83
|
+
retry.jitter !== undefined ||
|
|
84
|
+
retry.retryIf !== undefined;
|
|
85
|
+
if (hasUnsupportedRetryBehavior) {
|
|
86
|
+
throw new Error(`[provider-inngest] Job "${job.name}" uses retry behavior that Inngest cannot honor. Inngest-backed jobs support retry.attempts only; move custom backoff/classification to an outbox worker or provider-owned Inngest config.`);
|
|
87
|
+
}
|
|
88
|
+
return (attempts - 1);
|
|
78
89
|
}
|
|
90
|
+
/**
|
|
91
|
+
* Create a Beignet job dispatcher that schedules jobs through Inngest events.
|
|
92
|
+
*/
|
|
79
93
|
export function createInngestJobDispatcher(client, options = {}) {
|
|
80
94
|
const instrumentation = createProviderInstrumentation(options.instrumentation, {
|
|
81
95
|
providerName: "inngest",
|
|
@@ -104,6 +118,13 @@ export function createInngestJobDispatcher(client, options = {}) {
|
|
|
104
118
|
},
|
|
105
119
|
};
|
|
106
120
|
}
|
|
121
|
+
/**
|
|
122
|
+
* Create an Inngest function from a Beignet job definition.
|
|
123
|
+
*
|
|
124
|
+
* The function validates the incoming Inngest event data against the job payload
|
|
125
|
+
* schema before calling the job handler. `job.retry.attempts` is the total
|
|
126
|
+
* attempt count and is mapped to Inngest retries.
|
|
127
|
+
*/
|
|
107
128
|
export function createInngestJobFunction(options) {
|
|
108
129
|
const { client, job } = options;
|
|
109
130
|
const retries = resolveRetryAttempts(job);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAQH,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EACL,cAAc,EACd,6BAA6B,GAE9B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,OAAO,EAAwB,MAAM,SAAS,CAAC;AACxD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;GAGG;AACH,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC;;;OAGG;IACH,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC;IAE3C;;;OAGG;IACH,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACjC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAQH,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EACL,cAAc,EACd,6BAA6B,GAE9B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,OAAO,EAAwB,MAAM,SAAS,CAAC;AACxD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;GAGG;AACH,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC;;;OAGG;IACH,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC;IAE3C;;;OAGG;IACH,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACjC,CAAC,CAAC;AAuIH,KAAK,UAAU,iBAAiB,CAC9B,GAA+C,EAC/C,IAAmC;IAEnC,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE,CAAC;QAC9B,OAAQ,GAAkE,CACxE,IAAI,CACL,CAAC;IACJ,CAAC;IAED,OAAO,GAAU,CAAC;AACpB,CAAC;AAED,SAAS,YAAY,CAAC,KAA6B,EAAE,KAAc;IACjE,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO;YACL,KAAK;YACL,KAAK,EAAE;gBACL,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,KAAK,EAAE,KAAK,CAAC,KAAK;aACnB;SACF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,KAAK;QACL,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;KACrB,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAC3B,GAAW;IAEX,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;IACxB,MAAM,QAAQ,GAAG,KAAK,EAAE,QAAQ,CAAC;IACjC,IAAI,CAAC,KAAK,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAEvD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,GAAG,EAAE,EAAE,CAAC;QACjE,MAAM,IAAI,KAAK,CACb,2BAA2B,GAAG,CAAC,IAAI,uDAAuD,CAC3F,CAAC;IACJ,CAAC;IAED,MAAM,2BAA2B,GAC/B,KAAK,CAAC,QAAQ,KAAK,OAAO;QAC1B,KAAK,CAAC,KAAK,KAAK,SAAS;QACzB,KAAK,CAAC,YAAY,KAAK,SAAS;QAChC,KAAK,CAAC,QAAQ,KAAK,SAAS;QAC5B,KAAK,CAAC,MAAM,KAAK,SAAS;QAC1B,KAAK,CAAC,MAAM,KAAK,SAAS;QAC1B,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC;IAE9B,IAAI,2BAA2B,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CACb,2BAA2B,GAAG,CAAC,IAAI,4LAA4L,CAChO,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAiC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CACxC,MAAe,EACf,UAAuC,EAAE;IAEzC,MAAM,eAAe,GAAG,6BAA6B,CACnD,OAAO,CAAC,eAAe,EACvB;QACE,YAAY,EAAE,SAAS;QACvB,OAAO,EAAE,MAAM;KAChB,CACF,CAAC;IAEF,OAAO;QACL,KAAK,CAAC,QAAQ,CACZ,GAAM,EACN,OAA2B;YAE3B,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAEnD,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;gBAEpD,eAAe,CAAC,MAAM,CAAC;oBACrB,IAAI,EAAE,KAAK;oBACX,OAAO,EAAE,GAAG,CAAC,IAAI;oBACjB,MAAM,EAAE,WAAW;iBACpB,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,eAAe,CAAC,MAAM,CAAC;oBACrB,IAAI,EAAE,KAAK;oBACX,OAAO,EAAE,GAAG,CAAC,IAAI;oBACjB,MAAM,EAAE,QAAQ;oBAChB,OAAO,EAAE,YAAY,CAAC,UAAU,EAAE,KAAK,CAAC;iBACzC,CAAC,CAAC;gBAEH,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CAGtC,OAAgD;IAChD,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;IAChC,MAAM,OAAO,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,eAAe,GAAG,6BAA6B,CACnD,OAAO,CAAC,eAAe,EACvB;QACE,YAAY,EAAE,SAAS;QACvB,OAAO,EAAE,MAAM;KAChB,CACF,CAAC;IAEF,OAAO,MAAM,CAAC,cAAc,CAC1B;QACE,EAAE,EAAE,OAAO,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI;QAC1B,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI;QAC9B,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,GAAG,CAAC,WAAW;QACnD,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;KAC9C,EACD,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,EACnB,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE;QACxB,eAAe,CAAC,MAAM,CAAC;YACrB,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,GAAG,CAAC,IAAI;YACjB,MAAM,EAAE,SAAS;SAClB,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACvD,MAAM,GAAG,CAAC,MAAM,CAAC;gBACf,GAAG;gBACH,OAAO;gBACP,GAAG,EAAE,MAAM,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE;oBACxC,KAAK,EAAE;wBACL,IAAI,EAAE,KAAK,CAAC,IAAI;wBAChB,IAAI,EAAE,KAAK,CAAC,IAAI;qBACjB;oBACD,IAAI;iBACL,CAAC;aACH,CAAC,CAAC;YAEH,eAAe,CAAC,MAAM,CAAC;gBACrB,IAAI,EAAE,KAAK;gBACX,OAAO,EAAE,GAAG,CAAC,IAAI;gBACjB,MAAM,EAAE,WAAW;aACpB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,eAAe,CAAC,MAAM,CAAC;gBACrB,IAAI,EAAE,KAAK;gBACX,OAAO,EAAE,GAAG,CAAC,IAAI;gBACjB,MAAM,EAAE,QAAQ;gBAChB,OAAO,EAAE,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC;aACxC,CAAC,CAAC;YAEH,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CACqB,CAAC;AAC3B,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,cAAc,CAAC;IAC5C,IAAI,EAAE,SAAS;IAEf,MAAM,EAAE;QACN,MAAM,EAAE,mBAAmB;QAC3B,SAAS,EAAE,UAAU;KACtB;IAED,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE;QAC3B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACb,+FAA+F,CAChG,CAAC;QACJ,CAAC;QAED,wBAAwB;QACxB,MAAM,aAAa,GAAsC;YACvD,EAAE,EAAE,MAAM,CAAC,QAAQ;SACpB,CAAC;QAEF,yDAAyD;QACzD,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,aAAa,CAAC,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;QAC5C,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;QAC1C,MAAM,eAAe,GAAG,6BAA6B,CAAC,KAAK,EAAE;YAC3D,YAAY,EAAE,SAAS;YACvB,OAAO,EAAE,MAAM;SAChB,CAAC,CAAC;QAEH,aAAa;QACb,MAAM,WAAW,GAAgB;YAC/B,MAAM;YACN,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE;gBACvB,IAAI,CAAC;oBACH,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;oBAElC,eAAe,CAAC,MAAM,CAAC;wBACrB,IAAI,EAAE,KAAK;wBACX,OAAO,EAAE,IAAI;wBACb,MAAM,EAAE,WAAW;qBACpB,CAAC,CAAC;gBACL,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,eAAe,CAAC,MAAM,CAAC;wBACrB,IAAI,EAAE,KAAK;wBACX,OAAO,EAAE,IAAI;wBACb,MAAM,EAAE,QAAQ;wBAChB,OAAO,EAAE,YAAY,CAAC,UAAU,EAAE,KAAK,CAAC;qBACzC,CAAC,CAAC;oBAEH,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;SACF,CAAC;QAEF,MAAM,IAAI,GAAG,0BAA0B,CAAC,MAAM,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC;QAErE,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC;IACnD,CAAC;CACF,CAAC,CAAC"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -91,10 +91,19 @@ export interface InngestPort {
|
|
|
91
91
|
send<TData>(args: { name: string; data: TData }): Promise<void>;
|
|
92
92
|
}
|
|
93
93
|
|
|
94
|
+
/**
|
|
95
|
+
* Options for `createInngestJobDispatcher(...)`.
|
|
96
|
+
*/
|
|
94
97
|
export interface InngestJobDispatcherOptions {
|
|
98
|
+
/**
|
|
99
|
+
* Optional provider instrumentation target.
|
|
100
|
+
*/
|
|
95
101
|
instrumentation?: ProviderInstrumentationTarget;
|
|
96
102
|
}
|
|
97
103
|
|
|
104
|
+
/**
|
|
105
|
+
* Retry attempts accepted by Inngest function definitions.
|
|
106
|
+
*/
|
|
98
107
|
export type InngestFunctionRetryAttempts =
|
|
99
108
|
| 0
|
|
100
109
|
| 1
|
|
@@ -118,30 +127,69 @@ export type InngestFunctionRetryAttempts =
|
|
|
118
127
|
| 19
|
|
119
128
|
| 20;
|
|
120
129
|
|
|
130
|
+
/**
|
|
131
|
+
* Static or request-aware context for an Inngest job function.
|
|
132
|
+
*/
|
|
121
133
|
export type InngestJobFunctionContext<Ctx> =
|
|
122
134
|
| Ctx
|
|
123
135
|
| ((args: InngestJobFunctionContextArgs) => MaybePromise<Ctx>);
|
|
124
136
|
|
|
137
|
+
/**
|
|
138
|
+
* Arguments passed to an Inngest job function context factory.
|
|
139
|
+
*/
|
|
125
140
|
export interface InngestJobFunctionContextArgs {
|
|
141
|
+
/**
|
|
142
|
+
* Inngest event payload wrapper.
|
|
143
|
+
*/
|
|
126
144
|
event: {
|
|
127
145
|
name: string;
|
|
128
146
|
data: unknown;
|
|
129
147
|
};
|
|
148
|
+
/**
|
|
149
|
+
* Raw Inngest step object.
|
|
150
|
+
*/
|
|
130
151
|
step: unknown;
|
|
131
152
|
}
|
|
132
153
|
|
|
154
|
+
/**
|
|
155
|
+
* Instrumentation target for Inngest job functions.
|
|
156
|
+
*/
|
|
133
157
|
export type InngestJobFunctionInstrumentation = ProviderInstrumentationTarget;
|
|
134
158
|
|
|
159
|
+
/**
|
|
160
|
+
* Options for creating an Inngest function from a Beignet job definition.
|
|
161
|
+
*/
|
|
135
162
|
export interface CreateInngestJobFunctionOptions<
|
|
136
163
|
J extends JobDef<string, StandardSchema, Ctx>,
|
|
137
164
|
Ctx,
|
|
138
165
|
> {
|
|
166
|
+
/**
|
|
167
|
+
* Raw Inngest client.
|
|
168
|
+
*/
|
|
139
169
|
client: Inngest;
|
|
170
|
+
/**
|
|
171
|
+
* Beignet job definition.
|
|
172
|
+
*/
|
|
140
173
|
job: J;
|
|
174
|
+
/**
|
|
175
|
+
* Inngest function ID. Defaults to the job name.
|
|
176
|
+
*/
|
|
141
177
|
id?: string;
|
|
178
|
+
/**
|
|
179
|
+
* Inngest function display name. Defaults to the job name.
|
|
180
|
+
*/
|
|
142
181
|
name?: string;
|
|
182
|
+
/**
|
|
183
|
+
* Inngest function description. Defaults to the job description.
|
|
184
|
+
*/
|
|
143
185
|
description?: string;
|
|
186
|
+
/**
|
|
187
|
+
* Static app context or context factory evaluated for each function run.
|
|
188
|
+
*/
|
|
144
189
|
ctx?: InngestJobFunctionContext<Ctx>;
|
|
190
|
+
/**
|
|
191
|
+
* Optional provider instrumentation target.
|
|
192
|
+
*/
|
|
145
193
|
instrumentation?: InngestJobFunctionInstrumentation;
|
|
146
194
|
}
|
|
147
195
|
|
|
@@ -179,18 +227,37 @@ function errorDetails(phase: "schedule" | "execute", error: unknown) {
|
|
|
179
227
|
function resolveRetryAttempts(
|
|
180
228
|
job: JobDef,
|
|
181
229
|
): InngestFunctionRetryAttempts | undefined {
|
|
182
|
-
const
|
|
183
|
-
|
|
230
|
+
const retry = job.retry;
|
|
231
|
+
const attempts = retry?.attempts;
|
|
232
|
+
if (!retry || attempts === undefined) return undefined;
|
|
184
233
|
|
|
185
|
-
if (!Number.isInteger(attempts) || attempts <
|
|
234
|
+
if (!Number.isInteger(attempts) || attempts < 1 || attempts > 21) {
|
|
186
235
|
throw new Error(
|
|
187
|
-
`[provider-inngest] Job "${job.name}" retry.attempts must be an integer between
|
|
236
|
+
`[provider-inngest] Job "${job.name}" retry.attempts must be an integer between 1 and 21.`,
|
|
188
237
|
);
|
|
189
238
|
}
|
|
190
239
|
|
|
191
|
-
|
|
240
|
+
const hasUnsupportedRetryBehavior =
|
|
241
|
+
retry.strategy === "fixed" ||
|
|
242
|
+
retry.delay !== undefined ||
|
|
243
|
+
retry.initialDelay !== undefined ||
|
|
244
|
+
retry.maxDelay !== undefined ||
|
|
245
|
+
retry.factor !== undefined ||
|
|
246
|
+
retry.jitter !== undefined ||
|
|
247
|
+
retry.retryIf !== undefined;
|
|
248
|
+
|
|
249
|
+
if (hasUnsupportedRetryBehavior) {
|
|
250
|
+
throw new Error(
|
|
251
|
+
`[provider-inngest] Job "${job.name}" uses retry behavior that Inngest cannot honor. Inngest-backed jobs support retry.attempts only; move custom backoff/classification to an outbox worker or provider-owned Inngest config.`,
|
|
252
|
+
);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
return (attempts - 1) as InngestFunctionRetryAttempts;
|
|
192
256
|
}
|
|
193
257
|
|
|
258
|
+
/**
|
|
259
|
+
* Create a Beignet job dispatcher that schedules jobs through Inngest events.
|
|
260
|
+
*/
|
|
194
261
|
export function createInngestJobDispatcher(
|
|
195
262
|
client: Inngest,
|
|
196
263
|
options: InngestJobDispatcherOptions = {},
|
|
@@ -232,6 +299,13 @@ export function createInngestJobDispatcher(
|
|
|
232
299
|
};
|
|
233
300
|
}
|
|
234
301
|
|
|
302
|
+
/**
|
|
303
|
+
* Create an Inngest function from a Beignet job definition.
|
|
304
|
+
*
|
|
305
|
+
* The function validates the incoming Inngest event data against the job payload
|
|
306
|
+
* schema before calling the job handler. `job.retry.attempts` is the total
|
|
307
|
+
* attempt count and is mapped to Inngest retries.
|
|
308
|
+
*/
|
|
235
309
|
export function createInngestJobFunction<
|
|
236
310
|
Ctx,
|
|
237
311
|
J extends JobDef<string, StandardSchema, Ctx>,
|