quantum-flow 1.20.0 → 1.20.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -146,7 +146,8 @@ Use `LambdaAdapter` to convert API Gateway events to requests and responses. Cre
146
146
 
147
147
  ```typescript
148
148
  Example Lambda handler creation
149
- import { LambdaAdapter, LambdaRequest, Request } from 'quantum-flow/aws';
149
+ import { LambdaAdapter, LambdaRequest, LambdaResponse } from 'quantum-flow/aws';
150
+ import { Request, Query, Headers, Params, Response } from 'quantum-flow/core'
150
151
 
151
152
  @Controller({ prefix: 'user' })
152
153
  class UserController {
@@ -155,14 +156,18 @@ class UserController {
155
156
  @Headers() headers: Record<string, string | string[]>,
156
157
  @Params(ParamDTO, 'param') params: string,
157
158
  @Request() req: LambdaRequest,
158
- @Response() resp: ServerResponse,
159
- @InjectWS() ws: IWebSocketService,
160
- ) {}
159
+ @Response() res: LambdaResponse
160
+ ) { }
161
161
  }
162
162
  const lambdaAdapter = new LambdaAdapter(UserController);
163
163
  export const handler = lambdaAdapter.handler;
164
164
  ```
165
165
 
166
+ You can access context and event throught @Request() decorator:
167
+ @Request() request: LambdaRequest
168
+ request.context
169
+ request.event
170
+
166
171
  # WebSocket Support
167
172
 
168
173
  Enable WebSocket in the server configuration and register WebSocket controllers.
@@ -1,3 +1,2 @@
1
- export { LambdaEvent, LambdaRequest } from '../../types/index.js';
2
- export { Request } from '../../core';
1
+ export { LambdaEvent, LambdaRequest, LambdaResponse } from '../../types/index.js';
3
2
  export * from './lambda';
@@ -14,8 +14,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.Request = void 0;
18
- var core_1 = require("../../core");
19
- Object.defineProperty(exports, "Request", { enumerable: true, get: function () { return core_1.Request; } });
20
17
  __exportStar(require("./lambda"), exports);
