UNPKG

i18n-ai-translate

Version:

AI-powered localization CLI, Node library, and GitHub Action. Translate i18next JSON, Gettext PO, Java .properties, and iOS .strings with ChatGPT, Claude, Gemini, or local Ollama models.

67 lines 2.2 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const chat_factory_1 = __importDefault(require("./chats/chat_factory")); class ChatPool { rateLimiter; available; waiters; slots; constructor(triples, rateLimiter) { this.slots = triples; this.available = [...triples]; this.waiters = []; this.rateLimiter = rateLimiter; } static create(options) { const triples = []; for (let i = 0; i < options.concurrency; i++) { triples.push({ generateTranslationChat: chat_factory_1.default.newChat(options.engine, options.model, options.rateLimiter, options.apiKey, options.host, options.chatParams), verifyStylingChat: chat_factory_1.default.newChat(options.engine, options.model, options.rateLimiter, options.apiKey, options.host, options.chatParams), verifyTranslationChat: chat_factory_1.default.newChat(options.engine, options.model, options.rateLimiter, options.apiKey, options.host, options.chatParams), }); } return new ChatPool(triples, options.rateLimiter); } get size() { return this.slots.length; } /** Returns every triple, in order. Used for per-worker sharding. */ all() { return [...this.slots]; } async run(fn) { const chats = await this.acquire(); try { return await fn(chats); } finally { this.release(chats); } } acquire() { return new Promise((resolve) => { const chats = this.available.pop(); if (chats) { resolve(chats); } else { this.waiters.push(resolve); } }); } release(chats) { const waiter = this.waiters.shift(); if (waiter) { waiter(chats); } else { this.available.push(chats); } } } exports.default = ChatPool; //# sourceMappingURL=chat_pool.js.map