@spinajs/fs 2.0.481 → 2.0.484
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.
- package/lib/cjs/cli/cat.d.ts +11 -0
- package/lib/cjs/cli/cat.d.ts.map +1 -0
- package/lib/cjs/cli/cat.js +40 -0
- package/lib/cjs/cli/cat.js.map +1 -0
- package/lib/cjs/cli/cp.d.ts +11 -0
- package/lib/cjs/cli/cp.d.ts.map +1 -0
- package/lib/cjs/cli/cp.js +41 -0
- package/lib/cjs/cli/cp.js.map +1 -0
- package/lib/cjs/cli/download.d.ts +7 -0
- package/lib/cjs/cli/download.d.ts.map +1 -0
- package/lib/cjs/cli/download.js +39 -0
- package/lib/cjs/cli/download.js.map +1 -0
- package/lib/cjs/cli/exists.d.ts +7 -0
- package/lib/cjs/cli/exists.d.ts.map +1 -0
- package/lib/cjs/cli/exists.js +39 -0
- package/lib/cjs/cli/exists.js.map +1 -0
- package/lib/cjs/cli/fs.d.ts +11 -0
- package/lib/cjs/cli/fs.d.ts.map +1 -1
- package/lib/cjs/cli/fs.js +47 -21
- package/lib/cjs/cli/fs.js.map +1 -1
- package/lib/cjs/cli/hash.d.ts +11 -0
- package/lib/cjs/cli/hash.d.ts.map +1 -0
- package/lib/cjs/cli/hash.js +40 -0
- package/lib/cjs/cli/hash.js.map +1 -0
- package/lib/cjs/cli/info.d.ts +7 -0
- package/lib/cjs/cli/info.d.ts.map +1 -0
- package/lib/cjs/cli/info.js +45 -0
- package/lib/cjs/cli/info.js.map +1 -0
- package/lib/cjs/cli/ls.d.ts +7 -0
- package/lib/cjs/cli/ls.d.ts.map +1 -0
- package/lib/cjs/cli/ls.js +40 -0
- package/lib/cjs/cli/ls.js.map +1 -0
- package/lib/cjs/cli/mkdir.d.ts +7 -0
- package/lib/cjs/cli/mkdir.d.ts.map +1 -0
- package/lib/cjs/cli/mkdir.js +39 -0
- package/lib/cjs/cli/mkdir.js.map +1 -0
- package/lib/cjs/cli/mv.d.ts +11 -0
- package/lib/cjs/cli/mv.d.ts.map +1 -0
- package/lib/cjs/cli/mv.js +41 -0
- package/lib/cjs/cli/mv.js.map +1 -0
- package/lib/cjs/cli/rm.d.ts +1 -6
- package/lib/cjs/cli/rm.d.ts.map +1 -1
- package/lib/cjs/cli/rm.js +14 -4
- package/lib/cjs/cli/rm.js.map +1 -1
- package/lib/cjs/cli/stat.d.ts +1 -5
- package/lib/cjs/cli/stat.d.ts.map +1 -1
- package/lib/cjs/cli/stat.js +20 -3
- package/lib/cjs/cli/stat.js.map +1 -1
- package/lib/cjs/cli/unzip.d.ts +11 -0
- package/lib/cjs/cli/unzip.d.ts.map +1 -0
- package/lib/cjs/cli/unzip.js +47 -0
- package/lib/cjs/cli/unzip.js.map +1 -0
- package/lib/cjs/cli/upload.d.ts +7 -0
- package/lib/cjs/cli/upload.d.ts.map +1 -0
- package/lib/cjs/cli/upload.js +40 -0
- package/lib/cjs/cli/upload.js.map +1 -0
- package/lib/cjs/cli/write.d.ts +13 -0
- package/lib/cjs/cli/write.d.ts.map +1 -0
- package/lib/cjs/cli/write.js +54 -0
- package/lib/cjs/cli/write.js.map +1 -0
- package/lib/cjs/cli/zip.d.ts +12 -0
- package/lib/cjs/cli/zip.d.ts.map +1 -0
- package/lib/cjs/cli/zip.js +51 -0
- package/lib/cjs/cli/zip.js.map +1 -0
- package/lib/cjs/config/fs.d.ts +9 -0
- package/lib/cjs/config/fs.d.ts.map +1 -0
- package/lib/cjs/config/fs.js +22 -0
- package/lib/cjs/config/fs.js.map +1 -0
- package/lib/cjs/file-hasher.d.ts +85 -5
- package/lib/cjs/file-hasher.d.ts.map +1 -1
- package/lib/cjs/file-hasher.js +106 -14
- package/lib/cjs/file-hasher.js.map +1 -1
- package/lib/cjs/file-info.d.ts +94 -5
- package/lib/cjs/file-info.d.ts.map +1 -1
- package/lib/cjs/file-info.js +267 -73
- package/lib/cjs/file-info.js.map +1 -1
- package/lib/cjs/fp.d.ts +80 -2
- package/lib/cjs/fp.d.ts.map +1 -1
- package/lib/cjs/fp.js +149 -3
- package/lib/cjs/fp.js.map +1 -1
- package/lib/cjs/index.d.ts +2 -1
- package/lib/cjs/index.d.ts.map +1 -1
- package/lib/cjs/index.js +7 -2
- package/lib/cjs/index.js.map +1 -1
- package/lib/cjs/interfaces.d.ts +89 -12
- package/lib/cjs/interfaces.d.ts.map +1 -1
- package/lib/cjs/interfaces.js +13 -13
- package/lib/cjs/interfaces.js.map +1 -1
- package/lib/cjs/local-provider.d.ts +51 -6
- package/lib/cjs/local-provider.d.ts.map +1 -1
- package/lib/cjs/local-provider.js +254 -76
- package/lib/cjs/local-provider.js.map +1 -1
- package/lib/cjs/temp-cleanup-strategy.d.ts +70 -0
- package/lib/cjs/temp-cleanup-strategy.d.ts.map +1 -0
- package/lib/cjs/temp-cleanup-strategy.js +157 -0
- package/lib/cjs/temp-cleanup-strategy.js.map +1 -0
- package/lib/cjs/temp-provider.d.ts +59 -0
- package/lib/cjs/temp-provider.d.ts.map +1 -0
- package/lib/cjs/temp-provider.js +150 -0
- package/lib/cjs/temp-provider.js.map +1 -0
- package/lib/mjs/cli/cat.d.ts +11 -0
- package/lib/mjs/cli/cat.d.ts.map +1 -0
- package/lib/mjs/cli/cat.js +37 -0
- package/lib/mjs/cli/cat.js.map +1 -0
- package/lib/mjs/cli/cp.d.ts +11 -0
- package/lib/mjs/cli/cp.d.ts.map +1 -0
- package/lib/mjs/cli/cp.js +38 -0
- package/lib/mjs/cli/cp.js.map +1 -0
- package/lib/mjs/cli/download.d.ts +7 -0
- package/lib/mjs/cli/download.d.ts.map +1 -0
- package/lib/mjs/cli/download.js +36 -0
- package/lib/mjs/cli/download.js.map +1 -0
- package/lib/mjs/cli/exists.d.ts +7 -0
- package/lib/mjs/cli/exists.d.ts.map +1 -0
- package/lib/mjs/cli/exists.js +36 -0
- package/lib/mjs/cli/exists.js.map +1 -0
- package/lib/mjs/cli/fs.d.ts +11 -1
- package/lib/mjs/cli/fs.d.ts.map +1 -1
- package/lib/mjs/cli/fs.js +43 -22
- package/lib/mjs/cli/fs.js.map +1 -1
- package/lib/mjs/cli/hash.d.ts +11 -0
- package/lib/mjs/cli/hash.d.ts.map +1 -0
- package/lib/mjs/cli/hash.js +37 -0
- package/lib/mjs/cli/hash.js.map +1 -0
- package/lib/mjs/cli/info.d.ts +7 -0
- package/lib/mjs/cli/info.d.ts.map +1 -0
- package/lib/mjs/cli/info.js +42 -0
- package/lib/mjs/cli/info.js.map +1 -0
- package/lib/mjs/cli/ls.d.ts +7 -0
- package/lib/mjs/cli/ls.d.ts.map +1 -0
- package/lib/mjs/cli/ls.js +37 -0
- package/lib/mjs/cli/ls.js.map +1 -0
- package/lib/mjs/cli/mkdir.d.ts +7 -0
- package/lib/mjs/cli/mkdir.d.ts.map +1 -0
- package/lib/mjs/cli/mkdir.js +36 -0
- package/lib/mjs/cli/mkdir.js.map +1 -0
- package/lib/mjs/cli/mv.d.ts +11 -0
- package/lib/mjs/cli/mv.d.ts.map +1 -0
- package/lib/mjs/cli/mv.js +38 -0
- package/lib/mjs/cli/mv.js.map +1 -0
- package/lib/mjs/cli/rm.d.ts +1 -6
- package/lib/mjs/cli/rm.d.ts.map +1 -1
- package/lib/mjs/cli/rm.js +15 -5
- package/lib/mjs/cli/rm.js.map +1 -1
- package/lib/mjs/cli/stat.d.ts +1 -5
- package/lib/mjs/cli/stat.d.ts.map +1 -1
- package/lib/mjs/cli/stat.js +21 -4
- package/lib/mjs/cli/stat.js.map +1 -1
- package/lib/mjs/cli/unzip.d.ts +11 -0
- package/lib/mjs/cli/unzip.d.ts.map +1 -0
- package/lib/mjs/cli/unzip.js +44 -0
- package/lib/mjs/cli/unzip.js.map +1 -0
- package/lib/mjs/cli/upload.d.ts +7 -0
- package/lib/mjs/cli/upload.d.ts.map +1 -0
- package/lib/mjs/cli/upload.js +37 -0
- package/lib/mjs/cli/upload.js.map +1 -0
- package/lib/mjs/cli/write.d.ts +13 -0
- package/lib/mjs/cli/write.d.ts.map +1 -0
- package/lib/mjs/cli/write.js +51 -0
- package/lib/mjs/cli/write.js.map +1 -0
- package/lib/mjs/cli/zip.d.ts +12 -0
- package/lib/mjs/cli/zip.d.ts.map +1 -0
- package/lib/mjs/cli/zip.js +48 -0
- package/lib/mjs/cli/zip.js.map +1 -0
- package/lib/mjs/config/fs.d.ts +9 -0
- package/lib/mjs/config/fs.d.ts.map +1 -0
- package/lib/mjs/config/fs.js +20 -0
- package/lib/mjs/config/fs.js.map +1 -0
- package/lib/mjs/file-hasher.d.ts +85 -5
- package/lib/mjs/file-hasher.d.ts.map +1 -1
- package/lib/mjs/file-hasher.js +106 -14
- package/lib/mjs/file-hasher.js.map +1 -1
- package/lib/mjs/file-info.d.ts +94 -5
- package/lib/mjs/file-info.d.ts.map +1 -1
- package/lib/mjs/file-info.js +233 -73
- package/lib/mjs/file-info.js.map +1 -1
- package/lib/mjs/fp.d.ts +80 -2
- package/lib/mjs/fp.d.ts.map +1 -1
- package/lib/mjs/fp.js +135 -4
- package/lib/mjs/fp.js.map +1 -1
- package/lib/mjs/index.d.ts +2 -1
- package/lib/mjs/index.d.ts.map +1 -1
- package/lib/mjs/index.js +8 -3
- package/lib/mjs/index.js.map +1 -1
- package/lib/mjs/interfaces.d.ts +89 -12
- package/lib/mjs/interfaces.d.ts.map +1 -1
- package/lib/mjs/interfaces.js +13 -13
- package/lib/mjs/interfaces.js.map +1 -1
- package/lib/mjs/local-provider.d.ts +51 -6
- package/lib/mjs/local-provider.d.ts.map +1 -1
- package/lib/mjs/local-provider.js +257 -79
- package/lib/mjs/local-provider.js.map +1 -1
- package/lib/mjs/temp-cleanup-strategy.d.ts +70 -0
- package/lib/mjs/temp-cleanup-strategy.d.ts.map +1 -0
- package/lib/mjs/temp-cleanup-strategy.js +153 -0
- package/lib/mjs/temp-cleanup-strategy.js.map +1 -0
- package/lib/mjs/temp-provider.d.ts +59 -0
- package/lib/mjs/temp-provider.d.ts.map +1 -0
- package/lib/mjs/temp-provider.js +147 -0
- package/lib/mjs/temp-provider.js.map +1 -0
- package/lib/tsconfig.cjs.tsbuildinfo +1 -1
- package/lib/tsconfig.mjs.tsbuildinfo +1 -1
- package/package.json +12 -6
- package/lib/cjs/local-temp-provider.d.ts +0 -18
- package/lib/cjs/local-temp-provider.d.ts.map +0 -1
- package/lib/cjs/local-temp-provider.js +0 -63
- package/lib/cjs/local-temp-provider.js.map +0 -1
- package/lib/mjs/local-temp-provider.d.ts +0 -18
- package/lib/mjs/local-temp-provider.d.ts.map +0 -1
- package/lib/mjs/local-temp-provider.js +0 -60
- package/lib/mjs/local-temp-provider.js.map +0 -1
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { Log } from '@spinajs/log-common';
|
|
2
|
+
import { CronJob } from 'cron';
|
|
3
|
+
import { fs, IFsTempOptions } from './interfaces.js';
|
|
4
|
+
/**
|
|
5
|
+
* Cleanup policy for temporary filesystems. Implement and register
|
|
6
|
+
* to customize which files are considered stale and how they are removed,
|
|
7
|
+
* then select it via `cleanupStrategy` option of fsTemp provider.
|
|
8
|
+
*
|
|
9
|
+
* Strategy also owns its schedule - scheduling mechanism ( interval, cron, ... )
|
|
10
|
+
* is strategy specific and implemented in `start` / `stop`.
|
|
11
|
+
*
|
|
12
|
+
* Strategies hold scheduling state per temp filesystem, so implementations
|
|
13
|
+
* must be registered with `@NewInstance()` - otherwise a single instance
|
|
14
|
+
* would be shared between all temp filesystems.
|
|
15
|
+
*/
|
|
16
|
+
export declare abstract class TempCleanupStrategy {
|
|
17
|
+
protected Logger: Log;
|
|
18
|
+
/**
|
|
19
|
+
* Performs single cleanup sweep on given filesystem.
|
|
20
|
+
*
|
|
21
|
+
* @param fs backend filesystem holding temp files
|
|
22
|
+
* @param options temp fs configuration ( maxFileAge etc. )
|
|
23
|
+
*/
|
|
24
|
+
abstract cleanup(fs: fs, options: IFsTempOptions): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Starts scheduled cleanup - how sweeps are scheduled is up to the strategy.
|
|
27
|
+
*
|
|
28
|
+
* @param fs backend filesystem holding temp files
|
|
29
|
+
* @param options temp fs configuration
|
|
30
|
+
*/
|
|
31
|
+
abstract start(fs: fs, options: IFsTempOptions): void;
|
|
32
|
+
/**
|
|
33
|
+
* Stops scheduled cleanup. Safe to call multiple times.
|
|
34
|
+
*/
|
|
35
|
+
abstract stop(): void;
|
|
36
|
+
/**
|
|
37
|
+
* Single sweep guarded against errors - remote backends can fail
|
|
38
|
+
* ( network etc. ), scheduler tick must never crash.
|
|
39
|
+
*/
|
|
40
|
+
protected safeCleanup(fs: fs, options: IFsTempOptions): Promise<void>;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Default cleanup - deletes first level files older than `maxFileAge` seconds,
|
|
44
|
+
* checked every `cleanupInterval` milliseconds.
|
|
45
|
+
*
|
|
46
|
+
* File age is taken from CreationTime when valid, otherwise from ModifiedTime -
|
|
47
|
+
* remote backends often lack creation time ( s3 reports epoch, ftp reports none ).
|
|
48
|
+
* Files with no usable timestamp are skipped. It does not check files recursively
|
|
49
|
+
* in subdirectories.
|
|
50
|
+
*/
|
|
51
|
+
export declare class MaxAgeTempCleanupStrategy extends TempCleanupStrategy {
|
|
52
|
+
/**
|
|
53
|
+
* timer instance used by interval-based scheduling
|
|
54
|
+
*/
|
|
55
|
+
protected cleanupTimer: NodeJS.Timeout | null;
|
|
56
|
+
start(fs: fs, options: IFsTempOptions): void;
|
|
57
|
+
stop(): void;
|
|
58
|
+
cleanup(fs: fs, options: IFsTempOptions): Promise<void>;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Same sweep as MaxAgeTempCleanupStrategy ( `maxFileAge` still applies ),
|
|
62
|
+
* but scheduled by cron expression from `cleanupCronExpression` option
|
|
63
|
+
* instead of fixed interval. Expression is required - creation fails without it.
|
|
64
|
+
*/
|
|
65
|
+
export declare class CronTempCleanupStrategy extends MaxAgeTempCleanupStrategy {
|
|
66
|
+
protected cronJob: CronJob | null;
|
|
67
|
+
start(fs: fs, options: IFsTempOptions): void;
|
|
68
|
+
stop(): void;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=temp-cleanup-strategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"temp-cleanup-strategy.d.ts","sourceRoot":"","sources":["../../src/temp-cleanup-strategy.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAU,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,OAAO,EAAE,EAAE,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAYrD;;;;;;;;;;;GAWG;AACH,8BAAsB,mBAAmB;IAEvC,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC;IAEtB;;;;;OAKG;aACa,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAEvE;;;;;OAKG;aACa,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAE5D;;OAEG;aACa,IAAI,IAAI,IAAI;IAE5B;;;OAGG;cACa,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAO5E;AAED;;;;;;;;GAQG;AACH,qBAEa,yBAA0B,SAAQ,mBAAmB;IAChE;;OAEG;IACH,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAQ;IAE9C,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAS5C,IAAI,IAAI,IAAI;IAON,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAgCrE;AAED;;;;GAIG;AACH,qBAEa,uBAAwB,SAAQ,yBAAyB;IACpE,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAQ;IAElC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAkC5C,IAAI,IAAI,IAAI;CAMpB"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { Injectable, NewInstance } from '@spinajs/di';
|
|
11
|
+
import { InvalidOption } from '@spinajs/exceptions';
|
|
12
|
+
import { Log, Logger } from '@spinajs/log-common';
|
|
13
|
+
import { CronJob } from 'cron';
|
|
14
|
+
import { DateTime } from 'luxon';
|
|
15
|
+
/**
|
|
16
|
+
* Default file age for temp files in seconds
|
|
17
|
+
*/
|
|
18
|
+
const DEFAULT_FILE_AGE = 60 * 60;
|
|
19
|
+
/**
|
|
20
|
+
* Default cleanup interval in milliseconds
|
|
21
|
+
*/
|
|
22
|
+
const DEFAULT_CLEANUP_INTERVAL = 10 * 60 * 1000;
|
|
23
|
+
/**
|
|
24
|
+
* Cleanup policy for temporary filesystems. Implement and register
|
|
25
|
+
* to customize which files are considered stale and how they are removed,
|
|
26
|
+
* then select it via `cleanupStrategy` option of fsTemp provider.
|
|
27
|
+
*
|
|
28
|
+
* Strategy also owns its schedule - scheduling mechanism ( interval, cron, ... )
|
|
29
|
+
* is strategy specific and implemented in `start` / `stop`.
|
|
30
|
+
*
|
|
31
|
+
* Strategies hold scheduling state per temp filesystem, so implementations
|
|
32
|
+
* must be registered with `@NewInstance()` - otherwise a single instance
|
|
33
|
+
* would be shared between all temp filesystems.
|
|
34
|
+
*/
|
|
35
|
+
export class TempCleanupStrategy {
|
|
36
|
+
/**
|
|
37
|
+
* Single sweep guarded against errors - remote backends can fail
|
|
38
|
+
* ( network etc. ), scheduler tick must never crash.
|
|
39
|
+
*/
|
|
40
|
+
async safeCleanup(fs, options) {
|
|
41
|
+
try {
|
|
42
|
+
await this.cleanup(fs, options);
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
this.Logger.warn(`Cleanup of temporary files system ${options.name} failed: ${err.message}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
__decorate([
|
|
50
|
+
Logger('fs'),
|
|
51
|
+
__metadata("design:type", Log)
|
|
52
|
+
], TempCleanupStrategy.prototype, "Logger", void 0);
|
|
53
|
+
/**
|
|
54
|
+
* Default cleanup - deletes first level files older than `maxFileAge` seconds,
|
|
55
|
+
* checked every `cleanupInterval` milliseconds.
|
|
56
|
+
*
|
|
57
|
+
* File age is taken from CreationTime when valid, otherwise from ModifiedTime -
|
|
58
|
+
* remote backends often lack creation time ( s3 reports epoch, ftp reports none ).
|
|
59
|
+
* Files with no usable timestamp are skipped. It does not check files recursively
|
|
60
|
+
* in subdirectories.
|
|
61
|
+
*/
|
|
62
|
+
let MaxAgeTempCleanupStrategy = class MaxAgeTempCleanupStrategy extends TempCleanupStrategy {
|
|
63
|
+
constructor() {
|
|
64
|
+
super(...arguments);
|
|
65
|
+
/**
|
|
66
|
+
* timer instance used by interval-based scheduling
|
|
67
|
+
*/
|
|
68
|
+
this.cleanupTimer = null;
|
|
69
|
+
}
|
|
70
|
+
start(fs, options) {
|
|
71
|
+
// never leak a previous timer on repeated start
|
|
72
|
+
this.stop();
|
|
73
|
+
this.cleanupTimer = setInterval(() => {
|
|
74
|
+
void this.safeCleanup(fs, options);
|
|
75
|
+
}, options.cleanupInterval ?? DEFAULT_CLEANUP_INTERVAL);
|
|
76
|
+
}
|
|
77
|
+
stop() {
|
|
78
|
+
if (this.cleanupTimer) {
|
|
79
|
+
clearInterval(this.cleanupTimer);
|
|
80
|
+
this.cleanupTimer = null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async cleanup(fs, options) {
|
|
84
|
+
const files = await fs.list('/');
|
|
85
|
+
const now = DateTime.now();
|
|
86
|
+
const maxFileAge = options.maxFileAge ?? DEFAULT_FILE_AGE;
|
|
87
|
+
// s3 fills missing times with DateTime.min() - treat epoch-or-older as "no data"
|
|
88
|
+
const valid = (t) => !!t && t.isValid && t.toMillis() > 0;
|
|
89
|
+
for (const f of files) {
|
|
90
|
+
// per-file guard - one failing stat/rm must not abort whole sweep
|
|
91
|
+
try {
|
|
92
|
+
const stat = await fs.stat(f);
|
|
93
|
+
const ts = valid(stat.CreationTime) ? stat.CreationTime : stat.ModifiedTime;
|
|
94
|
+
if (!valid(ts)) {
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
if (now.diff(ts, 'seconds').seconds > maxFileAge) {
|
|
98
|
+
this.Logger.trace(`Temp file at path ${f} is older than ${maxFileAge} seconds, ( CreatedAt: ${ts.toFormat('dd/MM/yyyy HH:mm:ss')} ), deleting...`);
|
|
99
|
+
await fs.rm(f);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
this.Logger.warn(`Cleanup of temp file ${f} on fs ${fs.Name} failed: ${err.message}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
MaxAgeTempCleanupStrategy = __decorate([
|
|
109
|
+
Injectable(TempCleanupStrategy),
|
|
110
|
+
NewInstance()
|
|
111
|
+
], MaxAgeTempCleanupStrategy);
|
|
112
|
+
export { MaxAgeTempCleanupStrategy };
|
|
113
|
+
/**
|
|
114
|
+
* Same sweep as MaxAgeTempCleanupStrategy ( `maxFileAge` still applies ),
|
|
115
|
+
* but scheduled by cron expression from `cleanupCronExpression` option
|
|
116
|
+
* instead of fixed interval. Expression is required - creation fails without it.
|
|
117
|
+
*/
|
|
118
|
+
let CronTempCleanupStrategy = class CronTempCleanupStrategy extends MaxAgeTempCleanupStrategy {
|
|
119
|
+
constructor() {
|
|
120
|
+
super(...arguments);
|
|
121
|
+
this.cronJob = null;
|
|
122
|
+
}
|
|
123
|
+
start(fs, options) {
|
|
124
|
+
if (!options.cleanupCronExpression) {
|
|
125
|
+
throw new InvalidOption(`Temp filesystem ${options.name} uses CronTempCleanupStrategy but 'cleanupCronExpression' option is not set`);
|
|
126
|
+
}
|
|
127
|
+
if (options.cleanupInterval) {
|
|
128
|
+
this.Logger.warn(`Temp filesystem ${options.name} sets 'cleanupInterval' but CronTempCleanupStrategy ignores it, schedule is driven by 'cleanupCronExpression'`);
|
|
129
|
+
}
|
|
130
|
+
this.stop();
|
|
131
|
+
// CronJob ctor throws on invalid expression - wrap for a clearer error
|
|
132
|
+
try {
|
|
133
|
+
this.cronJob = new CronJob(options.cleanupCronExpression, () => {
|
|
134
|
+
void this.safeCleanup(fs, options);
|
|
135
|
+
}, null, true);
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
throw new InvalidOption(`Temp filesystem ${options.name} has invalid cron expression '${options.cleanupCronExpression}': ${err.message}`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
stop() {
|
|
142
|
+
if (this.cronJob) {
|
|
143
|
+
this.cronJob.stop();
|
|
144
|
+
this.cronJob = null;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
CronTempCleanupStrategy = __decorate([
|
|
149
|
+
Injectable(TempCleanupStrategy),
|
|
150
|
+
NewInstance()
|
|
151
|
+
], CronTempCleanupStrategy);
|
|
152
|
+
export { CronTempCleanupStrategy };
|
|
153
|
+
//# sourceMappingURL=temp-cleanup-strategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"temp-cleanup-strategy.js","sourceRoot":"","sources":["../../src/temp-cleanup-strategy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { Log } from '@spinajs/log-common';
|
|
2
|
+
import { WriteStream } from 'fs';
|
|
3
|
+
import { PassThrough } from 'stream';
|
|
4
|
+
import { fs, IFsTempOptions, IStat, IZipResult } from './interfaces.js';
|
|
5
|
+
import { TempCleanupStrategy } from './temp-cleanup-strategy.js';
|
|
6
|
+
/**
|
|
7
|
+
* Temp filesystem. Use it for creating and storing temporary files and dirs.
|
|
8
|
+
*
|
|
9
|
+
* It is a wrapper over any other registered fs provider - all file operations are
|
|
10
|
+
* delegated to backend fs selected by `provider` option, so temp files can live
|
|
11
|
+
* on local disk, s3, ftp etc. Backend must be a registered fs provider - creation
|
|
12
|
+
* fails otherwise.
|
|
13
|
+
*
|
|
14
|
+
* Old files are automatically deleted by configured TempCleanupStrategy
|
|
15
|
+
* ( default: first level files older than `maxFileAge` seconds ).
|
|
16
|
+
*/
|
|
17
|
+
export declare class fsTemp extends fs {
|
|
18
|
+
Options: IFsTempOptions;
|
|
19
|
+
protected Logger: Log;
|
|
20
|
+
/**
|
|
21
|
+
* Backend filesystem holding temp files. Registered and disposed
|
|
22
|
+
* independently - this wrapper does not own it.
|
|
23
|
+
*/
|
|
24
|
+
protected Provider: fs;
|
|
25
|
+
/**
|
|
26
|
+
* Cleanup policy, selectable via `cleanupStrategy` option.
|
|
27
|
+
* Owns its own schedule ( interval, cron, ... ) via start / stop.
|
|
28
|
+
*/
|
|
29
|
+
protected CleanupStrategy: TempCleanupStrategy;
|
|
30
|
+
get Name(): string;
|
|
31
|
+
constructor(Options: IFsTempOptions);
|
|
32
|
+
resolve(): Promise<void>;
|
|
33
|
+
dispose(): Promise<void>;
|
|
34
|
+
download(path: string): Promise<string>;
|
|
35
|
+
upload(srcPath: string, destPath?: string): Promise<void>;
|
|
36
|
+
hash(path: string, algo?: string): Promise<string>;
|
|
37
|
+
metadata(path: string): Promise<import("./interfaces.js").IFileInfo>;
|
|
38
|
+
resolvePath(path: string): string;
|
|
39
|
+
read(path: string, encoding?: BufferEncoding): Promise<string | Buffer>;
|
|
40
|
+
readStream(path: string, encoding?: BufferEncoding): Promise<NodeJS.ReadableStream>;
|
|
41
|
+
write(path: string, data: string | Uint8Array, encoding?: BufferEncoding): Promise<void>;
|
|
42
|
+
writeStream(path: string, encoding?: BufferEncoding): Promise<WriteStream | PassThrough>;
|
|
43
|
+
writeStream(path: string, readStream: NodeJS.ReadableStream | BufferEncoding, encoding?: BufferEncoding): Promise<WriteStream | PassThrough>;
|
|
44
|
+
exists(path: string): Promise<boolean>;
|
|
45
|
+
dirExists(path: string): Promise<boolean>;
|
|
46
|
+
copy(path: string, dest: string, dstFs?: fs): Promise<void>;
|
|
47
|
+
move(oldPath: string, newPath: string, dstFs?: fs): Promise<void>;
|
|
48
|
+
rename(oldPath: string, newPath: string): Promise<void>;
|
|
49
|
+
rm(path: string): Promise<void>;
|
|
50
|
+
mkdir(path: string): Promise<void>;
|
|
51
|
+
stat(path: string): Promise<IStat>;
|
|
52
|
+
list(path: string): Promise<string[]>;
|
|
53
|
+
tmppath(): string;
|
|
54
|
+
append(path: string, data: string | Uint8Array, encoding?: BufferEncoding): Promise<void>;
|
|
55
|
+
zip(path: string | (string | string[])[], dstFs?: fs, dstFile?: string): Promise<IZipResult>;
|
|
56
|
+
unzip(srcPath: string, destPath?: string, dstFs?: fs): Promise<string>;
|
|
57
|
+
isDir(path: string): Promise<boolean>;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=temp-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"temp-provider.d.ts","sourceRoot":"","sources":["../../src/temp-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { IOFail } from '@spinajs/exceptions';
|
|
11
|
+
import { DI, Injectable, PerInstanceCheck, ResolveException } from '@spinajs/di';
|
|
12
|
+
import { Log, Logger } from '@spinajs/log-common';
|
|
13
|
+
import { fs } from './interfaces.js';
|
|
14
|
+
import { MaxAgeTempCleanupStrategy, TempCleanupStrategy } from './temp-cleanup-strategy.js';
|
|
15
|
+
/**
|
|
16
|
+
* Temp filesystem. Use it for creating and storing temporary files and dirs.
|
|
17
|
+
*
|
|
18
|
+
* It is a wrapper over any other registered fs provider - all file operations are
|
|
19
|
+
* delegated to backend fs selected by `provider` option, so temp files can live
|
|
20
|
+
* on local disk, s3, ftp etc. Backend must be a registered fs provider - creation
|
|
21
|
+
* fails otherwise.
|
|
22
|
+
*
|
|
23
|
+
* Old files are automatically deleted by configured TempCleanupStrategy
|
|
24
|
+
* ( default: first level files older than `maxFileAge` seconds ).
|
|
25
|
+
*/
|
|
26
|
+
let fsTemp = class fsTemp extends fs {
|
|
27
|
+
get Name() {
|
|
28
|
+
return this.Options.name;
|
|
29
|
+
}
|
|
30
|
+
constructor(Options) {
|
|
31
|
+
super();
|
|
32
|
+
this.Options = Options;
|
|
33
|
+
if (!this.Options) {
|
|
34
|
+
throw new IOFail('Options for fs provider not provided, cannot create fs provider instance');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async resolve() {
|
|
38
|
+
await super.resolve();
|
|
39
|
+
if (!this.Options.provider) {
|
|
40
|
+
throw new ResolveException(`Temp filesystem ${this.Options.name} has no backend fs configured, set 'provider' option to name of registered fs provider`);
|
|
41
|
+
}
|
|
42
|
+
if (this.Options.provider === this.Options.name) {
|
|
43
|
+
throw new ResolveException(`Temp filesystem ${this.Options.name} cannot use itself as backend fs`);
|
|
44
|
+
}
|
|
45
|
+
// throws ResolveException when backend fs is not registered
|
|
46
|
+
this.Provider = DI.resolve('__file_provider__', [this.Options.provider]);
|
|
47
|
+
const strategies = DI.RootContainer.Registry.getTypes(TempCleanupStrategy);
|
|
48
|
+
const strategyName = this.Options.cleanupStrategy ?? MaxAgeTempCleanupStrategy.name;
|
|
49
|
+
const strategyType = strategies.find((x) => x.name === strategyName);
|
|
50
|
+
if (!strategyType) {
|
|
51
|
+
throw new ResolveException(`Temp cleanup strategy ${strategyName} not registered, make sure it is imported and registered in DI container`);
|
|
52
|
+
}
|
|
53
|
+
this.CleanupStrategy = await DI.resolve(strategyType);
|
|
54
|
+
if (!this.Options.cleanup) {
|
|
55
|
+
this.Logger.info(`Cleanup for temporary files system ${this.Options.name} set to false. Check configuration file if you want to automatically clenaup temporary files.`);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
this.Logger.info(`Starting cleanup for temporary files system ${this.Options.name}, backend: ${this.Options.provider}, strategy: ${strategyName}, interval: ${this.Options.cleanupInterval}, cron: ${this.Options.cleanupCronExpression}, max file age: ${this.Options.maxFileAge}`);
|
|
59
|
+
this.CleanupStrategy.start(this.Provider, this.Options);
|
|
60
|
+
}
|
|
61
|
+
async dispose() {
|
|
62
|
+
// backend fs is a separately registered provider - do not dispose it here
|
|
63
|
+
this.CleanupStrategy?.stop();
|
|
64
|
+
}
|
|
65
|
+
download(path) {
|
|
66
|
+
return this.Provider.download(path);
|
|
67
|
+
}
|
|
68
|
+
upload(srcPath, destPath) {
|
|
69
|
+
return this.Provider.upload(srcPath, destPath);
|
|
70
|
+
}
|
|
71
|
+
async hash(path, algo) {
|
|
72
|
+
return this.Provider.hash(path, algo);
|
|
73
|
+
}
|
|
74
|
+
async metadata(path) {
|
|
75
|
+
return this.Provider.metadata(path);
|
|
76
|
+
}
|
|
77
|
+
resolvePath(path) {
|
|
78
|
+
return this.Provider.resolvePath(path);
|
|
79
|
+
}
|
|
80
|
+
read(path, encoding) {
|
|
81
|
+
return this.Provider.read(path, encoding);
|
|
82
|
+
}
|
|
83
|
+
readStream(path, encoding) {
|
|
84
|
+
return this.Provider.readStream(path, encoding);
|
|
85
|
+
}
|
|
86
|
+
write(path, data, encoding) {
|
|
87
|
+
return this.Provider.write(path, data, encoding);
|
|
88
|
+
}
|
|
89
|
+
writeStream(path, rStream, encoding) {
|
|
90
|
+
return this.Provider.writeStream(path, rStream, encoding);
|
|
91
|
+
}
|
|
92
|
+
exists(path) {
|
|
93
|
+
return this.Provider.exists(path);
|
|
94
|
+
}
|
|
95
|
+
dirExists(path) {
|
|
96
|
+
return this.Provider.dirExists(path);
|
|
97
|
+
}
|
|
98
|
+
copy(path, dest, dstFs) {
|
|
99
|
+
return this.Provider.copy(path, dest, dstFs);
|
|
100
|
+
}
|
|
101
|
+
move(oldPath, newPath, dstFs) {
|
|
102
|
+
return this.Provider.move(oldPath, newPath, dstFs);
|
|
103
|
+
}
|
|
104
|
+
rename(oldPath, newPath) {
|
|
105
|
+
return this.Provider.rename(oldPath, newPath);
|
|
106
|
+
}
|
|
107
|
+
rm(path) {
|
|
108
|
+
return this.Provider.rm(path);
|
|
109
|
+
}
|
|
110
|
+
mkdir(path) {
|
|
111
|
+
return this.Provider.mkdir(path);
|
|
112
|
+
}
|
|
113
|
+
stat(path) {
|
|
114
|
+
return this.Provider.stat(path);
|
|
115
|
+
}
|
|
116
|
+
list(path) {
|
|
117
|
+
return this.Provider.list(path);
|
|
118
|
+
}
|
|
119
|
+
tmppath() {
|
|
120
|
+
return this.Provider.tmppath();
|
|
121
|
+
}
|
|
122
|
+
append(path, data, encoding) {
|
|
123
|
+
return this.Provider.append(path, data, encoding);
|
|
124
|
+
}
|
|
125
|
+
zip(path, dstFs, dstFile) {
|
|
126
|
+
// default archive destination to this temp fs, not the backend - keeps
|
|
127
|
+
// IZipResult.fs pointing at temp fs name and avoids hardcoded 'fs-temp' fallback
|
|
128
|
+
return this.Provider.zip(path, dstFs ?? this, dstFile);
|
|
129
|
+
}
|
|
130
|
+
unzip(srcPath, destPath, dstFs) {
|
|
131
|
+
return this.Provider.unzip(srcPath, destPath, dstFs ?? this);
|
|
132
|
+
}
|
|
133
|
+
isDir(path) {
|
|
134
|
+
return this.Provider.isDir(path);
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
__decorate([
|
|
138
|
+
Logger('fs'),
|
|
139
|
+
__metadata("design:type", Log)
|
|
140
|
+
], fsTemp.prototype, "Logger", void 0);
|
|
141
|
+
fsTemp = __decorate([
|
|
142
|
+
Injectable('fs'),
|
|
143
|
+
PerInstanceCheck(),
|
|
144
|
+
__metadata("design:paramtypes", [Object])
|
|
145
|
+
], fsTemp);
|
|
146
|
+
export { fsTemp };
|
|
147
|
+
//# sourceMappingURL=temp-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"temp-provider.js","sourceRoot":"","sources":["../../src/temp-provider.ts"],"names":[],"mappings":"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"}
|