Skip to content

Referensi Subistem & Konstanta

leaves-guardian memiliki arsitektur modular yang tersusun dari mesin keandalan terarah, utilitas developer, dan pengendali infrastruktur. Dokumen ini berfungsi sebagai peta referensi API sentral yang memetakan jalur akses subistem publik pada LeavesClient, konstruktor utilitas mandiri, fungsi pembantu (helpers), serta katalog lengkap tanpa pemotongan (...) dari seluruh konstanta publik, enum, status lifecycle, dan opsi konfigurasi default.


1. Peta Akses Subistem & Arsitektur

leaves-guardian mengorganisir komponen internal dan eksternal ke dalam tiga klasifikasi fungsional:

mermaid
graph TD
    subgraph ClientAttached [1. Client-Attached Subsystems]
        C[LeavesClient]
        C -->|client.terminal| T[LeavesTerminal]
        C -->|client.store| S[SmartStore]
        C -->|client.recovery| R[SessionRecovery]
        C -->|client.health| H[HealthMonitor]
        C -->|client.watchdog| W[Watchdog]
        C -->|client.memoryGuard| M[MemoryGuard]
        C -->|client.traffic| TC[TrafficController]
        C -->|client.media| MP[MediaPipeline]
        C -->|client.rateLimiter| RL[IngressRateLimiter]
        C -->|client.deduplicator| DD[IngressDeduplicator]
        C -->|client.autoDelete| AD[AutoDeleteManager]
    end

    subgraph OnDemand [2. On-Demand Utilities & Helpers]
        MC[MessageCollector]
        PR[Prompt]
        PG[Paginator]
        EM[EphemeralMessage]
        HLP[Helpers: withAdReply, withChannelForward, resolveMedia, generateStatCard]
    end

    subgraph InternalInfra [3. Internal Runtime Infrastructure]
        CM[ConnectionManager]
        SM[SessionManager]
        RM[ReconnectManager]
        EMG[EventManager]
        TM[TerminalManager]
        PA[PresentationAdapter]
        LA[LoggerAdapter]
    end

Tabel Properti Akses Langsung pada LeavesClient

Tabel berikut merangkum seluruh pengakses subistem publik yang terpasang langsung pada instance LeavesClient:

Properti pada clientInstance KelasFungsi UtamaMethod Publik Utama
client.terminalLeavesTerminalLogging terminal semantik & output konsol sadar privasi.info(), success(), warn(), error(), debug(), mask()
client.storeSmartStorePenyimpanan state JSON & key-value in-memory atomik dengan TTL.get(), set(), delete(), has(), keys(), clear(), sweep(), namespace()
client.recoverySessionRecoveryVerifikasi integritas sesi otomatis & pemulihan snapshot disk.checkSessionHealth(), createSnapshot(), restoreLatestValidSnapshot(), quarantineCurrentSession(), cleanEligibleAuthFiles(), clearBackups()
client.healthHealthMonitorDiagnostik observabilitas, lag event loop, dan pemantauan memori.start(), stop(), pause(), resume(), getStatus(), getMetrics(), getHistory(), registerProbe()
client.watchdogWatchdogVerifikasi keaktifan socket & terminasi koneksi zombie.start(), stop(), pause(), resume(), ping(), recordActivity(), getStatus()
client.memoryGuardMemoryGuardObservasi memori proses & mitigasi heap bertahap.start(), stop(), pause(), resume(), getStatus(), getMetrics(), getHistory(), registerMitigationHook()
client.trafficTrafficControllerAntrean keluar prioritas, keadilan FIFO, backpressure & pacing.enqueue(), cancelTask(), pause(), resume(), drain(), getStats(), getQueueStatus(), getHistory()
client.mediaMediaPipelinePreparasi media, proteksi SSRF, validasi MIME & spill file sementara.prepare(), abortJob(), abortAllJobs(), getStats(), cleanupTempDir()
client.rateLimiterIngressRateLimiterPembatasan laju pesan masuk dengan pelacak sliding window.consume(), check(), resetKey(), resetAll(), getStats()
client.deduplicatorIngressDeduplicatorDeteksi pesan masuk duplikat & penekanan duplikasi via cache.isDuplicate(), register(), checkAndRegister(), clear(), getStats()
client.autoDeleteAutoDeleteManagerPenghapusan pesan terjadwal dengan prinsip zero-rollback safety.register(), cancel(), cancelAll(), getTask(), getStats()

