Skip to main content
Интегрируйте Mellowtel в ваше кроссплатформенное приложение на Electron, чтобы пользователи могли делиться неиспользованной пропускной способностью интернета в обмен на вознаграждения или премиум-функции. Electron SDK работает везде, где работает Electron (macOS, Windows и Linux).
Согласие пользователя обязательно. SDK работает только тогда, когда пользователь явно согласился. init() тихо завершает работу, если согласие не получено, поэтому если вы видите, что SDK запускается без ошибок, но никогда не отправляет трафик, скорее всего, пользователь еще не дал согласие.

Предварительные требования

  • Аккаунт Mellowtel и ключ конфигурации (получите его на панели управления).
  • Приложение на Electron с доступом к основному процессу.

Установка

1. Установите пакет

Из корня вашего проекта установите Electron SDK:

2. Добавьте в ваш код

В вашем файле основного процесса Electron (обычно main.ts или main.js) импортируйте SDK, при необходимости вызовите setupMellowtelApp() до готовности приложения, создайте экземпляр Mellowtel с вашим ключом конфигурации, запросите согласие у пользователя, а затем вызовите init(), чтобы запустить сервис.
Замените YOUR_CONFIGURATION_KEY на ключ из вашей панели управления Mellowtel.
Что делает каждый вызов:
  • new Mellowtel(configurationKey, options?) создает экземпляр SDK. Единственная доступная на сегодня опция — это disableLogs, которая по умолчанию установлена в true. Установите ее в false во время интеграции, чтобы видеть состояние соединения и активность запросов в вашем терминале.
  • requestConsent(window, incentive) отображает родной диалоговое окно Electron, привязанное к переданному вами BrowserWindow. Второй аргумент — это заметный заголовок диалога (например, "Получите 3 месяца бесплатно"), отображаемый над фиксированным объяснением того, что делает Mellowtel. Возвращает true, если пользователь принимает, false, если пользователь отклоняет или закрывает диалог, и undefined, если согласие уже получено. SDK автоматически сохраняет решение о согласии, поэтому вам не нужно вызывать optIn() после этого.
  • init() выдает ошибку только тогда, когда configurationKey пуст. Если пользователь не дал согласие, он записывает лог и тихо возвращается. В противном случае он открывает WebSocket к бэкенду Mellowtel. Вызов не блокирует UI рендерера, поэтому окна остаются отзывчивыми, пока устанавливается соединение.

Предотвращение прерываний системными диалогами (рекомендуется)

SDK поставляется с необязательным помощником, setupMellowtelApp(), который настраивает флаги командной строки Electron для подавления системных диалогов (всплывающие окна автозаполнения, панели перевода, запросы аутентификации NTLM / Kerberos, интеграция с менеджером паролей, оверлеи медиа, диалоги первого запуска), которые в противном случае прерывали бы ваших пользователей, когда скрытые окна Mellowtel обрабатывают запросы в фоновом режиме. Вызовите его в начале вашего файла основного процесса, до app.whenReady(), и импортируйте его вместе с экспортом по умолчанию из mellowtel-electron. См. основной README для канонического использования.

Согласие пользователя

Отображение диалога согласия обязательно. Вы должны позволить пользователям явно согласиться перед вызовом init(), и вы должны предоставить способ управлять их состоянием согласия в любое время.
У вас есть два пути для обработки согласия:
  1. Используйте встроенный родной диалог через requestConsent(window, incentive). Это самый быстрый путь, и это то, что показано в приведенном выше фрагменте. Он отображает родной dialog.showMessageBox Electron с вашим текстом мотивации в качестве заголовка и автоматически сохраняет решение пользователя.
  2. Создайте свой собственный интерфейс согласия и управляйте SDK через optIn(), optOut() и getOptInStatus(). Используйте это, если вы хотите настроить брендинг, более богатые объяснения или локализацию, выходящую за рамки того, что предлагает родной диалог.

Что должно включать ваше диалоговое окно согласия

1

Объясните, что делает Mellowtel

Используйте простой язык. Пример: “Это приложение использует Mellowtel для обмена неиспользованной пропускной способностью вашего интернета. Взамен вы получаете [преимущество/функцию]. Вы можете отказаться в любое время в настройках.”
2

Предоставьте пользователям ясный выбор

Включите четкие варианты Принять и Отклонить.
3

Ссылка на политики

Позвольте пользователям изменить свое согласие позже

Mellowtel предоставляет встроенный диалог настроек через showConsentSettings(window). Он отображает родной диалог с кнопками Opt In / Opt Out, которые соответствуют текущему состоянию пользователя, и внутренне вызывает optIn() или optOut() (плюс повторное подключение WebSocket при согласии), когда пользователь переключает свой выбор. Подключите его к элементу меню или кнопке настроек в вашем приложении, чтобы пользователи могли пересмотреть свой выбор. Если вы предпочитаете создать свой собственный экран настроек, вызовите getOptInStatus(), чтобы прочитать текущее состояние, и optIn() / optOut(), чтобы изменить его.

Справочник по методам

