atomically 1.7.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/.editorconfig +0 -3
  2. package/README.md +3 -3
  3. package/dist/{consts.d.ts → constants.d.ts} +6 -4
  4. package/dist/constants.js +19 -0
  5. package/dist/index.d.ts +6 -5
  6. package/dist/index.js +124 -105
  7. package/dist/types.d.ts +7 -7
  8. package/dist/types.js +2 -3
  9. package/dist/utils/lang.d.ts +6 -6
  10. package/dist/utils/lang.js +14 -14
  11. package/dist/utils/scheduler.d.ts +1 -1
  12. package/dist/utils/scheduler.js +4 -5
  13. package/dist/utils/temp.d.ts +1 -1
  14. package/dist/utils/temp.js +18 -15
  15. package/{LICENSE → license} +0 -0
  16. package/package.json +22 -32
  17. package/src/{consts.ts → constants.ts} +12 -4
  18. package/src/index.ts +153 -93
  19. package/src/types.ts +9 -9
  20. package/src/utils/lang.ts +18 -12
  21. package/src/utils/scheduler.ts +5 -3
  22. package/src/utils/temp.ts +18 -13
  23. package/tasks/benchmark.js +16 -12
  24. package/test/{basic.js → basic.cjs} +47 -49
  25. package/test/{concurrency.js → concurrency.cjs} +6 -8
  26. package/test/{integration.js → integration.cjs} +44 -46
  27. package/tsconfig.json +1 -26
  28. package/.nvmrc +0 -1
  29. package/dist/consts.js +0 -28
  30. package/dist/utils/attemptify.d.ts +0 -4
  31. package/dist/utils/attemptify.js +0 -25
  32. package/dist/utils/fs.d.ts +0 -34
  33. package/dist/utils/fs.js +0 -42
  34. package/dist/utils/fs_handlers.d.ts +0 -7
  35. package/dist/utils/fs_handlers.js +0 -28
  36. package/dist/utils/retryify.d.ts +0 -4
  37. package/dist/utils/retryify.js +0 -45
  38. package/dist/utils/retryify_queue.d.ts +0 -15
  39. package/dist/utils/retryify_queue.js +0 -58
  40. package/src/utils/attemptify.ts +0 -42
  41. package/src/utils/fs.ts +0 -51
  42. package/src/utils/fs_handlers.ts +0 -45
  43. package/src/utils/retryify.ts +0 -78
  44. package/src/utils/retryify_queue.ts +0 -95
