# ম্যানুয়াল ডেভেলপমেন্ট ইন্টিগ্রেশন নির্দেশিকা (9টি ভাষা, AI প্রয়োজন নেই)

এই নির্দেশিকা Licentivo প্রদানকারীর জন্য। অন্য লাইসেন্সিং সিস্টেমের বিক্রেতা ব্যাকএন্ডে “লাইসেন্স নির্বাচন ও কাস্টমাইজেশন” থেকে কাস্টম পরিষেবা বেছে [কাস্টম লাইসেন্সিং API ও ইন্টিগ্রেশন প্রক্রিয়া](/bn/launch-documents/external-licensing/) অনুযায়ী যুক্ত হতে এবং নিজস্ব লাইসেন্সিং সিস্টেমের SDK ব্যবহার চালিয়ে যেতে পারেন।

> বর্তমান অপ্রকাশিত পরিবর্তন অ্যাকাউন্ট পরিচয় বিনিময় ব্যবহার করে; দায়িত্ব ও মাইগ্রেশন সীমা [ক্রয় মেয়াদ ও অ্যাকাউন্ট SDK সীমা](/bn/launch-documents/account-purchase-boundary/)-এ দেখুন। Launch ক্রয় মেয়াদ গণনা করে; Licentivo SDK অনুমোদন কার্যকর করে।

শুধু সংশ্লিষ্ট ভাষার Launch ইন্টিগ্রেশন প্যাকেজ ইনস্টল করুন। Launch প্যাকেজে অফিসিয়াল SDK, ডিফল্ট অ্যাডাপ্টার ও লিঙ্ক কনফিগারেশন অন্তর্ভুক্ত; অফিসিয়াল লাইসেন্সিং ঠিকানা `https://www.licentivo.com` নির্দিষ্ট। অ্যাপ বর্তমান Launch স্টোরে নিবন্ধিত ক্রেতার অ্যাকাউন্ট দিয়ে লগইন করে।

## আগে থেকে পূরণ করা ইনিশিয়ালাইজেশন কোড নিন

1. Launch ব্যাকএন্ডে সফটওয়্যার, বিক্রয় প্ল্যান ও Licentivo লাইসেন্স নীতির সংযোগ সম্পন্ন করে সংশ্লিষ্ট পরিবেশে প্রকাশ করুন।
2. **প্রোগ্রাম ইন্টিগ্রেশন → ইন্টিগ্রেশন পরীক্ষা ও কোড** খুলে সফটওয়্যার, ভাষা ও পরীক্ষা/উৎপাদন পরিবেশ নির্বাচন করুন।
3. “পণ্যের তথ্য পড়ুন এবং ইন্টিগ্রেশন কোড তৈরি করুন” ক্লিক করুন। Launch সাইটের বর্তমান প্রকাশ্য ঠিকানা, বিদ্যমান পণ্য ম্যাপিং ও স্বাক্ষর পাবলিক কী স্বয়ংক্রিয়ভাবে পড়ে।
4. পৃষ্ঠার সংযোগ ফাংশন নিজের প্রকল্পে কপি করুন এবং নিচের নির্দেশ অনুযায়ী ইন্টারফেস ও ব্যবসায়িক কল ম্যানুয়ালি লিখুন। স্বয়ংক্রিয়ভাবে পূরণ করা প্যারামিটার দেখেও সংশ্লিষ্ট ভাষার `Connect/connect` নিজে কল করতে পারেন।

দুটি অভ্যন্তরীণ পণ্য ID হাতে পূরণ বা `launch-config.json` কিংবা `product.json` তৈরি প্রয়োজন নেই। পৃষ্ঠা থেকে সোর্স সংযোগ ফাংশন সংরক্ষণ করা যায়। সার্ভারের ব্যক্তিগত `config.yaml` শুধু Launch পরিষেবা চালুর জন্য, গ্রাহক সফটওয়্যারের সঙ্গে বিতরণ করা যাবে না।