Класс Mellowtel предоставляет следующие публичные методы. Все они доступны в экземпляре, созданном с помощью new Mellowtel(configurationKey, options?). Жизненный цикл
  • init(): Promise<void> запускает сервис, если пользователь дал согласие, или тихо завершает работу, если нет. Выдает ошибку только тогда, когда ключ конфигурации пуст.
  • shutdown(): Promise<void> очищает ресурсы SDK при закрытии приложения. Закрывает WebSocket, уничтожает скрытые окна рабочих процессов и очищает фоновые таймеры. Сохраняет предпочтение пользователя о согласии.
  • requestConsent(window: BrowserWindow, incentive: string): Promise<boolean | undefined> отображает встроенный родной диалог согласия и сохраняет результат. Возвращает true при принятии, false при отклонении или закрытии, undefined, если согласие уже было дано.
  • showConsentSettings(window: BrowserWindow): Promise<void> отображает встроенный диалог управления согласием. SDK обрабатывает переходы opt-in / opt-out внутренне, когда пользователь переключает свой выбор.
Ручное управление согласием
  • optIn(): Promise<void> помечает пользователя как давшего согласие без отображения диалога. Используйте это только после получения согласия через ваш собственный интерфейс.
  • optOut(): Promise<void> помечает пользователя как отказавшегося и выполняет полную очистку (те же ресурсы, что и shutdown(), плюс очистка сохраненного предпочтения согласия). Нет необходимости вызывать shutdown() после этого.
  • getOptInStatus(): boolean | undefined возвращает текущее состояние согласия, или undefined, если пользователь никогда не делал выбор.
  • getNodeId(): string возвращает идентификатор узла Mellowtel для этой установки. Полезно при подаче заявок в службу поддержки.
Счетчики запросов Количество запросов сохраняется локально через electron-store и сохраняется при перезапусках приложения. Отобразите их в вашем собственном интерфейсе, если хотите показать пользователям влияние их согласия.
  • getTotalRequestCount(): number возвращает общее количество обработанных запросов с момента установки.
  • getDailyRequestCount(): number возвращает количество запросов, обработанных сегодня.
  • getRequestCountForDate(date: string): number возвращает количество для конкретной даты YYYY-MM-DD.
  • getDailyRequestsHistory(): { [date: string]: number } возвращает каждое ежедневное количество в виде карты.
  • getRequestCountsInRange(startDate: string, endDate: string): { [date: string]: number } возвращает количество для диапазона дат.
  • getRequestCounts(): { total: number; daily: number; dailyHistory: { [date: string]: number } } возвращает все три счетчика в одном вызове.

Жизненный цикл и завершение работы приложения

После обработки первого запроса Mellowtel может создать скрытые окна рабочих процессов Electron. Хост-приложения должны вызывать shutdown(), когда приложение действительно закрывается. shutdown():
  • Закрывает соединение WebSocket.
  • Уничтожает скрытые окна рабочих процессов.
  • Очищает фоновые таймеры и сетевые ресурсы.
  • Сохраняет предпочтение пользователя о согласии.
shutdown() против optOut(): shutdown() — это очистка жизненного цикла приложения — согласие сохраняется. optOut() отзывает согласие пользователя и очищает все ресурсы. Не путайте их.

Однооконные приложения

Вызовите shutdown(), когда основное окно приложения закрывается:
Не полагайтесь только на событие window-all-closed Electron, так как скрытые окна рабочих процессов Mellowtel могут предотвратить его срабатывание.

Приложения в трее

Не вызывайте shutdown(), когда просто скрываете окно в системный трей. Вызовите его из явного действия Quit:

Приложения для macOS

Если приложение остается активным после закрытия окон, вызывайте shutdown() только тогда, когда пользователь действительно завершает работу приложения.

Отказ от участия

optOut() уже выполняет полную очистку:
Нет необходимости вызывать shutdown() после этого. В отличие от shutdown(), optOut() также изменяет сохраненное предпочтение согласия.

Повторный запуск

После shutdown() или optOut() Mellowtel можно запустить снова:

Сохранение согласия

Состояние согласия хранится в стандартном для платформы пути конфигурации electron-store:
  • macOS: ~/Library/Application Support/<YourAppName>/config.json
  • Windows: %APPDATA%\<YourAppName>\config.json
  • Linux: ~/.config/<YourAppName>/config.json
Состояние сохраняется при обновлениях приложения. Удаление вашего приложения не очистит его автоматически, если только ваш деинсталлятор явно не удалит каталог конфигурации приложения.

Устранение неполадок

  1. Убедитесь, что вы устанавливаете mellowtel-electron (а не имя пакета GitHub Packages).
  2. Очистите кэш npm и повторите попытку, выполнив npm cache clean --force, а затем npm install mellowtel-electron.
  1. Убедитесь, что вы вызываете requestConsent после того, как app.whenReady() разрешен, и с действительной, не уничтоженной ссылкой BrowserWindow.
  2. Если вы используете setupMellowtelApp(), убедитесь, что он вызывается до app.whenReady(), а не после.
Это по дизайну. init() тихо завершает работу, если пользователь не дал согласие. Проверьте getOptInStatus(), чтобы подтвердить. Если он возвращает undefined или false, сначала выполните requestConsent. Обратите внимание, что внутренний лог “Пользователь не дал согласие” подавляется, когда disableLogs оставлен по умолчанию (см. “Логи молчат” ниже), поэтому терминал не дает вам сигнала в любом случае, пока вы не измените этот флаг.
Опция конструктора disableLogs по умолчанию установлена в true. Передайте { disableLogs: false } в качестве второго аргумента конструктору во время интеграции, чтобы увидеть состояние соединения и активность запросов в вашем терминале. Это также самый быстрый способ отличить “не дано согласие” тихий no-op (см. выше) от реальной ошибки соединения.

Оценочное время завершения: 10-15 минут. Если вам нужна помощь или у вас есть отзывы, свяжитесь с нами по адресу info@mellowtel.com или присоединяйтесь к нашему сообществу в Discord.