{"id":22020448,"url":"https://github.com/pedrolaraburu/sockets-bun","last_synced_at":"2026-04-18T02:31:39.034Z","repository":{"id":265364641,"uuid":"895811619","full_name":"pedrolaraburu/sockets-bun","owner":"pedrolaraburu","description":"Trabalho Arquitetura de Sistemas Distribuídos ","archived":false,"fork":false,"pushed_at":"2024-11-29T03:34:48.000Z","size":2957,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-23T10:15:35.118Z","etag":null,"topics":["bun","distributed-systems","mermaidjs","sockets"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pedrolaraburu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-11-29T00:43:06.000Z","updated_at":"2024-11-29T03:34:51.000Z","dependencies_parsed_at":"2024-11-29T04:36:21.791Z","dependency_job_id":null,"html_url":"https://github.com/pedrolaraburu/sockets-bun","commit_stats":null,"previous_names":["pedrolaraburu/sockets-bun"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/pedrolaraburu/sockets-bun","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pedrolaraburu%2Fsockets-bun","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pedrolaraburu%2Fsockets-bun/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pedrolaraburu%2Fsockets-bun/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pedrolaraburu%2Fsockets-bun/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pedrolaraburu","download_url":"https://codeload.github.com/pedrolaraburu/sockets-bun/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pedrolaraburu%2Fsockets-bun/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31953763,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T00:39:45.007Z","status":"online","status_checked_at":"2026-04-18T02:00:07.018Z","response_time":103,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bun","distributed-systems","mermaidjs","sockets"],"created_at":"2024-11-30T06:06:29.283Z","updated_at":"2026-04-18T02:31:39.011Z","avatar_url":"https://github.com/pedrolaraburu.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# **Trabalho Arquitetura de Sistemas Distribuídos**\n\n## **Tema:** \n**Construção de uma Aplicação com Componentes Distribuídos – Troca de Mensagens**\n\n---\n\n## **Descrição do Projeto**\nEste projeto consiste na construção de uma aplicação distribuída para troca de mensagens entre múltiplos clientes, conectados a um servidor central. A ideia principal é implementar um sistema no qual:\n- **Clientes**: Podem se conectar ao servidor, enviar mensagens e receber mensagens de outros clientes conectados.\n- **Servidor**: Atua como coordenador central, gerenciando conexões e retransmitindo as mensagens para todos os clientes conectados.\n\nA comunicação entre os componentes é baseada no **modelo cliente-servidor distribuído**, utilizando **sockets TCP**, o que garante uma conexão persistente e eficiente para a troca de mensagens em tempo real.\n\n---\n\n## **Diagrama**\nO diagrama abaixo ilustra a interação entre os componentes do sistema (clientes e servidor). Ele foi gerado utilizando a sintaxe [Mermaid](https://mermaid.js.org/).\n\n```mermaid \ngraph TD\n    Server[Server: Coordenador Central]\n    Client1[Client 1]\n    Client2[Client 2]\n    Client3[Client 3]\n\n    %% Connections\n    Client1 --\u003e|Manda mensagem| Server\n    Client2 --\u003e|Manda mensagem| Server\n    Client3 --\u003e|Manda mensagem| Server\n\n    Server --\u003e|Faz Broadcast da mensagem| Client1\n    Server --\u003e|Faz Broadcast da mensagem| Client2\n    Server --\u003e|Faz Broadcast da mensagem| Client3\n```\n\n---\n## **Setup Inicial**\n\n1. **Clone este projeto**: \n    - Execute o comando: \n      ```bash \n      git clone https://github.com/pedrolaraburu/sockets-bun\n      ``` \n\n2. **Instale o Bun**:\n   - Siga o guia de instalação no site oficial do [Bun](https://bun.sh/docs/installation).\n\n3. **Instale as dependências do projeto**:\n   - Execute o comando:\n     ```bash\n     bun install\n     ```\n\n4. **Estrutura de Arquivos do Projeto**:\n   - `src/server.ts`: Código do servidor.\n   - `src/client.ts`: Código do cliente.\n   - `docs/`: Pasta que contém imagens e diagrama em Mermaid.\n\n---\n\n## **Configuração do Sistema como um Sistema Distribuído**\n\n### **1. Configurando o Servidor com ngrok**\n1. **Instale o ngrok**:\n   - Siga o guia de instalação oficial do [ngrok](https://ngrok.com/docs/getting-started/).\n\n2. **Conecte sua conta ngrok**:\n   - Use o comando:\n     ```bash\n     ngrok config add-authtoken \u003cTOKEN\u003e\n     ```\n\n3. **Inicie o servidor TCP**:\n   - Execute o servidor com:\n     ```bash\n     bun run ./src/server.ts\n     ```\n\n4. **Exponha o servidor para a internet**:\n   - Inicie o ngrok para o servidor:\n     ```bash\n     ngrok tcp localhost:3000\n     ```\n   - O ngrok fornecerá um endereço público (hostname e porta) que permite que clientes na internet se conectem ao servidor.\n\n**OBSERVAÇÃO**\n- Como estamos tentando \"simular\" um sistema distribuído, é bom que você se conecte através de outro computador.\n\n**Exemplo:**\n- Hostname: `0.tcp.sa.ngrok.io`\n- Port: `16598`\n\nVeja abaixo como o ngrok deve aparecer:\n![Exemplo ngrok](./docs/ngrok.png)\n\n---\n\n### **2. Configurando o Cliente**\n1. Atualize o código do cliente (`client.ts`) com o hostname e a porta fornecidos pelo ngrok:\n   ```javascript\n   const client = Bun.connect({\n       hostname: \"0.tcp.sa.ngrok.io\", // Endereço fornecido pelo ngrok\n       port: 16598 // Porta fornecida pelo ngrok\n   });\n   ```\n\n2. Inicie o cliente:\n   ```bash\n   bun run ./src/client.ts\n   ```\n\n3. **Alternativa**: Você também pode usar o comando `telnet` para se conectar ao servidor diretamente pelo terminal:\n   ```bash\n   telnet 0.tcp.sa.ngrok.io 16598\n   ```\n\n---\n\n## **Fluxo de Execução**\n\n1. **Inicie o servidor**:\n   ```bash\n   bun run ./src/server.ts\n   ```\n\n2. **Exponha o servidor com o ngrok**:\n   ```bash\n   ngrok tcp localhost:3000\n   ```\n\n3. **Conecte clientes**:\n   - Atualize as configurações no cliente e execute:\n     ```bash\n     bun run ./src/client.ts\n     ```\n   - Ou use o comando `telnet` para testar a conexão.\n\n---\n\n## **Demonstração**\n- **Clientes Enviando Mensagens**:\n  - Cada cliente envia mensagens ao servidor.\n  - O servidor retransmite as mensagens para todos os outros clientes conectados.\n- **Broadcast pelo Servidor**:\n  - As mensagens são replicadas em tempo real para todos os clientes.\n- **[Vídeo demonstrativo](./docs/video-sockets.mp4)**\n  - O vídeo demonstra a visão do servidor, onde é possível visualizar todas as mensagens de todos os clientes passando.\n  - Os clientes também recebem as mensagens de outros clientes, visto que o servidor faz o broadcast dessa mensagem aos outros.\n  - *Os clientes que acessaram esse servidor se **conectaram por máquinas e redes diferentes***.\n\n---\n\u003cvideo width=\"600\" controls\u003e\n  \u003csource src=\"./docs/video-sockets.mp4\" type=\"video/mp4\"\u003e\n  Your browser does not support the video tag.\n\u003c/video\u003e","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpedrolaraburu%2Fsockets-bun","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpedrolaraburu%2Fsockets-bun","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpedrolaraburu%2Fsockets-bun/lists"}