diff options
author | Matthew Miller <matthew@millerti.me> | 2020-07-04 15:06:09 -0700 |
---|---|---|
committer | Matthew Miller <matthew@millerti.me> | 2020-07-04 15:06:09 -0700 |
commit | 2f4d3e86d772d0a7c77715e2d1747421754a1830 (patch) | |
tree | 664d6e7f4ac05c319e5771049d58eb5b787bc500 /packages/server/src | |
parent | 5634d0043bc7e08369709d7170b3fc5f2ad7bdd6 (diff) |
Block getting statements during TOC refresh
Diffstat (limited to 'packages/server/src')
-rw-r--r-- | packages/server/src/metadata/metadataService.ts | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/packages/server/src/metadata/metadataService.ts b/packages/server/src/metadata/metadataService.ts index ebdf992..3ec1e12 100644 --- a/packages/server/src/metadata/metadataService.ts +++ b/packages/server/src/metadata/metadataService.ts @@ -74,6 +74,9 @@ class MetadataService { aaguid = convertAAGUIDToString(aaguid); } + // If a TOC refresh is in progress then pause this until the service is ready + await this.pauseUntilReady(); + if (ENABLE_MDS) { const now = new Date(); if (now > this.nextUpdate) { @@ -197,6 +200,37 @@ class MetadataService { this.state = SERVICE_STATE.READY; } + + /** + * A helper method to pause execution until the service is ready + */ + private async pauseUntilReady(): Promise<void> { + if (this.state === SERVICE_STATE.READY) { + return; + } + + // State isn't ready, so set up polling + const readyPromise = new Promise<void>((resolve, reject) => { + const totalTimeoutMS = 70000; + const intervalMS = 100; + let iterations = totalTimeoutMS / intervalMS; + + // Check service state every `intervalMS` milliseconds + const intervalID: NodeJS.Timeout = setInterval(() => { + if (iterations < 1) { + clearInterval(intervalID); + reject(`State did not become ready in ${totalTimeoutMS / 1000} seconds`); + } else if (this.state === SERVICE_STATE.READY) { + clearInterval(intervalID); + resolve(); + } + + iterations -= 1; + }, intervalMS); + }); + + return readyPromise; + } } const metadataService = new MetadataService(); |