express-storage 2.0.3 → 3.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.
- package/README.md +366 -34
- package/dist/cjs/config/index.d.ts +10 -0
- package/dist/cjs/config/index.d.ts.map +1 -0
- package/dist/cjs/config/index.js +19 -0
- package/dist/cjs/config/index.js.map +1 -0
- package/dist/cjs/drivers/azure.driver.d.ts +27 -42
- package/dist/cjs/drivers/azure.driver.d.ts.map +1 -1
- package/dist/cjs/drivers/azure.driver.js +206 -212
- package/dist/cjs/drivers/azure.driver.js.map +1 -1
- package/dist/cjs/drivers/base.driver.d.ts +69 -103
- package/dist/cjs/drivers/base.driver.d.ts.map +1 -1
- package/dist/cjs/drivers/base.driver.js +170 -167
- package/dist/cjs/drivers/base.driver.js.map +1 -1
- package/dist/cjs/drivers/gcs.driver.d.ts +20 -38
- package/dist/cjs/drivers/gcs.driver.d.ts.map +1 -1
- package/dist/cjs/drivers/gcs.driver.js +160 -176
- package/dist/cjs/drivers/gcs.driver.js.map +1 -1
- package/dist/cjs/drivers/index.d.ts +15 -0
- package/dist/cjs/drivers/index.d.ts.map +1 -0
- package/dist/cjs/drivers/index.js +26 -0
- package/dist/cjs/drivers/index.js.map +1 -0
- package/dist/cjs/drivers/local.driver.d.ts +24 -45
- package/dist/cjs/drivers/local.driver.d.ts.map +1 -1
- package/dist/cjs/drivers/local.driver.js +266 -338
- package/dist/cjs/drivers/local.driver.js.map +1 -1
- package/dist/cjs/drivers/s3.driver.d.ts +19 -39
- package/dist/cjs/drivers/s3.driver.d.ts.map +1 -1
- package/dist/cjs/drivers/s3.driver.js +205 -197
- package/dist/cjs/drivers/s3.driver.js.map +1 -1
- package/dist/cjs/factory/driver.factory.d.ts +32 -51
- package/dist/cjs/factory/driver.factory.d.ts.map +1 -1
- package/dist/cjs/factory/driver.factory.js +75 -155
- package/dist/cjs/factory/driver.factory.js.map +1 -1
- package/dist/cjs/index.d.ts +11 -15
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +14 -47
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/storage-manager.d.ts +107 -125
- package/dist/cjs/storage-manager.d.ts.map +1 -1
- package/dist/cjs/storage-manager.js +346 -416
- package/dist/cjs/storage-manager.js.map +1 -1
- package/dist/cjs/types/storage.types.d.ts +250 -107
- package/dist/cjs/types/storage.types.d.ts.map +1 -1
- package/dist/cjs/utils/file.utils.d.ts +62 -8
- package/dist/cjs/utils/file.utils.d.ts.map +1 -1
- package/dist/cjs/utils/file.utils.js +196 -29
- package/dist/cjs/utils/file.utils.js.map +1 -1
- package/dist/cjs/utils/index.d.ts +12 -0
- package/dist/cjs/utils/index.d.ts.map +1 -0
- package/dist/cjs/utils/index.js +36 -0
- package/dist/cjs/utils/index.js.map +1 -0
- package/dist/cjs/utils/rate-limiter.d.ts +40 -0
- package/dist/cjs/utils/rate-limiter.d.ts.map +1 -0
- package/dist/cjs/utils/rate-limiter.js +87 -0
- package/dist/cjs/utils/rate-limiter.js.map +1 -0
- package/dist/esm/config/index.d.ts +10 -0
- package/dist/esm/config/index.d.ts.map +1 -0
- package/dist/esm/config/index.js +10 -0
- package/dist/esm/config/index.js.map +1 -0
- package/dist/esm/drivers/azure.driver.d.ts +27 -42
- package/dist/esm/drivers/azure.driver.d.ts.map +1 -1
- package/dist/esm/drivers/azure.driver.js +172 -210
- package/dist/esm/drivers/azure.driver.js.map +1 -1
- package/dist/esm/drivers/base.driver.d.ts +69 -103
- package/dist/esm/drivers/base.driver.d.ts.map +1 -1
- package/dist/esm/drivers/base.driver.js +171 -168
- package/dist/esm/drivers/base.driver.js.map +1 -1
- package/dist/esm/drivers/gcs.driver.d.ts +20 -38
- package/dist/esm/drivers/gcs.driver.d.ts.map +1 -1
- package/dist/esm/drivers/gcs.driver.js +126 -174
- package/dist/esm/drivers/gcs.driver.js.map +1 -1
- package/dist/esm/drivers/index.d.ts +15 -0
- package/dist/esm/drivers/index.d.ts.map +1 -0
- package/dist/esm/drivers/index.js +15 -0
- package/dist/esm/drivers/index.js.map +1 -0
- package/dist/esm/drivers/local.driver.d.ts +24 -45
- package/dist/esm/drivers/local.driver.d.ts.map +1 -1
- package/dist/esm/drivers/local.driver.js +266 -338
- package/dist/esm/drivers/local.driver.js.map +1 -1
- package/dist/esm/drivers/s3.driver.d.ts +19 -39
- package/dist/esm/drivers/s3.driver.d.ts.map +1 -1
- package/dist/esm/drivers/s3.driver.js +171 -195
- package/dist/esm/drivers/s3.driver.js.map +1 -1
- package/dist/esm/factory/driver.factory.d.ts +32 -51
- package/dist/esm/factory/driver.factory.d.ts.map +1 -1
- package/dist/esm/factory/driver.factory.js +73 -158
- package/dist/esm/factory/driver.factory.js.map +1 -1
- package/dist/esm/index.d.ts +11 -15
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +12 -19
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/storage-manager.d.ts +107 -125
- package/dist/esm/storage-manager.d.ts.map +1 -1
- package/dist/esm/storage-manager.js +348 -418
- package/dist/esm/storage-manager.js.map +1 -1
- package/dist/esm/types/storage.types.d.ts +250 -107
- package/dist/esm/types/storage.types.d.ts.map +1 -1
- package/dist/esm/utils/file.utils.d.ts +62 -8
- package/dist/esm/utils/file.utils.d.ts.map +1 -1
- package/dist/esm/utils/file.utils.js +190 -29
- package/dist/esm/utils/file.utils.js.map +1 -1
- package/dist/esm/utils/index.d.ts +12 -0
- package/dist/esm/utils/index.d.ts.map +1 -0
- package/dist/esm/utils/index.js +11 -0
- package/dist/esm/utils/index.js.map +1 -0
- package/dist/esm/utils/rate-limiter.d.ts +40 -0
- package/dist/esm/utils/rate-limiter.d.ts.map +1 -0
- package/dist/esm/utils/rate-limiter.js +82 -0
- package/dist/esm/utils/rate-limiter.js.map +1 -0
- package/package.json +83 -48
- package/src/config/index.ts +17 -0
- package/src/drivers/azure.driver.ts +434 -0
- package/src/drivers/base.driver.ts +436 -0
- package/src/drivers/gcs.driver.ts +366 -0
- package/src/drivers/index.ts +15 -0
- package/src/drivers/local.driver.ts +626 -0
- package/src/drivers/s3.driver.ts +459 -0
- package/src/factory/driver.factory.ts +101 -0
- package/src/index.ts +72 -0
- package/src/storage-manager.ts +801 -0
- package/src/types/storage.types.ts +561 -0
- package/src/utils/config.utils.ts +229 -0
- package/src/utils/file.utils.ts +536 -0
- package/src/utils/index.ts +35 -0
- package/src/utils/rate-limiter.ts +94 -0
|
@@ -1,62 +1,43 @@
|
|
|
1
1
|
import { StorageConfig, IStorageDriver } from '../types/storage.types.js';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Creates a driver instance for the given configuration (no caching).
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
* Presigned variants (e.g., 's3-presigned') map to the same driver class
|
|
6
|
+
* as their direct counterparts — the base class detects presigned mode
|
|
7
|
+
* from the driver string and adjusts upload() behavior accordingly.
|
|
8
|
+
*/
|
|
9
|
+
export declare function createDriver(config: StorageConfig): IStorageDriver;
|
|
10
|
+
/**
|
|
11
|
+
* Returns a list of all supported driver type strings.
|
|
12
|
+
*/
|
|
13
|
+
export declare function getAvailableDrivers(): string[];
|
|
14
|
+
/**
|
|
15
|
+
* StorageDriverFactory - Simple driver cache for reusing SDK client connections.
|
|
16
|
+
*
|
|
17
|
+
* Each instance maintains its own private Map of driver instances keyed by
|
|
18
|
+
* a SHA-256 hash of the config. Use this when you want multiple components
|
|
19
|
+
* to share the same driver instance for a given configuration.
|
|
20
|
+
*
|
|
21
|
+
* StorageManager does NOT use this — each manager creates its own driver
|
|
22
|
+
* via `createDriver()`, ensuring full isolation. The factory exists for
|
|
23
|
+
* advanced use cases like multi-tenant driver pools.
|
|
7
24
|
*
|
|
8
|
-
*
|
|
25
|
+
* @example
|
|
26
|
+
* const factory = new StorageDriverFactory();
|
|
27
|
+
* const driver1 = factory.getOrCreate(config); // creates new
|
|
28
|
+
* const driver2 = factory.getOrCreate(config); // returns cached
|
|
9
29
|
*/
|
|
10
30
|
export declare class StorageDriverFactory {
|
|
11
|
-
private
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
*
|
|
15
|
-
* If a driver for this exact configuration already exists, it's reused.
|
|
16
|
-
* Otherwise, a new driver is created and cached.
|
|
17
|
-
*/
|
|
18
|
-
static createDriver(config: StorageConfig): IStorageDriver;
|
|
19
|
-
/**
|
|
20
|
-
* Removes the oldest (least recently accessed) driver from the cache.
|
|
21
|
-
*/
|
|
22
|
-
private static evictLRU;
|
|
23
|
-
/**
|
|
24
|
-
* Creates a new driver instance based on the config's driver type.
|
|
25
|
-
*/
|
|
26
|
-
private static createNewDriver;
|
|
27
|
-
/**
|
|
28
|
-
* Creates a fingerprint of a string for cache key comparison.
|
|
29
|
-
* Uses triple hash approach (length + two FNV-1a hashes + checksum) for maximum collision resistance.
|
|
30
|
-
*
|
|
31
|
-
* The triple hash approach with length and checksum significantly reduces collision probability:
|
|
32
|
-
* - Single 32-bit hash: ~77k items for 50% collision probability
|
|
33
|
-
* - This approach: effectively ~128+ bits of entropy, negligible collision probability
|
|
34
|
-
*
|
|
35
|
-
* For credentials, we also include a prefix checksum to detect similar keys early.
|
|
36
|
-
*/
|
|
37
|
-
private static secureHash;
|
|
38
|
-
/**
|
|
39
|
-
* Generates a unique cache key for a configuration.
|
|
40
|
-
* Includes all properties that affect driver behavior.
|
|
41
|
-
*/
|
|
42
|
-
private static getDriverKey;
|
|
43
|
-
/**
|
|
44
|
-
* Clears all cached drivers.
|
|
45
|
-
* Useful in tests or when you've rotated credentials.
|
|
46
|
-
*/
|
|
47
|
-
static clearCache(): void;
|
|
48
|
-
/**
|
|
49
|
-
* Returns the number of cached drivers.
|
|
50
|
-
*/
|
|
51
|
-
static getCacheSize(): number;
|
|
52
|
-
/**
|
|
53
|
-
* Removes a specific driver from the cache.
|
|
54
|
-
* Useful when credentials have changed for a specific configuration.
|
|
55
|
-
*/
|
|
56
|
-
static removeFromCache(config: StorageConfig): boolean;
|
|
31
|
+
private readonly drivers;
|
|
32
|
+
private hashConfig;
|
|
33
|
+
getOrCreate(config: StorageConfig): IStorageDriver;
|
|
57
34
|
/**
|
|
58
|
-
*
|
|
35
|
+
* Destroys all cached drivers and clears the cache.
|
|
36
|
+
* Always call this instead of letting the factory be garbage-collected,
|
|
37
|
+
* otherwise cloud SDK connections may leak.
|
|
59
38
|
*/
|
|
39
|
+
clearCache(): void;
|
|
40
|
+
getCacheSize(): number;
|
|
60
41
|
static getAvailableDrivers(): string[];
|
|
61
42
|
}
|
|
62
43
|
//# sourceMappingURL=driver.factory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driver.factory.d.ts","sourceRoot":"","sources":["../../../src/factory/driver.factory.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"driver.factory.d.ts","sourceRoot":"","sources":["../../../src/factory/driver.factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAM1E;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,cAAc,CAgBlE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,EAAE,CAU9C;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0C;IAElE,OAAO,CAAC,UAAU;IAIlB,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,cAAc;IAWlD;;;;OAIG;IACH,UAAU,IAAI,IAAI;IAOlB,YAAY,IAAI,MAAM;IAItB,MAAM,CAAC,mBAAmB,IAAI,MAAM,EAAE;CAGvC"}
|
|
@@ -1,181 +1,101 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.StorageDriverFactory = void 0;
|
|
7
|
+
exports.createDriver = createDriver;
|
|
8
|
+
exports.getAvailableDrivers = getAvailableDrivers;
|
|
9
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
4
10
|
const local_driver_js_1 = require("../drivers/local.driver.js");
|
|
5
11
|
const s3_driver_js_1 = require("../drivers/s3.driver.js");
|
|
6
12
|
const gcs_driver_js_1 = require("../drivers/gcs.driver.js");
|
|
7
13
|
const azure_driver_js_1 = require("../drivers/azure.driver.js");
|
|
8
|
-
const MAX_CACHED_DRIVERS = 100;
|
|
9
14
|
/**
|
|
10
|
-
*
|
|
15
|
+
* Creates a driver instance for the given configuration (no caching).
|
|
11
16
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
17
|
+
* Presigned variants (e.g., 's3-presigned') map to the same driver class
|
|
18
|
+
* as their direct counterparts — the base class detects presigned mode
|
|
19
|
+
* from the driver string and adjusts upload() behavior accordingly.
|
|
20
|
+
*/
|
|
21
|
+
function createDriver(config) {
|
|
22
|
+
switch (config.driver) {
|
|
23
|
+
case 'local':
|
|
24
|
+
return new local_driver_js_1.LocalStorageDriver(config);
|
|
25
|
+
case 's3':
|
|
26
|
+
case 's3-presigned':
|
|
27
|
+
return new s3_driver_js_1.S3StorageDriver(config);
|
|
28
|
+
case 'gcs':
|
|
29
|
+
case 'gcs-presigned':
|
|
30
|
+
return new gcs_driver_js_1.GCSStorageDriver(config);
|
|
31
|
+
case 'azure':
|
|
32
|
+
case 'azure-presigned':
|
|
33
|
+
return new azure_driver_js_1.AzureStorageDriver(config);
|
|
34
|
+
default:
|
|
35
|
+
throw new Error(`Unsupported storage driver: ${config.driver}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Returns a list of all supported driver type strings.
|
|
40
|
+
*/
|
|
41
|
+
function getAvailableDrivers() {
|
|
42
|
+
return [
|
|
43
|
+
'local',
|
|
44
|
+
's3',
|
|
45
|
+
's3-presigned',
|
|
46
|
+
'gcs',
|
|
47
|
+
'gcs-presigned',
|
|
48
|
+
'azure',
|
|
49
|
+
'azure-presigned'
|
|
50
|
+
];
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* StorageDriverFactory - Simple driver cache for reusing SDK client connections.
|
|
54
|
+
*
|
|
55
|
+
* Each instance maintains its own private Map of driver instances keyed by
|
|
56
|
+
* a SHA-256 hash of the config. Use this when you want multiple components
|
|
57
|
+
* to share the same driver instance for a given configuration.
|
|
14
58
|
*
|
|
15
|
-
*
|
|
59
|
+
* StorageManager does NOT use this — each manager creates its own driver
|
|
60
|
+
* via `createDriver()`, ensuring full isolation. The factory exists for
|
|
61
|
+
* advanced use cases like multi-tenant driver pools.
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* const factory = new StorageDriverFactory();
|
|
65
|
+
* const driver1 = factory.getOrCreate(config); // creates new
|
|
66
|
+
* const driver2 = factory.getOrCreate(config); // returns cached
|
|
16
67
|
*/
|
|
17
68
|
class StorageDriverFactory {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
* If a driver for this exact configuration already exists, it's reused.
|
|
22
|
-
* Otherwise, a new driver is created and cached.
|
|
23
|
-
*/
|
|
24
|
-
static createDriver(config) {
|
|
25
|
-
const driverKey = this.getDriverKey(config);
|
|
26
|
-
const existing = this.drivers.get(driverKey);
|
|
27
|
-
if (existing) {
|
|
28
|
-
existing.lastAccess = Date.now();
|
|
29
|
-
return existing.driver;
|
|
30
|
-
}
|
|
31
|
-
if (this.drivers.size >= MAX_CACHED_DRIVERS) {
|
|
32
|
-
this.evictLRU();
|
|
33
|
-
}
|
|
34
|
-
const driver = this.createNewDriver(config);
|
|
35
|
-
this.drivers.set(driverKey, {
|
|
36
|
-
driver,
|
|
37
|
-
lastAccess: Date.now(),
|
|
38
|
-
});
|
|
39
|
-
return driver;
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Removes the oldest (least recently accessed) driver from the cache.
|
|
43
|
-
*/
|
|
44
|
-
static evictLRU() {
|
|
45
|
-
let oldestKey = null;
|
|
46
|
-
let oldestTime = Infinity;
|
|
47
|
-
for (const [key, entry] of this.drivers.entries()) {
|
|
48
|
-
if (entry.lastAccess < oldestTime) {
|
|
49
|
-
oldestTime = entry.lastAccess;
|
|
50
|
-
oldestKey = key;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
if (oldestKey) {
|
|
54
|
-
this.drivers.delete(oldestKey);
|
|
55
|
-
}
|
|
69
|
+
drivers = new Map();
|
|
70
|
+
hashConfig(config) {
|
|
71
|
+
return crypto_1.default.createHash('sha256').update(JSON.stringify(config)).digest('hex');
|
|
56
72
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
return new s3_driver_js_1.S3StorageDriver(config);
|
|
66
|
-
case 's3-presigned':
|
|
67
|
-
return new s3_driver_js_1.S3PresignedStorageDriver(config);
|
|
68
|
-
case 'gcs':
|
|
69
|
-
return new gcs_driver_js_1.GCSStorageDriver(config);
|
|
70
|
-
case 'gcs-presigned':
|
|
71
|
-
return new gcs_driver_js_1.GCSPresignedStorageDriver(config);
|
|
72
|
-
case 'azure':
|
|
73
|
-
return new azure_driver_js_1.AzureStorageDriver(config);
|
|
74
|
-
case 'azure-presigned':
|
|
75
|
-
return new azure_driver_js_1.AzurePresignedStorageDriver(config);
|
|
76
|
-
default:
|
|
77
|
-
throw new Error(`Unsupported storage driver: ${config.driver}`);
|
|
78
|
-
}
|
|
73
|
+
getOrCreate(config) {
|
|
74
|
+
const key = this.hashConfig(config);
|
|
75
|
+
const existing = this.drivers.get(key);
|
|
76
|
+
if (existing)
|
|
77
|
+
return existing;
|
|
78
|
+
const driver = createDriver(config);
|
|
79
|
+
this.drivers.set(key, driver);
|
|
80
|
+
return driver;
|
|
79
81
|
}
|
|
80
82
|
/**
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
* The triple hash approach with length and checksum significantly reduces collision probability:
|
|
85
|
-
* - Single 32-bit hash: ~77k items for 50% collision probability
|
|
86
|
-
* - This approach: effectively ~128+ bits of entropy, negligible collision probability
|
|
87
|
-
*
|
|
88
|
-
* For credentials, we also include a prefix checksum to detect similar keys early.
|
|
83
|
+
* Destroys all cached drivers and clears the cache.
|
|
84
|
+
* Always call this instead of letting the factory be garbage-collected,
|
|
85
|
+
* otherwise cloud SDK connections may leak.
|
|
89
86
|
*/
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
const length = str.length;
|
|
94
|
-
// First hash with standard FNV-1a offset basis
|
|
95
|
-
const FNV_OFFSET_BASIS_1 = 2166136261;
|
|
96
|
-
const FNV_PRIME = 16777619;
|
|
97
|
-
let hash1 = FNV_OFFSET_BASIS_1;
|
|
98
|
-
for (let i = 0; i < str.length; i++) {
|
|
99
|
-
hash1 ^= str.charCodeAt(i);
|
|
100
|
-
hash1 = Math.imul(hash1, FNV_PRIME);
|
|
101
|
-
}
|
|
102
|
-
// Second hash with different seed (XOR first hash into offset basis)
|
|
103
|
-
// This creates a completely different hash even for similar strings
|
|
104
|
-
const FNV_OFFSET_BASIS_2 = 0x811c9dc5 ^ (hash1 >>> 0);
|
|
105
|
-
let hash2 = FNV_OFFSET_BASIS_2;
|
|
106
|
-
for (let i = str.length - 1; i >= 0; i--) { // Reverse direction for different bit mixing
|
|
107
|
-
hash2 ^= str.charCodeAt(i);
|
|
108
|
-
hash2 = Math.imul(hash2, FNV_PRIME);
|
|
87
|
+
clearCache() {
|
|
88
|
+
for (const driver of this.drivers.values()) {
|
|
89
|
+
driver.destroy();
|
|
109
90
|
}
|
|
110
|
-
// Third component: simple additive checksum of character codes
|
|
111
|
-
// Provides additional collision resistance with minimal computation
|
|
112
|
-
let checksum = 0;
|
|
113
|
-
for (let i = 0; i < str.length; i++) {
|
|
114
|
-
checksum = (checksum + str.charCodeAt(i) * (i + 1)) >>> 0;
|
|
115
|
-
}
|
|
116
|
-
// Return length:hash1:hash2:checksum format - collision requires matching all four
|
|
117
|
-
return `${length}:${(hash1 >>> 0).toString(16)}:${(hash2 >>> 0).toString(16)}:${(checksum >>> 0).toString(16)}`;
|
|
118
|
-
}
|
|
119
|
-
/**
|
|
120
|
-
* Generates a unique cache key for a configuration.
|
|
121
|
-
* Includes all properties that affect driver behavior.
|
|
122
|
-
*/
|
|
123
|
-
static getDriverKey(config) {
|
|
124
|
-
const keyParts = [
|
|
125
|
-
config.driver,
|
|
126
|
-
config.bucketName || 'local',
|
|
127
|
-
config.localPath || 'default',
|
|
128
|
-
config.bucketPath || '',
|
|
129
|
-
(config.presignedUrlExpiry || 600).toString(),
|
|
130
|
-
(config.maxFileSize || 5368709120).toString(),
|
|
131
|
-
config.awsRegion || '',
|
|
132
|
-
this.secureHash(config.awsAccessKey || ''),
|
|
133
|
-
this.secureHash(config.awsSecretKey || ''),
|
|
134
|
-
config.gcsProjectId || '',
|
|
135
|
-
this.secureHash(config.gcsCredentials || ''),
|
|
136
|
-
config.azureAccountName || '',
|
|
137
|
-
config.azureContainerName || '',
|
|
138
|
-
this.secureHash(config.azureConnectionString || ''),
|
|
139
|
-
this.secureHash(config.azureAccountKey || ''),
|
|
140
|
-
];
|
|
141
|
-
return keyParts.join('_');
|
|
142
|
-
}
|
|
143
|
-
/**
|
|
144
|
-
* Clears all cached drivers.
|
|
145
|
-
* Useful in tests or when you've rotated credentials.
|
|
146
|
-
*/
|
|
147
|
-
static clearCache() {
|
|
148
91
|
this.drivers.clear();
|
|
149
92
|
}
|
|
150
|
-
|
|
151
|
-
* Returns the number of cached drivers.
|
|
152
|
-
*/
|
|
153
|
-
static getCacheSize() {
|
|
93
|
+
getCacheSize() {
|
|
154
94
|
return this.drivers.size;
|
|
155
95
|
}
|
|
156
|
-
/**
|
|
157
|
-
* Removes a specific driver from the cache.
|
|
158
|
-
* Useful when credentials have changed for a specific configuration.
|
|
159
|
-
*/
|
|
160
|
-
static removeFromCache(config) {
|
|
161
|
-
const driverKey = this.getDriverKey(config);
|
|
162
|
-
return this.drivers.delete(driverKey);
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* Returns a list of all supported driver types.
|
|
166
|
-
*/
|
|
167
96
|
static getAvailableDrivers() {
|
|
168
|
-
return
|
|
169
|
-
'local',
|
|
170
|
-
's3',
|
|
171
|
-
's3-presigned',
|
|
172
|
-
'gcs',
|
|
173
|
-
'gcs-presigned',
|
|
174
|
-
'azure',
|
|
175
|
-
'azure-presigned'
|
|
176
|
-
];
|
|
97
|
+
return getAvailableDrivers();
|
|
177
98
|
}
|
|
178
99
|
}
|
|
179
100
|
exports.StorageDriverFactory = StorageDriverFactory;
|
|
180
|
-
StorageDriverFactory.drivers = new Map();
|
|
181
101
|
//# sourceMappingURL=driver.factory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driver.factory.js","sourceRoot":"","sources":["../../../src/factory/driver.factory.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"driver.factory.js","sourceRoot":"","sources":["../../../src/factory/driver.factory.ts"],"names":[],"mappings":";;;;;;AAcA,oCAgBC;AAKD,kDAUC;AA7CD,oDAA4B;AAE5B,gEAAgE;AAChE,0DAA0D;AAC1D,4DAA4D;AAC5D,gEAAgE;AAEhE;;;;;;GAMG;AACH,SAAgB,YAAY,CAAC,MAAqB;IAChD,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;QACtB,KAAK,OAAO;YACV,OAAO,IAAI,oCAAkB,CAAC,MAAM,CAAC,CAAC;QACxC,KAAK,IAAI,CAAC;QACV,KAAK,cAAc;YACjB,OAAO,IAAI,8BAAe,CAAC,MAAM,CAAC,CAAC;QACrC,KAAK,KAAK,CAAC;QACX,KAAK,eAAe;YAClB,OAAO,IAAI,gCAAgB,CAAC,MAAM,CAAC,CAAC;QACtC,KAAK,OAAO,CAAC;QACb,KAAK,iBAAiB;YACpB,OAAO,IAAI,oCAAkB,CAAC,MAAM,CAAC,CAAC;QACxC;YACE,MAAM,IAAI,KAAK,CAAC,+BAA+B,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACpE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB;IACjC,OAAO;QACL,OAAO;QACP,IAAI;QACJ,cAAc;QACd,KAAK;QACL,eAAe;QACf,OAAO;QACP,iBAAiB;KAClB,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAa,oBAAoB;IACd,OAAO,GAAgC,IAAI,GAAG,EAAE,CAAC;IAE1D,UAAU,CAAC,MAAqB;QACtC,OAAO,gBAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAClF,CAAC;IAED,WAAW,CAAC,MAAqB;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAEpC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAE9B,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC9B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACH,UAAU;QACR,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3C,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED,MAAM,CAAC,mBAAmB;QACxB,OAAO,mBAAmB,EAAE,CAAC;IAC/B,CAAC;CACF;AArCD,oDAqCC"}
|
package/dist/cjs/index.d.ts
CHANGED
|
@@ -7,24 +7,20 @@
|
|
|
7
7
|
* @example
|
|
8
8
|
* import { StorageManager } from 'express-storage';
|
|
9
9
|
*
|
|
10
|
-
*
|
|
11
|
-
* const storage = new StorageManager();
|
|
12
|
-
*
|
|
13
|
-
* // Upload a file
|
|
10
|
+
* const storage = new StorageManager({ driver: 'local' });
|
|
14
11
|
* const result = await storage.uploadFile(req.file);
|
|
15
12
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
13
|
+
* if (result.success) {
|
|
14
|
+
* console.log(result.reference); // stored file path
|
|
15
|
+
* }
|
|
16
|
+
*
|
|
17
|
+
* // Advanced imports:
|
|
18
|
+
* // import { withRetry, formatFileSize } from 'express-storage/utils';
|
|
19
|
+
* // import { BaseStorageDriver } from 'express-storage/drivers';
|
|
20
|
+
* // import { validateStorageConfig } from 'express-storage/config';
|
|
18
21
|
*/
|
|
19
22
|
export { StorageManager } from './storage-manager.js';
|
|
20
|
-
export {
|
|
21
|
-
export type { StorageDriver, FileUploadResult, DeleteResult, PresignedUrlResult, StorageConfig, StorageOptions, StorageCredentials, FileValidationOptions, UploadOptions, FileMetadata,
|
|
22
|
-
export { loadAndValidateConfig, validateStorageConfig, initializeDotenv, resetDotenvInitialization } from './utils/config.utils.js';
|
|
23
|
-
export { generateUniqueFileName, sanitizeFileName, validateFileName, createMonthBasedPath, ensureDirectoryExists, formatFileSize, validateFileSize, validateFileType, getFileExtension, isImageFile, isDocumentFile, withRetry, sleep, withConcurrencyLimit } from './utils/file.utils.js';
|
|
23
|
+
export { InMemoryRateLimiter } from './utils/rate-limiter.js';
|
|
24
|
+
export type { StorageDriver, StorageErrorCode, FileUploadResult, FileUploadSuccess, FileUploadError, DeleteResult, DeleteSuccess, DeleteError, PresignedUrlResult, PresignedUrlSuccess, PresignedUrlError, PresignedUploadUrlResult, PresignedUploadUrlSuccess, PresignedViewUrlResult, PresignedViewUrlSuccess, BlobValidationResult, BlobValidationSuccess, BlobValidationError, ListFilesResult, ListFilesSuccess, ListFilesError, StorageConfig, PublicStorageConfig, StorageOptions, StorageCredentials, FileValidationOptions, UploadOptions, FileMetadata, IStorageDriver, ValidationResult, EnvironmentConfig, BlobValidationOptions, FileInfo, Logger, RateLimitOptions, RateLimiterAdapter, StorageHooks, HookErrorContext, BatchOptions, } from './types/storage.types.js';
|
|
24
25
|
export type { RetryOptions, ConcurrencyOptions } from './utils/file.utils.js';
|
|
25
|
-
export { BaseStorageDriver } from './drivers/base.driver.js';
|
|
26
|
-
export { LocalStorageDriver } from './drivers/local.driver.js';
|
|
27
|
-
export { S3StorageDriver, S3PresignedStorageDriver } from './drivers/s3.driver.js';
|
|
28
|
-
export { GCSStorageDriver, GCSPresignedStorageDriver } from './drivers/gcs.driver.js';
|
|
29
|
-
export { AzureStorageDriver, AzurePresignedStorageDriver } from './drivers/azure.driver.js';
|
|
30
26
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/cjs/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAG9D,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,aAAa,EACb,WAAW,EACX,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,wBAAwB,EACxB,yBAAyB,EACzB,sBAAsB,EACtB,uBAAuB,EACvB,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,cAAc,EACd,kBAAkB,EAClB,qBAAqB,EACrB,aAAa,EACb,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,QAAQ,EACR,MAAM,EACN,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,EAChB,YAAY,GACb,MAAM,0BAA0B,CAAC;AAElC,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/cjs/index.js
CHANGED
|
@@ -8,57 +8,24 @@
|
|
|
8
8
|
* @example
|
|
9
9
|
* import { StorageManager } from 'express-storage';
|
|
10
10
|
*
|
|
11
|
-
*
|
|
12
|
-
* const storage = new StorageManager();
|
|
13
|
-
*
|
|
14
|
-
* // Upload a file
|
|
11
|
+
* const storage = new StorageManager({ driver: 'local' });
|
|
15
12
|
* const result = await storage.uploadFile(req.file);
|
|
16
13
|
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
14
|
+
* if (result.success) {
|
|
15
|
+
* console.log(result.reference); // stored file path
|
|
16
|
+
* }
|
|
17
|
+
*
|
|
18
|
+
* // Advanced imports:
|
|
19
|
+
* // import { withRetry, formatFileSize } from 'express-storage/utils';
|
|
20
|
+
* // import { BaseStorageDriver } from 'express-storage/drivers';
|
|
21
|
+
* // import { validateStorageConfig } from 'express-storage/config';
|
|
19
22
|
*/
|
|
20
23
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
-
exports.
|
|
22
|
-
//
|
|
24
|
+
exports.InMemoryRateLimiter = exports.StorageManager = void 0;
|
|
25
|
+
// Core class
|
|
23
26
|
var storage_manager_js_1 = require("./storage-manager.js");
|
|
24
27
|
Object.defineProperty(exports, "StorageManager", { enumerable: true, get: function () { return storage_manager_js_1.StorageManager; } });
|
|
25
|
-
//
|
|
26
|
-
var
|
|
27
|
-
Object.defineProperty(exports, "
|
|
28
|
-
// Configuration utilities
|
|
29
|
-
var config_utils_js_1 = require("./utils/config.utils.js");
|
|
30
|
-
Object.defineProperty(exports, "loadAndValidateConfig", { enumerable: true, get: function () { return config_utils_js_1.loadAndValidateConfig; } });
|
|
31
|
-
Object.defineProperty(exports, "validateStorageConfig", { enumerable: true, get: function () { return config_utils_js_1.validateStorageConfig; } });
|
|
32
|
-
Object.defineProperty(exports, "initializeDotenv", { enumerable: true, get: function () { return config_utils_js_1.initializeDotenv; } });
|
|
33
|
-
Object.defineProperty(exports, "resetDotenvInitialization", { enumerable: true, get: function () { return config_utils_js_1.resetDotenvInitialization; } });
|
|
34
|
-
// File utilities
|
|
35
|
-
var file_utils_js_1 = require("./utils/file.utils.js");
|
|
36
|
-
Object.defineProperty(exports, "generateUniqueFileName", { enumerable: true, get: function () { return file_utils_js_1.generateUniqueFileName; } });
|
|
37
|
-
Object.defineProperty(exports, "sanitizeFileName", { enumerable: true, get: function () { return file_utils_js_1.sanitizeFileName; } });
|
|
38
|
-
Object.defineProperty(exports, "validateFileName", { enumerable: true, get: function () { return file_utils_js_1.validateFileName; } });
|
|
39
|
-
Object.defineProperty(exports, "createMonthBasedPath", { enumerable: true, get: function () { return file_utils_js_1.createMonthBasedPath; } });
|
|
40
|
-
Object.defineProperty(exports, "ensureDirectoryExists", { enumerable: true, get: function () { return file_utils_js_1.ensureDirectoryExists; } });
|
|
41
|
-
Object.defineProperty(exports, "formatFileSize", { enumerable: true, get: function () { return file_utils_js_1.formatFileSize; } });
|
|
42
|
-
Object.defineProperty(exports, "validateFileSize", { enumerable: true, get: function () { return file_utils_js_1.validateFileSize; } });
|
|
43
|
-
Object.defineProperty(exports, "validateFileType", { enumerable: true, get: function () { return file_utils_js_1.validateFileType; } });
|
|
44
|
-
Object.defineProperty(exports, "getFileExtension", { enumerable: true, get: function () { return file_utils_js_1.getFileExtension; } });
|
|
45
|
-
Object.defineProperty(exports, "isImageFile", { enumerable: true, get: function () { return file_utils_js_1.isImageFile; } });
|
|
46
|
-
Object.defineProperty(exports, "isDocumentFile", { enumerable: true, get: function () { return file_utils_js_1.isDocumentFile; } });
|
|
47
|
-
Object.defineProperty(exports, "withRetry", { enumerable: true, get: function () { return file_utils_js_1.withRetry; } });
|
|
48
|
-
Object.defineProperty(exports, "sleep", { enumerable: true, get: function () { return file_utils_js_1.sleep; } });
|
|
49
|
-
Object.defineProperty(exports, "withConcurrencyLimit", { enumerable: true, get: function () { return file_utils_js_1.withConcurrencyLimit; } });
|
|
50
|
-
// Driver classes (for custom implementations or direct use)
|
|
51
|
-
var base_driver_js_1 = require("./drivers/base.driver.js");
|
|
52
|
-
Object.defineProperty(exports, "BaseStorageDriver", { enumerable: true, get: function () { return base_driver_js_1.BaseStorageDriver; } });
|
|
53
|
-
var local_driver_js_1 = require("./drivers/local.driver.js");
|
|
54
|
-
Object.defineProperty(exports, "LocalStorageDriver", { enumerable: true, get: function () { return local_driver_js_1.LocalStorageDriver; } });
|
|
55
|
-
var s3_driver_js_1 = require("./drivers/s3.driver.js");
|
|
56
|
-
Object.defineProperty(exports, "S3StorageDriver", { enumerable: true, get: function () { return s3_driver_js_1.S3StorageDriver; } });
|
|
57
|
-
Object.defineProperty(exports, "S3PresignedStorageDriver", { enumerable: true, get: function () { return s3_driver_js_1.S3PresignedStorageDriver; } });
|
|
58
|
-
var gcs_driver_js_1 = require("./drivers/gcs.driver.js");
|
|
59
|
-
Object.defineProperty(exports, "GCSStorageDriver", { enumerable: true, get: function () { return gcs_driver_js_1.GCSStorageDriver; } });
|
|
60
|
-
Object.defineProperty(exports, "GCSPresignedStorageDriver", { enumerable: true, get: function () { return gcs_driver_js_1.GCSPresignedStorageDriver; } });
|
|
61
|
-
var azure_driver_js_1 = require("./drivers/azure.driver.js");
|
|
62
|
-
Object.defineProperty(exports, "AzureStorageDriver", { enumerable: true, get: function () { return azure_driver_js_1.AzureStorageDriver; } });
|
|
63
|
-
Object.defineProperty(exports, "AzurePresignedStorageDriver", { enumerable: true, get: function () { return azure_driver_js_1.AzurePresignedStorageDriver; } });
|
|
28
|
+
// Rate limiter (needed for StorageOptions.rateLimiter)
|
|
29
|
+
var rate_limiter_js_1 = require("./utils/rate-limiter.js");
|
|
30
|
+
Object.defineProperty(exports, "InMemoryRateLimiter", { enumerable: true, get: function () { return rate_limiter_js_1.InMemoryRateLimiter; } });
|
|
64
31
|
//# sourceMappingURL=index.js.map
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;;;AAEH,aAAa;AACb,2DAAsD;AAA7C,oHAAA,cAAc,OAAA;AAEvB,uDAAuD;AACvD,2DAA8D;AAArD,sHAAA,mBAAmB,OAAA"}
|