# JavaScript スクリプト

Source: https://openflow.run/ja/docs/nodes/code/
Language: ja
Product version: 0.1.0-beta.77

隔離された JavaScript モジュールで入力を変換し、明示的に定義した出力を返します。

JavaScript ノードは、データ変換、計算、対応する機能呼び出しの組み合わせに使います。変換なしの単一 HTTP 呼び出しなら、HTTP Request の方が少ない設定で済みます。

## モジュールとポート

Code は ES モジュールです。デフォルトのエクスポート関数が `(inputs, context)` を受け取り、業務出力またはその Promise を返します。

```javascript
export default ({ name, prefix }) => ({
  message: `${prefix}, ${name}!`
});
```

`config.outputs` で独自の出力スキーマを定義します。名前付き入力は直接バインドでき、必要なら `config.inputs` で制約を指定します。モジュール ID とランタイムの組み立ては公開インターフェースが管理します。

```json
{
  "op": "node.add", "as": "greet", "type": "code", "name": "Compose greeting",
  "code": "export default ({name, prefix}) => ({message: `${prefix}, ${name}!`});",
  "config": { "outputs": { "message": { "schema": { "type": "string" }, "nullable": false } } },
  "inputs": {
    "name": { "kind": "value", "value": "Ada" },
    "prefix": { "kind": "value", "value": "Hello" }
  }
}
```

Start が名前を、Value が接頭辞を渡し、Code が組み合わせ、Outputs が最終結果を定義します。

**入力**
{"name":"Ada"}

**想定される結果**
{"message":"Hello, Ada!"}

**実行前の準備**
インポートや実行には Open Flow サービスが必要です。プレビュー自体はオフラインで動作します。

[ワークフローをダウンロード](https://openflow.run/docs/examples/first-workflow.openflow.json)

## ランタイムの制限

対応する Node 組み込みモジュールは互換サブセットです。各タスクには `/tmp` を起点とする新しいメモリ内ファイルシステムが用意されます。ホストのディスクにはアクセスできず、次の呼び出しにも残りません。任意のパッケージ、動的インポート、CommonJS の `require` は使えません。

Connector のアクション、ワークフロー呼び出し、HTTP ホストは、Code の機能として明示的に宣言します。`context.fetch` は宣言済みホストと現在の Engine Contract に制限されます。プラットフォームの認証情報を継承せず、無制限のネットワーク接続も許可しません。

## 永続的な結果と失敗

業務出力は JSON で返します。実行に属するバイトデータには Artifact インターフェースを、実行間の業務値には明示的な [Flow State](https://openflow.run/ja/docs/concepts/flow-state/index.md) を使います。仮想ファイルやローカルのグローバル変数は永続ストレージではありません。

Code は[タスク再試行とエラー処理](https://openflow.run/ja/docs/concepts/errors-and-retries/index.md)に対応します。再試行はモジュール全体を繰り返すため、外部操作も重複する場合があります。リソース制限、取消し、結果不明の扱いはランタイム仕様に従います。

## 参照元

*   [docs/authoring/node-authoring.md](https://github.com/oomol-lab/open-flow/blob/e25a738d170322734572a0b8a1323cb00b9d355a/docs/authoring/node-authoring.md)
*   [docs/control/contracts/nodejs-runtime.md](https://github.com/oomol-lab/open-flow/blob/e25a738d170322734572a0b8a1323cb00b9d355a/docs/control/contracts/nodejs-runtime.md)
*   [docs/control/contracts/control-api.md](https://github.com/oomol-lab/open-flow/blob/e25a738d170322734572a0b8a1323cb00b9d355a/docs/control/contracts/control-api.md#10-code-action-contract)
*   [packages/open-flow/src/workbench/browser/runtime/editor/addNodeOptions.ts](https://github.com/oomol-lab/open-flow/blob/e25a738d170322734572a0b8a1323cb00b9d355a/packages/open-flow/src/workbench/browser/runtime/editor/addNodeOptions.ts)
