Generate visual representations of the networks underlying video-gamebooks on YouTube
https://youtube-maze.delab.re/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
1.3 KiB
63 lines
1.3 KiB
import util from 'util';
|
|
|
|
export const YOUTUBE_BASE = 'https://www.youtube.com/%s';
|
|
export const WATCH_BASE = util.format(YOUTUBE_BASE, 'watch?v=%s');
|
|
|
|
/**
|
|
* Hold a queue of promises from which results can be extracted.
|
|
*/
|
|
export class PromiseQueue
|
|
{
|
|
constructor()
|
|
{
|
|
this.pending = new Set();
|
|
}
|
|
|
|
/**
|
|
* Add a new promise to the queue.
|
|
*
|
|
* @param Promise promise Promise to be added.
|
|
*/
|
|
add(promise)
|
|
{
|
|
const wrapped = promise.then(res => {
|
|
this.pending.delete(wrapped);
|
|
return res;
|
|
});
|
|
|
|
this.pending.add(wrapped);
|
|
}
|
|
|
|
/**
|
|
* Check whether there is no promise pending in the queue.
|
|
*
|
|
* @return boolean
|
|
*/
|
|
empty()
|
|
{
|
|
return this.pending.size === 0;
|
|
}
|
|
|
|
/**
|
|
* Extract the next available result from the promise queue.
|
|
*
|
|
* @return any Next result.
|
|
*/
|
|
next()
|
|
{
|
|
return Promise.race(this.pending);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Escape double quotes in a string.
|
|
*/
|
|
export const escapeQuotes = str => str.replace(/"/g, '\\"');
|
|
|
|
/**
|
|
* Make a promise that is resolved in a point in the future.
|
|
*
|
|
* @param number time Time to wait before resolving the promise (ms).
|
|
* @return null
|
|
*/
|
|
export const sleep = time => new Promise(resolve => setTimeout(resolve, time));
|
|
|