সাইটের ঠিকানা বর্তমান ইনস্ট্যান্সের বৈধ প্রকাশ্য ঠিকানা থেকে আসে (স্টার্টআপ কনফিগারেশন `public_url` বা ব্যাকএন্ড ওয়েবসাইট সেটিংয়ের বৈধ প্রকাশ্য ঠিকানা)। এটি ডোমেইন বা পোর্টসহ IP ঠিকানা হতে পারে, তবে প্রোটোকল থাকতে হবে; উৎপাদনে বৈধ HTTPS ব্যবহার করুন। লিসেনিং ঠিকানা `http_addr` গ্রাহকের প্রবেশের ঠিকানা নয়। সাইট ঠিকানা, পণ্য ম্যাপিং বা পরিবেশ বদলালে বর্তমান সাইট থেকে সংযোগ ফাংশন আবার নিন; পুরোনো সাইটের সেশন ও ক্যাশ নতুন সাইটের অনুমোদন হতে পারে না।

দুটি পণ্য নম্বর সিস্টেমের বিদ্যমান অভ্যন্তরীণ সম্পর্ক: Launch সফটওয়্যার পণ্য ও Licentivo লাইসেন্স পণ্য। ইন্টিগ্রেশন পৃষ্ঠা নির্বাচিত সফটওয়্যার অনুযায়ী স্বয়ংক্রিয়ভাবে পূরণ করে; ক্রেতা শুধু স্টোর অ্যাকাউন্ট দেন। সার্ভার কনফিগার করা Licentivo সংযোগ দিয়ে স্বাক্ষর পাবলিক কী পড়ে; প্রশাসনিক কী ও গ্রাহকের লাইসেন্স ক্রেডেনশিয়াল সোর্সে যায় না।

## `Connect/connect`-এর কাজ

`Connect/connect` বিভিন্ন ভাষায় “Launch অ্যাপ ক্লায়েন্ট তৈরি” ক্রিয়ার নাম। Go, C# ও কিছু নেটিভ ইন্টারফেস বড় হাতের প্রথম অক্ষরে `Connect` ব্যবহার করে; Python, JavaScript, Ruby ইত্যাদি নিজস্ব রীতিতে `connect` ব্যবহার করে। ব্যাকএন্ডের `connectLaunch()`, `connect_launch()` বা `LaunchConnection.Open()` আগে থেকে প্রকাশ্য প্যারামিটার পূরণ করা প্রকল্প ফাংশন, যা ভিতরে সংশ্লিষ্ট ভাষার এন্ট্রি কল করে।

সংযোগ শুধু ইনিশিয়ালাইজেশন সম্পন্ন করে: স্টোর ঠিকানা, পণ্য ম্যাপিং, পরিবেশ ও স্বাক্ষর পাবলিক কী যাচাই করে, Launch ক্লায়েন্ট তৈরি করে এবং প্যাকেজের অফিসিয়াল Licentivo SDK কনফিগার করে। এটি গ্রাহকের পরিচয় যাচাই বা সরাসরি পেইড ফিচার খুলে দেয় না। সম্পূর্ণ ক্রম:

```text
Connect/connect → Login or Restore → RunFeature → Logout / Close
                                       └──────────→ ReleaseDevice (explicit device unlink only)
```

অ্যাপ চলাকালে একই ক্লায়েন্ট অবজেক্ট রাখুন যাতে SDK হার্টবিট ও ফ্লোটিং সিট স্বাভাবিকভাবে পরিচালনা করে। সাধারণ বন্ধে ডিভাইস বাইন্ডিং থাকে; গ্রাহকের স্পষ্ট লগআউট ও ReleaseDevice সামঞ্জস্য এন্ট্রি একই অফিসিয়াল SDK লগআউট প্রক্রিয়া কল করে।

## ইনস্টল ও ইনিশিয়ালাইজেশন এন্ট্রি

