@beignet/next 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 CHANGED
@@ -1,5 +1,38 @@
1
1
  # @beignet/next
2
2
 
3
+ ## 0.0.3
4
+
5
+ ### Patch Changes
6
+
7
+ - 254ef6d: Add scoped route hooks for route and route-group policy, update auth hooks to expose public/optional/required route-hook factories, and teach CLI route inspection about curried route groups.
8
+ - 4cb1784: Add first-class upload router primitives, a typed browser upload client, a
9
+ React upload adapter, Next.js upload route helper, S3-compatible direct upload
10
+ signing, devtools upload watcher support, an upload generator, and a
11
+ first-class `beignet make feature` command with optional policy, event, job,
12
+ and upload artifacts for the standard vertical slice. Add first-class job retry
13
+ helpers, outbox retry policy integration, and job retry/dead-letter devtools
14
+ events. Add a Next.js outbox drain route helper and doctor warnings for
15
+ serverless background-work footguns.
16
+ - 8bd9085: Add `@beignet/web` as a framework-neutral Web Fetch adapter, include a `@beignet/web/testing` route test harness, and have `@beignet/next` reuse the Web adapter for standard Request/Response handling.
17
+ - Updated dependencies [3160184]
18
+ - Updated dependencies [254ef6d]
19
+ - Updated dependencies [4cb1784]
20
+ - Updated dependencies [8bd9085]
21
+ - @beignet/core@0.0.3
22
+ - @beignet/web@0.0.3
23
+
24
+ ## 0.0.2
25
+
26
+ ### Patch Changes
27
+
28
+ - 90b29ad: Add pagination primitives and generate list responses with `items` and `page`.
29
+ - Updated dependencies [90b29ad]
30
+ - Updated dependencies [07fa19c]
31
+ - Updated dependencies [08bae67]
32
+ - Updated dependencies [730a818]
33
+ - Updated dependencies [a79f60c]
34
+ - @beignet/core@0.0.2
35
+
3
36
  ## 0.0.1
4
37
 
5
38
  - Initial Beignet release under the `@beignet` npm scope.
package/README.md CHANGED
@@ -1,6 +1,10 @@
1
1
  # @beignet/next
2
2
 
3
- Next.js adapter for the framework-agnostic `@beignet/core/server` runtime. It translates Next's `Request`/`Response` to/from the runtime's `HttpRequestLike`/`HttpResponseLike` shapes and provides small helpers for App Router handlers, OpenAPI routes, Swagger UI, and client base URLs.
3
+ Next.js adapter for the framework-agnostic `@beignet/core/server` runtime. It
4
+ builds on `@beignet/web` for standard `Request`/`Response` handling and adds
5
+ Next-specific helpers for App Router handlers, Server Component context,
6
+ OpenAPI routes, Swagger UI, uploads, outbox drains, storage routes, and client
7
+ base URLs.
4
8
 
5
9
  ## Installation
6
10
 
