Skip to content

Commit ea04483

Browse files
committed
fixup! +OpenNextHandlerOptions +changeset
1 parent 9b17724 commit ea04483

File tree

8 files changed

+54
-22
lines changed

8 files changed

+54
-22
lines changed

.changeset/pink-papayas-smoke.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
---
2+
"@opennextjs/aws": minor
3+
---
4+
5+
refactor: `waitUntil` passed around via ALS.
6+
7+
BREAKING CHANGE: `waitUntil` is passed around via ALS to fix #713.
8+
9+
`globalThis.openNextWaitUntil` is no more available, you can access `waitUntil`
10+
on the ALS context: `globalThis.__openNextAls.getStore()`
11+
12+
The `OpenNextHandler` signature has changed: the second parameter was a `StreamCreator`.
13+
It was changed to be of type `OpenNextHandlerOptions` which has both a `streamCreator` key
14+
and a `waitUntil` key.
15+
16+
If you use a custom wrapper, you need to update the call to the handler as follow:
17+
18+
```ts
19+
// before
20+
globalThis.openNextWaitUntil = myWaitUntil;
21+
handler(internalEvent, myStreamCreator);
22+
23+
// after
24+
handler(internalEvent, { streamCreator: myStreamCreator, waitUntil: myWaitUntil });
25+
```

packages/open-next/src/adapters/edge-adapter.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,13 @@ import {
1111
convertBodyToReadableStream,
1212
convertToQueryString,
1313
} from "../core/routing/util";
14+
import type { OpenNextHandlerOptions } from "types/overrides";
1415

1516
globalThis.__openNextAls = new AsyncLocalStorage();
1617

1718
const defaultHandler = async (
1819
internalEvent: InternalEvent,
19-
options?: { waitUntil?: WaitUntil },
20+
options?: OpenNextHandlerOptions,
2021
): Promise<InternalResult> => {
2122
globalThis.isEdgeRuntime = true;
2223

packages/open-next/src/adapters/image-optimization-adapter.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@ import type {
2222
InternalEvent,
2323
InternalResult,
2424
StreamCreator,
25-
WaitUntil,
2625
} from "types/open-next.js";
2726
import { emptyReadableStream, toReadableStream } from "utils/stream.js";
2827

28+
import type { OpenNextHandlerOptions } from "types/overrides.js";
2929
import { createGenericHandler } from "../core/createGenericHandler.js";
3030
import { resolveImageLoader } from "../core/resolve.js";
3131
import { debug, error } from "./logger.js";
@@ -59,7 +59,7 @@ export const handler = await createGenericHandler({
5959

6060
export async function defaultHandler(
6161
event: InternalEvent,
62-
options?: { streamCreator?: StreamCreator; waitUntil?: WaitUntil },
62+
options?: OpenNextHandlerOptions,
6363
): Promise<InternalResult> {
6464
// Images are handled via header and query param information.
6565
debug("handler event", event);

packages/open-next/src/adapters/middleware.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ import type {
22
InternalEvent,
33
InternalResult,
44
MiddlewareResult,
5-
WaitUntil,
65
} from "types/open-next";
76
import { runWithOpenNextRequestContext } from "utils/promise";
87

8+
import type { OpenNextHandlerOptions } from "types/overrides";
99
import { debug, error } from "../adapters/logger";
1010
import { createGenericHandler } from "../core/createGenericHandler";
1111
import {
@@ -25,7 +25,7 @@ globalThis.__openNextAls = new AsyncLocalStorage();
2525

2626
const defaultHandler = async (
2727
internalEvent: InternalEvent,
28-
options?: { waitUntil?: WaitUntil },
28+
options?: OpenNextHandlerOptions,
2929
): Promise<InternalResult | MiddlewareResult> => {
3030
const originResolver = await resolveOriginResolver(
3131
globalThis.openNextConfig.middleware?.originResolver,

packages/open-next/src/core/requestHandler.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,10 @@ import type {
77
InternalResult,
88
ResolvedRoute,
99
RoutingResult,
10-
StreamCreator,
11-
WaitUntil,
1210
} from "types/open-next";
1311
import { runWithOpenNextRequestContext } from "utils/promise";
1412

13+
import type { OpenNextHandlerOptions } from "types/overrides";
1514
import { debug, error, warn } from "../adapters/logger";
1615
import { patchAsyncStorage } from "./patchAsyncStorage";
1716
import { convertRes, createServerResponse } from "./routing/util";
@@ -30,10 +29,7 @@ patchAsyncStorage();
3029

3130
export async function openNextHandler(
3231
internalEvent: InternalEvent,
33-
options?: {
34-
streamCreator?: StreamCreator;
35-
waitUntil?: WaitUntil;
36-
},
32+
options?: OpenNextHandlerOptions,
3733
): Promise<InternalResult> {
3834
const initialHeaders = internalEvent.headers;
3935
// We run everything in the async local storage context so that it is available in the middleware as well as in NextServer

packages/open-next/src/overrides/wrappers/dummy.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
import type { InternalEvent, StreamCreator, WaitUntil } from "types/open-next";
2-
import type { Wrapper, WrapperHandler } from "types/overrides";
1+
import type { InternalEvent } from "types/open-next";
2+
import type {
3+
OpenNextHandlerOptions,
4+
Wrapper,
5+
WrapperHandler,
6+
} from "types/overrides";
37

48
const dummyWrapper: WrapperHandler = async (handler, converter) => {
5-
return async (
6-
event: InternalEvent,
7-
options?: { streamCreator?: StreamCreator; waitUntil?: WaitUntil },
8-
) => {
9+
return async (event: InternalEvent, options?: OpenNextHandlerOptions) => {
910
return await handler(event, options);
1011
};
1112
};

packages/open-next/src/types/overrides.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -123,13 +123,17 @@ export type Wrapper<
123123
edgeRuntime?: boolean;
124124
};
125125

126+
export type OpenNextHandlerOptions = {
127+
// Create a `Writeable` for streaming responses.
128+
streamCreator?: StreamCreator;
129+
// Extends the liftetime of the runtime after the response is returned.
130+
waitUntil?: WaitUntil;
131+
};
132+
126133
export type OpenNextHandler<
127134
E extends BaseEventOrResult = InternalEvent,
128135
R extends BaseEventOrResult = InternalResult,
129-
> = (
130-
event: E,
131-
options?: { streamCreator?: StreamCreator; waitUntil?: WaitUntil },
132-
) => Promise<R>;
136+
> = (event: E, options?: OpenNextHandlerOptions) => Promise<R>;
133137

134138
export type Converter<
135139
E extends BaseEventOrResult = InternalEvent,

packages/open-next/src/utils/promise.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,12 @@ export function runWithOpenNextRequestContext<T>(
106106
{
107107
isISRRevalidation,
108108
waitUntil,
109-
}: { isISRRevalidation: boolean; waitUntil?: WaitUntil },
109+
}: {
110+
// Whether we are in ISR revalidation
111+
isISRRevalidation: boolean;
112+
// Extends the liftetime of the runtime after the response is returned.
113+
waitUntil?: WaitUntil;
114+
},
110115
fn: () => Promise<T>,
111116
): Promise<T> {
112117
return globalThis.__openNextAls.run(

0 commit comments

Comments
 (0)