49 lines
925 B
TypeScript
49 lines
925 B
TypeScript
|
export class UrlPool {
|
||
|
|
||
|
urls: string[];
|
||
|
used: boolean[] = [];
|
||
|
|
||
|
constructor(urls: string[]) {
|
||
|
this.urls = urls;
|
||
|
for(let i=0; i<urls.length; i++) {
|
||
|
this.used[i] = false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
get_raw(): [number, string] | undefined {
|
||
|
for(let i=0; i<this.urls.length; i++) {
|
||
|
if(this.used[i]) continue;
|
||
|
this.used[i] = true;
|
||
|
return [i, this.urls[i]];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
async get(): Promise<[number, string] | undefined> {
|
||
|
let url = this.get_raw();
|
||
|
if(url) return url;
|
||
|
return new Promise((complete) => {
|
||
|
let check = setInterval(() => {
|
||
|
let url = this.get_raw();
|
||
|
if(url) {
|
||
|
clearInterval(check);
|
||
|
complete(url);
|
||
|
}
|
||
|
}, 500);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
return(i: number) {
|
||
|
this.used[i] = false;
|
||
|
}
|
||
|
|
||
|
available(count?: number) {
|
||
|
let available: number[] = [];
|
||
|
for(let i=0; i<this.used.length; i++) {
|
||
|
if(!this.used[i]) {
|
||
|
available.push(i);
|
||
|
}
|
||
|
}
|
||
|
return count ? available.slice(0, count) : available;
|
||
|
}
|
||
|
|
||
|
}
|