@stemy/backend 6.0.3 → 6.0.4
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/common-types.d.ts +4 -1
- package/esm2022/common-types.mjs +3 -1
- package/esm2022/public_api.mjs +15 -4
- package/esm2022/services/drivers/asset-fallback-driver.mjs +35 -0
- package/esm2022/services/drivers/asset-grid.driver.mjs +1 -3
- package/esm2022/services/drivers/asset-local.driver.mjs +1 -3
- package/esm2022/services/drivers/asset-storage-proxy.driver.mjs +43 -0
- package/esm2022/services/drivers/fallback-readable.mjs +34 -0
- package/esm2022/services/drivers/fallback-streams.mjs +72 -0
- package/esm2022/services/entities/asset.mjs +4 -10
- package/fesm2022/stemy-backend.mjs +153 -14
- package/fesm2022/stemy-backend.mjs.map +1 -1
- package/package.json +2 -1
- package/public_api.d.ts +1 -0
- package/services/drivers/asset-fallback-driver.d.ts +11 -0
- package/services/drivers/asset-grid.driver.d.ts +0 -1
- package/services/drivers/asset-local.driver.d.ts +0 -1
- package/services/drivers/asset-storage-proxy.driver.d.ts +14 -0
- package/services/drivers/fallback-readable.d.ts +2 -0
- package/services/drivers/fallback-streams.d.ts +9 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { PassThrough } from 'stream';
|
|
2
|
+
export function createFallbackReadable(primary, fallbackFactory) {
|
|
3
|
+
const proxy = new PassThrough();
|
|
4
|
+
let hasSwitched = false;
|
|
5
|
+
const switchToFallback = () => {
|
|
6
|
+
if (hasSwitched)
|
|
7
|
+
return;
|
|
8
|
+
hasSwitched = true;
|
|
9
|
+
// 1. Cleanup the failing primary
|
|
10
|
+
primary.unpipe(proxy);
|
|
11
|
+
primary.destroy();
|
|
12
|
+
// 2. Initialize and pipe the fallback
|
|
13
|
+
const fallback = fallbackFactory();
|
|
14
|
+
// On the fallback, we allow it to end the proxy naturally
|
|
15
|
+
fallback.pipe(proxy);
|
|
16
|
+
fallback.on('error', (err) => {
|
|
17
|
+
proxy.emit('error', err); // If fallback fails too, it's a hard error
|
|
18
|
+
});
|
|
19
|
+
};
|
|
20
|
+
// Pipe primary but prevent it from closing the proxy automatically
|
|
21
|
+
primary.pipe(proxy, { end: false });
|
|
22
|
+
primary.on('error', () => {
|
|
23
|
+
switchToFallback();
|
|
24
|
+
});
|
|
25
|
+
// Handle the "Early End" case (e.g., stream closed before data finished)
|
|
26
|
+
primary.on('end', () => {
|
|
27
|
+
if (!hasSwitched) {
|
|
28
|
+
// If we finished successfully without erroring, close the proxy
|
|
29
|
+
proxy.end();
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
return proxy;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFsbGJhY2stcmVhZGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvZHJpdmVycy9mYWxsYmFjay1yZWFkYWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVksV0FBVyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRS9DLE1BQU0sVUFBVSxzQkFBc0IsQ0FDbEMsT0FBaUIsRUFDakIsZUFBK0I7SUFFL0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztJQUNoQyxJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFFeEIsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLEVBQUU7UUFDMUIsSUFBSSxXQUFXO1lBQUUsT0FBTztRQUN4QixXQUFXLEdBQUcsSUFBSSxDQUFDO1FBRW5CLGlDQUFpQztRQUNqQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUVsQixzQ0FBc0M7UUFDdEMsTUFBTSxRQUFRLEdBQUcsZUFBZSxFQUFFLENBQUM7UUFFbkMsMERBQTBEO1FBQzFELFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFckIsUUFBUSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUN6QixLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLDJDQUEyQztRQUN6RSxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQztJQUVGLG1FQUFtRTtJQUNuRSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBRXBDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRTtRQUNyQixnQkFBZ0IsRUFBRSxDQUFDO0lBQ3ZCLENBQUMsQ0FBQyxDQUFDO0lBRUgseUVBQXlFO0lBQ3pFLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRTtRQUNuQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDZixnRUFBZ0U7WUFDaEUsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZWFkYWJsZSwgUGFzc1Rocm91Z2ggfSBmcm9tICdzdHJlYW0nO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZhbGxiYWNrUmVhZGFibGUoXHJcbiAgICBwcmltYXJ5OiBSZWFkYWJsZSxcclxuICAgIGZhbGxiYWNrRmFjdG9yeTogKCkgPT4gUmVhZGFibGVcclxuKTogUmVhZGFibGUge1xyXG4gICAgY29uc3QgcHJveHkgPSBuZXcgUGFzc1Rocm91Z2goKTtcclxuICAgIGxldCBoYXNTd2l0Y2hlZCA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0IHN3aXRjaFRvRmFsbGJhY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgaWYgKGhhc1N3aXRjaGVkKSByZXR1cm47XHJcbiAgICAgICAgaGFzU3dpdGNoZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAvLyAxLiBDbGVhbnVwIHRoZSBmYWlsaW5nIHByaW1hcnlcclxuICAgICAgICBwcmltYXJ5LnVucGlwZShwcm94eSk7XHJcbiAgICAgICAgcHJpbWFyeS5kZXN0cm95KCk7XHJcblxyXG4gICAgICAgIC8vIDIuIEluaXRpYWxpemUgYW5kIHBpcGUgdGhlIGZhbGxiYWNrXHJcbiAgICAgICAgY29uc3QgZmFsbGJhY2sgPSBmYWxsYmFja0ZhY3RvcnkoKTtcclxuXHJcbiAgICAgICAgLy8gT24gdGhlIGZhbGxiYWNrLCB3ZSBhbGxvdyBpdCB0byBlbmQgdGhlIHByb3h5IG5hdHVyYWxseVxyXG4gICAgICAgIGZhbGxiYWNrLnBpcGUocHJveHkpO1xyXG5cclxuICAgICAgICBmYWxsYmFjay5vbignZXJyb3InLCAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgIHByb3h5LmVtaXQoJ2Vycm9yJywgZXJyKTsgLy8gSWYgZmFsbGJhY2sgZmFpbHMgdG9vLCBpdCdzIGEgaGFyZCBlcnJvclxyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBQaXBlIHByaW1hcnkgYnV0IHByZXZlbnQgaXQgZnJvbSBjbG9zaW5nIHRoZSBwcm94eSBhdXRvbWF0aWNhbGx5XHJcbiAgICBwcmltYXJ5LnBpcGUocHJveHksIHsgZW5kOiBmYWxzZSB9KTtcclxuXHJcbiAgICBwcmltYXJ5Lm9uKCdlcnJvcicsICgpID0+IHtcclxuICAgICAgICBzd2l0Y2hUb0ZhbGxiYWNrKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBIYW5kbGUgdGhlIFwiRWFybHkgRW5kXCIgY2FzZSAoZS5nLiwgc3RyZWFtIGNsb3NlZCBiZWZvcmUgZGF0YSBmaW5pc2hlZClcclxuICAgIHByaW1hcnkub24oJ2VuZCcsICgpID0+IHtcclxuICAgICAgICBpZiAoIWhhc1N3aXRjaGVkKSB7XHJcbiAgICAgICAgICAgIC8vIElmIHdlIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseSB3aXRob3V0IGVycm9yaW5nLCBjbG9zZSB0aGUgcHJveHlcclxuICAgICAgICAgICAgcHJveHkuZW5kKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHByb3h5O1xyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { PassThrough } from 'stream';
|
|
2
|
+
export function createFallbackReadable(primary, fallbackFactory) {
|
|
3
|
+
const proxy = new PassThrough();
|
|
4
|
+
let hasSwitched = false;
|
|
5
|
+
const switchToFallback = () => {
|
|
6
|
+
if (hasSwitched)
|
|
7
|
+
return;
|
|
8
|
+
hasSwitched = true;
|
|
9
|
+
// 1. Cleanup the failing primary
|
|
10
|
+
primary.unpipe(proxy);
|
|
11
|
+
primary.destroy();
|
|
12
|
+
// 2. Initialize and pipe the fallback
|
|
13
|
+
const fallback = fallbackFactory();
|
|
14
|
+
// On the fallback, we allow it to end the proxy naturally
|
|
15
|
+
fallback.pipe(proxy);
|
|
16
|
+
fallback.on('error', (err) => {
|
|
17
|
+
proxy.emit('error', err); // If fallback fails too, it's a hard error
|
|
18
|
+
});
|
|
19
|
+
};
|
|
20
|
+
// Pipe primary but prevent it from closing the proxy automatically
|
|
21
|
+
primary.pipe(proxy, { end: false });
|
|
22
|
+
primary.on('error', () => {
|
|
23
|
+
switchToFallback();
|
|
24
|
+
});
|
|
25
|
+
// Handle the "Early End" case (e.g., stream closed before data finished)
|
|
26
|
+
primary.on('end', () => {
|
|
27
|
+
if (!hasSwitched) {
|
|
28
|
+
// If we finished successfully without erroring, close the proxy
|
|
29
|
+
proxy.end();
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
return proxy;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Creates a Writable proxy that switches to a fallback destination on error.
|
|
36
|
+
* @param primary The initial Writable destination.
|
|
37
|
+
* @param fallbackFactory A function that returns a new Writable destination.
|
|
38
|
+
*/
|
|
39
|
+
export function createFallbackWritable(primary, fallbackFactory) {
|
|
40
|
+
// 1. The Proxy acts as the stable "entry point" for your data
|
|
41
|
+
const proxy = new PassThrough();
|
|
42
|
+
let currentDestination = primary;
|
|
43
|
+
let hasSwitched = false;
|
|
44
|
+
// Function to handle the swap
|
|
45
|
+
const handleSwitch = (err) => {
|
|
46
|
+
if (hasSwitched)
|
|
47
|
+
return; // Prevent infinite loops if fallback also fails
|
|
48
|
+
hasSwitched = true;
|
|
49
|
+
// 2. Unpipe from the failed stream and destroy it
|
|
50
|
+
proxy.unpipe(currentDestination);
|
|
51
|
+
currentDestination.destroy();
|
|
52
|
+
// 3. Create the new destination and pipe the remaining data to it
|
|
53
|
+
const fallback = fallbackFactory();
|
|
54
|
+
currentDestination = fallback;
|
|
55
|
+
// Pipe the proxy into the fallback
|
|
56
|
+
proxy.pipe(fallback);
|
|
57
|
+
// Ensure errors on the fallback are bubbled up
|
|
58
|
+
fallback.on('error', (fallbackErr) => {
|
|
59
|
+
proxy.emit('error', fallbackErr);
|
|
60
|
+
});
|
|
61
|
+
};
|
|
62
|
+
// Initial setup
|
|
63
|
+
primary.on('error', handleSwitch);
|
|
64
|
+
proxy.on('finish', () => {
|
|
65
|
+
const final = proxy;
|
|
66
|
+
final.id = currentDestination.id;
|
|
67
|
+
final.done = true;
|
|
68
|
+
});
|
|
69
|
+
proxy.pipe(primary);
|
|
70
|
+
return proxy;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFsbGJhY2stc3RyZWFtcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9kcml2ZXJzL2ZhbGxiYWNrLXN0cmVhbXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFZLFdBQVcsRUFBWSxNQUFNLFFBQVEsQ0FBQztBQUd6RCxNQUFNLFVBQVUsc0JBQXNCLENBQ2xDLE9BQWlCLEVBQ2pCLGVBQStCO0lBRS9CLE1BQU0sS0FBSyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7SUFDaEMsSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBRXhCLE1BQU0sZ0JBQWdCLEdBQUcsR0FBRyxFQUFFO1FBQzFCLElBQUksV0FBVztZQUFFLE9BQU87UUFDeEIsV0FBVyxHQUFHLElBQUksQ0FBQztRQUVuQixpQ0FBaUM7UUFDakMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QixPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFbEIsc0NBQXNDO1FBQ3RDLE1BQU0sUUFBUSxHQUFHLGVBQWUsRUFBRSxDQUFDO1FBRW5DLDBEQUEwRDtRQUMxRCxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXJCLFFBQVEsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDekIsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQywyQ0FBMkM7UUFDekUsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUM7SUFFRixtRUFBbUU7SUFDbkUsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUVwQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUU7UUFDckIsZ0JBQWdCLEVBQUUsQ0FBQztJQUN2QixDQUFDLENBQUMsQ0FBQztJQUVILHlFQUF5RTtJQUN6RSxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUU7UUFDbkIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2YsZ0VBQWdFO1lBQ2hFLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNoQixDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLEtBQUssQ0FBQztBQUNqQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FDbEMsT0FBMkIsRUFDM0IsZUFBeUM7SUFFekMsOERBQThEO0lBQzlELE1BQU0sS0FBSyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7SUFFaEMsSUFBSSxrQkFBa0IsR0FBRyxPQUFPLENBQUM7SUFDakMsSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBRXhCLDhCQUE4QjtJQUM5QixNQUFNLFlBQVksR0FBRyxDQUFDLEdBQVUsRUFBRSxFQUFFO1FBQ2hDLElBQUksV0FBVztZQUFFLE9BQU8sQ0FBQyxnREFBZ0Q7UUFDekUsV0FBVyxHQUFHLElBQUksQ0FBQztRQUVuQixrREFBa0Q7UUFDbEQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ2pDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRTdCLGtFQUFrRTtRQUNsRSxNQUFNLFFBQVEsR0FBRyxlQUFlLEVBQUUsQ0FBQztRQUNuQyxrQkFBa0IsR0FBRyxRQUFRLENBQUM7UUFFOUIsbUNBQW1DO1FBQ25DLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFckIsK0NBQStDO1FBQy9DLFFBQVEsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsV0FBVyxFQUFFLEVBQUU7WUFDakMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUM7SUFFRixnQkFBZ0I7SUFDaEIsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDbEMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFO1FBQ3BCLE1BQU0sS0FBSyxHQUFHLEtBQTJCLENBQUM7UUFDMUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7UUFDakMsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDdEIsQ0FBQyxDQUFDLENBQUM7SUFDSCxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRXBCLE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZWFkYWJsZSwgUGFzc1Rocm91Z2gsIFdyaXRhYmxlIH0gZnJvbSAnc3RyZWFtJztcclxuaW1wb3J0IHtJQXNzZXRVcGxvYWRTdHJlYW19IGZyb20gXCIuLi8uLi9jb21tb24tdHlwZXNcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGYWxsYmFja1JlYWRhYmxlKFxyXG4gICAgcHJpbWFyeTogUmVhZGFibGUsXHJcbiAgICBmYWxsYmFja0ZhY3Rvcnk6ICgpID0+IFJlYWRhYmxlXHJcbik6IFJlYWRhYmxlIHtcclxuICAgIGNvbnN0IHByb3h5ID0gbmV3IFBhc3NUaHJvdWdoKCk7XHJcbiAgICBsZXQgaGFzU3dpdGNoZWQgPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdCBzd2l0Y2hUb0ZhbGxiYWNrID0gKCkgPT4ge1xyXG4gICAgICAgIGlmIChoYXNTd2l0Y2hlZCkgcmV0dXJuO1xyXG4gICAgICAgIGhhc1N3aXRjaGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLy8gMS4gQ2xlYW51cCB0aGUgZmFpbGluZyBwcmltYXJ5XHJcbiAgICAgICAgcHJpbWFyeS51bnBpcGUocHJveHkpO1xyXG4gICAgICAgIHByaW1hcnkuZGVzdHJveSgpO1xyXG5cclxuICAgICAgICAvLyAyLiBJbml0aWFsaXplIGFuZCBwaXBlIHRoZSBmYWxsYmFja1xyXG4gICAgICAgIGNvbnN0IGZhbGxiYWNrID0gZmFsbGJhY2tGYWN0b3J5KCk7XHJcblxyXG4gICAgICAgIC8vIE9uIHRoZSBmYWxsYmFjaywgd2UgYWxsb3cgaXQgdG8gZW5kIHRoZSBwcm94eSBuYXR1cmFsbHlcclxuICAgICAgICBmYWxsYmFjay5waXBlKHByb3h5KTtcclxuXHJcbiAgICAgICAgZmFsbGJhY2sub24oJ2Vycm9yJywgKGVycikgPT4ge1xyXG4gICAgICAgICAgICBwcm94eS5lbWl0KCdlcnJvcicsIGVycik7IC8vIElmIGZhbGxiYWNrIGZhaWxzIHRvbywgaXQncyBhIGhhcmQgZXJyb3JcclxuICAgICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gICAgLy8gUGlwZSBwcmltYXJ5IGJ1dCBwcmV2ZW50IGl0IGZyb20gY2xvc2luZyB0aGUgcHJveHkgYXV0b21hdGljYWxseVxyXG4gICAgcHJpbWFyeS5waXBlKHByb3h5LCB7IGVuZDogZmFsc2UgfSk7XHJcblxyXG4gICAgcHJpbWFyeS5vbignZXJyb3InLCAoKSA9PiB7XHJcbiAgICAgICAgc3dpdGNoVG9GYWxsYmFjaygpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gSGFuZGxlIHRoZSBcIkVhcmx5IEVuZFwiIGNhc2UgKGUuZy4sIHN0cmVhbSBjbG9zZWQgYmVmb3JlIGRhdGEgZmluaXNoZWQpXHJcbiAgICBwcmltYXJ5Lm9uKCdlbmQnLCAoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFoYXNTd2l0Y2hlZCkge1xyXG4gICAgICAgICAgICAvLyBJZiB3ZSBmaW5pc2hlZCBzdWNjZXNzZnVsbHkgd2l0aG91dCBlcnJvcmluZywgY2xvc2UgdGhlIHByb3h5XHJcbiAgICAgICAgICAgIHByb3h5LmVuZCgpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBwcm94eTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBXcml0YWJsZSBwcm94eSB0aGF0IHN3aXRjaGVzIHRvIGEgZmFsbGJhY2sgZGVzdGluYXRpb24gb24gZXJyb3IuXHJcbiAqIEBwYXJhbSBwcmltYXJ5IFRoZSBpbml0aWFsIFdyaXRhYmxlIGRlc3RpbmF0aW9uLlxyXG4gKiBAcGFyYW0gZmFsbGJhY2tGYWN0b3J5IEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgbmV3IFdyaXRhYmxlIGRlc3RpbmF0aW9uLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZhbGxiYWNrV3JpdGFibGUoXHJcbiAgICBwcmltYXJ5OiBJQXNzZXRVcGxvYWRTdHJlYW0sXHJcbiAgICBmYWxsYmFja0ZhY3Rvcnk6ICgpID0+IElBc3NldFVwbG9hZFN0cmVhbVxyXG4pOiBXcml0YWJsZSB7XHJcbiAgICAvLyAxLiBUaGUgUHJveHkgYWN0cyBhcyB0aGUgc3RhYmxlIFwiZW50cnkgcG9pbnRcIiBmb3IgeW91ciBkYXRhXHJcbiAgICBjb25zdCBwcm94eSA9IG5ldyBQYXNzVGhyb3VnaCgpO1xyXG5cclxuICAgIGxldCBjdXJyZW50RGVzdGluYXRpb24gPSBwcmltYXJ5O1xyXG4gICAgbGV0IGhhc1N3aXRjaGVkID0gZmFsc2U7XHJcblxyXG4gICAgLy8gRnVuY3Rpb24gdG8gaGFuZGxlIHRoZSBzd2FwXHJcbiAgICBjb25zdCBoYW5kbGVTd2l0Y2ggPSAoZXJyOiBFcnJvcikgPT4ge1xyXG4gICAgICAgIGlmIChoYXNTd2l0Y2hlZCkgcmV0dXJuOyAvLyBQcmV2ZW50IGluZmluaXRlIGxvb3BzIGlmIGZhbGxiYWNrIGFsc28gZmFpbHNcclxuICAgICAgICBoYXNTd2l0Y2hlZCA9IHRydWU7XHJcblxyXG4gICAgICAgIC8vIDIuIFVucGlwZSBmcm9tIHRoZSBmYWlsZWQgc3RyZWFtIGFuZCBkZXN0cm95IGl0XHJcbiAgICAgICAgcHJveHkudW5waXBlKGN1cnJlbnREZXN0aW5hdGlvbik7XHJcbiAgICAgICAgY3VycmVudERlc3RpbmF0aW9uLmRlc3Ryb3koKTtcclxuXHJcbiAgICAgICAgLy8gMy4gQ3JlYXRlIHRoZSBuZXcgZGVzdGluYXRpb24gYW5kIHBpcGUgdGhlIHJlbWFpbmluZyBkYXRhIHRvIGl0XHJcbiAgICAgICAgY29uc3QgZmFsbGJhY2sgPSBmYWxsYmFja0ZhY3RvcnkoKTtcclxuICAgICAgICBjdXJyZW50RGVzdGluYXRpb24gPSBmYWxsYmFjaztcclxuXHJcbiAgICAgICAgLy8gUGlwZSB0aGUgcHJveHkgaW50byB0aGUgZmFsbGJhY2tcclxuICAgICAgICBwcm94eS5waXBlKGZhbGxiYWNrKTtcclxuXHJcbiAgICAgICAgLy8gRW5zdXJlIGVycm9ycyBvbiB0aGUgZmFsbGJhY2sgYXJlIGJ1YmJsZWQgdXBcclxuICAgICAgICBmYWxsYmFjay5vbignZXJyb3InLCAoZmFsbGJhY2tFcnIpID0+IHtcclxuICAgICAgICAgICAgcHJveHkuZW1pdCgnZXJyb3InLCBmYWxsYmFja0Vycik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIEluaXRpYWwgc2V0dXBcclxuICAgIHByaW1hcnkub24oJ2Vycm9yJywgaGFuZGxlU3dpdGNoKTtcclxuICAgIHByb3h5Lm9uKCdmaW5pc2gnLCAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZmluYWwgPSBwcm94eSBhcyBJQXNzZXRVcGxvYWRTdHJlYW07XHJcbiAgICAgICAgZmluYWwuaWQgPSBjdXJyZW50RGVzdGluYXRpb24uaWQ7XHJcbiAgICAgICAgZmluYWwuZG9uZSA9IHRydWU7XHJcbiAgICB9KTtcclxuICAgIHByb3h5LnBpcGUocHJpbWFyeSk7XHJcblxyXG4gICAgcmV0dXJuIHByb3h5O1xyXG59XHJcbiJdfQ==
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { streamToBuffer, toImage } from "../../utils";
|
|
2
2
|
import { BaseEntity } from "./base-entity";
|
|
3
3
|
export class Asset extends BaseEntity {
|
|
4
4
|
driver;
|
|
@@ -21,17 +21,11 @@ export class Asset extends BaseEntity {
|
|
|
21
21
|
async unlink() {
|
|
22
22
|
try {
|
|
23
23
|
await this.driver.delete(this.oid);
|
|
24
|
-
await this.collection.deleteOne({ _id: this.oid });
|
|
25
24
|
}
|
|
26
25
|
catch (error) {
|
|
27
|
-
|
|
28
|
-
if (error) {
|
|
29
|
-
err = error.message || error || "";
|
|
30
|
-
if (!isString(err) || !err.startsWith("FileNotFound")) {
|
|
31
|
-
throw err;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
26
|
+
console.log("Failed to unlink", error?.message);
|
|
34
27
|
}
|
|
28
|
+
await this.collection.deleteOne({ _id: this.oid });
|
|
35
29
|
return this.id;
|
|
36
30
|
}
|
|
37
31
|
async setMeta(metadata) {
|
|
@@ -58,4 +52,4 @@ export class Asset extends BaseEntity {
|
|
|
58
52
|
return toImage(await this.download(metadata), params, this.metadata);
|
|
59
53
|
}
|
|
60
54
|
}
|
|
61
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvZW50aXRpZXMvYXNzZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxFQUFXLGNBQWMsRUFBRSxPQUFPLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDOUQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUV6QyxNQUFNLE9BQU8sS0FBTSxTQUFRLFVBQWtCO0lBcUJuQjtJQW5CdEIsSUFBSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBSSxXQUFXO1FBQ1gsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUNqQyxDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ04sT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsWUFBWSxFQUFZLEVBQ1osSUFBcUIsRUFDckIsVUFBc0IsRUFDWixNQUFvQjtRQUN0QyxLQUFLLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztRQURWLFdBQU0sR0FBTixNQUFNLENBQWM7SUFFMUMsQ0FBQztJQUVELEtBQUssQ0FBQyxNQUFNO1FBQ1IsSUFBSSxDQUFDO1lBQ0QsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkMsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYixPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBQ0QsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztRQUNqRCxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBNkI7UUFDdkMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLElBQUksRUFBRSxDQUFDLENBQUM7UUFDeEQsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFDLEVBQUUsRUFBQyxJQUFJLEVBQUUsRUFBQyxRQUFRLEVBQUMsRUFBQyxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVELFNBQVM7UUFDTCxPQUFPLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBcUI7UUFDaEMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLElBQUksRUFBRSxDQUFDLENBQUM7UUFDeEQsUUFBUSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWE7WUFDN0UsQ0FBQyxDQUFDLENBQUM7WUFDSCxDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUM7UUFDakMsUUFBUSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUMsYUFBYSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUM7UUFDOUQsUUFBUSxDQUFDLFlBQVksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBQyxFQUFFLEVBQUMsSUFBSSxFQUFFLEVBQUMsUUFBUSxFQUFDLEVBQUMsQ0FBQyxDQUFDO1FBQ3JFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUE0QixJQUFJO1FBQzNDLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUEwQixFQUFFLFFBQXFCO1FBQ2pFLE9BQU8sT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7UmVhZGFibGV9IGZyb20gXCJzdHJlYW1cIjtcclxuaW1wb3J0IHtDb2xsZWN0aW9ufSBmcm9tIFwibW9uZ29kYlwiO1xyXG5pbXBvcnQge09iamVjdElkfSBmcm9tIFwiYnNvblwiO1xyXG5cclxuaW1wb3J0IHtJQXNzZXQsIElBc3NldERyaXZlciwgSUFzc2V0SW1hZ2VQYXJhbXMsIElBc3NldE1ldGF9IGZyb20gXCIuLi8uLi9jb21tb24tdHlwZXNcIjtcclxuaW1wb3J0IHtpc1N0cmluZywgc3RyZWFtVG9CdWZmZXIsIHRvSW1hZ2V9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xyXG5pbXBvcnQge0Jhc2VFbnRpdHl9IGZyb20gXCIuL2Jhc2UtZW50aXR5XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQXNzZXQgZXh0ZW5kcyBCYXNlRW50aXR5PElBc3NldD4gaW1wbGVtZW50cyBJQXNzZXQge1xyXG5cclxuICAgIGdldCBmaWxlbmFtZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuZmlsZW5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNvbnRlbnRUeXBlKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5jb250ZW50VHlwZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbWV0YWRhdGEoKTogSUFzc2V0TWV0YSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5tZXRhZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc3RyZWFtKCk6IFJlYWRhYmxlIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kcml2ZXIub3BlbkRvd25sb2FkU3RyZWFtKHRoaXMub2lkKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpZDogT2JqZWN0SWQsXHJcbiAgICAgICAgICAgICAgICBkYXRhOiBQYXJ0aWFsPElBc3NldD4sXHJcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uLFxyXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIGRyaXZlcjogSUFzc2V0RHJpdmVyKSB7XHJcbiAgICAgICAgc3VwZXIoaWQsIGRhdGEsIGNvbGxlY3Rpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHVubGluaygpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyLmRlbGV0ZSh0aGlzLm9pZCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJGYWlsZWQgdG8gdW5saW5rXCIsIGVycm9yPy5tZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgdGhpcy5jb2xsZWN0aW9uLmRlbGV0ZU9uZSh7X2lkOiB0aGlzLm9pZH0pO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmlkO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNldE1ldGEobWV0YWRhdGE6IFBhcnRpYWw8SUFzc2V0TWV0YT4pOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIG1ldGFkYXRhID0gT2JqZWN0LmFzc2lnbih0aGlzLm1ldGFkYXRhLCBtZXRhZGF0YSB8fCB7fSk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5jb2xsZWN0aW9uLnVwZGF0ZU9uZSh7X2lkOiB0aGlzLm9pZH0sIHskc2V0OiB7bWV0YWRhdGF9fSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QnVmZmVyKCk6IFByb21pc2U8QnVmZmVyPiB7XHJcbiAgICAgICAgcmV0dXJuIHN0cmVhbVRvQnVmZmVyKHRoaXMuc3RyZWFtKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkb3dubG9hZChtZXRhZGF0YT86IElBc3NldE1ldGEpOiBQcm9taXNlPFJlYWRhYmxlPiB7XHJcbiAgICAgICAgbWV0YWRhdGEgPSBPYmplY3QuYXNzaWduKHRoaXMubWV0YWRhdGEsIG1ldGFkYXRhIHx8IHt9KTtcclxuICAgICAgICBtZXRhZGF0YS5kb3dubG9hZENvdW50ID0gaXNOYU4obWV0YWRhdGEuZG93bmxvYWRDb3VudCkgfHwgIW1ldGFkYXRhLmZpcnN0RG93bmxvYWRcclxuICAgICAgICAgICAgPyAxXHJcbiAgICAgICAgICAgIDogbWV0YWRhdGEuZG93bmxvYWRDb3VudCArIDE7XHJcbiAgICAgICAgbWV0YWRhdGEuZmlyc3REb3dubG9hZCA9IG1ldGFkYXRhLmZpcnN0RG93bmxvYWQgfHwgbmV3IERhdGUoKTtcclxuICAgICAgICBtZXRhZGF0YS5sYXN0RG93bmxvYWQgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuY29sbGVjdGlvbi51cGRhdGVPbmUoe19pZDogdGhpcy5vaWR9LCB7JHNldDoge21ldGFkYXRhfX0pO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN0cmVhbTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRJbWFnZShwYXJhbXM6IElBc3NldEltYWdlUGFyYW1zID0gbnVsbCk6IFByb21pc2U8UmVhZGFibGU+IHtcclxuICAgICAgICByZXR1cm4gdG9JbWFnZSh0aGlzLnN0cmVhbSwgcGFyYW1zLCB0aGlzLm1ldGFkYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkb3dubG9hZEltYWdlKHBhcmFtcz86IElBc3NldEltYWdlUGFyYW1zLCBtZXRhZGF0YT86IElBc3NldE1ldGEpOiBQcm9taXNlPFJlYWRhYmxlPiB7XHJcbiAgICAgICAgcmV0dXJuIHRvSW1hZ2UoYXdhaXQgdGhpcy5kb3dubG9hZChtZXRhZGF0YSksIHBhcmFtcywgdGhpcy5tZXRhZGF0YSk7XHJcbiAgICB9XHJcbn1cclxuIl19
|
|
@@ -39,6 +39,7 @@ import { compare } from 'bcrypt';
|
|
|
39
39
|
import moment from 'moment';
|
|
40
40
|
import { GridFSBucket } from 'mongodb/lib/gridfs';
|
|
41
41
|
import { writeFile as writeFile$2, rm } from 'fs/promises';
|
|
42
|
+
import got from 'got';
|
|
42
43
|
import { getModelForClass } from '@typegoose/typegoose';
|
|
43
44
|
import { getValue as getValue$1, setValue } from 'mongoose/lib/utils';
|
|
44
45
|
|
|
@@ -57,6 +58,8 @@ const DI_CONTAINER = Symbol.for("di-container-token");
|
|
|
57
58
|
const OPENAPI_VALIDATION = Symbol.for("openapi-validation-token");
|
|
58
59
|
const LOCAL_DIR = Symbol.for('asset-local-dir');
|
|
59
60
|
const ASSET_DRIVER = Symbol.for('assets-driver');
|
|
61
|
+
const ASSET_MAIN_DRIVER = Symbol.for('assets-main-driver');
|
|
62
|
+
const ASSET_FALLBACK_DRIVER = Symbol.for('assets-fallback-driver');
|
|
60
63
|
class Parameter {
|
|
61
64
|
name;
|
|
62
65
|
defaultValue;
|
|
@@ -1009,17 +1012,11 @@ class Asset extends BaseEntity {
|
|
|
1009
1012
|
async unlink() {
|
|
1010
1013
|
try {
|
|
1011
1014
|
await this.driver.delete(this.oid);
|
|
1012
|
-
await this.collection.deleteOne({ _id: this.oid });
|
|
1013
1015
|
}
|
|
1014
1016
|
catch (error) {
|
|
1015
|
-
|
|
1016
|
-
if (error) {
|
|
1017
|
-
err = error.message || error || "";
|
|
1018
|
-
if (!isString(err) || !err.startsWith("FileNotFound")) {
|
|
1019
|
-
throw err;
|
|
1020
|
-
}
|
|
1021
|
-
}
|
|
1017
|
+
console.log("Failed to unlink", error?.message);
|
|
1022
1018
|
}
|
|
1019
|
+
await this.collection.deleteOne({ _id: this.oid });
|
|
1023
1020
|
return this.id;
|
|
1024
1021
|
}
|
|
1025
1022
|
async setMeta(metadata) {
|
|
@@ -4018,11 +4015,9 @@ const fixtures = [
|
|
|
4018
4015
|
];
|
|
4019
4016
|
|
|
4020
4017
|
let AssetGridDriver = class AssetGridDriver {
|
|
4021
|
-
metaCollection;
|
|
4022
4018
|
bucket;
|
|
4023
4019
|
constructor(connector) {
|
|
4024
4020
|
this.bucket = new GridFSBucket(connector.database, { bucketName: 'assets' });
|
|
4025
|
-
this.metaCollection = "assets.files";
|
|
4026
4021
|
}
|
|
4027
4022
|
openUploadStream(filename, opts) {
|
|
4028
4023
|
return this.bucket.openUploadStream(filename, opts);
|
|
@@ -4041,10 +4036,8 @@ AssetGridDriver = __decorate([
|
|
|
4041
4036
|
|
|
4042
4037
|
let AssetLocalDriver = class AssetLocalDriver {
|
|
4043
4038
|
dir;
|
|
4044
|
-
metaCollection;
|
|
4045
4039
|
constructor(dir) {
|
|
4046
4040
|
this.dir = dir;
|
|
4047
|
-
this.metaCollection = "assets.local";
|
|
4048
4041
|
}
|
|
4049
4042
|
openUploadStream(filename, opts) {
|
|
4050
4043
|
const id = new Types.ObjectId();
|
|
@@ -4073,6 +4066,144 @@ AssetLocalDriver = __decorate([
|
|
|
4073
4066
|
__metadata("design:paramtypes", [String])
|
|
4074
4067
|
], AssetLocalDriver);
|
|
4075
4068
|
|
|
4069
|
+
function createFallbackReadable(primary, fallbackFactory) {
|
|
4070
|
+
const proxy = new PassThrough();
|
|
4071
|
+
let hasSwitched = false;
|
|
4072
|
+
const switchToFallback = () => {
|
|
4073
|
+
if (hasSwitched)
|
|
4074
|
+
return;
|
|
4075
|
+
hasSwitched = true;
|
|
4076
|
+
// 1. Cleanup the failing primary
|
|
4077
|
+
primary.unpipe(proxy);
|
|
4078
|
+
primary.destroy();
|
|
4079
|
+
// 2. Initialize and pipe the fallback
|
|
4080
|
+
const fallback = fallbackFactory();
|
|
4081
|
+
// On the fallback, we allow it to end the proxy naturally
|
|
4082
|
+
fallback.pipe(proxy);
|
|
4083
|
+
fallback.on('error', (err) => {
|
|
4084
|
+
proxy.emit('error', err); // If fallback fails too, it's a hard error
|
|
4085
|
+
});
|
|
4086
|
+
};
|
|
4087
|
+
// Pipe primary but prevent it from closing the proxy automatically
|
|
4088
|
+
primary.pipe(proxy, { end: false });
|
|
4089
|
+
primary.on('error', () => {
|
|
4090
|
+
switchToFallback();
|
|
4091
|
+
});
|
|
4092
|
+
// Handle the "Early End" case (e.g., stream closed before data finished)
|
|
4093
|
+
primary.on('end', () => {
|
|
4094
|
+
if (!hasSwitched) {
|
|
4095
|
+
// If we finished successfully without erroring, close the proxy
|
|
4096
|
+
proxy.end();
|
|
4097
|
+
}
|
|
4098
|
+
});
|
|
4099
|
+
return proxy;
|
|
4100
|
+
}
|
|
4101
|
+
/**
|
|
4102
|
+
* Creates a Writable proxy that switches to a fallback destination on error.
|
|
4103
|
+
* @param primary The initial Writable destination.
|
|
4104
|
+
* @param fallbackFactory A function that returns a new Writable destination.
|
|
4105
|
+
*/
|
|
4106
|
+
function createFallbackWritable(primary, fallbackFactory) {
|
|
4107
|
+
// 1. The Proxy acts as the stable "entry point" for your data
|
|
4108
|
+
const proxy = new PassThrough();
|
|
4109
|
+
let currentDestination = primary;
|
|
4110
|
+
let hasSwitched = false;
|
|
4111
|
+
// Function to handle the swap
|
|
4112
|
+
const handleSwitch = (err) => {
|
|
4113
|
+
if (hasSwitched)
|
|
4114
|
+
return; // Prevent infinite loops if fallback also fails
|
|
4115
|
+
hasSwitched = true;
|
|
4116
|
+
// 2. Unpipe from the failed stream and destroy it
|
|
4117
|
+
proxy.unpipe(currentDestination);
|
|
4118
|
+
currentDestination.destroy();
|
|
4119
|
+
// 3. Create the new destination and pipe the remaining data to it
|
|
4120
|
+
const fallback = fallbackFactory();
|
|
4121
|
+
currentDestination = fallback;
|
|
4122
|
+
// Pipe the proxy into the fallback
|
|
4123
|
+
proxy.pipe(fallback);
|
|
4124
|
+
// Ensure errors on the fallback are bubbled up
|
|
4125
|
+
fallback.on('error', (fallbackErr) => {
|
|
4126
|
+
proxy.emit('error', fallbackErr);
|
|
4127
|
+
});
|
|
4128
|
+
};
|
|
4129
|
+
// Initial setup
|
|
4130
|
+
primary.on('error', handleSwitch);
|
|
4131
|
+
proxy.on('finish', () => {
|
|
4132
|
+
const final = proxy;
|
|
4133
|
+
final.id = currentDestination.id;
|
|
4134
|
+
final.done = true;
|
|
4135
|
+
});
|
|
4136
|
+
proxy.pipe(primary);
|
|
4137
|
+
return proxy;
|
|
4138
|
+
}
|
|
4139
|
+
|
|
4140
|
+
let AssetFallbackDriver = class AssetFallbackDriver {
|
|
4141
|
+
main;
|
|
4142
|
+
fallback;
|
|
4143
|
+
constructor(main, fallback) {
|
|
4144
|
+
this.main = main;
|
|
4145
|
+
this.fallback = fallback;
|
|
4146
|
+
}
|
|
4147
|
+
openDownloadStream(id) {
|
|
4148
|
+
return createFallbackReadable(this.main.openDownloadStream(id), () => this.fallback.openDownloadStream(id));
|
|
4149
|
+
}
|
|
4150
|
+
openUploadStream(filename, opts) {
|
|
4151
|
+
return createFallbackWritable(this.main.openUploadStream(filename, opts), () => this.fallback.openUploadStream(filename, opts));
|
|
4152
|
+
}
|
|
4153
|
+
async delete(id) {
|
|
4154
|
+
try {
|
|
4155
|
+
await this.main.delete(id);
|
|
4156
|
+
}
|
|
4157
|
+
catch (e) {
|
|
4158
|
+
console.log("Failed to delete from primary: ", e.message);
|
|
4159
|
+
await this.fallback.delete(id);
|
|
4160
|
+
}
|
|
4161
|
+
}
|
|
4162
|
+
};
|
|
4163
|
+
AssetFallbackDriver = __decorate([
|
|
4164
|
+
injectable(),
|
|
4165
|
+
__param(0, inject(ASSET_MAIN_DRIVER)),
|
|
4166
|
+
__param(1, inject(ASSET_FALLBACK_DRIVER)),
|
|
4167
|
+
__metadata("design:paramtypes", [Object, Object])
|
|
4168
|
+
], AssetFallbackDriver);
|
|
4169
|
+
|
|
4170
|
+
let AssetStorageProxyDriver = class AssetStorageProxyDriver {
|
|
4171
|
+
config;
|
|
4172
|
+
baseUrl;
|
|
4173
|
+
url;
|
|
4174
|
+
constructor(config) {
|
|
4175
|
+
this.config = config;
|
|
4176
|
+
this.baseUrl = this.config.resolve("storageProxyUri");
|
|
4177
|
+
this.url = this.baseUrl + this.config.resolve("storageProxyBucket");
|
|
4178
|
+
}
|
|
4179
|
+
openDownloadStream(id) {
|
|
4180
|
+
return got.stream.get(this.getUrl(id));
|
|
4181
|
+
}
|
|
4182
|
+
openUploadStream(_, opts) {
|
|
4183
|
+
const id = new ObjectId$1();
|
|
4184
|
+
const stream = got.stream.put(this.getUrl(id), { headers: {
|
|
4185
|
+
'Content-Type': opts?.contentType || 'application/octet-stream'
|
|
4186
|
+
} });
|
|
4187
|
+
stream.done = false;
|
|
4188
|
+
stream.on('finish', () => {
|
|
4189
|
+
stream.id = id;
|
|
4190
|
+
stream.done = true;
|
|
4191
|
+
});
|
|
4192
|
+
return stream;
|
|
4193
|
+
}
|
|
4194
|
+
async delete(id) {
|
|
4195
|
+
console.log("DELETE", id.toHexString());
|
|
4196
|
+
await got.delete(this.getUrl(id));
|
|
4197
|
+
}
|
|
4198
|
+
getUrl(id) {
|
|
4199
|
+
return `${this.url}/${id.toHexString()}`;
|
|
4200
|
+
}
|
|
4201
|
+
};
|
|
4202
|
+
AssetStorageProxyDriver = __decorate([
|
|
4203
|
+
injectable(),
|
|
4204
|
+
__metadata("design:paramtypes", [Configuration])
|
|
4205
|
+
], AssetStorageProxyDriver);
|
|
4206
|
+
|
|
4076
4207
|
class BaseDoc {
|
|
4077
4208
|
_id;
|
|
4078
4209
|
/**
|
|
@@ -4450,6 +4581,8 @@ function createServices() {
|
|
|
4450
4581
|
new Parameter("mongoDb", "node-backend"),
|
|
4451
4582
|
new Parameter("mongoUser", null),
|
|
4452
4583
|
new Parameter("mongoPassword", null),
|
|
4584
|
+
new Parameter("storageProxyUri", "http://localhost:4500/", prepareUrl),
|
|
4585
|
+
new Parameter("storageProxyBucket", "something"),
|
|
4453
4586
|
new Parameter("nodeEnv", "production"),
|
|
4454
4587
|
new Parameter("appPort", 80),
|
|
4455
4588
|
new Parameter("zmqPort", 3000),
|
|
@@ -4623,7 +4756,13 @@ async function setupBackend(config, providers, parent) {
|
|
|
4623
4756
|
useValue: config.assetLocalDir || "assets_files"
|
|
4624
4757
|
});
|
|
4625
4758
|
diContainer.register(ASSET_DRIVER, {
|
|
4626
|
-
useClass: config.assetDriver ||
|
|
4759
|
+
useClass: config.assetDriver || AssetFallbackDriver
|
|
4760
|
+
});
|
|
4761
|
+
diContainer.register(ASSET_MAIN_DRIVER, {
|
|
4762
|
+
useClass: config.assetMainDriver || AssetGridDriver
|
|
4763
|
+
});
|
|
4764
|
+
diContainer.register(ASSET_FALLBACK_DRIVER, {
|
|
4765
|
+
useClass: config.assetFallbackDriver || AssetLocalDriver
|
|
4627
4766
|
});
|
|
4628
4767
|
diContainers.appContainer = diContainers.appContainer || diContainer;
|
|
4629
4768
|
// Authentication
|
|
@@ -4694,5 +4833,5 @@ async function setupBackend(config, providers, parent) {
|
|
|
4694
4833
|
* Generated bundle index. Do not edit.
|
|
4695
4834
|
*/
|
|
4696
4835
|
|
|
4697
|
-
export { AssetGridDriver, AssetImageParams, AssetLocalDriver, AssetProcessor, AssetResolver, Assets, AuthController, BackendProvider, BaseDoc, Cache, CacheProcessor, Configuration, ConsoleColor, DI_CONTAINER, DocumentArray, EXPRESS, EndpointProvider, ErrorHandlerMiddleware, FIXTURE, Fixtures, Gallery, GalleryCache, GalleryController, HTTP_SERVER, IdGenerator, IsDocumented, IsFile, IsObjectId, JOB, JobManager, JsonResponse, LanguageMiddleware, LazyAssetGenerator, LazyAssets, Logger, MailSender, MemoryCache, MongoConnector, OPENAPI_VALIDATION, OpenApi, PARAMETER, Parameter, PrimitiveArray, Progresses, ResolveEntity, ResponseType, SOCKET_CONTROLLERS, SOCKET_SERVER, TERMINAL_COMMAND, TemplateRenderer, TerminalManager, TokenGenerator, TranslationProvider, Translator, Type, UserManager, assign, broadcast, bufferToStream, camelCaseToDash, colorize, convertValue, copy, copyStream, createIdString, createServices, createTransformer, deleteFile, deleteFromBucket, fileTypeFromBuffer, filter, firstItem, flatten, getConstructorName, getDirName, getExtension, getFileName, getFunctionParams, getType, getValue, groupBy, gunzipPromised, gzipPromised, hydratePopulated, idToString, injectServices, isArray, isBoolean, isBuffer, isConstructor, isDate, isDefined, isFunction, isInterface, isNullOrUndefined, isObject, isObjectId, isPrimitive, isString, isType, jsonHighlight, lastItem, lcFirst, letsLookupStage, lookupStages, matchField, matchFieldStages, matchStage, md5, mkdirRecursive, multiSubscription, observableFromFunction, padLeft, padRight, paginate, paginateAggregations, prepareUrl, prepareUrlEmpty, prepareUrlSlash, projectStage, promiseTimeout, rand, random, readAndDeleteFile, readFile, regexEscape, regroup, replaceSpecialChars, resolveUser, runCommand, service, setupBackend, streamToBuffer, toImage, ucFirst, uniqueItems, unwindStage, valueToPromise, wrapError, writeFile };
|
|
4836
|
+
export { AssetGridDriver, AssetImageParams, AssetLocalDriver, AssetProcessor, AssetResolver, AssetStorageProxyDriver, Assets, AuthController, BackendProvider, BaseDoc, Cache, CacheProcessor, Configuration, ConsoleColor, DI_CONTAINER, DocumentArray, EXPRESS, EndpointProvider, ErrorHandlerMiddleware, FIXTURE, Fixtures, Gallery, GalleryCache, GalleryController, HTTP_SERVER, IdGenerator, IsDocumented, IsFile, IsObjectId, JOB, JobManager, JsonResponse, LanguageMiddleware, LazyAssetGenerator, LazyAssets, Logger, MailSender, MemoryCache, MongoConnector, OPENAPI_VALIDATION, OpenApi, PARAMETER, Parameter, PrimitiveArray, Progresses, ResolveEntity, ResponseType, SOCKET_CONTROLLERS, SOCKET_SERVER, TERMINAL_COMMAND, TemplateRenderer, TerminalManager, TokenGenerator, TranslationProvider, Translator, Type, UserManager, assign, broadcast, bufferToStream, camelCaseToDash, colorize, convertValue, copy, copyStream, createIdString, createServices, createTransformer, deleteFile, deleteFromBucket, fileTypeFromBuffer, filter, firstItem, flatten, getConstructorName, getDirName, getExtension, getFileName, getFunctionParams, getType, getValue, groupBy, gunzipPromised, gzipPromised, hydratePopulated, idToString, injectServices, isArray, isBoolean, isBuffer, isConstructor, isDate, isDefined, isFunction, isInterface, isNullOrUndefined, isObject, isObjectId, isPrimitive, isString, isType, jsonHighlight, lastItem, lcFirst, letsLookupStage, lookupStages, matchField, matchFieldStages, matchStage, md5, mkdirRecursive, multiSubscription, observableFromFunction, padLeft, padRight, paginate, paginateAggregations, prepareUrl, prepareUrlEmpty, prepareUrlSlash, projectStage, promiseTimeout, rand, random, readAndDeleteFile, readFile, regexEscape, regroup, replaceSpecialChars, resolveUser, runCommand, service, setupBackend, streamToBuffer, toImage, ucFirst, uniqueItems, unwindStage, valueToPromise, wrapError, writeFile };
|
|
4698
4837
|
//# sourceMappingURL=stemy-backend.mjs.map
|