@pikku/lambda 0.6.7 → 0.7.0

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.
Files changed (54) hide show
  1. package/CHANGELOG.md +11 -1
  2. package/dist/http/index.d.ts +1 -3
  3. package/dist/http/index.js +1 -3
  4. package/dist/http/index.js.map +1 -1
  5. package/dist/http/run-fetch.d.ts +3 -0
  6. package/dist/http/run-fetch.js +23 -0
  7. package/dist/http/run-fetch.js.map +1 -0
  8. package/dist/request-converter.d.ts +2 -0
  9. package/dist/request-converter.js +20 -0
  10. package/dist/request-converter.js.map +1 -0
  11. package/dist/response-converter.d.ts +2 -0
  12. package/dist/response-converter.js +25 -0
  13. package/dist/response-converter.js.map +1 -0
  14. package/dist/websocket/websocket-connect.js +6 -5
  15. package/dist/websocket/websocket-connect.js.map +1 -1
  16. package/dist/websocket/websocket-message.js +5 -4
  17. package/dist/websocket/websocket-message.js.map +1 -1
  18. package/package.json +2 -2
  19. package/dist/http/anywhere-http.d.ts +0 -3
  20. package/dist/http/anywhere-http.js +0 -13
  21. package/dist/http/anywhere-http.js.map +0 -1
  22. package/dist/http/cors-http.d.ts +0 -3
  23. package/dist/http/cors-http.js +0 -35
  24. package/dist/http/cors-http.js.map +0 -1
  25. package/dist/http/corsless-http.d.ts +0 -3
  26. package/dist/http/corsless-http.js +0 -9
  27. package/dist/http/corsless-http.js.map +0 -1
  28. package/dist/http/general-http-handler.d.ts +0 -5
  29. package/dist/http/general-http-handler.js +0 -28
  30. package/dist/http/general-http-handler.js.map +0 -1
  31. package/dist/pikku-api-gateway-lambda-request.d.ts +0 -10
  32. package/dist/pikku-api-gateway-lambda-request.js +0 -18
  33. package/dist/pikku-api-gateway-lambda-request.js.map +0 -1
  34. package/dist/pikku-api-gateway-lambda-response.d.ts +0 -15
  35. package/dist/pikku-api-gateway-lambda-response.js +0 -32
  36. package/dist/pikku-api-gateway-lambda-response.js.map +0 -1
  37. package/src/http/anywhere-http.ts +0 -39
  38. package/src/http/cors-http.ts +0 -70
  39. package/src/http/corsless-http.ts +0 -33
  40. package/src/http/general-http-handler.ts +0 -59
  41. package/src/http/index.ts +0 -3
  42. package/src/index.ts +0 -2
  43. package/src/pikku-api-gateway-lambda-request.ts +0 -25
  44. package/src/pikku-api-gateway-lambda-response.ts +0 -41
  45. package/src/websocket/index.ts +0 -4
  46. package/src/websocket/lambda-channel-handler.ts +0 -53
  47. package/src/websocket/lambda-eventhub-service.ts +0 -59
  48. package/src/websocket/utils.ts +0 -95
  49. package/src/websocket/websocket-connect.ts +0 -41
  50. package/src/websocket/websocket-disconnect.ts +0 -35
  51. package/src/websocket/websocket-message.ts +0 -48
  52. package/src/websocket/websocket-types.ts +0 -21
  53. package/tsconfig.json +0 -17
  54. package/tsconfig.tsbuildinfo +0 -1
package/CHANGELOG.md CHANGED
@@ -1,4 +1,14 @@
1
- ## 0.6.1
1
+ ## 0.7.0
2
+
3
+ - Updating to match remaining packages
4
+
5
+ ## 0.6.8
6
+
7
+ ### Patch Changes
8
+
9
+ - 60b2265: refactor: supporting request and response objects
10
+ - Updated dependencies [60b2265]
11
+ - @pikku/core@0.6.22
2
12
 
3
13
  ## 0.6.7
4
14
 
