# 環境変数

> sharedState を使って Proxyman のスクリプト間でデータを共有し、$ プレフィックスを付けて API トークンなどのシステム環境変数をスクリプト内で読み取る方法を紹介します。

## 1. 共有ステート {#1-shared-state}

> **備考:** 共有ステートは、Proxyman がサポートするすべての macOS バージョン（**macOS 14 Sonoma 以降**）で利用できます。

グローバルオブジェクトの **sharedState** を使うと、**onRequest()** と **onResponse()** の間、そして**別のスクリプト**同士でステートを共有できます。

* **sharedState** は JS オブジェクト（ディクショナリ）です。**onRequest()** で任意のキーと値を設定すると、**onResponse()** や**別のスクリプト**でそのデータを読み取れます。

次のコードでは、以下の処理の方法を示します。

* グローバルカウンターを取得して、スクリプトが実行されるたびに増やす
* リクエストとレスポンスの間でデータを共有する

```javascript
function onRequest(context, url, request) {

  // Save some state to sharedState
  sharedState.url = url;
  sharedState.data = "custom";
  sharedState.info = {"username": "Proxyman"};
  
  // Increase the global counter
  var count = sharedState.count ?? 0;
  count += 1;
  sharedState.count = count;
  
  // Log
  console.log(sharedState);
  return request;
}

function onResponse(context, url, request, response) {

  // Receive it
  console.log("Custom data = " + sharedState.data);
  console.log("sharedState.count = " + sharedState.count);
  
  // Done
  return response;
}
```

> **備考:** Proxyman 2.25.0 以降では、**sharedState** を別のスクリプト間でも利用できます。Proxyman を終了するか、\`clearSharedState()\` 関数を呼び出した場合にのみ解放されます。

> **備考:** Proxyman 2.24.0 より前のバージョンでは、**sharedState** は、それを実行しているスクリプトのフロー内でのみ有効です。スクリプトの実行が終わると解放されます。

すべてのデータを消去するには、\`clearSharedState()\` 関数を使用します。

```javascript
// Clear all data from sharedState object
clearSharedState();
```

## 2. 環境変数 {#2-environment-variables}

Environment Variables 機能は **Proxyman 3.8.0** 以降で利用できます。

* スクリプトからシステムの環境変数を読み取れます。
* bash と zsh に対応しています。

### 使い方 {#how-to-use}

1. `~/.zshrc` または `~/.bashrc` で環境変数を定義します

```bash
export ACCESS_TOKEN=AAABBBCCC
export PROXYMAN_PATH=/Users/my_user/Desktop/file-mapper
```

2\. 任意のスクリプトを開き、**More** ボタン -> **Environment Variables** -> **Allow all scripts to access Environment Variables** の順にクリックします。

3\. **Reload** をクリックして、環境変数の最新の変更を読み込みます。

![Environment Variables が開いている Proxyman Script Editor の More メニュー。Allow all scripts to access Environment Variables と Reload が表示されています](https://proxyman.com/docs/assets/proxyman-script-environment-variables-menu.jpg)

_スクリプトに環境変数の読み取りを許可する_

4\. スクリプト内では `$` プレフィックスを付けて環境変数にアクセスします。

```javascript
async function onResponse(context, url, request, response) {
  console.log($PATH);
  console.log($ACCESS_TOKEN);
  console.log($PROXYMAN_PATH);
 
  // Done
  return response;
}
```

## 3. 追加機能 {#3-additions}

* システムの環境変数を手動で再読み込みできます（Proxyman macOS 4.15.0 以降）。先に権限を有効にしてください。**More** ボタン -> **Environment Variables** -> **Allow all scripts to access Environment Variables** の順に選択します。

```javascript
async function onRequest(context, url, request) {
  // manually reload to get the latest changes
  _reloadEnv();
  
  // get env
  console.log($PROXYMAN_ID)
  
  // Done
  return request;
}

```
