Skip to content

Commit b4fed86

Browse files
committed
moved warmer overrides
1 parent b3877f4 commit b4fed86

File tree

5 files changed

+118
-88
lines changed

5 files changed

+118
-88
lines changed

packages/open-next/src/adapters/warmer-function.ts

Lines changed: 4 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
import { Warmer } from "types/open-next.js";
2-
31
import { createGenericHandler } from "../core/createGenericHandler.js";
4-
import { debug, error } from "./logger.js";
2+
import { resolveWarmerInvoke } from "../core/resolve.js";
53
import { generateUniqueId } from "./util.js";
64

75
export interface WarmerEvent {
@@ -17,88 +15,6 @@ export interface WarmerResponse {
1715
serverId: string;
1816
}
1917

20-
const resolveWarmerInvoke = async () => {
21-
const openNextParams = globalThis.openNextConfig.warmer!;
22-
if (typeof openNextParams?.invokeFunction === "function") {
23-
return await openNextParams.invokeFunction();
24-
} else {
25-
return Promise.resolve<Warmer>({
26-
name: "aws-invoke",
27-
invoke: async (warmerId: string) => {
28-
const { InvokeCommand, LambdaClient } = await import(
29-
"@aws-sdk/client-lambda"
30-
);
31-
const lambda = new LambdaClient({});
32-
const warmParams = JSON.parse(process.env.WARM_PARAMS!) as {
33-
concurrency: number;
34-
function: string;
35-
}[];
36-
37-
for (const warmParam of warmParams) {
38-
const { concurrency: CONCURRENCY, function: FUNCTION_NAME } =
39-
warmParam;
40-
debug({
41-
event: "warmer invoked",
42-
functionName: FUNCTION_NAME,
43-
concurrency: CONCURRENCY,
44-
warmerId,
45-
});
46-
const ret = await Promise.all(
47-
Array.from({ length: CONCURRENCY }, (_v, i) => i).map((i) => {
48-
try {
49-
return lambda.send(
50-
new InvokeCommand({
51-
FunctionName: FUNCTION_NAME,
52-
InvocationType: "RequestResponse",
53-
Payload: Buffer.from(
54-
JSON.stringify({
55-
type: "warmer",
56-
warmerId,
57-
index: i,
58-
concurrency: CONCURRENCY,
59-
delay: 75,
60-
} satisfies WarmerEvent),
61-
),
62-
}),
63-
);
64-
} catch (e) {
65-
error(`failed to warm up #${i}`, e);
66-
// ignore error
67-
}
68-
}),
69-
);
70-
71-
// Print status
72-
73-
const warmedServerIds = ret
74-
.map((r, i) => {
75-
if (r?.StatusCode !== 200 || !r?.Payload) {
76-
error(`failed to warm up #${i}:`, r?.Payload?.toString());
77-
return;
78-
}
79-
const payload = JSON.parse(
80-
Buffer.from(r.Payload).toString(),
81-
) as WarmerResponse;
82-
return {
83-
statusCode: r.StatusCode,
84-
payload,
85-
type: "warmer" as const,
86-
};
87-
})
88-
.filter((r): r is Exclude<typeof r, undefined> => !!r);
89-
90-
debug({
91-
event: "warmer result",
92-
sent: CONCURRENCY,
93-
success: warmedServerIds.length,
94-
uniqueServersWarmed: [...new Set(warmedServerIds)].length,
95-
});
96-
}
97-
},
98-
});
99-
}
100-
};
101-
10218
export const handler = await createGenericHandler({
10319
handler: defaultHandler,
10420
type: "warmer",
@@ -107,7 +23,9 @@ export const handler = await createGenericHandler({
10723
async function defaultHandler() {
10824
const warmerId = `warmer-${generateUniqueId()}`;
10925

110-
const invokeFn = await resolveWarmerInvoke();
26+
const invokeFn = await resolveWarmerInvoke(
27+
globalThis.openNextConfig.warmer?.invokeFunction,
28+
);
11129

11230
await invokeFn.invoke(warmerId);
11331

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

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
LazyLoadedOverride,
99
OriginResolver,
1010
OverrideOptions,
11+
Warmer,
1112
Wrapper,
1213
} from "types/open-next.js";
1314

@@ -118,7 +119,21 @@ export async function resolveOriginResolver(
118119
if (typeof originResolver === "function") {
119120
return originResolver();
120121
} else {
121-
const m_1 = await import("../overrides/originResolver/env.js");
122+
const m_1 = await import("../overrides/originResolver/pattern-env.js");
123+
return m_1.default;
124+
}
125+
}
126+
127+
/**
128+
* @__PURE__
129+
*/
130+
export async function resolveWarmerInvoke(
131+
warmer?: LazyLoadedOverride<Warmer> | "aws-lambda",
132+
) {
133+
if (typeof warmer === "function") {
134+
return warmer();
135+
} else {
136+
const m_1 = await import("../overrides/warmer/aws-lambda.js");
122137
return m_1.default;
123138
}
124139
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import { Warmer } from "types/open-next";
2+
3+
import { debug, error } from "../../adapters/logger";
4+
import type {
5+
WarmerEvent,
6+
WarmerResponse,
7+
} from "../../adapters/warmer-function";
8+
9+
const lambdaWarmerInvoke: Warmer = {
10+
name: "aws-invoke",
11+
invoke: async (warmerId: string) => {
12+
const { InvokeCommand, LambdaClient } = await import(
13+
"@aws-sdk/client-lambda"
14+
);
15+
const lambda = new LambdaClient({});
16+
const warmParams = JSON.parse(process.env.WARM_PARAMS!) as {
17+
concurrency: number;
18+
function: string;
19+
}[];
20+
21+
for (const warmParam of warmParams) {
22+
const { concurrency: CONCURRENCY, function: FUNCTION_NAME } = warmParam;
23+
debug({
24+
event: "warmer invoked",
25+
functionName: FUNCTION_NAME,
26+
concurrency: CONCURRENCY,
27+
warmerId,
28+
});
29+
const ret = await Promise.all(
30+
Array.from({ length: CONCURRENCY }, (_v, i) => i).map((i) => {
31+
try {
32+
return lambda.send(
33+
new InvokeCommand({
34+
FunctionName: FUNCTION_NAME,
35+
InvocationType: "RequestResponse",
36+
Payload: Buffer.from(
37+
JSON.stringify({
38+
type: "warmer",
39+
warmerId,
40+
index: i,
41+
concurrency: CONCURRENCY,
42+
delay: 75,
43+
} satisfies WarmerEvent),
44+
),
45+
}),
46+
);
47+
} catch (e) {
48+
error(`failed to warm up #${i}`, e);
49+
// ignore error
50+
}
51+
}),
52+
);
53+
54+
// Print status
55+
56+
const warmedServerIds = ret
57+
.map((r, i) => {
58+
if (r?.StatusCode !== 200 || !r?.Payload) {
59+
error(`failed to warm up #${i}:`, r?.Payload?.toString());
60+
return;
61+
}
62+
const payload = JSON.parse(
63+
Buffer.from(r.Payload).toString(),
64+
) as WarmerResponse;
65+
return {
66+
statusCode: r.StatusCode,
67+
payload,
68+
type: "warmer" as const,
69+
};
70+
})
71+
.filter((r): r is Exclude<typeof r, undefined> => !!r);
72+
73+
debug({
74+
event: "warmer result",
75+
sent: CONCURRENCY,
76+
success: warmedServerIds.length,
77+
uniqueServersWarmed: [...new Set(warmedServerIds)].length,
78+
});
79+
}
80+
},
81+
};
82+
83+
export default lambdaWarmerInvoke;

packages/open-next/src/plugins/resolve.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@ import type {
66
ImageLoader,
77
IncludedImageLoader,
88
IncludedOriginResolver,
9+
IncludedWarmer,
910
LazyLoadedOverride,
1011
OriginResolver,
1112
OverrideOptions,
13+
Warmer,
1214
} from "types/open-next";
1315

1416
import logger from "../logger.js";
@@ -24,6 +26,7 @@ export interface IPluginSettings {
2426
originResolver?:
2527
| LazyLoadedOverride<OriginResolver>
2628
| IncludedOriginResolver;
29+
warmer?: LazyLoadedOverride<Warmer> | IncludedWarmer;
2730
};
2831
fnName?: string;
2932
}
@@ -115,6 +118,15 @@ export function openNextResolvePlugin({
115118
)}.js`,
116119
);
117120
}
121+
if (overrides?.warmer) {
122+
contents = contents.replace(
123+
"../overrides/warmer/aws-lambda.js",
124+
`../overrides/warmer/${getOverrideOrDefault(
125+
overrides.warmer,
126+
"aws-lambda",
127+
)}.js`,
128+
);
129+
}
118130
return {
119131
contents,
120132
};

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,8 @@ export type IncludedImageLoader = "s3" | "host";
141141

142142
export type IncludedOriginResolver = "pattern-env";
143143

144+
export type IncludedWarmer = "aws-lambda";
145+
144146
export interface DefaultOverrideOptions<
145147
E extends BaseEventOrResult = InternalEvent,
146148
R extends BaseEventOrResult = InternalResult,
@@ -298,7 +300,7 @@ export interface OpenNextConfig {
298300
* @default undefined
299301
*/
300302
warmer?: DefaultFunctionOptions<WarmerEvent, WarmerResponse> & {
301-
invokeFunction: "aws-lambda" | LazyLoadedOverride<Warmer>;
303+
invokeFunction: IncludedWarmer | LazyLoadedOverride<Warmer>;
302304
};
303305

304306
/**

0 commit comments

Comments
 (0)