diff options
Diffstat (limited to 'src/file-size-preloader.js')
-rw-r--r-- | src/file-size-preloader.js | 130 |
1 files changed, 66 insertions, 64 deletions
diff --git a/src/file-size-preloader.js b/src/file-size-preloader.js index d0807cc3..363fb4c0 100644 --- a/src/file-size-preloader.js +++ b/src/file-size-preloader.js @@ -1,3 +1,5 @@ +/** @format */ + // Very simple, bare-bones file size loader which takes a bunch of file // paths, gets their filesizes, and resolves a promise when it's done. // @@ -17,84 +19,84 @@ // This only processes files one at a time because I'm lazy and stat calls // are very, very fast. -import { stat } from 'fs/promises'; -import { logWarn } from './util/cli.js'; +import {stat} from 'fs/promises'; +import {logWarn} from './util/cli.js'; export default class FileSizePreloader { - #paths = []; - #sizes = []; - #loadedPathIndex = -1; - - #loadingPromise = null; - #resolveLoadingPromise = null; - - loadPaths(...paths) { - this.#paths.push(...paths.filter(p => !this.#paths.includes(p))); - return this.#startLoadingPaths(); - } - - waitUntilDoneLoading() { - return this.#loadingPromise ?? Promise.resolve(); - } + #paths = []; + #sizes = []; + #loadedPathIndex = -1; - #startLoadingPaths() { - if (this.#loadingPromise) { - return this.#loadingPromise; - } + #loadingPromise = null; + #resolveLoadingPromise = null; - this.#loadingPromise = new Promise((resolve => { - this.#resolveLoadingPromise = resolve; - })); + loadPaths(...paths) { + this.#paths.push(...paths.filter((p) => !this.#paths.includes(p))); + return this.#startLoadingPaths(); + } - this.#loadNextPath(); + waitUntilDoneLoading() { + return this.#loadingPromise ?? Promise.resolve(); + } - return this.#loadingPromise; + #startLoadingPaths() { + if (this.#loadingPromise) { + return this.#loadingPromise; } - async #loadNextPath() { - if (this.#loadedPathIndex === this.#paths.length - 1) { - return this.#doneLoadingPaths(); - } - - let size; + this.#loadingPromise = new Promise((resolve) => { + this.#resolveLoadingPromise = resolve; + }); - const path = this.#paths[this.#loadedPathIndex + 1]; + this.#loadNextPath(); - try { - size = await this.readFileSize(path); - } catch (error) { - // Oops! Discard that path, and don't increment the index before - // moving on, since the next path will now be in its place. - this.#paths.splice(this.#loadedPathIndex + 1, 1); - logWarn`Failed to process file size for ${path}: ${error.message}`; - return this.#loadNextPath(); - } + return this.#loadingPromise; + } - this.#sizes.push(size); - this.#loadedPathIndex++; - return this.#loadNextPath(); + async #loadNextPath() { + if (this.#loadedPathIndex === this.#paths.length - 1) { + return this.#doneLoadingPaths(); } - #doneLoadingPaths() { - this.#resolveLoadingPromise(); - this.#loadingPromise = null; - this.#resolveLoadingPromise = null; - } + let size; - // Override me if you want? - // The rest of the code here is literally just a queue system, so you could - // pretty much repurpose it for anything... but there are probably cleaner - // ways than making an instance or subclass of this and overriding this one - // method! - async readFileSize(path) { - const stats = await stat(path); - return stats.size; - } + const path = this.#paths[this.#loadedPathIndex + 1]; - getSizeOfPath(path) { - const index = this.#paths.indexOf(path); - if (index === -1) return null; - if (index > this.#loadedPathIndex) return null; - return this.#sizes[index]; + try { + size = await this.readFileSize(path); + } catch (error) { + // Oops! Discard that path, and don't increment the index before + // moving on, since the next path will now be in its place. + this.#paths.splice(this.#loadedPathIndex + 1, 1); + logWarn`Failed to process file size for ${path}: ${error.message}`; + return this.#loadNextPath(); } + + this.#sizes.push(size); + this.#loadedPathIndex++; + return this.#loadNextPath(); + } + + #doneLoadingPaths() { + this.#resolveLoadingPromise(); + this.#loadingPromise = null; + this.#resolveLoadingPromise = null; + } + + // Override me if you want? + // The rest of the code here is literally just a queue system, so you could + // pretty much repurpose it for anything... but there are probably cleaner + // ways than making an instance or subclass of this and overriding this one + // method! + async readFileSize(path) { + const stats = await stat(path); + return stats.size; + } + + getSizeOfPath(path) { + const index = this.#paths.indexOf(path); + if (index === -1) return null; + if (index > this.#loadedPathIndex) return null; + return this.#sizes[index]; + } } |