summaryrefslogtreecommitdiffstats
path: root/pt-br/news/cli-daemon-rpc/index.html
blob: 3b439615a949d9d9118c641e5844e59b87ea096a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>CLI Encontra a Rede: Comandos Publish, Fetch e Status — Tesseras</title>
    <meta name="description" content="O CLI do tesseras agora pode publicar tesseras na rede, buscá-las de peers e monitorar o estado de replicação — tudo através de uma nova ponte RPC via socket Unix para o daemon.">
    <!-- Open Graph -->
    <meta property="og:type" content="article">
    <meta property="og:title" content="CLI Encontra a Rede: Comandos Publish, Fetch e Status">
    <meta property="og:description" content="O CLI do tesseras agora pode publicar tesseras na rede, buscá-las de peers e monitorar o estado de replicação — tudo através de uma nova ponte RPC via socket Unix para o daemon.">
    <meta property="og:image" content="https://tesseras.net/images/social.jpg">
    <meta property="og:image:width" content="1200">
    <meta property="og:image:height" content="630">
    <meta property="og:site_name" content="Tesseras">
    <!-- Twitter Card -->
    <meta name="twitter:card" content="summary_large_image">
    <meta name="twitter:title" content="CLI Encontra a Rede: Comandos Publish, Fetch e Status">
    <meta name="twitter:description" content="O CLI do tesseras agora pode publicar tesseras na rede, buscá-las de peers e monitorar o estado de replicação — tudo através de uma nova ponte RPC via socket Unix para o daemon.">
    <meta name="twitter:image" content="https://tesseras.net/images/social.jpg">
    <link rel="stylesheet" href="https://tesseras.net/style.css?h=21f0f32121928ee5c690">
    
        
            <link rel="alternate" type="application/atom+xml" title="Tesseras" href="https://tesseras.net/atom.xml">
        
    
    <link rel="icon" type="image/png" sizes="32x32" href="https://tesseras.net/images/favicon.png?h=be4e123a23393b1a027d">
    
</head>
<body>
    <header>
        <h1>
            <a href="https:&#x2F;&#x2F;tesseras.net/pt-br/">
                <img src="https://tesseras.net/images/logo-64.png?h=c1b8d0c4c5f93b49d40b" alt="Tesseras" width="40" height="40" class="logo">
                Tesseras
            </a>
        </h1>
        <nav>
            
                <a href="https://tesseras.net/pt-br/about/">Sobre</a>
                <a href="https://tesseras.net/pt-br/news/">Notícias</a>
                <a href="https://tesseras.net/pt-br/releases/">Lançamentos</a>
                <a href="https://tesseras.net/pt-br/faq/">FAQ</a>
                <a href="https://tesseras.net/pt-br/subscriptions/">Inscrições</a>
                <a href="https://tesseras.net/pt-br/contact/">Contato</a>
            
        </nav>
        <nav class="lang-switch">
            
                <a href="https:&#x2F;&#x2F;tesseras.net&#x2F;news&#x2F;cli-daemon-rpc&#x2F;">English</a> | <strong>Português</strong>
            
        </nav>
    </header>

    <main>
        
<article>
    <h2>CLI Encontra a Rede: Comandos Publish, Fetch e Status</h2>
    <p class="news-date">2026-02-15</p>
    <p>Até agora o CLI operava isoladamente: criar uma tessera, verificar, exportar,
