> ## Documentation Index
> Fetch the complete documentation index at: https://www.mellowtel.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# अपने Electron ऐप में Mellowtel को एकीकृत करें

अपने क्रॉस-प्लेटफ़ॉर्म Electron एप्लिकेशन में Mellowtel को एकीकृत करें ताकि उपयोगकर्ता अपने अप्रयुक्त इंटरनेट बैंडविड्थ को पुरस्कार या प्रीमियम सुविधाओं के बदले साझा कर सकें। Electron SDK कहीं भी चलता है जहाँ Electron चलता है (macOS, Windows, और Linux)।

<Warning>
  **उपयोगकर्ता की सहमति अनिवार्य है।** SDK केवल तभी काम करता है जब उपयोगकर्ता ने स्पष्ट रूप से सहमति दी हो। `init()` चुपचाप जल्दी लौटता है जब कोई सहमति फ़ाइल में नहीं होती, इसलिए यदि आप देखते हैं कि SDK त्रुटियों के बिना शुरू होता है लेकिन कभी ट्रैफ़िक नहीं भेजता, तो सबसे संभावित कारण यह है कि उपयोगकर्ता ने अभी तक सहमति नहीं दी है।
</Warning>

## पूर्व आवश्यकताएँ

* एक Mellowtel खाता और कॉन्फ़िगरेशन कुंजी (अपना [डैशबोर्ड](https://www.mellowtel.com/mellowtel-auth/) से प्राप्त करें)।
* एक Electron एप्लिकेशन जिसमें मुख्य प्रक्रिया तक पहुंच हो।

***

## स्थापना

### 1. npm प्रमाणीकरण कॉन्फ़िगर करें

अपने प्रोजेक्ट की रूट डायरेक्टरी में एक `.npmrc` फ़ाइल बनाएं ताकि npm को Mellowtel GitHub Packages रजिस्ट्री पर इंगित किया जा सके और स्थापना को प्रमाणित किया जा सके:

```bash theme={null}
@mellowtel-inc:registry=https://npm.pkg.github.com/
//npm.pkg.github.com/:_authToken=YOUR_NPM_TOKEN
```

`YOUR_NPM_TOKEN` को नीचे दिए गए इंस्टॉल टोकन से बदलें। प्रकट करने के लिए क्लिक करें, फिर इसे अपने क्लिपबोर्ड पर कॉपी करने के लिए कोड ब्लॉक पर कॉपी आइकन का उपयोग करें।

<Accordion title="इंस्टॉल टोकन प्रकट करें">
  ```
  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
  ```
</Accordion>

### 2. पैकेज इंस्टॉल करें

अपने प्रोजेक्ट रूट से, Electron SDK इंस्टॉल करें:

```bash theme={null}
npm install @mellowtel-inc/mellowtel-electron
```

### 3. अपने कोड में जोड़ें

अपने Electron मुख्य प्रक्रिया फ़ाइल (आमतौर पर `main.ts` या `main.js`) में SDK आयात करें, इसे अपनी कॉन्फ़िगरेशन कुंजी के साथ इंस्टेंटिएट करें, उपयोगकर्ता से सहमति का अनुरोध करें, और फिर सेवा शुरू करने के लिए `init()` कॉल करें।

```typescript theme={null}
import { app, BrowserWindow } from 'electron';
import Mellowtel from '@mellowtel-inc/mellowtel-electron';


// जब ऐप तैयार हो, विंडो बनाएं
app.whenReady().then(async () => {
  let win = createWindow();
  
  const mellowtel: Mellowtel = new Mellowtel('YOUR_CONFIGURATION_KEY');

  await mellowtel.requestConsent(win, "3 महीने मुफ्त प्राप्त करें")
  await mellowtel.init()
});
```

<Note>
  `YOUR_CONFIGURATION_KEY` को अपने Mellowtel डैशबोर्ड से प्राप्त कुंजी से बदलें।
</Note>

**प्रत्येक कॉल क्या करता है:**

* `new Mellowtel(configurationKey, options?)` SDK को इंस्टेंटिएट करता है। आज उपलब्ध एकमात्र विकल्प `disableLogs` है, जो डिफ़ॉल्ट रूप से `true` है। इसे `false` पर सेट करें ताकि आप अपने टर्मिनल में कनेक्शन स्थिति और अनुरोध गतिविधि देख सकें।
* `requestConsent(window, incentive)` एक **मूल Electron संदेश बॉक्स** प्रस्तुत करता है जिसे आप पास किए गए `BrowserWindow` से एंकर किया जाता है। दूसरा तर्क संवाद का प्रमुख शीर्षक है (उदाहरण के लिए, `"3 महीने मुफ्त प्राप्त करें"`), जो Mellowtel क्या करता है, के एक स्थिर स्पष्टीकरण के ऊपर दिखाया गया है। यदि उपयोगकर्ता स्वीकार करता है तो यह `true` पर हल करता है, यदि उपयोगकर्ता अस्वीकार करता है या संवाद बंद करता है तो `false`, और यदि सहमति पहले से फ़ाइल में है तो `undefined`। SDK स्वचालित रूप से ऑप्ट-इन निर्णय को बनाए रखता है, इसलिए आपको बाद में `optIn()` कॉल करने की आवश्यकता नहीं है।
* `init()` केवल तभी फेंकता है जब `configurationKey` खाली हो। यदि उपयोगकर्ता ने ऑप्ट-इन नहीं किया है, तो यह लॉग करता है और चुपचाप लौटता है। अन्यथा यह Mellowtel के बैकएंड के लिए एक WebSocket खोलता है। कॉल रेंडरर UI के लिए गैर-अवरोधक है, इसलिए जब कनेक्शन स्थापित होता है तब भी विंडो उत्तरदायी रहती हैं।

### सिस्टम संवाद व्यवधानों को रोकना (अनुशंसित)

SDK एक वैकल्पिक हेल्पर `setupMellowtelApp()` के साथ आता है, जो Electron कमांड-लाइन फ्लैग्स को कॉन्फ़िगर करता है ताकि सिस्टम संवाद (ऑटोफिल पॉपअप, अनुवाद बार, NTLM / Kerberos प्रमाणीकरण प्रॉम्प्ट, पासवर्ड प्रबंधक एकीकरण, मीडिया ओवरले, पहली बार चलने वाले संवाद) को दबाया जा सके जो अन्यथा आपके उपयोगकर्ताओं को बाधित करेंगे जब Mellowtel की छिपी हुई विंडो पृष्ठभूमि में अनुरोधों को संसाधित करती हैं।

इसे अपनी मुख्य प्रक्रिया फ़ाइल के शीर्ष पर कॉल करें, **पहले** `app.whenReady()`, और इसे `@mellowtel-inc/mellowtel-electron` से डिफ़ॉल्ट निर्यात के साथ आयात करें। [उपस्ट्रीम README](https://github.com/mellowtel-inc/mellowtel-electron#setupmellowtelapp-optional) में मानक उपयोग के लिए देखें।

***

## उपयोगकर्ता सहमति

<Warning>
  सहमति संवाद प्रदर्शित करना **अनिवार्य** है। आपको उपयोगकर्ताओं को `init()` कॉल करने से पहले स्पष्ट रूप से ऑप्ट-इन करने देना होगा, और आपको उन्हें किसी भी समय अपने ऑप्ट-इन स्थिति को प्रबंधित करने का तरीका प्रदान करना होगा।
</Warning>

आपके पास सहमति को संभालने के लिए दो रास्ते हैं:

1. **बिल्ट-इन मूल संवाद का उपयोग करें** `requestConsent(window, incentive)` के माध्यम से। यह सबसे तेज़ रास्ता है और यही ऊपर दिया गया स्निपेट दिखाता है। यह आपके प्रोत्साहन कॉपी को शीर्षक के रूप में प्रदर्शित करते हुए एक मूल Electron `dialog.showMessageBox` प्रस्तुत करता है और उपयोगकर्ता के निर्णय को स्वचालित रूप से बनाए रखता है।
2. **अपना स्वयं का सहमति UI बनाएं** और SDK को `optIn()`, `optOut()`, और `getOptInStatus()` के माध्यम से चलाएं। इसका उपयोग करें यदि आप कस्टम ब्रांडिंग, समृद्ध स्पष्टीकरण, या मूल संवाद से परे स्थानीयकरण चाहते हैं।

### आपके सहमति संवाद में क्या शामिल होना चाहिए

<Steps>
  <Step title="Mellowtel क्या करता है, समझाएं">
    सरल भाषा का उपयोग करें। उदाहरण: *"यह ऐप Mellowtel का उपयोग आपके अप्रयुक्त इंटरनेट बैंडविड्थ को साझा करने के लिए करता है। बदले में, आपको \[लाभ/विशेषता] मिलती है। आप किसी भी समय सेटिंग्स में ऑप्ट-आउट कर सकते हैं।"*
  </Step>

  <Step title="उपयोगकर्ताओं को स्पष्ट विकल्प दें">
    अलग-अलग स्वीकार और अस्वीकार विकल्प शामिल करें।
  </Step>

  <Step title="नीतियों के लिए लिंक शामिल करें">
    [सेवा की शर्तें](https://www.mellowtel.com/terms-and-conditions) और [गोपनीयता नीति](https://www.mellowtel.com/privacy-policy) के लिंक शामिल करें।
  </Step>
</Steps>

### उपयोगकर्ताओं को बाद में अपनी सहमति बदलने दें

Mellowtel एक बिल्ट-इन सेटिंग्स संवाद प्रदान करता है `showConsentSettings(window)` के माध्यम से। यह एक मूल संवाद प्रस्तुत करता है जिसमें ऑप्ट इन / ऑप्ट आउट बटन होते हैं जो उपयोगकर्ता की वर्तमान स्थिति से मेल खाते हैं, और जब उपयोगकर्ता टॉगल करता है तो आंतरिक रूप से `optIn()` या `optOut()` (प्लस WebSocket को फिर से कनेक्ट करना) कॉल करता है। इसे अपने ऐप में एक मेनू आइटम या सेटिंग्स बटन से जोड़ें ताकि उपयोगकर्ता अपनी पसंद को फिर से देख सकें।

यदि आप अपनी स्वयं की सेटिंग्स स्क्रीन बनाना पसंद करते हैं, तो वर्तमान स्थिति को पढ़ने के लिए `getOptInStatus()` कॉल करें और इसे बदलने के लिए `optIn()` / `optOut()` का उपयोग करें।

***

## विधि संदर्भ

`Mellowtel` क्लास निम्नलिखित सार्वजनिक विधियों को उजागर करता है। सभी आपके द्वारा `new Mellowtel(configurationKey, options?)` के साथ बनाए गए इंस्टेंस पर उपलब्ध हैं।

**जीवनचक्र**

* `init(): Promise<void>` सेवा शुरू करता है यदि उपयोगकर्ता ने ऑप्ट-इन किया है, या चुपचाप जल्दी लौटता है यदि नहीं। केवल तभी फेंकता है जब कॉन्फ़िगरेशन कुंजी खाली हो।
* `requestConsent(window: BrowserWindow, incentive: string): Promise<boolean | undefined>` बिल्ट-इन मूल सहमति संवाद दिखाता है और परिणाम को बनाए रखता है। स्वीकार करने पर `true` लौटाता है, अस्वीकार या बंद करने पर `false`, यदि सहमति पहले से दी गई हो तो `undefined`।
* `showConsentSettings(window: BrowserWindow): Promise<void>` बिल्ट-इन प्रबंध-सहमति संवाद दिखाता है। जब उपयोगकर्ता अपनी पसंद टॉगल करता है तो SDK आंतरिक रूप से ऑप्ट-इन / ऑप्ट-आउट संक्रमणों को संभालता है।

**मैनुअल ऑप्ट-इन नियंत्रण**

* `optIn(): Promise<void>` उपयोगकर्ता को ऑप्ट-इन के रूप में चिह्नित करता है बिना कोई संवाद दिखाए। इसका उपयोग केवल अपने स्वयं के UI के माध्यम से सहमति एकत्र करने के बाद करें।
* `optOut(): Promise<void>` उपयोगकर्ता को ऑप्ट-आउट के रूप में चिह्नित करता है और सक्रिय WebSocket कनेक्शन को बंद करता है।
* `getOptInStatus(): boolean | undefined` वर्तमान ऑप्ट-इन स्थिति लौटाता है, या `undefined` यदि उपयोगकर्ता ने कभी कोई विकल्प नहीं बनाया हो।
* `getNodeId(): string` इस स्थापना के लिए Mellowtel नोड पहचानकर्ता लौटाता है। समर्थन टिकट दाखिल करते समय उपयोगी।

**अनुरोध काउंटर**

अनुरोध गणनाएँ `electron-store` के माध्यम से स्थानीय रूप से संरक्षित की जाती हैं और ऐप पुनरारंभों के बाद भी बनी रहती हैं। यदि आप उपयोगकर्ताओं को उनके ऑप्ट-इन के प्रभाव को दिखाना चाहते हैं तो उन्हें अपने स्वयं के UI में सतह पर लाएं।

* `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 } }` एक कॉल में सभी तीन काउंटर लौटाता है।

***

## शटडाउन और जीवनचक्र

Electron SDK अपने स्वयं के `before-quit` या `will-quit` हैंडलर्स को **पंजीकृत नहीं** करता है। जब आपकी Electron प्रक्रिया समाप्त होती है, तो पृष्ठभूमि WebSocket कनेक्शन इसके साथ ही समाप्त हो जाता है, और आपकी तरफ से कोई स्पष्ट सफाई की आवश्यकता नहीं होती।

यदि आप सत्र के मध्य में Mellowtel को डिस्कनेक्ट करना चाहते हैं (उदाहरण के लिए, जब कोई उपयोगकर्ता आपके ऐप में "रोकें" सेटिंग को टॉगल करता है), तो `optOut()` कॉल करें। यह ऑप्ट-इन फ़्लैग को साफ़ करता है और सक्रिय कनेक्शन को बंद करता है। फिर से कनेक्ट करने के लिए, `optIn()` के बाद `init()` कॉल करें।

## सहमति स्थायित्व

ऑप्ट-इन स्थिति प्लेटफ़ॉर्म-डिफ़ॉल्ट `electron-store` कॉन्फ़िग पथ में संग्रहीत होती है:

* macOS: `~/Library/Application Support/<YourAppName>/config.json`
* Windows: `%APPDATA%\<YourAppName>\config.json`
* Linux: `~/.config/<YourAppName>/config.json`

स्थिति ऐप अपडेट्स के बाद भी बनी रहती है। आपका ऐप अनइंस्टॉल करने से इसे स्वचालित रूप से साफ़ नहीं किया जाएगा जब तक कि आपका अनइंस्टॉलर ऐप की कॉन्फ़िग डायरेक्टरी को स्पष्ट रूप से हटा नहीं देता।

***

## समस्या निवारण

<AccordionGroup>
  <Accordion title="&#x22;पैकेज नहीं मिला&#x22; त्रुटि स्थापना के दौरान">
    1. सत्यापित करें कि `.npmrc` प्रोजेक्ट रूट में है, आपके `package.json` के बगल में।
    2. सुनिश्चित करें कि टोकन में कोई अग्रणी या पिछला व्हाइटस्पेस नहीं है।
    3. npm कैश को साफ़ करें और `npm cache clean --force` चलाकर और `npm install` के बाद पुनः प्रयास करें।
  </Accordion>

  <Accordion title="&#x22;अनधिकृत&#x22; या 401 स्थापना के दौरान">
    1. सत्यापित करें कि `.npmrc` में टोकन सही और सक्रिय है। यदि आप सुनिश्चित नहीं हैं, तो [info@mellowtel.com](mailto:info@mellowtel.com) से एक नया टोकन अनुरोध करें।
    2. पुष्टि करें कि `@mellowtel-inc:registry` लाइन मौजूद है और `https://npm.pkg.github.com/` की ओर इशारा करती है।
  </Accordion>

  <Accordion title="सहमति संवाद कभी प्रकट नहीं होता">
    1. सुनिश्चित करें कि आप `requestConsent` **के बाद** `app.whenReady()` को कॉल करते हैं और एक मान्य, गैर-विनष्ट `BrowserWindow` संदर्भ के साथ।
    2. यदि आप `setupMellowtelApp()` का उपयोग करते हैं, तो सत्यापित करें कि इसे **पहले** `app.whenReady()` के बाद नहीं, बल्कि पहले कॉल किया गया है।
  </Accordion>

  <Accordion title="&#x22;init() त्रुटियों के बिना चलता है लेकिन कुछ नहीं होता&#x22;">
    यह डिजाइन द्वारा है। `init()` चुपचाप जल्दी लौटता है जब उपयोगकर्ता ने ऑप्ट-इन नहीं किया है। पुष्टि करने के लिए `getOptInStatus()` की जाँच करें। यदि यह `undefined` या `false` लौटाता है, तो पहले `requestConsent` चलाएँ। ध्यान दें कि आंतरिक "उपयोगकर्ता ऑप्ट-इन नहीं है" लॉग निगल लिया जाता है जब `disableLogs` को उसके डिफ़ॉल्ट पर छोड़ दिया जाता है (नीचे "लॉग्स चुप हैं" देखें), इसलिए टर्मिनल आपको कोई संकेत नहीं देता जब तक आप उस फ्लैग को नहीं बदलते।
  </Accordion>

  <Accordion title="लॉग्स चुप हैं">
    `disableLogs` कंस्ट्रक्टर विकल्प डिफ़ॉल्ट रूप से `true` है। कनेक्शन स्थिति और अनुरोध गतिविधि को अपने टर्मिनल में सतह पर लाने के लिए एकीकृत करते समय कंस्ट्रक्टर के दूसरे तर्क के रूप में `{ disableLogs: false }` पास करें। यह एक "ऑप्ट-इन नहीं" चुपचाप कोई-ऑप (ऊपर देखें) और एक वास्तविक कनेक्शन विफलता के बीच अंतर करने का सबसे तेज़ तरीका भी है।
  </Accordion>
</AccordionGroup>

***

पूरा करने का अनुमानित समय: 10-15 मिनट।

यदि आपको सहायता की आवश्यकता है या आपके पास कोई प्रतिक्रिया है, तो हमसे [info@mellowtel.com](mailto:info@mellowtel.com) पर संपर्क करें या हमारे [Discord समुदाय](https://discord.com/invite/txAZp4MSDe) में शामिल हों।
