mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-30 18:12:25 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			86 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| 
 | |
| const fs = require('graceful-fs');
 | |
| 
 | |
| function createSyncFs(fs) {
 | |
|     const methods = ['mkdir', 'realpath', 'stat', 'rmdir', 'utimes'];
 | |
|     const newFs = { ...fs };
 | |
| 
 | |
|     methods.forEach((method) => {
 | |
|         newFs[method] = (...args) => {
 | |
|             const callback = args.pop();
 | |
|             let ret;
 | |
| 
 | |
|             try {
 | |
|                 ret = fs[`${method}Sync`](...args);
 | |
|             } catch (err) {
 | |
|                 return callback(err);
 | |
|             }
 | |
| 
 | |
|             callback(null, ret);
 | |
|         };
 | |
|     });
 | |
| 
 | |
|     return newFs;
 | |
| }
 | |
| 
 | |
| // ----------------------------------------------------------
 | |
| 
 | |
| function toPromise(method) {
 | |
|     return (...args) => new Promise((resolve, reject) => {
 | |
|         args.push((err, result) => {
 | |
|             if (err) {
 | |
|                 reject(err);
 | |
|             } else {
 | |
|                 resolve(result);
 | |
|             }
 | |
|         });
 | |
| 
 | |
|         method(...args);
 | |
|     });
 | |
| }
 | |
| 
 | |
| function toSync(method) {
 | |
|     return (...args) => {
 | |
|         let err;
 | |
|         let result;
 | |
| 
 | |
|         args.push((_err, _result) => {
 | |
|             err = _err;
 | |
|             result = _result;
 | |
|         });
 | |
| 
 | |
|         method(...args);
 | |
| 
 | |
|         if (err) {
 | |
|             throw err;
 | |
|         }
 | |
| 
 | |
|         return result;
 | |
|     };
 | |
| }
 | |
| 
 | |
| function toSyncOptions(options) {
 | |
|     // Shallow clone options because we are oging to mutate them
 | |
|     options = { ...options };
 | |
| 
 | |
|     // Transform fs to use the sync methods instead
 | |
|     options.fs = createSyncFs(options.fs || fs);
 | |
| 
 | |
|     // Retries are not allowed because it requires the flow to be sync
 | |
|     if (
 | |
|         (typeof options.retries === 'number' && options.retries > 0) ||
 | |
|         (options.retries && typeof options.retries.retries === 'number' && options.retries.retries > 0)
 | |
|     ) {
 | |
|         throw Object.assign(new Error('Cannot use retries with the sync api'), { code: 'ESYNC' });
 | |
|     }
 | |
| 
 | |
|     return options;
 | |
| }
 | |
| 
 | |
| module.exports = {
 | |
|     toPromise,
 | |
|     toSync,
 | |
|     toSyncOptions,
 | |
| };
 |