# 事業者所有のライセンスアダプターのサンプル

この Python 3.10+ サンプルは、SQLite によるイベント／nonce の永続化と復旧ワーカーを備えた Launch の外部 HTTP ブリッジを実装します。ライセンスの生成、保護された機能の検証、ライセンスシステムの置き換えは**行いません**。

以下のフックを備えた Python モジュールを実装してください：

```python
def apply_snapshot(snapshot):
    # Call your licensing system with snapshot["event_id"] as its durable
    # idempotency key. Apply desired_state and the absolute purchased dates.
    # Return only after confirming the original operation was applied.
    # Raise ValueError for a result requiring manual review.
    ...

def delivery(snapshot):
    # Read an existing result owned by this purchase; do not issue here.
    return {"type": "instructions", "value": "Your own delivery instructions", "expires_at": None}
```

バックエンドを設定する前に、`...` を実際の連携処理に置き換えてください。バックエンドモジュールが設定されていない場合、付属のフックは `NotImplementedError` を発生させ、イベントは手動レビューに入り、ライセンスが発行されたとは決して報告しません。サンプルのワーカーはクラッシュや結果が不明なエラーの後にフックを再試行することがあるため、ライセンスバックエンドは同じイベント ID を使用して重複排除／復旧を行う必要があります。

環境変数を使用してアダプターを設定し、キーをソース管理やシェル履歴に残さないようにしてください：

- `CUSTOM_LICENSING_KEY`：Launch と一致する、32–128 ランダムバイトの標準 Base64 エンコード。
- `CUSTOM_LICENSING_KEY_ID`：`key-1`、または設定したキー識別子。
- `CUSTOM_LICENSING_CONNECTION_REF`：一致する接続参照。
- `CUSTOM_LICENSING_ENVIRONMENT`：`sandbox` または `live`。
- `CUSTOM_LICENSING_DATABASE`：チェックアウト外にある、書き込み可能な非公開 SQLite パス。再起動後も永続化してください。
- `CUSTOM_LICENSING_BACKEND`：上記のフックを実装する、インポート可能なモジュール。
- `CUSTOM_LICENSING_PORT`：ローカル待受ポート。デフォルトは `18883`。

`python server.py` を実行します。ローカルの sandbox テストでは、Launch に `http://127.0.0.1:18883` を設定し、ループバック HTTP の例外を明示的に有効にします。本番では HTTPS 終端、プロセス監視、保護されたデータベースバックアップ、バックエンド自身の SDK／ランタイム検証を使用します。バックエンドが実際にサポートする購入／配信タイプのみを公開し、それに応じて `capabilities` を調整してください。

バックエンドの問題を修正した後、`python server.py --retry-event ORIGINAL_EVENT_UUID` をローカルで実行すると、保存済みの同じペイロードが再びキューに入ります。Launch のライセンスタスクページでも元のイベントを再試行してください。応答を復旧するために ID を変更したり、時間を再度追加したりしてはいけません。

このサンプルは出発点であり、本番環境への適格性を保証するものではありません。ワーカーのリースは 60 秒です。フック呼び出しのタイムアウトをそれより短くするか、リースを更新してください。本番購入を受け付ける前に、監視、ローテーション手順、より厳格な業務／スキーマチェック、デプロイ環境の運用管理を追加してください。[連携ガイド](/ja/launch-documents/external-licensing/)と [OpenAPI](/ja/assets/launch/external-licensing-openapi.json) がプロトコルを定義しています。Launch のステータス応答を保護されたコードの実行許可として使用してはいけません。
