aboutsummaryrefslogtreecommitdiff
path: root/src/mscz.ts
blob: 4e15f4aa2eb777f5a7c71e7b0b0bde47e0e14fb9 (plain) (blame)
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
import { assertRes, getFetch } from "./utils";
import { ScoreInfo } from "./scoreinfo";

export const MSCZ_BUF_SYM = Symbol("msczBufferP");
export const MSCZ_URL_SYM = Symbol("msczUrl");

export const loadMsczUrl = async (
    scoreinfo: ScoreInfo,
    _fetch = getFetch()
): Promise<string> => {
    // look for the persisted msczUrl inside scoreinfo
    let result = scoreinfo.store.get(MSCZ_URL_SYM) as string;
    if (result) {
        return result;
    }

    scoreinfo.store.set(MSCZ_URL_SYM, result); // persist to scoreinfo
    return result;
};

export const fetchMscz = async (
    scoreinfo: ScoreInfo,
    _fetch = getFetch()
): Promise<ArrayBuffer> => {
    let msczBufferP = scoreinfo.store.get(MSCZ_BUF_SYM) as
        | Promise<ArrayBuffer>
        | undefined;

    if (!msczBufferP) {
        msczBufferP = (async (): Promise<ArrayBuffer> => {
            const url = await loadMsczUrl(scoreinfo, _fetch);
            const r = await _fetch(url);
            assertRes(r);
            const data = await r.arrayBuffer();
            return data;
        })();
        scoreinfo.store.set(MSCZ_BUF_SYM, msczBufferP);
    }

    return msczBufferP;
};

// eslint-disable-next-line @typescript-eslint/require-await
export const setMscz = async (
    scoreinfo: ScoreInfo,
    buffer: ArrayBuffer
): Promise<void> => {
    scoreinfo.store.set(MSCZ_BUF_SYM, Promise.resolve(buffer));
};