2. Utilitas On-Demand & Fungsi Pembantu (Helpers)

2.1 Kelas Utilitas Interaktif On-Demand

Kelas-kelas ini di-instantiate per alur interaksi dan beroperasi di atas objek pesan ternormalisasi (Message):

js
import {
  MessageCollector,
  Prompt,
  Paginator,
  EphemeralMessage
} from 'leaves-guardian';
KelasSignature KonstruktorDeskripsi
MessageCollectornew MessageCollector(client, options)Mengumpulkan pesan masuk yang memenuhi kriteria filter tertentu dalam batas waktu/jumlah terkonfigurasi.
Promptnew Prompt(client, options)Memandu pengguna melalui wizard interaktif tanya-jawab satu langkah maupun multi-langkah.
Paginatornew Paginator(client, options)Merender daftar multi-halaman, katalog, atau menu dengan kontrol navigasi interaktif.
EphemeralMessagenew EphemeralMessage(client, options)Mengonfigurasi dan mengirim pesan sementara yang hilang otomatis (disappearing messages).

2.2 Fungsi Pembantu Standalone (Helpers)

js
import {
  withAdReply,
  withChannelForward,
  resolveMedia,
  generateStatCard
} from 'leaves-guardian';
FungsiSignatureTipe KembalianDeskripsi
withAdReply(contextInfo: object, options: object)objectMenyisipkan metadata pratinjau tautan interaktif / ad reply ke contextInfo Baileys.
withChannelForward(contextInfo: object, options: object)objectMenyisipkan metadata header terusan saluran resmi / newsletter ke contextInfo.
resolveMediaasync (client: object, source: any, type: string, opts?: object)Promise<any>Menyelesaikan buffer media, URL remote, atau path file lokal untuk pengiriman Baileys.
generateStatCard(stats: object, options?: object)stringMemformat widget ringkasan dashboard ASCII untuk penyajian metrik/kesehatan bot.

3. Infrastruktur Runtime Internal

Subistem berikut di-instantiate dan dikelola secara internal oleh LeavesClient. Komponen ini tidak dimaksudkan untuk di-instantiate manual oleh konsumen, namun perilakunya dapat dikonfigurasi melalui opsi konstruktor LeavesClient:

  • ConnectionManager: Mengelola pembuatan socket aktif Baileys, relai event, dan koordinasi kode QR/Pairing.
  • SessionManager: Menangani persistensi state autentikasi multi-file, pembuatan folder sesi, dan validasi creds.
  • ReconnectManager: Mengelola penjadwalan rekoneksi otomatis berbasis exponential backoff dengan jitter.
  • EventManager: Mengoordinasikan langganan event emitter internal dan perutean event ternormalisasi.
  • TerminalManager: Bus event sentral untuk logging diagnostik, multipleksing sink, dan sanitasi privasi.
  • PresentationAdapter: Menjembatani event domain LeavesClient menjadi log presentasi terminal yang semantik.
  • LoggerAdapter: Mengadaptasi stream logger standar Pino ke dalam LeavesTerminal.

4. Kamus Sentral Konstanta & Enum Publik

Berikut adalah katalog lengkap dan pasti dari seluruh konstanta publik, enum, set state, kode error, dan objek opsi konfigurasi default yang diekspor oleh leaves-guardian.

4.1 Client & Koneksi

CLIENT_STATES

js
export const CLIENT_STATES = Object.freeze({
  IDLE: 'IDLE',
  INITIALIZING: 'INITIALIZING',
  AUTHENTICATING: 'AUTHENTICATING',
  CONNECTING: 'CONNECTING',
  OPEN: 'OPEN',
  READY: 'READY',
  DISCONNECTED: 'DISCONNECTED',
  RECONNECTING: 'RECONNECTING',
  LOGGED_OUT: 'LOGGED_OUT',
  SHUTDOWN: 'SHUTDOWN'
});

RECONNECT_REASONS

js
export const RECONNECT_REASONS = Object.freeze({
  NETWORK_ERROR: 'NETWORK_ERROR',
  SERVER_UNAVAILABLE: 'SERVER_UNAVAILABLE',
  CONNECTION_CLOSED: 'CONNECTION_CLOSED',
  CONFLICT: 'CONFLICT',
  UNKNOWN_TRANSIENT: 'UNKNOWN_TRANSIENT'
});

