anylang
Version:
A translator's kit that uses the free APIs of Google Translate, Yandex, Bing, ChatGPT, and other LLMs
74 lines (72 loc) • 7.32 kB
JavaScript
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
import { wait } from './time';
/**
* Semaphore for the flow control in queues
*
* @example
* const semafor = QueueSemafor({ timeout: 100 });
* items.map(async item=> {
* const free = await semafor.take();
* // do something with item...
* free();
* })
*/
export class Semaphore {
constructor(options) {
this.timeout = 0;
this.hijackPrevention = true;
this.lastAccess = 0;
this.semafor = null;
const { timeout, hijackPrevention } = options || {};
if (timeout !== undefined) {
if (timeout < 0) {
throw new Error('Negative number');
}
this.timeout = timeout;
}
if (hijackPrevention !== undefined) {
this.hijackPrevention = hijackPrevention;
}
}
take() {
return __awaiter(this, void 0, void 0, function* () {
// Await loop
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
while (true) {
// Wait timeout
if (this.timeout > 0) {
const idle = new Date().getTime() - this.lastAccess;
if (idle < this.timeout) {
yield wait(this.timeout - idle);
}
}
if (this.semafor === null) {
break;
}
yield this.semafor;
// Wait random time until 30ms to prevent flow hijacking
if (this.hijackPrevention) {
yield wait(Math.floor(Math.random() * 30));
}
}
let semaforResolver;
this.semafor = new Promise((resolve) => {
semaforResolver = resolve;
});
return () => {
this.lastAccess = new Date().getTime();
this.semafor = null;
semaforResolver();
};
});
}
}
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInV0aWxzL1NlbWFwaG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBVzlCOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLE9BQU8sU0FBUztJQUlyQixZQUFZLE9BQWlCO1FBSFosWUFBTyxHQUFXLENBQUMsQ0FBQztRQUNwQixxQkFBZ0IsR0FBWSxJQUFJLENBQUM7UUFrQjFDLGVBQVUsR0FBRyxDQUFDLENBQUM7UUFDZixZQUFPLEdBQXlCLElBQUksQ0FBQztRQWhCNUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFFcEQsSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDM0IsSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNwQyxDQUFDO1lBRUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDeEIsQ0FBQztRQUVELElBQUksZ0JBQWdCLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO1FBQzFDLENBQUM7SUFDRixDQUFDO0lBSUssSUFBSTs7WUFDVCxhQUFhO1lBQ2IsdUVBQXVFO1lBQ3ZFLE9BQU8sSUFBSSxFQUFFLENBQUM7Z0JBQ2IsZUFBZTtnQkFDZixJQUFJLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ3RCLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztvQkFDcEQsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO3dCQUN6QixNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFDO29CQUNqQyxDQUFDO2dCQUNGLENBQUM7Z0JBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUksRUFBRSxDQUFDO29CQUMzQixNQUFNO2dCQUNQLENBQUM7Z0JBRUQsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDO2dCQUVuQix3REFBd0Q7Z0JBQ3hELElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7b0JBQzNCLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzVDLENBQUM7WUFDRixDQUFDO1lBRUQsSUFBSSxlQUEyQixDQUFDO1lBQ2hDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDdEMsZUFBZSxHQUFHLE9BQU8sQ0FBQztZQUMzQixDQUFDLENBQUMsQ0FBQztZQUVILE9BQU8sR0FBRyxFQUFFO2dCQUNYLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7Z0JBQ3BCLGVBQWUsRUFBRSxDQUFDO1lBQ25CLENBQUMsQ0FBQztRQUNILENBQUM7S0FBQTtDQUNEIiwiZmlsZSI6InV0aWxzL1NlbWFwaG9yZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHdhaXQgfSBmcm9tICcuL3RpbWUnO1xuXG5pbnRlcmZhY2UgT3B0aW9ucyB7XG5cdHRpbWVvdXQ/OiBudW1iZXI7XG5cdGhpamFja1ByZXZlbnRpb24/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZW1hcGhvcmUge1xuXHR0YWtlKCk6IFByb21pc2U8KCkgPT4gdm9pZD47XG59XG5cbi8qKlxuICogU2VtYXBob3JlIGZvciB0aGUgZmxvdyBjb250cm9sIGluIHF1ZXVlc1xuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBzZW1hZm9yID0gUXVldWVTZW1hZm9yKHsgdGltZW91dDogMTAwIH0pO1xuICogaXRlbXMubWFwKGFzeW5jIGl0ZW09PiB7XG4gKiBcdGNvbnN0IGZyZWUgPSBhd2FpdCBzZW1hZm9yLnRha2UoKTtcbiAqIFx0Ly8gZG8gc29tZXRoaW5nIHdpdGggaXRlbS4uLlxuICogXHRmcmVlKCk7XG4gKiB9KVxuICovXG5leHBvcnQgY2xhc3MgU2VtYXBob3JlIGltcGxlbWVudHMgSVNlbWFwaG9yZSB7XG5cdHByaXZhdGUgcmVhZG9ubHkgdGltZW91dDogbnVtYmVyID0gMDtcblx0cHJpdmF0ZSByZWFkb25seSBoaWphY2tQcmV2ZW50aW9uOiBib29sZWFuID0gdHJ1ZTtcblxuXHRjb25zdHJ1Y3RvcihvcHRpb25zPzogT3B0aW9ucykge1xuXHRcdGNvbnN0IHsgdGltZW91dCwgaGlqYWNrUHJldmVudGlvbiB9ID0gb3B0aW9ucyB8fCB7fTtcblxuXHRcdGlmICh0aW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGlmICh0aW1lb3V0IDwgMCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ05lZ2F0aXZlIG51bWJlcicpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnRpbWVvdXQgPSB0aW1lb3V0O1xuXHRcdH1cblxuXHRcdGlmIChoaWphY2tQcmV2ZW50aW9uICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMuaGlqYWNrUHJldmVudGlvbiA9IGhpamFja1ByZXZlbnRpb247XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBsYXN0QWNjZXNzID0gMDtcblx0cHJpdmF0ZSBzZW1hZm9yOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG5cdGFzeW5jIHRha2UoKSB7XG5cdFx0Ly8gQXdhaXQgbG9vcFxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG5cdFx0d2hpbGUgKHRydWUpIHtcblx0XHRcdC8vIFdhaXQgdGltZW91dFxuXHRcdFx0aWYgKHRoaXMudGltZW91dCA+IDApIHtcblx0XHRcdFx0Y29uc3QgaWRsZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gdGhpcy5sYXN0QWNjZXNzO1xuXHRcdFx0XHRpZiAoaWRsZSA8IHRoaXMudGltZW91dCkge1xuXHRcdFx0XHRcdGF3YWl0IHdhaXQodGhpcy50aW1lb3V0IC0gaWRsZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuc2VtYWZvciA9PT0gbnVsbCkge1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblxuXHRcdFx0YXdhaXQgdGhpcy5zZW1hZm9yO1xuXG5cdFx0XHQvLyBXYWl0IHJhbmRvbSB0aW1lIHVudGlsIDMwbXMgdG8gcHJldmVudCBmbG93IGhpamFja2luZ1xuXHRcdFx0aWYgKHRoaXMuaGlqYWNrUHJldmVudGlvbikge1xuXHRcdFx0XHRhd2FpdCB3YWl0KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDMwKSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0bGV0IHNlbWFmb3JSZXNvbHZlcjogKCkgPT4gdm9pZDtcblx0XHR0aGlzLnNlbWFmb3IgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXHRcdFx0c2VtYWZvclJlc29sdmVyID0gcmVzb2x2ZTtcblx0XHR9KTtcblxuXHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHR0aGlzLmxhc3RBY2Nlc3MgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcblx0XHRcdHRoaXMuc2VtYWZvciA9IG51bGw7XG5cdFx0XHRzZW1hZm9yUmVzb2x2ZXIoKTtcblx0XHR9O1xuXHR9XG59XG4iXX0=