Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 29 additions & 4 deletions shell/plugins/steve/subscribe.js
Original file line number Diff line number Diff line change
Expand Up @@ -131,11 +131,17 @@ const isWaitingForDestroy = (storeName, store) => {
};

const waitForSettingsSchema = (storeName, store) => {
return waitFor(() => isWaitingForDestroy(storeName, store) || !!store.getters['management/byId'](SCHEMA, MANAGEMENT.SETTING));
return waitFor(
() => isWaitingForDestroy(storeName, store) || !!store.getters['management/byId'](SCHEMA, MANAGEMENT.SETTING),
'management settings schema to be available'
);
};

const waitForSettings = (storeName, store) => {
return waitFor(() => isWaitingForDestroy(storeName, store) || !!store.getters['management/byId'](MANAGEMENT.SETTING, SETTING.UI_PERFORMANCE));
return waitFor(
() => isWaitingForDestroy(storeName, store) || !!store.getters['management/byId'](MANAGEMENT.SETTING, SETTING.UI_PERFORMANCE),
'UI performance settings to be available'
);
};

const isAdvancedWorker = (ctx) => {
Expand Down Expand Up @@ -195,8 +201,20 @@ export async function createWorker(store, ctx) {
};
}

await waitForSettingsSchema(storeName, store);
await waitForSettings(storeName, store);
try {
await waitForSettingsSchema(storeName, store);
await waitForSettings(storeName, store);
} catch (e) {
// Clean up the mock worker and abort so callers are not permanently blocked.
if (store.$workers[storeName]?.destroy) {
store.$workers[storeName].destroy();
} else {
delete store.$workers[storeName];
}

return;
}

if (store.$workers[storeName].waitingForDestroy()) {
store.$workers[storeName].destroy();

Expand Down Expand Up @@ -382,6 +400,13 @@ const sharedActions = {
if (!this.$workers[getters.storeName]) {
await createWorker(this, ctx);
}

// createWorker cleans up and returns early when schema/settings are unavailable.
// Guard against calling postMessage on a non-existent worker.
if (!this.$workers[getters.storeName]) {
return;
}

const options = { parseJSON: false };
const csrf = rootGetters['cookies/get']({ key: CSRF, options });

Expand Down
6 changes: 1 addition & 5 deletions shell/utils/async.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,7 @@ export const waitFor = (testFn: Function, msg = '', timeoutMs = 3000000, interva
gatedLog('Wait for', msg, 'timed out');
clearInterval(interval);
clearTimeout(timeout);
if (msg) {
reject(new Error(`Failed waiting for: ${ msg }`));
} else {
throw new Error(`waitFor timed out after ${ timeoutMs / 1000 } seconds`);
}
reject(new Error(msg ? `Failed waiting for: ${ msg }` : `waitFor timed out after ${ timeoutMs / 1000 } seconds`));
}, timeoutMs);
const interval = setInterval(() => {
if ( testFn() ) {
Expand Down
Loading