Утечка памяти, в чем может быть дело?

Скрипт подключает бота на сервер Майнкрафт. Если боту не удается зайти два раза - он ребутает контейнер.

Проверил в процессах (top) - течет нода. Однако, не могу понять пока что может вызывать этот эффект.

var mineflayer = require('mineflayer');
const {
    exec
} = require("child_process");

var interval = 20
var count = 0

    console.log("Запущен скрипт: " + new Date().toLocaleString())

    async function doStuff() {

    if (count > 1) {
        console.log("Ребут: " + new Date().toLocaleString())
        count = 0
        //какой-то код, который не влияет.
    } else {

        count++

        var botName = "Arkadii7318"

            const bot = mineflayer.createBot({
            host: "play.minecraft.ru",
            port: 25570,
            username: botName,
            version: '1.12.2'
        });

        bot.on('login', login => {
            count = 0
            setTimeout(() => bot.end(), 3000)
        })

    }

}

let checking = setInterval(() => doStuff(), interval * 1000);

Ответы (1 шт):

Автор решения: nörbörnën

Думаю, аккуратнее было бы написать так:

// @ts-check
const mineflayer = require('mineflayer');

const delayValue = 20 * 1000;
let timer;
let count = 0;

/** @type {import('mineflayer').BotOptions} */
const bot_credentials = {
  host: 'play.minecraft.ru',
  port: 25570,
  username: 'Arkadii7318',
  version: '1.12.2'
};


async function doStuff() {
  if (count > 1) {
    await restartContainer();
    count = 0;
    return;
  }

  count++;
  try {
    await botHealthCheck();
    count--;
  } catch (err) {
    console.error('fail: ', err);
  }
}

async function botHealthCheck() {
  return new Promise((resolve, reject) => {
    try {
      setTimeout(() => reject(new Error('TIMED_OUT')), 5 * 1000);

      const bot = mineflayer.createBot(bot_credentials);
      bot.once('login', () => {
        resolve();
        bot.quit();
      });
      bot.once('error', reject);
    } catch (err) {
      reject(err);
    }
  });
}

async function restartContainer() {
  console.log("Ребут: " + new Date().toLocaleString());
  return Promise.resolve();
}


timer = setInterval(doStuff, delayValue);

→ Ссылка