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 на upstream для канонічного використання.

Згода користувача

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

Що має включати ваш діалог згоди

1

Поясніть, що робить Mellowtel

Використовуйте просту мову. Приклад: “Цей додаток використовує Mellowtel для обміну вашим невикористаним інтернет-трафіком. В обмін ви отримуєте [вигода/функція]. Ви можете відмовитися в будь-який час у налаштуваннях.”
2

Дайте користувачам чіткий вибір

Включіть чіткі варіанти Прийняти та Відхилити.
3

Посилання на політики

Дозвольте користувачам змінювати свою згоду пізніше

Mellowtel надає вбудований діалог налаштувань через showConsentSettings(window). Він відображає нативний діалог з кнопками Opt In / Opt Out, які відповідають поточному стану користувача, і внутрішньо викликає optIn() або optOut() (плюс повторне підключення WebSocket при opt-in), коли користувач перемикає свій вибір. Підключіть його до пункту меню або кнопки налаштувань у вашому додатку, щоб користувачі могли переглянути свій вибір. Якщо ви віддаєте перевагу створити власний екран налаштувань, викличте 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(), коли просто ховаєте вікно в системний трей. Викликайте його з явної дії Виходу:

Додатки для 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 } як другий аргумент до конструктора під час інтеграції, щоб відобразити стан з’єднання та активність запитів у вашому терміналі. Це також найшвидший спосіб відрізнити “не погоджено” безшумне бездіяльність (див. вище) від реальної помилки з’єднання.

Орієнтовний час на виконання: 10-15 хвилин. Якщо вам потрібна допомога або у вас є відгуки, зв’яжіться з нами за адресою info@mellowtel.com або приєднуйтесь до нашої спільноти Discord.