UNPKG

anylang

Version:

A translator's kit that uses the free APIs of Google Translate, Yandex, Bing, ChatGPT, and other LLMs

101 lines (99 loc) 7.42 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Semaphore = void 0; var _time = require("./time"); var __awaiter = void 0 && (void 0).__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()); }); }; /** * 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(); * }) */ 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 (0, _time.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 (0, _time.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(); }; }); } } exports.Semaphore = Semaphore; //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMvU2VtYXBob3JlLmpzIiwibmFtZXMiOlsiX3RpbWUiLCJyZXF1aXJlIiwiU2VtYXBob3JlIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwidGltZW91dCIsImhpamFja1ByZXZlbnRpb24iLCJsYXN0QWNjZXNzIiwic2VtYWZvciIsInVuZGVmaW5lZCIsIkVycm9yIiwidGFrZSIsImlkbGUiLCJEYXRlIiwiZ2V0VGltZSIsIndhaXQiLCJNYXRoIiwiZmxvb3IiLCJyYW5kb20iLCJzZW1hZm9yUmVzb2x2ZXIiLCJQcm9taXNlIiwicmVzb2x2ZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyJ1dGlscy9TZW1hcGhvcmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgd2FpdCB9IGZyb20gJy4vdGltZSc7XG5cbmludGVyZmFjZSBPcHRpb25zIHtcblx0dGltZW91dD86IG51bWJlcjtcblx0aGlqYWNrUHJldmVudGlvbj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlbWFwaG9yZSB7XG5cdHRha2UoKTogUHJvbWlzZTwoKSA9PiB2b2lkPjtcbn1cblxuLyoqXG4gKiBTZW1hcGhvcmUgZm9yIHRoZSBmbG93IGNvbnRyb2wgaW4gcXVldWVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHNlbWFmb3IgPSBRdWV1ZVNlbWFmb3IoeyB0aW1lb3V0OiAxMDAgfSk7XG4gKiBpdGVtcy5tYXAoYXN5bmMgaXRlbT0+IHtcbiAqIFx0Y29uc3QgZnJlZSA9IGF3YWl0IHNlbWFmb3IudGFrZSgpO1xuICogXHQvLyBkbyBzb21ldGhpbmcgd2l0aCBpdGVtLi4uXG4gKiBcdGZyZWUoKTtcbiAqIH0pXG4gKi9cbmV4cG9ydCBjbGFzcyBTZW1hcGhvcmUgaW1wbGVtZW50cyBJU2VtYXBob3JlIHtcblx0cHJpdmF0ZSByZWFkb25seSB0aW1lb3V0OiBudW1iZXIgPSAwO1xuXHRwcml2YXRlIHJlYWRvbmx5IGhpamFja1ByZXZlbnRpb246IGJvb2xlYW4gPSB0cnVlO1xuXG5cdGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBPcHRpb25zKSB7XG5cdFx0Y29uc3QgeyB0aW1lb3V0LCBoaWphY2tQcmV2ZW50aW9uIH0gPSBvcHRpb25zIHx8IHt9O1xuXG5cdFx0aWYgKHRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKHRpbWVvdXQgPCAwKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignTmVnYXRpdmUgbnVtYmVyJyk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMudGltZW91dCA9IHRpbWVvdXQ7XG5cdFx0fVxuXG5cdFx0aWYgKGhpamFja1ByZXZlbnRpb24gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5oaWphY2tQcmV2ZW50aW9uID0gaGlqYWNrUHJldmVudGlvbjtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGxhc3RBY2Nlc3MgPSAwO1xuXHRwcml2YXRlIHNlbWFmb3I6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcblx0YXN5bmMgdGFrZSgpIHtcblx0XHQvLyBBd2FpdCBsb29wXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cblx0XHR3aGlsZSAodHJ1ZSkge1xuXHRcdFx0Ly8gV2FpdCB0aW1lb3V0XG5cdFx0XHRpZiAodGhpcy50aW1lb3V0ID4gMCkge1xuXHRcdFx0XHRjb25zdCBpZGxlID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLSB0aGlzLmxhc3RBY2Nlc3M7XG5cdFx0XHRcdGlmIChpZGxlIDwgdGhpcy50aW1lb3V0KSB7XG5cdFx0XHRcdFx0YXdhaXQgd2FpdCh0aGlzLnRpbWVvdXQgLSBpZGxlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5zZW1hZm9yID09PSBudWxsKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXG5cdFx0XHRhd2FpdCB0aGlzLnNlbWFmb3I7XG5cblx0XHRcdC8vIFdhaXQgcmFuZG9tIHRpbWUgdW50aWwgMzBtcyB0byBwcmV2ZW50IGZsb3cgaGlqYWNraW5nXG5cdFx0XHRpZiAodGhpcy5oaWphY2tQcmV2ZW50aW9uKSB7XG5cdFx0XHRcdGF3YWl0IHdhaXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMzApKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRsZXQgc2VtYWZvclJlc29sdmVyOiAoKSA9PiB2b2lkO1xuXHRcdHRoaXMuc2VtYWZvciA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG5cdFx0XHRzZW1hZm9yUmVzb2x2ZXIgPSByZXNvbHZlO1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdHRoaXMubGFzdEFjY2VzcyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuXHRcdFx0dGhpcy5zZW1hZm9yID0gbnVsbDtcblx0XHRcdHNlbWFmb3JSZXNvbHZlcigpO1xuXHRcdH07XG5cdH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsSUFBQUEsS0FBQSxHQUFBQyxPQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBV0E7Ozs7Ozs7Ozs7O0FBV00sTUFBT0MsU0FBUztFQUlyQkMsWUFBWUMsT0FBaUI7SUFIWixLQUFBQyxPQUFPLEdBQVcsQ0FBQztJQUNuQixLQUFBQyxnQkFBZ0IsR0FBWSxJQUFJO0lBa0J6QyxLQUFBQyxVQUFVLEdBQUcsQ0FBQztJQUNkLEtBQUFDLE9BQU8sR0FBeUIsSUFBSTtJQWhCM0MsTUFBTTtNQUFFSCxPQUFPO01BQUVDO0lBQWdCLENBQUUsR0FBR0YsT0FBTyxJQUFJLEVBQUU7SUFFbkQsSUFBSUMsT0FBTyxLQUFLSSxTQUFTLEVBQUU7TUFDMUIsSUFBSUosT0FBTyxHQUFHLENBQUMsRUFBRTtRQUNoQixNQUFNLElBQUlLLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQztNQUNuQztNQUVBLElBQUksQ0FBQ0wsT0FBTyxHQUFHQSxPQUFPO0lBQ3ZCO0lBRUEsSUFBSUMsZ0JBQWdCLEtBQUtHLFNBQVMsRUFBRTtNQUNuQyxJQUFJLENBQUNILGdCQUFnQixHQUFHQSxnQkFBZ0I7SUFDekM7RUFDRDtFQUlNSyxJQUFJQSxDQUFBOztNQUNUO01BQ0E7TUFDQSxPQUFPLElBQUksRUFBRTtRQUNaO1FBQ0EsSUFBSSxJQUFJLENBQUNOLE9BQU8sR0FBRyxDQUFDLEVBQUU7VUFDckIsTUFBTU8sSUFBSSxHQUFHLElBQUlDLElBQUksRUFBRSxDQUFDQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUNQLFVBQVU7VUFDbkQsSUFBSUssSUFBSSxHQUFHLElBQUksQ0FBQ1AsT0FBTyxFQUFFO1lBQ3hCLE1BQU0sSUFBQVUsVUFBSSxFQUFDLElBQUksQ0FBQ1YsT0FBTyxHQUFHTyxJQUFJLENBQUM7VUFDaEM7UUFDRDtRQUVBLElBQUksSUFBSSxDQUFDSixPQUFPLEtBQUssSUFBSSxFQUFFO1VBQzFCO1FBQ0Q7UUFFQSxNQUFNLElBQUksQ0FBQ0EsT0FBTztRQUVsQjtRQUNBLElBQUksSUFBSSxDQUFDRixnQkFBZ0IsRUFBRTtVQUMxQixNQUFNLElBQUFTLFVBQUksRUFBQ0MsSUFBSSxDQUFDQyxLQUFLLENBQUNELElBQUksQ0FBQ0UsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDM0M7TUFDRDtNQUVBLElBQUlDLGVBQTJCO01BQy9CLElBQUksQ0FBQ1gsT0FBTyxHQUFHLElBQUlZLE9BQU8sQ0FBRUMsT0FBTyxJQUFJO1FBQ3RDRixlQUFlLEdBQUdFLE9BQU87TUFDMUIsQ0FBQyxDQUFDO01BRUYsT0FBTyxNQUFLO1FBQ1gsSUFBSSxDQUFDZCxVQUFVLEdBQUcsSUFBSU0sSUFBSSxFQUFFLENBQUNDLE9BQU8sRUFBRTtRQUN0QyxJQUFJLENBQUNOLE9BQU8sR0FBRyxJQUFJO1FBQ25CVyxlQUFlLEVBQUU7TUFDbEIsQ0FBQztJQUNGLENBQUM7OztBQUNERyxPQUFBLENBQUFwQixTQUFBLEdBQUFBLFNBQUEiLCJpZ25vcmVMaXN0IjpbXX0=