This is a small, demo part of the project of interaction with Worker / Shared Woeker through Promise. Written during the refactoring of SingularityApp. For informational purposes and a series of articles for Habr.
Singularity is closer than you think!
SharedWorker is a separate process available to all windows (one instance for all).
For debugging purposes, instead of SharedWorker, you can run a regular Worker (created by index.ts) - it has easy access to the console.
__WORKER_CONTEXT__
- contains the context in which the code is currently executing (Main, Worker, Renderer)
In the Renderer context, a Server object is created that can communicate with the SharedWorker
Supports sending messages, format IWorkerAction
with waiting for processing response, via Promise
Emitter + Timeout is used to implement Promise. All messages are numbered (uid) and signed by a specific client
Window -> {message: id} -> postMessage -> worker ->
dispatch ->
ResultPromise ->
emitter -> on(id) -> resolve <-----------------|
timeout -> reject
The mechanism of work through Promise + Emitter + Timeout is implemented for Client and Worker
todo: In this implementation, there is no way to wait for the SharedWorker to be fully initialized before the first request is sent. Needs to be finished.
Это небольшая, демонстрационная часть проекта взаимодействия с Worker / Shared Woeker через Promise. Написана в ходе рефакторинг SingularityApp. Для ознакомительных целей и цикла статей для Habr.
SharedWorker — отдельный процесс, доступный всем окнам (один экземпляр для всех).
В целях отладки вместо SharedWorker можно запустить обычный Worker (создается index.ts) — он имеет простой доступ к консоли.
__WORKER_CONTEXT__
— содержит контекст, в котором сейчас выполняется код (Main, Worker, Renderer)
В контексте Renderer создается объект Server, умеющий общаться с SharedWorker
Поддерживается отправка сообщений, формата IWorkerAction
с ожиданием ответа обработки, через Promise
Для реализации Promise используется Emitter + Timeout. Все сообщения нумеруются (uid) и подписываются конкретным клиентом
Окно -> {message: id} -> postMessage -> worker ->
dispatch ->
ResultPromise ->
emitter -> on(id) -> resolve <-----------------|
timeout -> reject
Механизм работы через Promise + Emitter + Timeout реализован для Клиента и Worker
todo: В данной реализации нет способа дождаться полной инициализации SharedWorker до того, как будет отправлен первый запрос.