@@ -1,3 +1 @@
1
- export * from './anywhere-http.js';
2
- export * from './corsless-http.js';
3
- export * from './cors-http.js';
1
+ export * from './run-fetch.js';
@@ -1,4 +1,2 @@
1
- export * from './anywhere-http.js';
2
- export * from './corsless-http.js';
3
- export * from './cors-http.js';
1
+ export * from './run-fetch.js';
4
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAA;AAClC,cAAc,oBAAoB,CAAA;AAClC,cAAc,gBAAgB,CAAA"}
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,2 @@
1
+ import type { APIGatewayProxyEvent } from 'aws-lambda';
2
+ export declare const lambdaEventToRequest: (event: APIGatewayProxyEvent) => Request;
@@ -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,2 @@
1
+ import type { APIGatewayProxyResult } from 'aws-lambda';
2
+ export declare const responseToLambdaResult: (response: Response) => Promise<APIGatewayProxyResult>;
@@ -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 { PikkuAPIGatewayLambdaResponse } from '../pikku-api-gateway-lambda-response.js';
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 { PikkuAPIGatewayLambdaRequest } from '../pikku-api-gateway-lambda-request.js';
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 PikkuAPIGatewayLambdaRequest(event);
8
- const response = new PikkuAPIGatewayLambdaResponse();
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.getLambdaResponse();
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":"AAMA,OAAO,EAAE,6BAA6B,EAAE,MAAM,yCAAyC,CAAA;AACvF,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAClE,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAA;AAEtD,OAAO,EAAE,4BAA4B,EAAE,MAAM,wCAAwC,CAAA;AAErF,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,4BAA4B,CAAC,KAAK,CAAC,CAAA;IACvD,MAAM,QAAQ,GAAG,IAAI,6BAA6B,EAAE,CAAA;IACpD,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,QAAQ,CAAC,iBAAiB,EAAE,CAAA;AACrC,CAAC,CAAA"}
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 PikkuAPIGatewayLambdaResponse();
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.setJson(result);
15
+ response.json(result);
15
16
  }
16
17
  }
17
18
  catch (e) {
18
19
  console.error(e);
19
20
  }
20
- return response.getLambdaResponse();
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":"AAKA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAElE,OAAO,EAAE,6BAA6B,EAAE,MAAM,yCAAyC,CAAA;AACvF,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAA;AAGtD,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,6BAA6B,EAAE,CAAA;IACpD,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,OAAO,CAAC,MAAa,CAAC,CAAA;QACjC,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QAEX,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAClB,CAAC;IACD,OAAO,QAAQ,CAAC,iBAAiB,EAAE,CAAA;AACrC,CAAC,CAAA"}
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.7",
3
+ "version": "0.7.0",
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.14",
26
+ "@pikku/core": "^0.7.0",
27
27
  "@types/aws-lambda": "^8.10.146"
28
28
  },
