@yopdev/dev-server 2.0.0-alpha.2 → 2.0.0-beta.2

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.
@@ -1,16 +1,14 @@
1
- /// <reference types="node" />
2
1
  import { CloudFormationSetupConfig } from './cloudformation';
3
2
  import { DevServerConfig } from './config';
4
3
  import { HttpSettings } from './http-server';
5
- import { APIGatewayEventRequestContextV2WithGenericAuthorizer, Route } from './lambda-http-proxy';
4
+ import { Authorizer, Route } from './lambda-http-proxy';
6
5
  import { Callback, Service, Startable } from './services';
7
- import { IncomingMessage } from 'http';
8
- export declare const newLambdaProxyFromCloudFormationTemplate: <C, A>(name: string, settings: HttpSettings, config: CloudFormationLambdaProxyConfig<C, A>, callback: Callback<string>) => Startable<Service<string>>;
9
- type CloudFormationLambdaProxyConfig<C, A> = {
10
- authorizer?: (config: DevServerConfig) => A | undefined;
11
- extraRoutes: Route<C, A>[];
6
+ import { LambdaPayloadVersion } from './mappers';
7
+ export declare const newLambdaProxyFromCloudFormationTemplate: <Context, AuthorizerContext, Event_1, HandlerResponse>(name: string, settings: HttpSettings, lambdaPayloadVersion: () => LambdaPayloadVersion<AuthorizerContext, Event_1, HandlerResponse>, config: CloudFormationLambdaProxyConfig<Context, AuthorizerContext, Event_1, HandlerResponse>, callback: Callback<string>) => Startable<Service<string>>;
8
+ type CloudFormationLambdaProxyConfig<Context, AuthorizerContext, Event, HandlerResponse> = {
9
+ authorizer?: (config: DevServerConfig) => Authorizer<AuthorizerContext> | undefined;
10
+ extraRoutes: Route<Context, AuthorizerContext, Event, HandlerResponse>[];
12
11
  prepare?: (config: DevServerConfig) => Promise<void>;
13
- context?: () => C;
14
- mapper?: (request: IncomingMessage, body: string) => Promise<APIGatewayEventRequestContextV2WithGenericAuthorizer<A>>;
12
+ context?: () => Context;
15
13
  } & CloudFormationSetupConfig;
16
14
  export {};
@@ -6,10 +6,10 @@ const lambda_http_proxy_1 = require("./lambda-http-proxy");
6
6
  const PATH_VARIABLE_CAPTURE = /{(.*?)}/g;
7
7
  const QUERY_STRING_OR_LOCATION_REG_EXP = '(?:([?#].*))?';
8
8
  const PROXY_PATH_PARAM = 'proxy';
9
- const newLambdaProxyFromCloudFormationTemplate = (name, settings, config, callback) => new CloudFormationLambdaProxy(name, settings, config.extraRoutes, config, callback);
9
+ const newLambdaProxyFromCloudFormationTemplate = (name, settings, lambdaPayloadVersion, config, callback) => new CloudFormationLambdaProxy(name, settings, config.extraRoutes, lambdaPayloadVersion, config, callback);
10
10
  exports.newLambdaProxyFromCloudFormationTemplate = newLambdaProxyFromCloudFormationTemplate;
11
11
  class CloudFormationLambdaProxy extends cloudformation_1.CloudFormationSetup {
12
- constructor(name, settings, extraRoutes, config, callback) {
12
+ constructor(name, settings, extraRoutes, lambdaPayloadVersion, config, callback) {
13
13
  super(name, (event) => event.Type === 'HttpApi', async (event, handler) => Promise.resolve(this.pathWithCapturingGroups(event.Properties.Path)).then((pathWithCapturingGroups) => ({
14
14
  method: new RegExp(event.Properties.Method),
15
15
  path: new RegExp(`^${pathWithCapturingGroups}${QUERY_STRING_OR_LOCATION_REG_EXP}?$`),
@@ -31,13 +31,15 @@ class CloudFormationLambdaProxy extends cloudformation_1.CloudFormationSetup {
31
31
  this.pathWithCapturingGroups = (source) => [...source.matchAll(PATH_VARIABLE_CAPTURE)].reduce((prev, curr) => prev.replaceAll(curr[0], `(?<${this.normalizeCaptureGroupName(curr[1])}>.*)`), source);
32
32
  this.normalizeCaptureGroupName = (original) => (original === 'proxy+' ? PROXY_PATH_PARAM : original);
33
33
  this.pathParameterCapture = (pathWithCapturingGroups, handler, context) => async (event) => {
34
- const pathParameters = pathWithCapturingGroups.exec(event.rawPath)?.groups;
35
- event.pathParameters = Object.fromEntries((Object.entries(pathParameters ?? {}))
36
- .map(([k, v]) => [k, decodeURIComponent(v)]));
34
+ const pathParameters = pathWithCapturingGroups.exec(this.pathParameterResolver.locate(event))?.groups;
35
+ this.pathParameterResolver.store(event, Object.fromEntries((Object.entries(pathParameters ?? {}))
36
+ .map(([k, v]) => [k, decodeURIComponent(v)])));
37
37
  return handler(event, context?.());
38
38
  };
39
- this.mapper = config?.mapper;
39
+ const payloadVersion = lambdaPayloadVersion();
40
+ this.mapper = payloadVersion.mapper;
40
41
  this.authorizer = config?.authorizer;
42
+ this.pathParameterResolver = payloadVersion.resolver;
41
43
  }
42
44
  logHandler(handler) {
43
45
  return `detected handler for ${handler.method} on ${handler.path} with weight ${handler.weight}`;
@@ -1,6 +1,7 @@
1
1
  export { DevServer } from './dev-server';
2
2
  export { newHttpServer as httpServer, HttpSettings } from './http-server';
3
3
  export { newLambdaHttpProxy as lambdaHttpProxy, UNAUTHORIZED } from './lambda-http-proxy';
4
+ export { v1 as v1LambdaProxyPayload, v2 as v2LambdaProxyPayload } from './mappers';
4
5
  export { newLambdaProxyFromCloudFormationTemplate as cloudFormationLambdaProxy } from './cloudformation-lambda-http-proxy';
5
6
  export { newSnsHttpProxy as snsHttpProxy } from './sns-http-proxy';
6
7
  export { newInternalQueue as internalQueue } from './internal-queue';
package/dist/src/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Service = exports.promised = exports.lazy = exports.oneThenOther = exports.allOf = exports.tunnel = exports.container = exports.dynamoDbTable = exports.preTrafficHooks = exports.scheduledTasks = exports.cloudFormationSnsEventHandlers = exports.eventsProxy = exports.internalQueue = exports.snsHttpProxy = exports.cloudFormationLambdaProxy = exports.UNAUTHORIZED = exports.lambdaHttpProxy = exports.httpServer = exports.DevServer = void 0;
3
+ exports.Service = exports.promised = exports.lazy = exports.oneThenOther = exports.allOf = exports.tunnel = exports.container = exports.dynamoDbTable = exports.preTrafficHooks = exports.scheduledTasks = exports.cloudFormationSnsEventHandlers = exports.eventsProxy = exports.internalQueue = exports.snsHttpProxy = exports.cloudFormationLambdaProxy = exports.v2LambdaProxyPayload = exports.v1LambdaProxyPayload = exports.UNAUTHORIZED = exports.lambdaHttpProxy = exports.httpServer = exports.DevServer = void 0;
4
4
  var dev_server_1 = require("./dev-server");
5
5
  Object.defineProperty(exports, "DevServer", { enumerable: true, get: function () { return dev_server_1.DevServer; } });
6
6
  var http_server_1 = require("./http-server");
@@ -8,6 +8,9 @@ Object.defineProperty(exports, "httpServer", { enumerable: true, get: function (
8
8
  var lambda_http_proxy_1 = require("./lambda-http-proxy");
9
9
  Object.defineProperty(exports, "lambdaHttpProxy", { enumerable: true, get: function () { return lambda_http_proxy_1.newLambdaHttpProxy; } });
10
10
  Object.defineProperty(exports, "UNAUTHORIZED", { enumerable: true, get: function () { return lambda_http_proxy_1.UNAUTHORIZED; } });
11
+ var mappers_1 = require("./mappers");
12
+ Object.defineProperty(exports, "v1LambdaProxyPayload", { enumerable: true, get: function () { return mappers_1.v1; } });
13
+ Object.defineProperty(exports, "v2LambdaProxyPayload", { enumerable: true, get: function () { return mappers_1.v2; } });
11
14
  var cloudformation_lambda_http_proxy_1 = require("./cloudformation-lambda-http-proxy");
12
15
  Object.defineProperty(exports, "cloudFormationLambdaProxy", { enumerable: true, get: function () { return cloudformation_lambda_http_proxy_1.newLambdaProxyFromCloudFormationTemplate; } });
13
16
  var sns_http_proxy_1 = require("./sns-http-proxy");
@@ -1,21 +1,27 @@
1
+ /// <reference types="node" />
1
2
  import { HttpSettings } from "./http-server";
2
- import { APIGatewayEventRequestContextV2WithAuthorizer, APIGatewayProxyEventV2WithRequestContext, APIGatewayProxyStructuredResultV2 } from "aws-lambda";
3
- import { IncomingMessage } from "http";
3
+ import { LambdaMapperFactory } from "./mappers";
4
4
  import { Service, Callback } from "./services";
5
5
  export declare const UNAUTHORIZED: Error;
6
- export declare const newLambdaHttpProxy: <C, A>(name: string, config: {
6
+ export declare const newLambdaHttpProxy: <Context, AuthorizerContext, Event_1, HandlerResponse>(name: string, config: {
7
7
  settings: HttpSettings;
8
- routes: Route<C, A>[];
9
- mapper?: (request: IncomingMessage, body: string) => Promise<APIGatewayEventRequestContextV2WithGenericAuthorizer<A>>;
10
- authorizer?: Authorizer<A>;
11
- context?: () => C;
8
+ routes: Route<Context, AuthorizerContext, Event_1, HandlerResponse>[];
9
+ mapper: LambdaMapperFactory<AuthorizerContext, Event_1, HandlerResponse>;
10
+ authorizer?: Authorizer<AuthorizerContext>;
11
+ context?: () => Context;
12
12
  }, callback?: Callback<string>) => Service<string>;
13
- export type APIGatewayEventRequestContextV2WithGenericAuthorizer<A> = APIGatewayProxyEventV2WithRequestContext<APIGatewayEventRequestContextV2WithAuthorizer<A>>;
14
- export type Route<C, A> = {
13
+ export declare abstract class Response {
14
+ readonly statusCode: number;
15
+ readonly contentType: string | undefined;
16
+ readonly location: string | undefined;
17
+ constructor(statusCode: number, contentType: string | undefined, location: string | undefined);
18
+ body: () => string | Buffer | undefined;
19
+ }
20
+ export type Route<Context, AuthorizerContext, Event, HandlerResponse> = {
15
21
  method: RegExp;
16
22
  path: RegExp;
17
23
  weight: number;
18
- authorizer?: Authorizer<A>;
19
- handler: (event: APIGatewayEventRequestContextV2WithGenericAuthorizer<A>, context: C) => Promise<APIGatewayProxyStructuredResultV2>;
24
+ authorizer?: Authorizer<AuthorizerContext>;
25
+ handler: (event: Event, context: Context) => Promise<HandlerResponse>;
20
26
  };
21
- export type Authorizer<A> = (authorization: string) => Promise<A | undefined>;
27
+ export type Authorizer<Context> = (authorization: string) => Promise<Context | undefined>;
@@ -1,13 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.newLambdaHttpProxy = exports.UNAUTHORIZED = void 0;
3
+ exports.Response = exports.newLambdaHttpProxy = exports.UNAUTHORIZED = void 0;
4
4
  const logging_1 = require("@yopdev/logging");
5
5
  const http_server_1 = require("./http-server");
6
- const mappers_1 = require("./mappers");
7
6
  const responses_1 = require("./responses");
8
7
  const services_1 = require("./services");
9
8
  exports.UNAUTHORIZED = new Error('UNAUTHORIZED');
10
- const newLambdaHttpProxy = (name, config, callback) => new services_1.Service(new LambdaHttpProxy(name, config.settings, config.routes, config.mapper ?? mappers_1.mapToLambdaEvent, config.authorizer ?? (() => Promise.resolve(undefined)), config.context), callback);
9
+ const newLambdaHttpProxy = (name, config, callback) => new services_1.Service(new LambdaHttpProxy(name, config.settings, config.routes, config.mapper, config.authorizer ?? (() => Promise.resolve(undefined)), config.context), callback);
11
10
  exports.newLambdaHttpProxy = newLambdaHttpProxy;
12
11
  class LambdaHttpProxy {
13
12
  constructor(name, settings, routes, mapper, defaultAuthorizer, context = () => undefined) {
@@ -18,12 +17,14 @@ class LambdaHttpProxy {
18
17
  this.context = context;
19
18
  this.start = () => this.server.start();
20
19
  this.stop = () => this.server.stop();
21
- this.handler = (authorizer, lambdaHandler) => (request, body, response) => this.mapper(request, body)
22
- .then(async (proxyEvent) => authorizer(proxyEvent.headers['authorization'])
20
+ this.handler = (authorizer, lambdaHandler) => (request, body, response) => this.mapper.newInstance(request, body)
21
+ .then(async (mapper) => authorizer(mapper.authorization())
23
22
  .then(async (context) => {
24
- proxyEvent.requestContext.authorizer = context;
25
- return lambdaHandler(proxyEvent, this.context())
26
- .then((lambda) => (0, responses_1.writeResponse)(response, lambda.statusCode, lambda.isBase64Encoded ? Buffer.from(lambda.body, 'base64') : lambda.body, lambda.headers?.['content-type']?.toString() ?? undefined, lambda.headers?.['location']?.toString() ?? undefined))
23
+ return lambdaHandler(mapper.event(context), this.context())
24
+ .then((lambda) => {
25
+ const result = mapper.toResponse(lambda);
26
+ return (0, responses_1.writeResponse)(response, result.statusCode, result.body(), result.contentType, result.location);
27
+ })
27
28
  .catch((e) => {
28
29
  this.LOGGER.error(e, 'request failed to execute');
29
30
  (0, responses_1.internalServerError)(response, e.body);
@@ -40,3 +41,11 @@ class LambdaHttpProxy {
40
41
  this.LOGGER.info('registered %i routes', routes.length);
41
42
  }
42
43
  }
44
+ class Response {
45
+ constructor(statusCode, contentType, location) {
46
+ this.statusCode = statusCode;
47
+ this.contentType = contentType;
48
+ this.location = location;
49
+ }
50
+ }
51
+ exports.Response = Response;
@@ -1,7 +1,25 @@
1
1
  /// <reference types="node" />
2
2
  import { Message } from "@aws-sdk/client-sqs";
3
- import { SQSRecord } from "aws-lambda";
3
+ import { APIGatewayProxyEvent, APIGatewayProxyEventPathParameters, APIGatewayProxyEventV2, APIGatewayProxyResult, APIGatewayProxyStructuredResultV2, SQSRecord } from "aws-lambda";
4
4
  import { IncomingMessage } from "http";
5
- import { APIGatewayEventRequestContextV2WithGenericAuthorizer } from "./lambda-http-proxy";
5
+ import { Response } from "./lambda-http-proxy";
6
6
  export declare const mapToLambdaSqsRecord: (message: Message) => SQSRecord;
7
- export declare function mapToLambdaEvent<A>(req: IncomingMessage, requestBody: string): Promise<APIGatewayEventRequestContextV2WithGenericAuthorizer<A>>;
7
+ export type LambdaPayloadVersion<AuthorizerContext, Event, HandlerResponse> = {
8
+ mapper: LambdaMapperFactory<AuthorizerContext, Event, HandlerResponse>;
9
+ resolver: PathParameterResolver<Event>;
10
+ };
11
+ export declare const v1: <AuthorizerContext>() => LambdaPayloadVersion<AuthorizerContext, APIGatewayProxyEvent, APIGatewayProxyResult>;
12
+ export declare const v2: <AuthorizerContext>() => LambdaPayloadVersion<AuthorizerContext, APIGatewayProxyEventV2, APIGatewayProxyStructuredResultV2>;
13
+ interface LambdaMapper<AuthorizerContext, Event, HandlerResponse> {
14
+ event(context: AuthorizerContext): Event;
15
+ authorization(): string;
16
+ toResponse: (response: HandlerResponse) => Response;
17
+ }
18
+ export interface LambdaMapperFactory<AuthorizerContext, Event, LambdaResponse> {
19
+ newInstance(request: IncomingMessage, body: string): Promise<LambdaMapper<AuthorizerContext, Event, LambdaResponse>>;
20
+ }
21
+ export type PathParameterResolver<Event> = {
22
+ locate: (event: Event) => string;
23
+ store: (event: Event, params: APIGatewayProxyEventPathParameters) => void;
24
+ };
25
+ export {};
@@ -1,7 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.mapToLambdaEvent = exports.mapToLambdaSqsRecord = void 0;
3
+ exports.v2 = exports.v1 = exports.mapToLambdaSqsRecord = void 0;
4
4
  const url_1 = require("url");
5
+ const lambda_http_proxy_1 = require("./lambda-http-proxy");
5
6
  const mapToLambdaSqsRecord = (message) => {
6
7
  if (!message.Body)
7
8
  throw new Error('message Body must be present');
@@ -23,84 +24,129 @@ const mapToLambdaSqsRecord = (message) => {
23
24
  };
24
25
  };
25
26
  exports.mapToLambdaSqsRecord = mapToLambdaSqsRecord;
26
- function mapToLambdaEvent(req, requestBody) {
27
- if (!req.url || !req.method)
28
- throw new Error('url and method are required');
29
- const url = new url_1.URL(req.url, `http://${req.headers.host}`);
30
- const qsp = {};
31
- url.searchParams.forEach((v, k) => (qsp[k] = decodeURIComponent(v)));
32
- const headers = {};
33
- if (req.headers['content-type'])
34
- headers['content-type'] = req.headers['content-type'];
35
- if (req.headers['accept'])
36
- headers['accept'] = req.headers['accept'];
37
- if (req.headers['authorization'])
38
- headers['authorization'] = req.headers['authorization'];
39
- const time = 1428582896000;
40
- return Promise.resolve({
41
- version: '2.0',
42
- rawPath: url.pathname,
43
- rawQueryString: url.search,
44
- routeKey: '',
45
- httpMethod: req.method,
46
- body: requestBody,
47
- headers: headers,
48
- path: url.pathname,
49
- pathParameters: null,
50
- queryStringParameters: qsp,
51
- resource: '',
52
- multiValueHeaders: {},
53
- isBase64Encoded: false,
54
- multiValueQueryStringParameters: null,
55
- stageVariables: null,
56
- requestContext: {
57
- domainName: req.headers.host,
58
- domainPrefix: '',
59
- http: {
60
- method: req.method,
61
- path: url.pathname,
62
- protocol: 'http',
63
- sourceIp: '127.0.0.1',
64
- userAgent: req.headers['user-agent'],
65
- },
27
+ const payloadV1JwtAuthorizerLambdaMapper = () => ({
28
+ newInstance: (request, body) => Promise.resolve(new DefaultLambdaMapper(request, body))
29
+ });
30
+ const payloadV2LambdaAuthorizerLambdaMapper = () => ({
31
+ newInstance: (request, body) => Promise.resolve(new DefaultLambdaMapper(request, body))
32
+ });
33
+ const payloadV1PathParameterResolver = {
34
+ locate: (event) => event.path,
35
+ store: (event, params) => event.pathParameters = params
36
+ };
37
+ const payloadV2PathParameterResolver = {
38
+ locate: (event) => event.rawPath,
39
+ store: (event, params) => event.pathParameters = params
40
+ };
41
+ const v1 = () => ({
42
+ mapper: payloadV1JwtAuthorizerLambdaMapper(),
43
+ resolver: payloadV1PathParameterResolver,
44
+ });
45
+ exports.v1 = v1;
46
+ const v2 = () => ({
47
+ mapper: payloadV2LambdaAuthorizerLambdaMapper(),
48
+ resolver: payloadV2PathParameterResolver,
49
+ });
50
+ exports.v2 = v2;
51
+ class DefaultLambdaMapper {
52
+ constructor(request, body) {
53
+ this.body = body;
54
+ this.toResponse = (response) => response.isBase64Encoded ?
55
+ new Base64EncodedResponse(response.statusCode, response.headers?.['content-type']?.toString(), response.headers?.['location']?.toString(), response.body) :
56
+ new StringResponse(response.statusCode, response.headers?.['content-type']?.toString(), response.headers?.['location']?.toString(), response.body);
57
+ this.event = (context) => ({
58
+ version: '2.0',
59
+ rawPath: this.url.pathname,
60
+ rawQueryString: this.url.search,
66
61
  routeKey: '',
67
- time: new Date(time).toString(),
68
- timeEpoch: time,
69
- accountId: '',
70
- apiId: '',
71
- authorizer: undefined,
72
- httpMethod: '',
73
- identity: {
74
- accessKey: '',
62
+ httpMethod: this.method,
63
+ body: this.body,
64
+ headers: this.headers,
65
+ path: this.url.pathname,
66
+ pathParameters: null,
67
+ queryStringParameters: this.queryStringParameters,
68
+ resource: '',
69
+ multiValueHeaders: {},
70
+ isBase64Encoded: false,
71
+ multiValueQueryStringParameters: null,
72
+ stageVariables: null,
73
+ requestContext: {
74
+ domainName: this.headers.host,
75
+ domainPrefix: '',
76
+ http: {
77
+ method: this.method,
78
+ path: this.url.pathname,
79
+ protocol: 'http',
80
+ sourceIp: '127.0.0.1',
81
+ userAgent: this.headers['user-agent'],
82
+ },
83
+ routeKey: '',
84
+ time: new Date(this.time).toString(),
85
+ timeEpoch: this.time,
75
86
  accountId: '',
76
- apiKey: '',
77
- apiKeyId: '',
78
- caller: '',
79
- clientCert: {
80
- clientCertPem: '',
81
- issuerDN: '',
82
- serialNumber: '',
83
- subjectDN: '',
84
- validity: { notAfter: '', notBefore: '' },
87
+ apiId: '',
88
+ authorizer: context,
89
+ httpMethod: '',
90
+ identity: {
91
+ accessKey: '',
92
+ accountId: '',
93
+ apiKey: '',
94
+ apiKeyId: '',
95
+ caller: '',
96
+ clientCert: {
97
+ clientCertPem: '',
98
+ issuerDN: '',
99
+ serialNumber: '',
100
+ subjectDN: '',
101
+ validity: { notAfter: '', notBefore: '' },
102
+ },
103
+ cognitoAuthenticationProvider: '',
104
+ cognitoAuthenticationType: '',
105
+ cognitoIdentityId: '',
106
+ cognitoIdentityPoolId: '',
107
+ principalOrgId: '',
108
+ sourceIp: '',
109
+ user: '',
110
+ userAgent: '',
111
+ userArn: '',
85
112
  },
86
- cognitoAuthenticationProvider: '',
87
- cognitoAuthenticationType: '',
88
- cognitoIdentityId: '',
89
- cognitoIdentityPoolId: '',
90
- principalOrgId: '',
91
- sourceIp: '',
92
- user: '',
93
- userAgent: '',
94
- userArn: '',
95
- },
96
- path: '',
97
- protocol: '',
98
- requestId: '',
99
- requestTimeEpoch: time,
100
- resourceId: '',
101
- resourcePath: '',
102
- stage: '',
103
- },
104
- });
113
+ path: '',
114
+ protocol: '',
115
+ requestId: '',
116
+ requestTimeEpoch: this.time,
117
+ resourceId: '',
118
+ resourcePath: '',
119
+ stage: '',
120
+ }
121
+ });
122
+ this.authorization = () => this.authorizationHeaderValue;
123
+ if (!request.url || !request.method)
124
+ throw new Error('url and method are required');
125
+ const url = new url_1.URL(request.url, `http://${request.headers.host}`);
126
+ const qsp = {};
127
+ url.searchParams.forEach((v, k) => (qsp[k] = decodeURIComponent(v)));
128
+ this.queryStringParameters = qsp;
129
+ const headers = {};
130
+ if (request.headers['content-type'])
131
+ headers['content-type'] = request.headers['content-type'];
132
+ if (request.headers['accept'])
133
+ headers['accept'] = request.headers['accept'];
134
+ if (request.headers['authorization'])
135
+ headers['authorization'] = request.headers['authorization'];
136
+ this.headers = headers;
137
+ this.url = url;
138
+ this.time = 1428582896000;
139
+ }
140
+ }
141
+ class StringResponse extends lambda_http_proxy_1.Response {
142
+ constructor(statusCode, contentType, location, body) {
143
+ super(statusCode, contentType, location);
144
+ this.body = () => body;
145
+ }
146
+ }
147
+ class Base64EncodedResponse extends lambda_http_proxy_1.Response {
148
+ constructor(statusCode, contentType, location, body) {
149
+ super(statusCode, contentType, location);
150
+ this.body = () => Buffer.from(body, 'base64');
151
+ }
105
152
  }
106
- exports.mapToLambdaEvent = mapToLambdaEvent;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yopdev/dev-server",
3
- "version": "2.0.0-alpha.2",
3
+ "version": "2.0.0-beta.2",
4
4
  "scripts": {
5
5
  "compile": "tsc",
6
6
  "pretest": "npm run compile",