Skip to content

Commit

Permalink
gerenciador de sessões - Fixes #130
Browse files Browse the repository at this point in the history
  • Loading branch information
jrCleber committed Jun 5, 2024
1 parent 74dc217 commit b214c68
Show file tree
Hide file tree
Showing 7 changed files with 720 additions and 0 deletions.
3 changes: 3 additions & 0 deletions workers/session/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
/node_modules
/instances/*
!/instances/.gitkeep
19 changes: 19 additions & 0 deletions workers/session/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
FROM node:20-bullseye-slim

WORKDIR /worker

LABEL API_VERSION="0.0.1"
LABEL MANTAINER="https://github.com/code-chat-br"
LABEL REPOSITORY="https://github.com/code-chat-br/whatsapp-api"

COPY package*.json ./

RUN apt-get update && apt-get install -y git && npm install

COPY ./index.mjs .

RUN mkdir instances

ENV DOCKER_ENV=true

ENTRYPOINT [ "npm", "start" ]
36 changes: 36 additions & 0 deletions workers/session/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Implementação de um Worker HTTP para Gerenciamento de Sessões na API de WhatsApp

Desenvolvi um protótipo inicial de um worker HTTP para a API de WhatsApp disponível em "https://github.com/code-chat-br/whatsapp-api". Este worker é responsável pelo gerenciamento dos arquivos de conexão das sessões do WhatsApp. Ele escuta as requisições HTTP na porta 5656 e oferece funcionalidades para receber, salvar e recuperar os arquivos de sessão. A seguir, apresento uma descrição mais detalhada do funcionamento e das responsabilidades desse worker:

1. **Escuta de Requisições HTTP**:
- O worker foi configurado para ouvir requisições HTTP na porta 5656. Qualquer requisição enviada para essa porta será tratada pelo worker.

2. **Recebimento de Arquivos de Sessão**:
- Quando uma sessão de WhatsApp é iniciada ou atualizada, o worker recebe os arquivos de conexão correspondentes através de requisições HTTP POST. Esses arquivos contêm informações necessárias para manter a conexão ativa e permitir a comunicação contínua com o WhatsApp.

3. **Armazenamento de Arquivos de Sessão**:
- Após receber os arquivos de sessão, o worker os armazena em um local seguro no servidor. O armazenamento é feito de maneira organizada para garantir que os arquivos possam ser facilmente recuperados e identificados.

4. **Recuperação de Arquivos de Sessão**:
- O worker também oferece uma funcionalidade de recuperação dos arquivos de sessão. Quando solicitado através de uma requisição HTTP GET, ele localiza e retorna os arquivos de sessão específicos, permitindo que a conexão com o WhatsApp seja restaurada ou mantida.

5. **Segurança e Confiabilidade**:
- não implementado

6. **Requisitos de Rede**:
- É fundamental que este worker permaneça na mesma rede que a aplicação principal para assegurar a comunicação eficiente e segura entre os componentes. Se estiver utilizando o Docker Swarm, o worker deve estar na mesma rede do Swarm para garantir o correto funcionamento e a integração dos serviços.

Como este é um protótipo inicial, é importante destacar que o sistema está sujeito a melhorias e otimizações. A implementação atual serve como base para futuras expansões e refinamentos, garantindo um gerenciamento eficiente e seguro das sessões do WhatsApp, facilitando a integração e o uso contínuo da API de WhatsApp em aplicações que necessitam de comunicação automatizada e confiável.

---

# Discurssões

As discurções sobre esse worker devem ser realizadas [aqui](https://github.com/code-chat-br/whatsapp-api/discussions/131).

---
# Docker

- [Dockerfile](./Dockerfile)
- [docker-compose](./docker-compose.yaml)
- [codechat/worher:develop](https://hub.docker.com/r/codechat/worker/tags)
20 changes: 20 additions & 0 deletions workers/session/docker-compose.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
version: '3.8'

networks:
public-network:
driver: bridge
# external: true

services:
worker_sessions:
image: codechat/worker:develop
container_name: codechat_worker
restart: unless-stopped
ports:
- 5656:5656
volumes:
- instances_connecteds:/worker/instances

volumes:
instances_connecteds:
driver: local
126 changes: 126 additions & 0 deletions workers/session/index.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
/**
* ┌──────────────────────────────────────────────────────────────────────────────┐
* │ @author jrCleber │
* │ @filename /workers/session/index.js │
* │ Developed by: Cleber Wilson │
* │ Creation date: Mai 28, 2024 │
* │ Contact: [email protected]
* ├──────────────────────────────────────────────────────────────────────────────┤
* │ @copyright © Cleber Wilson 2022. All rights reserved. │
* │ Licensed under the Apache License, Version 2.0 │
* │ │
* │ @license "https://github.com/code-chat-br/whatsapp-api/blob/main/LICENSE" │
* │ │
* │ You may not use this file except in compliance with the License. │
* │ You may obtain a copy of the License at │
* │ │
* │ http://www.apache.org/licenses/LICENSE-2.0 │
* │ │
* │ Unless required by applicable law or agreed to in writing, software │
* │ distributed under the License is distributed on an "AS IS" BASIS, │
* │ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. │
* │ │
* │ See the License for the specific language governing permissions and │
* │ limitations under the License. │
* ├──────────────────────────────────────────────────────────────────────────────┤
* │ @important │
* │ For any future changes to the code in this file, it is recommended to │
* │ contain, together with the modification, the information of the developer │
* │ who changed it and the date of modification. │
* └──────────────────────────────────────────────────────────────────────────────┘
*/

