Pull 26.0.0 и 26.100.0: sendBadges() удалён, protobuf.js в браузере стал minimal
Ломающее обновление
Удалены или изменены публичные API — прикладной код может перестать работать.
Pull приехал двумя версиями подряд: 26.0.0 (сборка от 22 июля) и 26.100.0 (от 7 августа). Первая удалила CPushManager::sendBadges() и превратила MobileCounter::send() в заглушку, вторая заменила встроенный protobuf.js 2018 года на 7.6.5 в урезанной minimal-сборке. Читать стоит тем, кто сам шлёт бейджи через CPushManager или MobileCounter, и тем, чей JS пользуется глобальным protobuf на страницах с pull.
Уберите вызовы sendBadges() и MobileCounter::send()
В 26.0.0 из CPushManager (classes/general/pull_push.php) удалён метод sendBadges($userId = null, $appId = self::DEFAULT_APP_ID). Он был однострочной обёрткой над \Bitrix\Pull\MobileCounter::send(), и вызов из вашего кода теперь закончится фаталом Call to undefined method.
С MobileCounter::send() обошлись мягче. Метод на месте, сигнатура та же, но тело заменено на return false;, а в докблоке появился @deprecated со ссылкой на Bitrix\Pull\Push::add. Раньше он брал пользователя из глобального $USER, если $userId не передан, и вызывал Push::add() с 'badge' => 'Y'. Теперь вызов молча возвращает false, и пуш не уходит.
Туда же ушла реакция на сброс счётчика ленты. MobileCounter::onSonetLogCounterClear() больше не зовёт send(), а регистрацию обработчика socialnetwork:OnSonetLogCounterClear убрали из install/index.php. Снятия регистрации на уже установленных порталах в диффе не видно. Если апдейтер её не снял, обработчик будет вызываться вхолостую, так что проверьте b_module_to_module. Кто теперь шлёт бейдж при сбросе счётчика, дифф тоже не показывает. В пометке @deprecated сказано только, что отправку пушей перенесли в сервис Push.
Заменяйте прямым вызовом Push::add() с теми же параметрами, что раньше собирал send():
<?php declare(strict_types=1);
namespace Vendor\Mobile\Push;
use Bitrix\Main\Loader;
use Bitrix\Pull\Push;
final class BadgeNotifier
{
public function notify(int $userId): bool
{
if ($userId <= 0 || !Loader::includeModule('pull')) {
return false;
}
Push::add($userId, [
'module_id' => 'pull',
'push' => ['badge' => 'Y'],
]);
return true;
}
}
Подстановки текущего пользователя из $GLOBALS['USER'], как в старом send(), здесь нет, $userId передаётся явно.
Проверьте, чем ваш JS пользуется в глобальном protobuf
В 26.100.0 рантайм pull/install/js/pull/protobuf/protobuf.js обновили с v6.8.6 (собран в феврале 2018) до v7.6.5 (собран 4 июля 2026). Сменился и тип сборки: в файле было protobuf.build = "full", стало protobuf.build = "minimal". Та же библиотека вшита в connector.bundle.js и pull.worker.bundle.js.
Minimal-сборка кодирует и декодирует сообщения по заранее сгенерированным классам. Самому pull этого хватает, его model.js сгенерирован pbjs -t static-module и парсер не использует. А из глобального объекта protobuf пропали парсер и reflection:
- загрузка и разбор схем:
load,loadSync,parse,tokenize,common; - reflection-классы:
Root,Type,Field,MapField,Enum,OneOf,Namespace,ReflectionObject,Service,Method,Message; - генераторы и хелперы:
encoder,decoder,verifier,converter,types,wrappers.
Остались Reader, Writer, BufferReader, BufferWriter, util, rpc, roots и configure.
Если ваш фронтенд подхватывал этот глобальный protobuf и грузил через него свои .proto или собирал типы через Root.fromJSON(), после обновления такие вызовы упадут, потому что этих свойств больше нет. Посмотреть, какая сборка загружена на странице, можно из консоли браузера:
console.log(globalThis.protobuf?.build); // 'full' до 26.100.0, 'minimal' после
console.log(typeof globalThis.protobuf?.Root); // 'undefined' на minimal
Если reflection вам нужен, держите свою сборку protobuf.js модулем внутри своего бандла и не кладите её в глобальную область. Pull ищет свою модель в globalThis.protobuf.roots['push-server'], и подмена глобального объекта ударит уже по нему.
Сверьте список поддерживаемых браузеров
Бандлы pull.connector и pull.worker пересобраны, и транспиляции современного синтаксиса в них больше нет. Раньше вызов логгера в dist выглядел как (_this$logger = this.logger) == null ? void 0 : _this$logger.log(...), теперь там this.logger?.log(...). Вместо x != null ? x : y теперь x ?? y, а присваивания в конструкторе после super(...args) превратились в поля класса. Движок без поддержки этого синтаксиса бандл не распарсит.
Проверяйте результат Event::add() с user_params
Единственная PHP-правка 26.100.0 сделана в Bitrix\Pull\Event (lib/event.php). Когда JSON-RPC не используется, а в параметрах есть user_params или dictionary, Event::add() уходит в приватный generateEventsForUsers(). Раньше этот вызов шёл без присваивания, а сам generateEventsForUsers() ничего не возвращал, поэтому вызывающий код не узнавал, приняты ли события в очередь. Теперь он возвращает bool, и add() отдаёт его наверх. true получится, только если был хотя бы один вызов addEvent() и все такие вызовы вернули true. При пустом списке получателей addEvent() не вызывается ни разу, и результат будет false. В режиме JSON-RPC эта ветка не используется.
Заодно приватный generateEventsForUsers() перестал шуметь на неполных параметрах. params теперь приводится к массиву, а dictionary и user_params читаются через ?? null.
<?php declare(strict_types=1);
use Bitrix\Main\Loader;
use Bitrix\Pull\Event;
Loader::requireModule('pull');
$sent = Event::add([15, 42], [
'module_id' => 'vendor.tasks',
'command' => 'taskUpdated',
'params' => ['taskId' => 7],
// персональные параметры сливаются с общими через array_merge
'user_params' => [
42 => ['role' => 'auditor'],
],
]);
if (!$sent) {
// с 26.100.0: какой-то addEvent() вернул false или получателей не оказалось
}
Новое в модели push-сервера
В pull/install/js/pull/protobuf/model.js появился тип RegisterRequest с двумя строковыми полями, verificationQuery и host, а в oneof command сообщения Request добавлено поле registration под номером 4. Коннектор и воркер его пока не используют, так что это заготовка. У всех 17 типов модели появился статический getTypeUrl(), его генерирует pbjs 7. Рядом с protobuf.js лёг минифицированный protobuf.min.js.
Мелочи и находки
- Из
pull/install/js/pull/protobuf/bootstrap.es6.jsудалилиconsole.log('xxx');. - Шапка
model.jsтеперь сообщает, чем модель генерировали:pbjs -t static-module ... --no-verify --no-convert --no-delimited -p pull/dev/protobuf, protobufjs-cli 1.3.3. Там же записка для своих разработчиков: после каждой регенерации руками менять UMD-обёртку на поиск рантайма в глобальной области, чтобы модель работала без AMD/CommonJS и в SharedWorker. Самихrequest.protoиresponse.protoв диффе нет. - Код, который генерирует pbjs 7, строже старого. Конструкторы сообщений пропускают ключ
__proto__, аencodeиdecodeсчитают глубину вложенности. При превышении лимитаencodeбросаетmax depth exceeded, аdecodeбросаетmaximum nesting depth exceeded. - В
connector/src/codec/models.jswindow.protobufзаменили наglobalThis.protobuf. Комментарий объясняет, что модуль вшивается и в SharedWorker. - Сборщик выкинул из бандлов неиспользуемые константы. В
CloseReasonsиз десяти кодов осталось четыре (CONFIG_REPLACED,SERVER_RESTARTED,STUCK,WRONG_CHANNEL_ID), изServerModeпропалPersonal. Бандл экспортирует толькоConnectorиConnectorEvents, так что снаружи этих констант не было видно и раньше. - В 26.0.0 из приватного
CPullChannel::SendCommand()убралиCHTTP::PrepareData(), а строка$httpClient->disableSslVerification();//todo: removeосталась на месте. - Ещё в 26.0.0 по всему модулю
\CHTTP::urlAddParams()заменили на(new Uri($url))->addParams(): вConfig::getPublishUrl(),Config::getJsonRpcUrl(),JsonRpcTransport,ProtobufTransportиCPullChannel. self::$staticCache[$lockId]вCPullChannelчитается через?? null, и первое обращение к кешу канала больше не даёт предупреждения о несуществующем ключе.- Ревизия API коннектора прежняя,
REVISION = 19. Схема БД не менялась ни в одной из двух версий.
Что делать
Перед обновлением прогоните поиск по проекту: sendBadges( и MobileCounter::send( в PHP, protobuf.load, protobuf.parse и protobuf.Root в JS. После обновления проверьте на тестовом портале, приходит ли бейдж после сброса счётчика ленты.
Устаревшие и удалённые API в этой версии
| Символ | Статус | Чем заменять |
|---|---|---|
Bitrix\Pull\MobileCounter::send()
|
Deprecated |
Bitrix\Pull\Push::add()
|
CPushManager::sendBadges()
|
Удалено |
Bitrix\Pull\Push::add()
|