Skip to content

refactor: electron/main/ipc/ogp.ts cache を LruCache に置換し TTL sweep を撤去#352

Merged
ymnao merged 2 commits into
mainfrom
feature/main-ogp-lru-cache
Jul 18, 2026
Merged

refactor: electron/main/ipc/ogp.ts cache を LruCache に置換し TTL sweep を撤去#352
ymnao merged 2 commits into
mainfrom
feature/main-ogp-lru-cache

Conversation

@ymnao

@ymnao ymnao commented Jul 18, 2026

Copy link
Copy Markdown
Owner

概要

electron main process 側の OGP メタデータキャッシュ (electron/main/ipc/ogp.ts) を、renderer 側で PR #349#351 で導入・展開した src/lib/lru-cache.tsLruCache に統合。LruCache 5 caller 目 で、renderer / main の両 bundle 境界を跨いで cache 実装を統一する。

関連 Issue

なし (HANDOFF 98/99/100 で defer 継続していた次段タスク)

移行 Stage

  • Stage 5: OGP / PDF / アップデート

(main-side OGP IPC の内部リファクタで、Stage 5 に相当するが仕様変更なし)

変更内容

  • electron/main/ipc/ogp.ts
    • Map<string, CacheEntry> + 手動 1-pass TTL sweep + oldest 探索 (22 行) を LruCache<string, CacheEntry>(MAX_CACHE_SIZE=500) に置換
    • 24h TTL sweep は撤去。freshness は cacheGet の read-time TTL check で substitute (invisible な stale は cap-based LRU で bounded)
    • MAX_CACHE_ENTRIESMAX_CACHE_SIZE で sibling cache (mermaid / slide-render / math / link-cards) と命名整合
    • cacheGetLruCache.get() を継続使用 (touch)。main-side ogp cache は set が 1 回・get が多数の pattern で、.peek() 化すると FIFO 相当に退化するため
  • tsconfig.node.json
    • main-side から src/lib/lru-cache.ts を import 可能にするため include に追加。self-contained なので追加コストなし
  • electron/main/ipc/ogp.test.ts
    • 定数名リネームに追随

動作確認

  • pnpm tsc -p tsconfig.node.json PASS
  • pnpm tsc -p tsconfig.web.json PASS
  • pnpm biome check PASS
  • pnpm vitest run 2547 pass (0 fail, 2 skipped) — うち electron/main/ipc/ogp.test.ts 12/12 pass
  • pnpm electron-vite build PASS
  • 実 Electron 起動での手動確認 (500 件超の URL / 24h 経過 stale / cancel 経路) — 次セッション以降
検証エビデンス

リスク分類

tier: medium — reasons なし (classify-risk.sh の default 分類)

実行した検証

種別 コマンド 結果
Typecheck (node) pnpm tsc -p tsconfig.node.json PASS
Typecheck (web) pnpm tsc -p tsconfig.web.json PASS
Lint pnpm biome check electron/main/ipc/ogp.ts electron/main/ipc/ogp.test.ts tsconfig.node.json PASS
テスト pnpm vitest run PASS 2547 (skipped 2)
ビルド pnpm electron-vite build PASS
レビュー /simplify (4 agent Reuse/Simplification/Efficiency/Altitude) 0 findings
レビュー /code-review medium (8 finder + verify) correctness bug 0 / A1 (LRU 意味論明示 comment) 適用
レビュー codex-review security PASS (0 findings)

レビュー指摘と対応

Perspective Verdict Findings Confirmed Refuted Fixed Report-only Unresolved
/simplify Reuse PASS 0 - - - - -
/simplify Simplification PASS 0 - - - - -
/simplify Efficiency PASS 0 - - - - -
/simplify Altitude PASS 0 - - - - -
/code-review medium FIXED 3 PLAUSIBLE 1 (comment 明示) 2 (net loss / test injection 必要) 1 0 0
codex security PASS 0 - - - - -

/code-review medium 詳細:

  • A1: ogp.ts:29-30 cache コメントが「最古 1 件」→ LRU 意味論明示 (644f7c1) → CONFIRMED+FIXED
  • A3/F1: cacheGet expired 分岐で .get().peek() 化 → REFUTED (happy path が 3→4 map ops で悪化する net loss)
  • E1: cacheSet inline → REFUTED (test now 注入で helper が必要)

追跡先

なし

Draft 判定

  • 判定: normal
  • 根拠: step 4 — codex security PASS + /simplify 0 findings + /code-review correctness bug 0、追跡先なし

ymnao added 2 commits July 18, 2026 23:51
- `Map<string, CacheEntry>` + 手動 1-pass TTL sweep + oldest 探索 (22 行) を
  `src/lib/lru-cache.ts` の `LruCache<string, CacheEntry>(MAX_CACHE_SIZE=500)` に
  置換。cap eviction は LruCache が O(1) で担う
- 24h TTL sweep は撤去。freshness は cacheGet の read-time TTL check
  で substitute (invisible な stale は cap-based LRU で bounded)
- main-side から `src/lib/lru-cache.ts` を import できるよう
  `tsconfig.node.json` の include に追加。renderer bundle と main bundle の
  両方に含まれるが、lru-cache.ts は self-contained なので追加コストなし
- 定数名 `MAX_CACHE_ENTRIES` → `MAX_CACHE_SIZE` で sibling cache (mermaid.ts /
  slide-render.ts / math.ts / link-cards.ts) と命名整合
- cacheGet は LruCache.get() を継続使用 (touch)。main-side ogp cache は set
  が 1 回、get が多数の pattern なので .peek() 化すると FIFO 相当に退化する
@ymnao
ymnao merged commit fdae1fa into main Jul 18, 2026
9 checks passed
@ymnao
ymnao deleted the feature/main-ogp-lru-cache branch July 18, 2026 15:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant