mcpField
E
effect-ts-resources

effect-ts-resources

github.com/mrevanzak開発895 回インストール40 週間前に更新
リポジトリ

effect-ts-resources について

Scope と acquireRelease を使ってリソースのライフサイクルを管理する Effect-TS スキルです。失敗や中断時にも解放処理を実行します。

主な機能

  1. 01acquireRelease による解放保証
  2. 02スコープ内のリソース管理
  3. 03LIFO 順でのクリーンアップ
  4. 04Scope へのファイナライザー追加

活用シーン

  1. 01データベース接続の管理
  2. 02ファイルのオープンとクローズ
  3. 03サーバーの起動やロックの取得

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/mrevanzak/effect-ts-skills --skill effect-ts-resources

インストール後、Claude Code で/effect-ts-resourcesを入力して読み込まれたか確認します。

詳細

Effect-TS のリソース管理

概要

Scope と acquireRelease を使用してリソースのライフサイクルを管理し、確実にクリーンアップします。プログラムが失敗、例外をスロー、または中断した場合でも、クリーンアップは必ず実行されます。

使用する場面

  • 症状:リソースリーク(接続が終了しない)、手動の try/finally ブロック、複雑なクリーンアップロジック。
  • きっかけ:ファイルを開く、データベースに接続する、サーバーを起動する、ロックを取得する。
  • 使用しない場面:単純なデータ変換や、明示的なクローズ/解放が不要な値を扱う場合。

基本パターン

手動の try/finally は中断処理を回避してしまうため、Effect ではエラーの原因になります。

反パターン(手動)Effect のパターン(安全)
try { conn.open() } finally { conn.close() }Effect.acquireRelease(open, close)

クイックリファレンス

関数目的
Effect.acquireReleaseリソースの取得処理と、確実な解放処理を定義します。
Effect.scopedスコープ内のすべてのリソースが解放される境界を作成します。
Effect.addFinalizer現在のスコープにクリーンアップ処理を追加します。

実装

1. acquireRelease パターン

失敗時や中断時でもクリーンアップが保証されます。

import { Effect } from 'effect';

const withDatabaseConnection = Effect.acquireRelease(
  Effect.tryPromise(() => pool.connect()), // Acquire
  (connection) => Effect.sync(() => connection.release()) // Release
);

const program = Effect.gen(function* () {
  const conn = yield* withDatabaseConnection;
  return yield* conn.query('SELECT * FROM users');
});
2. スコープ付きリソース

複数のリソースが同じライフサイクル境界を共有します。リソースは LIFO(後入れ先出し)順に解放されます。

import { Effect, Scope } from 'effect';

const program = Effect.scoped(
  Effect.gen(function* () {
    const db = yield* managedConnection;
    const cache = yield* managedCache;
    // Both cleaned up when scope closes (cache first, then db)
    return yield* doWork(db, cache);
  })
);
3. ファイルの処理
const withFile = (path: string) => Effect.acquireRelease(
  Effect.tryPromise(() => fs.open(path, 'r')),
  (handle) => Effect.promise(() => handle.close())
);

よくある間違い

  • try/finally の使用:Effect の中断モデルを回避してしまいます。acquireRelease を使用してください。
  • Effect.scoped の指定忘れ:親スコープが閉じるまでリソースは解放されません(多くの場合、アプリの終了時です)。
  • 順序の誤り:リソースは取得順の逆順に解放されます。依存関係のあるリソースを先に取得してください。

必須の前提知識: 基本的なジェネレーターパターンについては effect-ts-fundamentals を使用してください。

コメント