graphbrainz
Version:
A GraphQL schema, Express server, and middleware for querying the MusicBrainz.
69 lines (65 loc) • 1.84 kB
JavaScript
import createDebug from 'debug';
import DataLoader from 'dataloader';
import LRUCache from 'lru-cache';
const debug = createDebug('graphbrainz:extensions/cover-art-archive');
export default function createLoaders(options) {
const { client } = options;
const cache = new LRUCache({
max: options.cacheSize,
maxAge: options.cacheTTL,
dispose(key) {
debug(`Removed from cache. key=${key}`);
},
});
// Make the cache Map-like.
cache.delete = cache.del;
cache.clear = cache.reset;
return {
coverArtArchive: new DataLoader(
(keys) => {
return Promise.all(
keys.map((key) => {
const [entityType, id] = key;
return client
.images(entityType, id)
.catch((err) => {
if (err.response.statusCode === 404) {
return { images: [] };
}
throw err;
})
.then((coverArt) => ({
...coverArt,
_entityType: entityType,
_id: id,
_releaseID:
coverArt.release && coverArt.release.split('/').pop(),
}));
})
);
},
{
cacheKeyFn: ([entityType, id]) => `${entityType}/${id}`,
cacheMap: cache,
}
),
coverArtArchiveURL: new DataLoader(
(keys) => {
return Promise.all(
keys.map((key) => {
const [entityType, id, type, size] = key;
return client.imageURL(entityType, id, type, size);
})
);
},
{
batch: false,
cacheKeyFn: ([entityType, id, type, size]) => {
const key = `${entityType}/${id}/${type}`;
return size ? `${key}-${size}` : key;
},
cacheMap: cache,
}
),
};
}