listar o que você tem. Tudo ficava na sua máquina. Com esta atualização, o <code>tes</code>
ganha três comandos que fazem a ponte entre o armazenamento local e a rede P2P —
<code>publish</code>, <code>fetch</code> e <code>status</code> — comunicando-se com um <code>tesd</code> em execução através
de um socket Unix.</p>
<h2 id="o-que-foi-construido">O que foi construído</h2>
<p><strong>Crate <code>tesseras-rpc</code></strong> — Um novo crate compartilhado entre CLI e daemon.
Define o protocolo RPC usando serialização MessagePack com enquadramento
prefixado por tamanho (cabeçalho big-endian de 4 bytes, máximo de 64 MiB). Três
tipos de requisição (<code>Publish</code>, <code>Fetch</code>, <code>Status</code>) e suas respostas
correspondentes. Um <code>DaemonClient</code> síncrono gerencia a conexão do socket Unix
com timeouts configuráveis. O protocolo é deliberadamente simples — uma
requisição, uma resposta, conexão fechada — para manter a implementação
auditável.</p>
<p><strong><code>tes publish &lt;hash&gt;</code></strong> — Publica uma tessera na rede. Aceita hashes completos
ou prefixos curtos (ex.: <code>tes publish a1b2</code>), que são resolvidos no banco de
dados local. O daemon lê todos os arquivos da tessera do armazenamento, empacota
em um único buffer MessagePack e entrega ao motor de replicação. Tesseras
pequenas (&lt; 4 MB) são replicadas como um único fragmento; maiores passam por
codificação de apagamento Reed-Solomon. A saída mostra o hash curto e a contagem
de fragmentos:</p>
<pre><code>Published tessera 9f2c4a1b (24 fragments created)
Distribution in progress — use `tes status 9f2c4a1b` to track.
</code></pre>
<p><strong><code>tes fetch &lt;hash&gt;</code></strong> — Busca uma tessera da rede usando o hash de conteúdo
completo. O daemon coleta fragmentos disponíveis localmente, reconstrói os dados
originais via decodificação de apagamento se necessário, desempacota os arquivos
e armazena no CAS (content-addressable store). Retorna o número de memórias e o
tamanho total buscado.</p>
<p><strong><code>tes status &lt;hash&gt;</code></strong> — Exibe a saúde de replicação de uma tessera. A saída
mapeia diretamente o modelo interno de saúde do motor de replicação:</p>
<table><thead><tr><th>Estado</th><th>Significado</th></tr></thead><tbody>
<tr><td>Local</td><td>Ainda não publicada — existe apenas na sua máquina</td></tr>
<tr><td>Publishing</td><td>Fragmentos sendo distribuídos, redundância crítica</td></tr>
<tr><td>Replicated</td><td>Distribuída, mas abaixo da redundância alvo</td></tr>
<tr><td>Healthy</td><td>Redundância completa alcançada</td></tr>
</tbody></table>
<p><strong>Listener RPC no daemon</strong> — O daemon agora escuta em um socket Unix (padrão:
<code>$XDG_RUNTIME_DIR/tesseras/daemon.sock</code>) com permissões de diretório adequadas
(0700), limpeza de sockets obsoletos e shutdown gracioso. Cada conexão é tratada
em uma task Tokio — o listener converte o stream assíncrono para I/O síncrono
para a camada de enquadramento, despacha para o handler RPC e escreve a resposta
de volta.</p>
<p><strong>Pack/unpack no <code>tesseras-core</code></strong> — Um módulo pequeno que serializa uma lista
de entradas de arquivo (caminho + dados) em um único buffer MessagePack e
vice-versa. Esta é a ponte entre a estrutura de diretórios da tessera e os blobs
opacos do motor de replicação.</p>
<h2 id="decisoes-de-arquitetura">Decisões de arquitetura</h2>
<ul>
<li><strong>Socket Unix ao invés de TCP</strong>: a comunicação RPC entre CLI e daemon acontece
na mesma máquina. Sockets Unix são mais rápidos, não precisam de alocação de
porta, e as permissões do sistema de arquivos fornecem controle de acesso sem
TLS.</li>
<li><strong>MessagePack ao invés de JSON</strong>: o mesmo formato wire usado em todo o
Tesseras. Compacto, sem schema, e já é uma dependência do workspace. Uma
ida-e-volta típica de publish request/response ocupa menos de 200 bytes.</li>
<li><strong>Cliente síncrono, daemon assíncrono</strong>: o <code>DaemonClient</code> usa I/O bloqueante
porque o CLI não precisa de concorrência — envia uma requisição e espera. O
listener do daemon é assíncrono (Tokio) para tratar múltiplas conexões. A
camada de enquadramento funciona com qualquer impl <code>Read</code>/<code>Write</code>, conectando
ambos os mundos.</li>
<li><strong>Resolução de prefixo no lado do cliente</strong>: <code>publish</code> e <code>status</code> resolvem
prefixos curtos localmente antes de enviar o hash completo ao daemon. Isso
mantém o daemon stateless — ele não precisa acessar o banco de dados do CLI.</li>
<li><strong>Alinhamento do diretório de dados padrão</strong>: o padrão do CLI mudou de
<code>~/.tesseras</code> para <code>~/.local/share/tesseras</code> (via <code>dirs::data_dir()</code>) para
coincidir com o daemon. Um aviso de migração é exibido quando dados no caminho
antigo são detectados.</li>
</ul>
<h2 id="proximos-passos">Próximos passos</h2>
<ul>
<li><strong>Contagem de peers no DHT</strong>: o comando <code>status</code> atualmente reporta 0 peers —
conectar a contagem real do DHT é o próximo passo</li>
<li><strong><code>tes show</code></strong>: exibir o conteúdo de uma tessera (memórias, metadados) sem
exportar</li>
<li><strong>Fetch com streaming</strong>: para tesseras grandes, transmitir fragmentos conforme
chegam ao invés de esperar por todos</li>
</ul>

</article>

    </main>

    <footer>
        <p>&copy; 2026 Tesseras Project. <a href="/atom.xml">News Feed</a> · <a href="https://git.sr.ht/~ijanc/tesseras">Source</a></p>
    </footer>
</body>
</html>