package/src/utils/fs.ts DELETED
@@ -1,51 +0,0 @@
1
-
2
- /* IMPORT */
3
-
4
- import * as fs from 'fs';
5
- import {promisify} from 'util';
6
- import {attemptifyAsync, attemptifySync} from './attemptify';
7
- import Handlers from './fs_handlers';
8
- import {retryifyAsync, retryifySync} from './retryify';
9
-
10
- /* FS */
11
-
12
- const FS = {
13
-
14
- chmodAttempt: attemptifyAsync ( promisify ( fs.chmod ), Handlers.onChangeError ),
15
- chownAttempt: attemptifyAsync ( promisify ( fs.chown ), Handlers.onChangeError ),
16
- closeAttempt: attemptifyAsync ( promisify ( fs.close ) ),
17
- fsyncAttempt: attemptifyAsync ( promisify ( fs.fsync ) ),
18
- mkdirAttempt: attemptifyAsync ( promisify ( fs.mkdir ) ),
19
- realpathAttempt: attemptifyAsync ( promisify ( fs.realpath ) ),
20
- statAttempt: attemptifyAsync ( promisify ( fs.stat ) ),
21
- unlinkAttempt: attemptifyAsync ( promisify ( fs.unlink ) ),
22
-
23
- closeRetry: retryifyAsync ( promisify ( fs.close ), Handlers.isRetriableError ),
24
- fsyncRetry: retryifyAsync ( promisify ( fs.fsync ), Handlers.isRetriableError ),
25
- openRetry: retryifyAsync ( promisify ( fs.open ), Handlers.isRetriableError ),
26
- readFileRetry: retryifyAsync ( promisify ( fs.readFile ), Handlers.isRetriableError ),
27
- renameRetry: retryifyAsync ( promisify ( fs.rename ), Handlers.isRetriableError ),
28
- statRetry: retryifyAsync ( promisify ( fs.stat ), Handlers.isRetriableError ),
29
- writeRetry: retryifyAsync ( promisify ( fs.write ), Handlers.isRetriableError ),
30
-
31
- chmodSyncAttempt: attemptifySync ( fs.chmodSync, Handlers.onChangeError ),
32
- chownSyncAttempt: attemptifySync ( fs.chownSync, Handlers.onChangeError ),
33
- closeSyncAttempt: attemptifySync ( fs.closeSync ),
34
- mkdirSyncAttempt: attemptifySync ( fs.mkdirSync ),
35
- realpathSyncAttempt: attemptifySync ( fs.realpathSync ),
36
- statSyncAttempt: attemptifySync ( fs.statSync ),
37
- unlinkSyncAttempt: attemptifySync ( fs.unlinkSync ),
38
-
39
- closeSyncRetry: retryifySync ( fs.closeSync, Handlers.isRetriableError ),
40
- fsyncSyncRetry: retryifySync ( fs.fsyncSync, Handlers.isRetriableError ),
41
- openSyncRetry: retryifySync ( fs.openSync, Handlers.isRetriableError ),
42
- readFileSyncRetry: retryifySync ( fs.readFileSync, Handlers.isRetriableError ),
43
- renameSyncRetry: retryifySync ( fs.renameSync, Handlers.isRetriableError ),
44
- statSyncRetry: retryifySync ( fs.statSync, Handlers.isRetriableError ),
45
- writeSyncRetry: retryifySync ( fs.writeSync, Handlers.isRetriableError )
46
-
47
- };
48
-
49
- /* EXPORT */
50
-
51
- export default FS;
@@ -1,45 +0,0 @@
1
-
2
- /* IMPORT */
3
-
4
- import {IS_USER_ROOT} from '../consts';
5
- import {Exception} from '../types';
6
-
7
- /* FS HANDLERS */
8
-
9
- const Handlers = {
10
-
11
- isChangeErrorOk: ( error: Exception ): boolean => { //URL: https://github.com/isaacs/node-graceful-fs/blob/master/polyfills.js#L315-L342
12
-
13
- const {code} = error;
14
-
15
- if ( code === 'ENOSYS' ) return true;
16
-
17
- if ( !IS_USER_ROOT && ( code === 'EINVAL' || code === 'EPERM' ) ) return true;
18
-
19
- return false;
20
-
21
- },
22
-
23
- isRetriableError: ( error: Exception ): boolean => {
24
-
25
- const {code} = error;
26
-
27
- if ( code === 'EMFILE' || code === 'ENFILE' || code === 'EAGAIN' || code === 'EBUSY' || code === 'EACCESS' || code === 'EACCS' || code === 'EPERM' ) return true;
28
-
29
- return false;
30
-
31
- },
32
-
33
- onChangeError: ( error: Exception ): void => {
34
-
35
- if ( Handlers.isChangeErrorOk ( error ) ) return;
36
-
37
- throw error;
38
-
39
- }
40
-
41
- };
42
-
43
- /* EXPORT */
44
-
45
- export default Handlers;
@@ -1,78 +0,0 @@
1
-
2
- /* IMPORT */
3
-
4
- import {Exception, FN} from '../types';
5
- import RetryfyQueue from './retryify_queue';
6
-
7
- /* RETRYIFY */
8
-
9
- const retryifyAsync = <T extends FN> ( fn: T, isRetriableError: FN<[Exception], boolean | void> ): FN<[number], T> => {
10
-
11
- return function ( timestamp: number ) {
12
-
13
- return function attempt () {
14
-
15
- return RetryfyQueue.schedule ().then ( cleanup => {
16
-
17
- return fn.apply ( undefined, arguments ).then ( result => {
18
-
19
- cleanup ();
20
-
21
- return result;
22
-
23
- }, error => {
24
-
25
- cleanup ();
26
-
27
- if ( Date.now () >= timestamp ) throw error;
28
-
29
- if ( isRetriableError ( error ) ) {
30
-
31
- const delay = Math.round ( 100 + ( 400 * Math.random () ) ),
32
- delayPromise = new Promise ( resolve => setTimeout ( resolve, delay ) );
33
-
34
- return delayPromise.then ( () => attempt.apply ( undefined, arguments ) );
35
-
36
- }
37
-
38
- throw error;
39
-
40
- });
41
-
42
- });
43
-
44
- } as T;
45
-
46
- };
47
-
48
- };
49
-
50
- const retryifySync = <T extends FN> ( fn: T, isRetriableError: FN<[Exception], boolean | void> ): FN<[number], T> => {
51
-
52
- return function ( timestamp: number ) {
53
-
54
- return function attempt () {
55
-
56
- try {
57
-
58
- return fn.apply ( undefined, arguments );
59
-
60
- } catch ( error ) {
61
-
62
- if ( Date.now () > timestamp ) throw error;
63
-
64
- if ( isRetriableError ( error ) ) return attempt.apply ( undefined, arguments );
65
-
66
- throw error;
67
-
68
- }
69
-
70
- } as T;
71
-
72
- };
73
-
74
- };
75
-
76
- /* EXPORT */
77
-
78
- export {retryifyAsync, retryifySync};
@@ -1,95 +0,0 @@
1
-
2
- /* IMPORT */
3
-
4
- import {LIMIT_FILES_DESCRIPTORS} from '../consts';
5
-
6
- /* RETRYIFY QUEUE */
7
-
8
- const RetryfyQueue = {
9
-
10
- interval: 25,
11
- intervalId: <NodeJS.Timeout | undefined> undefined,
12
- limit: LIMIT_FILES_DESCRIPTORS,
13
- queueActive: new Set<Function> (),
14
- queueWaiting: new Set<Function> (),
15
-
16
- init: (): void => {
17
-
18
- if ( RetryfyQueue.intervalId ) return;
19
-
20
- RetryfyQueue.intervalId = setInterval ( RetryfyQueue.tick, RetryfyQueue.interval );
21
-
22
- },
23
-
24
- reset: (): void => {
25
-
26
- if ( !RetryfyQueue.intervalId ) return;
27
-
28
- clearInterval ( RetryfyQueue.intervalId );
29
-
30
- delete RetryfyQueue.intervalId;
31
-
32
- },
33
-
34
- add: ( fn: Function ): void => {
35
-
36
- RetryfyQueue.queueWaiting.add ( fn );
37
-
38
- if ( RetryfyQueue.queueActive.size < ( RetryfyQueue.limit / 2 ) ) { // Active queue not under preassure, executing immediately
39
-
40
- RetryfyQueue.tick ();
41
-
42
- } else {
43
-
44
- RetryfyQueue.init ();
45
-
46
- }
47
-
48
- },
49
-
50
- remove: ( fn: Function ): void => {
51
-
52
- RetryfyQueue.queueWaiting.delete ( fn );
53
-
54
- RetryfyQueue.queueActive.delete ( fn );
55
-
56
- },
57
-
58
- schedule: (): Promise<Function> => {
59
-
60
- return new Promise ( resolve => {
61
-
62
- const cleanup = () => RetryfyQueue.remove ( resolver );
63
-
64
- const resolver = () => resolve ( cleanup );
65
-
66
- RetryfyQueue.add ( resolver );
67
-
68
- });
69
-
70
- },
71
-
72
- tick: (): void => {
73
-
74
- if ( RetryfyQueue.queueActive.size >= RetryfyQueue.limit ) return;
75
-
76
- if ( !RetryfyQueue.queueWaiting.size ) return RetryfyQueue.reset ();
77
-
78
- for ( const fn of RetryfyQueue.queueWaiting ) {
79
-
80
- if ( RetryfyQueue.queueActive.size >= RetryfyQueue.limit ) break;
81
-
82
- RetryfyQueue.queueWaiting.delete ( fn );
83
- RetryfyQueue.queueActive.add ( fn );
84
-
85
- fn ();
86
-
87
- }
88
-
89
- }
90
-
91
- };
92
-
93
- /* EXPORT */
94
-
95
- export default RetryfyQueue;