@rempays/shared-core 1.0.2-beta.1 → 1.0.2-beta.11
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 +133 -267
- package/dist/auth/authorizer-example.js +7 -3
- package/dist/auth/index.js +5 -1
- package/dist/auth/jwt-validator.js +7 -3
- package/dist/auth/types.js +2 -1
- package/dist/cognito/cognito.service.js +21 -17
- package/dist/cognito/index.js +20 -2
- package/dist/cognito/types.js +2 -1
- package/dist/dynamodb/dynamodb.client.d.ts +56 -6
- package/dist/dynamodb/dynamodb.client.js +191 -34
- package/dist/dynamodb/index.d.ts +1 -0
- package/dist/dynamodb/index.js +18 -1
- package/dist/dynamodb/modules/chat/chat.service.d.ts +59 -0
- package/dist/dynamodb/modules/chat/chat.service.js +294 -0
- package/dist/dynamodb/modules/chat/index.d.ts +2 -0
- package/dist/dynamodb/modules/chat/index.js +18 -0
- package/dist/dynamodb/modules/chat/types.d.ts +27 -0
- package/dist/dynamodb/modules/chat/types.js +2 -0
- package/dist/dynamodb/modules/index.d.ts +2 -0
- package/dist/dynamodb/modules/index.js +18 -0
- package/dist/dynamodb/modules/shared-types.d.ts +10 -0
- package/dist/dynamodb/modules/shared-types.js +2 -0
- package/dist/dynamodb/modules/system-prompt/index.d.ts +2 -0
- package/dist/dynamodb/modules/system-prompt/index.js +18 -0
- package/dist/dynamodb/modules/system-prompt/system-prompt.service.d.ts +51 -0
- package/dist/dynamodb/modules/system-prompt/system-prompt.service.js +262 -0
- package/dist/dynamodb/modules/system-prompt/types.d.ts +13 -0
- package/dist/dynamodb/modules/system-prompt/types.js +2 -0
- package/dist/facebook-api/embedded-signup.d.ts +56 -0
- package/dist/facebook-api/embedded-signup.js +203 -0
- package/dist/facebook-api/facebook.d.ts +1 -67
- package/dist/facebook-api/facebook.js +7 -3
- package/dist/facebook-api/http.js +9 -3
- package/dist/facebook-api/index.d.ts +7 -2
- package/dist/facebook-api/index.js +27 -1
- package/dist/facebook-api/types.d.ts +109 -0
- package/dist/facebook-api/types.js +2 -0
- package/dist/http/client.js +12 -4
- package/dist/http/index.js +6 -1
- package/dist/index.js +23 -7
- package/dist/s3/index.js +17 -1
- package/dist/s3/s3.service.js +9 -5
- package/dist/textract/index.js +17 -1
- package/dist/textract/textract.service.js +9 -5
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,346 +1,212 @@
|
|
|
1
1
|
# @rempays/shared-core
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Librería de utilidades core para la plataforma RemPays con integración de servicios AWS (Cognito, Auth, S3, Textract, Facebook API, HTTP Client, DynamoDB).
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Instalación
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
8
|
npm install @rempays/shared-core
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
-
##
|
|
11
|
+
## Módulos
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
Este paquete proporciona múltiples servicios organizados por funcionalidad. Cada módulo tiene su propia documentación detallada:
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
### Autenticación y Autorización
|
|
16
|
+
- **[Cognito](src/cognito/README.md)** - Autenticación y gestión de usuarios con AWS Cognito
|
|
17
|
+
- **[Auth/JWT Validator](src/auth/README.md)** - Validación de tokens JWT para Lambda Authorizers
|
|
16
18
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
+
### Almacenamiento y Datos
|
|
20
|
+
- **[DynamoDB - Chat Service](src/dynamodb/modules/chat/README.md)** - Gestión de chats y mensajes
|
|
21
|
+
- **[DynamoDB - System Prompt Service](src/dynamodb/modules/system-prompt/README.md)** - Prompts del sistema versionados
|
|
22
|
+
- **[S3](src/s3/README.md)** - Operaciones de almacenamiento de archivos
|
|
19
23
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
region: 'us-east-1'
|
|
24
|
-
});
|
|
24
|
+
### APIs Externas
|
|
25
|
+
- **[Facebook API (WhatsApp)](src/facebook-api/README.md)** - Integración con WhatsApp Business API
|
|
26
|
+
- **[HTTP Client](src/http/README.md)** - Cliente HTTP genérico con soporte de autenticación
|
|
25
27
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
phoneNumber: '+1234567890',
|
|
29
|
-
email: 'user@example.com',
|
|
30
|
-
password: 'SecurePass123'
|
|
31
|
-
});
|
|
28
|
+
### Procesamiento de Documentos
|
|
29
|
+
- **[Textract](src/textract/README.md)** - Extracción de texto de documentos
|
|
32
30
|
|
|
33
|
-
|
|
34
|
-
await cognito.confirmSignUp('+1234567890', '123456');
|
|
31
|
+
## Inicio Rápido
|
|
35
32
|
|
|
36
|
-
|
|
37
|
-
const authResponse = await cognito.signInCustomAuth({
|
|
38
|
-
phoneNumber: '+1234567890'
|
|
39
|
-
});
|
|
33
|
+
### Autenticación
|
|
40
34
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
code: '123456',
|
|
45
|
-
session: authResponse.session
|
|
46
|
-
});
|
|
35
|
+
```typescript
|
|
36
|
+
import { CognitoService } from '@rempays/shared-core/cognito';
|
|
37
|
+
import { JwtValidator } from '@rempays/shared-core/auth';
|
|
47
38
|
|
|
48
|
-
//
|
|
49
|
-
const
|
|
39
|
+
// Registro y login de usuarios
|
|
40
|
+
const cognito = new CognitoService({
|
|
41
|
+
userPoolId: process.env.COGNITO_USER_POOL_ID!,
|
|
42
|
+
clientId: process.env.COGNITO_CLIENT_ID!,
|
|
43
|
+
region: 'us-east-1',
|
|
44
|
+
});
|
|
50
45
|
|
|
51
|
-
//
|
|
52
|
-
const
|
|
53
|
-
|
|
46
|
+
// Validación de JWT para authorizers
|
|
47
|
+
const validator = new JwtValidator({
|
|
48
|
+
region: 'us-east-1',
|
|
49
|
+
userPoolId: process.env.USER_POOL_ID!,
|
|
54
50
|
});
|
|
55
51
|
```
|
|
56
52
|
|
|
57
|
-
###
|
|
58
|
-
|
|
59
|
-
Validate Cognito JWT tokens for Lambda Authorizers.
|
|
53
|
+
### Servicios de DynamoDB
|
|
60
54
|
|
|
61
55
|
```typescript
|
|
62
|
-
import {
|
|
56
|
+
import { ChatService, SystemPromptService } from '@rempays/shared-core/dynamodb';
|
|
63
57
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
58
|
+
// Gestión de chats
|
|
59
|
+
const chatService = new ChatService();
|
|
60
|
+
await chatService.createChat({...});
|
|
61
|
+
await chatService.getLastMessages('chat-123', 10);
|
|
68
62
|
|
|
69
|
-
//
|
|
70
|
-
const
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
// Or validate token directly
|
|
74
|
-
const token = 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...';
|
|
75
|
-
const decoded = await validator.validate(token);
|
|
76
|
-
|
|
77
|
-
// Use in Lambda Authorizer
|
|
78
|
-
export const handler = async (event: any) => {
|
|
79
|
-
try {
|
|
80
|
-
const decoded = await validator.validateFromHeader(event.headers.Authorization);
|
|
81
|
-
return generateAllowPolicy(decoded.sub, event.methodArn, decoded);
|
|
82
|
-
} catch (error) {
|
|
83
|
-
return generateDenyPolicy('user', event.methodArn);
|
|
84
|
-
}
|
|
85
|
-
};
|
|
63
|
+
// Prompts del sistema
|
|
64
|
+
const promptService = new SystemPromptService();
|
|
65
|
+
const prompt = await promptService.getLatestActivePrompt('welcome');
|
|
86
66
|
```
|
|
87
67
|
|
|
88
|
-
###
|
|
89
|
-
|
|
90
|
-
Generic HTTP client built on axios with authentication support.
|
|
68
|
+
### Mensajería WhatsApp
|
|
91
69
|
|
|
92
70
|
```typescript
|
|
93
|
-
import {
|
|
94
|
-
|
|
95
|
-
// Create basic client
|
|
96
|
-
const client = createHttpClient();
|
|
71
|
+
import { FacebookApi } from '@rempays/shared-core/facebook-api';
|
|
97
72
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
baseURL: 'https://api.example.com',
|
|
102
|
-
timeout: 5000
|
|
73
|
+
await FacebookApi.sendText({
|
|
74
|
+
to: '+1234567890',
|
|
75
|
+
body: '¡Hola desde WhatsApp!',
|
|
103
76
|
});
|
|
104
77
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
authClient.removeAuthToken();
|
|
114
|
-
|
|
115
|
-
// Access underlying axios instance
|
|
116
|
-
const axiosInstance = client.getInstance();
|
|
78
|
+
await FacebookApi.sendInteractiveButtons({
|
|
79
|
+
to: '+1234567890',
|
|
80
|
+
body: 'Elige una opción:',
|
|
81
|
+
buttons: [
|
|
82
|
+
{ type: 'reply', id: 'opt1', title: 'Opción 1' },
|
|
83
|
+
{ type: 'reply', id: 'opt2', title: 'Opción 2' },
|
|
84
|
+
],
|
|
85
|
+
});
|
|
117
86
|
```
|
|
118
87
|
|
|
119
|
-
###
|
|
120
|
-
|
|
121
|
-
File operations with AWS S3.
|
|
88
|
+
### Almacenamiento y Procesamiento de Archivos
|
|
122
89
|
|
|
123
90
|
```typescript
|
|
124
91
|
import { S3Service } from '@rempays/shared-core/s3';
|
|
92
|
+
import { TextractService } from '@rempays/shared-core/textract';
|
|
125
93
|
|
|
126
|
-
//
|
|
94
|
+
// Subir archivo
|
|
127
95
|
const s3Uri = await S3Service.uploadFile({
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
metadata: { userId: '123' }
|
|
96
|
+
key: 'documents/file.pdf',
|
|
97
|
+
body: buffer,
|
|
98
|
+
contentType: 'application/pdf',
|
|
132
99
|
});
|
|
133
100
|
|
|
134
|
-
//
|
|
135
|
-
const
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
chatId: 'chat123',
|
|
140
|
-
messageId: 'msg456',
|
|
141
|
-
extension: 'pdf'
|
|
142
|
-
});
|
|
101
|
+
// Extraer texto
|
|
102
|
+
const text = await TextractService.analyzeDocumentFromS3(
|
|
103
|
+
'my-bucket',
|
|
104
|
+
'documents/file.pdf'
|
|
105
|
+
);
|
|
143
106
|
```
|
|
144
107
|
|
|
145
|
-
###
|
|
146
|
-
|
|
147
|
-
Extract text from documents using AWS Textract.
|
|
108
|
+
### Cliente HTTP
|
|
148
109
|
|
|
149
110
|
```typescript
|
|
150
|
-
import {
|
|
111
|
+
import { createHttpClient } from '@rempays/shared-core/http';
|
|
151
112
|
|
|
152
|
-
|
|
153
|
-
|
|
113
|
+
const client = createHttpClient({
|
|
114
|
+
baseURL: 'https://api.example.com',
|
|
115
|
+
token: 'bearer-token',
|
|
116
|
+
});
|
|
154
117
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
const extractedText = await TextractService.analyzeDocumentFromBytes(imageBytes);
|
|
118
|
+
const data = await client.get('/users');
|
|
119
|
+
await client.post('/users', { name: 'John' });
|
|
158
120
|
```
|
|
159
121
|
|
|
160
|
-
|
|
122
|
+
## Variables de Entorno
|
|
161
123
|
|
|
162
|
-
|
|
124
|
+
### Requeridas
|
|
163
125
|
|
|
164
|
-
```
|
|
165
|
-
|
|
126
|
+
```bash
|
|
127
|
+
# AWS
|
|
128
|
+
AWS_REGION=us-east-1
|
|
166
129
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
body: 'Hello from RemPays!',
|
|
171
|
-
previewUrl: true
|
|
172
|
-
});
|
|
130
|
+
# Cognito
|
|
131
|
+
COGNITO_USER_POOL_ID=us-east-1_XXXXXXXXX
|
|
132
|
+
COGNITO_CLIENT_ID=XXXXXXXXXXXXXXXXXXXXXXXXXX
|
|
173
133
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
name: 'welcome_template',
|
|
178
|
-
languageCode: 'en',
|
|
179
|
-
components: []
|
|
180
|
-
});
|
|
134
|
+
# DynamoDB
|
|
135
|
+
DYNAMODB_CHAT_TABLE=rempays-chats
|
|
136
|
+
DYNAMODB_SYSTEM_PROMPT_TABLE=rempays-system-prompts
|
|
181
137
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
buttons: [
|
|
187
|
-
{ type: 'reply', id: 'opt1', title: 'Option 1' },
|
|
188
|
-
{ type: 'reply', id: 'opt2', title: 'Option 2' }
|
|
189
|
-
]
|
|
190
|
-
});
|
|
138
|
+
# Facebook API (WhatsApp)
|
|
139
|
+
FACEBOOK_API_TOKEN=your_facebook_token
|
|
140
|
+
FACEBOOK_PHONE_NUMBER_ID=your_phone_number_id
|
|
141
|
+
FACEBOOK_API_VERSION=v18.0 # Opcional
|
|
191
142
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
body: 'Select from menu:',
|
|
196
|
-
buttonText: 'View Menu',
|
|
197
|
-
sections: [
|
|
198
|
-
{
|
|
199
|
-
title: 'Main Options',
|
|
200
|
-
rows: [
|
|
201
|
-
{ id: '1', title: 'Option 1', description: 'Description 1' },
|
|
202
|
-
{ id: '2', title: 'Option 2', description: 'Description 2' }
|
|
203
|
-
]
|
|
204
|
-
}
|
|
205
|
-
]
|
|
206
|
-
});
|
|
143
|
+
# S3
|
|
144
|
+
S3_BUCKET_NAME=your-bucket-name
|
|
145
|
+
```
|
|
207
146
|
|
|
208
|
-
|
|
209
|
-
await FacebookApi.sendImage({
|
|
210
|
-
to: '+1234567890',
|
|
211
|
-
link: 'https://example.com/image.jpg',
|
|
212
|
-
caption: 'Check this out!'
|
|
213
|
-
});
|
|
147
|
+
## Documentación de Módulos
|
|
214
148
|
|
|
215
|
-
|
|
216
|
-
await FacebookApi.sendDocument({
|
|
217
|
-
to: '+1234567890',
|
|
218
|
-
link: 'https://example.com/document.pdf',
|
|
219
|
-
filename: 'invoice.pdf',
|
|
220
|
-
caption: 'Your invoice'
|
|
221
|
-
});
|
|
149
|
+
Para documentación detallada, ejemplos y referencia de API, consulta el README de cada módulo:
|
|
222
150
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
151
|
+
- [Cognito Service](src/cognito/README.md) - Flujos completos de autenticación
|
|
152
|
+
- [JWT Validator](src/auth/README.md) - Implementación de Lambda authorizer
|
|
153
|
+
- [Chat Service](src/dynamodb/modules/chat/README.md) - Gestión de chats y mensajes
|
|
154
|
+
- [System Prompt Service](src/dynamodb/modules/system-prompt/README.md) - Versionado de prompts
|
|
155
|
+
- [S3 Service](src/s3/README.md) - Subida/descarga de archivos
|
|
156
|
+
- [Textract Service](src/textract/README.md) - Extracción de texto de documentos
|
|
157
|
+
- [Facebook API](src/facebook-api/README.md) - Mensajería WhatsApp
|
|
158
|
+
- [HTTP Client](src/http/README.md) - Peticiones HTTP genéricas
|
|
226
159
|
|
|
227
|
-
##
|
|
160
|
+
## Permisos IAM
|
|
228
161
|
|
|
229
|
-
|
|
230
|
-
```bash
|
|
231
|
-
COGNITO_USER_POOL_ID=us-east-1_XXXXXXXXX
|
|
232
|
-
COGNITO_CLIENT_ID=XXXXXXXXXXXXXXXXXXXXXXXXXX
|
|
233
|
-
AWS_REGION=us-east-1
|
|
234
|
-
```
|
|
162
|
+
Cada servicio requiere permisos IAM específicos. Consulta la documentación de cada módulo para requisitos detallados de permisos.
|
|
235
163
|
|
|
236
|
-
###
|
|
237
|
-
```bash
|
|
238
|
-
FACEBOOK_API_TOKEN=your_facebook_token
|
|
239
|
-
FACEBOOK_PHONE_NUMBER_ID=your_phone_number_id
|
|
240
|
-
FACEBOOK_API_VERSION=v18.0 # Optional, defaults to v18.0
|
|
241
|
-
```
|
|
242
|
-
|
|
243
|
-
## Available Methods Summary
|
|
244
|
-
|
|
245
|
-
### CognitoService
|
|
246
|
-
- `signUp(params)` - Register new user
|
|
247
|
-
- `confirmSignUp(phoneNumber, code)` - Confirm registration with OTP
|
|
248
|
-
- `signInCustomAuth(params)` - Sign in with custom authentication
|
|
249
|
-
- `signInSRP(params)` - Sign in with SRP
|
|
250
|
-
- `respondToAuthChallenge(params)` - Verify OTP code
|
|
251
|
-
- `refreshToken(params)` - Refresh access tokens
|
|
252
|
-
- `getUser(accessToken)` - Get authenticated user info
|
|
253
|
-
- `adminGetUser(phoneNumber)` - Get user info (admin)
|
|
254
|
-
- `adminInitiateAuth(phoneNumber)` - Initiate auth as admin
|
|
255
|
-
|
|
256
|
-
### JwtValidator
|
|
257
|
-
- `validate(token)` - Validate JWT token
|
|
258
|
-
- `validateFromHeader(authHeader)` - Validate token from Authorization header
|
|
259
|
-
- `extractToken(authHeader)` - Extract token from Bearer header
|
|
260
|
-
|
|
261
|
-
### HttpClient
|
|
262
|
-
- `get<T>(url, config?)` - GET request
|
|
263
|
-
- `post<T>(url, data?, config?)` - POST request
|
|
264
|
-
- `put<T>(url, data?, config?)` - PUT request
|
|
265
|
-
- `patch<T>(url, data?, config?)` - PATCH request
|
|
266
|
-
- `delete<T>(url, config?)` - DELETE request
|
|
267
|
-
- `setAuthToken(token)` - Set Bearer token
|
|
268
|
-
- `removeAuthToken()` - Remove Bearer token
|
|
269
|
-
- `getInstance()` - Get axios instance
|
|
270
|
-
|
|
271
|
-
### S3Service
|
|
272
|
-
- `uploadFile(params)` - Upload file to S3
|
|
273
|
-
- `downloadFile(key)` - Download file from S3
|
|
274
|
-
- `generateDocumentKey(params)` - Generate unique document key
|
|
275
|
-
|
|
276
|
-
### TextractService
|
|
277
|
-
- `analyzeDocumentFromS3(bucket, key)` - Extract text from S3 document
|
|
278
|
-
- `analyzeDocumentFromBytes(bytes)` - Extract text from byte array
|
|
279
|
-
|
|
280
|
-
### FacebookApi
|
|
281
|
-
- `sendText(params)` - Send text message
|
|
282
|
-
- `sendTemplate(params)` - Send template message
|
|
283
|
-
- `sendInteractiveButtons(params)` - Send interactive buttons
|
|
284
|
-
- `sendInteractiveList(params)` - Send interactive list
|
|
285
|
-
- `sendImage(params)` - Send image
|
|
286
|
-
- `sendDocument(params)` - Send document
|
|
287
|
-
- `sendLocation(params)` - Send location
|
|
288
|
-
- `markAsRead(params)` - Mark message as read
|
|
289
|
-
- `setTyping(params)` - Set typing indicator
|
|
290
|
-
|
|
291
|
-
## IAM Permissions Required
|
|
292
|
-
|
|
293
|
-
Your Lambda or application needs these permissions:
|
|
164
|
+
### Resumen de Permisos Mínimos
|
|
294
165
|
|
|
295
166
|
```json
|
|
296
167
|
{
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
},
|
|
312
|
-
{
|
|
313
|
-
"Effect": "Allow",
|
|
314
|
-
"Action": [
|
|
315
|
-
"s3:GetObject",
|
|
316
|
-
"s3:PutObject"
|
|
317
|
-
],
|
|
318
|
-
"Resource": "arn:aws:s3:::YOUR_BUCKET/*"
|
|
319
|
-
},
|
|
320
|
-
{
|
|
321
|
-
"Effect": "Allow",
|
|
322
|
-
"Action": [
|
|
323
|
-
"textract:AnalyzeDocument"
|
|
324
|
-
],
|
|
325
|
-
"Resource": "*"
|
|
326
|
-
}
|
|
327
|
-
]
|
|
168
|
+
"Version": "2012-10-17",
|
|
169
|
+
"Statement": [
|
|
170
|
+
{
|
|
171
|
+
"Effect": "Allow",
|
|
172
|
+
"Action": [
|
|
173
|
+
"cognito-idp:*",
|
|
174
|
+
"dynamodb:*",
|
|
175
|
+
"s3:GetObject",
|
|
176
|
+
"s3:PutObject",
|
|
177
|
+
"textract:AnalyzeDocument"
|
|
178
|
+
],
|
|
179
|
+
"Resource": "*"
|
|
180
|
+
}
|
|
181
|
+
]
|
|
328
182
|
}
|
|
329
183
|
```
|
|
330
184
|
|
|
331
|
-
##
|
|
185
|
+
## Desarrollo
|
|
332
186
|
|
|
333
187
|
```bash
|
|
334
|
-
#
|
|
188
|
+
# Instalar dependencias
|
|
335
189
|
npm install
|
|
336
190
|
|
|
337
191
|
# Build
|
|
338
192
|
npm run build
|
|
339
193
|
|
|
340
|
-
#
|
|
194
|
+
# Modo watch
|
|
341
195
|
npm run dev
|
|
342
196
|
```
|
|
343
197
|
|
|
344
|
-
##
|
|
198
|
+
## Publicación
|
|
199
|
+
|
|
200
|
+
Este paquete usa versionado y publicación automatizados:
|
|
201
|
+
|
|
202
|
+
- **Releases beta**: Push a rama `develop` → publica tag `@beta`
|
|
203
|
+
- **Releases producción**: Push a rama `main` → publica tag `@latest`
|
|
204
|
+
|
|
205
|
+
Instalar versión beta:
|
|
206
|
+
```bash
|
|
207
|
+
npm install @rempays/shared-core@beta
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
## Licencia
|
|
345
211
|
|
|
346
212
|
UNLICENSED
|
|
@@ -1,18 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/**
|
|
2
3
|
* Ejemplo de uso del JwtValidator en un Lambda Authorizer
|
|
3
4
|
*
|
|
4
5
|
* Este archivo es solo de referencia, no se exporta en el paquete
|
|
5
6
|
*/
|
|
6
|
-
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.handler = void 0;
|
|
9
|
+
const jwt_validator_1 = require("./jwt-validator");
|
|
7
10
|
// Configuración del validador
|
|
8
|
-
const validator = new JwtValidator({
|
|
11
|
+
const validator = new jwt_validator_1.JwtValidator({
|
|
9
12
|
region: process.env.AWS_REGION || 'us-east-1',
|
|
10
13
|
userPoolId: process.env.USER_POOL_ID,
|
|
11
14
|
});
|
|
12
15
|
/**
|
|
13
16
|
* Lambda Authorizer Handler
|
|
14
17
|
*/
|
|
15
|
-
|
|
18
|
+
const handler = async (event) => {
|
|
16
19
|
try {
|
|
17
20
|
// Extraer y validar el token
|
|
18
21
|
const token = event.headers?.Authorization || event.headers?.authorization;
|
|
@@ -26,6 +29,7 @@ export const handler = async (event) => {
|
|
|
26
29
|
return generatePolicy('user', 'Deny', event.methodArn);
|
|
27
30
|
}
|
|
28
31
|
};
|
|
32
|
+
exports.handler = handler;
|
|
29
33
|
/**
|
|
30
34
|
* Genera una policy de IAM para API Gateway
|
|
31
35
|
*/
|
package/dist/auth/index.js
CHANGED
|
@@ -1 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.JwtValidator = void 0;
|
|
4
|
+
var jwt_validator_1 = require("./jwt-validator");
|
|
5
|
+
Object.defineProperty(exports, "JwtValidator", { enumerable: true, get: function () { return jwt_validator_1.JwtValidator; } });
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.JwtValidator = void 0;
|
|
4
|
+
const client_1 = require("../http/client");
|
|
5
|
+
class JwtValidator {
|
|
3
6
|
constructor(config) {
|
|
4
7
|
this.jwksCache = null;
|
|
5
8
|
this.config = config;
|
|
@@ -60,7 +63,7 @@ export class JwtValidator {
|
|
|
60
63
|
return this.jwksCache;
|
|
61
64
|
}
|
|
62
65
|
const jwksUrl = `${this.issuer}/.well-known/jwks.json`;
|
|
63
|
-
const httpClient = createHttpClient();
|
|
66
|
+
const httpClient = (0, client_1.createHttpClient)();
|
|
64
67
|
this.jwksCache = await httpClient.get(jwksUrl);
|
|
65
68
|
return this.jwksCache;
|
|
66
69
|
}
|
|
@@ -99,3 +102,4 @@ export class JwtValidator {
|
|
|
99
102
|
return this.validate(token);
|
|
100
103
|
}
|
|
101
104
|
}
|
|
105
|
+
exports.JwtValidator = JwtValidator;
|
package/dist/auth/types.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CognitoService = void 0;
|
|
4
|
+
const client_cognito_identity_provider_1 = require("@aws-sdk/client-cognito-identity-provider");
|
|
5
|
+
class CognitoService {
|
|
3
6
|
constructor(config) {
|
|
4
7
|
this.config = config;
|
|
5
|
-
this.client = new CognitoIdentityProviderClient({
|
|
8
|
+
this.client = new client_cognito_identity_provider_1.CognitoIdentityProviderClient({
|
|
6
9
|
region: config.region,
|
|
7
10
|
});
|
|
8
11
|
}
|
|
@@ -17,7 +20,7 @@ export class CognitoService {
|
|
|
17
20
|
if (email) {
|
|
18
21
|
userAttributes.push({ Name: 'email', Value: email });
|
|
19
22
|
}
|
|
20
|
-
const command = new SignUpCommand({
|
|
23
|
+
const command = new client_cognito_identity_provider_1.SignUpCommand({
|
|
21
24
|
ClientId: this.config.clientId,
|
|
22
25
|
Username: phoneNumber,
|
|
23
26
|
Password: password,
|
|
@@ -33,7 +36,7 @@ export class CognitoService {
|
|
|
33
36
|
* Confirma el registro de un usuario con el código OTP
|
|
34
37
|
*/
|
|
35
38
|
async confirmSignUp(phoneNumber, code) {
|
|
36
|
-
const command = new ConfirmSignUpCommand({
|
|
39
|
+
const command = new client_cognito_identity_provider_1.ConfirmSignUpCommand({
|
|
37
40
|
ClientId: this.config.clientId,
|
|
38
41
|
Username: phoneNumber,
|
|
39
42
|
ConfirmationCode: code,
|
|
@@ -45,9 +48,9 @@ export class CognitoService {
|
|
|
45
48
|
*/
|
|
46
49
|
async signInCustomAuth(params) {
|
|
47
50
|
const { phoneNumber } = params;
|
|
48
|
-
const command = new InitiateAuthCommand({
|
|
51
|
+
const command = new client_cognito_identity_provider_1.InitiateAuthCommand({
|
|
49
52
|
ClientId: this.config.clientId,
|
|
50
|
-
AuthFlow: AuthFlowType.CUSTOM_AUTH,
|
|
53
|
+
AuthFlow: client_cognito_identity_provider_1.AuthFlowType.CUSTOM_AUTH,
|
|
51
54
|
AuthParameters: {
|
|
52
55
|
USERNAME: phoneNumber,
|
|
53
56
|
},
|
|
@@ -64,9 +67,9 @@ export class CognitoService {
|
|
|
64
67
|
*/
|
|
65
68
|
async signInSRP(params) {
|
|
66
69
|
const { phoneNumber } = params;
|
|
67
|
-
const command = new InitiateAuthCommand({
|
|
70
|
+
const command = new client_cognito_identity_provider_1.InitiateAuthCommand({
|
|
68
71
|
ClientId: this.config.clientId,
|
|
69
|
-
AuthFlow: AuthFlowType.USER_SRP_AUTH,
|
|
72
|
+
AuthFlow: client_cognito_identity_provider_1.AuthFlowType.USER_SRP_AUTH,
|
|
70
73
|
AuthParameters: {
|
|
71
74
|
USERNAME: phoneNumber,
|
|
72
75
|
},
|
|
@@ -86,9 +89,9 @@ export class CognitoService {
|
|
|
86
89
|
*/
|
|
87
90
|
async respondToAuthChallenge(params) {
|
|
88
91
|
const { phoneNumber, code, session } = params;
|
|
89
|
-
const command = new RespondToAuthChallengeCommand({
|
|
92
|
+
const command = new client_cognito_identity_provider_1.RespondToAuthChallengeCommand({
|
|
90
93
|
ClientId: this.config.clientId,
|
|
91
|
-
ChallengeName: ChallengeNameType.CUSTOM_CHALLENGE,
|
|
94
|
+
ChallengeName: client_cognito_identity_provider_1.ChallengeNameType.CUSTOM_CHALLENGE,
|
|
92
95
|
Session: session,
|
|
93
96
|
ChallengeResponses: {
|
|
94
97
|
USERNAME: phoneNumber,
|
|
@@ -109,9 +112,9 @@ export class CognitoService {
|
|
|
109
112
|
*/
|
|
110
113
|
async refreshToken(params) {
|
|
111
114
|
const { refreshToken } = params;
|
|
112
|
-
const command = new InitiateAuthCommand({
|
|
115
|
+
const command = new client_cognito_identity_provider_1.InitiateAuthCommand({
|
|
113
116
|
ClientId: this.config.clientId,
|
|
114
|
-
AuthFlow: AuthFlowType.REFRESH_TOKEN_AUTH,
|
|
117
|
+
AuthFlow: client_cognito_identity_provider_1.AuthFlowType.REFRESH_TOKEN_AUTH,
|
|
115
118
|
AuthParameters: {
|
|
116
119
|
REFRESH_TOKEN: refreshToken,
|
|
117
120
|
},
|
|
@@ -126,7 +129,7 @@ export class CognitoService {
|
|
|
126
129
|
* Obtiene información del usuario autenticado usando el access token
|
|
127
130
|
*/
|
|
128
131
|
async getUser(accessToken) {
|
|
129
|
-
const command = new GetUserCommand({
|
|
132
|
+
const command = new client_cognito_identity_provider_1.GetUserCommand({
|
|
130
133
|
AccessToken: accessToken,
|
|
131
134
|
});
|
|
132
135
|
const response = await this.client.send(command);
|
|
@@ -142,7 +145,7 @@ export class CognitoService {
|
|
|
142
145
|
* Obtiene información del usuario por username (requiere permisos de admin)
|
|
143
146
|
*/
|
|
144
147
|
async adminGetUser(phoneNumber) {
|
|
145
|
-
const command = new AdminGetUserCommand({
|
|
148
|
+
const command = new client_cognito_identity_provider_1.AdminGetUserCommand({
|
|
146
149
|
UserPoolId: this.config.userPoolId,
|
|
147
150
|
Username: phoneNumber,
|
|
148
151
|
});
|
|
@@ -159,10 +162,10 @@ export class CognitoService {
|
|
|
159
162
|
* Inicia autenticación como admin (útil para backend)
|
|
160
163
|
*/
|
|
161
164
|
async adminInitiateAuth(phoneNumber) {
|
|
162
|
-
const command = new AdminInitiateAuthCommand({
|
|
165
|
+
const command = new client_cognito_identity_provider_1.AdminInitiateAuthCommand({
|
|
163
166
|
UserPoolId: this.config.userPoolId,
|
|
164
167
|
ClientId: this.config.clientId,
|
|
165
|
-
AuthFlow: AuthFlowType.CUSTOM_AUTH,
|
|
168
|
+
AuthFlow: client_cognito_identity_provider_1.AuthFlowType.CUSTOM_AUTH,
|
|
166
169
|
AuthParameters: {
|
|
167
170
|
USERNAME: phoneNumber,
|
|
168
171
|
},
|
|
@@ -178,3 +181,4 @@ export class CognitoService {
|
|
|
178
181
|
};
|
|
179
182
|
}
|
|
180
183
|
}
|
|
184
|
+
exports.CognitoService = CognitoService;
|