# ユーティリティ

`@arcblock/did-connect-react`ライブラリは、認証フロー、データ処理、API通信に関連する一般的なタスクを簡素化するために設計されたユーティリティ関数のコレクションをエクスポートします。コアコンポーネントとフックがほとんどのユースケースを処理しますが、これらのユーティリティは高度な統合やカスタム実装のための詳細な制御を提供します。

## APIクライアント

### createAxios

この関数は、事前設定された`axios`インスタンスを作成するためのファクトリです。`x-did-connect-version`や`x-blocklet-visitor-id`などの必須ヘッダーを自動的に含み、Blockletベースのサービスとの適切な通信を保証します。アプリケーションでAPIクライアントを作成する推奨される方法です。

**パラメータ**

<x-field-group>
  <x-field data-name="options" data-type="object" data-required="false" data-desc="標準的なAxios設定オブジェクト。"></x-field>
  <x-field data-name="lazyOptions" data-type="object" data-required="false" data-desc="遅延送信のための設定。">
    <x-field data-name="lazy" data-type="boolean" data-default="false" data-desc="遅延送信を有効にするかどうか。"></x-field>
    <x-field data-name="lazyTime" data-type="number" data-default="300" data-desc="遅延送信のデバウンス時間（ミリ秒）。"></x-field>
  </x-field>
</x-field-group>

**戻り値**

<x-field data-name="axiosInstance" data-type="AxiosInstance" data-desc="設定済みのAxiosインスタンス。"></x-field>

**例**

```javascript apiClient.js icon=logos:javascript
import { createAxios } from '@arcblock/did-connect-react/lib/utils';

const apiClient = createAxios({
  baseURL: '/api',
});

export default apiClient;
```

## URLとポップアップの処理

これらの関数は、DID Connect認証プロセス中に使用されるURLとポップアップウィンドウの管理を支援します。

| 関数 | 説明 |
| :--- | :--- |
| `encodeConnectUrl(url)` | URLを`__connect_url__`クエリパラメータとして安全に渡せるようにエンコードします。 |
| `decodeConnectUrl(encoded)` | `encodeConnectUrl`でエンコードされたURLをデコードします。 |
| `parseTokenFromConnectUrl(connectUrl)` | DID Connect URLからセッショントークン（`_t_`）を抽出します。 |
| `openPopup(url, options)` | 中央に配置された新しいポップアップウィンドウを開きます。`DidConnect`コンポーネントが内部で使用し、ウォレット接続インターフェースを表示します。ポップアップがブロックされた場合は`NotOpenError`をスローします。 |
| `runPopup(config)` | `openPopup`で作成されたポップアップのライフサイクルを管理するプロミスベースのラッパーです。ポップアップからの`message`イベントをリッスンし、タイムアウトを処理し、認証フローが完了したときに解決します。 |
| `decodeUrlParams()` | 現在のウィンドウのURLからカスタムの`__did-connect__`パラメータを解析します。 |

**例：カスタムポップアップフロー**

```javascript customAuthButton.js icon=logos:javascript
import { openPopup, runPopup } from '@arcblock/did-connect-react/lib/utils';

const handleCustomLogin = async () => {
  const authUrl = 'https://your-auth-service.com/connect';
  try {
    const popup = openPopup(authUrl);
    const result = await runPopup({ popup, timeoutInSeconds: 600 });
    console.log('Authentication successful:', result);
    // ログイン成功時の処理
  } catch (error) {
    console.error('Authentication failed:', error.message);
    // ポップアップが閉じられた、またはタイムアウトした場合の処理
  }
};
```

## セッションとCookieの管理

これらのヘルパーは、ユーザーの接続情報をCookieに読み書きするために使用され、ページ読み込みをまたいだセッションの永続化を可能にします。

| 関数 | 説明 |
| :--- | :--- |
| `getConnectedInfo(data)` | 接続リクエストからの生のレスポンスデータを、Cookieストレージに適した標準化されたオブジェクトにフォーマットします。 |
| `updateConnectedInfo(info, parsed)` | 接続が成功した後、必要なCookie（`connected_did`、`connected_pk`、`connected_app`）を設定します。これにより、ライブラリは後続の認証チェックを最適化できます。 |
| `getVisitorId()` | Cookieからユニークな訪問者IDを取得します。 |
| `setVisitorId(id)` | Cookieにユニークな訪問者IDを設定します。 |

**例**

```javascript sessionManager.js icon=logos:javascript
import { getConnectedInfo, updateConnectedInfo } from '@arcblock/did-connect-react/lib/utils';

// 'authResponse'がログインAPIから返されたオブジェクトであると仮定します
function persistSession(authResponse) {
  const connectedInfo = getConnectedInfo(authResponse);
  updateConnectedInfo(connectedInfo, true);
  console.log('セッション情報がCookieに保存されました。');
}
```

## 暗号化ユーティリティ

クライアントサイドでの暗号化または復号化が必要な高度なシナリオのために、ライブラリは`tweetnacl-sealedbox-js`ライブラリをラップするヘルパーを公開しています。

| 関数 | 説明 |
| :--- | :--- |
| `encodeKey(key)` | キーを伝送用にBase64URLエンコードします。 |
| `decodeKey(str)` | Base64URL文字列を`Uint8Array`キーにデコードします。 |
| `encrypt(value, encryptKey)` | 公開鍵を使用して文字列値を暗号化します。 |
| `decrypt(value, encryptKey, decryptKey)` | 対応する公開鍵と秘密鍵を使用してbase64文字列を復号化します。 |

## エラーハンドリング

ユーザーにより良いフィードバックを提供するために、これらの関数を使用して技術的なエラーオブジェクトを人間が読めるメッセージに解析できます。

| 関数 | 説明 |
| :--- | :--- |
| `getApiErrorMessage(err, defaultMessage)` | `axios`エラーオブジェクトからユーザーフレンドリーなエラーメッセージを抽出します。 |
| `getWebAuthnErrorMessage(err, defaultMessage, t)` | WebAuthn/Passkey固有のエラー（例：ユーザーによるキャンセル、ブラウザ非対応）を処理し、ローカライズされたユーザーフレンドリーなメッセージを返します。 |

**例**

```javascript errorHandling.js icon=logos:javascript
import { getApiErrorMessage } from '@arcblock/did-connect-react/lib/utils';
import apiClient from './apiClient';

async function fetchData() {
  try {
    const response = await apiClient.get('/data');
    return response.data;
  } catch (error) {
    const message = getApiErrorMessage(error, 'データの取得に失敗しました。');
    alert(message);
  }
}
```

---

これらのユーティリティを活用することで、より複雑でカスタマイズされた認証体験を構築できます。エクスポートされたすべてのメンバーとその型の完全なリストについては、[APIリファレンス](./api-reference.md)を参照してください。