@pikku/lambda 0.6.7 → 0.6.8
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.
- package/CHANGELOG.md +8 -0
- package/dist/http/index.d.ts +1 -3
- package/dist/http/index.js +1 -3
- package/dist/http/index.js.map +1 -1
- package/dist/http/run-fetch.d.ts +3 -0
- package/dist/http/run-fetch.js +23 -0
- package/dist/http/run-fetch.js.map +1 -0
- package/dist/request-converter.d.ts +2 -0
- package/dist/request-converter.js +20 -0
- package/dist/request-converter.js.map +1 -0
- package/dist/response-converter.d.ts +2 -0
- package/dist/response-converter.js +25 -0
- package/dist/response-converter.js.map +1 -0
- package/dist/websocket/websocket-connect.js +6 -5
- package/dist/websocket/websocket-connect.js.map +1 -1
- package/dist/websocket/websocket-message.js +5 -4
- package/dist/websocket/websocket-message.js.map +1 -1
- package/package.json +2 -2
- package/src/http/index.ts +1 -3
- package/src/http/run-fetch.ts +51 -0
- package/src/request-converter.ts +24 -0
- package/src/response-converter.ts +33 -0
- package/src/websocket/websocket-connect.ts +7 -5
- package/src/websocket/websocket-message.ts +6 -5
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/http/anywhere-http.d.ts +0 -3
- package/dist/http/anywhere-http.js +0 -13
- package/dist/http/anywhere-http.js.map +0 -1
- package/dist/http/cors-http.d.ts +0 -3
- package/dist/http/cors-http.js +0 -35
- package/dist/http/cors-http.js.map +0 -1
- package/dist/http/corsless-http.d.ts +0 -3
- package/dist/http/corsless-http.js +0 -9
- package/dist/http/corsless-http.js.map +0 -1
- package/dist/http/general-http-handler.d.ts +0 -5
- package/dist/http/general-http-handler.js +0 -28
- package/dist/http/general-http-handler.js.map +0 -1
- package/dist/pikku-api-gateway-lambda-request.d.ts +0 -10
- package/dist/pikku-api-gateway-lambda-request.js +0 -18
- package/dist/pikku-api-gateway-lambda-request.js.map +0 -1
- package/dist/pikku-api-gateway-lambda-response.d.ts +0 -15
- package/dist/pikku-api-gateway-lambda-response.js +0 -32
- package/dist/pikku-api-gateway-lambda-response.js.map +0 -1
- package/src/http/anywhere-http.ts +0 -39
- package/src/http/cors-http.ts +0 -70
- package/src/http/corsless-http.ts +0 -33
- package/src/http/general-http-handler.ts +0 -59
- package/src/pikku-api-gateway-lambda-request.ts +0 -25
- package/src/pikku-api-gateway-lambda-response.ts +0 -41
package/CHANGELOG.md
CHANGED
package/dist/http/index.d.ts
CHANGED
package/dist/http/index.js
CHANGED
package/dist/http/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { CoreSingletonServices, CoreServices, CreateSessionServices, CoreUserSession } from '@pikku/core';
|
|
2
|
+
import { APIGatewayEvent, APIGatewayProxyResult } from 'aws-lambda';
|
|
3
|
+
export declare const runFetch: <SingletonServices extends CoreSingletonServices, Services extends CoreServices<SingletonServices>, UserSession extends CoreUserSession>(singletonServices: SingletonServices, createSessionServices: CreateSessionServices<SingletonServices, Services, UserSession>, event: APIGatewayEvent) => Promise<APIGatewayProxyResult>;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { PikkuFetchHTTPResponse, fetchData } from '@pikku/core/http';
|
|
2
|
+
import { responseToLambdaResult } from '../response-converter.js';
|
|
3
|
+
import { lambdaEventToRequest } from '../request-converter.js';
|
|
4
|
+
export const runFetch = async (singletonServices, createSessionServices, event) => {
|
|
5
|
+
const request = lambdaEventToRequest(event);
|
|
6
|
+
const response = new PikkuFetchHTTPResponse();
|
|
7
|
+
if (request.method === 'options') {
|
|
8
|
+
response.header('Access-Control-Allow-Headers', 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent');
|
|
9
|
+
response.header('Access-Control-Allow-Methods', 'OPTIONS,DELETE,GET,HEAD,PATCH,POST,PUT');
|
|
10
|
+
response.status(200);
|
|
11
|
+
return responseToLambdaResult(response.toResponse());
|
|
12
|
+
}
|
|
13
|
+
try {
|
|
14
|
+
await fetchData(request, response, {
|
|
15
|
+
singletonServices,
|
|
16
|
+
createSessionServices: createSessionServices,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
}
|
|
21
|
+
return responseToLambdaResult(response.toResponse());
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=run-fetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-fetch.js","sourceRoot":"","sources":["../../src/http/run-fetch.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,sBAAsB,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAEpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAE9D,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAK3B,iBAAoC,EACpC,qBAIC,EACD,KAAsB,EACU,EAAE;IAClC,MAAM,OAAO,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAA;IAC3C,MAAM,QAAQ,GAAG,IAAI,sBAAsB,EAAE,CAAA;IAE7C,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,QAAQ,CAAC,MAAM,CACb,8BAA8B,EAC9B,uFAAuF,CACxF,CAAA;QACD,QAAQ,CAAC,MAAM,CACb,8BAA8B,EAC9B,wCAAwC,CACzC,CAAA;QACD,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACpB,OAAO,sBAAsB,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAA;IACtD,CAAC;IAED,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE;YACjC,iBAAiB;YACjB,qBAAqB,EAAE,qBAA4B;SACpD,CAAC,CAAA;IACJ,CAAC;IAAC,MAAM,CAAC;IAET,CAAC;IAED,OAAO,sBAAsB,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAA;AACtD,CAAC,CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export const lambdaEventToRequest = (event) => {
|
|
2
|
+
const url = new URL(event.path, `https://${event.headers.host}`);
|
|
3
|
+
if (event.queryStringParameters) {
|
|
4
|
+
for (const [key, value] of Object.entries(event.queryStringParameters)) {
|
|
5
|
+
if (value !== undefined)
|
|
6
|
+
url.searchParams.set(key, value);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
const body = event.body && event.isBase64Encoded
|
|
10
|
+
? Buffer.from(event.body, 'base64')
|
|
11
|
+
: event.body || undefined;
|
|
12
|
+
return new Request(url.toString(), {
|
|
13
|
+
method: event.httpMethod,
|
|
14
|
+
headers: event.headers,
|
|
15
|
+
body: ['GET', 'HEAD'].includes(event.httpMethod.toUpperCase())
|
|
16
|
+
? undefined
|
|
17
|
+
: body,
|
|
18
|
+
});
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=request-converter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-converter.js","sourceRoot":"","sources":["../src/request-converter.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAA2B,EAAW,EAAE;IAC3E,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;IAEhE,IAAI,KAAK,CAAC,qBAAqB,EAAE,CAAC;QAChC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,EAAE,CAAC;YACvE,IAAI,KAAK,KAAK,SAAS;gBAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QAC3D,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GACR,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,eAAe;QACjC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC;QACnC,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,SAAS,CAAA;IAE7B,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;QACjC,MAAM,EAAE,KAAK,CAAC,UAAU;QACxB,OAAO,EAAE,KAAK,CAAC,OAAsB;QACrC,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;YAC5D,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,IAAI;KACT,CAAC,CAAA;AACJ,CAAC,CAAA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export const responseToLambdaResult = async (response) => {
|
|
2
|
+
const headers = {};
|
|
3
|
+
response.headers.forEach((value, key) => {
|
|
4
|
+
headers[key.toLowerCase()] = value;
|
|
5
|
+
});
|
|
6
|
+
let body;
|
|
7
|
+
let isBase64Encoded = false;
|
|
8
|
+
const contentType = response.headers.get('content-type') || '';
|
|
9
|
+
const isBinary = !/^text\/|application\/(json|javascript|xml)/.test(contentType);
|
|
10
|
+
const buffer = Buffer.from(await response.arrayBuffer());
|
|
11
|
+
if (isBinary) {
|
|
12
|
+
body = buffer.toString('base64');
|
|
13
|
+
isBase64Encoded = true;
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
body = buffer.toString('utf-8');
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
statusCode: response.status,
|
|
20
|
+
headers,
|
|
21
|
+
body,
|
|
22
|
+
isBase64Encoded,
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=response-converter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-converter.js","sourceRoot":"","sources":["../src/response-converter.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,EACzC,QAAkB,EACc,EAAE;IAClC,MAAM,OAAO,GAA2B,EAAE,CAAA;IAC1C,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,KAAK,CAAA;IACpC,CAAC,CAAC,CAAA;IAEF,IAAI,IAAY,CAAA;IAChB,IAAI,eAAe,GAAG,KAAK,CAAA;IAE3B,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAA;IAC9D,MAAM,QAAQ,GAAG,CAAC,4CAA4C,CAAC,IAAI,CACjE,WAAW,CACZ,CAAA;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAA;IACxD,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QAChC,eAAe,GAAG,IAAI,CAAA;IACxB,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IACjC,CAAC;IAED,OAAO;QACL,UAAU,EAAE,QAAQ,CAAC,MAAM;QAC3B,OAAO;QACP,IAAI;QACJ,eAAe;KAChB,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { PikkuFetchHTTPRequest, PikkuFetchHTTPResponse, } from '@pikku/core';
|
|
2
|
+
import { responseToLambdaResult } from '../response-converter.js';
|
|
2
3
|
import { runChannelConnect } from '@pikku/core/channel/serverless';
|
|
3
4
|
import { getServerlessDependencies } from './utils.js';
|
|
4
|
-
import {
|
|
5
|
+
import { lambdaEventToRequest } from '../request-converter.js';
|
|
5
6
|
export const connectWebsocket = async (event, { singletonServices, createSessionServices, channelStore, }) => {
|
|
6
7
|
const runnerParams = getServerlessDependencies(singletonServices.logger, channelStore, event);
|
|
7
|
-
const request = new
|
|
8
|
-
const response = new
|
|
8
|
+
const request = new PikkuFetchHTTPRequest(lambdaEventToRequest(event));
|
|
9
|
+
const response = new PikkuFetchHTTPResponse();
|
|
9
10
|
await runChannelConnect({
|
|
10
11
|
...runnerParams,
|
|
11
12
|
request,
|
|
@@ -14,6 +15,6 @@ export const connectWebsocket = async (event, { singletonServices, createSession
|
|
|
14
15
|
createSessionServices: createSessionServices,
|
|
15
16
|
route: event.path || '/',
|
|
16
17
|
});
|
|
17
|
-
return response.
|
|
18
|
+
return responseToLambdaResult(response.toResponse());
|
|
18
19
|
};
|
|
19
20
|
//# sourceMappingURL=websocket-connect.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket-connect.js","sourceRoot":"","sources":["../../src/websocket/websocket-connect.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"websocket-connect.js","sourceRoot":"","sources":["../../src/websocket/websocket-connect.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,aAAa,CAAA;AAEpB,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAClE,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAA;AAEtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAE9D,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EAKnC,KAAsB,EACtB,EACE,iBAAiB,EACjB,qBAAqB,EACrB,YAAY,GAC8C,EAC5B,EAAE;IAClC,MAAM,YAAY,GAAG,yBAAyB,CAC5C,iBAAiB,CAAC,MAAM,EACxB,YAAY,EACZ,KAAK,CACN,CAAA;IACD,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAA;IACtE,MAAM,QAAQ,GAAG,IAAI,sBAAsB,EAAE,CAAA;IAC7C,MAAM,iBAAiB,CAAC;QACtB,GAAG,YAAY;QACf,OAAO;QACP,QAAQ;QACR,iBAAiB,EAAE,iBAAwB;QAC3C,qBAAqB,EAAE,qBAA4B;QACnD,KAAK,EAAE,KAAK,CAAC,IAAI,IAAI,GAAG;KACzB,CAAC,CAAA;IACF,OAAO,sBAAsB,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAA;AACtD,CAAC,CAAA"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
import { PikkuFetchHTTPResponse, } from '@pikku/core';
|
|
1
2
|
import { runChannelMessage } from '@pikku/core/channel/serverless';
|
|
2
|
-
import { PikkuAPIGatewayLambdaResponse } from '../pikku-api-gateway-lambda-response.js';
|
|
3
3
|
import { getServerlessDependencies } from './utils.js';
|
|
4
|
+
import { responseToLambdaResult } from '../response-converter.js';
|
|
4
5
|
export const processWebsocketMessage = async (event, { singletonServices, createSessionServices, channelStore, }) => {
|
|
5
6
|
const runnerParams = getServerlessDependencies(singletonServices.logger, channelStore, event);
|
|
6
|
-
const response = new
|
|
7
|
+
const response = new PikkuFetchHTTPResponse();
|
|
7
8
|
try {
|
|
8
9
|
const result = await runChannelMessage({
|
|
9
10
|
...runnerParams,
|
|
@@ -11,12 +12,12 @@ export const processWebsocketMessage = async (event, { singletonServices, create
|
|
|
11
12
|
createSessionServices: createSessionServices,
|
|
12
13
|
}, event.body);
|
|
13
14
|
if (result) {
|
|
14
|
-
response.
|
|
15
|
+
response.json(result);
|
|
15
16
|
}
|
|
16
17
|
}
|
|
17
18
|
catch (e) {
|
|
18
19
|
console.error(e);
|
|
19
20
|
}
|
|
20
|
-
return response.
|
|
21
|
+
return responseToLambdaResult(response.toResponse());
|
|
21
22
|
};
|
|
22
23
|
//# sourceMappingURL=websocket-message.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket-message.js","sourceRoot":"","sources":["../../src/websocket/websocket-message.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"websocket-message.js","sourceRoot":"","sources":["../../src/websocket/websocket-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,sBAAsB,GACvB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAElE,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAA;AAEtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AAEjE,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,EAK1C,KAA2B,EAC3B,EACE,iBAAiB,EACjB,qBAAqB,EACrB,YAAY,GAC8C,EAC5B,EAAE;IAClC,MAAM,YAAY,GAAG,yBAAyB,CAC5C,iBAAiB,CAAC,MAAM,EACxB,YAAY,EACZ,KAAK,CACN,CAAA;IACD,MAAM,QAAQ,GAAG,IAAI,sBAAsB,EAAE,CAAA;IAC7C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,iBAAiB,CACpC;YACE,GAAG,YAAY;YACf,iBAAiB,EAAE,iBAAwB;YAC3C,qBAAqB,EAAE,qBAA4B;SACpD,EACD,KAAK,CAAC,IAAI,CACX,CAAA;QACD,IAAI,MAAM,EAAE,CAAC;YAEX,QAAQ,CAAC,IAAI,CAAC,MAAa,CAAC,CAAA;QAC9B,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QAEX,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAClB,CAAC;IACD,OAAO,sBAAsB,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAA;AACtD,CAAC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pikku/lambda",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.8",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"author": "yasser.fadl@gmail.com",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
},
|
|
24
24
|
"peerDependencies": {
|
|
25
25
|
"@aws-sdk/client-apigatewaymanagementapi": "^3.713.0",
|
|
26
|
-
"@pikku/core": "^0.6.
|
|
26
|
+
"@pikku/core": "^0.6.22",
|
|
27
27
|
"@types/aws-lambda": "^8.10.146"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
package/src/http/index.ts
CHANGED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CoreSingletonServices,
|
|
3
|
+
CoreServices,
|
|
4
|
+
CreateSessionServices,
|
|
5
|
+
CoreUserSession,
|
|
6
|
+
} from '@pikku/core'
|
|
7
|
+
import { PikkuFetchHTTPResponse, fetchData } from '@pikku/core/http'
|
|
8
|
+
import { APIGatewayEvent, APIGatewayProxyResult } from 'aws-lambda'
|
|
9
|
+
import { responseToLambdaResult } from '../response-converter.js'
|
|
10
|
+
import { lambdaEventToRequest } from '../request-converter.js'
|
|
11
|
+
|
|
12
|
+
export const runFetch = async <
|
|
13
|
+
SingletonServices extends CoreSingletonServices,
|
|
14
|
+
Services extends CoreServices<SingletonServices>,
|
|
15
|
+
UserSession extends CoreUserSession,
|
|
16
|
+
>(
|
|
17
|
+
singletonServices: SingletonServices,
|
|
18
|
+
createSessionServices: CreateSessionServices<
|
|
19
|
+
SingletonServices,
|
|
20
|
+
Services,
|
|
21
|
+
UserSession
|
|
22
|
+
>,
|
|
23
|
+
event: APIGatewayEvent
|
|
24
|
+
): Promise<APIGatewayProxyResult> => {
|
|
25
|
+
const request = lambdaEventToRequest(event)
|
|
26
|
+
const response = new PikkuFetchHTTPResponse()
|
|
27
|
+
|
|
28
|
+
if (request.method === 'options') {
|
|
29
|
+
response.header(
|
|
30
|
+
'Access-Control-Allow-Headers',
|
|
31
|
+
'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent'
|
|
32
|
+
)
|
|
33
|
+
response.header(
|
|
34
|
+
'Access-Control-Allow-Methods',
|
|
35
|
+
'OPTIONS,DELETE,GET,HEAD,PATCH,POST,PUT'
|
|
36
|
+
)
|
|
37
|
+
response.status(200)
|
|
38
|
+
return responseToLambdaResult(response.toResponse())
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
try {
|
|
42
|
+
await fetchData(request, response, {
|
|
43
|
+
singletonServices,
|
|
44
|
+
createSessionServices: createSessionServices as any,
|
|
45
|
+
})
|
|
46
|
+
} catch {
|
|
47
|
+
// Error should have already been handled by fetch
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return responseToLambdaResult(response.toResponse())
|
|
51
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { APIGatewayProxyEvent } from 'aws-lambda'
|
|
2
|
+
|
|
3
|
+
export const lambdaEventToRequest = (event: APIGatewayProxyEvent): Request => {
|
|
4
|
+
const url = new URL(event.path, `https://${event.headers.host}`)
|
|
5
|
+
|
|
6
|
+
if (event.queryStringParameters) {
|
|
7
|
+
for (const [key, value] of Object.entries(event.queryStringParameters)) {
|
|
8
|
+
if (value !== undefined) url.searchParams.set(key, value)
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const body =
|
|
13
|
+
event.body && event.isBase64Encoded
|
|
14
|
+
? Buffer.from(event.body, 'base64')
|
|
15
|
+
: event.body || undefined
|
|
16
|
+
|
|
17
|
+
return new Request(url.toString(), {
|
|
18
|
+
method: event.httpMethod,
|
|
19
|
+
headers: event.headers as HeadersInit,
|
|
20
|
+
body: ['GET', 'HEAD'].includes(event.httpMethod.toUpperCase())
|
|
21
|
+
? undefined
|
|
22
|
+
: body,
|
|
23
|
+
})
|
|
24
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { APIGatewayProxyResult } from 'aws-lambda'
|
|
2
|
+
|
|
3
|
+
export const responseToLambdaResult = async (
|
|
4
|
+
response: Response
|
|
5
|
+
): Promise<APIGatewayProxyResult> => {
|
|
6
|
+
const headers: Record<string, string> = {}
|
|
7
|
+
response.headers.forEach((value, key) => {
|
|
8
|
+
headers[key.toLowerCase()] = value
|
|
9
|
+
})
|
|
10
|
+
|
|
11
|
+
let body: string
|
|
12
|
+
let isBase64Encoded = false
|
|
13
|
+
|
|
14
|
+
const contentType = response.headers.get('content-type') || ''
|
|
15
|
+
const isBinary = !/^text\/|application\/(json|javascript|xml)/.test(
|
|
16
|
+
contentType
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
const buffer = Buffer.from(await response.arrayBuffer())
|
|
20
|
+
if (isBinary) {
|
|
21
|
+
body = buffer.toString('base64')
|
|
22
|
+
isBase64Encoded = true
|
|
23
|
+
} else {
|
|
24
|
+
body = buffer.toString('utf-8')
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return {
|
|
28
|
+
statusCode: response.status,
|
|
29
|
+
headers,
|
|
30
|
+
body,
|
|
31
|
+
isBase64Encoded,
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -2,13 +2,15 @@ import {
|
|
|
2
2
|
CoreSingletonServices,
|
|
3
3
|
CoreServices,
|
|
4
4
|
CoreUserSession,
|
|
5
|
+
PikkuFetchHTTPRequest,
|
|
6
|
+
PikkuFetchHTTPResponse,
|
|
5
7
|
} from '@pikku/core'
|
|
6
8
|
import { APIGatewayEvent, APIGatewayProxyResult } from 'aws-lambda'
|
|
7
|
-
import {
|
|
9
|
+
import { responseToLambdaResult } from '../response-converter.js'
|
|
8
10
|
import { runChannelConnect } from '@pikku/core/channel/serverless'
|
|
9
11
|
import { getServerlessDependencies } from './utils.js'
|
|
10
12
|
import { WebsocketParams } from './websocket-types.js'
|
|
11
|
-
import {
|
|
13
|
+
import { lambdaEventToRequest } from '../request-converter.js'
|
|
12
14
|
|
|
13
15
|
export const connectWebsocket = async <
|
|
14
16
|
SingletonServices extends CoreSingletonServices,
|
|
@@ -27,8 +29,8 @@ export const connectWebsocket = async <
|
|
|
27
29
|
channelStore,
|
|
28
30
|
event
|
|
29
31
|
)
|
|
30
|
-
const request = new
|
|
31
|
-
const response = new
|
|
32
|
+
const request = new PikkuFetchHTTPRequest(lambdaEventToRequest(event))
|
|
33
|
+
const response = new PikkuFetchHTTPResponse()
|
|
32
34
|
await runChannelConnect({
|
|
33
35
|
...runnerParams,
|
|
34
36
|
request,
|
|
@@ -37,5 +39,5 @@ export const connectWebsocket = async <
|
|
|
37
39
|
createSessionServices: createSessionServices as any,
|
|
38
40
|
route: event.path || '/',
|
|
39
41
|
})
|
|
40
|
-
return response.
|
|
42
|
+
return responseToLambdaResult(response.toResponse())
|
|
41
43
|
}
|
|
@@ -2,12 +2,13 @@ import {
|
|
|
2
2
|
CoreSingletonServices,
|
|
3
3
|
CoreServices,
|
|
4
4
|
CoreUserSession,
|
|
5
|
+
PikkuFetchHTTPResponse,
|
|
5
6
|
} from '@pikku/core'
|
|
6
7
|
import { runChannelMessage } from '@pikku/core/channel/serverless'
|
|
7
8
|
import { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda'
|
|
8
|
-
import { PikkuAPIGatewayLambdaResponse } from '../pikku-api-gateway-lambda-response.js'
|
|
9
9
|
import { getServerlessDependencies } from './utils.js'
|
|
10
10
|
import { WebsocketParams } from './websocket-types.js'
|
|
11
|
+
import { responseToLambdaResult } from '../response-converter.js'
|
|
11
12
|
|
|
12
13
|
export const processWebsocketMessage = async <
|
|
13
14
|
SingletonServices extends CoreSingletonServices,
|
|
@@ -26,7 +27,7 @@ export const processWebsocketMessage = async <
|
|
|
26
27
|
channelStore,
|
|
27
28
|
event
|
|
28
29
|
)
|
|
29
|
-
const response = new
|
|
30
|
+
const response = new PikkuFetchHTTPResponse()
|
|
30
31
|
try {
|
|
31
32
|
const result = await runChannelMessage(
|
|
32
33
|
{
|
|
@@ -38,11 +39,11 @@ export const processWebsocketMessage = async <
|
|
|
38
39
|
)
|
|
39
40
|
if (result) {
|
|
40
41
|
// TODO: Support non json
|
|
41
|
-
response.
|
|
42
|
+
response.json(result as any)
|
|
42
43
|
}
|
|
43
44
|
} catch (e) {
|
|
44
|
-
// Error should have already been handled by
|
|
45
|
+
// Error should have already been handled by fetch
|
|
45
46
|
console.error(e)
|
|
46
47
|
}
|
|
47
|
-
return response.
|
|
48
|
+
return responseToLambdaResult(response.toResponse())
|
|
48
49
|
}
|
package/tsconfig.tsbuildinfo
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["./src/index.ts","./src/
|
|
1
|
+
{"root":["./src/index.ts","./src/request-converter.ts","./src/response-converter.ts","./src/http/index.ts","./src/http/run-fetch.ts","./src/websocket/index.ts","./src/websocket/lambda-channel-handler.ts","./src/websocket/lambda-eventhub-service.ts","./src/websocket/utils.ts","./src/websocket/websocket-connect.ts","./src/websocket/websocket-disconnect.ts","./src/websocket/websocket-message.ts","./src/websocket/websocket-types.ts"],"version":"5.7.3"}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import { CoreSingletonServices, CoreServices, CreateSessionServices, CoreUserSession } from '@pikku/core';
|
|
2
|
-
import { APIGatewayProxyEvent } from 'aws-lambda';
|
|
3
|
-
export declare const anywhereHTTP: <SingletonServices extends CoreSingletonServices, Services extends CoreServices<SingletonServices>>(event: APIGatewayProxyEvent, singletonServices: SingletonServices, createSessionServices: CreateSessionServices<SingletonServices, Services, CoreUserSession>) => Promise<import("aws-lambda").APIGatewayProxyResult>;
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { generalHTTPHandler } from './general-http-handler.js';
|
|
2
|
-
import { PikkuAPIGatewayLambdaRequest } from '../pikku-api-gateway-lambda-request.js';
|
|
3
|
-
import { PikkuAPIGatewayLambdaResponse } from '../pikku-api-gateway-lambda-response.js';
|
|
4
|
-
export const anywhereHTTP = async (event, singletonServices, createSessionServices) => {
|
|
5
|
-
const request = new PikkuAPIGatewayLambdaRequest(event);
|
|
6
|
-
const response = new PikkuAPIGatewayLambdaResponse();
|
|
7
|
-
if (event.headers.origin) {
|
|
8
|
-
response.setHeader('Access-Control-Allow-Origin', event.headers.origin.toString());
|
|
9
|
-
}
|
|
10
|
-
response.setHeader('Access-Control-Allow-Credentials', true);
|
|
11
|
-
return await generalHTTPHandler(singletonServices, createSessionServices, request, response);
|
|
12
|
-
};
|
|
13
|
-
//# sourceMappingURL=anywhere-http.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"anywhere-http.js","sourceRoot":"","sources":["../../src/http/anywhere-http.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,4BAA4B,EAAE,MAAM,wCAAwC,CAAA;AACrF,OAAO,EAAE,6BAA6B,EAAE,MAAM,yCAAyC,CAAA;AAEvF,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAI/B,KAA2B,EAC3B,iBAAoC,EACpC,qBAIC,EACD,EAAE;IACF,MAAM,OAAO,GAAG,IAAI,4BAA4B,CAAC,KAAK,CAAC,CAAA;IACvD,MAAM,QAAQ,GAAG,IAAI,6BAA6B,EAAE,CAAA;IACpD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACzB,QAAQ,CAAC,SAAS,CAChB,6BAA6B,EAC7B,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,CAChC,CAAA;IACH,CAAC;IACD,QAAQ,CAAC,SAAS,CAAC,kCAAkC,EAAE,IAAI,CAAC,CAAA;IAC5D,OAAO,MAAM,kBAAkB,CAC7B,iBAAiB,EACjB,qBAAqB,EACrB,OAAO,EACP,QAAQ,CACT,CAAA;AACH,CAAC,CAAA"}
|
package/dist/http/cors-http.d.ts
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import type { CoreSingletonServices, CoreServices, CreateSessionServices, CoreUserSession } from '@pikku/core';
|
|
2
|
-
import type { APIGatewayProxyEvent } from 'aws-lambda';
|
|
3
|
-
export declare const corsHTTP: <SingletonServices extends CoreSingletonServices, Services extends CoreServices<SingletonServices>, UserSession extends CoreUserSession>(event: APIGatewayProxyEvent, allowedOrigins: string[], singletonServices: SingletonServices, createSessionServices: CreateSessionServices<SingletonServices, Services, UserSession>) => Promise<import("aws-lambda").APIGatewayProxyResult>;
|
package/dist/http/cors-http.js
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { generalHTTPHandler } from './general-http-handler.js';
|
|
2
|
-
import { InvalidOriginError } from '@pikku/core/errors';
|
|
3
|
-
import { PikkuAPIGatewayLambdaResponse } from '../pikku-api-gateway-lambda-response.js';
|
|
4
|
-
import { PikkuAPIGatewayLambdaRequest } from '../pikku-api-gateway-lambda-request.js';
|
|
5
|
-
const validateOrigin = (allowsOrigins, logger, event) => {
|
|
6
|
-
const origin = event.headers.origin;
|
|
7
|
-
if (!origin || allowsOrigins.every((domain) => !origin.includes(domain))) {
|
|
8
|
-
logger.error(`
|
|
9
|
-
CORS Error
|
|
10
|
-
- Recieved from origin: ${origin}
|
|
11
|
-
- Expected domain(s): ${allowsOrigins.join(', ')}
|
|
12
|
-
- Host: ${event.headers.host}
|
|
13
|
-
- Path: ${event.path}
|
|
14
|
-
- Headers: ${JSON.stringify(event.headers, null, '\t')}
|
|
15
|
-
`);
|
|
16
|
-
throw new InvalidOriginError();
|
|
17
|
-
}
|
|
18
|
-
return origin;
|
|
19
|
-
};
|
|
20
|
-
export const corsHTTP = async (event, allowedOrigins, singletonServices, createSessionServices) => {
|
|
21
|
-
const request = new PikkuAPIGatewayLambdaRequest(event);
|
|
22
|
-
const response = new PikkuAPIGatewayLambdaResponse();
|
|
23
|
-
let origin = false;
|
|
24
|
-
try {
|
|
25
|
-
origin = validateOrigin(allowedOrigins, singletonServices.logger, event);
|
|
26
|
-
}
|
|
27
|
-
catch {
|
|
28
|
-
response.setStatus(400);
|
|
29
|
-
response.setJson({ error: 'error.invalid_origin' });
|
|
30
|
-
}
|
|
31
|
-
response.setHeader('Access-Control-Allow-Origin', origin);
|
|
32
|
-
response.setHeader('Access-Control-Allow-Credentials', true);
|
|
33
|
-
return await generalHTTPHandler(singletonServices, createSessionServices, request, response);
|
|
34
|
-
};
|
|
35
|
-
//# sourceMappingURL=cors-http.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cors-http.js","sourceRoot":"","sources":["../../src/http/cors-http.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,6BAA6B,EAAE,MAAM,yCAAyC,CAAA;AACvF,OAAO,EAAE,4BAA4B,EAAE,MAAM,wCAAwC,CAAA;AAErF,MAAM,cAAc,GAAG,CACrB,aAAuB,EACvB,MAAc,EACd,KAA2B,EACnB,EAAE;IACV,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAA;IACnC,IAAI,CAAC,MAAM,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QACzE,MAAM,CAAC,KAAK,CAAC;;8BAEa,MAAM;4BACR,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;cACtC,KAAK,CAAC,OAAO,CAAC,IAAI;cAClB,KAAK,CAAC,IAAI;iBACP,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC;GACvD,CAAC,CAAA;QACA,MAAM,IAAI,kBAAkB,EAAE,CAAA;IAChC,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAK3B,KAA2B,EAC3B,cAAwB,EACxB,iBAAoC,EACpC,qBAIC,EACD,EAAE;IACF,MAAM,OAAO,GAAG,IAAI,4BAA4B,CAAC,KAAK,CAAC,CAAA;IACvD,MAAM,QAAQ,GAAG,IAAI,6BAA6B,EAAE,CAAA;IAEpD,IAAI,MAAM,GAAmB,KAAK,CAAA;IAClC,IAAI,CAAC;QACH,MAAM,GAAG,cAAc,CAAC,cAAc,EAAE,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IAC1E,CAAC;IAAC,MAAM,CAAC;QACP,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;QACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC,CAAA;IACrD,CAAC;IAED,QAAQ,CAAC,SAAS,CAAC,6BAA6B,EAAE,MAAM,CAAC,CAAA;IACzD,QAAQ,CAAC,SAAS,CAAC,kCAAkC,EAAE,IAAI,CAAC,CAAA;IAE5D,OAAO,MAAM,kBAAkB,CAC7B,iBAAiB,EACjB,qBAAqB,EACrB,OAAO,EACP,QAAQ,CACT,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import { APIGatewayProxyEvent } from 'aws-lambda';
|
|
2
|
-
import { CoreServices, CoreSingletonServices, CoreUserSession, CreateSessionServices } from '@pikku/core';
|
|
3
|
-
export declare const corslessHTTP: <SingletonServices extends CoreSingletonServices, Services extends CoreServices<SingletonServices>, UserSession extends CoreUserSession>(event: APIGatewayProxyEvent, singletonServices: SingletonServices, createSessionServices: CreateSessionServices<SingletonServices, Services, UserSession>) => Promise<import("aws-lambda").APIGatewayProxyResult>;
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { generalHTTPHandler } from './general-http-handler.js';
|
|
2
|
-
import { PikkuAPIGatewayLambdaRequest } from '../pikku-api-gateway-lambda-request.js';
|
|
3
|
-
import { PikkuAPIGatewayLambdaResponse } from '../pikku-api-gateway-lambda-response.js';
|
|
4
|
-
export const corslessHTTP = async (event, singletonServices, createSessionServices) => {
|
|
5
|
-
const request = new PikkuAPIGatewayLambdaRequest(event);
|
|
6
|
-
const response = new PikkuAPIGatewayLambdaResponse();
|
|
7
|
-
return await generalHTTPHandler(singletonServices, createSessionServices, request, response);
|
|
8
|
-
};
|
|
9
|
-
//# sourceMappingURL=corsless-http.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"corsless-http.js","sourceRoot":"","sources":["../../src/http/corsless-http.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,4BAA4B,EAAE,MAAM,wCAAwC,CAAA;AACrF,OAAO,EAAE,6BAA6B,EAAE,MAAM,yCAAyC,CAAA;AAEvF,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAK/B,KAA2B,EAC3B,iBAAoC,EACpC,qBAIC,EACD,EAAE;IACF,MAAM,OAAO,GAAG,IAAI,4BAA4B,CAAC,KAAK,CAAC,CAAA;IACvD,MAAM,QAAQ,GAAG,IAAI,6BAA6B,EAAE,CAAA;IACpD,OAAO,MAAM,kBAAkB,CAC7B,iBAAiB,EACjB,qBAAqB,EACrB,OAAO,EACP,QAAQ,CACT,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { CoreSingletonServices, CoreServices, CreateSessionServices, CoreUserSession } from '@pikku/core';
|
|
2
|
-
import { APIGatewayProxyResult } from 'aws-lambda';
|
|
3
|
-
import { PikkuAPIGatewayLambdaRequest } from '../pikku-api-gateway-lambda-request.js';
|
|
4
|
-
import { PikkuAPIGatewayLambdaResponse } from '../pikku-api-gateway-lambda-response.js';
|
|
5
|
-
export declare const generalHTTPHandler: <SingletonServices extends CoreSingletonServices, Services extends CoreServices<SingletonServices>, UserSession extends CoreUserSession>(singletonServices: SingletonServices, createSessionServices: CreateSessionServices<SingletonServices, Services, UserSession>, request: PikkuAPIGatewayLambdaRequest, response: PikkuAPIGatewayLambdaResponse) => Promise<APIGatewayProxyResult>;
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { runHTTPRoute } from '@pikku/core/http';
|
|
2
|
-
export const generalHTTPHandler = async (singletonServices, createSessionServices, request, response) => {
|
|
3
|
-
if (request.method === 'options') {
|
|
4
|
-
response.setHeader('Access-Control-Allow-Headers', 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent');
|
|
5
|
-
response.setHeader('Access-Control-Allow-Methods', 'OPTIONS,DELETE,GET,HEAD,PATCH,POST,PUT');
|
|
6
|
-
response.setStatus(200);
|
|
7
|
-
response.setJson({});
|
|
8
|
-
return response.getLambdaResponse();
|
|
9
|
-
}
|
|
10
|
-
if (request.path.includes('health-check')) {
|
|
11
|
-
response.setStatus(200);
|
|
12
|
-
return response.getLambdaResponse();
|
|
13
|
-
}
|
|
14
|
-
try {
|
|
15
|
-
await runHTTPRoute({
|
|
16
|
-
request,
|
|
17
|
-
response,
|
|
18
|
-
singletonServices,
|
|
19
|
-
createSessionServices: createSessionServices,
|
|
20
|
-
route: request.path,
|
|
21
|
-
method: request.method,
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
catch {
|
|
25
|
-
}
|
|
26
|
-
return response.getLambdaResponse();
|
|
27
|
-
};
|
|
28
|
-
//# sourceMappingURL=general-http-handler.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"general-http-handler.js","sourceRoot":"","sources":["../../src/http/general-http-handler.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAK/C,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EAKrC,iBAAoC,EACpC,qBAIC,EACD,OAAqC,EACrC,QAAuC,EACP,EAAE;IAClC,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,QAAQ,CAAC,SAAS,CAChB,8BAA8B,EAC9B,uFAAuF,CACxF,CAAA;QACD,QAAQ,CAAC,SAAS,CAChB,8BAA8B,EAC9B,wCAAwC,CACzC,CAAA;QACD,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;QACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACpB,OAAO,QAAQ,CAAC,iBAAiB,EAAE,CAAA;IACrC,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QAC1C,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;QACvB,OAAO,QAAQ,CAAC,iBAAiB,EAAE,CAAA;IACrC,CAAC;IAED,IAAI,CAAC;QACH,MAAM,YAAY,CAAC;YACjB,OAAO;YACP,QAAQ;YACR,iBAAiB;YACjB,qBAAqB,EAAE,qBAA4B;YACnD,KAAK,EAAE,OAAO,CAAC,IAAI;YACnB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAA;IACJ,CAAC;IAAC,MAAM,CAAC;IAET,CAAC;IAED,OAAO,QAAQ,CAAC,iBAAiB,EAAE,CAAA;AACrC,CAAC,CAAA"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { APIGatewayProxyEvent } from 'aws-lambda';
|
|
2
|
-
import type { PikkuQuery } from '@pikku/core/http';
|
|
3
|
-
import { PikkuHTTPAbstractRequest } from '@pikku/core/http/pikku-http-abstract-request';
|
|
4
|
-
export declare class PikkuAPIGatewayLambdaRequest extends PikkuHTTPAbstractRequest {
|
|
5
|
-
protected event: APIGatewayProxyEvent;
|
|
6
|
-
constructor(event: APIGatewayProxyEvent);
|
|
7
|
-
getBody(): Promise<string | null>;
|
|
8
|
-
getHeader(headerName: string): string | undefined;
|
|
9
|
-
getQuery(): PikkuQuery;
|
|
10
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { PikkuHTTPAbstractRequest } from '@pikku/core/http/pikku-http-abstract-request';
|
|
2
|
-
export class PikkuAPIGatewayLambdaRequest extends PikkuHTTPAbstractRequest {
|
|
3
|
-
event;
|
|
4
|
-
constructor(event) {
|
|
5
|
-
super(event.path || '/', event.httpMethod?.toLowerCase() || 'get');
|
|
6
|
-
this.event = event;
|
|
7
|
-
}
|
|
8
|
-
async getBody() {
|
|
9
|
-
return this.event.body;
|
|
10
|
-
}
|
|
11
|
-
getHeader(headerName) {
|
|
12
|
-
return this.event.headers[headerName];
|
|
13
|
-
}
|
|
14
|
-
getQuery() {
|
|
15
|
-
return this.event.queryStringParameters || {};
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
//# sourceMappingURL=pikku-api-gateway-lambda-request.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pikku-api-gateway-lambda-request.js","sourceRoot":"","sources":["../src/pikku-api-gateway-lambda-request.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAE,MAAM,8CAA8C,CAAA;AAEvF,MAAM,OAAO,4BAA6B,SAAQ,wBAAwB;IAClD;IAAtB,YAAsB,KAA2B;QAC/C,KAAK,CACH,KAAK,CAAC,IAAI,IAAI,GAAG,EAChB,KAAK,CAAC,UAAU,EAAE,WAAW,EAAiB,IAAI,KAAK,CACzD,CAAA;QAJmB,UAAK,GAAL,KAAK,CAAsB;IAKjD,CAAC;IAEM,KAAK,CAAC,OAAO;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAA;IACxB,CAAC;IAEM,SAAS,CAAC,UAAkB;QACjC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IACvC,CAAC;IAEM,QAAQ;QAEb,OAAQ,IAAI,CAAC,KAAK,CAAC,qBAAoC,IAAI,EAAE,CAAA;IAC/D,CAAC;CACF"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { JSONValue } from '@pikku/core';
|
|
2
|
-
import { PikkuHTTPAbstractResponse } from '@pikku/core/http/pikku-http-abstract-response';
|
|
3
|
-
import { APIGatewayProxyResult } from 'aws-lambda';
|
|
4
|
-
export declare class PikkuAPIGatewayLambdaResponse extends PikkuHTTPAbstractResponse {
|
|
5
|
-
headers: Record<string, string>;
|
|
6
|
-
private status;
|
|
7
|
-
private body;
|
|
8
|
-
constructor();
|
|
9
|
-
getLambdaResponse(): APIGatewayProxyResult;
|
|
10
|
-
setStatus(status: number): void;
|
|
11
|
-
setHeader(name: string, value: string | boolean | string[]): void;
|
|
12
|
-
setJson(value: JSONValue): void;
|
|
13
|
-
setResponse(response: string | Buffer): void;
|
|
14
|
-
setRedirect(path: string, status: number): void;
|
|
15
|
-
}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { PikkuHTTPAbstractResponse } from '@pikku/core/http/pikku-http-abstract-response';
|
|
2
|
-
export class PikkuAPIGatewayLambdaResponse extends PikkuHTTPAbstractResponse {
|
|
3
|
-
headers = {};
|
|
4
|
-
status = 200;
|
|
5
|
-
body;
|
|
6
|
-
constructor() {
|
|
7
|
-
super();
|
|
8
|
-
}
|
|
9
|
-
getLambdaResponse() {
|
|
10
|
-
return {
|
|
11
|
-
headers: this.headers,
|
|
12
|
-
statusCode: this.status,
|
|
13
|
-
body: this.body,
|
|
14
|
-
};
|
|
15
|
-
}
|
|
16
|
-
setStatus(status) {
|
|
17
|
-
this.status = status;
|
|
18
|
-
}
|
|
19
|
-
setHeader(name, value) {
|
|
20
|
-
this.headers[name] = value.toString();
|
|
21
|
-
}
|
|
22
|
-
setJson(value) {
|
|
23
|
-
this.body = JSON.stringify(value);
|
|
24
|
-
}
|
|
25
|
-
setResponse(response) {
|
|
26
|
-
this.body = response;
|
|
27
|
-
}
|
|
28
|
-
setRedirect(path, status) {
|
|
29
|
-
throw new Error('Method not implemented.');
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
//# sourceMappingURL=pikku-api-gateway-lambda-response.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pikku-api-gateway-lambda-response.js","sourceRoot":"","sources":["../src/pikku-api-gateway-lambda-response.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,+CAA+C,CAAA;AAGzF,MAAM,OAAO,6BAA8B,SAAQ,yBAAyB;IACnE,OAAO,GAA2B,EAAE,CAAA;IACnC,MAAM,GAAW,GAAG,CAAA;IACpB,IAAI,CAAiB;IAE7B;QACE,KAAK,EAAE,CAAA;IACT,CAAC;IAEM,iBAAiB;QACtB,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,UAAU,EAAE,IAAI,CAAC,MAAM;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAA;IACH,CAAC;IAEM,SAAS,CAAC,MAAc;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IAEM,SAAS,CAAC,IAAY,EAAE,KAAkC;QAC/D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAA;IACvC,CAAC;IAEM,OAAO,CAAC,KAAgB;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IACnC,CAAC;IAEM,WAAW,CAAC,QAAyB;QAC1C,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAA;IACtB,CAAC;IAEM,WAAW,CAAC,IAAY,EAAE,MAAc;QAC7C,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;IAC5C,CAAC;CACF"}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
CoreSingletonServices,
|
|
3
|
-
CoreServices,
|
|
4
|
-
CreateSessionServices,
|
|
5
|
-
CoreUserSession,
|
|
6
|
-
} from '@pikku/core'
|
|
7
|
-
import { APIGatewayProxyEvent } from 'aws-lambda'
|
|
8
|
-
import { generalHTTPHandler } from './general-http-handler.js'
|
|
9
|
-
import { PikkuAPIGatewayLambdaRequest } from '../pikku-api-gateway-lambda-request.js'
|
|
10
|
-
import { PikkuAPIGatewayLambdaResponse } from '../pikku-api-gateway-lambda-response.js'
|
|
11
|
-
|
|
12
|
-
export const anywhereHTTP = async <
|
|
13
|
-
SingletonServices extends CoreSingletonServices,
|
|
14
|
-
Services extends CoreServices<SingletonServices>,
|
|
15
|
-
>(
|
|
16
|
-
event: APIGatewayProxyEvent,
|
|
17
|
-
singletonServices: SingletonServices,
|
|
18
|
-
createSessionServices: CreateSessionServices<
|
|
19
|
-
SingletonServices,
|
|
20
|
-
Services,
|
|
21
|
-
CoreUserSession
|
|
22
|
-
>
|
|
23
|
-
) => {
|
|
24
|
-
const request = new PikkuAPIGatewayLambdaRequest(event)
|
|
25
|
-
const response = new PikkuAPIGatewayLambdaResponse()
|
|
26
|
-
if (event.headers.origin) {
|
|
27
|
-
response.setHeader(
|
|
28
|
-
'Access-Control-Allow-Origin',
|
|
29
|
-
event.headers.origin.toString()
|
|
30
|
-
)
|
|
31
|
-
}
|
|
32
|
-
response.setHeader('Access-Control-Allow-Credentials', true)
|
|
33
|
-
return await generalHTTPHandler(
|
|
34
|
-
singletonServices,
|
|
35
|
-
createSessionServices,
|
|
36
|
-
request,
|
|
37
|
-
response
|
|
38
|
-
)
|
|
39
|
-
}
|
package/src/http/cors-http.ts
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
CoreSingletonServices,
|
|
3
|
-
CoreServices,
|
|
4
|
-
CreateSessionServices,
|
|
5
|
-
CoreUserSession,
|
|
6
|
-
} from '@pikku/core'
|
|
7
|
-
import type { APIGatewayProxyEvent } from 'aws-lambda'
|
|
8
|
-
import type { Logger } from '@pikku/core/services'
|
|
9
|
-
|
|
10
|
-
import { generalHTTPHandler } from './general-http-handler.js'
|
|
11
|
-
import { InvalidOriginError } from '@pikku/core/errors'
|
|
12
|
-
import { PikkuAPIGatewayLambdaResponse } from '../pikku-api-gateway-lambda-response.js'
|
|
13
|
-
import { PikkuAPIGatewayLambdaRequest } from '../pikku-api-gateway-lambda-request.js'
|
|
14
|
-
|
|
15
|
-
const validateOrigin = (
|
|
16
|
-
allowsOrigins: string[],
|
|
17
|
-
logger: Logger,
|
|
18
|
-
event: APIGatewayProxyEvent
|
|
19
|
-
): string => {
|
|
20
|
-
const origin = event.headers.origin
|
|
21
|
-
if (!origin || allowsOrigins.every((domain) => !origin.includes(domain))) {
|
|
22
|
-
logger.error(`
|
|
23
|
-
CORS Error
|
|
24
|
-
- Recieved from origin: ${origin}
|
|
25
|
-
- Expected domain(s): ${allowsOrigins.join(', ')}
|
|
26
|
-
- Host: ${event.headers.host}
|
|
27
|
-
- Path: ${event.path}
|
|
28
|
-
- Headers: ${JSON.stringify(event.headers, null, '\t')}
|
|
29
|
-
`)
|
|
30
|
-
throw new InvalidOriginError()
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
return origin
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export const corsHTTP = async <
|
|
37
|
-
SingletonServices extends CoreSingletonServices,
|
|
38
|
-
Services extends CoreServices<SingletonServices>,
|
|
39
|
-
UserSession extends CoreUserSession,
|
|
40
|
-
>(
|
|
41
|
-
event: APIGatewayProxyEvent,
|
|
42
|
-
allowedOrigins: string[],
|
|
43
|
-
singletonServices: SingletonServices,
|
|
44
|
-
createSessionServices: CreateSessionServices<
|
|
45
|
-
SingletonServices,
|
|
46
|
-
Services,
|
|
47
|
-
UserSession
|
|
48
|
-
>
|
|
49
|
-
) => {
|
|
50
|
-
const request = new PikkuAPIGatewayLambdaRequest(event)
|
|
51
|
-
const response = new PikkuAPIGatewayLambdaResponse()
|
|
52
|
-
|
|
53
|
-
let origin: string | false = false
|
|
54
|
-
try {
|
|
55
|
-
origin = validateOrigin(allowedOrigins, singletonServices.logger, event)
|
|
56
|
-
} catch {
|
|
57
|
-
response.setStatus(400)
|
|
58
|
-
response.setJson({ error: 'error.invalid_origin' })
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
response.setHeader('Access-Control-Allow-Origin', origin)
|
|
62
|
-
response.setHeader('Access-Control-Allow-Credentials', true)
|
|
63
|
-
|
|
64
|
-
return await generalHTTPHandler(
|
|
65
|
-
singletonServices,
|
|
66
|
-
createSessionServices,
|
|
67
|
-
request,
|
|
68
|
-
response
|
|
69
|
-
)
|
|
70
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { APIGatewayProxyEvent } from 'aws-lambda'
|
|
2
|
-
import {
|
|
3
|
-
CoreServices,
|
|
4
|
-
CoreSingletonServices,
|
|
5
|
-
CoreUserSession,
|
|
6
|
-
CreateSessionServices,
|
|
7
|
-
} from '@pikku/core'
|
|
8
|
-
import { generalHTTPHandler } from './general-http-handler.js'
|
|
9
|
-
import { PikkuAPIGatewayLambdaRequest } from '../pikku-api-gateway-lambda-request.js'
|
|
10
|
-
import { PikkuAPIGatewayLambdaResponse } from '../pikku-api-gateway-lambda-response.js'
|
|
11
|
-
|
|
12
|
-
export const corslessHTTP = async <
|
|
13
|
-
SingletonServices extends CoreSingletonServices,
|
|
14
|
-
Services extends CoreServices<SingletonServices>,
|
|
15
|
-
UserSession extends CoreUserSession,
|
|
16
|
-
>(
|
|
17
|
-
event: APIGatewayProxyEvent,
|
|
18
|
-
singletonServices: SingletonServices,
|
|
19
|
-
createSessionServices: CreateSessionServices<
|
|
20
|
-
SingletonServices,
|
|
21
|
-
Services,
|
|
22
|
-
UserSession
|
|
23
|
-
>
|
|
24
|
-
) => {
|
|
25
|
-
const request = new PikkuAPIGatewayLambdaRequest(event)
|
|
26
|
-
const response = new PikkuAPIGatewayLambdaResponse()
|
|
27
|
-
return await generalHTTPHandler(
|
|
28
|
-
singletonServices,
|
|
29
|
-
createSessionServices,
|
|
30
|
-
request,
|
|
31
|
-
response
|
|
32
|
-
)
|
|
33
|
-
}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
CoreSingletonServices,
|
|
3
|
-
CoreServices,
|
|
4
|
-
CreateSessionServices,
|
|
5
|
-
CoreUserSession,
|
|
6
|
-
} from '@pikku/core'
|
|
7
|
-
import { runHTTPRoute } from '@pikku/core/http'
|
|
8
|
-
import { APIGatewayProxyResult } from 'aws-lambda'
|
|
9
|
-
import { PikkuAPIGatewayLambdaRequest } from '../pikku-api-gateway-lambda-request.js'
|
|
10
|
-
import { PikkuAPIGatewayLambdaResponse } from '../pikku-api-gateway-lambda-response.js'
|
|
11
|
-
|
|
12
|
-
export const generalHTTPHandler = async <
|
|
13
|
-
SingletonServices extends CoreSingletonServices,
|
|
14
|
-
Services extends CoreServices<SingletonServices>,
|
|
15
|
-
UserSession extends CoreUserSession,
|
|
16
|
-
>(
|
|
17
|
-
singletonServices: SingletonServices,
|
|
18
|
-
createSessionServices: CreateSessionServices<
|
|
19
|
-
SingletonServices,
|
|
20
|
-
Services,
|
|
21
|
-
UserSession
|
|
22
|
-
>,
|
|
23
|
-
request: PikkuAPIGatewayLambdaRequest,
|
|
24
|
-
response: PikkuAPIGatewayLambdaResponse
|
|
25
|
-
): Promise<APIGatewayProxyResult> => {
|
|
26
|
-
if (request.method === 'options') {
|
|
27
|
-
response.setHeader(
|
|
28
|
-
'Access-Control-Allow-Headers',
|
|
29
|
-
'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent'
|
|
30
|
-
)
|
|
31
|
-
response.setHeader(
|
|
32
|
-
'Access-Control-Allow-Methods',
|
|
33
|
-
'OPTIONS,DELETE,GET,HEAD,PATCH,POST,PUT'
|
|
34
|
-
)
|
|
35
|
-
response.setStatus(200)
|
|
36
|
-
response.setJson({})
|
|
37
|
-
return response.getLambdaResponse()
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
if (request.path.includes('health-check')) {
|
|
41
|
-
response.setStatus(200)
|
|
42
|
-
return response.getLambdaResponse()
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
try {
|
|
46
|
-
await runHTTPRoute({
|
|
47
|
-
request,
|
|
48
|
-
response,
|
|
49
|
-
singletonServices,
|
|
50
|
-
createSessionServices: createSessionServices as any,
|
|
51
|
-
route: request.path,
|
|
52
|
-
method: request.method,
|
|
53
|
-
})
|
|
54
|
-
} catch {
|
|
55
|
-
// Error should have already been handled by runHTTPRoute
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
return response.getLambdaResponse()
|
|
59
|
-
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import type { APIGatewayProxyEvent } from 'aws-lambda'
|
|
2
|
-
import type { HTTPMethod, PikkuQuery } from '@pikku/core/http'
|
|
3
|
-
import { PikkuHTTPAbstractRequest } from '@pikku/core/http/pikku-http-abstract-request'
|
|
4
|
-
|
|
5
|
-
export class PikkuAPIGatewayLambdaRequest extends PikkuHTTPAbstractRequest {
|
|
6
|
-
constructor(protected event: APIGatewayProxyEvent) {
|
|
7
|
-
super(
|
|
8
|
-
event.path || '/',
|
|
9
|
-
(event.httpMethod?.toLowerCase() as HTTPMethod) || 'get'
|
|
10
|
-
)
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
public async getBody() {
|
|
14
|
-
return this.event.body
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
public getHeader(headerName: string): string | undefined {
|
|
18
|
-
return this.event.headers[headerName]
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
public getQuery() {
|
|
22
|
-
// TODO: If query isn't defined, it should be an empty object
|
|
23
|
-
return (this.event.queryStringParameters as PikkuQuery) || {}
|
|
24
|
-
}
|
|
25
|
-
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { JSONValue } from '@pikku/core'
|
|
2
|
-
import { PikkuHTTPAbstractResponse } from '@pikku/core/http/pikku-http-abstract-response'
|
|
3
|
-
import { APIGatewayProxyResult } from 'aws-lambda'
|
|
4
|
-
|
|
5
|
-
export class PikkuAPIGatewayLambdaResponse extends PikkuHTTPAbstractResponse {
|
|
6
|
-
public headers: Record<string, string> = {}
|
|
7
|
-
private status: number = 200
|
|
8
|
-
private body: any | undefined
|
|
9
|
-
|
|
10
|
-
constructor() {
|
|
11
|
-
super()
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
public getLambdaResponse(): APIGatewayProxyResult {
|
|
15
|
-
return {
|
|
16
|
-
headers: this.headers,
|
|
17
|
-
statusCode: this.status,
|
|
18
|
-
body: this.body,
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
public setStatus(status: number): void {
|
|
23
|
-
this.status = status
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
public setHeader(name: string, value: string | boolean | string[]): void {
|
|
27
|
-
this.headers[name] = value.toString()
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
public setJson(value: JSONValue): void {
|
|
31
|
-
this.body = JSON.stringify(value)
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
public setResponse(response: string | Buffer): void {
|
|
35
|
-
this.body = response
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
public setRedirect(path: string, status: number) {
|
|
39
|
-
throw new Error('Method not implemented.')
|
|
40
|
-
}
|
|
41
|
-
}
|