0.1.6-এর নয় ভাষার প্রকাশ্য ইনস্টল যাচাই সম্পূর্ণ পাস করেছে (9/9), নিচের সব ইনস্টল পদ্ধতি যাচাইকৃত। [GitHub Release](https://github.com/spf86/licentivo-launch-sdk/releases/tag/v0.1.6) নেটিভ প্যাকেজ ও অফলাইন ফাইলও দেয়; ব্যবহার [ডাউনলোড প্যাকেজ ইনস্টল নির্দেশিকা](/bn/launch-documents/integration-packages/#install-a-downloaded-distribution)-এ দেখুন।

| ভাষা | শুধু Launch ইনস্টল করুন | পৃষ্ঠা প্রদত্ত সংযোগ ফাংশন | প্যাকেজের সরাসরি ইনিশিয়ালাইজেশন API |
| --- | --- | --- | --- |
| Go | `go get github.com/spf86/licentivo-launch-sdk/pkg/launchclient@v0.1.6` | `connectLaunch()` | `launchclient.Connect` |
| Python 3.10+ | `python -m pip install licentivo-launch==0.1.6` | `connect_launch()` | `Application.connect` |
| C# / .NET 8+ | `dotnet add package Licentivo.Launch --version 0.1.6` | `LaunchConnection.Open()` | `Application.Connect` |
| Java 17+ | Maven/Gradle: `com.licentivo.launch:launch-client:0.1.6` | `LaunchConnection.open()` | `Launch.connect` |
| Node.js 20.3+ | `npm install @licentivo/launch@0.1.6` | `connectLaunch()` | `Application.connect` |
| Rust 1.85+ | `cargo add licentivo-launch@=0.1.6` | `connect_launch()` | `Application::connect` |
| Ruby 3.1+ | `gem install licentivo-launch --version 0.1.6` | `connect_launch` | `Application.connect` |
| C11 | [GitHub Release](https://github.com/spf86/licentivo-launch-sdk/releases/tag/v0.1.6) থেকে নেটিভ প্যাকেজ ডাউনলোড করে CMake দিয়ে ইমপোর্ট করুন | `connect_launch()` | `launch_application_connect` |
| C++17 | একই Launch নেটিভ প্যাকেজ ব্যবহার করুন | `connectLaunch()` | `Application::Connect` |

প্রকাশ্য সোর্স ও প্রতি ভাষার README [Launch SDK রিপোজিটরি](https://github.com/spf86/licentivo-launch-sdk)-এ, নেটিভ প্যাকেজ ও অফলাইন ফাইল [v0.1.6 Release](https://github.com/spf86/licentivo-launch-sdk/releases/tag/v0.1.6)-এ এবং প্রকাশ্য ইনস্টল ফল [নয় ভাষার রেজিস্ট্রি যাচাই](https://github.com/spf86/licentivo-launch-sdk/blob/main/docs/registry-verification.json)-এ দেখুন। প্রতিটি প্যাকেজের README ইনস্টল কমান্ড ও API দেয়। JavaScript প্যাকেজে TypeScript ঘোষণা রয়েছে। প্যাকেজ ম্যানেজার সাধারণ ভাষা নির্ভরতা সমাধান করে, যেমন Python-এর cryptography, C#-এর BouncyCastle ও Ruby-র base64; অফিসিয়াল SDK প্যাকেজ ইনস্টল করতে হয় না।

Go প্রকাশ্য মডিউল নাম `github.com/spf86/licentivo-launch-sdk`, ইমপোর্ট পাথ `github.com/spf86/licentivo-launch-sdk/pkg/launchclient`; অ্যাপের স্থানীয় replace প্রয়োজন নেই। Windows নেটিভ প্যাকেজ amd64 GNU/MinGW ব্যবহার করে, Linux amd64 নেটিভ প্যাকেজও রয়েছে। Ruby প্ল্যাটফর্ম প্যাকেজ ও Rust/native Windows বিতরণে curl রয়েছে; অন্য প্ল্যাটফর্মে সোর্স বিল্ডের জন্য সাধারণ C11, curl/OpenSSL ডেভেলপমেন্ট নির্ভরতা প্রয়োজন। প্ল্যাটফর্ম টুলচেইন প্রতিটি প্যাকেজের README-এ দেখুন।

## লগইন ও সুরক্ষিত কাজ

নিচের স্নিপেটে আগের ধাপে কপি করা সংযোগ ফাংশন ব্যবহার করা হয়। `email`, `password` আপনার লগইন ইন্টারফেস থেকে আসে; পাসওয়ার্ড সোর্স বা কনফিগারেশনে লিখবেন না। `export` প্ল্যান নীতিতে বাস্তবে থাকা ফিচারের নাম দিয়ে বদলাতে হবে।

### Go

```go
app, err := connectLaunch()
if err != nil { return err }
defer app.Close()
if _, err := app.Login(ctx, email, password); err != nil { return err }
return app.RunFeature("export", func() error {
    return exportReport()
})
```

`ctx` অ্যাপের জীবনচক্র প্রসঙ্গ ব্যবহার করবে, লগইন অনুরোধ শেষ হওয়ার সঙ্গে সঙ্গেই হার্টবিট বাতিল করা যাবে না। নেটওয়ার্ক কাজ ব্যাকগ্রাউন্ড ওয়ার্কার থ্রেডে রাখুন। পুনরুদ্ধারে `Restore(ctx)`; অ্যাকাউন্ট লগআউটে `Logout(ctx)`; ডিভাইস ছাড়তে `ReleaseDevice(ctx)` কল করুন।

### Python

```python
with connect_launch() as app:
    app.login(email, password)
    result = app.run_feature("export", export_report)
```

`restore()` বিদ্যমান নিরাপদ সেশন পুনরুদ্ধার করে; সেশন না থাকলে লগইন ইন্টারফেস দেখান। `logout()` অ্যাকাউন্ট পরিষ্কার করে; `release_device()` স্পষ্টভাবে ডিভাইস ছাড়ে। সিঙ্ক্রোনাস নেটওয়ার্ক কাজ ডেস্কটপ ইভেন্ট লুপ আটকে রাখবে না।

### C# / .NET

```csharp
await using var app = LaunchConnection.Open();
await app.Login(email, password);
await app.RunFeature("export", async () => {
    await ExportReport();
});
```

`await Restore()`, `await Logout()` ও `await ReleaseDevice()` ব্যবহার করুন। অ্যাপ চলাকালে SDK জীবনচক্র বজায় রাখুন এবং অ্যাসিঙ্ক্রোনাস ইন্টারফেস প্রক্রিয়া ব্যবহার করুন।

### Java

```java
try (var app = LaunchConnection.open()) {
    app.login(email, passwordChars);
    app.runFeature("export", () -> exportReport());
}
```

পাসওয়ার্ডে `char[]` ব্যবহার করুন। সেশন না থাকলে `restore()` `NO_SESSION` ব্যর্থতা ফেরত দেয়, লগইন ইন্টারফেস দেখাতে হবে; অন্য ব্যর্থতাকে অনুমোদন মনে করা যাবে না। `logout()` ও `releaseDevice()` ভিন্ন কাজ। try-with-resources বন্ধ করার দায়িত্ব নেয়।

### JavaScript / Node.js / TypeScript

```javascript
const app = connectLaunch();
try {
  await app.login(email, password);
  const result = await app.runFeature('export', () => exportReport());
} finally {
  await app.close();
}
```

সেশন না থাকলে `restore()` `null` ফেরত দেয়; স্বাভাবিক পুনরুদ্ধারের পরই ব্যবসায়িক কাজ চলবে। `logout()`-এর বুলিয়ান ফল দূরবর্তী লগআউট নিশ্চিত কি না বোঝায়, ডিভাইস রিলিজ ব্যর্থ হলে ত্রুটি দেখান। কোড Node.js, Electron প্রধান প্রক্রিয়া বা বিশ্বস্ত ব্যাকএন্ডে চলে; ব্রাউজার ও Electron রেন্ডারার লাইসেন্স ক্রেডেনশিয়াল রাখে না।

### Rust

```rust
let mut app = connect_launch()?;
app.login(&email, &password)?;
let result = app.run_feature("export", || {
    export_report()?;
    Ok(())
})?;
app.close();
```

কলব্যাক `Result<T, Failure>` ফেরত দেয়। `restore()`, `logout()`, `release_device()` ফল ফেরত দেয়; ব্যর্থতা অবশ্যই সামলাতে হবে। `Drop` রানটাইমও বন্ধ করে। ডিফল্ট নেটিভ কোর build.rs দিয়ে কম্পাইল ও লিঙ্ক হয়, অফিসিয়াল SDK নিজে লিঙ্ক করতে হয় না।

### Ruby

```ruby
app = connect_launch
begin
  app.login(email, password)
  result = app.run_feature('export') { export_report }
ensure
  app.close
end
```

`restore` সেশন পুনরুদ্ধার করে, `logout` অ্যাকাউন্ট থেকে বের হয়, `release_device` ডিভাইস ছাড়ে। সুরক্ষিত কাজে কোড ব্লক ব্যবহার করুন; ব্যতিক্রমকে সাফল্যে রূপান্তর করা যাবে না।

### C

```c
static int export_action(void *context) {
    return export_report(context); /* Return 1 only on success. */
}

launch_application *app = connect_launch();
if (!app) return 0;
int ok = launch_application_login(app, email, password);
if (ok) ok = launch_application_run_feature(app, "export", export_action, context);
/* Check launch_application_error(app) on failure; never log credentials. */
launch_application_close(app);
return ok;
```

`launch_application_restore` তিন অবস্থার: `1` পুনরুদ্ধার, `0` সেশন নেই, `-1` ব্যর্থ। শুধু সেশন না থাকলে স্বাভাবিক লগইন দেখান; প্রত্যাখ্যান বা ব্যতিক্রমকে সাফল্য ভাববেন না। `logout` ও `release_device`-এর ফেরত মানও পরীক্ষা করতে হবে।

CMake শুধু Launch ইমপোর্ট করে:

```cmake
find_package(LicentivoLaunch CONFIG REQUIRED)
add_executable(myapp main.c)
licentivo_launch_link(myapp)
```

### C++

```cpp
auto app = connectLaunch();
app.Login(email.c_str(), password.c_str());
app.RunFeature("export", [&] { exportReport(); });
```

`Restore()`, `Logout()`, `ReleaseDevice()` C++ ব্যতিক্রম নিয়ম অনুসরণ করে। RAII ডেস্ট্রাক্টর বন্ধ করে। CMake `licentivo_launch_link(myapp CXX)` ব্যবহার করে; Launch SDK লিঙ্ক ও বিতরণ প্যাকেজের রানটাইম লাইব্রেরি স্বয়ংক্রিয় পরিচালনা করে।

## জীবনচক্র, নিরাপদ স্টোরেজ ও ত্রুটি

সংযোগ অবজেক্ট তৈরি শুধু ইনিশিয়ালাইজেশন। অ্যাপকে সফল লগইন বা পুনরুদ্ধার করতে এবং প্রতিটি ব্যবসায়িক কাজে ফিচার সুরক্ষা কলব্যাক ব্যবহার করতে হবে। অর্ডার পরিশোধিত, সেশন বিদ্যমান বা বোতাম ক্লিকযোগ্য হওয়া SDK যাচাইয়ের বিকল্প নয়।

ডিফল্ট সেশন শুধু মেমোরিতে থাকে। লগইন মনে রাখতে নিরাপদ স্টোরেজ প্রয়োজন: Go, Python, C# ও নেটিভ C/C++ Windows বর্তমান ব্যবহারকারী DPAPI দেয়; Java, Node, Rust ও Ruby কলার কী ব্যবহারকারী AES-GCM স্টোরেজ দেয়। ক্রস-প্ল্যাটফর্ম অ্যাপ সিস্টেম ক্রেডেনশিয়াল স্টোরে যুক্ত হবে। কী ও সাইফারটেক্সট একই সাধারণ ডিরেক্টরিতে রাখা যাবে না।

সাধারণ বন্ধ ব্যবহারকারীর ইচ্ছাকৃত মনে রাখা সেশন বজায় রাখে এবং রানটাইম থামায়। অ্যাকাউন্ট লগআউট প্রথমে অফিসিয়াল SDK ইউনিফায়েড লগআউট কল করে, তারপর Launch-এর নিজস্ব অ্যাকাউন্ট রেকর্ড পরিষ্কার করে। ReleaseDevice একই প্রক্রিয়ার সামঞ্জস্য এন্ট্রি; দূরবর্তী প্রত্যাহার বাকি থাকলে সফল রিলিজ দেখাবেন না। অফিসিয়াল SDK-এর ক্যাশ ডিরেক্টরি বা লগআউট পুনরুদ্ধার লগ পরিষ্কার করবেন না। Launch-এর সেশন সুরক্ষা মানে অফিসিয়াল SDK-এর সব ডিভাইস ফাইল এনক্রিপ্টেড নয়; ক্যাশ ডিরেক্টরির অনুমতি সীমিত করুন।

| অবস্থা | অ্যাপের প্রক্রিয়াকরণ |
| --- | --- |
| অ্যাকাউন্ট বা পাসওয়ার্ড ব্যর্থ | সাধারণ লগইন ব্যর্থতা দেখান, অ্যাকাউন্ট আছে কি না প্রকাশ করবেন না |
| EMAIL_VERIFICATION_REQUIRED | স্টোরের ইমেইল যাচাই সম্পন্ন করতে নির্দেশ দিন |
| ENTITLEMENT_PENDING | সিঙ্ক চলছে দেখান, প্যাকেজের সীমিত পুনঃপ্রচেষ্টা ও Retry-After অনুযায়ী অপেক্ষা করুন |
| ENTITLEMENT_NOT_PURCHASED | ক্রয় বা অ্যাকাউন্ট পরিবর্তনের নির্দেশ দিন |
| ENTITLEMENT_EXPIRED | নবায়নের নির্দেশ দিন, পুরোনো ক্রেডেনশিয়াল দিয়ে প্রত্যাখ্যান এড়াবেন না |
| ENTITLEMENT_SUSPENDED | সুরক্ষিত ফিচার থামিয়ে বিক্রেতার সঙ্গে যোগাযোগ করুন |
| ডিভাইস সংখ্যা পূর্ণ | ডিভাইস পরিচালনা বা স্পষ্ট রিলিজের নির্দেশ দিন |
| নেটওয়ার্ক/HTTP 5xx | শুধু SDK-যাচাইকৃত এবং এখনও বৈধ অফলাইন অনুমোদন ব্যবহার করা যায় |

স্পষ্ট 401/403/404, অ্যাকাউন্ট অমিল, বাতিল বা রেট সীমা অফলাইন অনুমোদন সাফল্যে পরিণত করা যাবে না। প্রথম অ্যাক্টিভেশন এবং অফলাইন নিষিদ্ধ নীতিতে এখনও নেটওয়ার্ক প্রয়োজন। সার্ভার ডোমেইন/IP অনুপলব্ধ হলে সংযোগ সমস্যা দেখান, গোপনে অন্য সাইটে যুক্ত হবেন না।

## গ্রহণযোগ্যতা পরীক্ষা ও রেফারেন্স

বাস্তব লগইন, মালিক অ্যাকাউন্টের অনুমোদন, সুরক্ষিত কাজ, পুনরারম্ভে পুনরুদ্ধার, বৈধ অফলাইন ও অফলাইন মেয়াদ শেষ, ক্যাশ পরিবর্তন, লগআউট, অ্যাকাউন্ট পরিবর্তন ও ডিভাইস রিলিজ যাচাই করুন। এই নথিতে AI প্রয়োজন নেই। পরীক্ষার টুল ও বাহ্যিক গ্রহণযোগ্যতার সীমা [acceptance.md](/bn/launch-documents/acceptance/)-এ; স্থানীয় প্যাকেজ ও বিল্ড নির্দেশ [integration-packages.md](/bn/launch-documents/integration-packages/)-এ দেখুন।

কনফিগারেশন পরীক্ষা, কোড তৈরি ও স্থানীয় পরীক্ষা স্বয়ংক্রিয়ভাবে বাস্তব পেমেন্ট, লাইসেন্স ইস্যু বা অফিসিয়াল সাইট অ্যাক্টিভেশনের সাফল্য প্রমাণ করে না। বাহ্যিক স্টোর ও পেমেন্ট sandbox কনফিগারেশনের পর আলাদাভাবে গ্রহণযোগ্যতা পরীক্ষা প্রয়োজন।