4.2 Normalisasi & Abstraksi Pesan

MessageTypes

js
export const MessageTypes = Object.freeze({
  TEXT: 'text',
  IMAGE: 'image',
  VIDEO: 'video',
  AUDIO: 'audio',
  DOCUMENT: 'document',
  STICKER: 'sticker',
  LOCATION: 'location',
  CONTACT: 'contact',
  REACTION: 'reaction',
  POLL: 'poll',
  BUTTON: 'button',
  LIST: 'list',
  UNKNOWN: 'unknown'
});

4.3 SmartStore & Session Recovery

CURRENT_STORE_VERSION

js
export const CURRENT_STORE_VERSION = 1;

SESSION_STATUS

js
export const SESSION_STATUS = Object.freeze({
  FRESH_SESSION: 'FRESH_SESSION',
  HEALTHY: 'HEALTHY',
  CORRUPTED_ZERO_BYTE: 'CORRUPTED_ZERO_BYTE',
  CORRUPTED_SYNTAX_ERROR: 'CORRUPTED_SYNTAX_ERROR',
  CORRUPTED_SCHEMA_INVALID: 'CORRUPTED_SCHEMA_INVALID'
});

SESSION_RECOVERY_CODES

js
export const SESSION_RECOVERY_CODES = Object.freeze({
  SESSION_CORRUPTED: 'SESSION_CORRUPTED',
  SNAPSHOT_CREATION_FAILED: 'SNAPSHOT_CREATION_FAILED',
  SNAPSHOT_INCONSISTENT: 'SNAPSHOT_INCONSISTENT',
  SNAPSHOT_CORRUPTED: 'SNAPSHOT_CORRUPTED',
  SESSION_UNRECOVERABLE: 'SESSION_UNRECOVERABLE',
  RESTORE_FAILED: 'RESTORE_FAILED',
  RESTORE_ACTIVATION_FAILED: 'RESTORE_ACTIVATION_FAILED',
  RECOVERY_BLOCKED_401: 'RECOVERY_BLOCKED_401',
  RECOVERY_BUSY: 'RECOVERY_BUSY',
  INVALID_PARAMETER: 'INVALID_PARAMETER'
});

4.4 Health Monitor & Diagnostik

HEALTH_STATUS

js
export const HEALTH_STATUS = Object.freeze({
  HEALTHY: 'HEALTHY',
  DEGRADED: 'DEGRADED',
  CRITICAL: 'CRITICAL'
});

PROBE_STATUS

js
export const PROBE_STATUS = Object.freeze({
  OK: 'OK',
  ERROR: 'ERROR',
  TIMEOUT: 'TIMEOUT'
});

MONITOR_STATE

js
export const MONITOR_STATE = Object.freeze({
  STOPPED: 'STOPPED',
  RUNNING: 'RUNNING'
});

HEALTH_ERROR_CODES

js
export const HEALTH_ERROR_CODES = Object.freeze({
  HEALTH_INVALID_THRESHOLD: 'HEALTH_INVALID_THRESHOLD',
  HEALTH_INVALID_OPTION: 'HEALTH_INVALID_OPTION',
  HEALTH_PROBE_ERROR: 'HEALTH_PROBE_ERROR'
});

DEFAULT_THRESHOLDS

js
export const DEFAULT_THRESHOLDS = Object.freeze({
  eventLoopLagDegradedMs: 250,
  eventLoopLagCriticalMs: 1000,
  memoryHeapPercentDegraded: 80,
  memoryHeapPercentCritical: 95,
  disconnectedDurationDegradedMs: 15000,
  disconnectedDurationCriticalMs: 60000
});

4.5 Socket Watchdog & Memory Guard

WATCHDOG_STATE

js
export const WATCHDOG_STATE = Object.freeze({
  STOPPED: 'STOPPED',
  RUNNING: 'RUNNING',
  PAUSED: 'PAUSED',
  TERMINATING: 'TERMINATING'
});

WATCHDOG_ERROR_CODES

js
export const WATCHDOG_ERROR_CODES = Object.freeze({
  WATCHDOG_INVALID_OPTION: 'WATCHDOG_INVALID_OPTION',
  WATCHDOG_SOCKET_ERROR: 'WATCHDOG_SOCKET_ERROR'
});

DEFAULT_WATCHDOG_OPTIONS

