mirror of
https://github.com/gristlabs/grist-core.git
synced 2024-10-27 20:44:07 +00:00
ToggleEnterpriseModel: new GrainJS model to handle changes to config API
Patterned after TelemetryModel.ts
This commit is contained in:
parent
62a04e9510
commit
f0cf86be8e
44
app/client/models/ToggleEnterpriseModel.ts
Normal file
44
app/client/models/ToggleEnterpriseModel.ts
Normal file
@ -0,0 +1,44 @@
|
||||
import {getHomeUrl} from 'app/client/models/AppModel';
|
||||
import {Disposable, Observable} from "grainjs";
|
||||
import {ConfigAPI} from 'app/common/ConfigAPI';
|
||||
import {delay} from 'app/common/delay';
|
||||
|
||||
export class ToggleEnterpriseModel extends Disposable {
|
||||
public readonly edition: Observable<string | null> = Observable.create(this, null);
|
||||
private readonly _configAPI: ConfigAPI = new ConfigAPI(getHomeUrl());
|
||||
|
||||
public async fetchEnterpriseToggle(): Promise<void> {
|
||||
const edition = await this._configAPI.getValue('edition');
|
||||
this.edition.set(edition);
|
||||
}
|
||||
|
||||
public async updateEnterpriseToggle(edition: string): Promise<void> {
|
||||
// We may be restarting the server, so these requests may well
|
||||
// fail if done in quick succession.
|
||||
await retryOnNetworkError(() => this._configAPI.setValue({edition}));
|
||||
this.edition.set(edition);
|
||||
await retryOnNetworkError(() => this._configAPI.restartServer());
|
||||
}
|
||||
}
|
||||
|
||||
// Copied from DocPageModel.ts
|
||||
const reconnectIntervals = [1000, 1000, 2000, 5000, 10000];
|
||||
async function retryOnNetworkError<R>(func: () => Promise<R>): Promise<R> {
|
||||
for (let attempt = 0; ; attempt++) {
|
||||
try {
|
||||
return await func();
|
||||
} catch (err) {
|
||||
// fetch() promises that network errors are reported as TypeError. We'll accept NetworkError too.
|
||||
if (err.name !== "TypeError" && err.name !== "NetworkError") {
|
||||
throw err;
|
||||
}
|
||||
// We really can't reach the server. Make it known.
|
||||
if (attempt >= reconnectIntervals.length) {
|
||||
throw err;
|
||||
}
|
||||
const reconnectTimeout = reconnectIntervals[attempt];
|
||||
console.warn(`Call to ${func.name} failed, will retry in ${reconnectTimeout} ms`, err);
|
||||
await delay(reconnectTimeout);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user