minimonolith 0.26.20 → 0.27.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/package.json +5 -1
- package/src/api/get/index.js +3 -0
- package/src/api/getElectroHandler/index.js +30 -0
- package/src/database/index.js +2 -1
- package/src/database/post/index.js +1 -1
- package/src/database/postDynamoDB/index.js +83 -0
- package/src/middleware/postCors/index.js +0 -2
- package/src/model/getElectro/index.js +27 -0
- package/src/model/index.js +2 -1
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "minimonolith",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.27.0",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"scripts": {
|
|
@@ -17,12 +17,16 @@
|
|
|
17
17
|
"sequelize": "^6.30.0"
|
|
18
18
|
},
|
|
19
19
|
"devDependencies": {
|
|
20
|
+
"@aws-sdk/client-dynamodb": "^3.1048.0",
|
|
20
21
|
"@aws-sdk/client-s3": "^3.304.0",
|
|
22
|
+
"@aws-sdk/lib-dynamodb": "^3.1048.0",
|
|
21
23
|
"@aws-sdk/s3-request-presigner": "^3.304.0",
|
|
22
24
|
"@jest/globals": "^30.2.0",
|
|
23
25
|
"cross-env": "^7.0.3",
|
|
24
26
|
"cross-fetch": "^3.1.5",
|
|
25
27
|
"dotenv": "^16.0.3",
|
|
28
|
+
"dynalite": "^4.0.0",
|
|
29
|
+
"electrodb": "^3.7.5",
|
|
26
30
|
"jest": "^29.5.0",
|
|
27
31
|
"mysql2": "^3.2.0",
|
|
28
32
|
"nodemon": "^2.0.22",
|
package/src/api/get/index.js
CHANGED
|
@@ -6,12 +6,15 @@ import MIDDLEWARE_MODULE from '../../middleware/index.js';
|
|
|
6
6
|
|
|
7
7
|
import postModule from '../postModule/index.js';
|
|
8
8
|
import getSyncedHandler from '../getSyncedHandler/index.js';
|
|
9
|
+
import getElectroHandler from '../getElectroHandler/index.js';
|
|
9
10
|
|
|
10
11
|
const API = getLambdaAPI();
|
|
11
12
|
API.postCORSMiddleware = MIDDLEWARE_MODULE.postCors;
|
|
12
13
|
API.postModule = postModule;
|
|
13
14
|
API.postDatabaseModule = DATABASE_MODULE.post;
|
|
15
|
+
API.postDynamoDBModule = DATABASE_MODULE.postDynamoDB;
|
|
14
16
|
API.postErrorMiddleware = MIDDLEWARE_MODULE.postError;
|
|
15
17
|
API.getSyncedHandler = getSyncedHandler;
|
|
18
|
+
API.getElectroHandler = getElectroHandler;
|
|
16
19
|
|
|
17
20
|
export default () => API;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import MODEL_MODULE from '../../model/index.js';
|
|
2
|
+
import LOG_MODULE from '../../log/index.js';
|
|
3
|
+
|
|
4
|
+
import getAPI from '../get/index.js';
|
|
5
|
+
|
|
6
|
+
const META_MODULE='API', META_ENDPOINT='GET_ELECTRO_HANDLER',
|
|
7
|
+
META_ROUTE=META_MODULE+'_'+META_ENDPOINT;
|
|
8
|
+
|
|
9
|
+
export default async () => {
|
|
10
|
+
// 1. Configurar middlewares (se mantiene igual)
|
|
11
|
+
getAPI().postErrorMiddleware();
|
|
12
|
+
|
|
13
|
+
// 2. Cargar Entidades de ElectroDB (en lugar de sincronizar ORM)
|
|
14
|
+
if (getAPI().DYNAMO_CLIENT) {
|
|
15
|
+
// Asumiendo que el archivo que creamos antes en model se exporta como getElectro
|
|
16
|
+
await MODEL_MODULE.getElectro();
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
LOG_MODULE.postINFO(`API (DynamoDB Mode) listening...`);
|
|
20
|
+
|
|
21
|
+
// 3. Retornar el handler para AWS Lambda (se mantiene igual)
|
|
22
|
+
return async (event, context) => {
|
|
23
|
+
LOG_MODULE.postINFO('ENDPOINT request:', {
|
|
24
|
+
path: event.requestContext?.http?.path,
|
|
25
|
+
method: event.requestContext?.http?.method,
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
return await getAPI().run(event, context);
|
|
29
|
+
};
|
|
30
|
+
};
|
package/src/database/index.js
CHANGED
|
@@ -19,7 +19,7 @@ export default async ({ DB_DIALECT, DB_HOST,
|
|
|
19
19
|
const DB_VARS = Object.fromEntries(
|
|
20
20
|
Object.entries({
|
|
21
21
|
DB_DIALECT, DB_HOST, DB_PORT, DB_DB,
|
|
22
|
-
DB_USER, DB_PASS, DB_STORAGE })
|
|
22
|
+
DB_USER, DB_PASS, DB_STORAGE, DB_SSL })
|
|
23
23
|
.filter(([key, val]) => val != null)
|
|
24
24
|
);
|
|
25
25
|
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { DynamoDBClient, CreateTableCommand, ListTablesCommand } from '@aws-sdk/client-dynamodb';
|
|
2
|
+
import { DynamoDBDocumentClient } from '@aws-sdk/lib-dynamodb';
|
|
3
|
+
|
|
4
|
+
import API_MODULE from '../../api/index.js';
|
|
5
|
+
import LOG_MODULE from '../../log/index.js';
|
|
6
|
+
import ERROR_MODULE from '../../error/index.js';
|
|
7
|
+
|
|
8
|
+
const META_MODULE='DATABASE', META_METHOD='POST_DYNAMODB',
|
|
9
|
+
META_ROUTE=META_MODULE+'_'+META_METHOD;
|
|
10
|
+
|
|
11
|
+
export default async ({
|
|
12
|
+
AWS_REGION, DYNAMO_TABLE, DYNALITE_PORT
|
|
13
|
+
}) => {
|
|
14
|
+
try {
|
|
15
|
+
LOG_MODULE.postDEBUG(`Initializing DynamoDB connection...`);
|
|
16
|
+
|
|
17
|
+
const clientConfig = {
|
|
18
|
+
region: AWS_REGION || 'us-east-1',
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const localPort = parseInt(DYNALITE_PORT, 10);
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
if (!isNaN(localPort)) {
|
|
25
|
+
|
|
26
|
+
LOG_MODULE.postINFO(`Starting Dynalite (In-Memory DynamoDB) on port ${localPort}, table ${DYNAMO_TABLE}...`);
|
|
27
|
+
|
|
28
|
+
// Importación dinámica: Así evitamos que Lambda intente cargar
|
|
29
|
+
// dynalite en producción donde no estará instalado.
|
|
30
|
+
const dynalite = (await import('dynalite')).default;
|
|
31
|
+
const dynaliteServer = dynalite({ createTableMs: 0 });
|
|
32
|
+
|
|
33
|
+
await new Promise((resolve, reject) => {
|
|
34
|
+
dynaliteServer.listen(localPort, (err) => {
|
|
35
|
+
if (err) reject(err);
|
|
36
|
+
else resolve();
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
// Sobrescribimos la configuración para que el SDK apunte a local
|
|
41
|
+
clientConfig.endpoint = `http://localhost:${localPort}`;
|
|
42
|
+
clientConfig.credentials = { accessKeyId: 'local', secretAccessKey: 'local' };
|
|
43
|
+
|
|
44
|
+
// Guardamos la instancia por si queremos apagarla después (útil en testing)
|
|
45
|
+
API_MODULE.get().DYNALITE_SERVER = dynaliteServer;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const client = new DynamoDBClient(clientConfig);
|
|
49
|
+
const marshallOptions = { removeUndefinedValues: true };
|
|
50
|
+
|
|
51
|
+
// Guardamos el DocumentClient (equivalente al "ORM" para ElectroDB)
|
|
52
|
+
API_MODULE.get().DYNAMO_CLIENT = DynamoDBDocumentClient.from(client, { marshallOptions });
|
|
53
|
+
|
|
54
|
+
// Opcional: Guardamos el nombre de la tabla principal si usas Single Table Design
|
|
55
|
+
if (DYNAMO_TABLE) {
|
|
56
|
+
API_MODULE.get().DYNAMO_TABLE = DYNAMO_TABLE;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (!isNaN(localPort) && DYNAMO_TABLE) {
|
|
60
|
+
LOG_MODULE.postINFO(`Auto-syncing local table: ${DYNAMO_TABLE}...`);
|
|
61
|
+
await client.send(new CreateTableCommand({
|
|
62
|
+
TableName: DYNAMO_TABLE,
|
|
63
|
+
AttributeDefinitions: [
|
|
64
|
+
{ AttributeName: 'pk', AttributeType: 'S' },
|
|
65
|
+
{ AttributeName: 'sk', AttributeType: 'S' }
|
|
66
|
+
],
|
|
67
|
+
KeySchema: [
|
|
68
|
+
{ AttributeName: 'pk', KeyType: 'HASH' },
|
|
69
|
+
{ AttributeName: 'sk', KeyType: 'RANGE' }
|
|
70
|
+
],
|
|
71
|
+
BillingMode: 'PAY_PER_REQUEST'
|
|
72
|
+
}));
|
|
73
|
+
|
|
74
|
+
const existingTables = await client.send(new ListTablesCommand({}));
|
|
75
|
+
LOG_MODULE.postINFO(`Tablas reales en Dynalite:`, existingTables.TableNames);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
LOG_MODULE.postINFO(`DynamoDB Document Client initialized successfully`);
|
|
79
|
+
|
|
80
|
+
} catch (META_METHOD_ERROR) {
|
|
81
|
+
ERROR_MODULE.postCompiletime({ META_ROUTE, META_METHOD_ERROR });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
@@ -22,9 +22,7 @@ export default () => {
|
|
|
22
22
|
|
|
23
23
|
API_MODULE.get().options('/*', (req, res) => {
|
|
24
24
|
const origin = req.headers.origin ? req.headers.origin : '*';
|
|
25
|
-
console.log('headers pre', res._headers);
|
|
26
25
|
for (let k in CORS_HEADERS({ origin })) { res.header(k, CORS_HEADERS({ origin })[k]); }
|
|
27
|
-
console.log('headers post', res._headers);
|
|
28
26
|
res.status(200).send({})
|
|
29
27
|
});
|
|
30
28
|
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import API_MODULE from '../../api/index.js';
|
|
2
|
+
import LOG_MODULE from '../../log/index.js';
|
|
3
|
+
|
|
4
|
+
const META_MODULE='MODEL', META_METHOD='GET_ELECTRO_HANDLER',
|
|
5
|
+
META_ROUTE=META_MODULE+'_'+META_METHOD;
|
|
6
|
+
const CYAN = '\x1b[36m', YELLOW = '\x1b[33m', END = '\x1b[0m';
|
|
7
|
+
|
|
8
|
+
export default async () => {
|
|
9
|
+
// 1. Cargar Entidades/Servicios de ElectroDB
|
|
10
|
+
for (const MODULE_NAME of Object.keys(API_MODULE.get().SCHEMAS)) {
|
|
11
|
+
|
|
12
|
+
const tableName = API_MODULE.get().DYNAMO_TABLE;
|
|
13
|
+
LOG_MODULE.postINFO(`ElectroDB Entity being loaded:`, `${CYAN}${MODULE_NAME}${END}`, `for table: ${tableName}`);
|
|
14
|
+
|
|
15
|
+
// Pasamos el DYNAMO_CLIENT y la configuración a la función del esquema
|
|
16
|
+
API_MODULE.get().MODELS[MODULE_NAME] =
|
|
17
|
+
API_MODULE.get().SCHEMAS[MODULE_NAME]({
|
|
18
|
+
client: API_MODULE.get().DYNAMO_CLIENT,
|
|
19
|
+
table: tableName
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
LOG_MODULE.postINFO('DynamoDB Entities loaded. Skipping sync/associate phases.');
|
|
24
|
+
|
|
25
|
+
// Asumo que aquí devuelves el handler real de tu framework como lo haces en el getSynced original
|
|
26
|
+
// return API_MODULE.get().SERVER.getHandler(); (o lo que aplique a tu código base)
|
|
27
|
+
};
|
package/src/model/index.js
CHANGED