Гугловский Firebase Cloud Messaging (FCM) не умеет работать с децентрализованными сетями. По его логике, должен быть только один аккаунт на FCM, который зашит в приложение, а сервер должен подписывать сообщения приватным ключом этого аккаунта. Естественно, это отсекает возможность установки разными людьми нескольких серверов, взаимодействующих с одним приложением, ведь тогда придётся опубликовать закрытый ключ, и в приложение посыпется спам.
Поэтому мне пришлось сделать релей (fcm.moera.org
), который переправляет сообщения от разных нод в FCM. Когда пользователь первый раз заходит в приложение, будучи залогиненным, приложение переправляет FCM-идентификатор клиента на свою домашнюю ноду, а та отправляет его на FCM-релей. Знание этого идентификатора подтверждает, что нода имеет право отправлять клиенту уведомления.
Код в FCM-релее, который формирует текст уведомления, общий с клиентом, поэтому я написал релей тоже на TypeScript. Это не так ужасно, как кажется на первый взгляд 😉