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
77 changes: 77 additions & 0 deletions src/StateManager.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
import type { SearchIndex } from 'algoliasearch';

import { config } from './config';
import { datadog } from './utils/datadog';

type State = {
seq: number | null;
bootstrapDone: boolean;
bootstrapLastId?: number;
};
const defaultState: State = {
seq: config.seq,
bootstrapDone: false,
bootstrapLastId: undefined,
};

export class StateManager {
algoliaIndex;
currentState: State = { ...defaultState };
refreshed: boolean = false;

constructor(algoliaIndex: SearchIndex) {
this.algoliaIndex = algoliaIndex;
}

async check(): Promise<State> {
if (config.seq !== null) {
return this.reset();
}

const state = await this.get();

if (state === undefined) {
return this.reset();
}

return state;
}

async get(): Promise<State> {
if (this.currentState && this.refreshed) {
return this.currentState;
}

const start = Date.now();
const { userData } = await this.algoliaIndex.getSettings();
datadog.timing('stateManager.get', Date.now() - start);

this.refreshed = true;
return userData;
}

async set(state: State): Promise<State> {
this.currentState = state;

const start = Date.now();
await this.algoliaIndex.setSettings({
userData: state,
});
datadog.timing('stateManager.set', Date.now() - start);

return state;
}

async reset(): Promise<State> {
return await this.set(defaultState);
}

async save(partial: Partial<State>): Promise<State> {
const current = await this.get();

return await this.set({
...current,
...partial,
});
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import createStateManager from '../createStateManager.js';
import { StateManager } from '../StateManager';

describe('stateManager', () => {
describe('get()', () => {
Expand All @@ -9,8 +9,8 @@ describe('stateManager', () => {
userData: 'foobar',
};
}),
};
const stateManager = createStateManager(mock);
} as any;
const stateManager = new StateManager(mock);
const userData = await stateManager.get();

expect(mock.getSettings).toHaveBeenCalled();
Expand All @@ -22,12 +22,12 @@ describe('stateManager', () => {
it('should set userData to algolia', async () => {
const mock = {
setSettings: jest.fn(),
};
const stateManager = createStateManager(mock);
await stateManager.set('state');
} as any;
const stateManager = new StateManager(mock);
await stateManager.set({ seq: 1, bootstrapDone: false });

expect(mock.setSettings).toHaveBeenCalledWith({
userData: 'state',
userData: { seq: 1, bootstrapDone: false },
});
});
});
Expand All @@ -36,8 +36,8 @@ describe('stateManager', () => {
it('should reset userData', async () => {
const mock = {
setSettings: jest.fn(),
};
const stateManager = createStateManager(mock);
} as any;
const stateManager = new StateManager(mock);
await stateManager.reset();

expect(mock.setSettings).toHaveBeenCalled();
Expand All @@ -53,9 +53,9 @@ describe('stateManager', () => {
};
}),
setSettings: jest.fn(),
};
const stateManager = createStateManager(mock);
await stateManager.save({ foo: 'bar' });
} as any;
const stateManager = new StateManager(mock);
await stateManager.save({ foo: 'bar' } as any);

expect(mock.getSettings).toHaveBeenCalled();
expect(mock.setSettings).toHaveBeenCalledWith({
Expand Down
62 changes: 0 additions & 62 deletions src/createStateManager.js

This file was deleted.

4 changes: 2 additions & 2 deletions src/index.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { StateManager } from './StateManager';
import * as algolia from './algolia/index';
import * as bootstrap from './bootstrap.js';
import { config } from './config';
import createStateManager from './createStateManager.js';
import * as jsDelivr from './jsDelivr/index';
import { datadog } from './utils/datadog';
import { log } from './utils/log';
Expand Down Expand Up @@ -39,7 +39,7 @@ async function main() {
datadog.timing('main.init_algolia', Date.now() - start);

// Create State Manager that holds progression of indexing
const stateManager = createStateManager(mainIndex);
const stateManager = new StateManager(mainIndex);

// Preload some useful data
await jsDelivr.loadHits();
Expand Down