Skip to content

Руководство по конфигурации

Полное руководство по настройке Wildberries TypeScript SDK для различных окружений и сценариев использования.

Содержание

Обзор

SDK предоставляет гибкие опции конфигурации для адаптации к различным окружениям, требованиям производительности и операционным потребностям.

Интерфейс конфигурации

typescript
interface SDKConfig {
  // Обязательное
  apiKey: string;

  // Опциональные переопределения
  baseUrls?: Partial<Record<string, string>>;
  timeout?: number;
  retryConfig?: RetryConfig;
  rateLimitConfig?: RateLimitConfig;
  logLevel?: 'debug' | 'info' | 'warn' | 'error';
}

Справочник API: См. SDKConfig для полной документации интерфейса конфигурации со всеми доступными опциями.

Базовая конфигурация

Минимальная настройка

typescript
import { WildberriesSDK } from 'daytona-wildberries-typescript-sdk';

const sdk = new WildberriesSDK({
  apiKey: process.env.WB_API_KEY!
});

Стандартная настройка

typescript
const sdk = new WildberriesSDK({
  apiKey: process.env.WB_API_KEY!,
  timeout: 30000, // 30 секунд
  logLevel: 'warn'
});

Полная конфигурация

typescript
const sdk = new WildberriesSDK({
  apiKey: process.env.WB_API_KEY!,

  // Конфигурация таймаута
  timeout: 30000,

  // Конфигурация повторов
  retryConfig: {
    maxRetries: 3,
    retryDelay: 1000,
    exponentialBackoff: true,
  },

  // Лимит запросов
  rateLimitConfig: {
    requestsPerSecond: 10,
    requestsPerMinute: 100,
  },

  // Логирование
  logLevel: process.env.NODE_ENV === 'production' ? 'warn' : 'debug',
});

Конфигурация для конкретных окружений

Окружение разработки

typescript
// config/development.ts
export const developmentConfig = {
  apiKey: process.env.WB_API_KEY!,
  timeout: 60000, // Более длинный таймаут для отладки
  logLevel: 'debug' as const,
  retryConfig: {
    maxRetries: 1, // Быстрый провал в разработке
    retryDelay: 500,
    exponentialBackoff: false,
  }
};

Окружение продакшн

typescript
// config/production.ts
export const productionConfig = {
  apiKey: process.env.WB_API_KEY!,
  timeout: 30000,
  logLevel: 'warn' as const,

  retryConfig: {
    maxRetries: 5,
    retryDelay: 2000,
    exponentialBackoff: true,
  },

  rateLimitConfig: {
    requestsPerSecond: 8, // Консервативный лимит
    requestsPerMinute: 80,
  }
};

Окружение тестирования

typescript
// config/test.ts
export const testConfig = {
  apiKey: 'test-api-key',
  timeout: 5000, // Короткий таймаут для тестов
  logLevel: 'error' as const,

  retryConfig: {
    maxRetries: 0, // Без повторов в тестах
    retryDelay: 0,
    exponentialBackoff: false,
  }
};

Фабрика конфигураций

typescript
// config/index.ts
import { developmentConfig } from './development';
import { productionConfig } from './production';
import { testConfig } from './test';

export function getConfig() {
  const env = process.env.NODE_ENV || 'development';

  switch (env) {
    case 'production':
      return productionConfig;
    case 'test':
      return testConfig;
    default:
      return developmentConfig;
  }
}

// Использование
import { getConfig } from './config';
const sdk = new WildberriesSDK(getConfig());

Расширенная конфигурация

Динамическая конфигурация

typescript
class ConfigurableSDK {
  private sdk: WildberriesSDK;
  private config: SDKConfig;

  constructor(initialConfig: SDKConfig) {
    this.config = initialConfig;
    this.sdk = new WildberriesSDK(this.config);
  }

  updateConfig(updates: Partial<SDKConfig>) {
    this.config = { ...this.config, ...updates };
    this.sdk = new WildberriesSDK(this.config);
  }

