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
JavaScript
;
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=