graphbrainz/src/loaders.js

65 lines
1.7 KiB
JavaScript
Raw Normal View History

2016-08-08 07:54:06 +00:00
import DataLoader from 'dataloader'
2016-11-26 01:38:32 +00:00
import LRUCache from 'lru-cache'
import { toPlural } from './types/helpers'
2016-08-08 07:54:06 +00:00
2016-11-26 01:38:32 +00:00
const debug = require('debug')('graphbrainz:loaders')
2016-08-08 07:54:06 +00:00
2016-11-26 01:38:32 +00:00
export default function createLoaders (client) {
const cache = LRUCache({
max: 8192,
maxAge: 24 * 60 * 60 * 1000, // 1 day.
dispose (key) {
debug(`Removed '${key}' from cache.`)
}
})
cache.delete = cache.del
cache.clear = cache.reset
2016-08-20 05:59:32 +00:00
2016-11-26 01:38:32 +00:00
const lookup = new DataLoader(keys => {
return Promise.all(keys.map(key => {
const [ entityType, id, params ] = key
return client.lookup(entityType, id, params).then(entity => {
if (entity) {
entity.entityType = entityType
}
return entity
2016-08-20 05:59:32 +00:00
})
2016-11-26 01:38:32 +00:00
}))
}, {
cacheKeyFn: (key) => client.getLookupURL(...key),
cacheMap: cache
})
2016-08-20 05:59:32 +00:00
2016-11-26 01:38:32 +00:00
const browse = new DataLoader(keys => {
return Promise.all(keys.map(key => {
const [ entityType, params ] = key
return client.browse(entityType, params).then(list => {
list[toPlural(entityType)].forEach(entity => {
entity.entityType = entityType
})
return list
2016-08-20 05:59:32 +00:00
})
2016-11-26 01:38:32 +00:00
}))
}, {
cacheKeyFn: (key) => client.getBrowseURL(...key),
cacheMap: cache
})
const search = new DataLoader(keys => {
return Promise.all(keys.map(key => {
const [ entityType, query, params ] = key
return client.search(entityType, query, params).then(list => {
list[toPlural(entityType)].forEach(entity => {
entity.entityType = entityType
})
return list
})
}))
}, {
cacheKeyFn: (key) => client.getSearchURL(...key),
cacheMap: cache
})
return { lookup, browse, search }
}