  getSDK(): WildberriesSDK {
    return this.sdk;
  }
}

// Использование
const configurableSDK = new ConfigurableSDK({
  apiKey: process.env.WB_API_KEY!,
  timeout: 30000
});

// Позже, обновление конфигурации
configurableSDK.updateConfig({
  timeout: 60000,
  logLevel: 'debug'
});

Флаги функций

typescript
interface FeatureFlags {
  enableCaching: boolean;
  enableMetrics: boolean;
  enableRetry: boolean;
  enableRateLimiting: boolean;
}

class FeatureFlagSDK {
  private sdk: WildberriesSDK;
  private flags: FeatureFlags;

  constructor(config: SDKConfig, flags: FeatureFlags) {
    this.flags = flags;

    this.sdk = new WildberriesSDK({
      ...config,
      retryConfig: flags.enableRetry ? config.retryConfig : {
        maxRetries: 0,
        retryDelay: 0,
        exponentialBackoff: false,
      }
    });
  }

  async getWithFeatures<T>(
    operation: () => Promise<T>
  ): Promise<T> {
    if (this.flags.enableCaching) {
      // Сначала проверить кэш
    }

    if (this.flags.enableMetrics) {
      // Отслеживать метрики
    }

    return operation();
  }
}

Мультитенантная конфигурация

typescript
class MultiTenantSDK {
  private sdkInstances = new Map<string, WildberriesSDK>();

  getSDK(tenantId: string): WildberriesSDK {
    if (!this.sdkInstances.has(tenantId)) {
      const config = this.getConfigForTenant(tenantId);
      this.sdkInstances.set(
        tenantId,
        new WildberriesSDK(config)
      );
    }

    return this.sdkInstances.get(tenantId)!;
  }

  private getConfigForTenant(tenantId: string): SDKConfig {
    return {
      apiKey: process.env[`WB_API_KEY_${tenantId}`]!,
      timeout: 30000,
      logLevel: 'warn',
    };
  }
}

Конфигурация таймаута

Глобальный таймаут

Установите таймаут по умолчанию для всех запросов:

typescript
const sdk = new WildberriesSDK({
  apiKey: process.env.WB_API_KEY!,
  timeout: 60000, // 60 секунд для всех запросов
});

Таймаут по умолчанию — 30 секунд (30000мс). Увеличьте для окружений с медленной сетью или при работе с большими наборами данных.

Таймаут для отдельного запроса

Переопределите глобальный таймаут для отдельных запросов, которым нужно больше (или меньше) времени:

typescript
// Для длительных операций увеличьте глобальный таймаут:
const sdkForReports = new WildberriesSDK({
  apiKey: process.env.WB_API_KEY!,
  timeout: 120000, // 2 минуты для генерации отчетов
});

// Скачивание сгенерированного файла аналитического отчета
const reportFile = await sdkForReports.analytics.getDownloadsFile(downloadId);

timeout в SDKConfig применяется ко всем запросам данного экземпляра SDK. Каждая попытка повтора использует таймаут индивидуально (не кумулятивно).

Взаимодействие таймаута и повторов

Когда запрос истекает по таймауту, SDK автоматически повторяет его (до maxRetries раз). Каждая попытка повтора получает полную длительность таймаута:

typescript
const sdk = new WildberriesSDK({
  apiKey: process.env.WB_API_KEY!,
  timeout: 30000,        // 30с на попытку
  retryConfig: {
    maxRetries: 3,        // До 3 повторов после начальной попытки
    retryDelay: 1000,     // Базовая задержка 1с между повторами
    exponentialBackoff: true,
  },
});

// Худший случай: 30с + 1с + 30с + 2с + 30с + 4с + 30с = ~127 секунд всего

Совет: Если вы видите ошибки ETIMEDOUT, увеличьте глобальный таймаут или используйте таймаут для отдельного запроса для конкретных медленных операций. Установите logLevel: 'info' для просмотра попыток повтора в консоли.

