ReutenkoIvan

async store with calculated threads

Oct 20th, 2019
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function Storage(maxCalls = 5) {
  2.   let privateStore = {};
  3.   let calls = 0;
  4.   const queIO = [];
  5.  
  6.   const getItem = (key) => new Promise(res => {
  7.     calls++;
  8.     if (calls <= maxCalls) {
  9.       setTimeout(() => {
  10.         calls--;
  11.         res(
  12.           key ? privateStore[key] : { ...privateStore }
  13.         )
  14.  
  15.         const next = queIO.shift()
  16.         next && next()
  17.       }, 1000)
  18.     } else {
  19.       calls--;
  20.       queIO.push(() => res(getItem(key)))
  21.     }
  22.   })
  23.  
  24.   const setItem = (key, value) => new Promise(res => {
  25.     calls++;
  26.     if (calls <= maxCalls) {
  27.       setTimeout(() => {
  28.         calls--;
  29.         if (key) {
  30.           res(privateStore[key] = value)
  31.         } else {
  32.           res(privateStore = value)
  33.         }
  34.         const next = queIO.shift()
  35.         next && next()
  36.       }, 1000)
  37.     } else {
  38.       calls--
  39.       queIO.push(() => res(setItem(key, value)))
  40.     }
  41.   })
  42.  
  43.  
  44.   const list = () => getItem().then(Object.keys);
  45.   const fetch = (key) => key ? getItem(key) : Promise.reject('no key');
  46.   const store = (key, value) => key ? setItem(key, value) : Promise.reject('no key');
  47.   const destroy = (key) => {
  48.     if (!key) return Promise.reject('no key')
  49.  
  50.    return getItem().then(storageCopy => {
  51.     const del = k => delete storageCopy[k];
  52.  
  53.     Array.isArray(key) ? key.forEach(del) : del(key)
  54.  
  55.     return setItem(null, storageCopy)
  56.   }
  57.   )}
  58.  
  59.   const storeList = list => getItem().then(
  60.     storageCopy => {
  61.       for (let { key, data } of list) {
  62.         if (key) storageCopy[key] = data
  63.       }
  64.  
  65.       return setItem(null, storageCopy)
  66.     }
  67.   )
  68.  
  69.  
  70.   const destroyStartedWith = (beginningOfKey) => {
  71.     if (!beginningOfKey) return Promise.resolve()
  72.  
  73.     return list()
  74.       .then(keysList => {
  75.         const mask = new RegExp(`^${beginningOfKey}`)
  76.         const keysForDeleting = keysList.filter(key => mask.test(key));
  77.         return destroy(keysForDeleting).then(() => Promise.resolve())
  78.       })
  79.   }
  80.  
  81.   const fetchInTimeOrFail = (key, timeout) => {
  82.     return new Promise((resolve, reject) => {
  83.       fetch(key).then(resolve)
  84.       setTimeout(() => reject('Item with this key not found'), timeout)
  85.     })
  86.   }
  87.  
  88.   return {
  89.     list,
  90.     fetch,
  91.     store,
  92.     destroy,
  93.     storeList,
  94.     destroyStartedWith,
  95.     fetchInTimeOrFail
  96.   }
  97. }
  98.  
  99. //--------------------------CREATING--------------------------//
  100.  
  101. const storage = new Storage(5);
  102.  
  103. //------------------------ADDING_ITEMS------------------------//
  104.  
  105. storage.store('boom', 'hallay');
  106. storage.store('doom', 'Quake');
  107. storage.store('cyka', 'Blyad');
  108.  
  109. storage.list().then(console.log);
  110.  
  111. //--------------------------FETCHING--------------------------//
  112.  
  113. storage.fetch('doom').then((res) => console.log(`fetch  ->   ${res}`));
  114.  
  115. storage.fetchInTimeOrFail('doom', 500)
  116.   .then((res) => console.log(`fetchInTimeOrFail  ->   ${res}`))
  117.   .catch((err) => console.log(`fetchInTimeOrFail  ->  ${err}`))
  118.  
  119. //------------------------MULTI_ADDING------------------------//
  120.  
  121. const list = [{ key: 'vova', data: 'super' }, { key: 'gavno', data: 'pidar' }];
  122.  
  123. storage.storeList(list)
  124.   .then(() => storage.list())
  125.   .then(console.log);
  126.  
  127. //-------------------DESTROY_BY_PART_OF_KEY-------------------//
  128.  
  129. storage.destroyStartedWith('c')
  130. .then(() => storage.list())
  131. .then(console.log)
  132. .catch(console.log)
Advertisement
Add Comment
Please, Sign In to add comment