js
export const DEFAULT_WATCHDOG_OPTIONS = Object.freeze({
  enabled: true,
  checkIntervalMs: 15000,
  maxSilenceMs: 60000,
  pingTimeoutMs: 10000,
  maxMissedPings: 2
});

MEMORY_GUARD_STATE

js
export const MEMORY_GUARD_STATE = Object.freeze({
  STOPPED: 'STOPPED',
  RUNNING: 'RUNNING',
  PAUSED: 'PAUSED'
});

MEMORY_GUARD_LEVEL

js
export const MEMORY_GUARD_LEVEL = Object.freeze({
  NORMAL: 'NORMAL',
  WARNING: 'WARNING',
  CRITICAL: 'CRITICAL'
});

MEMORY_ERROR_CODES

js
export const MEMORY_ERROR_CODES = Object.freeze({
  MEMORY_INVALID_OPTION: 'MEMORY_INVALID_OPTION',
  MEMORY_INVALID_THRESHOLD: 'MEMORY_INVALID_THRESHOLD',
  MEMORY_HOOK_ERROR: 'MEMORY_HOOK_ERROR'
});

DEFAULT_MEMORY_GUARD_OPTIONS

js
export const DEFAULT_MEMORY_GUARD_OPTIONS = Object.freeze({
  enabled: true,
  checkIntervalMs: 30000,
  heapWarningBytes: 157286400,    // 150 MB
  heapCriticalBytes: 314572800,   // 300 MB
  rssWarningBytes: 262144000,     // 250 MB
  rssCriticalBytes: 524288000,    // 500 MB
  growthRateWarningPercent: 20,
  minimumGrowthBytes: 20971520,   // 20 MB
  sampleWindowSize: 5,
  autoMitigateOnCritical: true,
  allowManualGc: false,
  gcCooldownMs: 60000,
  hookTimeoutMs: 5000
});

DEFAULT_MEMORY_GUARD_STATUS

js
export const DEFAULT_MEMORY_GUARD_STATUS = Object.freeze({
  state: 'STOPPED',
  level: 'NORMAL',
  timestamp: null,
  heapUsed: null,
  heapTotal: null,
  heapRatio: null
});

4.6 Traffic Controller & Ingress Controls

TRAFFIC_STATE

js
export const TRAFFIC_STATE = Object.freeze({
  STOPPED: 'STOPPED',
  RUNNING: 'RUNNING',
  PAUSED: 'PAUSED'
});

TRAFFIC_PRIORITY

js
export const TRAFFIC_PRIORITY = Object.freeze({
  HIGH: 'HIGH',
  NORMAL: 'NORMAL',
  LOW: 'LOW'
});

TRAFFIC_TASK_STATE

js
export const TRAFFIC_TASK_STATE = Object.freeze({
  PENDING: 'PENDING',
  DISPATCHING: 'DISPATCHING',
  COMPLETED: 'COMPLETED',
  FAILED: 'FAILED',
  CANCELLED: 'CANCELLED'
});

TRAFFIC_ERROR_CODES

js
export const TRAFFIC_ERROR_CODES = Object.freeze({
  TRAFFIC_QUEUE_FULL: 'TRAFFIC_QUEUE_FULL',
  TRAFFIC_TASK_CANCELLED: 'TRAFFIC_TASK_CANCELLED',
  TRAFFIC_CONTROLLER_STOPPED: 'TRAFFIC_CONTROLLER_STOPPED',
  TRAFFIC_INVALID_OPTION: 'TRAFFIC_INVALID_OPTION'
});

DEFAULT_TRAFFIC_OPTIONS

js
export const DEFAULT_TRAFFIC_OPTIONS = Object.freeze({
  maxQueueSize: 1000,
  maxConcurrentDispatches: 1,
  minDispatchIntervalMs: 250,
  highWatermarkRatio: 0.8,
  lowWatermarkRatio: 0.2,
  maxConsecutiveHigh: 5,
  historyLimit: 100
});

LIMITER_STATE

js
export const LIMITER_STATE = Object.freeze({
  RUNNING: 'RUNNING',
  STOPPED: 'STOPPED',
  DESTROYED: 'DESTROYED'
});

RATE_LIMIT_ERROR_CODES