import {
existsSync,
mkdirSync,
readFileSync,
readdirSync,
rmSync,
writeFileSync,
} from 'fs';
import { join } from 'path';
import express, { json, urlencoded } from 'express';
import { execSync } from 'child_process';

const HostPort = process.env.PORT;

const app = express();

const logger = (...value) =>
console.log(`Pid: ${process.pid} -`, `Date ${new Date().toISOString()} -`, ...value);

app.listen(5656, logger(`Server ON: Port - 5656 `));
app.use(urlencoded({ extended: true }), json());

const INSTANCE_PATH = 'instances';

if (!existsSync(INSTANCE_PATH)) {
mkdirSync(INSTANCE_PATH, { recursive: true });
}

app.options('/session/ping', function (req, res) {
logger('Http - Path: ', req.path);
res.status(200).json({ pong: true });
});

app.post('/session', function (req, res) {
const body = req.body;

const path = join(INSTANCE_PATH, body.instance);

if (!existsSync(path)) {
mkdirSync(path, { recursive: true });
}

res.status(202).send();
});

app.post(`/session/:instance/:key`, function (req, res) {
const { instance, key } = req.params;
const body = req.body;

const path = join(INSTANCE_PATH, instance, key + '.json');

writeFileSync(path, body.data || {}, { encoding: 'utf8' });

res.status(202).send();
});

app.get('/session/:instance/:key', function (req, res) {
const { instance, key } = req.params;

const path = join(INSTANCE_PATH, instance, key + '.json');

if (existsSync(path)) {
const data = readFileSync(path, { encoding: 'utf8' });
res.status(200).send(data);
}

res.status(200).send();
});

app.delete('/session/:instance/:key', function (req, res) {
const { instance, key } = req.params;

const path = join(INSTANCE_PATH, instance, key + '.json');

rmSync(path, { recursive: true });

res.status(200).send();
});

app.delete(`/session/:instance`, function (req, res) {
const { instance } = req.params;

const path = join(INSTANCE_PATH, instance);

execSync(`rm -rf ${path}`);

res.status(200).send();
});

app.get('/session/list-instances', function (req, res) {
const files = readdirSync(INSTANCE_PATH);

res.status(200).json(files);
});
16 changes: 16 additions & 0 deletions workers/session/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"name": "session",
"version": "0.0.1",
"main": "index.js",
"scripts": {
"start": "node index.mjs",
"start:dev": "clear && node index.mjs"
},
"dependencies": {
"express": "^4.19.2",
"path": "^0.12.7"
},
"devDependencies": {
"@types/node": "^20.12.13"
}
}
Loading

0 comments on commit b214c68

Please sign in to comment.