atomically
Advanced tools
Comparing version 1.3.2 to 1.4.0
@@ -11,3 +11,4 @@ declare const DEFAULT_ENCODING = "utf8"; | ||
declare const LIMIT_BASENAME_LENGTH = 128; | ||
declare const LIMIT_FILES_DESCRIPTORS = 950; | ||
declare const NOOP: () => void; | ||
export { DEFAULT_ENCODING, DEFAULT_FILE_MODE, DEFAULT_FOLDER_MODE, DEFAULT_READ_OPTIONS, DEFAULT_WRITE_OPTIONS, DEFAULT_TIMEOUT_ASYNC, DEFAULT_TIMEOUT_SYNC, IS_POSIX, IS_USER_ROOT, LIMIT_BASENAME_LENGTH, NOOP }; | ||
export { DEFAULT_ENCODING, DEFAULT_FILE_MODE, DEFAULT_FOLDER_MODE, DEFAULT_READ_OPTIONS, DEFAULT_WRITE_OPTIONS, DEFAULT_TIMEOUT_ASYNC, DEFAULT_TIMEOUT_SYNC, IS_POSIX, IS_USER_ROOT, LIMIT_BASENAME_LENGTH, LIMIT_FILES_DESCRIPTORS, NOOP }; |
"use strict"; | ||
/* CONSTS */ | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.NOOP = exports.LIMIT_BASENAME_LENGTH = exports.IS_USER_ROOT = exports.IS_POSIX = exports.DEFAULT_TIMEOUT_SYNC = exports.DEFAULT_TIMEOUT_ASYNC = exports.DEFAULT_WRITE_OPTIONS = exports.DEFAULT_READ_OPTIONS = exports.DEFAULT_FOLDER_MODE = exports.DEFAULT_FILE_MODE = exports.DEFAULT_ENCODING = void 0; | ||
exports.NOOP = exports.LIMIT_FILES_DESCRIPTORS = exports.LIMIT_BASENAME_LENGTH = exports.IS_USER_ROOT = exports.IS_POSIX = exports.DEFAULT_TIMEOUT_SYNC = exports.DEFAULT_TIMEOUT_ASYNC = exports.DEFAULT_WRITE_OPTIONS = exports.DEFAULT_READ_OPTIONS = exports.DEFAULT_FOLDER_MODE = exports.DEFAULT_FILE_MODE = exports.DEFAULT_ENCODING = void 0; | ||
const DEFAULT_ENCODING = 'utf8'; | ||
@@ -25,3 +25,5 @@ exports.DEFAULT_ENCODING = DEFAULT_ENCODING; | ||
exports.LIMIT_BASENAME_LENGTH = LIMIT_BASENAME_LENGTH; | ||
const LIMIT_FILES_DESCRIPTORS = 950; //TODO: fetch the real limit from the filesystem | ||
exports.LIMIT_FILES_DESCRIPTORS = LIMIT_FILES_DESCRIPTORS; | ||
const NOOP = () => { }; | ||
exports.NOOP = NOOP; |
@@ -5,14 +5,21 @@ "use strict"; | ||
exports.retryifySync = exports.retryifyAsync = void 0; | ||
const retryify_queue_1 = require("./retryify_queue"); | ||
/* RETRYIFY */ | ||
//TODO: Maybe publish this as a standalone package | ||
//TODO: Implement a more sophisticaed, less intensive, retry strategy | ||
const retryifyAsync = (fn, isRetriableError) => { | ||
return function (timestamp) { | ||
return function attempt() { | ||
return fn.apply(undefined, arguments).catch(error => { | ||
if (Date.now() > timestamp) | ||
return retryify_queue_1.default.schedule(attempt).then(cleanup => { | ||
return fn.apply(undefined, arguments).then(result => { | ||
cleanup(); | ||
return result; | ||
}, error => { | ||
cleanup(); | ||
if (Date.now() >= timestamp) | ||
throw error; | ||
if (isRetriableError(error)) { | ||
const delay = Math.round(100 + (400 * Math.random())), delayPromise = new Promise(resolve => setTimeout(resolve, delay)); | ||
return delayPromise.then(() => attempt.apply(undefined, arguments)); | ||
} | ||
throw error; | ||
if (isRetriableError(error)) | ||
return attempt.apply(undefined, arguments); | ||
throw error; | ||
}); | ||
}); | ||
@@ -19,0 +26,0 @@ }; |
{ | ||
"name": "atomically", | ||
"description": "Read and write files atomically and reliably.", | ||
"version": "1.3.2", | ||
"version": "1.4.0", | ||
"main": "dist/index.js", | ||
@@ -6,0 +6,0 @@ "types": "dist/index.d.ts", |
@@ -24,2 +24,4 @@ | ||
const LIMIT_FILES_DESCRIPTORS = 950; //TODO: fetch the real limit from the filesystem | ||
const NOOP = () => {}; | ||
@@ -29,2 +31,2 @@ | ||
export {DEFAULT_ENCODING, DEFAULT_FILE_MODE, DEFAULT_FOLDER_MODE, DEFAULT_READ_OPTIONS, DEFAULT_WRITE_OPTIONS, DEFAULT_TIMEOUT_ASYNC, DEFAULT_TIMEOUT_SYNC, IS_POSIX, IS_USER_ROOT, LIMIT_BASENAME_LENGTH, NOOP}; | ||
export {DEFAULT_ENCODING, DEFAULT_FILE_MODE, DEFAULT_FOLDER_MODE, DEFAULT_READ_OPTIONS, DEFAULT_WRITE_OPTIONS, DEFAULT_TIMEOUT_ASYNC, DEFAULT_TIMEOUT_SYNC, IS_POSIX, IS_USER_ROOT, LIMIT_BASENAME_LENGTH, LIMIT_FILES_DESCRIPTORS, NOOP}; |
@@ -5,8 +5,6 @@ | ||
import {Exception, FN} from '../types'; | ||
import RetryfyQueue from './retryify_queue'; | ||
/* RETRYIFY */ | ||
//TODO: Maybe publish this as a standalone package | ||
//TODO: Implement a more sophisticaed, less intensive, retry strategy | ||
const retryifyAsync = <T extends FN> ( fn: T, isRetriableError: FN<[Exception], boolean | void> ): FN<[number], T> => { | ||
@@ -18,10 +16,29 @@ | ||
return fn.apply ( undefined, arguments ).catch ( error => { | ||
return RetryfyQueue.schedule ( attempt ).then ( cleanup => { | ||
if ( Date.now () > timestamp ) throw error; | ||
return fn.apply ( undefined, arguments ).then ( result => { | ||
if ( isRetriableError ( error ) ) return attempt.apply ( undefined, arguments ); | ||
cleanup (); | ||
throw error; | ||
return result; | ||
}, error => { | ||
cleanup (); | ||
if ( Date.now () >= timestamp ) throw error; | ||
if ( isRetriableError ( error ) ) { | ||
const delay = Math.round ( 100 + ( 400 * Math.random () ) ), | ||
delayPromise = new Promise ( resolve => setTimeout ( resolve, delay ) ); | ||
return delayPromise.then ( () => attempt.apply ( undefined, arguments ) ); | ||
} | ||
throw error; | ||
}); | ||
}); | ||
@@ -28,0 +45,0 @@ |
@@ -119,3 +119,3 @@ 'use strict' | ||
return function () { | ||
if ( Math.random () <= .9 ) { | ||
if ( Math.random () <= .75 ) { | ||
const code = _.shuffle ([ 'EMFILE', 'ENFILE', 'EAGAIN', 'EBUSY', 'EACCESS', 'EPERM' ])[0]; | ||
@@ -130,3 +130,3 @@ throw createErr ( code ); | ||
return function () { | ||
if ( Math.random () <= .9 ) { | ||
if ( Math.random () <= .75 ) { | ||
const code = _.shuffle ([ 'EMFILE', 'ENFILE', 'EAGAIN', 'EBUSY', 'EACCESS', 'EPERM' ])[0]; | ||
@@ -133,0 +133,0 @@ throw createErr ( code ); |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
90281
43
2000