moysklad-extension-queue
------------------------

> Расширение для библиотеки [moysklad](https://github.com/wmakeev/moysklad)

Добавляет возможность котролировать поток запросов.
Используется для избежания ошибки 429 при интенсивном обмене с API.

## Установка

```
$ npm install moysklad-extension-queue
```

## Использование

```js
const MoyskladQueue = require('moysklad-extension-queue')
const MoyskladCore = require('moysklad')

const Moysklad = MoyskladCore.compose(MoyskladQueue)

const moysklad = Moysklad({
  queue: true // включение очереди запросов
})
```

Очередь глобальная, т.е. для всех запросов всех экземпляров библиотеки в рамках приложения будет
использоваться одна общая очередь.

```js
const Moysklad = MoyskladCore.compose(MoyskladQueue)
const moysklad1 = Moysklad({ queue: true })
const moysklad2 = Moysklad({ queue: true })
const moysklad3 = MoyskladCore.compose(MoyskladQueue).create({ queue: true })

// для moysklad1, moysklad2 и moysklad3 будет общая очередь
```

Для каждого логина автоматически создается отдельная очередь.

```js
const moysklad1 = Moysklad({
  login: 'user1@account',
  password: '****',
  queue: true
})

const moysklad2 = Moysklad({
  login: 'user2@account',
  password: '****',
  queue: true
})

// для moysklad1 и moysklad2 очереди будут разные
```

## Настройка

Можно указать параметры очереди

```js
const moysklad = Moysklad({
  queue: {
    period: 5500,
    tasksPerPeriod: 100,
    parallelTasks: 50
  }
})
```

Параметр | Ограничение МойСклад | По умолчанию | Описание
---------|----------------------|--------------|---------
`period` | 3000 | 3100 | период (мс) на который ставится ограничение по максимальному кол-ву запросов
`tasksPerPeriod` | 45 | 44 | максимальное кол-во запросов за период `period`
`parallelTasks` | 5 | 5 | максимальное кол-во параллельных запросов

Или в глобальных переменных

```
MOYSKLAD_QUEUE_PERIOD_MS=3000
MOYSKLAD_QUEUE_PERIOD_TASKS=45
MOYSKLAD_QUEUE_PARALLEL_TASKS=5
```

[Официальная информация по лимитам](https://online.moysklad.ru/api/remap/1.1/doc/#header-ограничения)
