lambder 1.0.63 → 1.0.65

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.
@@ -18,7 +18,9 @@
18
18
  "**/.git/": true,
19
19
  },
20
20
  "cSpell.words": [
21
- "lambder",
21
+ "lambder",
22
+ "LMBDRAUTHID",
23
+ "LMBDRTOKEN"
22
24
  ],
23
25
  }
24
26
 
package/dist/Lambder.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { APIGatewayProxyEvent, APIGatewayProxyEventHeaders, Context } from "aws-lambda";
2
- import Resolver from "./Resolver.js";
2
+ import LambderResolver from "./LambderResolver.js";
3
3
  import LambderResponseBuilder, { LambderResolverResponse } from "./LambderResponseBuilder.js";
4
4
  type Path = `/${string}`;
5
5
  type Session = {
@@ -25,14 +25,14 @@ type RenderContext = {
25
25
  lambdaContext: Context;
26
26
  };
27
27
  type ConditionFunction = (ctx: RenderContext) => boolean;
28
- type ActionFunction = (ctx: RenderContext, resolver: Resolver) => LambderResolverResponse | Promise<LambderResolverResponse>;
28
+ type ActionFunction = (ctx: RenderContext, resolver: LambderResolver) => LambderResolverResponse | Promise<LambderResolverResponse>;
29
29
  type HookCreatedFunction = (lambderInstance: Lambder) => Promise<void>;
30
- type HookBeforeRenderFunction = (ctx: RenderContext, resolver: Resolver) => RenderContext | Error | Promise<RenderContext | Error>;
31
- type HookAfterRenderFunction = (ctx: RenderContext, resolver: Resolver, response: LambderResolverResponse) => LambderResolverResponse | Error | Promise<LambderResolverResponse | Error>;
32
- type HookFallbackFunction = (ctx: RenderContext, resolver: Resolver) => void | Promise<void>;
30
+ type HookBeforeRenderFunction = (ctx: RenderContext, resolver: LambderResolver) => RenderContext | Error | Promise<RenderContext | Error>;
31
+ type HookAfterRenderFunction = (ctx: RenderContext, resolver: LambderResolver, response: LambderResolverResponse) => LambderResolverResponse | Error | Promise<LambderResolverResponse | Error>;
32
+ type HookFallbackFunction = (ctx: RenderContext, resolver: LambderResolver) => void | Promise<void>;
33
33
  type GlobalErrorHandlerFunction = (err: Error, ctx: RenderContext | null, response: LambderResponseBuilder) => LambderResolverResponse | Promise<LambderResolverResponse>;
34
- type RouteFallbackHandlerFunction = (ctx: RenderContext, resolver: Resolver) => LambderResolverResponse;
35
- type ApiFallbackHandlerFunction = (ctx: RenderContext, resolver: Resolver) => LambderResolverResponse;
34
+ type RouteFallbackHandlerFunction = (ctx: RenderContext, resolver: LambderResolver) => LambderResolverResponse;
35
+ type ApiFallbackHandlerFunction = (ctx: RenderContext, resolver: LambderResolver) => LambderResolverResponse;
36
36
  export declare const createContext: (event: APIGatewayProxyEvent, lambdaContext: Context, apiPath?: string | null) => RenderContext;
37
37
  export default class Lambder {
38
38
  private apiPath;
package/dist/Lambder.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import querystring from "querystring";
2
2
  import cookieParser from "cookie";
3
3
  import { match } from "path-to-regexp";
4
- import Resolver from "./Resolver.js";
4
+ import LambderResolver from "./LambderResolver.js";
5
5
  import LambderResponseBuilder from "./LambderResponseBuilder.js";
6
6
  export const createContext = (event, lambdaContext, apiPath = null) => {
7
7
  const host = event.headers.Host || event.headers.host || "";
@@ -69,7 +69,8 @@ export default class Lambder {
69
69
  testPatternMatch(pattern, path) {
70
70
  return (match(pattern, { decode: decodeURIComponent }))(path) !== false;
71
71
  }
72
- async validateSession(session) {
72
+ async validateSession(ctx) {
73
+ const { session, apiName, post, cookie } = ctx;
73
74
  if (!session)
74
75
  return false;
75
76
  if (!session.userId || !session.userIdHash || !session.sessionHash || !session.csrfToken)
@@ -78,6 +79,14 @@ export default class Lambder {
78
79
  return false;
79
80
  if (session.expiresTimeStamp > Date.now())
80
81
  return false;
82
+ if (apiName) {
83
+ if (!post.token)
84
+ return false;
85
+ if (post.token !== cookie.LMBDRTOKEN)
86
+ return false;
87
+ if (post.token !== session.csrfToken)
88
+ return false;
89
+ }
81
90
  // Check DDB;
82
91
  return false;
83
92
  }
@@ -128,7 +137,7 @@ export default class Lambder {
128
137
  (typeof condition === "function" && condition(ctx)) ||
129
138
  (condition?.constructor == RegExp && condition.test(ctx.path)))),
130
139
  actionFn: async (ctx, resolver) => {
131
- const isSessionValid = this.validateSession(ctx.session);
140
+ const isSessionValid = this.validateSession(ctx);
132
141
  if (!isSessionValid)
133
142
  throw new Error("Session not found");
134
143
  if (typeof condition === "string") {
@@ -157,7 +166,7 @@ export default class Lambder {
157
166
  (typeof apiName === "function" && apiName(ctx)) ||
158
167
  (apiName?.constructor == RegExp && apiName.test(ctx.apiName))),
159
168
  actionFn: async (ctx, resolver) => {
160
- const isSessionValid = this.validateSession(ctx.session);
169
+ const isSessionValid = this.validateSession(ctx);
161
170
  if (!isSessionValid)
162
171
  throw new Error("Session not found");
163
172
  return await actionFn(ctx, resolver);
@@ -183,7 +192,7 @@ export default class Lambder {
183
192
  }
184
193
  ;
185
194
  getResolver(resolve, reject) {
186
- return new Resolver({
195
+ return new LambderResolver({
187
196
  isCorsEnabled: this.isCorsEnabled,
188
197
  publicPath: this.publicPath,
189
198
  apiVersion: this.apiVersion,
@@ -48,7 +48,8 @@ export default class LambderCaller {
48
48
  fetchStartedHandler?: FetchStartEventHandler;
49
49
  fetchEndedHandler?: FetchEndEventHandler;
50
50
  });
51
- apiRaw<T>(apiName: string, payload?: any, headers?: Record<string, any>, options?: {
51
+ apiRaw<T>(apiName: string, payload?: any, options?: {
52
+ headers?: Record<string, any>;
52
53
  versionExpiredHandler?: VoidFunction;
53
54
  sessionExpiredHandler?: VoidFunction;
54
55
  messageHandler?: MessageHandler;
@@ -27,7 +27,8 @@ export default class LambderCaller {
27
27
  this.fetchEndedHandler = fetchEndedHandler;
28
28
  }
29
29
  ;
30
- async apiRaw(apiName, payload, headers, options) {
30
+ async apiRaw(apiName, payload, options) {
31
+ const headers = options?.headers;
31
32
  const fetchTracker = { apiName, done: false, fetchEndCalled: false };
32
33
  try {
33
34
  this.fetchTrackerList.push(fetchTracker);
@@ -37,7 +38,7 @@ export default class LambderCaller {
37
38
  activeFetchList: this.fetchTrackerList.filter(v => !v.done)
38
39
  });
39
40
  const version = this.apiVersion;
40
- const token = Cookies.get("LMBRTOKEN") || "";
41
+ const token = Cookies.get("LMBDRTOKEN") || "";
41
42
  const siteHost = window.location.hostname;
42
43
  let data = await fetch(this.apiPath, {
43
44
  method: 'POST', mode: 'same-origin', cache: 'no-cache',
@@ -68,8 +69,8 @@ export default class LambderCaller {
68
69
  return null;
69
70
  }
70
71
  if (data && data.sessionExpired) {
71
- Cookies.set('LMBRAUTHID', '', { expires: -1 });
72
- Cookies.set('LMBRTOKEN', '', { expires: -1 });
72
+ Cookies.set('LMBDRAUTHID', '', { expires: -1 });
73
+ Cookies.set('LMBDRTOKEN', '', { expires: -1 });
73
74
  if (this.sessionExpiredHandler) {
74
75
  await this.sessionExpiredHandler();
75
76
  }
@@ -12,7 +12,7 @@ interface DieResolverMethods {
12
12
  file: MethodType<LambderResponseBuilder, 'file'>;
13
13
  api: MethodType<LambderResponseBuilder, 'api'>;
14
14
  }
15
- export default class Resolver extends LambderResponseBuilder {
15
+ export default class LambderResolver extends LambderResponseBuilder {
16
16
  resolve: (response: LambderResolverResponse) => void;
17
17
  reject: (err: Error) => void;
18
18
  die: DieResolverMethods;
@@ -1,5 +1,5 @@
1
1
  import LambderResponseBuilder from "./LambderResponseBuilder.js";
2
- export default class Resolver extends LambderResponseBuilder {
2
+ export default class LambderResolver extends LambderResponseBuilder {
3
3
  resolve;
4
4
  reject;
5
5
  die;
package/dist/index.d.ts CHANGED
@@ -2,4 +2,4 @@ import Lambder from './Lambder.js';
2
2
  export default Lambder;
3
3
  export { default as LambderCaller } from "./LambderCaller.js";
4
4
  export { default as LambderResponseBuilder } from "./LambderResponseBuilder.js";
5
- export { default as Resolver } from "./Resolver.js";
5
+ export { default as LambderResolver } from "./LambderResolver.js";
package/dist/index.js CHANGED
@@ -2,4 +2,4 @@ import Lambder from './Lambder.js';
2
2
  export default Lambder;
3
3
  export { default as LambderCaller } from "./LambderCaller.js";
4
4
  export { default as LambderResponseBuilder } from "./LambderResponseBuilder.js";
5
- export { default as Resolver } from "./Resolver.js";
5
+ export { default as LambderResolver } from "./LambderResolver.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lambder",
3
- "version": "1.0.63",
3
+ "version": "1.0.65",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/src/Lambder.ts CHANGED
@@ -3,7 +3,7 @@ import cookieParser from "cookie";
3
3
  import { match } from "path-to-regexp";
4
4
 
5
5
  import type { APIGatewayProxyEvent, APIGatewayProxyEventHeaders, Context } from "aws-lambda";
6
- import Resolver from "./Resolver.js";
6
+ import LambderResolver from "./LambderResolver.js";
7
7
  import LambderResponseBuilder, { LambderResolverResponse } from "./LambderResponseBuilder.js";
8
8
 
9
9
  type Path = `/${string}`;
@@ -33,17 +33,17 @@ type RenderContext = {
33
33
  };
34
34
 
35
35
  type ConditionFunction = (ctx: RenderContext) => boolean;
36
- type ActionFunction = (ctx: RenderContext, resolver: Resolver) => LambderResolverResponse|Promise<LambderResolverResponse>;
36
+ type ActionFunction = (ctx: RenderContext, resolver: LambderResolver) => LambderResolverResponse|Promise<LambderResolverResponse>;
37
37
  type ActionObject = { conditionFn: ConditionFunction, actionFn: ActionFunction };
38
38
 
39
39
  type HookCreatedFunction = (lambderInstance: Lambder) => Promise<void>;
40
- type HookBeforeRenderFunction = (ctx: RenderContext, resolver: Resolver) => RenderContext|Error|Promise<RenderContext|Error>;
41
- type HookAfterRenderFunction = (ctx: RenderContext, resolver: Resolver, response: LambderResolverResponse) => LambderResolverResponse|Error|Promise<LambderResolverResponse|Error>;
42
- type HookFallbackFunction = (ctx: RenderContext, resolver: Resolver) => void|Promise<void>;
40
+ type HookBeforeRenderFunction = (ctx: RenderContext, resolver: LambderResolver) => RenderContext|Error|Promise<RenderContext|Error>;
41
+ type HookAfterRenderFunction = (ctx: RenderContext, resolver: LambderResolver, response: LambderResolverResponse) => LambderResolverResponse|Error|Promise<LambderResolverResponse|Error>;
42
+ type HookFallbackFunction = (ctx: RenderContext, resolver: LambderResolver) => void|Promise<void>;
43
43
 
44
44
  type GlobalErrorHandlerFunction = (err: Error, ctx: RenderContext|null, response: LambderResponseBuilder) => LambderResolverResponse|Promise<LambderResolverResponse>;
45
- type RouteFallbackHandlerFunction = (ctx:RenderContext, resolver: Resolver) => LambderResolverResponse;
46
- type ApiFallbackHandlerFunction = (ctx:RenderContext, resolver: Resolver) => LambderResolverResponse;
45
+ type RouteFallbackHandlerFunction = (ctx:RenderContext, resolver: LambderResolver) => LambderResolverResponse;
46
+ type ApiFallbackHandlerFunction = (ctx:RenderContext, resolver: LambderResolver) => LambderResolverResponse;
47
47
 
48
48
  type HookEventType = "created"|"beforeRender"|"afterRender"|"fallback";
49
49
 
@@ -123,16 +123,23 @@ export default class Lambder {
123
123
  return (match(pattern, { decode: decodeURIComponent }))(path) !== false;
124
124
  }
125
125
 
126
- private async validateSession (session: Session|null): Promise<boolean>{
126
+ private async validateSession (ctx: RenderContext): Promise<boolean>{
127
+ const { session, apiName, post, cookie } = ctx;
127
128
  if(!session) return false;
128
129
  if(!session.userId || !session.userIdHash || !session.sessionHash || !session.csrfToken) return false;
129
130
  if(!session.createdTimeStamp || !session.expiresTimeStamp) return false;
130
131
  if(session.expiresTimeStamp > Date.now()) return false;
132
+
133
+ if(apiName){
134
+ if(!post.token) return false;
135
+ if(post.token !== cookie.LMBDRTOKEN) return false;
136
+ if(post.token !== session.csrfToken) return false;
137
+ }
131
138
  // Check DDB;
132
139
  return false;
133
140
  };
134
141
 
135
- private async handleNoMatchedAction(ctx: RenderContext, resolver: Resolver){
142
+ private async handleNoMatchedAction(ctx: RenderContext, resolver: LambderResolver){
136
143
  for(const hook of this.hookList["fallback"]){ await hook.hookFn(ctx, resolver); }
137
144
 
138
145
  const isAPI = ctx.path === this.apiPath;
@@ -160,7 +167,7 @@ export default class Lambder {
160
167
  (condition?.constructor == RegExp && condition.test(ctx.path))
161
168
  )
162
169
  ),
163
- actionFn: async (ctx:RenderContext, resolver: Resolver) => {
170
+ actionFn: async (ctx:RenderContext, resolver: LambderResolver) => {
164
171
  if(typeof condition === "string"){
165
172
  ctx.pathParams = this.getPatternMatch(condition, ctx.path);
166
173
  }else if(condition?.constructor == RegExp){
@@ -182,8 +189,8 @@ export default class Lambder {
182
189
  (condition?.constructor == RegExp && condition.test(ctx.path))
183
190
  )
184
191
  ),
185
- actionFn: async (ctx:RenderContext, resolver: Resolver) => {
186
- const isSessionValid = this.validateSession(ctx.session);
192
+ actionFn: async (ctx:RenderContext, resolver: LambderResolver) => {
193
+ const isSessionValid = this.validateSession(ctx);
187
194
  if(!isSessionValid) throw new Error("Session not found");
188
195
  if(typeof condition === "string"){
189
196
  ctx.pathParams = this.getPatternMatch(condition, ctx.path);
@@ -202,7 +209,7 @@ export default class Lambder {
202
209
  (typeof apiName === "function" && apiName(ctx)) ||
203
210
  (apiName?.constructor == RegExp && apiName.test(ctx.apiName))
204
211
  ),
205
- actionFn: async (ctx:RenderContext, resolver: Resolver) => await actionFn(ctx, resolver),
212
+ actionFn: async (ctx:RenderContext, resolver: LambderResolver) => await actionFn(ctx, resolver),
206
213
  });
207
214
  };
208
215
 
@@ -213,8 +220,8 @@ export default class Lambder {
213
220
  (typeof apiName === "function" && apiName(ctx)) ||
214
221
  (apiName?.constructor == RegExp && apiName.test(ctx.apiName))
215
222
  ),
216
- actionFn: async (ctx:RenderContext, resolver: Resolver) => {
217
- const isSessionValid = this.validateSession(ctx.session);
223
+ actionFn: async (ctx:RenderContext, resolver: LambderResolver) => {
224
+ const isSessionValid = this.validateSession(ctx);
218
225
  if(!isSessionValid) throw new Error("Session not found");
219
226
  return await actionFn(ctx, resolver);
220
227
  }
@@ -247,7 +254,7 @@ export default class Lambder {
247
254
  };
248
255
 
249
256
  private getResolver(resolve: (response: LambderResolverResponse) => void, reject: (err: Error) => void){
250
- return new Resolver({
257
+ return new LambderResolver({
251
258
  isCorsEnabled: this.isCorsEnabled,
252
259
  publicPath: this.publicPath,
253
260
  apiVersion: this.apiVersion,
@@ -81,7 +81,8 @@ export default class LambderCaller {
81
81
 
82
82
  };
83
83
 
84
- async apiRaw<T>(apiName: string, payload?: any, headers?: Record<string, any>, options?: {
84
+ async apiRaw<T>(apiName: string, payload?: any, options?: {
85
+ headers?: Record<string, any>
85
86
  versionExpiredHandler?: VoidFunction,
86
87
  sessionExpiredHandler?: VoidFunction,
87
88
  messageHandler?: MessageHandler,
@@ -91,6 +92,7 @@ export default class LambderCaller {
91
92
  fetchStartedHandler?: FetchStartEventHandler,
92
93
  fetchEndedHandler?: FetchEndEventHandler,
93
94
  }): Promise<LambderApiResponse<T>|null>{
95
+ const headers = options?.headers;
94
96
  const fetchTracker: FetchTracker = { apiName, done: false, fetchEndCalled: false };
95
97
  try {
96
98
  this.fetchTrackerList.push(fetchTracker);
@@ -99,7 +101,7 @@ export default class LambderCaller {
99
101
  activeFetchList: this.fetchTrackerList.filter(v=>!v.done)
100
102
  });
101
103
  const version = this.apiVersion;
102
- const token = Cookies.get("LMBRTOKEN") || "";
104
+ const token = Cookies.get("LMBDRTOKEN") || "";
103
105
  const siteHost = window.location.hostname;
104
106
  let data = await fetch(this.apiPath, {
105
107
  method: 'POST', mode: 'same-origin', cache: 'no-cache',
@@ -128,8 +130,8 @@ export default class LambderCaller {
128
130
  return null;
129
131
  }
130
132
  if(data && data.sessionExpired){
131
- Cookies.set('LMBRAUTHID', '', { expires: -1 });
132
- Cookies.set('LMBRTOKEN', '', { expires: -1 });
133
+ Cookies.set('LMBDRAUTHID', '', { expires: -1 });
134
+ Cookies.set('LMBDRTOKEN', '', { expires: -1 });
133
135
  if(this.sessionExpiredHandler){
134
136
  await this.sessionExpiredHandler();
135
137
  }else if(this.errorHandler){
@@ -15,7 +15,7 @@ interface DieResolverMethods {
15
15
  api: MethodType<LambderResponseBuilder, 'api'>;
16
16
  }
17
17
 
18
- export default class Resolver extends LambderResponseBuilder {
18
+ export default class LambderResolver extends LambderResponseBuilder {
19
19
  public resolve: (response: LambderResolverResponse) => void;
20
20
  public reject: (err: Error) => void;
21
21
  public die: DieResolverMethods;
package/src/index.ts CHANGED
@@ -3,4 +3,4 @@ import Lambder from './Lambder.js';
3
3
  export default Lambder;
4
4
  export { default as LambderCaller } from "./LambderCaller.js";
5
5
  export { default as LambderResponseBuilder } from "./LambderResponseBuilder.js";
6
- export { default as Resolver } from "./Resolver.js";
6
+ export { default as LambderResolver } from "./LambderResolver.js";