@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.
@@ -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 { isString, streamToBuffer, toImage } from "../../utils";
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
- let err = error;
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvZW50aXRpZXMvYXNzZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxFQUFDLFFBQVEsRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQzlELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFekMsTUFBTSxPQUFPLEtBQU0sU0FBUSxVQUFrQjtJQXFCbkI7SUFuQnRCLElBQUksUUFBUTtRQUNSLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQUksV0FBVztRQUNYLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDakMsQ0FBQztJQUVELElBQUksUUFBUTtRQUNSLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQUksTUFBTTtRQUNOLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELFlBQVksRUFBWSxFQUNaLElBQXFCLEVBQ3JCLFVBQXNCLEVBQ1osTUFBb0I7UUFDdEMsS0FBSyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFEVixXQUFNLEdBQU4sTUFBTSxDQUFjO0lBRTFDLENBQUM7SUFFRCxLQUFLLENBQUMsTUFBTTtRQUNSLElBQUksQ0FBQztZQUNELE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25DLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7UUFDckQsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYixJQUFJLEdBQUcsR0FBRyxLQUFZLENBQUM7WUFDdkIsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDUixHQUFHLEdBQUcsS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUNuQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO29CQUNwRCxNQUFNLEdBQUcsQ0FBQztnQkFDZCxDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBNkI7UUFDdkMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLElBQUksRUFBRSxDQUFDLENBQUM7UUFDeEQsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFDLEVBQUUsRUFBQyxJQUFJLEVBQUUsRUFBQyxRQUFRLEVBQUMsRUFBQyxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVELFNBQVM7UUFDTCxPQUFPLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBcUI7UUFDaEMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLElBQUksRUFBRSxDQUFDLENBQUM7UUFDeEQsUUFBUSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWE7WUFDN0UsQ0FBQyxDQUFDLENBQUM7WUFDSCxDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUM7UUFDakMsUUFBUSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUMsYUFBYSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUM7UUFDOUQsUUFBUSxDQUFDLFlBQVksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBQyxFQUFFLEVBQUMsSUFBSSxFQUFFLEVBQUMsUUFBUSxFQUFDLEVBQUMsQ0FBQyxDQUFDO1FBQ3JFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUE0QixJQUFJO1FBQzNDLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUEwQixFQUFFLFFBQXFCO1FBQ2pFLE9BQU8sT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7UmVhZGFibGV9IGZyb20gXCJzdHJlYW1cIjtcclxuaW1wb3J0IHtDb2xsZWN0aW9ufSBmcm9tIFwibW9uZ29kYlwiO1xyXG5pbXBvcnQge09iamVjdElkfSBmcm9tIFwiYnNvblwiO1xyXG5cclxuaW1wb3J0IHtJQXNzZXQsIElBc3NldERyaXZlciwgSUFzc2V0SW1hZ2VQYXJhbXMsIElBc3NldE1ldGF9IGZyb20gXCIuLi8uLi9jb21tb24tdHlwZXNcIjtcclxuaW1wb3J0IHtpc1N0cmluZywgc3RyZWFtVG9CdWZmZXIsIHRvSW1hZ2V9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xyXG5pbXBvcnQge0Jhc2VFbnRpdHl9IGZyb20gXCIuL2Jhc2UtZW50aXR5XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQXNzZXQgZXh0ZW5kcyBCYXNlRW50aXR5PElBc3NldD4gaW1wbGVtZW50cyBJQXNzZXQge1xyXG5cclxuICAgIGdldCBmaWxlbmFtZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuZmlsZW5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNvbnRlbnRUeXBlKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5jb250ZW50VHlwZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbWV0YWRhdGEoKTogSUFzc2V0TWV0YSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5tZXRhZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc3RyZWFtKCk6IFJlYWRhYmxlIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kcml2ZXIub3BlbkRvd25sb2FkU3RyZWFtKHRoaXMub2lkKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpZDogT2JqZWN0SWQsXHJcbiAgICAgICAgICAgICAgICBkYXRhOiBQYXJ0aWFsPElBc3NldD4sXHJcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uLFxyXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIGRyaXZlcjogSUFzc2V0RHJpdmVyKSB7XHJcbiAgICAgICAgc3VwZXIoaWQsIGRhdGEsIGNvbGxlY3Rpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHVubGluaygpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyLmRlbGV0ZSh0aGlzLm9pZCk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29sbGVjdGlvbi5kZWxldGVPbmUoe19pZDogdGhpcy5vaWR9KTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBsZXQgZXJyID0gZXJyb3IgYXMgYW55O1xyXG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGVyciA9IGVycm9yLm1lc3NhZ2UgfHwgZXJyb3IgfHwgXCJcIjtcclxuICAgICAgICAgICAgICAgIGlmICghaXNTdHJpbmcoZXJyKSB8fCAhZXJyLnN0YXJ0c1dpdGgoXCJGaWxlTm90Rm91bmRcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaWQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2V0TWV0YShtZXRhZGF0YTogUGFydGlhbDxJQXNzZXRNZXRhPik6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgbWV0YWRhdGEgPSBPYmplY3QuYXNzaWduKHRoaXMubWV0YWRhdGEsIG1ldGFkYXRhIHx8IHt9KTtcclxuICAgICAgICBhd2FpdCB0aGlzLmNvbGxlY3Rpb24udXBkYXRlT25lKHtfaWQ6IHRoaXMub2lkfSwgeyRzZXQ6IHttZXRhZGF0YX19KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRCdWZmZXIoKTogUHJvbWlzZTxCdWZmZXI+IHtcclxuICAgICAgICByZXR1cm4gc3RyZWFtVG9CdWZmZXIodGhpcy5zdHJlYW0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRvd25sb2FkKG1ldGFkYXRhPzogSUFzc2V0TWV0YSk6IFByb21pc2U8UmVhZGFibGU+IHtcclxuICAgICAgICBtZXRhZGF0YSA9IE9iamVjdC5hc3NpZ24odGhpcy5tZXRhZGF0YSwgbWV0YWRhdGEgfHwge30pO1xyXG4gICAgICAgIG1ldGFkYXRhLmRvd25sb2FkQ291bnQgPSBpc05hTihtZXRhZGF0YS5kb3dubG9hZENvdW50KSB8fCAhbWV0YWRhdGEuZmlyc3REb3dubG9hZFxyXG4gICAgICAgICAgICA/IDFcclxuICAgICAgICAgICAgOiBtZXRhZGF0YS5kb3dubG9hZENvdW50ICsgMTtcclxuICAgICAgICBtZXRhZGF0YS5maXJzdERvd25sb2FkID0gbWV0YWRhdGEuZmlyc3REb3dubG9hZCB8fCBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIG1ldGFkYXRhLmxhc3REb3dubG9hZCA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5jb2xsZWN0aW9uLnVwZGF0ZU9uZSh7X2lkOiB0aGlzLm9pZH0sIHskc2V0OiB7bWV0YWRhdGF9fSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldEltYWdlKHBhcmFtczogSUFzc2V0SW1hZ2VQYXJhbXMgPSBudWxsKTogUHJvbWlzZTxSZWFkYWJsZT4ge1xyXG4gICAgICAgIHJldHVybiB0b0ltYWdlKHRoaXMuc3RyZWFtLCBwYXJhbXMsIHRoaXMubWV0YWRhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRvd25sb2FkSW1hZ2UocGFyYW1zPzogSUFzc2V0SW1hZ2VQYXJhbXMsIG1ldGFkYXRhPzogSUFzc2V0TWV0YSk6IFByb21pc2U8UmVhZGFibGU+IHtcclxuICAgICAgICByZXR1cm4gdG9JbWFnZShhd2FpdCB0aGlzLmRvd25sb2FkKG1ldGFkYXRhKSwgcGFyYW1zLCB0aGlzLm1ldGFkYXRhKTtcclxuICAgIH1cclxufVxyXG4iXX0=
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
- let err = error;
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 || AssetGridDriver
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