Конфигурация лимита запросов

SDK предоставляет гибкую конфигурацию лимита запросов для предотвращения исчерпания квот API и обеспечения надежной работы.

Справочник API: См. RateLimitConfig для полных опций конфигурации лимита запросов.

Глобальные лимиты запросов

rateLimitConfig принимает два параметра, которые применяются глобально ко всем эндпоинтам. Лимиты для конкретных эндпоинтов автоматически применяются SDK на основе OpenAPI спецификаций.

typescript
const sdk = new WildberriesSDK({
  apiKey: process.env.WB_API_KEY!,

  rateLimitConfig: {
    requestsPerSecond: 10,
    requestsPerMinute: 100,
  }
});

Примечание: Лимиты для конкретных эндпоинтов (например, 3 запроса/минуту для создания товара) извлекаются из OpenAPI спецификаций и применяются автоматически через rateLimitKey в каждом методе модуля. Глобальный rateLimitConfig устанавливает верхнюю границу для всех эндпоинтов.

Пользовательский ограничитель запросов

typescript
import { RateLimiter } from 'daytona-wildberries-typescript-sdk/client';

const customLimiter = new RateLimiter({
  requestsPerMinute: 60,
  intervalSeconds: 10,
  burstLimit: 10,
});

// Использование с операциями SDK
await customLimiter.waitForSlot('custom');
const result = await sdk.products.getProductList({ limit: 100 });

Конфигурация повторных попыток

Настройте автоматическое поведение повторов для неудачных API запросов с поддержкой экспоненциальной задержки.

Справочник API: См. RetryConfig и RetryHandler для полной документации механизма повторов.

Базовая настройка повторов

typescript
const sdk = new WildberriesSDK({
  apiKey: process.env.WB_API_KEY!,

  retryConfig: {
    maxRetries: 3,
    retryDelay: 1000, // Базовая задержка 1 секунда
    exponentialBackoff: true, // 1с, 2с, 4с, 8с...
  }
});

Пользовательская логика повторов

retryConfig SDK поддерживает три поля: maxRetries, retryDelay и exponentialBackoff. SDK автоматически повторяет запросы при временных сбоях (ошибки сети, 5xx, 429) и никогда не повторяет при ошибках аутентификации (401/403) или валидации (400/422).

typescript
interface RetryConfig {
  maxRetries: number;
  retryDelay: number;
  exponentialBackoff: boolean;
}

const sdk = new WildberriesSDK({
  apiKey: process.env.WB_API_KEY!,

  retryConfig: {
    maxRetries: 5,
    retryDelay: 2000,
    exponentialBackoff: true,
  }
});

Примечание: Установите logLevel: 'info' для просмотра попыток повтора в консоли, или logLevel: 'debug' для полного контекста повторов, включая тип ошибки и статус-код.

Условный повтор

typescript
class SmartRetrySDK {
  private sdk: WildberriesSDK;

  async executeWithSmartRetry<T>(
    operation: () => Promise<T>,
    options: {
      critical: boolean;
      maxRetries?: number;
    }
  ): Promise<T> {
    const maxRetries = options.critical ? 10 : 3;

    for (let attempt = 0; attempt <= maxRetries; attempt++) {
      try {
        return await operation();
      } catch (error) {
        if (attempt === maxRetries) throw error;

        // Не повторять при ошибках аутентификации
        if (error instanceof AuthenticationError) throw error;

        // Более длинная задержка для критичных операций
        const delay = options.critical
          ? 5000 * Math.pow(2, attempt)
          : 1000 * Math.pow(2, attempt);

        await sleep(delay);
      }
    }

    throw new Error('Превышено максимальное количество повторов');
  }
}

Конфигурация логирования

Уровни логирования

typescript
// debug: Все операции SDK, полный контекст повторов
// info: Попытки повтора, важные операции
// warn: Таймауты, исчерпание повторов, предупреждения (рекомендуется для продакшн)
// error: Только ошибки

