@fintalk.ai/lambda-handlers 1.0.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.
- package/README.md +152 -0
- package/package.json +67 -0
package/README.md
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# `@fintalk-ai/lambda-handlers`
|
|
2
|
+
|
|
3
|
+
Lib para fazer wrapper de lambdas
|
|
4
|
+
|
|
5
|
+
## Lambda trigada pela API Gateway como proxy (mĂșltiplas rotas numa lambda)
|
|
6
|
+
|
|
7
|
+
```javascript
|
|
8
|
+
import { LambdaApiProxyHandler, Controller } from '@fintalk-ai/lambda-handlers'
|
|
9
|
+
import { APIGatewayProxyHandler } from 'aws-lambda'
|
|
10
|
+
import authentication from './authentication'
|
|
11
|
+
import foo from './controllers/foo'
|
|
12
|
+
|
|
13
|
+
const api = new LambdaApiProxyHandler({
|
|
14
|
+
base: process.env.ADMIN_API_BASE_PATH,
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
const foo: Controller = (req) => {
|
|
18
|
+
return Promise.resolve({
|
|
19
|
+
body: {
|
|
20
|
+
message: 'Hello World'
|
|
21
|
+
},
|
|
22
|
+
})
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export const handler: APIGatewayProxyHandler = async (
|
|
26
|
+
event,
|
|
27
|
+
context,
|
|
28
|
+
) => {
|
|
29
|
+
api.addRoute({
|
|
30
|
+
method: 'GET',
|
|
31
|
+
path: '/',
|
|
32
|
+
run: foo,
|
|
33
|
+
auth: authentication(['admin']),
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
return api.handler(event, context)
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Lambda trigada pela API Gateway como proxy (uma rota por lambda)
|
|
41
|
+
```javascript
|
|
42
|
+
import { Controller, LambdaApiHandler } from '@fintalk-ai/lambda-handlers'
|
|
43
|
+
import { APIGatewayProxyHandler } from 'aws-lambda'
|
|
44
|
+
|
|
45
|
+
const getUserController: Controller = async (request) => {
|
|
46
|
+
const user = await getUser(request.params.id)
|
|
47
|
+
|
|
48
|
+
return {
|
|
49
|
+
body: user,
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const apiHandler = new LambdaApiHandler(getUserController)
|
|
54
|
+
|
|
55
|
+
export const handler: APIGatewayProxyHandler = async (
|
|
56
|
+
event,
|
|
57
|
+
context,
|
|
58
|
+
) => {
|
|
59
|
+
return apiHandler.handler(event, context)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
## Lambda trigada por SQS
|
|
66
|
+
|
|
67
|
+
```javascript
|
|
68
|
+
import { LambdaSqsHandler, Worker } from '@fintalk-ai/lambda-handlers'
|
|
69
|
+
import { SQSHandler } from 'aws-lambda'
|
|
70
|
+
|
|
71
|
+
interface CreateUserMessage {
|
|
72
|
+
user_id: string
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const workerCreateUser: Worker<CreateUserMessage> = async (messages) => {
|
|
76
|
+
for (const { body } of messages) {
|
|
77
|
+
const user = await getUser(body.user_id)
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const sqsHandler = new LambdaSqsHandler(workerCreateUser)
|
|
82
|
+
|
|
83
|
+
export const handler: SQSHandler = async (event) => {
|
|
84
|
+
return sqsHandler.handler(event)
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Lambda trigada por SQS (Worker com processamento em paralelo)
|
|
90
|
+
|
|
91
|
+
```javascript
|
|
92
|
+
import { LambdaSqsHandlerV2, WorkerV2 } from '@fintalk-ai/lambda-handlers'
|
|
93
|
+
import { SQSHandler } from 'aws-lambda'
|
|
94
|
+
|
|
95
|
+
interface CreateUserMessage {
|
|
96
|
+
user_id: string
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const workerCreateUser: WorkerV2<CreateUserMessage> = async (message, logger) => {
|
|
100
|
+
logger.debug('Start create user')
|
|
101
|
+
const user = await getUser(body.user_id)
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const sqsHandler = new LambdaSqsHandler({
|
|
105
|
+
worker: workerCreateUser,
|
|
106
|
+
parallel: false,
|
|
107
|
+
service: 'msghandler',
|
|
108
|
+
})
|
|
109
|
+
|
|
110
|
+
export const handler: SQSHandler = async (event) => {
|
|
111
|
+
return sqsHandler.handler(event)
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
A LambdaSqsHandlerV2 precisa ter o Report Batch Item Failures habilitado. Abaixo exemplo com terraform:
|
|
116
|
+
|
|
117
|
+
```terraform
|
|
118
|
+
resource "aws_lambda_event_source_mapping" "event_handler" {
|
|
119
|
+
event_source_arn = module.sqs_event_handler.sqs_arn
|
|
120
|
+
function_name = module.event_handler.arn
|
|
121
|
+
batch_size = 1
|
|
122
|
+
function_response_types = ["ReportBatchItemFailures"]
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## Lambda trigada pelo sdk
|
|
127
|
+
|
|
128
|
+
```javascript
|
|
129
|
+
import { LambdaInvokeHandler, InvokeHandler } from '@fintalk-ai/lambda-handlers'
|
|
130
|
+
import { Handler } from 'aws-lambda'
|
|
131
|
+
|
|
132
|
+
interface CreateUserRequest {
|
|
133
|
+
user_id: string
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
interface CreateUserResponse {
|
|
137
|
+
message: string
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
const createUserInvoke: InvokeHandler<CreateUserRequest, CreateUserResponse> = async (event) => {
|
|
141
|
+
return {
|
|
142
|
+
message: event.user_id
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
const invokeHandler = new LambdaInvokeHandler(createUserInvoke)
|
|
147
|
+
|
|
148
|
+
export const handler: Handler<CreateUserRequest, CreateUserResponse> = async (event) => {
|
|
149
|
+
return invokeHandler.handler(event)
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
```
|
package/package.json
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@fintalk.ai/lambda-handlers",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "> TODO: description",
|
|
5
|
+
"author": "Fintalk.AI",
|
|
6
|
+
"homepage": "https://github.com/fintalk-ai/lambda-handlers#readme",
|
|
7
|
+
"license": "MIT",
|
|
8
|
+
"main": "lib/index.js",
|
|
9
|
+
"directories": {
|
|
10
|
+
"lib": "lib"
|
|
11
|
+
},
|
|
12
|
+
"files": [
|
|
13
|
+
"lib"
|
|
14
|
+
],
|
|
15
|
+
"repository": {
|
|
16
|
+
"type": "git",
|
|
17
|
+
"url": "git+https://github.com/fintalk-ai/lambda-handlers#readme"
|
|
18
|
+
},
|
|
19
|
+
"publishConfig": {
|
|
20
|
+
"access": "public"
|
|
21
|
+
},
|
|
22
|
+
"scripts": {
|
|
23
|
+
"clean": "rimraf lib",
|
|
24
|
+
"tsc": "tsc -p tsconfig.build.json",
|
|
25
|
+
"lint": "eslint --cache --ext .ts src/",
|
|
26
|
+
"test": "LOGGER_LEVEL=silent jest",
|
|
27
|
+
"test:coverage": "LOGGER_LEVEL=silent jest --coverage",
|
|
28
|
+
"build": "run-s clean tsc"
|
|
29
|
+
},
|
|
30
|
+
"bugs": {
|
|
31
|
+
"url": "https://github.com/fintalk-ai/lambda-handlers/issues"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@babel/preset-typescript": "^7.16.7",
|
|
35
|
+
"@stone-ton/eslint-config-ton": "^0.1.1",
|
|
36
|
+
"@types/aws-lambda": "^8.10.92",
|
|
37
|
+
"@types/jest": "^27.4.0",
|
|
38
|
+
"@types/node": "^17.0.13",
|
|
39
|
+
"@types/qs": "^6.9.7",
|
|
40
|
+
"@typescript-eslint/eslint-plugin": "^5.10.1",
|
|
41
|
+
"@typescript-eslint/parser": "^5.10.1",
|
|
42
|
+
"esbuild": "^0.14.21",
|
|
43
|
+
"esbuild-jest": "^0.5.0",
|
|
44
|
+
"eslint": "^8.14.0",
|
|
45
|
+
"eslint-config-standard": "^17.0.0",
|
|
46
|
+
"eslint-plugin-import": "^2.26.0",
|
|
47
|
+
"eslint-plugin-n": "^15.2.0",
|
|
48
|
+
"eslint-plugin-promise": "^6.0.0",
|
|
49
|
+
"fintalk-logger": "~1.1.3",
|
|
50
|
+
"jest": "^28.1.3",
|
|
51
|
+
"jest-mock": "^28.1.0",
|
|
52
|
+
"jest-mock-extended": "^2.0.6",
|
|
53
|
+
"node-match-path": "^0.6.3",
|
|
54
|
+
"qs": "^6.10.3",
|
|
55
|
+
"rimraf": "^3.0.2"
|
|
56
|
+
},
|
|
57
|
+
"peerDependencies": {
|
|
58
|
+
"@types/aws-lambda": ">=8.10.92",
|
|
59
|
+
"@types/qs": ">=6.9.7",
|
|
60
|
+
"fintalk-logger": "~1.1.3",
|
|
61
|
+
"node-match-path": ">=0.6.3",
|
|
62
|
+
"qs": ">=6.10.3"
|
|
63
|
+
},
|
|
64
|
+
"dependencies": {
|
|
65
|
+
"typescript": "^5.1.3"
|
|
66
|
+
}
|
|
67
|
+
}
|