Skip to main content
Integre o Mellowtel no seu aplicativo Electron multiplataforma para permitir que os usuários compartilhem sua largura de banda de internet não utilizada em troca de recompensas ou recursos premium. O SDK Electron funciona em qualquer lugar onde o Electron funciona (macOS, Windows e Linux).
O consentimento do usuário é obrigatório. O SDK só opera quando o usuário optou explicitamente. init() retorna silenciosamente cedo quando não há consentimento registrado, então se você ver o SDK iniciar sem erros, mas nunca enviar tráfego, a razão mais provável é que o usuário ainda não optou.

Pré-requisitos

  • Uma conta Mellowtel e chave de configuração (obtenha a sua no painel de controle).
  • Um aplicativo Electron com acesso ao processo principal.

Instalação

1. Instale o Pacote

A partir da raiz do seu projeto, instale o SDK Electron:

2. Adicione ao Seu Código

No arquivo de processo principal do seu Electron (normalmente main.ts ou main.js), importe o SDK, opcionalmente chame setupMellowtelApp() antes do app estar pronto, instancie o Mellowtel com sua chave de configuração, solicite consentimento do usuário e então chame init() para iniciar o serviço.
Substitua YOUR_CONFIGURATION_KEY pela chave do seu painel de controle Mellowtel.
O que cada chamada faz:
  • new Mellowtel(configurationKey, options?) instancia o SDK. A única opção disponível hoje é disableLogs, que por padrão é true. Defina como false durante a integração para ver o estado da conexão e a atividade de requisição no seu terminal.
  • requestConsent(window, incentive) renderiza uma caixa de mensagem nativa do Electron ancorada ao BrowserWindow que você passa. O segundo argumento é o título proeminente do diálogo (por exemplo, "Ganhe 3 meses grátis"), mostrado acima de uma explicação fixa do que o Mellowtel faz. Resolve para true se o usuário aceitar, false se o usuário recusar ou fechar o diálogo, e undefined se o consentimento já estiver registrado. O SDK persiste a decisão de opt-in automaticamente, então você não precisa chamar optIn() depois.
  • init() lança exceção apenas quando configurationKey está vazio. Se o usuário não optou, ele registra e retorna silenciosamente. Caso contrário, ele abre um WebSocket para o backend do Mellowtel. A chamada não bloqueia a UI do renderizador, então as janelas permanecem responsivas enquanto a conexão é estabelecida.

Prevenindo interrupções de diálogos do sistema (recomendado)

O SDK vem com um auxiliar opcional, setupMellowtelApp(), que configura flags de linha de comando do Electron para suprimir diálogos do sistema (popups de preenchimento automático, barras de tradução, prompts de autenticação NTLM / Kerberos, integração com gerenciadores de senha, sobreposições de mídia, diálogos de primeira execução) que de outra forma interromperiam seus usuários quando os processos ocultos do Mellowtel processam requisições em segundo plano. Chame-o no topo do seu arquivo de processo principal, antes de app.whenReady(), e importe-o junto com a exportação padrão de mellowtel-electron. Veja o README original para o uso canônico.

Consentimento do Usuário

Exibir um diálogo de consentimento é obrigatório. Você deve permitir que os usuários optem explicitamente antes de chamar init(), e deve fornecer uma maneira para eles gerenciarem seu estado de opt-in a qualquer momento.
Você tem dois caminhos para lidar com o consentimento:
  1. Use o diálogo nativo embutido via requestConsent(window, incentive). Este é o caminho mais rápido e é o que o snippet acima mostra. Ele renderiza um dialog.showMessageBox nativo do Electron com sua cópia de incentivo como título e persiste a decisão do usuário automaticamente.
  2. Construa sua própria UI de consentimento e controle o SDK através de optIn(), optOut(), e getOptInStatus(). Use isso se você quiser personalização de marca, explicações mais ricas, ou localização além do que o diálogo nativo oferece.

O que seu diálogo de consentimento deve incluir

1

Explique o que o Mellowtel faz

Use linguagem simples. Exemplo: “Este app usa o Mellowtel para compartilhar sua largura de banda de internet não utilizada. Em troca, você recebe [benefício/recurso]. Você pode optar por sair a qualquer momento nas configurações.”
2

Dê aos usuários uma escolha clara

Inclua opções distintas de Aceitar e Recusar.
3

Link para políticas

Permitir que os usuários alterem seu consentimento posteriormente

O Mellowtel fornece um diálogo de configurações embutido via showConsentSettings(window). Ele renderiza um diálogo nativo com botões de Opt In / Opt Out que correspondem ao estado atual do usuário, e internamente chama optIn() ou optOut() (além de reconectar o WebSocket no opt-in) quando o usuário alterna. Conecte-o a um item de menu ou botão de configurações no seu app para que os usuários possam revisar sua escolha. Se você preferir construir sua própria tela de configurações, chame getOptInStatus() para ler o estado atual e optIn() / optOut() para alterá-lo.

Referência de Métodos

