All files init.js

73.33% Statements 22/30
50% Branches 3/6
66.67% Functions 6/9
75.86% Lines 22/29
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66        1x 3x 3x 3x   3x 3x           1x 3x           1x 3x     3x   3x       3x   3x   3x       3x   3x 3x   3x   3x           5x 5x                    
import createNativeAdapter from './adapter';
import storeInterface from './storeInterface';
import messages from './messages';
 
const initProjection = async (repository) => {
    await repository.connectionPromise;
    Iif (repository.lastTimestamp !== 0) return;
    repository.lastTimestamp = 1;
 
    try {
        await repository.initHandler(repository.writeInterface);
    } catch (error) {
        repository.internalError = error;
    }
};
 
const synchronizeDatabase = async (repository, client) => {
    repository.lastTimestamp = Math.max(
        repository.lastTimestamp,
        await repository.meta.getLastTimestamp()
    );
};
 
const init = (repository) => {
    Iif (repository.interfaceMap) {
        throw new Error(messages.alreadyInitialized);
    }
    repository.lastTimestamp = 0;
 
    Iif (typeof repository.initHandler !== 'function') {
        repository.initHandler = async () => {};
    }
 
    repository.connectionPromise = repository
        .connectDatabase()
        .then(client => (repository.client = client))
        .then(async () => {
            repository.nativeAdapter = await createNativeAdapter(repository);
        })
        .then(synchronizeDatabase.bind(null, repository));
 
    repository.internalError = null;
 
    repository.readInterface = storeInterface(repository, false);
    repository.writeInterface = storeInterface(repository, true);
 
    repository.initDonePromise = initProjection(repository);
 
    return {
        getLastAppliedTimestamp: async () => {
            await repository.connectionPromise;
            return repository.lastTimestamp;
        },
        getReadable: async () => {
            await repository.initDonePromise;
            return repository.readInterface;
        },
        getError: async () => {
            await repository.initDonePromise;
            return repository.internalError;
        }
    };
};
 
export default init;