mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-11-04 03:17:00 -05: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,
 | 
						|
};
 |