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 (normalmentemain.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.new Mellowtel(configurationKey, options?)instancia o SDK. A única opção disponível hoje édisableLogs, que por padrão étrue. Defina comofalsedurante 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 aoBrowserWindowque 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 paratruese o usuário aceitar,falsese o usuário recusar ou fechar o diálogo, eundefinedse o consentimento já estiver registrado. O SDK persiste a decisão de opt-in automaticamente, então você não precisa chamaroptIn()depois.init()lança exceção apenas quandoconfigurationKeyestá 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
Você tem dois caminhos para lidar com o consentimento:- 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 umdialog.showMessageBoxnativo do Electron com sua cópia de incentivo como título e persiste a decisão do usuário automaticamente. - Construa sua própria UI de consentimento e controle o SDK através de
optIn(),optOut(), egetOptInStatus(). 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
Inclua links para os Termos de Serviço e Política de Privacidade.
Permitir que os usuários alterem seu consentimento posteriormente
O Mellowtel fornece um diálogo de configurações embutido viashowConsentSettings(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 classeMellowtel 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. Retornatrueao aceitar,falseao recusar ou fechar,undefinedse 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.
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 queshutdown(), além de limpar a preferência de consentimento salva). Não há necessidade de chamarshutdown()depois.getOptInStatus(): boolean | undefinedretorna o estado atual de opt-in, ouundefinedse o usuário nunca fez uma escolha.getNodeId(): stringretorna o identificador de nó do Mellowtel para esta instalação. Útil ao registrar tickets de suporte.
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(): numberretorna o total de requisições processadas desde a instalação.getDailyRequestCount(): numberretorna o número de requisições processadas hoje.getRequestCountForDate(date: string): numberretorna a contagem para uma data específicaYYYY-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 chamarshutdown() 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.
Aplicativos de janela única
Chameshutdown() quando a janela principal do aplicativo fechar:
window-all-closed do Electron porque as janelas de trabalho ocultas do Mellowtel podem impedir que ele seja disparado.
Aplicativos de bandeja
Não chameshutdown() 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, chameshutdown() apenas quando o usuário realmente sair do aplicativo.
Optando por sair
optOut() já realiza uma limpeza completa:
shutdown() depois. Ao contrário de shutdown(), optOut() também altera a preferência de consentimento salva.
Iniciando novamente
Apósshutdown() 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 plataformaelectron-store:
- macOS:
~/Library/Application Support/<YourAppName>/config.json - Windows:
%APPDATA%\<YourAppName>\config.json - Linux:
~/.config/<YourAppName>/config.json
Solução de Problemas
Erro "Pacote não encontrado" durante a instalação
Erro "Pacote não encontrado" durante a instalação
- Confirme que você está instalando
mellowtel-electron(não um nome de pacote do GitHub Packages com escopo). - Limpe o cache do npm e tente novamente executando
npm cache clean --forceseguido denpm install mellowtel-electron.
O diálogo de consentimento nunca aparece
O diálogo de consentimento nunca aparece
- Certifique-se de chamar
requestConsentapósapp.whenReady()ter sido resolvido e com uma referência válida e não destruída deBrowserWindow. - Se você usar
setupMellowtelApp(), verifique se ele é chamado antes deapp.whenReady(), não depois.
"init() executa sem erros, mas nada acontece"
"init() executa sem erros, mas nada acontece"
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.Logs estão silenciosos
Logs estão silenciosos
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.