@@ -429,6 +433,67 @@ export const { GET, HEAD } = createStorageRoute(server.ports.storage, {
429
433
  Served responses preserve object `Content-Type`, `Cache-Control`,
430
434
  `Content-Length`, and `Last-Modified` headers when available.
431
435
 
436
+ ## Upload routes
437
+
438
+ Use `createUploadRoute` to expose a Beignet upload router from a focused App
439
+ Router route:
440
+
441
+ ```typescript
442
+ // app/api/uploads/[uploadName]/[action]/route.ts
443
+ import { createUploadRouter } from "@beignet/core/uploads";
444
+ import { createUploadRoute } from "@beignet/next";
445
+ import { postUploads } from "@/features/posts/uploads";
446
+ import { server } from "@/server";
447
+
448
+ const uploadRouter = createUploadRouter({
449
+ uploads: postUploads,
450
+ ctx: () => server.createContextFromNext(),
451
+ storage: server.ports.storage,
452
+ instrumentation: server.ports.devtools,
453
+ });
454
+
455
+ export const { POST } = createUploadRoute(uploadRouter);
456
+ ```
457
+
458
+ The `action` segment must be `prepare`, `upload`, or `complete`.
459
+
460
+ ## Outbox drain routes
461
+
462
+ Use `createOutboxDrainRoute` to expose durable outbox delivery from a cron or
463
+ scheduled serverless route. The helper requires a bearer secret, drains one
464
+ bounded batch with `@beignet/core/outbox`, records a devtools event when
465
+ available, and returns a JSON summary.
466
+
467
+ ```typescript
468
+ // app/api/cron/outbox/drain/route.ts
469
+ import { createOutboxDrainRoute } from "@beignet/next";
470
+ import { env } from "@/lib/env";
471
+ import { server } from "@/server";
472
+ import { outboxRegistry } from "@/server/outbox";
473
+
474
+ export const runtime = "nodejs";
475
+
476
+ export const { GET, POST } = createOutboxDrainRoute({
477
+ server,
478
+ registry: outboxRegistry,
479
+ secret: env.CRON_SECRET,
480
+ batchSize: 100,
481
+ });
482
+ ```
483
+
484
+ Export both `GET` and `POST` when you want the route to work with schedulers
485
+ that call either method. Export only the method your scheduler uses when you
486
+ want a narrower route surface.
487
+
488
+ Call the route from your scheduler with:
489
+
490
+ ```http
491
+ Authorization: Bearer <CRON_SECRET>
492
+ ```
493
+
494
+ Do not start long-running outbox polling loops from provider lifecycle hooks in
495
+ serverless apps.
496
+
432
497
  ## Client creation
433
498
 
434
499
  Use `createNextClient` when a client may run in both browser and server environments. Browser calls default to same-origin relative URLs. Server calls use `NEXT_PUBLIC_API_URL`, then `VERCEL_URL`, then `http://localhost:${PORT || 3000}`.
@@ -555,11 +620,17 @@ Creates a Next.js route handler that serves Swagger UI for an OpenAPI endpoint.
555
620
 
556
621
  ### `toRequestLike(req: Request): HttpRequestLike`
557
622
 
558
- Converts a Next.js `Request` to the framework-agnostic `HttpRequestLike` shape.
623
+ Re-export from `@beignet/web`. Converts a standard `Request` to the
624
+ framework-agnostic `HttpRequestLike` shape.
625
+
626
+ ### `toWebResponse(res: HttpResponseLike): Response`
627
+
628
+ Re-export from `@beignet/web`. Converts an `HttpResponseLike` to a standard
629
+ `Response`.
559
630
 
560
631
  ### `toNextResponse(res: HttpResponseLike): Response`
561
632
 
562
- Converts an `HttpResponseLike` to a Next.js `Response`.
633
+ Next-named alias for `toWebResponse(...)`.
563
634
 
564
635
  These are used internally by the adapter but can be used directly if needed.
565
636
 
@@ -698,7 +769,7 @@ export default async function TodosPage() {
698
769
  <div>
699
770
  <h1>Todos</h1>
700
771
  <ul>
701
- {result.todos.map(todo => (
772
+ {result.items.map(todo => (
702
773
  <li key={todo.id}>{todo.title}</li>
703
774
  ))}
704
775
  </ul>
package/dist/index.d.ts CHANGED
@@ -1,10 +1,26 @@
1
1
  import type { ClientConfig } from "@beignet/core/client";
2
+ import { type DrainOutboxOptions, type OutboxRegistry } from "@beignet/core/outbox";
2
3
  import type { AnyPorts, StoragePort } from "@beignet/core/ports";
3
4
  import type { ProvidedPortsOfList, ServiceProvider } from "@beignet/core/providers";
4
- import type { ContractLike, CreateServerOptions, Handler, HttpRequestLike, HttpResponse, ResolveContract, RouteDef, StandardSchemaV1 } from "@beignet/core/server";
5
- export type { CreateServerOptions, RouteGroup, ServerInstance, } from "@beignet/core/server";
6
- export { contractsFromRoutes, createServer, defineRouteGroup, defineRoutes, } from "@beignet/core/server";
5
+ import type { ContractLike, CreateServerOptions, Handler, ResolveContract, RouteDef, StandardSchemaV1 } from "@beignet/core/server";
6
+ import type { UploadRouter } from "@beignet/core/uploads";
7
+ import { toWebResponse } from "@beignet/web";
8
+ /**
9
+ * Server types re-exported for Next.js apps.
10
+ */
11
+ export type { CreateServerOptions, RouteDef, RouteGroup, RouteHook, ServerInstance, } from "@beignet/core/server";
12
+ /**
13
+ * Server helpers re-exported for Next.js apps.
14
+ */
15
+ export { contractsFromRoutes, createServer, defineRoute, defineRouteGroup, defineRouteHook, defineRoutes, } from "@beignet/core/server";
16
+ /**
17
+ * Web Fetch adapter helpers re-exported for Next.js route helpers.
18
+ */
19
+ export { createFetchHandler, toRequestLike, toWebResponse } from "@beignet/web";
7
20
  type AnyProvider = ServiceProvider<unknown, StandardSchemaV1<any, any>, AnyPorts>;
21
+ /**
22
+ * Beignet client config with Next.js base URL defaults.
23
+ */
8
24
  export type NextClientConfig<TProvidedHeaders extends string = never> = Omit<ClientConfig<TProvidedHeaders>, "baseUrl"> & {
9
25
  /**
10
26
  * Explicit base URL for both browser and server calls.
@@ -18,24 +34,66 @@ export type NextClientConfig<TProvidedHeaders extends string = never> = Omit<Cli
18
34
  */
19
35
  serverBaseUrl?: string | (() => string | undefined);
20
36
  };
37
+ /**
38
+ * OpenAPI server object accepted by `createOpenAPIHandler(...)`.
39
+ */
21
40
  export type OpenAPIServer = {
41
+ /**
42
+ * Server URL.
43
+ */
22
44
  url: string;
45
+ /**
46
+ * Server description.
47
+ */
23
48
  description?: string;
49
+ /**
50
+ * Server URL variables.
51
+ */
24
52
  variables?: Record<string, {
25
53
  default: string;
26
54
  enum?: string[];
27
55
  description?: string;
28
56
  }>;
29
57
  };
58
+ /**
59
+ * Options for the Next.js OpenAPI route handler.
60
+ */
30
61
  export type CreateOpenAPIHandlerOptions = {
62
+ /**
63
+ * API title.
64
+ */
31
65
  title: string;
66
+ /**
67
+ * API version.
68
+ */
32
69
  version: string;
70
+ /**
71
+ * API description.
72
+ */
33
73
  description?: string;
74
+ /**
75
+ * Static servers or a request-aware server factory.
76
+ */
34
77
  servers?: OpenAPIServer[] | ((req: Request) => OpenAPIServer[]);
78
+ /**
79
+ * JSON media type used for generated content.
80
+ */
35
81
  jsonMediaType?: string;
82
+ /**
83
+ * OpenAPI security schemes.
84
+ */
36
85
  securitySchemes?: Record<string, unknown>;
86
+ /**
87
+ * Global security requirements.
88
+ */
37
89
  security?: Array<Record<string, string[]>>;
90
+ /**
91
+ * Custom schema introspector for non-Zod schema libraries.
92
+ */
38
93
  schemaIntrospector?: unknown;
94
+ /**
95
+ * Additional response headers.
96
+ */
39
97
  headers?: HeadersInit | ((req: Request) => HeadersInit | undefined);
40
98
  /**
41
99
  * Add the current request origin as the OpenAPI server when `servers` is omitted.
@@ -44,11 +102,26 @@ export type CreateOpenAPIHandlerOptions = {
44
102
  */
45
103
  inferServersFromRequest?: boolean;
46
104
  };
105
+ /**
106
+ * Options for the Next.js Swagger UI route handler.
107
+ */
47
108
  export type CreateSwaggerUIHandlerOptions = {
109
+ /**
110
+ * HTML page title.
111
+ */
48
112
  title?: string;
113
+ /**
114
+ * URL of the OpenAPI JSON route.
115
+ */
49
116
  specUrl?: string | ((req: Request) => string);
117
+ /**
118
+ * Additional response headers.
119
+ */
50
120
  headers?: HeadersInit | ((req: Request) => HeadersInit | undefined);
51
121
  };
122
+ /**
123
+ * Options for serving public storage objects through a Next.js route.
124
+ */
52
125
  export type CreateStorageRouteOptions = {
53
126
  /**
54
127
  * Public path prefix that maps to storage keys.
@@ -61,18 +134,122 @@ export type CreateStorageRouteOptions = {
61
134
  */
62
135
  headers?: HeadersInit | ((req: Request) => HeadersInit | undefined);
63
136
  };
137
+ /**
138
+ * Options for creating a Next.js upload route.
139
+ */
140
+ export type CreateUploadRouteOptions = {
141
+ /**
142
+ * Static upload name. Omit when using a dynamic `[uploadName]` segment.
143
+ */
144
+ uploadName?: string;
145
+ /**
146
+ * Static upload action. Omit when using a dynamic `[action]` segment.
147
+ */
148
+ action?: "prepare" | "complete" | "upload";
149
+ };
150
+ type OutboxDrainLogger = {
151
+ error(message: string, metadata?: Record<string, unknown>): void;
152
+ };
153
+ type OutboxDrainDevtools = {
154
+ record(event: {
155
+ type: "custom";
156
+ watcher: string;
157
+ name: string;
158
+ label: string;
159
+ summary: string;
160
+ requestId?: string;
161
+ traceId?: string;
162
+ details: unknown;
163
+ }): unknown;
164
+ };
165
+ type OutboxDrainPorts = {
166
+ outbox: DrainOutboxOptions["outbox"];
167
+ eventBus?: DrainOutboxOptions["eventBus"];
168
+ jobs?: DrainOutboxOptions["jobs"];
169
+ logger?: OutboxDrainLogger;
170
+ devtools?: OutboxDrainDevtools;
171
+ };
172
+ type OutboxDrainContext = {
173
+ requestId?: string;
174
+ traceId?: string;
175
+ ports: OutboxDrainPorts;
176
+ };
177
+ /**
178
+ * Options for creating a serverless-safe outbox drain route.
179
+ */
180
+ export type CreateOutboxDrainRouteOptions<Ctx extends OutboxDrainContext> = {
181
+ /**
182
+ * Beignet Next server that owns app context and ports.
183
+ */
184
+ server: Pick<NextServer<Ctx, Ctx["ports"]>, "createContextFromNext">;
185
+ /**
186
+ * Registry of events and jobs that may be delivered from the outbox.
187
+ */
188
+ registry: OutboxRegistry;
189
+ /**
190
+ * Shared secret expected in the `Authorization: Bearer <secret>` header.
191
+ *
192
+ * Missing secrets fail closed with a 500 response so deployments do not
193
+ * accidentally expose an unauthenticated drain route.
194
+ */
195
+ secret?: string;
196
+ /**
197
+ * Maximum messages to claim in one drain pass.
198
+ */
199
+ batchSize?: number;
200
+ /**
201
+ * Claim lease duration in milliseconds.
202
+ */
203
+ leaseMs?: number;
204
+ /**
205
+ * Retry delay override passed through to `drainOutbox(...)`.
206
+ */
207
+ retryDelayMs?: DrainOutboxOptions["retryDelayMs"];
208
+ /**
209
+ * Additional response headers.
210
+ */
211
+ headers?: HeadersInit | ((req: Request) => HeadersInit | undefined);
212
+ };
213
+ type UploadRouteContext = {
214
+ params?: Promise<Record<string, string | string[] | undefined>> | Record<string, string | string[] | undefined>;
215
+ };
216
+ /**
217
+ * Beignet server adapted for Next.js route handlers and server components.
218
+ */
64
219
  export interface NextServer<Ctx, Ports extends AnyPorts = AnyPorts> {
220
+ /**
221
+ * Catch-all Next.js route handler.
222
+ */
65
223
  api: (req: Request) => Promise<Response>;
224
+ /**
225
+ * Register and build a single Next.js route handler imperatively.
226
+ */
66
227
  route: <CLike extends ContractLike>(contractLike: CLike) => {
67
228
  handle: (fn: Handler<Ctx, ResolveContract<CLike>>) => (req: Request) => Promise<Response>;
68
229
  };
230
+ /**
231
+ * Create app context from `next/headers` for Server Components.
232
+ */
69
233
  createContextFromNext: () => Promise<Ctx>;
234
+ /**
235
+ * Registered contract inputs.
236
+ */
70
237
  contracts: readonly ContractLike[];
238
+ /**
239
+ * Stop installed providers.
240
+ */
71
241
  stop: () => Promise<void>;
242
+ /**
243
+ * Final app ports after provider setup.
244
+ */
72
245
  ports: Ports;
73
246
  }
74
- export declare function toRequestLike(req: Request): HttpRequestLike;
75
- export declare function toNextResponse(resLike: HttpResponse): Response;
247
+ /**
248
+ * Convert a Beignet response into a native `Response`.
249
+ *
250
+ * This is the Next-named alias for `toWebResponse(...)` from `@beignet/web`.
251
+ */
252
+ export declare const toNextResponse: typeof toWebResponse;
76
253
  /**
77
254
  * Resolve the right Beignet client base URL for Next.js.
78
255
  *
@@ -105,5 +282,33 @@ export declare function createStorageRoute(storage: StoragePort, options?: Creat
105
282
  GET: (req: Request) => Promise<Response>;
106
283
  HEAD: (req: Request) => Promise<Response>;
107
284
  };
285
+ /**
286
+ * Create a Next.js POST handler for Beignet upload routes.
287
+ *
288
+ * Use this in a dynamic route such as
289
+ * `app/api/uploads/[uploadName]/[action]/route.ts`, where `action` is
290
+ * `prepare`, `complete`, or `upload`.
291
+ */
292
+ export declare function createUploadRoute(router: UploadRouter, options?: CreateUploadRouteOptions): {
293
+ POST: (req: Request, ctx?: UploadRouteContext) => Promise<Response>;
294
+ };
295
+ /**
296
+ * Create Next.js route handlers that drain one durable outbox batch.
297
+ *
298
+ * This helper is intended for serverless cron routes. It performs bounded work
299
+ * and exits; do not start long-running outbox polling loops from provider
300
+ * lifecycle hooks in serverless apps.
301
+ */
302
+ export declare function createOutboxDrainRoute<Ctx extends OutboxDrainContext>(options: CreateOutboxDrainRouteOptions<Ctx>): {
303
+ GET: (req: Request) => Promise<Response>;
304
+ POST: (req: Request) => Promise<Response>;
305
+ };
306
+ /**
307
+ * Create a Beignet server adapted for Next.js.
308
+ *
309
+ * The returned `api` handler is intended for a catch-all route. Focused routes
310
+ * such as OpenAPI, Swagger UI, devtools, and public storage can use their own
311
+ * route helpers.
312
+ */
108
313
  export declare function createNextServer<Ctx, Ports extends AnyPorts = AnyPorts, Routes extends readonly RouteDef<Ctx>[] = readonly RouteDef<Ctx>[], Providers extends readonly AnyProvider[] = readonly AnyProvider[]>(options: CreateServerOptions<Ctx, Ports, Routes, Providers>): Promise<NextServer<Ctx, Ports & ProvidedPortsOfList<Providers>>>;
109
314
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,KAAK,EACV,mBAAmB,EACnB,eAAe,EAChB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EACV,YAAY,EACZ,mBAAmB,EACnB,OAAO,EACP,eAAe,EACf,YAAY,EACZ,eAAe,EACf,QAAQ,EACR,gBAAgB,EACjB,MAAM,sBAAsB,CAAC;AAG9B,YAAY,EACV,mBAAmB,EACnB,UAAU,EACV,cAAc,GACf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,gBAAgB,EAChB,YAAY,GACb,MAAM,sBAAsB,CAAC;AAE9B,KAAK,WAAW,GAAG,eAAe,CAChC,OAAO,EAEP,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,EAC1B,QAAQ,CACT,CAAC;AAEF,MAAM,MAAM,gBAAgB,CAAC,gBAAgB,SAAS,MAAM,GAAG,KAAK,IAAI,IAAI,CAC1E,YAAY,CAAC,gBAAgB,CAAC,EAC9B,SAAS,CACV,GAAG;IACF;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;IAC9C;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;CACrD,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAChB,MAAM,EACN;QACE,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CACF,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,OAAO,KAAK,aAAa,EAAE,CAAC,CAAC;IAChE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,QAAQ,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAC3C,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,OAAO,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC,GAAG,EAAE,OAAO,KAAK,WAAW,GAAG,SAAS,CAAC,CAAC;IACpE;;;;OAIG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,CAAC,CAAC;IAC9C,OAAO,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC,GAAG,EAAE,OAAO,KAAK,WAAW,GAAG,SAAS,CAAC,CAAC;CACrE,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,OAAO,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC,GAAG,EAAE,OAAO,KAAK,WAAW,GAAG,SAAS,CAAC,CAAC;CACrE,CAAC;AAEF,MAAM,WAAW,UAAU,CAAC,GAAG,EAAE,KAAK,SAAS,QAAQ,GAAG,QAAQ;IAChE,GAAG,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzC,KAAK,EAAE,CAAC,KAAK,SAAS,YAAY,EAChC,YAAY,EAAE,KAAK,KAChB;QACH,MAAM,EAAE,CACN,EAAE,EAAE,OAAO,CAAC,GAAG,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,KACrC,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;KAC1C,CAAC;IACF,qBAAqB,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1C,SAAS,EAAE,SAAS,YAAY,EAAE,CAAC;IACnC,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,KAAK,EAAE,KAAK,CAAC;CACd;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,eAAe,CAa3D;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,QAAQ,CAc9D;AAQD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,GAAE,gBAAgB,CAAC,MAAM,CAAM,GACrC,MAAM,CAcR;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,CAAC,gBAAgB,SAAS,MAAM,GAAG,KAAK,EAC5E,MAAM,GAAE,gBAAgB,CAAC,gBAAgB,CAAM,2DAYhD;AA6HD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,SAAS,YAAY,EAAE,EAClC,OAAO,EAAE,2BAA2B,GACnC,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CA6BrC;AAsDD;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,6BAAkC,GAC1C,CAAC,GAAG,EAAE,OAAO,KAAK,QAAQ,CAgB5B;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,WAAW,EACpB,OAAO,GAAE,yBAA8B,GACtC;IACD,GAAG,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzC,IAAI,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;CAC3C,CAOA;AAED,wBAAsB,gBAAgB,CACpC,GAAG,EACH,KAAK,SAAS,QAAQ,GAAG,QAAQ,EACjC,MAAM,SAAS,SAAS,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,SAAS,QAAQ,CAAC,GAAG,CAAC,EAAE,EAClE,SAAS,SAAS,SAAS,WAAW,EAAE,GAAG,SAAS,WAAW,EAAE,EAEjE,OAAO,EAAE,mBAAmB,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,GAC1D,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC,CAqDlE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,32 +1,21 @@
1
1
  import { createClient } from "@beignet/core/client";
2
+ import { drainOutbox, } from "@beignet/core/outbox";
2
3
  import { createServer } from "@beignet/core/server";
3
- export { contractsFromRoutes, createServer, defineRouteGroup, defineRoutes, } from "@beignet/core/server";
4
- export function toRequestLike(req) {
5
- return {
6
- method: req.method,
7
- url: req.url,
8
- headers: new Headers(req.headers),
9
- raw: req,
10
- json: () => req.json(),
11
- text: () => req.text(),
12
- arrayBuffer: () => req.arrayBuffer(),
13
- blob: () => req.blob(),
14
- formData: () => req.formData(),
15
- clone: () => toRequestLike(req.clone()),
16
- };
17
- }
18
- export function toNextResponse(resLike) {
19
- if (resLike instanceof Response) {
20
- return resLike;
21
- }
22
- const headers = new Headers(resLike.headers);
23
- const body = resLike.body;
24
- if (body === undefined || body === null) {
25
- return new Response(null, { status: resLike.status, headers });
26
- }
27
- // biome-ignore lint/suspicious/noExplicitAny: Body can be any JSON-serializable value
28
- return Response.json(body, { status: resLike.status, headers });
29
- }
4
+ import { createFetchHandler, toWebResponse } from "@beignet/web";
5
+ /**
6
+ * Server helpers re-exported for Next.js apps.
7
+ */
8
+ export { contractsFromRoutes, createServer, defineRoute, defineRouteGroup, defineRouteHook, defineRoutes, } from "@beignet/core/server";
9
+ /**
10
+ * Web Fetch adapter helpers re-exported for Next.js route helpers.
11
+ */
12
+ export { createFetchHandler, toRequestLike, toWebResponse } from "@beignet/web";
13
+ /**
14
+ * Convert a Beignet response into a native `Response`.
15
+ *
16
+ * This is the Next-named alias for `toWebResponse(...)` from `@beignet/web`.
17
+ */
18
+ export const toNextResponse = toWebResponse;
30
19
  function resolveConfigValue(value) {
31
20
  return typeof value === "function" ? value() : value;
32
21
  }
@@ -118,6 +107,9 @@ function keyFromStorageRequest(req, basePath) {
118
107
  function storageNotFoundResponse() {
119
108
  return new Response(null, { status: 404 });
120
109
  }
110
+ function firstParam(value) {
111
+ return Array.isArray(value) ? value[0] : value;
112
+ }
121
113
  async function storageResponse(storage, req, basePath, options, includeBody) {
122
114
  const key = keyFromStorageRequest(req, basePath);
123
115
  if (!key)
@@ -256,18 +248,141 @@ export function createStorageRoute(storage, options = {}) {
256
248
  HEAD: (req) => storageResponse(storage, req, basePath, options, false),
257
249
  };
258
250
  }
251
+ /**
252
+ * Create a Next.js POST handler for Beignet upload routes.
253
+ *
254
+ * Use this in a dynamic route such as
255
+ * `app/api/uploads/[uploadName]/[action]/route.ts`, where `action` is
256
+ * `prepare`, `complete`, or `upload`.
257
+ */
258
+ export function createUploadRoute(router, options = {}) {
259
+ return {
260
+ POST: async (req, ctx) => {
261
+ const params = await ctx?.params;
262
+ const uploadName = options.uploadName ?? firstParam(params?.uploadName ?? params?.upload);
263
+ const action = options.action ?? firstParam(params?.action);
264
+ if (!uploadName) {
265
+ return Response.json({
266
+ error: {
267
+ code: "UPLOAD_NOT_FOUND",
268
+ message: "Upload route is missing an upload name.",
269
+ },
270
+ }, { status: 404 });
271
+ }
272
+ if (action !== "prepare" &&
273
+ action !== "complete" &&
274
+ action !== "upload") {
275
+ return Response.json({
276
+ error: {
277
+ code: "INVALID_UPLOAD_ACTION",
278
+ message: 'Upload route action must be "prepare", "complete", or "upload".',
279
+ },
280
+ }, { status: 400 });
281
+ }
282
+ return router.handleRequest(req, {
283
+ uploadName,
284
+ action,
285
+ });
286
+ },
287
+ };
288
+ }
289
+ function outboxDrainJson(body, status, headers) {
290
+ return Response.json(body, {
291
+ status,
292
+ headers,
293
+ });
294
+ }
295
+ /**
296
+ * Create Next.js route handlers that drain one durable outbox batch.
297
+ *
298
+ * This helper is intended for serverless cron routes. It performs bounded work
299
+ * and exits; do not start long-running outbox polling loops from provider
300
+ * lifecycle hooks in serverless apps.
301
+ */
302
+ export function createOutboxDrainRoute(options) {
303
+ const drainPendingOutbox = async (req) => {
304
+ const headers = resolveHeaders(options.headers, req);
305
+ const secret = options.secret;
306
+ if (!secret) {
307
+ return outboxDrainJson({
308
+ ok: false,
309
+ error: "CRON_SECRET is not configured.",
310
+ }, 500, headers);
311
+ }
312
+ if (req.headers.get("authorization") !== `Bearer ${secret}`) {
313
+ return outboxDrainJson({ ok: false, error: "Unauthorized" }, 401, headers);
314
+ }
315
+ let ctx;
316
+ try {
317
+ ctx = await options.server.createContextFromNext();
318
+ const drainCtx = ctx;
319
+ const result = await drainOutbox({
320
+ outbox: drainCtx.ports.outbox,
321
+ registry: options.registry,
322
+ eventBus: drainCtx.ports.eventBus,
323
+ jobs: drainCtx.ports.jobs,
324
+ batchSize: options.batchSize,
325
+ leaseMs: options.leaseMs,
326
+ retryDelayMs: options.retryDelayMs,
327
+ instrumentation: drainCtx.ports.devtools,
328
+ onError(error, message) {
329
+ drainCtx.ports.logger?.error("Outbox delivery failed", {
330
+ error,
331
+ outboxMessageId: message.id,
332
+ kind: message.kind,
333
+ name: message.name,
334
+ attempts: message.attempts,
335
+ });
336
+ },
337
+ });
338
+ try {
339
+ await drainCtx.ports.devtools?.record({
340
+ type: "custom",
341
+ watcher: "outbox",
342
+ name: "outbox.drain",
343
+ label: "Outbox drain",
344
+ summary: `${result.delivered} delivered, ${result.retried} retried, ${result.deadLettered} dead-lettered`,
345
+ requestId: drainCtx.requestId,
346
+ traceId: drainCtx.traceId,
347
+ details: result,
348
+ });
349
+ }
350
+ catch (error) {
351
+ drainCtx.ports.logger?.error("Outbox drain devtools recording failed", {
352
+ error,
353
+ });
354
+ }
355
+ return outboxDrainJson({
356
+ ok: true,
357
+ result,
358
+ }, 200, headers);
359
+ }
360
+ catch (error) {
361
+ ctx?.ports.logger?.error("Outbox drain failed", { error });
362
+ return outboxDrainJson({
363
+ ok: false,
364
+ error: "Outbox drain failed.",
365
+ }, 500, headers);
366
+ }
367
+ };
368
+ return {
369
+ GET: drainPendingOutbox,
370
+ POST: drainPendingOutbox,
371
+ };
372
+ }
373
+ /**
374
+ * Create a Beignet server adapted for Next.js.
375
+ *
376
+ * The returned `api` handler is intended for a catch-all route. Focused routes
377
+ * such as OpenAPI, Swagger UI, devtools, and public storage can use their own
378
+ * route helpers.
379
+ */
259
380
  export async function createNextServer(options) {
260
381
  const runtime = await createServer(options);
261
- const wrap = (handler) => {
262
- return async (req) => {
263
- const res = await handler(toRequestLike(req));
264
- return toNextResponse(res);
265
- };
266
- };
267
382
  return {
268
- api: wrap(runtime.api),
383
+ api: createFetchHandler(runtime),
269
384
  route: (contract) => ({
270
- handle: (fn) => wrap(runtime.route(contract).handle(fn)),
385
+ handle: (fn) => createFetchHandler(runtime.route(contract).handle(fn)),
271
386
  }),
272
387
  createContextFromNext: async () => {
273
388
  const { cookies, headers } = await import("next/headers");
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@beignet/next",
3
- "version": "0.0.1",
3
+ "version": "0.0.3",
4
4
  "type": "module",
5
5
  "description": "Next.js server-side handlers for Beignet",
6
6
  "main": "./dist/index.js",
@@ -57,6 +57,7 @@
57
57
  },
58
58
  "dependencies": {
59
59
  "@beignet/core": "*",
60
+ "@beignet/web": "*",
60
61
  "@standard-schema/spec": "^1.0.0"
61
62
  },
62
63
  "devDependencies": {
package/src/index.ts CHANGED
@@ -1,5 +1,10 @@
1
1
  import type { ClientConfig } from "@beignet/core/client";
2
2
  import { createClient } from "@beignet/core/client";
3
+ import {
4
+ type DrainOutboxOptions,
5
+ drainOutbox,
6
+ type OutboxRegistry,
7
+ } from "@beignet/core/outbox";
3
8
  import type { AnyPorts, StoragePort } from "@beignet/core/ports";
4
9
  import type {
5
10
  ProvidedPortsOfList,
@@ -10,25 +15,41 @@ import type {
10
15
  CreateServerOptions,
11
16
  Handler,
12
17
  HttpRequestLike,
13
- HttpResponse,
14
18
  ResolveContract,
15
19
  RouteDef,
16
20
  StandardSchemaV1,
17
21
  } from "@beignet/core/server";
18
22
  import { createServer } from "@beignet/core/server";
23
+ import type { UploadRouter } from "@beignet/core/uploads";
24
+ import { createFetchHandler, toWebResponse } from "@beignet/web";
19
25
 
26
+ /**
27
+ * Server types re-exported for Next.js apps.
28
+ */
20
29
  export type {
21
30
  CreateServerOptions,
31
+ RouteDef,
22
32
  RouteGroup,
33
+ RouteHook,
23
34
  ServerInstance,
24
35
  } from "@beignet/core/server";
36
+ /**
37
+ * Server helpers re-exported for Next.js apps.
38
+ */
25
39
  export {
26
40
  contractsFromRoutes,
27
41
  createServer,
42
+ defineRoute,
28
43
  defineRouteGroup,
44
+ defineRouteHook,
29
45
  defineRoutes,
30
46
  } from "@beignet/core/server";
31
47
 
48
+ /**
49
+ * Web Fetch adapter helpers re-exported for Next.js route helpers.
50
+ */
51
+ export { createFetchHandler, toRequestLike, toWebResponse } from "@beignet/web";
52
+
32
53
  type AnyProvider = ServiceProvider<
33
54
  unknown,
34
55
  // biome-ignore lint/suspicious/noExplicitAny: provider config types are erased at this level
@@ -36,6 +57,9 @@ type AnyProvider = ServiceProvider<
36
57
  AnyPorts
37
58
  >;
38
59
 
60
+ /**
61
+ * Beignet client config with Next.js base URL defaults.
62
+ */
39
63
  export type NextClientConfig<TProvidedHeaders extends string = never> = Omit<
40
64
  ClientConfig<TProvidedHeaders>,
41
65
  "baseUrl"
@@ -53,9 +77,21 @@ export type NextClientConfig<TProvidedHeaders extends string = never> = Omit<
53
77
  serverBaseUrl?: string | (() => string | undefined);
54
78
  };
55
79
 
80
+ /**
81
+ * OpenAPI server object accepted by `createOpenAPIHandler(...)`.
82
+ */
56
83
  export type OpenAPIServer = {
84
+ /**
85
+ * Server URL.
86
+ */
57
87
  url: string;
88
+ /**
89
+ * Server description.
90
+ */
58
91
  description?: string;
92
+ /**
93
+ * Server URL variables.
94
+ */
59
95
  variables?: Record<
60
96
  string,
61
97
  {
@@ -66,15 +102,45 @@ export type OpenAPIServer = {
66
102
  >;
67
103
  };
68
104
 
105
+ /**
106
+ * Options for the Next.js OpenAPI route handler.
107
+ */
69
108
  export type CreateOpenAPIHandlerOptions = {
109
+ /**
110
+ * API title.
111
+ */
70
112
  title: string;
113
+ /**
114
+ * API version.
115
+ */
71
116
  version: string;
117
+ /**
118
+ * API description.
119
+ */
72
120
  description?: string;
121
+ /**
122
+ * Static servers or a request-aware server factory.
123
+ */
73
124
  servers?: OpenAPIServer[] | ((req: Request) => OpenAPIServer[]);
125
+ /**
126
+ * JSON media type used for generated content.
127
+ */
74
128
  jsonMediaType?: string;
129
+ /**
130
+ * OpenAPI security schemes.
131
+ */
75
132
  securitySchemes?: Record<string, unknown>;
133
+ /**
134
+ * Global security requirements.
135
+ */
76
136
  security?: Array<Record<string, string[]>>;
137
+ /**
138
+ * Custom schema introspector for non-Zod schema libraries.
139
+ */
77
140
  schemaIntrospector?: unknown;
141
+ /**
142
+ * Additional response headers.
143
+ */
78
144
  headers?: HeadersInit | ((req: Request) => HeadersInit | undefined);
79
145
  /**
80
146
  * Add the current request origin as the OpenAPI server when `servers` is omitted.
@@ -84,12 +150,27 @@ export type CreateOpenAPIHandlerOptions = {
84
150
  inferServersFromRequest?: boolean;
85
151
  };
86
152
 
153
+ /**
154
+ * Options for the Next.js Swagger UI route handler.
155
+ */
87
156
  export type CreateSwaggerUIHandlerOptions = {
157
+ /**
158
+ * HTML page title.
159
+ */
88
160
  title?: string;
161
+ /**
162
+ * URL of the OpenAPI JSON route.
163
+ */
89
164
  specUrl?: string | ((req: Request) => string);
165
+ /**
166
+ * Additional response headers.
167
+ */
90
168
  headers?: HeadersInit | ((req: Request) => HeadersInit | undefined);
91
169
  };
92
170
 
171
+ /**
172
+ * Options for serving public storage objects through a Next.js route.
173
+ */
93
174
  export type CreateStorageRouteOptions = {
94
175
  /**
95
176
  * Public path prefix that maps to storage keys.
@@ -103,8 +184,105 @@ export type CreateStorageRouteOptions = {
103
184
  headers?: HeadersInit | ((req: Request) => HeadersInit | undefined);
104
185
  };
105
186
 
187
+ /**
188
+ * Options for creating a Next.js upload route.
189
+ */
190
+ export type CreateUploadRouteOptions = {
191
+ /**
192
+ * Static upload name. Omit when using a dynamic `[uploadName]` segment.
193
+ */
194
+ uploadName?: string;
195
+ /**
196
+ * Static upload action. Omit when using a dynamic `[action]` segment.
197
+ */
198
+ action?: "prepare" | "complete" | "upload";
199
+ };
200
+
201
+ type OutboxDrainLogger = {
202
+ error(message: string, metadata?: Record<string, unknown>): void;
203
+ };
204
+
205
+ type OutboxDrainDevtools = {
206
+ record(event: {
207
+ type: "custom";
208
+ watcher: string;
209
+ name: string;
210
+ label: string;
211
+ summary: string;
212
+ requestId?: string;
213
+ traceId?: string;
214
+ details: unknown;
215
+ }): unknown;
216
+ };
217
+
218
+ type OutboxDrainPorts = {
219
+ outbox: DrainOutboxOptions["outbox"];
220
+ eventBus?: DrainOutboxOptions["eventBus"];
221
+ jobs?: DrainOutboxOptions["jobs"];
222
+ logger?: OutboxDrainLogger;
223
+ devtools?: OutboxDrainDevtools;
224
+ };
225
+
226
+ type OutboxDrainContext = {
227
+ requestId?: string;
228
+ traceId?: string;
229
+ ports: OutboxDrainPorts;
230
+ };
231
+
232
+ /**
233
+ * Options for creating a serverless-safe outbox drain route.
234
+ */
235
+ export type CreateOutboxDrainRouteOptions<Ctx extends OutboxDrainContext> = {
236
+ /**
237
+ * Beignet Next server that owns app context and ports.
238
+ */
239
+ server: Pick<NextServer<Ctx, Ctx["ports"]>, "createContextFromNext">;
240
+ /**
241
+ * Registry of events and jobs that may be delivered from the outbox.
242
+ */
243
+ registry: OutboxRegistry;
244
+ /**
245
+ * Shared secret expected in the `Authorization: Bearer <secret>` header.
246
+ *
247
+ * Missing secrets fail closed with a 500 response so deployments do not
248
+ * accidentally expose an unauthenticated drain route.
249
+ */
250
+ secret?: string;
251
+ /**
252
+ * Maximum messages to claim in one drain pass.
253
+ */
254
+ batchSize?: number;
255
+ /**
256
+ * Claim lease duration in milliseconds.
257
+ */
258
+ leaseMs?: number;
259
+ /**
260
+ * Retry delay override passed through to `drainOutbox(...)`.
261
+ */
262
+ retryDelayMs?: DrainOutboxOptions["retryDelayMs"];
263
+ /**
264
+ * Additional response headers.
265
+ */
266
+ headers?: HeadersInit | ((req: Request) => HeadersInit | undefined);
267
+ };
268
+
269
+ type UploadRouteContext = {
270
+ params?:
271
+ | Promise<Record<string, string | string[] | undefined>>
272
+ | Record<string, string | string[] | undefined>;
273
+ };
274
+
275
+ /**
276
+ * Beignet server adapted for Next.js route handlers and server components.
277
+ */
106
278
  export interface NextServer<Ctx, Ports extends AnyPorts = AnyPorts> {
279
+ /**
280
+ * Catch-all Next.js route handler.
281
+ */
107
282
  api: (req: Request) => Promise<Response>;
283
+ /**
284
+ * Register and build a single Next.js route handler imperatively.
285
+ */
108
286
  route: <CLike extends ContractLike>(
109
287
  contractLike: CLike,
110
288
  ) => {
@@ -112,42 +290,30 @@ export interface NextServer<Ctx, Ports extends AnyPorts = AnyPorts> {
112
290
  fn: Handler<Ctx, ResolveContract<CLike>>,
113
291
  ) => (req: Request) => Promise<Response>;
114
292
  };
293
+ /**
294
+ * Create app context from `next/headers` for Server Components.
295
+ */
115
296
  createContextFromNext: () => Promise<Ctx>;
297
+ /**
298
+ * Registered contract inputs.
299
+ */
116
300
  contracts: readonly ContractLike[];
301
+ /**
302
+ * Stop installed providers.
303
+ */
117
304
  stop: () => Promise<void>;
305
+ /**
306
+ * Final app ports after provider setup.
307
+ */
118
308
  ports: Ports;
119
309
  }
120
310
 
121
- export function toRequestLike(req: Request): HttpRequestLike {
122
- return {
123
- method: req.method,
124
- url: req.url,
125
- headers: new Headers(req.headers),
126
- raw: req,
127
- json: () => req.json(),
128
- text: () => req.text(),
129
- arrayBuffer: () => req.arrayBuffer(),
130
- blob: () => req.blob(),
131
- formData: () => req.formData(),
132
- clone: () => toRequestLike(req.clone()),
133
- };
134
- }
135
-
136
- export function toNextResponse(resLike: HttpResponse): Response {
137
- if (resLike instanceof Response) {
138
- return resLike;
139
- }
140
-
141
- const headers = new Headers(resLike.headers);
142
- const body = resLike.body;
143
-
144
- if (body === undefined || body === null) {
145
- return new Response(null, { status: resLike.status, headers });
146
- }
147
-
148
- // biome-ignore lint/suspicious/noExplicitAny: Body can be any JSON-serializable value
149
- return Response.json(body as any, { status: resLike.status, headers });
150
- }
311
+ /**
312
+ * Convert a Beignet response into a native `Response`.
313
+ *
314
+ * This is the Next-named alias for `toWebResponse(...)` from `@beignet/web`.
315
+ */
316
+ export const toNextResponse = toWebResponse;
151
317
 
152
318
  function resolveConfigValue(
153
319
  value: string | (() => string | undefined) | undefined,
@@ -280,6 +446,10 @@ function storageNotFoundResponse(): Response {
280
446
  return new Response(null, { status: 404 });
281
447
  }
282
448
 
449
+ function firstParam(value: string | string[] | undefined): string | undefined {
450
+ return Array.isArray(value) ? value[0] : value;
451
+ }
452
+
283
453
  async function storageResponse(
284
454
  storage: StoragePort,
285
455
  req: Request,
@@ -456,6 +626,187 @@ export function createStorageRoute(
456
626
  };
457
627
  }
458
628
 
629
+ /**
630
+ * Create a Next.js POST handler for Beignet upload routes.
631
+ *
632
+ * Use this in a dynamic route such as
633
+ * `app/api/uploads/[uploadName]/[action]/route.ts`, where `action` is
634
+ * `prepare`, `complete`, or `upload`.
635
+ */
636
+ export function createUploadRoute(
637
+ router: UploadRouter,
638
+ options: CreateUploadRouteOptions = {},
639
+ ): {
640
+ POST: (req: Request, ctx?: UploadRouteContext) => Promise<Response>;
641
+ } {
642
+ return {
643
+ POST: async (req, ctx) => {
644
+ const params = await ctx?.params;
645
+ const uploadName =
646
+ options.uploadName ?? firstParam(params?.uploadName ?? params?.upload);
647
+ const action = options.action ?? firstParam(params?.action);
648
+
649
+ if (!uploadName) {
650
+ return Response.json(
651
+ {
652
+ error: {
653
+ code: "UPLOAD_NOT_FOUND",
654
+ message: "Upload route is missing an upload name.",
655
+ },
656
+ },
657
+ { status: 404 },
658
+ );
659
+ }
660
+
661
+ if (
662
+ action !== "prepare" &&
663
+ action !== "complete" &&
664
+ action !== "upload"
665
+ ) {
666
+ return Response.json(
667
+ {
668
+ error: {
669
+ code: "INVALID_UPLOAD_ACTION",
670
+ message:
671
+ 'Upload route action must be "prepare", "complete", or "upload".',
672
+ },
673
+ },
674
+ { status: 400 },
675
+ );
676
+ }
677
+
678
+ return router.handleRequest(req, {
679
+ uploadName,
680
+ action,
681
+ });
682
+ },
683
+ };
684
+ }
685
+
686
+ function outboxDrainJson(
687
+ body: unknown,
688
+ status: number,
689
+ headers: HeadersInit | undefined,
690
+ ): Response {
691
+ return Response.json(body, {
692
+ status,
693
+ headers,
694
+ });
695
+ }
696
+
697
+ /**
698
+ * Create Next.js route handlers that drain one durable outbox batch.
699
+ *
700
+ * This helper is intended for serverless cron routes. It performs bounded work
701
+ * and exits; do not start long-running outbox polling loops from provider
702
+ * lifecycle hooks in serverless apps.
703
+ */
704
+ export function createOutboxDrainRoute<Ctx extends OutboxDrainContext>(
705
+ options: CreateOutboxDrainRouteOptions<Ctx>,
706
+ ): {
707
+ GET: (req: Request) => Promise<Response>;
708
+ POST: (req: Request) => Promise<Response>;
709
+ } {
710
+ const drainPendingOutbox = async (req: Request): Promise<Response> => {
711
+ const headers = resolveHeaders(options.headers, req);
712
+ const secret = options.secret;
713
+
714
+ if (!secret) {
715
+ return outboxDrainJson(
716
+ {
717
+ ok: false,
718
+ error: "CRON_SECRET is not configured.",
719
+ },
720
+ 500,
721
+ headers,
722
+ );
723
+ }
724
+
725
+ if (req.headers.get("authorization") !== `Bearer ${secret}`) {
726
+ return outboxDrainJson(
727
+ { ok: false, error: "Unauthorized" },
728
+ 401,
729
+ headers,
730
+ );
731
+ }
732
+
733
+ let ctx: Ctx | undefined;
734
+
735
+ try {
736
+ ctx = await options.server.createContextFromNext();
737
+ const drainCtx = ctx;
738
+ const result = await drainOutbox({
739
+ outbox: drainCtx.ports.outbox,
740
+ registry: options.registry,
741
+ eventBus: drainCtx.ports.eventBus,
742
+ jobs: drainCtx.ports.jobs,
743
+ batchSize: options.batchSize,
744
+ leaseMs: options.leaseMs,
745
+ retryDelayMs: options.retryDelayMs,
746
+ instrumentation: drainCtx.ports.devtools,
747
+ onError(error, message) {
748
+ drainCtx.ports.logger?.error("Outbox delivery failed", {
749
+ error,
750
+ outboxMessageId: message.id,
751
+ kind: message.kind,
752
+ name: message.name,
753
+ attempts: message.attempts,
754
+ });
755
+ },
756
+ });
757
+
758
+ try {
759
+ await drainCtx.ports.devtools?.record({
760
+ type: "custom",
761
+ watcher: "outbox",
762
+ name: "outbox.drain",
763
+ label: "Outbox drain",
764
+ summary: `${result.delivered} delivered, ${result.retried} retried, ${result.deadLettered} dead-lettered`,
765
+ requestId: drainCtx.requestId,
766
+ traceId: drainCtx.traceId,
767
+ details: result,
768
+ });
769
+ } catch (error) {
770
+ drainCtx.ports.logger?.error("Outbox drain devtools recording failed", {
771
+ error,
772
+ });
773
+ }
774
+
775
+ return outboxDrainJson(
776
+ {
777
+ ok: true,
778
+ result,
779
+ },
780
+ 200,
781
+ headers,
782
+ );
783
+ } catch (error) {
784
+ ctx?.ports.logger?.error("Outbox drain failed", { error });
785
+
786
+ return outboxDrainJson(
787
+ {
788
+ ok: false,
789
+ error: "Outbox drain failed.",
790
+ },
791
+ 500,
792
+ headers,
793
+ );
794
+ }
795
+ };
796
+
797
+ return {
798
+ GET: drainPendingOutbox,
799
+ POST: drainPendingOutbox,
800
+ };
801
+ }
802
+
803
+ /**
804
+ * Create a Beignet server adapted for Next.js.
805
+ *
806
+ * The returned `api` handler is intended for a catch-all route. Focused routes
807
+ * such as OpenAPI, Swagger UI, devtools, and public storage can use their own
808
+ * route helpers.
809
+ */
459
810
  export async function createNextServer<
460
811
  Ctx,
461
812
  Ports extends AnyPorts = AnyPorts,
@@ -466,17 +817,10 @@ export async function createNextServer<
466
817
  ): Promise<NextServer<Ctx, Ports & ProvidedPortsOfList<Providers>>> {
467
818
  const runtime = await createServer(options);
468
819
 
469
- const wrap = (handler: (req: HttpRequestLike) => Promise<HttpResponse>) => {
470
- return async (req: Request) => {
471
- const res = await handler(toRequestLike(req));
472
- return toNextResponse(res);
473
- };
474
- };
475
-
476
820
  return {
477
- api: wrap(runtime.api),
821
+ api: createFetchHandler(runtime),
478
822
  route: (contract) => ({
479
- handle: (fn) => wrap(runtime.route(contract).handle(fn)),
823
+ handle: (fn) => createFetchHandler(runtime.route(contract).handle(fn)),
480
824
  }),
481
825
  createContextFromNext: async () => {
482
826
  const { cookies, headers } = await import("next/headers");