sumo-logger (js-sumo-logger) sumoLogger.log Возвращает или boolean или Promise

Ситуация

При вызове метода логгирования какого-то API получаем ошибку:

TypeError: result.then is not a function at ...

Ошибка связана с тем, что sumoLogger.log() может возвращать boolean, ошибка происходит при обработке логгирования:

 const result = this.sumoLogger.log<LogMessage>(log) as Promise<any>;
    console.log(' result', result);
    result
      .then(() => { // если boolean, то метод then не определен!
        this.logger.debug('Send to SumoLogic: %o', log);
      })
      .catch((error) => {
        this.logger.error('Send error: %o', error);
      });

При этом в настройках у нас returnPromise: true:

this.sumoLogger = new SumoLogger({
      endpoint: this.configService.get<string>('SL_HTTP_ADDRESS') || '',
      returnPromise: true,
});

Таким образом, допущение:

as Promise<any>

в коде выше является ошибкой, так как мы можем получить и boolean

Что не так

Формально про опцию returnPromise имеем:

returnPromise (optional)

Default: TRUE. Causes log() to return a promise and ignore the onSuccess and onError handler options (if passed). ONLY works when logs are sent individually and not batched (interval: 0).

Тем не менее мы получаем boolean

Как быстро воспроизвести

  • Просто вызовите в коде sumoLogger.log() два раза подряд, чтобы один запрос логгировался дважды при настройках, указанных выше
  • ошибка проявится и про быстрых повторных вызовах метода логгирования в api даже с одним sumoLogger.log(), но два подряд вызова не снаружи, а прямо в методе гарантировано проявят проблему

Причина в коде

"Проблема" вот в этой строке файла исходников:

     
if (this.logSending || this.pendingLogs.length === 0) {
     return false;
}

-- если предыдущая отправка ещё не завершилась, ничего отправляться не будет, просто вернется false.

Возможное решение

Получается, что фактически слать логи подряд без настроенного interval и/или batchSize не получится (ну или просто некоторые сообщения будут пропадать)

Источники: