Skip to content

feat(converter): 複数入力セッションでConverterを共有可能にする - #353

Merged
ensan-hcl merged 3 commits into
mainfrom
feat/converter-sessions
Aug 2, 2026
Merged

feat(converter): 複数入力セッションでConverterを共有可能にする#353
ensan-hcl merged 3 commits into
mainfrom
feat/converter-sessions

Conversation

@ensan-hcl

@ensan-hcl ensan-hcl commented Aug 2, 2026

Copy link
Copy Markdown
Member

概要

1つの KanaKanjiConverter を複数の入力コンテキストで共有できるよう、変換状態を明示的なセッションとして切り替える API を追加します。

また、未保存の学習変更がない場合は学習辞書のマージとキャッシュ破棄を省略します。

背景

azooKeyDesktop の ConverterServer では、アプリごとの入力セッションごとに KanaKanjiConverter.withDefaultDictionary() を生成していました。この構成では辞書・モデル・Converter 単位のキャッシュが実行レーンごとに重複し、新しいアプリで入力を始めるたびに初期化コストが発生します。

Converter を1インスタンスに共有しつつ、入力途中の lattice・予測キャッシュ・学習文脈などは入力セッション間で混ざらない API が必要です。

共有Converterでは、アプリ切替時の deactivate も全入力レーンと同じ実行キューを使います。従来の commitUpdateLearningData() は変更がない場合も既存学習辞書をマージしてキャッシュを破棄するため、新しい入力レーンのキー処理を不要な同期I/Oで待たせていました。

変更内容

  • ConversionSessionIDcreateSession() / removeSession(_:) を追加
  • withSession(_:operation:) で同期処理中だけ対象セッションを有効化
  • stopComposition() が他セッションを破棄せず、現在のセッションだけを初期化するよう変更
  • 学習用の直前候補 lastData をセッション状態へ移動
  • セッション削除・分離・ネスト復元を確認するテストを追加
  • 未保存の学習変更がない save() は辞書マージを行わず、呼び出し側もメモリ辞書キャッシュを維持
  • 学習変更の有無による保存動作を確認するテストを追加

KanaKanjiConverter 自体は引き続きスレッドセーフではありません。共有する呼び出し側で Converter アクセスを直列化する前提です。

テスト

  • swift test --filter ConverterSessionTests
  • swift test --filter ConverterSessionTests -Xswiftc -strict-concurrency=complete
  • swift test --filter LearningMemoryTests(5 tests passed)
  • 全体スイートでは既存の ConverterTests/testKimiAndThenDelete が辞書 [006D] の欠落により失敗しますが、同じ失敗は変更前の origin/main でも再現します。

関連

@ensan-hcl
ensan-hcl marked this pull request as ready for review August 2, 2026 14:18
@ensan-hcl ensan-hcl self-assigned this Aug 2, 2026
@ensan-hcl
ensan-hcl merged commit 93766c4 into main Aug 2, 2026
16 checks passed
@ensan-hcl
ensan-hcl deleted the feat/converter-sessions branch August 2, 2026 14:19
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