const sdk = new WildberriesSDK({
  apiKey: process.env.WB_API_KEY!,
  logLevel: process.env.LOG_LEVEL as 'debug' | 'info' | 'warn' | 'error' || 'warn'
});

Что показывает каждый уровень логирования

Событиеdebuginfowarnerror
Попытка повтора (URL, номер попытки, задержка)ДаДа
Полный контекст повтора (тип ошибки, статус-код, isTimeout)Да
Таймаут запроса (URL, длительность)ДаДаДа
Все повторы исчерпаныДаДаДа
Ошибки сетиДаДаДаДа

Совет: Используйте logLevel: 'info' для просмотра попыток повтора и предупреждений о таймауте без шума debug-уровня. Используйте logLevel: 'debug' при диагностике ошибок ETIMEDOUT для полного контекста каждого повтора.

Интеграция логирования

SDK использует собственный внутренний экземпляр Axios, управляемый BaseClient. Используйте опцию logLevel для управления выводом логов SDK:

typescript
const sdk = new WildberriesSDK({
  apiKey: process.env.WB_API_KEY!,
  logLevel: 'debug', // Видеть все запросы, ответы и контекст повторов
});

Примечание: SDK не поддерживает внедрение пользовательского httpClient. BaseClient управляет собственным экземпляром Axios внутренне. Используйте logLevel для наблюдения за операциями SDK.

HTTP клиент

SDK управляет собственным внутренним экземпляром Axios через BaseClient. Опция httpClient в SDKConfig отсутствует -- HTTP клиент не заменяется пользователем. SDK обрабатывает управление соединениями, заголовки аутентификации, таймаут, повторы и лимиты запросов внутренне.

Примечание: Если вам нужна поддержка прокси или пользовательская конфигурация TLS, настройте это на уровне ОС/окружения (например, переменные окружения HTTP_PROXY / HTTPS_PROXY) вместо SDK.

Лучшие практики конфигурации

✅ Следует

  • Хранить API ключи в переменных окружения
  • Использовать разные конфигурации для разных окружений
  • Устанавливать подходящие таймауты для вашего случая
  • Включать логику повторов для продакшн
  • Использовать консервативные лимиты запросов
  • Логировать на подходящих уровнях (warn/error в продакшн)
  • Валидировать конфигурацию при запуске
  • Документировать пользовательские конфигурации

❌ Не следует

  • Жестко кодировать API ключи в конфигурации
  • Использовать конфигурацию разработки в продакшн
  • Отключать логику повторов для "улучшения скорости"
  • Устанавливать слишком низкие таймауты (вызывает ложные провалы)
  • Игнорировать лимиты запросов
  • Включать debug логирование в продакшн
  • Делиться конфигурационными файлами, содержащими секреты
  • Изменять настройки SDK по умолчанию без понимания последствий

Валидация конфигурации

typescript
import { z } from 'zod';

const ConfigSchema = z.object({
  apiKey: z.string().min(10),
  timeout: z.number().min(1000).max(120000),
  retryConfig: z.object({
    maxRetries: z.number().min(0).max(10),
    retryDelay: z.number().min(100).max(10000),
    exponentialBackoff: z.boolean(),
  }).optional(),
  logLevel: z.enum(['debug', 'info', 'warn', 'error']).optional(),
});

function createSDK(config: unknown): WildberriesSDK {
  const validatedConfig = ConfigSchema.parse(config);
  return new WildberriesSDK(validatedConfig);
}

Справочник переменных окружения

bash
# Обязательные
WB_API_KEY=your_api_key_here

# Опциональные
WB_API_TIMEOUT=30000
WB_API_MAX_RETRIES=3
WB_API_RETRY_DELAY=1000
WB_API_LOG_LEVEL=warn

# Лимит запросов
WB_RATE_LIMIT_PER_SECOND=10
WB_RATE_LIMIT_PER_MINUTE=100

Связанная документация

Поддержка

По вопросам конфигурации:

Made with ❤️ for the Wildberries developer community