summaryrefslogtreecommitdiffhomepage
path: root/packages/server/src
diff options
context:
space:
mode:
authorMatthew Miller <matthew@millerti.me>2020-07-04 15:06:09 -0700
committerMatthew Miller <matthew@millerti.me>2020-07-04 15:06:09 -0700
commit2f4d3e86d772d0a7c77715e2d1747421754a1830 (patch)
tree664d6e7f4ac05c319e5771049d58eb5b787bc500 /packages/server/src
parent5634d0043bc7e08369709d7170b3fc5f2ad7bdd6 (diff)
Block getting statements during TOC refresh
Diffstat (limited to 'packages/server/src')
-rw-r--r--packages/server/src/metadata/metadataService.ts34
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();