Skip to content

Commit d50b7e7

Browse files
committed
fix: refactor proxy and add deprecation warnings
1 parent 4b5ca7a commit d50b7e7

File tree

6 files changed

+172
-140
lines changed

6 files changed

+172
-140
lines changed

__tests__/integration.js

Lines changed: 59 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,13 @@ describe.each(EACH_MATRIX)('%s:%s: integration tests', (eventSourceName, framewo
2222
serverlessExpressInstance = serverlessExpress({ app })
2323
})
2424

25-
test('handler returns promise', () => {
25+
test('serverlessExpressInstance returns promise', () => {
2626
const event = makeEvent({
2727
eventSourceName,
2828
path: '/',
2929
httpMethod: 'GET'
3030
})
31-
const response = serverlessExpressInstance.handler(event)
31+
const response = serverlessExpressInstance(event)
3232
expect(response.then).toBeTruthy()
3333
})
3434

@@ -452,7 +452,7 @@ describe.each(EACH_MATRIX)('%s:%s: integration tests', (eventSourceName, framewo
452452
// expect(customLogger.debug.mock.calls.length).toBe(0)
453453
})
454454

455-
test('legacy/deprecated usage', async () => {
455+
test('legacy/deprecated createServer', async () => {
456456
const serverlessExpressMiddleware = require('../src/middleware')
457457
app = express()
458458
router = express.Router()
@@ -484,4 +484,60 @@ describe.each(EACH_MATRIX)('%s:%s: integration tests', (eventSourceName, framewo
484484
})
485485
expect(response).toEqual(expectedResponse)
486486
})
487+
488+
test('legacy/deprecated handler', async () => {
489+
const serverlessExpressMiddleware = require('../src/middleware')
490+
router.use(serverlessExpressMiddleware.eventContext())
491+
router.get('/users', (req, res) => {
492+
const { event } = req.apiGateway
493+
const eventPath = event.path || event.rawPath || event.Records[0].cf.request.uri
494+
res.json({
495+
path: eventPath
496+
})
497+
})
498+
const event = makeEvent({
499+
eventSourceName,
500+
path: '/users',
501+
httpMethod: 'GET'
502+
})
503+
const response = await serverlessExpressInstance.handler(event)
504+
const expectedResponse = makeResponse({
505+
eventSourceName,
506+
body: JSON.stringify({ path: '/users' }),
507+
multiValueHeaders: {
508+
'content-length': ['17'],
509+
etag: ['W/"11-eM8YArY+qNwdvTL2ppeAaFc4Oq8"']
510+
},
511+
statusCode: 200
512+
})
513+
expect(response).toEqual(expectedResponse)
514+
})
515+
516+
test('legacy/deprecated proxy', async () => {
517+
const serverlessExpressMiddleware = require('../src/middleware')
518+
router.use(serverlessExpressMiddleware.eventContext())
519+
router.get('/users', (req, res) => {
520+
const { event } = req.apiGateway
521+
const eventPath = event.path || event.rawPath || event.Records[0].cf.request.uri
522+
res.json({
523+
path: eventPath
524+
})
525+
})
526+
const event = makeEvent({
527+
eventSourceName,
528+
path: '/users',
529+
httpMethod: 'GET'
530+
})
531+
const response = await serverlessExpressInstance.proxy({ event })
532+
const expectedResponse = makeResponse({
533+
eventSourceName,
534+
body: JSON.stringify({ path: '/users' }),
535+
multiValueHeaders: {
536+
'content-length': ['17'],
537+
etag: ['W/"11-eM8YArY+qNwdvTL2ppeAaFc4Oq8"']
538+
},
539+
statusCode: 200
540+
})
541+
expect(response).toEqual(expectedResponse)
542+
})
487543
})

src/configure.d.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,17 @@
11
import { RequestListener } from "http"
22
import { Handler } from "aws-lambda"
33
import Logger from "./logger"
4-
import ProxyParams from "./proxy"
54

5+
interface ProxyParams {
6+
app: RequestListener,
7+
binaryMimeTypes?: string[],
8+
binarySettings?: BinarySettings
9+
}
10+
11+
interface BinarySettings {
12+
isBinary?: Function | boolean,
13+
contentTypes?: string[]
14+
}
615
interface ConfigureParams {
716
app: RequestListener,
817
binaryMimeTypes?: string[],
@@ -22,4 +31,6 @@ interface ConfigureResult {
2231

2332
declare function configure(configureParams: ConfigureParams): ConfigureResult
2433

34+
// declare function proxy(proxyParams: ProxyParams): Promise<any>
35+
2536
export default configure

src/configure.js

Lines changed: 100 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,21 @@
1-
const { getFramework } = require('./frameworks')
1+
const util = require('util')
22
const logger = require('./logger')
3-
const proxy = require('./proxy')
3+
const { setCurrentInvoke } = require('./current-invoke')
4+
const { getEventSource } = require('./event-sources')
5+
const { getEventSourceNameBasedOnEvent } = require('./event-sources/utils')
6+
const { getFramework } = require('./frameworks')
7+
const makeResolver = require('./make-resolver')
8+
const { forwardRequestToNodeServer, respondToEventSourceWithError } = require('./transport')
9+
10+
const DEFAULT_BINARY_ENCODINGS = ['gzip', 'deflate', 'br']
11+
const DEFAULT_BINARY_CONTENT_TYPES = ['image/*']
12+
13+
function getDefaultBinarySettings (deprecatedBinaryMimeTypes) {
14+
return {
15+
contentTypes: deprecatedBinaryMimeTypes || DEFAULT_BINARY_CONTENT_TYPES,
16+
contentEncodings: DEFAULT_BINARY_ENCODINGS
17+
}
18+
}
419

520
function configure ({
621
app: configureApp,
@@ -12,44 +27,93 @@ function configure ({
1227
resolutionMode: configureResolutionMode = 'PROMISE',
1328
eventSourceName: configureEventSourceName,
1429
eventSource: configureEventFns,
15-
respondWithErrors: configureRespondWithErrors = process.env.NODE_ENV === 'development',
16-
proxy: configureProxy = ({
17-
app: configureProxyApp = configureApp,
18-
framework: configureProxyFramework = configureFramework,
30+
respondWithErrors: configureRespondWithErrors = process.env.NODE_ENV === 'development'
31+
} = {}) {
32+
function proxy ({
33+
app = configureApp,
34+
framework = configureFramework,
35+
event = {},
36+
context = {},
37+
callback = null,
1938
resolutionMode = configureResolutionMode,
20-
event,
21-
context,
22-
callback,
23-
eventSourceName = configureEventSourceName,
39+
eventSourceName = configureEventSourceName || getEventSourceNameBasedOnEvent({ event }),
2440
binaryMimeTypes = configureBinaryMimeTypes,
25-
binarySettings = configureBinarySettings,
26-
eventSource = configureEventFns,
41+
binarySettings = configureBinarySettings || getDefaultBinarySettings(binaryMimeTypes),
42+
eventSource = configureEventFns || getEventSource({ eventSourceName }),
2743
log = configureLog,
2844
respondWithErrors = configureRespondWithErrors
29-
} = {}) => proxy({
30-
app: configureProxyApp,
31-
framework: configureProxyFramework,
32-
event,
33-
context,
34-
resolutionMode,
35-
callback,
36-
eventSourceName,
37-
binaryMimeTypes,
38-
binarySettings,
39-
eventSource,
40-
log,
41-
respondWithErrors
42-
}),
43-
handler: configureHandler = (event, context, callback) => configureProxy({
44-
event,
45-
context,
46-
callback
47-
})
48-
} = {}) {
49-
configureHandler.handler = configureHandler
50-
configureHandler.proxy = configureProxy
51-
configureHandler.log = configureLog
52-
return configureHandler
45+
}) {
46+
log.debug('SERVERLESS_EXPRESS:PROXY', {
47+
event: util.inspect(event, { depth: null }),
48+
context: util.inspect(context, { depth: null }),
49+
resolutionMode,
50+
eventSourceName,
51+
binarySettings,
52+
respondWithErrors
53+
})
54+
55+
if (binaryMimeTypes) {
56+
console.warn('[DEPRECATION NOTICE] { binaryMimeTypes: [] } is deprecated. base64 encoding is now automatically determined based on response content-type and content-encoding. If you need to manually set binary content types, instead, use { binarySettings: { contentTypes: [] } }')
57+
}
58+
59+
setCurrentInvoke({ event, context })
60+
return new Promise((resolve, reject) => {
61+
const promise = {
62+
resolve,
63+
reject
64+
}
65+
const resolver = makeResolver({
66+
context,
67+
callback,
68+
promise,
69+
resolutionMode
70+
})
71+
72+
try {
73+
forwardRequestToNodeServer({
74+
app,
75+
framework,
76+
event,
77+
context,
78+
resolver,
79+
eventSourceName,
80+
binarySettings,
81+
eventSource,
82+
log
83+
})
84+
} catch (error) {
85+
respondToEventSourceWithError({
86+
error,
87+
resolver,
88+
log,
89+
respondWithErrors,
90+
eventSource
91+
})
92+
}
93+
})
94+
}
95+
96+
function handler (event, context, callback) {
97+
return proxy({
98+
event,
99+
context,
100+
callback
101+
})
102+
}
103+
104+
handler.handler = (...params) => {
105+
console.warn('[DEPRECATION NOTICE] You\'re using the deprecated `serverlessExpress({...}).handler({...})` method. This will be removed in a future version of @vendia/serverless-express. Instead, simply return `serverlessExpress({...})` as your handler.')
106+
return handler(...params)
107+
}
108+
109+
handler.proxy = (...params) => {
110+
console.warn('[DEPRECATION NOTICE] You\'re using the deprecated `serverlessExpress({...}).proxy({...})` method. This will be removed in a future version of @vendia/serverless-express. Instead, simply return `serverlessExpress({...})` as your handler.')
111+
return proxy(...params)
112+
}
113+
114+
handler.log = configureLog
115+
116+
return handler
53117
}
54118

55119
module.exports = configure

src/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ module.exports.configure = configure
88
// Legacy/deprecated:
99

1010
function createServer (app, serverListenCallback, binaryMimeTypes) {
11-
console.warn('You\'re using the deprecated createServer method that will be removed in the next major version. See https://github.com/vendia/serverless-express/blob/mainline/UPGRADE.md to upgrade.')
11+
console.warn('[DEPRECATION NOTICE] You\'re using the deprecated createServer method that will be removed in the next major version. See https://github.com/vendia/serverless-express/blob/mainline/UPGRADE.md to upgrade.')
1212

1313
if (serverListenCallback) {
1414
throw new Error('serverListenCallback is no longer supported.')

src/proxy.d.ts

Lines changed: 0 additions & 16 deletions
This file was deleted.

src/proxy.js

Lines changed: 0 additions & 83 deletions
This file was deleted.

0 commit comments

Comments
 (0)