29
29
  "devDependencies": {
@@ -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"}
@@ -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>;
@@ -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
- }
@@ -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
- }
package/src/http/index.ts DELETED
@@ -1,3 +0,0 @@
1
- export * from './anywhere-http.js'
2
- export * from './corsless-http.js'
3
- export * from './cors-http.js'
package/src/index.ts DELETED
@@ -1,2 +0,0 @@
1
- export * from './http/index.js'
2
- export * from './websocket/index.js'
@@ -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
- }
@@ -1,4 +0,0 @@
1
- export * from './websocket-message.js'
2
- export * from './websocket-connect.js'
3
- export * from './websocket-disconnect.js'
4
- export * from './lambda-eventhub-service.js'
@@ -1,53 +0,0 @@
1
- import { CoreUserSession } from '@pikku/core'
2
- import {
3
- ChannelStore,
4
- PikkuAbstractChannelHandler,
5
- PikkuChannelHandlerFactory,
6
- } from '@pikku/core/channel'
7
- import { sendMessage } from './utils.js'
8
- import { ApiGatewayManagementApiClient } from '@aws-sdk/client-apigatewaymanagementapi'
9
- import { Logger } from '@pikku/core/services'
10
-
11
- class LambdaChannelHandler<
12
- UserSession extends CoreUserSession = CoreUserSession,
13
- OpeningData = unknown,
14
- Out = unknown,
15
- > extends PikkuAbstractChannelHandler<OpeningData, Out> {
16
- constructor(
17
- private logger: Logger,
18
- private callbackAPI: ApiGatewayManagementApiClient,
19
- channelId: string,
20
- channelName: string,
21
- openingData: OpeningData
22
- ) {
23
- super(channelId, channelName, openingData)
24
- }
25
-
26
- public async send(message: Out, isBinary?: boolean) {
27
- if (isBinary) {
28
- throw new Error('Binary data is not supported on serverless lambdas')
29
- }
30
- const data = JSON.stringify(message)
31
- await sendMessage(this.logger, this.callbackAPI, this.channelId, data)
32
- }
33
- }
34
-
35
- export const createLambdaChannelHandlerFactory = (
36
- logger: Logger,
37
- channelStore: ChannelStore,
38
- callbackAPI: ApiGatewayManagementApiClient
39
- ) => {
40
- const factory: PikkuChannelHandlerFactory = (
41
- channelId,
42
- channelName,
43
- openingData
44
- ) =>
45
- new LambdaChannelHandler(
46
- logger,
47
- callbackAPI,
48
- channelId,
49
- channelName,
50
- openingData
51
- )
52
- return factory
53
- }
@@ -1,59 +0,0 @@
1
- import { ApiGatewayManagementApiClient } from '@aws-sdk/client-apigatewaymanagementapi'
2
- import {
3
- ChannelStore,
4
- EventHubService,
5
- EventHubStore,
6
- } from '@pikku/core/channel'
7
- import { getApiGatewayManagementApiClient, sendMessages } from './utils.js'
8
- import { Logger } from '@pikku/core/services'
9
- import { APIGatewayEvent } from 'aws-lambda'
10
-
11
- export class LambdaEventHubService<Out = unknown>
12
- implements EventHubService<Out>
13
- {
14
- private callbackAPI: ApiGatewayManagementApiClient
15
-
16
- constructor(
17
- private logger: Logger,
18
- event: APIGatewayEvent,
19
- private channelStore: ChannelStore,
20
- private eventHubStore: EventHubStore
21
- ) {
22
- this.callbackAPI = getApiGatewayManagementApiClient(logger, event)
23
- }
24
-
25
- async subscribe(topic: string, channelId: string): Promise<void> {
26
- await this.eventHubStore.subscribe(topic, channelId)
27
- }
28
-
29
- async unsubscribe(topic: string, channelId: string): Promise<void> {
30
- await this.eventHubStore.unsubscribe(topic, channelId)
31
- }
32
-
33
- async publish(
34
- topic: string,
35
- fromChannelId: string,
36
- data: Out,
37
- isBinary?: boolean
38
- ): Promise<void> {
39
- const channelIds = await this.eventHubStore.getChannelIdsForTopic(topic)
40
- await this.sendMessages(channelIds, fromChannelId, data)
41
- }
42
-
43
- private async sendMessages(
44
- channelIds: string[],
45
- fromChannelId: string,
46
- data: Out,
47
- isBinary?: boolean
48
- ): Promise<void> {
49
- await sendMessages(
50
- this.logger,
51
- this.channelStore,
52
- this.callbackAPI,
53
- fromChannelId,
54
- channelIds,
55
- data,
56
- isBinary
57
- )
58
- }
59
- }
@@ -1,95 +0,0 @@
1
- import {
2
- ApiGatewayManagementApiClient,
3
- PostToConnectionCommand,
4
- } from '@aws-sdk/client-apigatewaymanagementapi'
5
- import { Logger } from '@pikku/core/services'
6
- import { APIGatewayEvent } from 'aws-lambda'
7
- import { createLambdaChannelHandlerFactory } from './lambda-channel-handler.js'
8
- import { ChannelStore } from '@pikku/core/channel'
9
-
10
- export const sendMessage = async (
11
- logger: Logger,
12
- callbackAPI: ApiGatewayManagementApiClient,
13
- ConnectionId: string,
14
- Data: string
15
- ): Promise<boolean> => {
16
- try {
17
- await callbackAPI.send(new PostToConnectionCommand({ ConnectionId, Data }))
18
- return true
19
- } catch (e: any) {
20
- // TODO: We need to check if it's a 410 and remove the connection if it is
21
- // Otherwise we need to log the error
22
- logger.error(e.message)
23
- return false
24
- }
25
- }
26
-
27
- export const sendMessages = async (
28
- logger: Logger,
29
- channelStore: ChannelStore,
30
- callbackAPI: ApiGatewayManagementApiClient,
31
- fromChannelId: string,
32
- channelIds: string[],
33
- data: unknown,
34
- isBinary?: boolean
35
- ): Promise<void> => {
36
- if (isBinary) {
37
- throw new Error('Binary data is not supported on serverless lambdas')
38
- }
39
- const staleWebsockets: string[] = []
40
- const Data = JSON.stringify(data)
41
- await Promise.all(
42
- channelIds.map(async (channelId) => {
43
- if (channelId !== fromChannelId) {
44
- const success = await sendMessage(logger, callbackAPI, channelId, Data)
45
- if (!success) {
46
- staleWebsockets.push(channelId)
47
- }
48
- }
49
- })
50
- )
51
- if (staleWebsockets.length > 0) {
52
- await channelStore.removeChannels(staleWebsockets)
53
- }
54
- }
55
-
56
- export const getApiGatewayManagementApiClient = (
57
- logger: Logger,
58
- event: APIGatewayEvent
59
- ) => {
60
- let endpoint: string
61
- if (process.env.IS_OFFLINE) {
62
- logger.info('Assuming serverless offline mode due to IS_OFFLINE')
63
- endpoint = `http://localhost:3001`
64
- } else if (event.requestContext.domainName?.includes('amazonaws.com')) {
65
- logger.info(
66
- 'Assuming we are using the default endpoint mode due to amazonaws.com domain'
67
- )
68
- endpoint = `https://${event.requestContext.domainName}/${event.requestContext.stage}`
69
- } else {
70
- logger.info('Assuming we are using a custom domain mode')
71
- endpoint = `https://${event.requestContext.domainName}`
72
- }
73
- return new ApiGatewayManagementApiClient({
74
- apiVersion: '2018-11-29',
75
- endpoint,
76
- })
77
- }
78
-
79
- export const getServerlessDependencies = (
80
- logger: Logger,
81
- channelStore: ChannelStore,
82
- event: APIGatewayEvent
83
- ) => {
84
- const channelId = event.requestContext.connectionId
85
- if (!channelId) {
86
- throw new Error('No connectionId found in requestContext')
87
- }
88
- const callbackAPI = getApiGatewayManagementApiClient(logger, event)
89
- const channelHandlerFactory = createLambdaChannelHandlerFactory(
90
- logger,
91
- channelStore,
92
- callbackAPI
93
- )
94
- return { channelId, callbackAPI, channelHandlerFactory, channelStore }
95
- }
@@ -1,41 +0,0 @@
1
- import {
2
- CoreSingletonServices,
3
- CoreServices,
4
- CoreUserSession,
5
- } from '@pikku/core'
6
- import { APIGatewayEvent, APIGatewayProxyResult } from 'aws-lambda'
7
- import { PikkuAPIGatewayLambdaResponse } from '../pikku-api-gateway-lambda-response.js'
8
- import { runChannelConnect } from '@pikku/core/channel/serverless'
9
- import { getServerlessDependencies } from './utils.js'
10
- import { WebsocketParams } from './websocket-types.js'
11
- import { PikkuAPIGatewayLambdaRequest } from '../pikku-api-gateway-lambda-request.js'
12
-
13
- export const connectWebsocket = async <
14
- SingletonServices extends CoreSingletonServices,
15
- Services extends CoreServices<SingletonServices>,
16
- UserSession extends CoreUserSession,
17
- >(
18
- event: APIGatewayEvent,
19
- {
20
- singletonServices,
21
- createSessionServices,
22
- channelStore,
23
- }: WebsocketParams<SingletonServices, Services, UserSession>
24
- ): Promise<APIGatewayProxyResult> => {
25
- const runnerParams = getServerlessDependencies(
26
- singletonServices.logger,
27
- channelStore,
28
- event
29
- )
30
- const request = new PikkuAPIGatewayLambdaRequest(event)
31
- const response = new PikkuAPIGatewayLambdaResponse()
32
- await runChannelConnect({
33
- ...runnerParams,
34
- request,
35
- response,
36
- singletonServices: singletonServices as any,
37
- createSessionServices: createSessionServices as any,
38
- route: event.path || '/',
39
- })
40
- return response.getLambdaResponse()
41
- }
@@ -1,35 +0,0 @@
1
- import {
2
- CoreSingletonServices,
3
- CoreServices,
4
- CoreUserSession,
5
- } from '@pikku/core'
6
- import { runChannelDisconnect } from '@pikku/core/channel/serverless'
7
- import { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda'
8
-
9
- import { getServerlessDependencies } from './utils.js'
10
- import { WebsocketParams } from './websocket-types.js'
11
-
12
- export const disconnectWebsocket = async <
13
- SingletonServices extends CoreSingletonServices,
14
- Services extends CoreServices<SingletonServices>,
15
- UserSession extends CoreUserSession,
16
- >(
17
- event: APIGatewayProxyEvent,
18
- {
19
- singletonServices,
20
- createSessionServices,
21
- channelStore,
22
- }: WebsocketParams<SingletonServices, Services, UserSession>
23
- ): Promise<APIGatewayProxyResult> => {
24
- const runnerParams = getServerlessDependencies(
25
- singletonServices.logger,
26
- channelStore,
27
- event
28
- )
29
- await runChannelDisconnect({
30
- ...runnerParams,
31
- singletonServices: singletonServices as any,
32
- createSessionServices: createSessionServices as any,
33
- })
34
- return { statusCode: 200, body: '' }
35
- }
@@ -1,48 +0,0 @@
1
- import {
2
- CoreSingletonServices,
3
- CoreServices,
4
- CoreUserSession,
5
- } from '@pikku/core'
6
- import { runChannelMessage } from '@pikku/core/channel/serverless'
7
- import { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda'
8
- import { PikkuAPIGatewayLambdaResponse } from '../pikku-api-gateway-lambda-response.js'
9
- import { getServerlessDependencies } from './utils.js'
10
- import { WebsocketParams } from './websocket-types.js'
11
-
12
- export const processWebsocketMessage = async <
13
- SingletonServices extends CoreSingletonServices,
14
- Services extends CoreServices<SingletonServices>,
15
- UserSession extends CoreUserSession,
16
- >(
17
- event: APIGatewayProxyEvent,
18
- {
19
- singletonServices,
20
- createSessionServices,
21
- channelStore,
22
- }: WebsocketParams<SingletonServices, Services, UserSession>
23
- ): Promise<APIGatewayProxyResult> => {
24
- const runnerParams = getServerlessDependencies(
25
- singletonServices.logger,
26
- channelStore,
27
- event
28
- )
29
- const response = new PikkuAPIGatewayLambdaResponse()
30
- try {
31
- const result = await runChannelMessage(
32
- {
33
- ...runnerParams,
34
- singletonServices: singletonServices as any,
35
- createSessionServices: createSessionServices as any,
36
- },
37
- event.body
38
- )
39
- if (result) {
40
- // TODO: Support non json
41
- response.setJson(result as any)
42
- }
43
- } catch (e) {
44
- // Error should have already been handled by runHTTPRoute
45
- console.error(e)
46
- }
47
- return response.getLambdaResponse()
48
- }
@@ -1,21 +0,0 @@
1
- import {
2
- CoreSingletonServices,
3
- CoreServices,
4
- CoreUserSession,
5
- CreateSessionServices,
6
- } from '@pikku/core'
7
- import { ChannelStore } from '@pikku/core/channel'
8
-
9
- export type WebsocketParams<
10
- SingletonServices extends CoreSingletonServices,
11
- Services extends CoreServices<SingletonServices>,
12
- UserSession extends CoreUserSession,
13
- > = {
14
- channelStore: ChannelStore
15
- singletonServices: SingletonServices
16
- createSessionServices?: CreateSessionServices<
17
- SingletonServices,
18
- Services,
19
- UserSession
20
- >
21
- }
package/tsconfig.json DELETED
@@ -1,17 +0,0 @@
1
- {
2
- "extends": "../../../tsconfig.json",
3
- "compilerOptions": {
4
- "rootDir": "./src",
5
- "module": "Node16",
6
- "outDir": "dist",
7
- "target": "esnext",
8
- "declaration": true
9
- },
10
- "include": ["bin/**/*.ts", "src/**/*.ts"],
11
- "exclude": ["**/*.test.ts", "node_modules", "bin/dist"],
12
- "references": [
13
- {
14
- "path": "../../core/tsconfig.json"
15
- }
16
- ]
17
- }
@@ -1 +0,0 @@
1
- {"root":["./src/index.ts","./src/pikku-api-gateway-lambda-request.ts","./src/pikku-api-gateway-lambda-response.ts","./src/http/anywhere-http.ts","./src/http/cors-http.ts","./src/http/corsless-http.ts","./src/http/general-http-handler.ts","./src/http/index.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"}