Skip to content

Commit c93c0a6

Browse files
authored
feat: use builder plugin metadata to set ODB TTL (#213)
1 parent f3dd8e6 commit c93c0a6

File tree

5 files changed

+33
-20
lines changed

5 files changed

+33
-20
lines changed

src/function/handler.ts

+8-5
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
import type { Context } from './context'
22
import type { Event } from './event'
3-
import type { Response } from './response'
3+
import type { Response, BuilderResponse } from './response'
44

5-
export interface HandlerCallback {
5+
export interface HandlerCallback<ResponseType extends Response = Response> {
66
// eslint-disable-next-line @typescript-eslint/no-explicit-any
7-
(error: any, response: Response): void
7+
(error: any, response: ResponseType): void
88
}
99

10-
export interface Handler<C extends Context = Context> {
11-
(event: Event, context: C, callback: HandlerCallback): void | Response | Promise<Response>
10+
export interface BaseHandler<ResponseType extends Response = Response, C extends Context = Context> {
11+
(event: Event, context: C, callback: HandlerCallback<ResponseType>): void | ResponseType | Promise<ResponseType>
1212
}
13+
14+
export type Handler = BaseHandler<Response, Context>
15+
export type BuilderHandler = BaseHandler<BuilderResponse, Context>

src/function/response.ts

+3
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,6 @@ export interface Response {
99
body?: string
1010
isBase64Encoded?: boolean
1111
}
12+
export interface BuilderResponse extends Response {
13+
ttl?: number
14+
}

src/lib/builder.ts

+9-8
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,27 @@
11
import isPromise from 'is-promise'
22

3-
import { HandlerCallback, HandlerContext, HandlerEvent } from '../function'
4-
import { Handler } from '../function/handler'
5-
import { Response } from '../function/response'
3+
import { HandlerContext, HandlerEvent } from '../function'
4+
import { BuilderHandler, Handler, HandlerCallback } from '../function/handler'
5+
import { Response, BuilderResponse } from '../function/response'
66

77
import { BUILDER_FUNCTIONS_FLAG, HTTP_STATUS_METHOD_NOT_ALLOWED, HTTP_STATUS_OK, METADATA_VERSION } from './consts'
88

9-
const augmentResponse = (response: Response) => {
9+
const augmentResponse = (response: BuilderResponse) => {
1010
if (!response || response.statusCode !== HTTP_STATUS_OK) {
1111
return response
1212
}
13+
const metadata = { version: METADATA_VERSION, builder_function: BUILDER_FUNCTIONS_FLAG, ttl: response.ttl ?? 0 }
1314

1415
return {
1516
...response,
16-
metadata: { version: METADATA_VERSION, builder_function: BUILDER_FUNCTIONS_FLAG },
17+
metadata,
1718
}
1819
}
1920

2021
const wrapHandler =
21-
(handler: Handler<HandlerContext>): Handler<HandlerContext> =>
22+
(handler: BuilderHandler): Handler =>
2223
// eslint-disable-next-line promise/prefer-await-to-callbacks
23-
(event: HandlerEvent, context: HandlerContext, callback: HandlerCallback) => {
24+
(event: HandlerEvent, context: HandlerContext, callback: HandlerCallback<Response>) => {
2425
if (event.httpMethod !== 'GET' && event.httpMethod !== 'HEAD') {
2526
return Promise.resolve({
2627
body: 'Method Not Allowed',
@@ -36,7 +37,7 @@ const wrapHandler =
3637
}
3738

3839
// eslint-disable-next-line promise/prefer-await-to-callbacks
39-
const wrappedCallback = (error: unknown, response: Response) => callback(error, augmentResponse(response))
40+
const wrappedCallback = (error: unknown, response: BuilderResponse) => callback(error, augmentResponse(response))
4041
const execution = handler(modifiedEvent, context, wrappedCallback)
4142

4243
if (isPromise(execution)) {

src/lib/secrets.ts

+10-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Context as HandlerContext, Context } from '../function/context'
22
import { Event as HandlerEvent } from '../function/event'
3-
import { Handler, HandlerCallback } from '../function/handler'
3+
import { BaseHandler, HandlerCallback } from '../function/handler'
4+
import { Response } from '../function/response'
45

56
import { getSecrets, HandlerEventWithOneGraph, NetlifySecrets } from './secrets_helper'
67
// Fine-grained control during the preview, less necessary with a more proactive OneGraph solution
@@ -10,13 +11,17 @@ export interface ContextWithSecrets extends Context {
1011
secrets: NetlifySecrets
1112
}
1213

13-
export type HandlerWithSecrets = Handler<ContextWithSecrets>
14+
export type HandlerWithSecrets = BaseHandler<Response, ContextWithSecrets>
1415

1516
// The common usage of this module
1617
export const withSecrets =
17-
(handler: Handler<ContextWithSecrets>) =>
18-
// eslint-disable-next-line promise/prefer-await-to-callbacks
19-
async (event: HandlerEventWithOneGraph | HandlerEvent, context: HandlerContext, callback: HandlerCallback) => {
18+
(handler: BaseHandler<Response, ContextWithSecrets>) =>
19+
async (
20+
event: HandlerEventWithOneGraph | HandlerEvent,
21+
context: HandlerContext,
22+
// eslint-disable-next-line promise/prefer-await-to-callbacks
23+
callback: HandlerCallback<Response>,
24+
) => {
2025
const secrets = await getSecrets(event as HandlerEventWithOneGraph)
2126

2227
return handler(event, { ...context, secrets }, callback)

test/builder.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@ const { builder } = require('../dist/lib/builder')
44

55
const { invokeLambda } = require('./helpers/main')
66

7-
const METADATA_OBJECT = { metadata: { version: 1, builder_function: true } }
7+
const METADATA_OBJECT = { metadata: { version: 1, builder_function: true, ttl: 0 } }
88

99
test('Injects the metadata object into an asynchronous handler', async (t) => {
1010
const originalResponse = {
1111
body: ':thumbsup:',
1212
statusCode: 200,
13+
ttl: 3600,
1314
}
1415
const myHandler = async () => {
1516
const asyncTask = new Promise((resolve) => {
@@ -22,7 +23,7 @@ test('Injects the metadata object into an asynchronous handler', async (t) => {
2223
}
2324
const response = await invokeLambda(builder(myHandler))
2425

25-
t.deepEqual(response, { ...originalResponse, ...METADATA_OBJECT })
26+
t.deepEqual(response, { ...originalResponse, metadata: { version: 1, builder_function: true, ttl: 3600 } })
2627
})
2728

2829
test('Injects the metadata object into a synchronous handler', async (t) => {

0 commit comments

Comments
 (0)