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.
- package/.vscode/settings.json +3 -1
- package/dist/Lambder.d.ts +7 -7
- package/dist/Lambder.js +14 -5
- package/dist/LambderCaller.d.ts +2 -1
- package/dist/LambderCaller.js +5 -4
- package/dist/{Resolver.d.ts → LambderResolver.d.ts} +1 -1
- package/dist/{Resolver.js → LambderResolver.js} +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/src/Lambder.ts +23 -16
- package/src/LambderCaller.ts +6 -4
- package/src/{Resolver.ts → LambderResolver.ts} +1 -1
- package/src/index.ts +1 -1
package/.vscode/settings.json
CHANGED
package/dist/Lambder.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { APIGatewayProxyEvent, APIGatewayProxyEventHeaders, Context } from "aws-lambda";
|
|
2
|
-
import
|
|
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:
|
|
28
|
+
type ActionFunction = (ctx: RenderContext, resolver: LambderResolver) => LambderResolverResponse | Promise<LambderResolverResponse>;
|
|
29
29
|
type HookCreatedFunction = (lambderInstance: Lambder) => Promise<void>;
|
|
30
|
-
type HookBeforeRenderFunction = (ctx: RenderContext, resolver:
|
|
31
|
-
type HookAfterRenderFunction = (ctx: RenderContext, resolver:
|
|
32
|
-
type HookFallbackFunction = (ctx: RenderContext, resolver:
|
|
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:
|
|
35
|
-
type ApiFallbackHandlerFunction = (ctx: RenderContext, resolver:
|
|
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
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
195
|
+
return new LambderResolver({
|
|
187
196
|
isCorsEnabled: this.isCorsEnabled,
|
|
188
197
|
publicPath: this.publicPath,
|
|
189
198
|
apiVersion: this.apiVersion,
|
package/dist/LambderCaller.d.ts
CHANGED
|
@@ -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,
|
|
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;
|
package/dist/LambderCaller.js
CHANGED
|
@@ -27,7 +27,8 @@ export default class LambderCaller {
|
|
|
27
27
|
this.fetchEndedHandler = fetchEndedHandler;
|
|
28
28
|
}
|
|
29
29
|
;
|
|
30
|
-
async apiRaw(apiName, payload,
|
|
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("
|
|
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('
|
|
72
|
-
Cookies.set('
|
|
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
|
|
15
|
+
export default class LambderResolver extends LambderResponseBuilder {
|
|
16
16
|
resolve: (response: LambderResolverResponse) => void;
|
|
17
17
|
reject: (err: Error) => void;
|
|
18
18
|
die: DieResolverMethods;
|
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
|
|
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
|
|
5
|
+
export { default as LambderResolver } from "./LambderResolver.js";
|
package/package.json
CHANGED
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
|
|
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:
|
|
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:
|
|
41
|
-
type HookAfterRenderFunction = (ctx: RenderContext, resolver:
|
|
42
|
-
type HookFallbackFunction = (ctx: RenderContext, resolver:
|
|
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:
|
|
46
|
-
type ApiFallbackHandlerFunction = (ctx:RenderContext, resolver:
|
|
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 (
|
|
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:
|
|
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:
|
|
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:
|
|
186
|
-
const isSessionValid = this.validateSession(ctx
|
|
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:
|
|
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:
|
|
217
|
-
const isSessionValid = this.validateSession(ctx
|
|
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
|
|
257
|
+
return new LambderResolver({
|
|
251
258
|
isCorsEnabled: this.isCorsEnabled,
|
|
252
259
|
publicPath: this.publicPath,
|
|
253
260
|
apiVersion: this.apiVersion,
|
package/src/LambderCaller.ts
CHANGED
|
@@ -81,7 +81,8 @@ export default class LambderCaller {
|
|
|
81
81
|
|
|
82
82
|
};
|
|
83
83
|
|
|
84
|
-
async apiRaw<T>(apiName: string, payload?: any,
|
|
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("
|
|
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('
|
|
132
|
-
Cookies.set('
|
|
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
|
|
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
|
|
6
|
+
export { default as LambderResolver } from "./LambderResolver.js";
|