UNPKG

2.92 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6
7var _promise = require('babel-runtime/core-js/promise');
8
9var _promise2 = _interopRequireDefault(_promise);
10
11exports.default = createLoaders;
12
13var _dataloader = require('dataloader');
14
15var _dataloader2 = _interopRequireDefault(_dataloader);
16
17var _lruCache = require('lru-cache');
18
19var _lruCache2 = _interopRequireDefault(_lruCache);
20
21var _helpers = require('./types/helpers');
22
23var _util = require('./util');
24
25function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
26
27const debug = require('debug')('graphbrainz:loaders');
28
29function createLoaders(client) {
30 // All loaders share a single LRU cache that will remember 8192 responses,
31 // each cached for 1 day.
32 const cache = (0, _lruCache2.default)({
33 max: parseInt(process.env.GRAPHBRAINZ_CACHE_SIZE || 8192, 10),
34 maxAge: parseInt(process.env.GRAPHBRAINZ_CACHE_TTL || _util.ONE_DAY, 10),
35 dispose(key) {
36 debug(`Removed from cache. key=${key}`);
37 }
38 });
39 // Make the cache Map-like.
40 cache.delete = cache.del;
41 cache.clear = cache.reset;
42
43 const lookup = new _dataloader2.default(keys => {
44 return _promise2.default.all(keys.map(key => {
45 const [entityType, id, params = {}] = key;
46 return client.lookup(entityType, id, params).then(entity => {
47 if (entity) {
48 // Store the entity type so we can determine what type of object this
49 // is elsewhere in the code.
50 entity._type = entityType;
51 }
52 return entity;
53 });
54 }));
55 }, {
56 batch: false,
57 cacheKeyFn: key => client.getLookupURL(...key),
58 cacheMap: cache
59 });
60
61 const browse = new _dataloader2.default(keys => {
62 return _promise2.default.all(keys.map(key => {
63 const [entityType, params = {}] = key;
64 return client.browse(entityType, params).then(list => {
65 list[(0, _helpers.toPlural)(entityType)].forEach(entity => {
66 // Store the entity type so we can determine what type of object this
67 // is elsewhere in the code.
68 entity._type = entityType;
69 });
70 return list;
71 });
72 }));
73 }, {
74 batch: false,
75 cacheKeyFn: key => client.getBrowseURL(...key),
76 cacheMap: cache
77 });
78
79 const search = new _dataloader2.default(keys => {
80 return _promise2.default.all(keys.map(key => {
81 const [entityType, query, params = {}] = key;
82 return client.search(entityType, query, params).then(list => {
83 list[(0, _helpers.toPlural)(entityType)].forEach(entity => {
84 // Store the entity type so we can determine what type of object this
85 // is elsewhere in the code.
86 entity._type = entityType;
87 });
88 return list;
89 });
90 }));
91 }, {
92 batch: false,
93 cacheKeyFn: key => client.getSearchURL(...key),
94 cacheMap: cache
95 });
96
97 return { lookup, browse, search };
98}
\No newline at end of file