21
18
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/app/aws/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AACA,mCAAqC;AAA5B,+FAAA,OAAO,OAAA;AAChB,2CAAyB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/app/aws/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AACA,2CAAyB"}
@@ -1,15 +1,20 @@
1
- import { ILResponse } from '../../../types/index.js';
2
- import { ServerResponse } from 'http';
3
- export declare class LResponse implements ILResponse {
4
- private originalResponse?;
1
+ import { CookieOptions, LambdaResponse } from '../../../types/index.js';
2
+ export declare class LResponse implements LambdaResponse {
5
3
  private _statusCode;
6
4
  private _headers;
7
5
  body: any;
8
- constructor(originalResponse?: ServerResponse | undefined);
6
+ isBase64Encoded?: boolean;
7
+ _cookies: string[];
8
+ setCookie(name: string, value: string, options?: CookieOptions): void;
9
+ clearCookie(name: string, options?: {
10
+ path?: string;
11
+ domain?: string;
12
+ }): void;
13
+ getCookies(): string[];
14
+ clearAllCookies(): void;
15
+ private _updateCookieHeader;
9
16
  setHeader(name: string, value: string): void;
10
17
  set statusCode(code: number);
11
18
  get statusCode(): number;
12
19
  get headers(): Record<string, string>;
13
- send(): void;
14
- get original(): ServerResponse | undefined;
15
20
  }
@@ -2,24 +2,61 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.LResponse = void 0;
4
4
  class LResponse {
5
- originalResponse;
6
5
  _statusCode = 200;
7
6
  _headers = {};
8
7
  body = null;
9
- constructor(originalResponse) {
10
- this.originalResponse = originalResponse;
8
+ isBase64Encoded;
9
+ _cookies;
10
+ setCookie(name, value, options) {
11
+ let cookie = `${name}=${encodeURIComponent(value)}`;
12
+ if (options) {
13
+ if (options.maxAge)
14
+ cookie += `; Max-Age=${options.maxAge}`;
15
+ if (options.expires)
16
+ cookie += `; Expires=${options.expires.toUTCString()}`;
17
+ if (options.domain)
18
+ cookie += `; Domain=${options.domain}`;
19
+ if (options.path)
20
+ cookie += `; Path=${options.path}`;
21
+ if (options.secure)
22
+ cookie += `; Secure`;
23
+ if (options.httpOnly)
24
+ cookie += `; HttpOnly`;
25
+ if (options.sameSite)
26
+ cookie += `; SameSite=${options.sameSite}`;
27
+ if (options.priority)
28
+ cookie += `; Priority=${options.priority}`;
29
+ if (options.partitioned)
30
+ cookie += `; Partitioned`;
31
+ }
32
+ this._cookies.push(cookie);
33
+ this._updateCookieHeader();
34
+ }
35
+ clearCookie(name, options) {
36
+ const cookie = `${name}=; Max-Age=0; Expires=${new Date(0).toUTCString()}${options?.path ? `; Path=${options.path}` : ''}${options?.domain ? `; Domain=${options.domain}` : ''}`;
37
+ this._cookies.push(cookie);
38
+ this._updateCookieHeader();
39
+ }
40
+ getCookies() {
41
+ return [...this._cookies];
42
+ }
43
+ clearAllCookies() {
44
+ this._cookies = [];
45
+ delete this._headers['Set-Cookie'];
46
+ }
47
+ _updateCookieHeader() {
48
+ if (this._cookies.length > 0) {
49
+ this._headers['Set-Cookie'] = this._cookies.join(', ');
50
+ }
51
+ else {
52
+ delete this._headers['Set-Cookie'];
53
+ }
11
54
  }
12
55
  setHeader(name, value) {
13
56
  this._headers[name] = value;
14
- if (this.originalResponse) {
15
- this.originalResponse.setHeader(name, value);
16
- }
17
57
  }
18
58
  set statusCode(code) {
19
59
  this._statusCode = code;
20
- if (this.originalResponse) {
21
- this.originalResponse.statusCode = code;
22
- }
23
60
  }
24
61
  get statusCode() {
25
62
  return this._statusCode;
@@ -27,12 +64,6 @@ class LResponse {
27
64
  get headers() {
28
65
  return { ...this._headers };
29
66
  }
30
- send() {
31
- throw `Lambda response doesn't have "send" method`;
32
- }
33
- get original() {
34
- return this.originalResponse;
35
- }
36
67
  }
37
68
  exports.LResponse = LResponse;
38
69
  //# sourceMappingURL=response.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"response.js","sourceRoot":"","sources":["../../../../src/app/aws/utils/response.ts"],"names":[],"mappings":";;;AAGA,MAAa,SAAS;IAKA;IAJZ,WAAW,GAAW,GAAG,CAAC;IAC1B,QAAQ,GAA2B,EAAE,CAAC;IAC9C,IAAI,GAAQ,IAAI,CAAC;IAEjB,YAAoB,gBAAiC;QAAjC,qBAAgB,GAAhB,gBAAgB,CAAiB;IAAG,CAAC;IAEzD,SAAS,CAAC,IAAY,EAAE,KAAa;QACnC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QAC5B,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,IAAI,UAAU,CAAC,IAAY;QACzB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,IAAI,CAAC,gBAAgB,CAAC,UAAU,GAAG,IAAI,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,IAAI,OAAO;QACT,OAAO,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAED,IAAI;QACF,MAAM,4CAA4C,CAAC;IACrD,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;CACF;AApCD,8BAoCC"}
1
+ {"version":3,"file":"response.js","sourceRoot":"","sources":["../../../../src/app/aws/utils/response.ts"],"names":[],"mappings":"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"}
@@ -64,4 +64,15 @@ export declare enum HTTP_METHODS {
64
64
  OPTIONS = "OPTIONS",
65
65
  HEAD = "HEAD"
66
66
  }
67
+ export interface CookieOptions {
68
+ maxAge?: number;
69
+ expires?: Date;
70
+ domain?: string;
71
+ path?: string;
72
+ secure?: boolean;
73
+ httpOnly?: boolean;
74
+ sameSite?: 'Strict' | 'Lax' | 'None';
75
+ priority?: 'Low' | 'Medium' | 'High';
76
+ partitioned?: boolean;
77
+ }
67
78
  export {};
@@ -1,5 +1,5 @@
1
1
  import { APIGatewayProxyEvent, APIGatewayProxyEventV2, Context, Handler } from 'aws-lambda';
2
- import { HTTP_METHODS } from './common';
2
+ import { CookieOptions, HTTP_METHODS } from './common';
3
3
  import { ControllerClass } from './controller';
4
4
  import { MultipartFile } from './multipart';
5
5
  import { LambdaPlugin } from './plugins';
@@ -51,14 +51,6 @@ export interface LambdaRequestMeta {
51
51
  sourceIp?: string;
52
52
  userAgent?: string;
53
53
  }
54
- export interface LambdaResponse {
55
- statusCode: number;
56
- headers?: Record<string, string>;
57
- body: string;
58
- isBase64Encoded?: boolean;
59
- multiValueHeaders?: Record<string, string[]>;
60
- cookies?: string[];
61
- }
62
54
  export interface LambdaApp {
63
55
  beforeStart?: () => void;
64
56
  }
@@ -86,13 +78,20 @@ export interface LambdaRequest {
86
78
  sourceIp: string;
87
79
  end(): void;
88
80
  }
89
- export interface ILResponse {
81
+ export interface LambdaResponse {
90
82
  body: any;
91
- setHeader(name: string, value: string): void;
92
83
  statusCode: number;
93
- headers: Record<string, string>;
94
- send(): void;
95
- original: any;
84
+ headers?: Record<string, string>;
85
+ cookies?: string[];
86
+ isBase64Encoded?: boolean;
87
+ setHeader(name: string, value: string): void;
88
+ setCookie(name: string, value: string, options?: CookieOptions): void;
89
+ clearCookie(name: string, options?: {
90
+ path?: string;
91
+ domain?: string;
92
+ }): void;
93
+ getCookies(): string[];
94
+ clearAllCookies(): void;
96
95
  }
97
96
  export interface ILambdaAdapter {
98
97
  handler: Handler;
@@ -2,7 +2,7 @@ import { Context } from 'aws-lambda';
2
2
  import { IncomingMessage, Server, ServerResponse } from 'http';
3
3
  import { AppRequest, MiddlewareCB } from './common';
4
4
  import { IHttpServer } from './http';
5
- import { ILambdaAdapter, ILResponse, LambdaEvent, LambdaRequest } from './lambda';
5
+ import { ILambdaAdapter, LambdaEvent, LambdaRequest, LambdaResponse } from './lambda';
6
6
  export interface HttpPluginHooks {
7
7
  beforeRequest?: (req: IncomingMessage) => void | Promise<void>;
8
8
  beforeRoute?: (req: AppRequest, response: ServerResponse) => void | Promise<void>;
@@ -21,7 +21,7 @@ export type PluginKeys = keyof Omit<HttpPlugin, 'name' | 'hooks'>;
21
21
  export interface LambdaPluginHooks {
22
22
  beforeRequest?: (event: LambdaEvent, context: Context) => void | Promise<void>;
23
23
  beforeRoute?: (req: LambdaRequest) => void | Promise<void>;
24
- afterResponse?: (req: LambdaRequest, res: ILResponse) => void | Promise<void>;
24
+ afterResponse?: (req: LambdaRequest, res: LambdaResponse) => void | Promise<void>;
25
25
  }
26
26
  export interface LambdaPlugin {
27
27
  name: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "quantum-flow",
3
- "version": "1.20.0",
3
+ "version": "1.20.2",
4
4
  "description": "Decorator-based API framework",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",