Ну для начала, я бы вырезал внутренний бехейвиор в отдельную функцию.
Есть ощущение, что внутри собственной обработки сообщений не используются уже ни sinkWorker ни один из httpWorker ов
Очевидно, сделать это было бы проще, если бы lastChunkIndex и ingestionEnded были бы порефакторены в аргументы функций.
Есть даже ощущение, что ingestionEnded - это "индикатор состояния", который опять же можно отрефакторить в раздельные бихейвиоры.
Далее не вполне понятно, почему для spawnHttpWorker такой сложный тип, часть функция каррирована, второй блок аргументов содержит аргумент, который функционально зависит от первого (context.self). Опять же -что делает обработка RegisterYourself , если ожидается, что worker не начнёт работы до этого сообщения зачем передавать ссылку на себя и в инициализации и в сообщении, и почему нельзя там же передать ссылку на Sink и исключить её из конструктора.
В третьих implicit BufferedSource выглядит очень сомнительно. Непонятно, какие методы внутри могут его имплиситно использовать. И зачем он нужен после того, как мы уже получили Iterator[In] кроме того, чтобы закрыть его в самом конце.
В общем, складывается ощущение, что смешаны несколько подходов к инициализации( функции в конструкторе, имплиситы,стартовые сообщения) , каждый из которых привносит свой кусочек сложности, и если сфокусироваться на одном, или даже развести разные подходы по разным функциям, получилось бы проще