js
export const RATE_LIMIT_ERROR_CODES = Object.freeze({
  INVALID_OPTION: 'RATE_LIMIT_INVALID_OPTION',
  INTERNAL_ERROR: 'RATE_LIMIT_ERROR'
});

DEFAULT_RATE_LIMITER_OPTIONS

js
export const DEFAULT_RATE_LIMITER_OPTIONS = Object.freeze({
  windowMs: 60000,          // 60 detik
  maxRequests: 60,          // 60 request per window
  penaltyDurationMs: 0,     // 0 = Nonaktif
  maxTrackedKeys: 10000,    // Maksimal 10.000 key terpantau
  cleanupIntervalMs: 60000, // Interval pembersihan 60 detik
  keyExtractor: defaultKeyExtractor,
  clock: () => Date.now()
});

DEDUP_STATE

js
export const DEDUP_STATE = Object.freeze({
  RUNNING: 'RUNNING',
  STOPPED: 'STOPPED',
  DESTROYED: 'DESTROYED'
});

DEDUP_ERROR_CODES

js
export const DEDUP_ERROR_CODES = Object.freeze({
  INVALID_OPTION: 'DEDUP_INVALID_OPTION',
  INVALID_KEY: 'DEDUP_INVALID_KEY',
  INTERNAL_ERROR: 'DEDUP_ERROR'
});

DEFAULT_DEDUPLICATOR_OPTIONS

js
export const DEFAULT_DEDUPLICATOR_OPTIONS = Object.freeze({
  ttlMs: 300000,              // 5 menit fixed TTL
  maxTrackedMessages: 10000,  // Maksimal 10.000 pesan terpantau
  cleanupIntervalMs: 60000,   // Interval pembersihan 60 detik
  keyExtractor: defaultIdentityExtractor,
  clock: () => Date.now()
});

4.7 Media Pipeline

MEDIA_TYPE

js
export const MEDIA_TYPE = Object.freeze({
  IMAGE: 'image',
  VIDEO: 'video',
  AUDIO: 'audio',
  DOCUMENT: 'document',
  STICKER: 'sticker'
});

MEDIA_REPRESENTATION

js
export const MEDIA_REPRESENTATION = Object.freeze({
  BUFFER: 'buffer',
  STREAM: 'stream',
  FILE: 'file'
});

MEDIA_JOB_STATE

js
export const MEDIA_JOB_STATE = Object.freeze({
  PENDING: 'PENDING',
  RESOLVING: 'RESOLVING',
  DETECTING: 'DETECTING',
  VALIDATING: 'VALIDATING',
  TRANSFORMING: 'TRANSFORMING',
  FINALIZING: 'FINALIZING',
  COMPLETED: 'COMPLETED',
  FAILED: 'FAILED',
  CANCELLED: 'CANCELLED'
});

MEDIA_ERROR_CODES

js
export const MEDIA_ERROR_CODES = Object.freeze({
  INVALID_SOURCE: 'MEDIA_INVALID_SOURCE',
  SIZE_EXCEEDED: 'MEDIA_SIZE_EXCEEDED',
  UNSUPPORTED_TYPE: 'MEDIA_UNSUPPORTED_TYPE',
  FETCH_FAILED: 'MEDIA_FETCH_FAILED',
  FETCH_TIMEOUT: 'MEDIA_FETCH_TIMEOUT',
  SSRF_BLOCKED: 'MEDIA_SSRF_BLOCKED',
  REDIRECT_LIMIT: 'MEDIA_REDIRECT_LIMIT',
  TRANSFORM_FAILED: 'MEDIA_TRANSFORM_FAILED',
  QUEUE_FULL: 'MEDIA_QUEUE_FULL',
  PIPELINE_ABORTED: 'MEDIA_PIPELINE_ABORTED',
  REPRESENTATION_UNAVAILABLE: 'MEDIA_REPRESENTATION_UNAVAILABLE',
  RESOURCE_RELEASED: 'MEDIA_RESOURCE_RELEASED'
});

DEFAULT_MEDIA_OPTIONS

js
export const DEFAULT_MEDIA_OPTIONS = Object.freeze({
  maxInputBytes: 104857600,       // 100 MB
  maxOutputBytes: 104857600,      // 100 MB
  bufferThresholdBytes: 10485760, // 10 MB
  fetchTimeoutMs: 30000,          // 30 detik
  maxRedirects: 5,
  tempDir: path.join(os.tmpdir(), 'leaves-media'),
  maxConcurrentJobs: 3,
  maxWaitingJobs: 50,
  allowPrivateIp: false
});

