Pré-requisitos
- Uma conta Mellowtel e chave de configuração (obtenha a sua no painel).
- Um aplicativo Electron com acesso ao processo principal.
Instalação
1. Instale o Pacote
A partir do diretório raiz do seu projeto, instale o SDK do Electron:2. Adicione ao Seu Código
No arquivo de processo principal do seu Electron (geralmentemain.ts ou main.js), importe o SDK, opcionalmente chame setupMellowtelApp() antes do aplicativo 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 Mellowtel.new Mellowtel(configurationKey, options?)instancia o SDK. A única opção disponível hoje édisableLogs, que por padrão étrue. Defina comofalseenquanto integra para ver o estado da conexão e a atividade de solicitações no seu terminal.requestConsent(window, incentive)renderiza uma caixa de mensagem nativa do Electron ancorada àBrowserWindowque 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 por participar, ele registra e retorna sem iniciar. Caso contrário, conecta-se ao Mellowtel para começar a processar solicitações. A chamada não bloqueia a UI do renderizador, então as janelas permanecem responsivas enquanto a conexão é estabelecida.
Opcional: reduza prompts inesperados do SO
O SDK vem com um auxiliar opcional,setupMellowtelApp(), que reduz prompts inesperados do SO (popups de preenchimento automático, barras de tradução, sobreposições de mídia, diálogos de primeira execução) durante o trabalho de solicitações em segundo plano.
Essas flags se aplicam a todo o processo do Electron, não apenas ao Mellowtel. Pule o auxiliar se seu produto depender de prompts nativos de autenticação ou UI de gerenciadores de senhas.
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 seu texto de incentivo como título e persiste automaticamente a decisão do usuário. - 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 aplicativo 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.
Permita 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 ao Mellowtel no opt-in) quando o usuário alterna. Conecte-o a um item de menu ou botão de configurações no seu aplicativo para que os usuários possam revisar sua escolha.
Se 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 por participar, ou retorna sem iniciar 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 a conexão com o Mellowtel, libera janelas de solicitação isoladas e limpa timers em segundo plano. 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 embutido de gerenciamento de consentimento. O SDK lida com as transições de opt-in / opt-out internamente quando o usuário altera 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 de 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 aplicativo. Exiba-as na sua própria UI se quiser mostrar aos usuários o impacto de seu opt-in.
getTotalRequestCount(): numberretorna o total de solicitações processadas desde a instalação.getDailyRequestCount(): numberretorna o número de solicitaçõ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 única chamada.
Ciclo de Vida e Fechamento do App
Após a primeira solicitação, o SDK pode manter BrowserWindows isolados e fora da tela para trabalho em segundo plano. Essas janelas não têm acesso à sessão do usuário ou aos dados do seu aplicativo. Aplicativos host devem chamarshutdown() quando o aplicativo estiver realmente fechando para que esses trabalhadores sejam liberados.
shutdown():
- Fecha a conexão com o Mellowtel.
- Libera janelas de solicitação isoladas.
- Limpa timers em segundo plano.
- 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. Trabalhadores em segundo plano podem impedir que ele seja disparado, então trate um encerramento explícito (ou o manipulador closed da janela principal acima) como o sinal para chamar shutdown().
Aplicativos de bandeja
Não chameshutdown() quando a janela estiver apenas minimizada para a bandeja do sistema. Chame-o a partir da ação de Encerrar explícita:
Aplicativos macOS
Se o aplicativo permanecer ativo após suas janelas fecharem, chameshutdown() apenas quando o usuário realmente encerrar o 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 opt-in é armazenado na configuração normal do Electron do seu aplicativo (o mesmo localelectron-store que outras configurações do aplicativo):
- 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
requestConsentdepois queapp.whenReady()foi resolvido e com umBrowserWindowválido que ainda está aberto. - 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"
Isso é por design.
init() retorna sem iniciar quando o usuário não optou por participar. Verifique getOptInStatus() para confirmar. Se retornar undefined ou false, execute requestConsent primeiro. A mensagem “Usuário não optou por participar” não é impressa quando disableLogs é deixado em seu padrão (veja “Sem logs no terminal” abaixo), então o terminal não dá sinal de qualquer forma até você mudar essa flag.Sem logs no terminal
Sem logs no terminal
A opção de construtor
disableLogs por padrão é true. Passe { disableLogs: false } como o segundo argumento para o construtor enquanto integra para exibir o estado da conexão e a atividade de solicitações no seu terminal. Esta também é a maneira mais rápida de distinguir um “não optado” no-op (veja acima) 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.