A classe Mellowtel expõe os seguintes métodos públicos. Todos estão disponíveis na instância que você criou com new Mellowtel(configurationKey, options?). Ciclo de Vida
  • init(): Promise<void> inicia o serviço se o usuário optou, ou retorna silenciosamente cedo se não. Lança exceção apenas quando a chave de configuração está vazia.
  • shutdown(): Promise<void> limpa os recursos do SDK quando o aplicativo está fechando. Fecha o WebSocket, destrói janelas de trabalho ocultas e limpa temporizadores de fundo. Preserva a preferência de opt-in do usuário.
  • requestConsent(window: BrowserWindow, incentive: string): Promise<boolean | undefined> mostra o diálogo de consentimento nativo embutido e persiste o resultado. Retorna true ao aceitar, false ao recusar ou fechar, undefined se o consentimento já foi dado.
  • showConsentSettings(window: BrowserWindow): Promise<void> mostra o diálogo de gerenciamento de consentimento embutido. O SDK lida com as transições de opt-in / opt-out internamente quando o usuário alterna sua escolha.
Controle manual de opt-in
  • optIn(): Promise<void> marca o usuário como optado sem mostrar um diálogo. Use isso apenas após coletar consentimento através da sua própria UI.
  • optOut(): Promise<void> marca o usuário como não optado e realiza uma limpeza completa (mesmos recursos que shutdown(), além de limpar a preferência de consentimento salva). Não há necessidade de chamar shutdown() depois.
  • getOptInStatus(): boolean | undefined retorna o estado atual de opt-in, ou undefined se o usuário nunca fez uma escolha.
  • getNodeId(): string retorna o identificador de nó do Mellowtel para esta instalação. Útil ao registrar tickets de suporte.
Contadores de requisição As contagens de requisição são persistidas localmente através do electron-store e sobrevivem a reinicializações do app. Exiba-as na sua própria UI se quiser mostrar aos usuários o impacto do seu opt-in.
  • getTotalRequestCount(): number retorna o total de requisições processadas desde a instalação.
  • getDailyRequestCount(): number retorna o número de requisições processadas hoje.
  • getRequestCountForDate(date: string): number retorna a contagem para uma data específica YYYY-MM-DD.
  • getDailyRequestsHistory(): { [date: string]: number } retorna cada contagem diária como um mapa.
  • getRequestCountsInRange(startDate: string, endDate: string): { [date: string]: number } retorna contagens para um intervalo de datas.
  • getRequestCounts(): { total: number; daily: number; dailyHistory: { [date: string]: number } } retorna todos os três contadores em uma chamada.

Ciclo de Vida e Encerramento do App

Após processar sua primeira requisição, o Mellowtel pode criar janelas de trabalho ocultas do Electron. Aplicativos host devem chamar shutdown() quando o aplicativo estiver realmente fechando. shutdown():
  • Fecha a conexão WebSocket.
  • Destrói janelas de trabalho ocultas.
  • Limpa temporizadores de fundo e recursos de rede.
  • Preserva a preferência de opt-in do usuário.
shutdown() vs optOut(): shutdown() é a limpeza do ciclo de vida do aplicativo — o consentimento é preservado. optOut() retira o consentimento do usuário e limpa todos os recursos. Não confunda os dois.

Aplicativos de janela única

Chame shutdown() quando a janela principal do aplicativo fechar:
Não confie apenas no evento window-all-closed do Electron porque as janelas de trabalho ocultas do Mellowtel podem impedir que ele seja disparado.

Aplicativos de bandeja

Não chame shutdown() ao apenas ocultar a janela para a bandeja do sistema. Chame-o a partir da ação de Sair explícita:

Aplicativos macOS

Se o aplicativo permanecer ativo após suas janelas fecharem, chame shutdown() apenas quando o usuário realmente sair do aplicativo.

Optando por sair

optOut() já realiza uma limpeza completa:
Não há necessidade de chamar shutdown() depois. Ao contrário de shutdown(), optOut() também altera a preferência de consentimento salva.

Iniciando novamente

Após shutdown() ou optOut(), o Mellowtel pode ser iniciado novamente:

Persistência de Consentimento

O estado de opt-in é armazenado no caminho de configuração padrão da plataforma electron-store:
  • macOS: ~/Library/Application Support/<YourAppName>/config.json
  • Windows: %APPDATA%\<YourAppName>\config.json
  • Linux: ~/.config/<YourAppName>/config.json
O estado sobrevive a atualizações do app. Desinstalar seu app não o limpará automaticamente, a menos que seu desinstalador remova explicitamente o diretório de configuração do app.

Solução de Problemas

  1. Confirme que você está instalando mellowtel-electron (não um nome de pacote do GitHub Packages com escopo).
  2. Limpe o cache do npm e tente novamente executando npm cache clean --force seguido de npm install mellowtel-electron.
  1. Certifique-se de chamar requestConsent após app.whenReady() ter sido resolvido e com uma referência válida e não destruída de BrowserWindow.
  2. Se você usar setupMellowtelApp(), verifique se ele é chamado antes de app.whenReady(), não depois.
Isto é por design. init() retorna silenciosamente cedo quando o usuário não optou. Verifique getOptInStatus() para confirmar. Se retornar undefined ou false, execute requestConsent primeiro. Note que o log interno “Usuário não optou” é suprimido quando disableLogs é deixado em seu padrão (veja “Logs estão silenciosos” abaixo), então o terminal não dá nenhum sinal de qualquer forma até você alterar essa configuração.
A opção de construtor disableLogs tem como padrão true. Passe { disableLogs: false } como o segundo argumento para o construtor durante a integração para exibir o estado da conexão e a atividade de requisição no seu terminal. Esta também é a maneira mais rápida de distinguir um “não optado” silencioso de uma falha real de conexão.

Tempo estimado para completar: 10-15 minutos. Se precisar de ajuda ou tiver feedback, entre em contato conosco em info@mellowtel.com ou junte-se à nossa comunidade no Discord.