4.8 Terminal Presentation

TERMINAL_LEVEL

js
export const TERMINAL_LEVEL = Object.freeze({
  DEBUG: 'DEBUG',
  INFO: 'INFO',
  WARN: 'WARN',
  ERROR: 'ERROR'
});

LEVEL_WEIGHTS

js
export const LEVEL_WEIGHTS = Object.freeze({
  DEBUG: 10,
  INFO: 20,
  WARN: 30,
  ERROR: 40
});

TERMINAL_DOMAIN

js
export const TERMINAL_DOMAIN = Object.freeze({
  CLIENT: 'CLIENT',
  MESSAGE: 'MESSAGE',
  RELIABILITY: 'RELIABILITY',
  TRAFFIC: 'TRAFFIC',
  MEDIA: 'MEDIA',
  APPLICATION: 'APPLICATION'
});

TERMINAL_STATE

js
export const TERMINAL_STATE = Object.freeze({
  RUNNING: 'RUNNING',
  DESTROYED: 'DESTROYED'
});

RENDERER_STATUS

js
export const RENDERER_STATUS = Object.freeze({
  HEALTHY: 'HEALTHY',
  DEGRADED: 'DEGRADED'
});

TERMINAL_ERROR_CODES

js
export const TERMINAL_ERROR_CODES = Object.freeze({
  INVALID_OPTION: 'TERMINAL_INVALID_OPTION',
  INVALID_EVENT: 'TERMINAL_INVALID_EVENT',
  RENDERER_ERROR: 'TERMINAL_RENDERER_ERROR',
  INTERNAL_ERROR: 'TERMINAL_ERROR'
});

DEFAULT_TERMINAL_OPTIONS

js
export const DEFAULT_TERMINAL_OPTIONS = Object.freeze({
  enabled: true,
  minLevel: 'INFO',
  privacyMasking: true,
  maxDispatchDepth: 3,
  clock: () => Date.now()
});

4.9 Utilitas Developer

COLLECTOR_END_REASONS

js
export const COLLECTOR_END_REASONS = Object.freeze({
  LIMIT: 'limit',
  TIME: 'time',
  IDLE: 'idle',
  USER: 'user',
  CANCELED: 'canceled',
  PROCESSED_LIMIT: 'processedLimit',
  SHUTDOWN: 'clientShutdown'
});

PROMPT_STATES

js
export const PROMPT_STATES = Object.freeze({
  IDLE: 'IDLE',
  RUNNING: 'RUNNING',
  COMPLETED: 'COMPLETED',
  CANCELLED: 'CANCELLED',
  TIMEOUT: 'TIMEOUT',
  MAX_RETRIES: 'MAX_RETRIES',
  ERROR: 'ERROR',
  SHUTDOWN: 'SHUTDOWN'
});

PAGINATOR_STATES

js
export const PAGINATOR_STATES = Object.freeze({
  IDLE: 'IDLE',
  RUNNING: 'RUNNING',
  STOPPED: 'STOPPED',
  TIMEOUT: 'TIMEOUT',
  SHUTDOWN: 'SHUTDOWN',
  ERROR: 'ERROR'
});

PAGINATOR_ACTIONS

js
export const PAGINATOR_ACTIONS = Object.freeze({
  NEXT: 'NEXT',
  PREV: 'PREV',
  FIRST: 'FIRST',
  LAST: 'LAST',
  JUMP: 'JUMP',
  STOP: 'STOP'
});

EPHEMERAL_DURATIONS

js
export const EPHEMERAL_DURATIONS = Object.freeze({
  ONE_DAY: 86400,          // 24 Jam
  ONE_WEEK: 604800,        // 7 Hari
  THREE_MONTHS: 7776000,   // 90 Hari
  DISABLED: 0              // Nonaktif
});

DEFAULT_EPHEMERAL_DURATION

js
export const DEFAULT_EPHEMERAL_DURATION = 604800; // 7 Hari

AUTODELETE_STATES

js
export const AUTODELETE_STATES = Object.freeze({
  PENDING: 'PENDING',
  EXECUTING: 'EXECUTING',
  COMPLETED: 'COMPLETED',
  CANCELLED: 'CANCELLED',
  FAILED: 'FAILED'
});

Released under the MIT License.