heimdall-api-platform 1.0.32 → 1.0.33

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "heimdall-api-platform",
3
- "version": "1.0.32",
3
+ "version": "1.0.33",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "license": "MIT",
@@ -15,7 +15,7 @@
15
15
  "test": "mocha --timeout 5000 'test/**/*.test.js'",
16
16
  "test:watch": "nodemon --exec 'npm test'",
17
17
  "start": "node server.js",
18
- "build": "rimraf dist && mkdir dist && ncc build lib/index.js -o dist && javascript-obfuscator ./dist/index.js --output ./dist/index.js --config ./javascript-obfuscator.config.json && cp ./package.json dist && cp ./LICENSE dist && cp ./README.md dist",
18
+ "build": "rimraf dist && mkdir dist && ncc build lib/index.js -o dist && javascript-obfuscator ./dist/index.js --output ./dist/index.js --config ./javascript-obfuscator.config.json",
19
19
  "prepublishOnly": "npm run build"
20
20
  },
21
21
  "repository": {
package/dist/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- The MIT License (MIT)
2
-
3
- Copyright (c) 2018 Márcio Rosa
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in
13
- all copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
- THE SOFTWARE.
package/dist/README.md DELETED
@@ -1,336 +0,0 @@
1
- # Heimdall API Platform
2
-
3
- **Um microgateway de alta performance para APIs, com orquestração inteligente e roteamento dinâmico.**
4
-
5
- ---
6
-
7
- ## 🚀 O que é o Heimdall API Platform?
8
-
9
- O Heimdall API Platform é um microgateway projetado para lidar com orquestração de APIs, roteamento dinâmico e integração entre microsserviços de forma flexível e performática.
10
-
11
- Ideal para arquiteturas modernas, legadas ou híbridas, ele permite centralizar e controlar fluxos de requisições com segurança, cache, validação de licença e observabilidade.
12
-
13
- ---
14
-
15
- ## ✅ Problemas que ele resolve
16
-
17
- * Roteamento inteligente entre múltiplas APIs
18
- * Orquestração de serviços e fluxos condicionais
19
- * Aplicação de padrões de segurança e autenticação
20
- * Cache de respostas via Redis
21
- * Observabilidade com OpenSearch
22
- * Proteção contra ataques DDoS e throttling de requisições
23
- * Transformações dinâmicas de dados de request em tempo de execução
24
- * Facilidade de integração com ambientes heterogêneos (legado + novo)
25
- * Padronização de erros e tratamento uniforme
26
- * Geração de correlation id para rastreamento de requisições
27
-
28
- ---
29
-
30
- ## 🧩 Funcionalidades Principais
31
-
32
- * ✅ Gateway de APIs leve e flexível
33
- * 🔁 Roteamento dinâmico baseado em configurações
34
- * ⚙️ Orquestração de múltiplos fluxos por rota
35
- * 🔗 Agregação de vários serviços em uma única requisição utilizando fluxos
36
- * 🔐 Validação de licença (produção exige chave válida)
37
- * 📦 Cache com Redis (opcional, mas recomendado)
38
- * 🔍 Observabilidade com OpenSearch
39
- * 📄 Documentação automática com Swagger e Redocly
40
- * 🎭 Suporte a mocks estáticos e dinâmicos
41
- * ▶️ Execução de functions customizadas, integração com clientes de API e mocks internos
42
- * 🛠️ Padronização de erros e respostas de falha
43
- * 🔖 Geração automática de correlation id para rastreamento
44
- * ☁️ Totalmente compatível com AWS Lambda e Google Cloud Functions
45
-
46
- ---
47
-
48
- ## 📦 Pré-requisitos
49
-
50
- * **Node.js** v18 ou superior
51
-
52
- ---
53
-
54
- ## 📥 Instalação via NPM
55
-
56
- ```bash
57
- npm install heimdall-api-platform
58
- ```
59
-
60
- ---
61
-
62
- ## 🔧 Exemplos de Configuração de Rotas
63
-
64
- ### 1. execute-function
65
-
66
- ```js
67
- module.exports = {
68
- name: 'executeFunction',
69
- description: 'Execute Function',
70
- method: 'POST',
71
- route: '/execute_function',
72
- indexedResult: false,
73
- responseHeaders: {
74
- 'Content-Type': 'application/json;charset=UTF-8'
75
- },
76
- flow: [
77
- {
78
- resultVariable: '.',
79
- skipErrors: false,
80
- cacheEnable: true,
81
- cacheTtl: 10, // TTL em segundos
82
- operation: {
83
- functionName: 'return-body-result',
84
- type: 'function'
85
- }
86
- }
87
- ]
88
- };
89
- ```
90
-
91
- | **Atributo** | **Descrição** |
92
- | ----------------- | ----------------------------------------------- |
93
- | `name` | Identificador único da rota/configuração. |
94
- | `description` | Descrição para documentação. |
95
- | `method` | Método HTTP (GET, POST, etc.). |
96
- | `route` | Caminho exposto no gateway. |
97
- | `indexedResult` | Se deve indexar o resultado para uso posterior. |
98
- | `responseHeaders` | Headers fixos retornados na resposta. |
99
-
100
- **Detalhes do `flow`**
101
-
102
- | **Campo** | **Descrição** |
103
- | ---------------- | -------------------------------------------- |
104
- | `resultVariable` | Variável onde armazenar o saída da operação. |
105
- | `skipErrors` | Se `true`, ignora erros e continua o fluxo. |
106
- | `cacheEnable` | Se `true`, ativa cache para esta operação. |
107
- | `cacheTtl` | Tempo de vida (segundos) do cache. |
108
- | `operation` | Configuração da operação (`function`). |
109
-
110
- **Configuração `operation`**
111
-
112
- | **Campo** | **Descrição** |
113
- | -------------- | --------------------------------------- |
114
- | `functionName` | Nome da função registrada no framework. |
115
- | `type` | Tipo de operação (`function`). |
116
-
117
- ---
118
-
119
- ### 2. execute-mock
120
-
121
- ```js
122
- module.exports = {
123
- name: 'executeMock',
124
- description: 'Execute Mock',
125
- method: 'GET',
126
- route: '/execute_mock',
127
- indexedResult: false,
128
- responseHeaders: {
129
- 'Content-Type': 'application/json;charset=UTF-8'
130
- },
131
- flow: [
132
- {
133
- resultVariable: '.',
134
- skipErrors: false,
135
- operation: {
136
- file: 'demo-mock.json',
137
- type: 'mock'
138
- }
139
- }
140
- ]
141
- };
142
- ```
143
-
144
- | **Atributo** | **Descrição** |
145
- | ----------------- | ------------------------------------ |
146
- | `name` | Identificador único da rota de mock. |
147
- | `description` | Descrição para documentação. |
148
- | `method` | Método HTTP. |
149
- | `route` | Caminho exposto no mock. |
150
- | `indexedResult` | Se deve indexar o mock. |
151
- | `responseHeaders` | Headers fixos para resposta do mock. |
152
-
153
- **Detalhes do `flow`**
154
-
155
- | **Campo** | **Descrição** |
156
- | ---------------- | ----------------------------------------- |
157
- | `resultVariable` | Variável que receberá o conteúdo do mock. |
158
- | `skipErrors` | Se `true`, ignora erros. |
159
- | `operation` | Configuração da operação (`mock`). |
160
-
161
- **Configuração `operation`**
162
-
163
- | **Campo** | **Descrição** |
164
- | --------- | ---------------------------------- |
165
- | `file` | Caminho para arquivo JSON de mock. |
166
- | `type` | Tipo de operação (`mock`). |
167
-
168
- ---
169
-
170
- ### 3. execute-api-rest (usando client)
171
-
172
- ```js
173
- module.exports = {
174
- name: 'addressByZipcodeService',
175
- description: 'Get Address By Zipcode',
176
- method: 'GET',
177
- route: '/:zipcode/by_client_api',
178
- indexedResult: false,
179
- responseHeaders: {
180
- 'Content-Type': 'application/json;charset=UTF-8'
181
- },
182
- flow: [
183
- {
184
- resultVariable: '.',
185
- skipErrors: false,
186
- cacheEnable: false,
187
- cacheTtl: 24 * 60 * 60 * 30, // 30 dias em segundos
188
- cacheKey: '{{params.zipcode}}',
189
- operation: {
190
- clientName: 'viaCEP',
191
- mergedHeaders: false,
192
- headersTransformation: 'transformation-header-get-cep',
193
- requestTransformation: 'transformation-request-get-cep',
194
- responseTransformation: 'transformation-response-get-cep',
195
- onError: 'on-error-get-cep',
196
- onSuccess: 'on-success-get-cep',
197
- headers: {
198
- 'Content-Type': 'application/json;charset=UTF-8',
199
- 'X-HEADER-CEP': '{{params.zipcode}}'
200
- },
201
- type: 'http',
202
- method: 'GET',
203
- path: '/{{params.zipcode}}/json'
204
- }
205
- }
206
- ]
207
- };
208
- ```
209
-
210
- | **Atributo** | **Descrição** |
211
- | ----------------- | ----------------------------------------------- |
212
- | `name` | Identificador único do serviço. |
213
- | `description` | Descrição para documentação. |
214
- | `method` | Método HTTP da chamada externa. |
215
- | `route` | Rota no gateway para chamada externa. |
216
- | `indexedResult` | Se deve indexar o resultado. |
217
- | `responseHeaders` | Headers fixos da resposta. |
218
- | `flow` | Lista de etapas de orquestração para esta rota. |
219
-
220
- **Detalhes do `flow`**
221
-
222
- | **Campo** | **Descrição** |
223
- | ---------------- | ----------------------------------------------------- |
224
- | `resultVariable` | Variável que armazena o resultado da chamada externa. |
225
- | `skipErrors` | Se `true`, continua o fluxo mesmo com erros. |
226
- | `cacheEnable` | Se `true`, habilita cache para esta operação. |
227
- | `cacheTtl` | TTL do cache em segundos. |
228
- | `cacheKey` | Chave de cache baseada em parâmetros da rota. |
229
- | `operation` | Configuração da operação HTTP. |
230
-
231
- **Configuração `operation`**
232
-
233
- | **Campo** | **Descrição** |
234
- | ------------------------ | --------------------------------------------------------- |
235
- | `clientName` | Nome do cliente HTTP em `mappingClients`. |
236
- | `mergedHeaders` | Se `true`, mescla todos os cabeçalhos de entrada. |
237
- | `headersTransformation` | Função para transformar cabeçalhos. |
238
- | `requestTransformation` | Função para transformar payload de request. |
239
- | `responseTransformation` | Função para transformar a resposta recebida. |
240
- | `onError` | Função acionada em caso de erro. |
241
- | `onSuccess` | Função acionada em caso de sucesso. |
242
- | `headers` | Headers estáticos extras para requisição. |
243
- | `type` | Tipo da operação (`http`). |
244
- | `method` | Método HTTP da chamada externa. |
245
- | `path` | Path da rota externa, suportando templates de parâmetros. |
246
-
247
- ---
248
-
249
- ## 🏗️ Estrutura Esperada de Configuração
250
-
251
- ### `environment.js`
252
-
253
- ```js
254
- module.exports = {
255
- appName: process.env.appName || 'demo-api-gateway',
256
- requestTimeout: process.env.requestTimeout || 20000,
257
- requestPerSecond: process.env.requestPerSecond || 40,
258
- memoryCheckInterval: process.env.memoryCheckInterval || 20000,
259
- serverPort: process.env.serverPort || 9010,
260
- logger: {
261
- Console: {
262
- level: process.env.loggerLevel || 'info'
263
- }
264
- },
265
- enableRedis: true,
266
- redisCache: {
267
- reader: { host: 'localhost', port: 6379, connectTimeout: 5000 },
268
- writer: { host: 'localhost', port: 6379, connectTimeout: 5000 }
269
- },
270
- enableElasticSearch: process.env.elasticEnable,
271
- elasticSearch: {
272
- indexName: process.env.elasticIndexName,
273
- client: process.env.elasticClient,
274
- credentials: { accessKeyId: process.env.elasticAccessKeyId, secretAccessKey: process.env.elasticSecretAccessKey },
275
- host: process.env.elasticHost,
276
- port: process.env.elasticPort
277
- }
278
- };
279
- ```
280
-
281
- | **Atributo** | **Descrição** |
282
- | ----------------------------- | -------------------------------------------------------- |
283
- | `appName` | Nome da aplicação exibido nos logs e métricas. |
284
- | `requestTimeout` | Tempo (ms) para timeout de chamadas a serviços upstream. |
285
- | `requestPerSecond` | Limite de requisições por segundo do gateway. |
286
- | `memoryCheckInterval` | Intervalo (ms) para verificar uso de memória. |
287
- | `serverPort` | Porta na qual o servidor HTTP irá escutar. |
288
- | `logger.Console.level` | Nível de log para console (`info`, `warn`, `error`). |
289
- | `enableRedis` | Ativa cache e throttling com Redis. |
290
- | `redisCache.reader.*` | Configurações de conexão de leitura no Redis. |
291
- | `redisCache.writer.*` | Configurações de conexão de escrita no Redis. |
292
- | `enableElasticSearch` | Ativa integração com OpenSearch/ElasticSearch. |
293
- | `elasticSearch.indexName` | Nome do índice para armazenamento de logs. |
294
- | `elasticSearch.client` | Driver utilizado para conexão com OpenSearch. |
295
- | `elasticSearch.credentials.*` | Credenciais de acesso ao OpenSearch. |
296
- | `elasticSearch.host` | Host/URL do serviço OpenSearch. |
297
- | `elasticSearch.port` | Porta do serviço OpenSearch. |
298
-
299
- ---
300
-
301
- ## ▶️ Comandos Úteis
302
-
303
- ```bash
304
- npm run build
305
- npm run test
306
- npm start
307
- ```
308
-
309
- ---
310
-
311
- ## 🔑 Validação de Licença
312
-
313
- Para uso em produção é obrigatória uma licença válida. Em ambientes de desenvolvimento e testes, a licença pode ser omitida.
314
-
315
- A variável `APP_KEY` deve estar presente no ambiente:
316
-
317
- ```bash
318
- export APP_KEY=minha-chave-da-licenca
319
- ```
320
-
321
- ---
322
-
323
- ## 📜 Política de Licença
324
-
325
- * Produção: exige licença.
326
- * Dev/local: sem restrição.
327
- * MIT.
328
-
329
- ---
330
-
331
- ## 📫 Suporte e Contato
332
-
333
- * 🏢 **Empresa**: [P4F](https://www.protonss4fun.com.br/)
334
- * 📧 **E-mail**: [contato@p4f.dev](mailto:contato@p4f.dev)
335
-
336
- © 2025 P4F - Todos os direitos reservados.
package/dist/package.json DELETED
@@ -1,96 +0,0 @@
1
- {
2
- "name": "heimdall-api-platform",
3
- "version": "1.0.32",
4
- "description": "",
5
- "main": "dist/index.js",
6
- "license": "MIT",
7
- "files": [
8
- "dist/index.js",
9
- "LICENSE",
10
- "README.md",
11
- "package.json"
12
- ],
13
- "scripts": {
14
- "prestart": "npm install",
15
- "test": "mocha --timeout 5000 'test/**/*.test.js'",
16
- "test:watch": "nodemon --exec 'npm test'",
17
- "start": "node server.js",
18
- "build": "rimraf dist && mkdir dist && ncc build lib/index.js -o dist && javascript-obfuscator ./dist/index.js --output ./dist/index.js --config ./javascript-obfuscator.config.json && cp ./package.json dist && cp ./LICENSE dist && cp ./README.md dist",
19
- "prepublishOnly": "npm run build"
20
- },
21
- "repository": {
22
- "type": "git",
23
- "url": "git+ssh://git@github.com:protonss4fun/heimdall-api-platform.git"
24
- },
25
- "keywords": [
26
- "api",
27
- "gateway",
28
- "core",
29
- "restful",
30
- "json"
31
- ],
32
- "author": "Márcio Rosa <marcio.rosa@p4f.io>",
33
- "bugs": {
34
- "url": "https://github.com/protonss4fun/heimdall-api-platform/issues"
35
- },
36
- "homepage": "https://github.com/protonss4fun/heimdall-api-platform",
37
- "dependencies": {
38
- "@opensearch-project/opensearch": "^2.4.0",
39
- "async": "^3.2.5",
40
- "axios": "^1.8.2",
41
- "body-parser": "^1.20.2",
42
- "compression": "^1.7.4",
43
- "cookie-parser": "^1.4.6",
44
- "cors": "^2.8.5",
45
- "dotenv": "^17.2.0",
46
- "express": "^4.18.2",
47
- "express-basic-auth": "^1.2.1",
48
- "express-throttle": "^2.0.0",
49
- "form-data": "^4.0.2",
50
- "helmet": "^7.0.0",
51
- "http-errors": "^2.0.0",
52
- "jsonwebtoken": "^9.0.1",
53
- "morgan": "^1.10.0",
54
- "multer": "^1.4.5-lts.1",
55
- "node-cache": "^5.1.2",
56
- "object-hash": "^1.1.8",
57
- "pseudomap": "^1.0.2",
58
- "redis": "^3.1.2",
59
- "redis-rate-limiter": "^1.2.0",
60
- "step": "^1.0.0",
61
- "underscore": "^1.9.1",
62
- "uuid": "^9.0.0",
63
- "winston": "^3.2.1",
64
- "winston-transport": "4.3.0",
65
- "yallist": "^3.0.2",
66
- "yaml": "^2.8.0"
67
- },
68
- "devDependencies": {
69
- "@rollup/plugin-commonjs": "^28.0.6",
70
- "@rollup/plugin-node-resolve": "^16.0.1",
71
- "@vercel/ncc": "^0.38.3",
72
- "chai": "^4.3.7",
73
- "javascript-obfuscator": "^4.1.1",
74
- "mocha": "^11.1.0",
75
- "nodemon": "^3.1.9",
76
- "rimraf": "^6.0.1",
77
- "rollup": "^4.45.1",
78
- "rollup-plugin-javascript-obfuscator": "^1.0.4",
79
- "sinon": "^19.0.2",
80
- "webpack": "^5.88.2",
81
- "webpack-cli": "^5.1.4",
82
- "webpack-node-externals": "^3.0.0"
83
- },
84
- "pkg": {
85
- "assets": [],
86
- "scripts": [
87
- "dist/index.js"
88
- ],
89
- "targets": [
90
- "node20-linux-x64",
91
- "node20-macos-x64",
92
- "node20-win-x64"
93
- ],
94
- "outputPath": "dist"
95
- }
96
- }