* promisify `chrome` into `browser` * comment * comment * comment * Add: a naive browser polyfill * Fix: polyfill doesn't detect content script env correctly Co-authored-by: eight04 <eight04@gmail.com>
		
			
				
	
	
		
			68 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* global chromeLocal */
 | |
| /* exported createChromeStorageDB */
 | |
| 'use strict';
 | |
| 
 | |
| function createChromeStorageDB() {
 | |
|   let INC;
 | |
| 
 | |
|   const PREFIX = 'style-';
 | |
|   const METHODS = {
 | |
|     // FIXME: we don't use this method at all. Should we remove this?
 | |
|     get: id => chromeLocal.getValue(PREFIX + id),
 | |
|     put: obj =>
 | |
|       // FIXME: should we clone the object?
 | |
|       Promise.resolve(!obj.id && prepareInc().then(() => Object.assign(obj, {id: INC++})))
 | |
|         .then(() => chromeLocal.setValue(PREFIX + obj.id, obj))
 | |
|         .then(() => obj.id),
 | |
|     putMany: items => prepareInc()
 | |
|       .then(() =>
 | |
|         chromeLocal.set(items.reduce((data, item) => {
 | |
|           if (!item.id) item.id = INC++;
 | |
|           data[PREFIX + item.id] = item;
 | |
|           return data;
 | |
|         }, {})))
 | |
|       .then(() => items.map(i => i.id)),
 | |
|     delete: id => chromeLocal.remove(PREFIX + id),
 | |
|     getAll: () => chromeLocal.get()
 | |
|       .then(result => {
 | |
|         const output = [];
 | |
|         for (const key in result) {
 | |
|           if (key.startsWith(PREFIX) && Number(key.slice(PREFIX.length))) {
 | |
|             output.push(result[key]);
 | |
|           }
 | |
|         }
 | |
|         return output;
 | |
|       })
 | |
|   };
 | |
| 
 | |
|   return {exec};
 | |
| 
 | |
|   function exec(method, ...args) {
 | |
|     if (METHODS[method]) {
 | |
|       return METHODS[method](...args)
 | |
|         .then(result => {
 | |
|           if (method === 'putMany' && result.map) {
 | |
|             return result.map(r => ({target: {result: r}}));
 | |
|           }
 | |
|           return {target: {result}};
 | |
|         });
 | |
|     }
 | |
|     return Promise.reject(new Error(`unknown DB method ${method}`));
 | |
|   }
 | |
| 
 | |
|   function prepareInc() {
 | |
|     if (INC) return Promise.resolve();
 | |
|     return chromeLocal.get().then(result => {
 | |
|       INC = 1;
 | |
|       for (const key in result) {
 | |
|         if (key.startsWith(PREFIX)) {
 | |
|           const id = Number(key.slice(PREFIX.length));
 | |
|           if (id >= INC) {
 | |
|             INC = id + 1;
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|     });
 | |
|   }
 | |
| }
 |