@stemy/backend 6.0.3 → 6.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/commands/clear.command.d.ts +6 -0
  2. package/commands/fixtures.command.d.ts +9 -0
  3. package/commands/move-assets.command.d.ts +10 -0
  4. package/common-types.d.ts +22 -12
  5. package/esm2022/commands/clear.command.mjs +15 -0
  6. package/esm2022/commands/fixtures.command.mjs +26 -0
  7. package/esm2022/commands/index.mjs +6 -4
  8. package/esm2022/commands/move-assets.command.mjs +45 -0
  9. package/esm2022/common-types.mjs +3 -3
  10. package/esm2022/public_api.mjs +18 -6
  11. package/esm2022/services/assets.mjs +46 -13
  12. package/esm2022/services/backend-provider.mjs +7 -1
  13. package/esm2022/services/cli-terminal.mjs +56 -0
  14. package/esm2022/services/configuration.mjs +11 -4
  15. package/esm2022/services/drivers/asset-fallback-driver.mjs +35 -0
  16. package/esm2022/services/drivers/asset-grid.driver.mjs +5 -7
  17. package/esm2022/services/drivers/asset-local.driver.mjs +19 -18
  18. package/esm2022/services/drivers/asset-storage-proxy.driver.mjs +48 -0
  19. package/esm2022/services/drivers/fallback-readable.mjs +34 -0
  20. package/esm2022/services/drivers/fallback-streams.mjs +34 -0
  21. package/esm2022/services/entities/asset.mjs +50 -15
  22. package/esm2022/services/entities/temp-asset.mjs +15 -3
  23. package/esm2022/services/terminal-manager.mjs +30 -16
  24. package/esm2022/socket-controllers/socket-terminal.mjs +89 -0
  25. package/esm2022/socket-controllers/terminal.controller.mjs +3 -3
  26. package/fesm2022/stemy-backend.mjs +423 -140
  27. package/fesm2022/stemy-backend.mjs.map +1 -1
  28. package/package.json +3 -2
  29. package/public_api.d.ts +2 -1
  30. package/services/assets.d.ts +13 -5
  31. package/services/cli-terminal.d.ts +18 -0
  32. package/services/configuration.d.ts +2 -0
  33. package/services/drivers/asset-fallback-driver.d.ts +11 -0
  34. package/services/drivers/asset-grid.driver.d.ts +4 -5
  35. package/services/drivers/asset-local.driver.d.ts +6 -6
  36. package/services/drivers/asset-storage-proxy.driver.d.ts +14 -0
  37. package/services/drivers/fallback-readable.d.ts +2 -0
  38. package/services/drivers/fallback-streams.d.ts +2 -0
  39. package/services/entities/asset.d.ts +8 -3
  40. package/services/entities/temp-asset.d.ts +6 -1
  41. package/services/terminal-manager.d.ts +3 -0
  42. package/socket-controllers/socket-terminal.d.ts +19 -0
  43. package/socket-controllers/terminal.controller.d.ts +2 -2
@@ -0,0 +1,56 @@
1
+ import * as readline from "readline";
2
+ export class CliTerminal {
3
+ callbacks = new Set();
4
+ stdin = process.stdin;
5
+ constructor() {
6
+ // Set stdin to raw mode to get character-by-character data
7
+ if (this.stdin.isTTY) {
8
+ this.stdin.setRawMode(true);
9
+ }
10
+ this.clearScreen();
11
+ this.stdin.setEncoding('utf8');
12
+ this.stdin.on('data', this.handleInput);
13
+ }
14
+ clearScreen() {
15
+ readline.cursorTo(process.stdout, 0, 0);
16
+ readline.clearScreenDown(process.stdout);
17
+ }
18
+ handleInput = (data) => {
19
+ const input = data.toString();
20
+ // Standard "Ctrl+C" exit handling
21
+ if (input === '\u0003') {
22
+ this.clearScreen();
23
+ this.dispose();
24
+ }
25
+ this.callbacks.forEach((cb) => cb(input));
26
+ };
27
+ /**
28
+ * Registers a listener for data input.
29
+ * Returns an IDisposable to unregister the listener.
30
+ */
31
+ onData(cb) {
32
+ this.callbacks.add(cb);
33
+ return {
34
+ dispose: () => this.callbacks.delete(cb),
35
+ };
36
+ }
37
+ write(data) {
38
+ process.stdout.write(data);
39
+ }
40
+ writeln(data) {
41
+ process.stdout.write(data + '\n');
42
+ }
43
+ loadAddon(addon) {
44
+ addon.activate(this);
45
+ }
46
+ dispose() {
47
+ if (this.stdin.isTTY) {
48
+ this.stdin.setRawMode(false);
49
+ }
50
+ this.stdin.removeListener('data', this.handleInput);
51
+ this.stdin.pause();
52
+ this.callbacks.clear();
53
+ process.exit();
54
+ }
55
+ }
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLXRlcm1pbmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL2NsaS10ZXJtaW5hbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssUUFBUSxNQUFNLFVBQVUsQ0FBQztBQUlyQyxNQUFNLE9BQU8sV0FBVztJQUNaLFNBQVMsR0FBK0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNsRCxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQTBCLENBQUM7SUFFbkQ7UUFDSSwyREFBMkQ7UUFDM0QsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hDLENBQUM7UUFDRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRU8sV0FBVztRQUNmLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDeEMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVPLFdBQVcsR0FBRyxDQUFDLElBQXFCLEVBQVEsRUFBRTtRQUNsRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFOUIsa0NBQWtDO1FBQ2xDLElBQUksS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbkIsQ0FBQztRQUVELElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDLENBQUM7SUFFRjs7O09BR0c7SUFDSSxNQUFNLENBQUMsRUFBeUI7UUFDbkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkIsT0FBTztZQUNILE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7U0FDM0MsQ0FBQztJQUNOLENBQUM7SUFFTSxLQUFLLENBQUMsSUFBWTtRQUNyQixPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRU0sT0FBTyxDQUFDLElBQVk7UUFDdkIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFTSxTQUFTLENBQUMsS0FBcUI7UUFDbEMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRU0sT0FBTztRQUNWLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDO1FBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdkIsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ25CLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHJlYWRsaW5lIGZyb20gXCJyZWFkbGluZVwiO1xyXG5pbXBvcnQge0lEaXNwb3NhYmxlLCBJVGVybWluYWxBZGRvbn0gZnJvbSBcIkBzdGVteS90ZXJtaW5hbC1jb21tYW5kcy1hZGRvblwiO1xyXG5pbXBvcnQge0lUZXJtaW5hbH0gZnJvbSBcIi4uL2NvbW1vbi10eXBlc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIENsaVRlcm1pbmFsIGltcGxlbWVudHMgSVRlcm1pbmFsIHtcclxuICAgIHByaXZhdGUgY2FsbGJhY2tzOiBTZXQ8KGRhdGE6IHN0cmluZykgPT4gYW55PiA9IG5ldyBTZXQoKTtcclxuICAgIHByaXZhdGUgc3RkaW4gPSBwcm9jZXNzLnN0ZGluIGFzIE5vZGVKUy5SZWFkU3RyZWFtO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIC8vIFNldCBzdGRpbiB0byByYXcgbW9kZSB0byBnZXQgY2hhcmFjdGVyLWJ5LWNoYXJhY3RlciBkYXRhXHJcbiAgICAgICAgaWYgKHRoaXMuc3RkaW4uaXNUVFkpIHtcclxuICAgICAgICAgICAgdGhpcy5zdGRpbi5zZXRSYXdNb2RlKHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNsZWFyU2NyZWVuKCk7XHJcbiAgICAgICAgdGhpcy5zdGRpbi5zZXRFbmNvZGluZygndXRmOCcpO1xyXG4gICAgICAgIHRoaXMuc3RkaW4ub24oJ2RhdGEnLCB0aGlzLmhhbmRsZUlucHV0KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNsZWFyU2NyZWVuKCk6IHZvaWQge1xyXG4gICAgICAgIHJlYWRsaW5lLmN1cnNvclRvKHByb2Nlc3Muc3Rkb3V0LCAwLCAwKTtcclxuICAgICAgICByZWFkbGluZS5jbGVhclNjcmVlbkRvd24ocHJvY2Vzcy5zdGRvdXQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFuZGxlSW5wdXQgPSAoZGF0YTogQnVmZmVyIHwgc3RyaW5nKTogdm9pZCA9PiB7XHJcbiAgICAgICAgY29uc3QgaW5wdXQgPSBkYXRhLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgICAgIC8vIFN0YW5kYXJkIFwiQ3RybCtDXCIgZXhpdCBoYW5kbGluZ1xyXG4gICAgICAgIGlmIChpbnB1dCA9PT0gJ1xcdTAwMDMnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xlYXJTY3JlZW4oKTtcclxuICAgICAgICAgICAgdGhpcy5kaXNwb3NlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNhbGxiYWNrcy5mb3JFYWNoKChjYikgPT4gY2IoaW5wdXQpKTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWdpc3RlcnMgYSBsaXN0ZW5lciBmb3IgZGF0YSBpbnB1dC5cclxuICAgICAqIFJldHVybnMgYW4gSURpc3Bvc2FibGUgdG8gdW5yZWdpc3RlciB0aGUgbGlzdGVuZXIuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkRhdGEoY2I6IChkYXRhOiBzdHJpbmcpID0+IGFueSk6IElEaXNwb3NhYmxlIHtcclxuICAgICAgICB0aGlzLmNhbGxiYWNrcy5hZGQoY2IpO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHRoaXMuY2FsbGJhY2tzLmRlbGV0ZShjYiksXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgd3JpdGUoZGF0YTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHdyaXRlbG4oZGF0YTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoZGF0YSArICdcXG4nKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbG9hZEFkZG9uKGFkZG9uOiBJVGVybWluYWxBZGRvbik6IHZvaWQge1xyXG4gICAgICAgIGFkZG9uLmFjdGl2YXRlKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnN0ZGluLmlzVFRZKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RkaW4uc2V0UmF3TW9kZShmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc3RkaW4ucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCB0aGlzLmhhbmRsZUlucHV0KTtcclxuICAgICAgICB0aGlzLnN0ZGluLnBhdXNlKCk7XHJcbiAgICAgICAgdGhpcy5jYWxsYmFja3MuY2xlYXIoKTtcclxuICAgICAgICBwcm9jZXNzLmV4aXQoKTtcclxuICAgIH1cclxufVxyXG4iXX0=
@@ -4,10 +4,12 @@ import dotenv from "dotenv";
4
4
  import { PARAMETER } from "../common-types";
5
5
  import { colorize, ConsoleColor, convertValue, getType, isFunction } from "../utils";
6
6
  let Configuration = class Configuration {
7
+ isCli;
7
8
  paramMap;
8
9
  paramValues;
9
10
  constructor(params) {
10
11
  dotenv.config();
12
+ this.isCli = process.env.IS_CLI === 'true';
11
13
  this.paramMap = {};
12
14
  this.paramValues = {};
13
15
  (params || []).forEach(param => this.add(param));
@@ -28,15 +30,15 @@ let Configuration = class Configuration {
28
30
  const value = isFunction(param.resolver)
29
31
  ? param.resolver(envValue, helper)
30
32
  : convertValue(envValue, getType(param.defaultValue));
31
- console.log(colorize(`Processing param value`, ConsoleColor.FgYellow), colorize(param.name, ConsoleColor.FgGreen), colorize(envName, ConsoleColor.FgBlue), `"${envValue}"`, value);
33
+ this.log(colorize(`Processing param value`, ConsoleColor.FgYellow), colorize(param.name, ConsoleColor.FgGreen), colorize(envName, ConsoleColor.FgBlue), `"${envValue}"`, value);
32
34
  return value;
33
35
  }
34
36
  else if (isFunction(param.resolver)) {
35
37
  const value = param.resolver(param.defaultValue, helper);
36
- console.log(colorize(`Processing default param value`, ConsoleColor.FgYellow), colorize(param.name, ConsoleColor.FgGreen), param.defaultValue, value);
38
+ this.log(colorize(`Processing default param value`, ConsoleColor.FgYellow), colorize(param.name, ConsoleColor.FgGreen), param.defaultValue, value);
37
39
  return value;
38
40
  }
39
- console.log(colorize(`Using default param value`, ConsoleColor.FgYellow), colorize(param.name, ConsoleColor.FgGreen), param.defaultValue);
41
+ this.log(colorize(`Using default param value`, ConsoleColor.FgYellow), colorize(param.name, ConsoleColor.FgGreen), param.defaultValue);
40
42
  return param.defaultValue;
41
43
  }
42
44
  hasParam(name) {
@@ -58,6 +60,11 @@ let Configuration = class Configuration {
58
60
  }
59
61
  return this.paramValues[name];
60
62
  }
63
+ log(...args) {
64
+ if (this.isCli)
65
+ return;
66
+ console.log(...args);
67
+ }
61
68
  };
62
69
  Configuration = __decorate([
63
70
  singleton(),
@@ -65,4 +72,4 @@ Configuration = __decorate([
65
72
  __metadata("design:paramtypes", [Array])
66
73
  ], Configuration);
67
74
  export { Configuration };
68
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9jb25maWd1cmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFNBQVMsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUM5QyxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFFNUIsT0FBTyxFQUFDLFNBQVMsRUFBWSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JELE9BQU8sRUFBQyxRQUFRLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRzVFLElBQU0sYUFBYSxHQUFuQixNQUFNLGFBQWE7SUFFWixRQUFRLENBQThCO0lBQ3RDLFdBQVcsQ0FBd0I7SUFFN0MsWUFBa0MsTUFBbUI7UUFDakQsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRVMsR0FBRyxDQUFDLEtBQWdCO1FBQzFCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQztRQUN6RCxhQUFhLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7UUFDaEQsYUFBYSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUM7UUFDbEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcs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QyxJQUFJLENBQUMsQ0FBQztRQUMzQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxLQUFLO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsSUFBSSxvQ0FBb0MsQ0FBQyxDQUFDO1FBQy9GLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEMsQ0FBQztDQUNKLENBQUE7QUEzRVksYUFBYTtJQUR6QixTQUFTLEVBQUU7SUFNSyxXQUFBLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQTs7R0FMeEIsYUFBYSxDQTJFekIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2luamVjdEFsbCwgc2luZ2xldG9ufSBmcm9tIFwidHN5cmluZ2VcIjtcclxuaW1wb3J0IGRvdGVudiBmcm9tIFwiZG90ZW52XCI7XHJcblxyXG5pbXBvcnQge1BBUkFNRVRFUiwgUGFyYW1ldGVyfSBmcm9tIFwiLi4vY29tbW9uLXR5cGVzXCI7XHJcbmltcG9ydCB7Y29sb3JpemUsIENvbnNvbGVDb2xvciwgY29udmVydFZhbHVlLCBnZXRUeXBlLCBpc0Z1bmN0aW9ufSBmcm9tIFwiLi4vdXRpbHNcIjtcclxuXHJcbkBzaW5nbGV0b24oKVxyXG5leHBvcnQgY2xhc3MgQ29uZmlndXJhdGlvbiB7XHJcblxyXG4gICAgcHJvdGVjdGVkIHBhcmFtTWFwOiB7W25hbWU6IHN0cmluZ106IFBhcmFtZXRlcn07XHJcbiAgICBwcm90ZWN0ZWQgcGFyYW1WYWx1ZXM6IHtbbmFtZTogc3RyaW5nXTogYW55fTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihAaW5qZWN0QWxsKFBBUkFNRVRFUikgcGFyYW1zOiBQYXJhbWV0ZXJbXSkge1xyXG4gICAgICAgIGRvdGVudi5jb25maWcoKTtcclxuICAgICAgICB0aGlzLnBhcmFtTWFwID0ge307XHJcbiAgICAgICAgdGhpcy5wYXJhbVZhbHVlcyA9IHt9O1xyXG4gICAgICAgIChwYXJhbXMgfHwgW10pLmZvckVhY2gocGFyYW0gPT4gdGhpcy5hZGQocGFyYW0pKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgYWRkKHBhcmFtOiBQYXJhbWV0ZXIpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBleGlzdGluZ1BhcmFtID0gdGhpcy5wYXJhbU1hcFtwYXJhbS5uYW1lXSB8fCBwYXJhbTtcclxuICAgICAgICBleGlzdGluZ1BhcmFtLmRlZmF1bHRWYWx1ZSA9IHBhcmFtLmRlZmF1bHRWYWx1ZTtcclxuICAgICAgICBleGlzdGluZ1BhcmFtLnJlc29sdmVyID0gcGFyYW0ucmVzb2x2ZXIgfHwgZXhpc3RpbmdQYXJhbS5yZXNvbHZlcjtcclxuICAgICAgICB0aGlzLnBhcmFtTWFwW3BhcmFtLm5hbWVdID0gZXhpc3RpbmdQYXJhbTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVzb2x2ZVZhbHVlKHBhcmFtOiBQYXJhbWV0ZXIsIGFscmVhZHlSZXNvbHZlZDogc3RyaW5nW10pOiBhbnkge1xyXG4gICAgICAgIGNvbnN0IGVudk5hbWUgPSBwYXJhbS5uYW1lLnJlcGxhY2UoL1xcLj8oW0EtWnwwLTldKykvZywgZnVuY3Rpb24gKHgsIHkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFwiX1wiICsgeS50b0xvd2VyQ2FzZSgpXHJcbiAgICAgICAgfSkucmVwbGFjZSgvXFwuL2dpLCBcIl9cIikucmVwbGFjZSgvXl8vLCBcIlwiKS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgIGNvbnN0IGVudlZhbHVlID0gcHJvY2Vzcy5lbnZbZW52TmFtZV07XHJcbiAgICAgICAgY29uc3QgaGVscGVyID0gKHA6IHN0cmluZykgPT4gdGhpcy5yZXNvbHZlSW50ZXJuYWwocCwgYWxyZWFkeVJlc29sdmVkKTtcclxuICAgICAgICBpZiAodHlwZW9mIGVudlZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gaXNGdW5jdGlvbihwYXJhbS5yZXNvbHZlcilcclxuICAgICAgICAgICAgICAgID8gcGFyYW0ucmVzb2x2ZXIoZW52VmFsdWUsIGhlbHBlcilcclxuICAgICAgICAgICAgICAgIDogY29udmVydFZhbHVlKGVudlZhbHVlLCBnZXRUeXBlKHBhcmFtLmRlZmF1bHRWYWx1ZSkpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAgICAgICAgIGNvbG9yaXplKGBQcm9jZXNzaW5nIHBhcmFtIHZhbHVlYCwgQ29uc29sZUNvbG9yLkZnWWVsbG93KSxcclxuICAgICAgICAgICAgICAgIGNvbG9yaXplKHBhcmFtLm5hbWUsIENvbnNvbGVDb2xvci5GZ0dyZWVuKSxcclxuICAgICAgICAgICAgICAgIGNvbG9yaXplKGVudk5hbWUsIENvbnNvbGVDb2xvci5GZ0JsdWUpLFxyXG4gICAgICAgICAgICAgICAgYFwiJHtlbnZWYWx1ZX1cImAsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKHBhcmFtLnJlc29sdmVyKSkge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHBhcmFtLnJlc29sdmVyKHBhcmFtLmRlZmF1bHRWYWx1ZSwgaGVscGVyKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICAgICAgICBjb2xvcml6ZShgUHJvY2Vzc2luZyBkZWZhdWx0IHBhcmFtIHZhbHVlYCwgQ29uc29sZUNvbG9yLkZnWWVsbG93KSxcclxuICAgICAgICAgICAgICAgIGNvbG9yaXplKHBhcmFtLm5hbWUsIENvbnNvbGVDb2xvci5GZ0dyZWVuKSxcclxuICAgICAgICAgICAgICAgIHBhcmFtLmRlZmF1bHRWYWx1ZSxcclxuICAgICAgICAgICAgICAgIHZhbHVlXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICAgIGNvbG9yaXplKGBVc2luZyBkZWZhdWx0IHBhcmFtIHZhbHVlYCwgQ29uc29sZUNvbG9yLkZnWWVsbG93KSxcclxuICAgICAgICAgICAgY29sb3JpemUocGFyYW0ubmFtZSwgQ29uc29sZUNvbG9yLkZnR3JlZW4pLFxyXG4gICAgICAgICAgICBwYXJhbS5kZWZhdWx0VmFsdWUsXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gcGFyYW0uZGVmYXVsdFZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGhhc1BhcmFtKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAhIXRoaXMucGFyYW1NYXBbbmFtZV07XHJcbiAgICB9XHJcblxyXG4gICAgcmVzb2x2ZShuYW1lOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJlc29sdmVJbnRlcm5hbChuYW1lLCBbXSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHJlc29sdmVJbnRlcm5hbChuYW1lOiBzdHJpbmcsIGFscmVhZHlSZXNvbHZlZDogc3RyaW5nW10pOiBhbnkge1xyXG4gICAgICAgIGlmIChhbHJlYWR5UmVzb2x2ZWQuaW5jbHVkZXMobmFtZSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDaXJjdWxhciBkZXBlbmRlbmN5IGRldGVjdGVkOiAke2FscmVhZHlSZXNvbHZlZC5qb2luKFwiIC0+IFwiKX0gLT4gJHtuYW1lfWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBhbHJlYWR5UmVzb2x2ZWQucHVzaChuYW1lKTtcclxuICAgICAgICBjb25zdCBwYXJhbSA9IHRoaXMucGFyYW1NYXBbbmFtZV07XHJcbiAgICAgICAgaWYgKCFwYXJhbSkgdGhyb3cgbmV3IEVycm9yKGBQYXJhbWV0ZXIgd2l0aCBuYW1lOiAnJHtuYW1lfScgZG9lcyBub3QgZXhpc3RzIGluIGNvbmZpZ3VyYXRpb25gKTtcclxuICAgICAgICBpZiAoIShuYW1lIGluIHRoaXMucGFyYW1WYWx1ZXMpKSB7XHJcbiAgICAgICAgICAgIHRoaXMucGFyYW1WYWx1ZXNbbmFtZV0gPSB0aGlzLnJlc29sdmVWYWx1ZShwYXJhbSwgYWxyZWFkeVJlc29sdmVkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyYW1WYWx1ZXNbbmFtZV07XHJcbiAgICB9XHJcbn1cclxuIl19
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9jb25maWd1cmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFNBQVMsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUM5QyxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFFNUIsT0FBTyxFQUFDLFNBQVMsRUFBWSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JELE9BQU8sRUFBQyxRQUFRLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRzVFLElBQU0sYUFBYSxHQUFuQixNQUFNLGFBQWE7SUFFYixLQUFLLENBQVU7SUFDZCxRQUFRLENBQThCO0lBQ3RDLFdBQVcsQ0FBd0I7SUFFN0MsWUFBa0MsTUFBbUI7UUFDakQsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDO1FBQzNDLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRVMsR0FBRyxDQUFDLEtBQWdCO1FBQzFCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQztRQUN6RCxhQUFhLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7UUFDaEQsYUFBYSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMs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QyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNoRyxDQUFDO1FBQ0QsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxLQUFLO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsSUFBSSxvQ0FBb0MsQ0FBQyxDQUFDO1FBQy9GLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVTLEdBQUcsQ0FBQyxHQUFHLElBQVc7UUFDeEIsSUFBSSxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU87UUFDdkIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ3pCLENBQUM7Q0FDSixDQUFBO0FBbEZZLGFBQWE7SUFEekIsU0FBUyxFQUFFO0lBT0ssV0FBQSxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUE7O0dBTnhCLGFBQWEsQ0FrRnpCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpbmplY3RBbGwsIHNpbmdsZXRvbn0gZnJvbSBcInRzeXJpbmdlXCI7XHJcbmltcG9ydCBkb3RlbnYgZnJvbSBcImRvdGVudlwiO1xyXG5cclxuaW1wb3J0IHtQQVJBTUVURVIsIFBhcmFtZXRlcn0gZnJvbSBcIi4uL2NvbW1vbi10eXBlc1wiO1xyXG5pbXBvcnQge2NvbG9yaXplLCBDb25zb2xlQ29sb3IsIGNvbnZlcnRWYWx1ZSwgZ2V0VHlwZSwgaXNGdW5jdGlvbn0gZnJvbSBcIi4uL3V0aWxzXCI7XHJcblxyXG5Ac2luZ2xldG9uKClcclxuZXhwb3J0IGNsYXNzIENvbmZpZ3VyYXRpb24ge1xyXG5cclxuICAgIHJlYWRvbmx5IGlzQ2xpOiBib29sZWFuO1xyXG4gICAgcHJvdGVjdGVkIHBhcmFtTWFwOiB7W25hbWU6IHN0cmluZ106IFBhcmFtZXRlcn07XHJcbiAgICBwcm90ZWN0ZWQgcGFyYW1WYWx1ZXM6IHtbbmFtZTogc3RyaW5nXTogYW55fTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihAaW5qZWN0QWxsKFBBUkFNRVRFUikgcGFyYW1zOiBQYXJhbWV0ZXJbXSkge1xyXG4gICAgICAgIGRvdGVudi5jb25maWcoKTtcclxuICAgICAgICB0aGlzLmlzQ2xpID0gcHJvY2Vzcy5lbnYuSVNfQ0xJID09PSAndHJ1ZSc7XHJcbiAgICAgICAgdGhpcy5wYXJhbU1hcCA9IHt9O1xyXG4gICAgICAgIHRoaXMucGFyYW1WYWx1ZXMgPSB7fTtcclxuICAgICAgICAocGFyYW1zIHx8IFtdKS5mb3JFYWNoKHBhcmFtID0+IHRoaXMuYWRkKHBhcmFtKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGFkZChwYXJhbTogUGFyYW1ldGVyKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZXhpc3RpbmdQYXJhbSA9IHRoaXMucGFyYW1NYXBbcGFyYW0ubmFtZV0gfHwgcGFyYW07XHJcbiAgICAgICAgZXhpc3RpbmdQYXJhbS5kZWZhdWx0VmFsdWUgPSBwYXJhbS5kZWZhdWx0VmFsdWU7XHJcbiAgICAgICAgZXhpc3RpbmdQYXJhbS5yZXNvbHZlciA9IHBhcmFtLnJlc29sdmVyIHx8IGV4aXN0aW5nUGFyYW0ucmVzb2x2ZXI7XHJcbiAgICAgICAgdGhpcy5wYXJhbU1hcFtwYXJhbS5uYW1lXSA9IGV4aXN0aW5nUGFyYW07XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHJlc29sdmVWYWx1ZShwYXJhbTogUGFyYW1ldGVyLCBhbHJlYWR5UmVzb2x2ZWQ6IHN0cmluZ1tdKTogYW55IHtcclxuICAgICAgICBjb25zdCBlbnZOYW1lID0gcGFyYW0ubmFtZS5yZXBsYWNlKC9cXC4/KFtBLVp8MC05XSspL2csIGZ1bmN0aW9uICh4LCB5KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBcIl9cIiArIHkudG9Mb3dlckNhc2UoKVxyXG4gICAgICAgIH0pLnJlcGxhY2UoL1xcLi9naSwgXCJfXCIpLnJlcGxhY2UoL15fLywgXCJcIikudG9VcHBlckNhc2UoKTtcclxuICAgICAgICBjb25zdCBlbnZWYWx1ZSA9IHByb2Nlc3MuZW52W2Vudk5hbWVdO1xyXG4gICAgICAgIGNvbnN0IGhlbHBlciA9IChwOiBzdHJpbmcpID0+IHRoaXMucmVzb2x2ZUludGVybmFsKHAsIGFscmVhZHlSZXNvbHZlZCk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBlbnZWYWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGlzRnVuY3Rpb24ocGFyYW0ucmVzb2x2ZXIpXHJcbiAgICAgICAgICAgICAgICA/IHBhcmFtLnJlc29sdmVyKGVudlZhbHVlLCBoZWxwZXIpXHJcbiAgICAgICAgICAgICAgICA6IGNvbnZlcnRWYWx1ZShlbnZWYWx1ZSwgZ2V0VHlwZShwYXJhbS5kZWZhdWx0VmFsdWUpKTtcclxuICAgICAgICAgICAgdGhpcy5sb2coXHJcbiAgICAgICAgICAgICAgICBjb2xvcml6ZShgUHJvY2Vzc2luZyBwYXJhbSB2YWx1ZWAsIENvbnNvbGVDb2xvci5GZ1llbGxvdyksXHJcbiAgICAgICAgICAgICAgICBjb2xvcml6ZShwYXJhbS5uYW1lLCBDb25zb2xlQ29sb3IuRmdHcmVlbiksXHJcbiAgICAgICAgICAgICAgICBjb2xvcml6ZShlbnZOYW1lLCBDb25zb2xlQ29sb3IuRmdCbHVlKSxcclxuICAgICAgICAgICAgICAgIGBcIiR7ZW52VmFsdWV9XCJgLFxyXG4gICAgICAgICAgICAgICAgdmFsdWVcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihwYXJhbS5yZXNvbHZlcikpIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBwYXJhbS5yZXNvbHZlcihwYXJhbS5kZWZhdWx0VmFsdWUsIGhlbHBlcik7XHJcbiAgICAgICAgICAgIHRoaXMubG9nKFxyXG4gICAgICAgICAgICAgICAgY29sb3JpemUoYFByb2Nlc3NpbmcgZGVmYXVsdCBwYXJhbSB2YWx1ZWAsIENvbnNvbGVDb2xvci5GZ1llbGxvdyksXHJcbiAgICAgICAgICAgICAgICBjb2xvcml6ZShwYXJhbS5uYW1lLCBDb25zb2xlQ29sb3IuRmdHcmVlbiksXHJcbiAgICAgICAgICAgICAgICBwYXJhbS5kZWZhdWx0VmFsdWUsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubG9nKFxyXG4gICAgICAgICAgICBjb2xvcml6ZShgVXNpbmcgZGVmYXVsdCBwYXJhbSB2YWx1ZWAsIENvbnNvbGVDb2xvci5GZ1llbGxvdyksXHJcbiAgICAgICAgICAgIGNvbG9yaXplKHBhcmFtLm5hbWUsIENvbnNvbGVDb2xvci5GZ0dyZWVuKSxcclxuICAgICAgICAgICAgcGFyYW0uZGVmYXVsdFZhbHVlLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgcmV0dXJuIHBhcmFtLmRlZmF1bHRWYWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBoYXNQYXJhbShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gISF0aGlzLnBhcmFtTWFwW25hbWVdO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc29sdmUobmFtZTogc3RyaW5nKTogYW55IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlSW50ZXJuYWwobmFtZSwgW10pO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCByZXNvbHZlSW50ZXJuYWwobmFtZTogc3RyaW5nLCBhbHJlYWR5UmVzb2x2ZWQ6IHN0cmluZ1tdKTogYW55IHtcclxuICAgICAgICBpZiAoYWxyZWFkeVJlc29sdmVkLmluY2x1ZGVzKG5hbWUpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2lyY3VsYXIgZGVwZW5kZW5jeSBkZXRlY3RlZDogJHthbHJlYWR5UmVzb2x2ZWQuam9pbihcIiAtPiBcIil9IC0+ICR7bmFtZX1gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYWxyZWFkeVJlc29sdmVkLnB1c2gobmFtZSk7XHJcbiAgICAgICAgY29uc3QgcGFyYW0gPSB0aGlzLnBhcmFtTWFwW25hbWVdO1xyXG4gICAgICAgIGlmICghcGFyYW0pIHRocm93IG5ldyBFcnJvcihgUGFyYW1ldGVyIHdpdGggbmFtZTogJyR7bmFtZX0nIGRvZXMgbm90IGV4aXN0cyBpbiBjb25maWd1cmF0aW9uYCk7XHJcbiAgICAgICAgaWYgKCEobmFtZSBpbiB0aGlzLnBhcmFtVmFsdWVzKSkge1xyXG4gICAgICAgICAgICB0aGlzLnBhcmFtVmFsdWVzW25hbWVdID0gdGhpcy5yZXNvbHZlVmFsdWUocGFyYW0sIGFscmVhZHlSZXNvbHZlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnBhcmFtVmFsdWVzW25hbWVdO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBsb2coLi4uYXJnczogYW55W10pIHtcclxuICAgICAgICBpZiAodGhpcy5pc0NsaSkgcmV0dXJuO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKC4uLmFyZ3MpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,35 @@
1
+ import { __decorate, __metadata, __param } from "tslib";
2
+ import { inject, injectable } from "tsyringe";
3
+ import { ASSET_FALLBACK_DRIVER, ASSET_MAIN_DRIVER } from "../../common-types";
4
+ import { createFallbackReadable, createFallbackWritable } from "./fallback-streams";
5
+ let AssetFallbackDriver = class AssetFallbackDriver {
6
+ main;
7
+ fallback;
8
+ constructor(main, fallback) {
9
+ this.main = main;
10
+ this.fallback = fallback;
11
+ }
12
+ openDownloadStream(id) {
13
+ return createFallbackReadable(this.main.openDownloadStream(id), () => this.fallback.openDownloadStream(id));
14
+ }
15
+ openUploadStream(filename, opts) {
16
+ return createFallbackWritable(this.main.openUploadStream(filename, opts), () => this.fallback.openUploadStream(filename, opts));
17
+ }
18
+ async delete(id) {
19
+ try {
20
+ await this.main.delete(id);
21
+ }
22
+ catch (e) {
23
+ console.log("Failed to delete from primary: ", e.message);
24
+ await this.fallback.delete(id);
25
+ }
26
+ }
27
+ };
28
+ AssetFallbackDriver = __decorate([
29
+ injectable(),
30
+ __param(0, inject(ASSET_MAIN_DRIVER)),
31
+ __param(1, inject(ASSET_FALLBACK_DRIVER)),
32
+ __metadata("design:paramtypes", [Object, Object])
33
+ ], AssetFallbackDriver);
34
+ export { AssetFallbackDriver };
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXQtZmFsbGJhY2stZHJpdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlcnZpY2VzL2RyaXZlcnMvYXNzZXQtZmFsbGJhY2stZHJpdmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUU1QyxPQUFPLEVBQ0gscUJBQXFCLEVBQ3JCLGlCQUFpQixFQUlwQixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBQyxzQkFBc0IsRUFBRSxzQkFBc0IsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRzNFLElBQU0sbUJBQW1CLEdBQXpCLE1BQU0sbUJBQW1CO0lBRXFCO0lBQ0k7SUFEckQsWUFBaUQsSUFBa0IsRUFDZCxRQUFzQjtRQUQxQixTQUFJLEdBQUosSUFBSSxDQUFjO1FBQ2QsYUFBUSxHQUFSLFFBQVEsQ0FBYztJQUMzRSxDQUFDO0lBRUQsa0JBQWtCLENBQUMsRUFBWTtRQUMzQixPQUFPLHNCQUFzQixDQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxFQUNoQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUM3QyxDQUFDO0lBQ04sQ0FBQztJQUVELGdCQUFnQixDQUFDLFFBQWdCLEVBQUUsSUFBdUI7UUFDdEQsT0FBTyxzQkFBc0IsQ0FDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLEVBQzFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUN2RCxDQUFDO0lBQ04sQ0FBQztJQUVELEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBWTtRQUNyQixJQUFJLENBQUM7WUFDRCxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQ0FBaUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUQsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNuQyxDQUFDO0lBQ0wsQ0FBQztDQUNKLENBQUE7QUE1QlksbUJBQW1CO0lBRC9CLFVBQVUsRUFBRTtJQUdJLFdBQUEsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUE7SUFDekIsV0FBQSxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQTs7R0FIakMsbUJBQW1CLENBNEIvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7UmVhZGFibGV9IGZyb20gXCJzdHJlYW1cIjtcclxuaW1wb3J0IHtpbmplY3QsIGluamVjdGFibGV9IGZyb20gXCJ0c3lyaW5nZVwiO1xyXG5pbXBvcnQge09iamVjdElkfSBmcm9tIFwiYnNvblwiO1xyXG5pbXBvcnQge1xyXG4gICAgQVNTRVRfRkFMTEJBQ0tfRFJJVkVSLFxyXG4gICAgQVNTRVRfTUFJTl9EUklWRVIsXHJcbiAgICBJQXNzZXREcml2ZXIsXHJcbiAgICBJQXNzZXRVcGxvYWRPcHRzLFxyXG4gICAgSUFzc2V0VXBsb2FkU3RyZWFtXHJcbn0gZnJvbSBcIi4uLy4uL2NvbW1vbi10eXBlc1wiO1xyXG5pbXBvcnQge2NyZWF0ZUZhbGxiYWNrUmVhZGFibGUsIGNyZWF0ZUZhbGxiYWNrV3JpdGFibGV9IGZyb20gXCIuL2ZhbGxiYWNrLXN0cmVhbXNcIjtcclxuXHJcbkBpbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEFzc2V0RmFsbGJhY2tEcml2ZXIgaW1wbGVtZW50cyBJQXNzZXREcml2ZXIge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKEBpbmplY3QoQVNTRVRfTUFJTl9EUklWRVIpIHByb3RlY3RlZCBtYWluOiBJQXNzZXREcml2ZXIsXHJcbiAgICAgICAgICAgICAgICBAaW5qZWN0KEFTU0VUX0ZBTExCQUNLX0RSSVZFUikgcHJvdGVjdGVkIGZhbGxiYWNrOiBJQXNzZXREcml2ZXIpIHtcclxuICAgIH1cclxuXHJcbiAgICBvcGVuRG93bmxvYWRTdHJlYW0oaWQ6IE9iamVjdElkKTogUmVhZGFibGUge1xyXG4gICAgICAgIHJldHVybiBjcmVhdGVGYWxsYmFja1JlYWRhYmxlKFxyXG4gICAgICAgICAgICB0aGlzLm1haW4ub3BlbkRvd25sb2FkU3RyZWFtKGlkKSxcclxuICAgICAgICAgICAgKCkgPT4gdGhpcy5mYWxsYmFjay5vcGVuRG93bmxvYWRTdHJlYW0oaWQpXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBvcGVuVXBsb2FkU3RyZWFtKGZpbGVuYW1lOiBzdHJpbmcsIG9wdHM/OiBJQXNzZXRVcGxvYWRPcHRzKTogSUFzc2V0VXBsb2FkU3RyZWFtIHtcclxuICAgICAgICByZXR1cm4gY3JlYXRlRmFsbGJhY2tXcml0YWJsZShcclxuICAgICAgICAgICAgdGhpcy5tYWluLm9wZW5VcGxvYWRTdHJlYW0oZmlsZW5hbWUsIG9wdHMpLFxyXG4gICAgICAgICAgICAoKSA9PiB0aGlzLmZhbGxiYWNrLm9wZW5VcGxvYWRTdHJlYW0oZmlsZW5hbWUsIG9wdHMpXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkZWxldGUoaWQ6IE9iamVjdElkKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5tYWluLmRlbGV0ZShpZCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkZhaWxlZCB0byBkZWxldGUgZnJvbSBwcmltYXJ5OiBcIiwgZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5mYWxsYmFjay5kZWxldGUoaWQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=
@@ -3,20 +3,18 @@ import { injectable } from "tsyringe";
3
3
  import { GridFSBucket as BucketImpl } from 'mongodb/lib/gridfs';
4
4
  import { MongoConnector } from "../mongo-connector";
5
5
  let AssetGridDriver = class AssetGridDriver {
6
- metaCollection;
7
6
  bucket;
8
7
  constructor(connector) {
9
8
  this.bucket = new BucketImpl(connector.database, { bucketName: 'assets' });
10
- this.metaCollection = "assets.files";
11
9
  }
12
10
  openUploadStream(filename, opts) {
13
11
  return this.bucket.openUploadStream(filename, opts);
14
12
  }
15
- openDownloadStream(id) {
16
- return this.bucket.openDownloadStream(id);
13
+ openDownloadStream(asset) {
14
+ return this.bucket.openDownloadStream(asset.streamId);
17
15
  }
18
- delete(id) {
19
- return this.bucket.delete(id);
16
+ delete(asset) {
17
+ return this.bucket.delete(asset.streamId);
20
18
  }
21
19
  };
22
20
  AssetGridDriver = __decorate([
@@ -24,4 +22,4 @@ AssetGridDriver = __decorate([
24
22
  __metadata("design:paramtypes", [MongoConnector])
25
23
  ], AssetGridDriver);
26
24
  export { AssetGridDriver };
27
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXQtZ3JpZC5kcml2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvZHJpdmVycy9hc3NldC1ncmlkLmRyaXZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUVwQyxPQUFPLEVBQUMsWUFBWSxJQUFJLFVBQVUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRzlELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUczQyxJQUFNLGVBQWUsR0FBckIsTUFBTSxlQUFlO0lBQ2YsY0FBYyxDQUFTO0lBRXRCLE1BQU0sQ0FBZTtJQUUvQixZQUFZLFNBQXlCO1FBQ2pDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxFQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxRQUFnQixFQUFFLElBQXVCO1FBQ3RELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELGtCQUFrQixDQUFDLEVBQVk7UUFDM0IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxNQUFNLENBQUMsRUFBWTtRQUNmLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbEMsQ0FBQztDQUNKLENBQUE7QUFyQlksZUFBZTtJQUQzQixVQUFVLEVBQUU7cUNBTWMsY0FBYztHQUw1QixlQUFlLENBcUIzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aW5qZWN0YWJsZX0gZnJvbSBcInRzeXJpbmdlXCI7XG5pbXBvcnQge0dyaWRGU0J1Y2tldCwgT2JqZWN0SWR9IGZyb20gJ21vbmdvZGInO1xuaW1wb3J0IHtHcmlkRlNCdWNrZXQgYXMgQnVja2V0SW1wbH0gZnJvbSAnbW9uZ29kYi9saWIvZ3JpZGZzJztcblxuaW1wb3J0IHtJQXNzZXREcml2ZXIsIElBc3NldFVwbG9hZE9wdHN9IGZyb20gJy4uLy4uL2NvbW1vbi10eXBlcyc7XG5pbXBvcnQge01vbmdvQ29ubmVjdG9yfSBmcm9tIFwiLi4vbW9uZ28tY29ubmVjdG9yXCI7XG5cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBBc3NldEdyaWREcml2ZXIgaW1wbGVtZW50cyBJQXNzZXREcml2ZXIge1xuICAgIHJlYWRvbmx5IG1ldGFDb2xsZWN0aW9uOiBzdHJpbmc7XG5cbiAgICBwcm90ZWN0ZWQgYnVja2V0OiBHcmlkRlNCdWNrZXQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb25uZWN0b3I6IE1vbmdvQ29ubmVjdG9yKSB7XG4gICAgICAgIHRoaXMuYnVja2V0ID0gbmV3IEJ1Y2tldEltcGwoY29ubmVjdG9yLmRhdGFiYXNlLCB7YnVja2V0TmFtZTogJ2Fzc2V0cyd9KTtcbiAgICAgICAgdGhpcy5tZXRhQ29sbGVjdGlvbiA9IFwiYXNzZXRzLmZpbGVzXCI7XG4gICAgfVxuXG4gICAgb3BlblVwbG9hZFN0cmVhbShmaWxlbmFtZTogc3RyaW5nLCBvcHRzPzogSUFzc2V0VXBsb2FkT3B0cykge1xuICAgICAgICByZXR1cm4gdGhpcy5idWNrZXQub3BlblVwbG9hZFN0cmVhbShmaWxlbmFtZSwgb3B0cyk7XG4gICAgfVxuXG4gICAgb3BlbkRvd25sb2FkU3RyZWFtKGlkOiBPYmplY3RJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5idWNrZXQub3BlbkRvd25sb2FkU3RyZWFtKGlkKTtcbiAgICB9XG5cbiAgICBkZWxldGUoaWQ6IE9iamVjdElkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1Y2tldC5kZWxldGUoaWQpO1xuICAgIH1cbn1cbiJdfQ==
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXQtZ3JpZC5kcml2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvZHJpdmVycy9hc3NldC1ncmlkLmRyaXZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUVwQyxPQUFPLEVBQUMsWUFBWSxJQUFJLFVBQVUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRzlELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUczQyxJQUFNLGVBQWUsR0FBckIsTUFBTSxlQUFlO0lBRWQsTUFBTSxDQUFlO0lBRS9CLFlBQVksU0FBeUI7UUFDakMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLEVBQUMsVUFBVSxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVELGdCQUFnQixDQUFDLFFBQWdCLEVBQUUsSUFBdUI7UUFDdEQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsa0JBQWtCLENBQUMsS0FBYTtRQUM1QixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRCxNQUFNLENBQUMsS0FBYTtRQUNoQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM5QyxDQUFDO0NBQ0osQ0FBQTtBQW5CWSxlQUFlO0lBRDNCLFVBQVUsRUFBRTtxQ0FLYyxjQUFjO0dBSjVCLGVBQWUsQ0FtQjNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpbmplY3RhYmxlfSBmcm9tIFwidHN5cmluZ2VcIjtcbmltcG9ydCB7R3JpZEZTQnVja2V0fSBmcm9tICdtb25nb2RiJztcbmltcG9ydCB7R3JpZEZTQnVja2V0IGFzIEJ1Y2tldEltcGx9IGZyb20gJ21vbmdvZGIvbGliL2dyaWRmcyc7XG5cbmltcG9ydCB7SUFzc2V0LCBJQXNzZXREcml2ZXIsIElBc3NldFVwbG9hZE9wdHN9IGZyb20gJy4uLy4uL2NvbW1vbi10eXBlcyc7XG5pbXBvcnQge01vbmdvQ29ubmVjdG9yfSBmcm9tIFwiLi4vbW9uZ28tY29ubmVjdG9yXCI7XG5cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBBc3NldEdyaWREcml2ZXIgaW1wbGVtZW50cyBJQXNzZXREcml2ZXIge1xuXG4gICAgcHJvdGVjdGVkIGJ1Y2tldDogR3JpZEZTQnVja2V0O1xuXG4gICAgY29uc3RydWN0b3IoY29ubmVjdG9yOiBNb25nb0Nvbm5lY3Rvcikge1xuICAgICAgICB0aGlzLmJ1Y2tldCA9IG5ldyBCdWNrZXRJbXBsKGNvbm5lY3Rvci5kYXRhYmFzZSwge2J1Y2tldE5hbWU6ICdhc3NldHMnfSk7XG4gICAgfVxuXG4gICAgb3BlblVwbG9hZFN0cmVhbShmaWxlbmFtZTogc3RyaW5nLCBvcHRzPzogSUFzc2V0VXBsb2FkT3B0cykge1xuICAgICAgICByZXR1cm4gdGhpcy5idWNrZXQub3BlblVwbG9hZFN0cmVhbShmaWxlbmFtZSwgb3B0cyk7XG4gICAgfVxuXG4gICAgb3BlbkRvd25sb2FkU3RyZWFtKGFzc2V0OiBJQXNzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVja2V0Lm9wZW5Eb3dubG9hZFN0cmVhbShhc3NldC5zdHJlYW1JZCk7XG4gICAgfVxuXG4gICAgZGVsZXRlKGFzc2V0OiBJQXNzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVja2V0LmRlbGV0ZShhc3NldC5zdHJlYW1JZCk7XG4gICAgfVxufVxuIl19
@@ -1,41 +1,42 @@
1
1
  import { __decorate, __metadata, __param } from "tslib";
2
- import { createReadStream, createWriteStream, mkdirSync } from 'fs';
3
- import { inject, injectable } from "tsyringe";
4
- import { rm, writeFile } from 'fs/promises';
5
- import { Types } from 'mongoose';
6
- import { LOCAL_DIR } from '../../common-types';
2
+ import { createReadStream, createWriteStream, mkdirSync, writeFileSync } from 'fs';
3
+ import { join } from 'path';
4
+ import { inject, injectable } from 'tsyringe';
5
+ import { rm } from 'fs/promises';
6
+ import { ObjectId } from 'bson';
7
+ import { ASSET_LOCAL_DIR } from '../../common-types';
7
8
  let AssetLocalDriver = class AssetLocalDriver {
8
9
  dir;
9
- metaCollection;
10
10
  constructor(dir) {
11
11
  this.dir = dir;
12
- this.metaCollection = "assets.local";
13
12
  }
14
13
  openUploadStream(filename, opts) {
15
- const id = new Types.ObjectId();
14
+ const id = new ObjectId();
16
15
  const dir = `${this.dir}/${id.toHexString()}`;
17
16
  mkdirSync(dir, { recursive: true });
18
- const stream = createWriteStream(`${dir}/file.bin`);
19
- stream.id = id;
17
+ const stream = createWriteStream(this.getPath(id, filename, opts.extension));
20
18
  stream.done = false;
21
19
  stream.on('finish', () => {
22
- writeFile(`${dir}/filename.txt`, filename);
23
- writeFile(`${dir}/metadata.json`, JSON.stringify(opts?.metadata || {}));
20
+ stream.id = id;
24
21
  stream.done = true;
22
+ writeFileSync(`${dir}/metadata.json`, JSON.stringify(opts?.metadata || {}));
25
23
  });
26
24
  return stream;
27
25
  }
28
- openDownloadStream(id) {
29
- return createReadStream(`${this.dir}/${id.toHexString()}/file.bin`, { autoClose: true, emitClose: true });
26
+ openDownloadStream(asset) {
27
+ return createReadStream(this.getPath(asset.streamId, asset.filename, asset.metadata.extension), { autoClose: true, emitClose: true });
30
28
  }
31
- delete(id) {
32
- return rm(`${this.dir}/${id.toHexString()}`, { recursive: true, force: true });
29
+ delete(asset) {
30
+ return rm(this.getPath(asset.streamId, asset.filename, asset.metadata.extension), { recursive: true, force: true });
31
+ }
32
+ getPath(id, name, ext) {
33
+ return join(this.dir, id.toHexString(), `${name}.${ext}`);
33
34
  }
34
35
  };
35
36
  AssetLocalDriver = __decorate([
36
37
  injectable(),
37
- __param(0, inject(LOCAL_DIR)),
38
+ __param(0, inject(ASSET_LOCAL_DIR)),
38
39
  __metadata("design:paramtypes", [String])
39
40
  ], AssetLocalDriver);
40
41
  export { AssetLocalDriver };
41
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXQtbG9jYWwuZHJpdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlcnZpY2VzL2RyaXZlcnMvYXNzZXQtbG9jYWwuZHJpdmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFDLE1BQU0sSUFBSSxDQUFDO0FBQ2xFLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQzVDLE9BQU8sRUFBQyxFQUFFLEVBQUUsU0FBUyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRTFDLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFFL0IsT0FBTyxFQUFxRCxTQUFTLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUcxRixJQUFNLGdCQUFnQixHQUF0QixNQUFNLGdCQUFnQjtJQUdnQjtJQUZoQyxjQUFjLENBQVM7SUFFaEMsWUFBeUMsR0FBVztRQUFYLFFBQUcsR0FBSCxHQUFHLENBQVE7UUFDaEQsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7SUFDekMsQ0FBQztJQUVELGdCQUFnQixDQUFDLFFBQWdCLEVBQUUsSUFBdUI7UUFDdEQsTUFBTSxFQUFFLEdBQUcsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEMsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1FBQzlDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNwQyxNQUFNLE1BQU0sR0FBRyxpQkFBaUIsQ0FBQyxHQUFHLEdBQUcsV0FBVyxDQUF1QixDQUFDO1FBQzFFLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ2YsTUFBTSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7UUFDcEIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFO1lBQ3JCLFNBQVMsQ0FBQyxHQUFHLEdBQUcsZUFBZSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQzNDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDeEUsTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQsa0JBQWtCLENBQUMsRUFBWTtRQUMzQixPQUFPLGdCQUFnQixDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxFQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7SUFDNUcsQ0FBQztJQUVELE1BQU0sQ0FBQyxFQUFZO1FBQ2YsT0FBTyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNuRixDQUFDO0NBQ0osQ0FBQTtBQTdCWSxnQkFBZ0I7SUFENUIsVUFBVSxFQUFFO0lBSUksV0FBQSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUE7O0dBSHJCLGdCQUFnQixDQTZCNUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2NyZWF0ZVJlYWRTdHJlYW0sIGNyZWF0ZVdyaXRlU3RyZWFtLCBta2RpclN5bmN9IGZyb20gJ2ZzJztcbmltcG9ydCB7aW5qZWN0LCBpbmplY3RhYmxlfSBmcm9tIFwidHN5cmluZ2VcIjtcbmltcG9ydCB7cm0sIHdyaXRlRmlsZX0gZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHR5cGUge09iamVjdElkfSBmcm9tICdtb25nb2RiJztcbmltcG9ydCB7VHlwZXN9IGZyb20gJ21vbmdvb3NlJztcblxuaW1wb3J0IHtJQXNzZXREcml2ZXIsIElBc3NldFVwbG9hZE9wdHMsIElBc3NldFVwbG9hZFN0cmVhbSwgTE9DQUxfRElSfSBmcm9tICcuLi8uLi9jb21tb24tdHlwZXMnO1xuXG5AaW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQXNzZXRMb2NhbERyaXZlciBpbXBsZW1lbnRzIElBc3NldERyaXZlciB7XG4gICAgcmVhZG9ubHkgbWV0YUNvbGxlY3Rpb246IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKEBpbmplY3QoTE9DQUxfRElSKSBwcm90ZWN0ZWQgZGlyOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5tZXRhQ29sbGVjdGlvbiA9IFwiYXNzZXRzLmxvY2FsXCI7XG4gICAgfVxuXG4gICAgb3BlblVwbG9hZFN0cmVhbShmaWxlbmFtZTogc3RyaW5nLCBvcHRzPzogSUFzc2V0VXBsb2FkT3B0cykge1xuICAgICAgICBjb25zdCBpZCA9IG5ldyBUeXBlcy5PYmplY3RJZCgpO1xuICAgICAgICBjb25zdCBkaXIgPSBgJHt0aGlzLmRpcn0vJHtpZC50b0hleFN0cmluZygpfWA7XG4gICAgICAgIG1rZGlyU3luYyhkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBjb25zdCBzdHJlYW0gPSBjcmVhdGVXcml0ZVN0cmVhbShgJHtkaXJ9L2ZpbGUuYmluYCkgYXMgSUFzc2V0VXBsb2FkU3RyZWFtO1xuICAgICAgICBzdHJlYW0uaWQgPSBpZDtcbiAgICAgICAgc3RyZWFtLmRvbmUgPSBmYWxzZTtcbiAgICAgICAgc3RyZWFtLm9uKCdmaW5pc2gnLCAoKSA9PiB7XG4gICAgICAgICAgICB3cml0ZUZpbGUoYCR7ZGlyfS9maWxlbmFtZS50eHRgLCBmaWxlbmFtZSk7XG4gICAgICAgICAgICB3cml0ZUZpbGUoYCR7ZGlyfS9tZXRhZGF0YS5qc29uYCwgSlNPTi5zdHJpbmdpZnkob3B0cz8ubWV0YWRhdGEgfHwge30pKTtcbiAgICAgICAgICAgIHN0cmVhbS5kb25lID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBzdHJlYW07XG4gICAgfVxuXG4gICAgb3BlbkRvd25sb2FkU3RyZWFtKGlkOiBPYmplY3RJZCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlUmVhZFN0cmVhbShgJHt0aGlzLmRpcn0vJHtpZC50b0hleFN0cmluZygpfS9maWxlLmJpbmAsIHthdXRvQ2xvc2U6IHRydWUsIGVtaXRDbG9zZTogdHJ1ZX0pO1xuICAgIH1cblxuICAgIGRlbGV0ZShpZDogT2JqZWN0SWQpIHtcbiAgICAgICAgcmV0dXJuIHJtKGAke3RoaXMuZGlyfS8ke2lkLnRvSGV4U3RyaW5nKCl9YCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgIH1cbn1cbiJdfQ==
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXQtbG9jYWwuZHJpdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlcnZpY2VzL2RyaXZlcnMvYXNzZXQtbG9jYWwuZHJpdmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBQyxNQUFNLElBQUksQ0FBQztBQUNqRixPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzFCLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQzVDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUU5QixPQUFPLEVBQUMsZUFBZSxFQUE2RCxNQUFNLG9CQUFvQixDQUFDO0FBR3hHLElBQU0sZ0JBQWdCLEdBQXRCLE1BQU0sZ0JBQWdCO0lBRXNCO0lBQS9DLFlBQStDLEdBQVc7UUFBWCxRQUFHLEdBQUgsR0FBRyxDQUFRO0lBQzFELENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxRQUFnQixFQUFFLElBQXNCO1FBQ3JELE1BQU0sRUFBRSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUM7UUFDMUIsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1FBQzlDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNwQyxNQUFNLE1BQU0sR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUF1QixDQUFDO1FBQ25HLE1BQU0sQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLE1BQU0sQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRTtZQUNyQixNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUNmLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQ25CLGFBQWEsQ0FBQyxHQUFHLEdBQUcsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEYsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQsa0JBQWtCLENBQUMsS0FBYTtRQUM1QixPQUFPLGdCQUFnQixDQUNuQixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUN0RSxFQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBQyxDQUNyQyxDQUFDO0lBQ04sQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFhO1FBQ2hCLE9BQU8sRUFBRSxDQUNMLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQ3RFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQ25DLENBQUM7SUFDTixDQUFDO0lBRVMsT0FBTyxDQUFDLEVBQVksRUFBRSxJQUFZLEVBQUUsR0FBVztRQUNyRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxHQUFHLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQzlELENBQUM7Q0FDSixDQUFBO0FBcENZLGdCQUFnQjtJQUQ1QixVQUFVLEVBQUU7SUFHSSxXQUFBLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQTs7R0FGM0IsZ0JBQWdCLENBb0M1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Y3JlYXRlUmVhZFN0cmVhbSwgY3JlYXRlV3JpdGVTdHJlYW0sIG1rZGlyU3luYywgd3JpdGVGaWxlU3luY30gZnJvbSAnZnMnO1xuaW1wb3J0IHtqb2lufSBmcm9tICdwYXRoJztcbmltcG9ydCB7aW5qZWN0LCBpbmplY3RhYmxlfSBmcm9tICd0c3lyaW5nZSc7XG5pbXBvcnQge3JtfSBmcm9tICdmcy9wcm9taXNlcyc7XG5pbXBvcnQge09iamVjdElkfSBmcm9tICdic29uJztcblxuaW1wb3J0IHtBU1NFVF9MT0NBTF9ESVIsIElBc3NldCwgSUFzc2V0RHJpdmVyLCBJQXNzZXRVcGxvYWRPcHRzLCBJQXNzZXRVcGxvYWRTdHJlYW19IGZyb20gJy4uLy4uL2NvbW1vbi10eXBlcyc7XG5cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBBc3NldExvY2FsRHJpdmVyIGltcGxlbWVudHMgSUFzc2V0RHJpdmVyIHtcblxuICAgIGNvbnN0cnVjdG9yKEBpbmplY3QoQVNTRVRfTE9DQUxfRElSKSBwcm90ZWN0ZWQgZGlyOiBzdHJpbmcpIHtcbiAgICB9XG5cbiAgICBvcGVuVXBsb2FkU3RyZWFtKGZpbGVuYW1lOiBzdHJpbmcsIG9wdHM6IElBc3NldFVwbG9hZE9wdHMpIHtcbiAgICAgICAgY29uc3QgaWQgPSBuZXcgT2JqZWN0SWQoKTtcbiAgICAgICAgY29uc3QgZGlyID0gYCR7dGhpcy5kaXJ9LyR7aWQudG9IZXhTdHJpbmcoKX1gO1xuICAgICAgICBta2RpclN5bmMoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gY3JlYXRlV3JpdGVTdHJlYW0odGhpcy5nZXRQYXRoKGlkLCBmaWxlbmFtZSwgb3B0cy5leHRlbnNpb24pKSBhcyBJQXNzZXRVcGxvYWRTdHJlYW07XG4gICAgICAgIHN0cmVhbS5kb25lID0gZmFsc2U7XG4gICAgICAgIHN0cmVhbS5vbignZmluaXNoJywgKCkgPT4ge1xuICAgICAgICAgICAgc3RyZWFtLmlkID0gaWQ7XG4gICAgICAgICAgICBzdHJlYW0uZG9uZSA9IHRydWU7XG4gICAgICAgICAgICB3cml0ZUZpbGVTeW5jKGAke2Rpcn0vbWV0YWRhdGEuanNvbmAsIEpTT04uc3RyaW5naWZ5KG9wdHM/Lm1ldGFkYXRhIHx8IHt9KSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gc3RyZWFtO1xuICAgIH1cblxuICAgIG9wZW5Eb3dubG9hZFN0cmVhbShhc3NldDogSUFzc2V0KSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVSZWFkU3RyZWFtKFxuICAgICAgICAgICAgdGhpcy5nZXRQYXRoKGFzc2V0LnN0cmVhbUlkLCBhc3NldC5maWxlbmFtZSwgYXNzZXQubWV0YWRhdGEuZXh0ZW5zaW9uKSxcbiAgICAgICAgICAgIHthdXRvQ2xvc2U6IHRydWUsIGVtaXRDbG9zZTogdHJ1ZX1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBkZWxldGUoYXNzZXQ6IElBc3NldCkge1xuICAgICAgICByZXR1cm4gcm0oXG4gICAgICAgICAgICB0aGlzLmdldFBhdGgoYXNzZXQuc3RyZWFtSWQsIGFzc2V0LmZpbGVuYW1lLCBhc3NldC5tZXRhZGF0YS5leHRlbnNpb24pLFxuICAgICAgICAgICAgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0UGF0aChpZDogT2JqZWN0SWQsIG5hbWU6IHN0cmluZywgZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gam9pbih0aGlzLmRpciwgaWQudG9IZXhTdHJpbmcoKSwgYCR7bmFtZX0uJHtleHR9YCk7XG4gICAgfVxufVxuIl19
@@ -0,0 +1,48 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import { injectable } from "tsyringe";
3
+ import { ObjectId } from "bson";
4
+ import got from "got";
5
+ import { Configuration } from "../configuration";
6
+ import { createFallbackReadable } from "./fallback-streams";
7
+ let AssetStorageProxyDriver = class AssetStorageProxyDriver {
8
+ config;
9
+ baseUrl;
10
+ url;
11
+ constructor(config) {
12
+ this.config = config;
13
+ this.baseUrl = this.config.resolve("storageProxyUri");
14
+ this.url = this.baseUrl + this.config.resolve("storageProxyBucket");
15
+ }
16
+ openUploadStream(_, opts) {
17
+ const id = new ObjectId();
18
+ const stream = got.stream.put(this.getUrl(id, opts.extension), { headers: {
19
+ 'Content-Type': opts?.contentType || 'application/octet-stream'
20
+ } });
21
+ stream.done = false;
22
+ stream.on('finish', () => {
23
+ stream.id = id;
24
+ stream.done = true;
25
+ });
26
+ return stream;
27
+ }
28
+ openDownloadStream(asset) {
29
+ return createFallbackReadable(got.stream.get(this.getUrl(asset.streamId, asset.metadata.extension)), () => got.stream.get(this.getUrl(asset.streamId)));
30
+ }
31
+ async delete(asset) {
32
+ try {
33
+ await got.delete(this.getUrl(asset.streamId, asset.metadata.extension));
34
+ }
35
+ catch (e) {
36
+ await got.delete(this.getUrl(asset.streamId));
37
+ }
38
+ }
39
+ getUrl(id, ext) {
40
+ return !ext ? `${this.url}/${id.toHexString()}` : `${this.url}/${id.toHexString()}.${ext}`;
41
+ }
42
+ };
43
+ AssetStorageProxyDriver = __decorate([
44
+ injectable(),
45
+ __metadata("design:paramtypes", [Configuration])
46
+ ], AssetStorageProxyDriver);
47
+ export { AssetStorageProxyDriver };
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXQtc3RvcmFnZS1wcm94eS5kcml2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvZHJpdmVycy9hc3NldC1zdG9yYWdlLXByb3h5LmRyaXZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNwQyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzlCLE9BQU8sR0FBRyxNQUFNLEtBQUssQ0FBQztBQUV0QixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDL0MsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsSUFBTSx1QkFBdUIsR0FBN0IsTUFBTSx1QkFBdUI7SUFLVjtJQUhiLE9BQU8sQ0FBUztJQUNoQixHQUFHLENBQVM7SUFFckIsWUFBc0IsTUFBcUI7UUFBckIsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQUN2QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVELGdCQUFnQixDQUFDLENBQVMsRUFBRSxJQUFzQjtRQUM5QyxNQUFNLEVBQUUsR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQzFCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFDLE9BQU8sRUFBRTtnQkFDakUsY0FBYyxFQUFFLElBQUksRUFBRSxXQUFXLElBQUksMEJBQTBCO2FBQ2xFLEVBQUMsQ0FBdUIsQ0FBQztRQUM5QixNQUFNLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztRQUNwQixNQUFNLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUU7WUFDckIsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDZixNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxLQUFhO1FBQzVCLE9BQU8sc0JBQXNCLENBQ3pCLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQ3JFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQ3BELENBQUM7SUFDTixDQUFDO0lBRUQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFhO1FBQ3RCLElBQUksQ0FBQztZQUNELE1BQU0sR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQzVFLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1QsTUFBTSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDbEQsQ0FBQztJQUNMLENBQUM7SUFFUyxNQUFNLENBQUMsRUFBWSxFQUFFLEdBQVk7UUFDdkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQy9GLENBQUM7Q0FDSixDQUFBO0FBekNZLHVCQUF1QjtJQURuQyxVQUFVLEVBQUU7cUNBTXFCLGFBQWE7R0FMbEMsdUJBQXVCLENBeUNuQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7UmVhZGFibGV9IGZyb20gXCJzdHJlYW1cIjtcbmltcG9ydCB7aW5qZWN0YWJsZX0gZnJvbSBcInRzeXJpbmdlXCI7XG5pbXBvcnQge09iamVjdElkfSBmcm9tIFwiYnNvblwiO1xuaW1wb3J0IGdvdCBmcm9tIFwiZ290XCI7XG5pbXBvcnQge0lBc3NldCwgSUFzc2V0RHJpdmVyLCBJQXNzZXRVcGxvYWRPcHRzLCBJQXNzZXRVcGxvYWRTdHJlYW19IGZyb20gXCIuLi8uLi9jb21tb24tdHlwZXNcIjtcbmltcG9ydCB7Q29uZmlndXJhdGlvbn0gZnJvbSBcIi4uL2NvbmZpZ3VyYXRpb25cIjtcbmltcG9ydCB7Y3JlYXRlRmFsbGJhY2tSZWFkYWJsZX0gZnJvbSBcIi4vZmFsbGJhY2stc3RyZWFtc1wiO1xuXG5AaW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQXNzZXRTdG9yYWdlUHJveHlEcml2ZXIgaW1wbGVtZW50cyBJQXNzZXREcml2ZXIge1xuXG4gICAgcmVhZG9ubHkgYmFzZVVybDogc3RyaW5nO1xuICAgIHJlYWRvbmx5IHVybDogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIGNvbmZpZzogQ29uZmlndXJhdGlvbikge1xuICAgICAgICB0aGlzLmJhc2VVcmwgPSB0aGlzLmNvbmZpZy5yZXNvbHZlKFwic3RvcmFnZVByb3h5VXJpXCIpO1xuICAgICAgICB0aGlzLnVybCA9IHRoaXMuYmFzZVVybCArIHRoaXMuY29uZmlnLnJlc29sdmUoXCJzdG9yYWdlUHJveHlCdWNrZXRcIik7XG4gICAgfVxuXG4gICAgb3BlblVwbG9hZFN0cmVhbShfOiBzdHJpbmcsIG9wdHM6IElBc3NldFVwbG9hZE9wdHMpOiBJQXNzZXRVcGxvYWRTdHJlYW0ge1xuICAgICAgICBjb25zdCBpZCA9IG5ldyBPYmplY3RJZCgpO1xuICAgICAgICBjb25zdCBzdHJlYW0gPSBnb3Quc3RyZWFtLnB1dCh0aGlzLmdldFVybChpZCwgb3B0cy5leHRlbnNpb24pLCB7aGVhZGVyczoge1xuICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiBvcHRzPy5jb250ZW50VHlwZSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJ1xuICAgICAgICAgICAgfX0pIGFzIElBc3NldFVwbG9hZFN0cmVhbTtcbiAgICAgICAgc3RyZWFtLmRvbmUgPSBmYWxzZTtcbiAgICAgICAgc3RyZWFtLm9uKCdmaW5pc2gnLCAoKSA9PiB7XG4gICAgICAgICAgICBzdHJlYW0uaWQgPSBpZDtcbiAgICAgICAgICAgIHN0cmVhbS5kb25lID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBzdHJlYW07XG4gICAgfVxuXG4gICAgb3BlbkRvd25sb2FkU3RyZWFtKGFzc2V0OiBJQXNzZXQpOiBSZWFkYWJsZSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVGYWxsYmFja1JlYWRhYmxlKFxuICAgICAgICAgICAgZ290LnN0cmVhbS5nZXQodGhpcy5nZXRVcmwoYXNzZXQuc3RyZWFtSWQsIGFzc2V0Lm1ldGFkYXRhLmV4dGVuc2lvbikpLFxuICAgICAgICAgICAgKCkgPT4gZ290LnN0cmVhbS5nZXQodGhpcy5nZXRVcmwoYXNzZXQuc3RyZWFtSWQpKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGFzeW5jIGRlbGV0ZShhc3NldDogSUFzc2V0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBnb3QuZGVsZXRlKHRoaXMuZ2V0VXJsKGFzc2V0LnN0cmVhbUlkLCBhc3NldC5tZXRhZGF0YS5leHRlbnNpb24pKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgYXdhaXQgZ290LmRlbGV0ZSh0aGlzLmdldFVybChhc3NldC5zdHJlYW1JZCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldFVybChpZDogT2JqZWN0SWQsIGV4dD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAhZXh0ID8gYCR7dGhpcy51cmx9LyR7aWQudG9IZXhTdHJpbmcoKX1gIDogYCR7dGhpcy51cmx9LyR7aWQudG9IZXhTdHJpbmcoKX0uJHtleHR9YDtcbiAgICB9XG59XG4iXX0=
@@ -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,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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFsbGJhY2stc3RyZWFtcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9kcml2ZXJzL2ZhbGxiYWNrLXN0cmVhbXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFdBQVcsRUFBVyxNQUFNLFFBQVEsQ0FBQztBQUU3QyxNQUFNLFVBQVUsc0JBQXNCLENBQ2xDLE9BQWlCLEVBQ2pCLGVBQStCO0lBRS9CLE1BQU0sS0FBSyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7SUFDaEMsSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBRXhCLE1BQU0sZ0JBQWdCLEdBQUcsR0FBRyxFQUFFO1FBQzFCLElBQUksV0FBVztZQUFFLE9BQU87UUFDeEIsV0FBVyxHQUFHLElBQUksQ0FBQztRQUVuQixpQ0FBaUM7UUFDakMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QixPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFbEIsc0NBQXNDO1FBQ3RDLE1BQU0sUUFBUSxHQUFHLGVBQWUsRUFBRSxDQUFDO1FBRW5DLDBEQUEwRDtRQUMxRCxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXJCLFFBQVEsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDekIsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQywyQ0FBMkM7UUFDekUsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUM7SUFFRixtRUFBbUU7SUFDbkUsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUVwQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUU7UUFDckIsZ0JBQWdCLEVBQUUsQ0FBQztJQUN2QixDQUFDLENBQUMsQ0FBQztJQUVILHlFQUF5RTtJQUN6RSxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUU7UUFDbkIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2YsZ0VBQWdFO1lBQ2hFLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNoQixDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLEtBQUssQ0FBQztBQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtQYXNzVGhyb3VnaCwgUmVhZGFibGV9IGZyb20gJ3N0cmVhbSc7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRmFsbGJhY2tSZWFkYWJsZShcclxuICAgIHByaW1hcnk6IFJlYWRhYmxlLFxyXG4gICAgZmFsbGJhY2tGYWN0b3J5OiAoKSA9PiBSZWFkYWJsZVxyXG4pOiBSZWFkYWJsZSB7XHJcbiAgICBjb25zdCBwcm94eSA9IG5ldyBQYXNzVGhyb3VnaCgpO1xyXG4gICAgbGV0IGhhc1N3aXRjaGVkID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3Qgc3dpdGNoVG9GYWxsYmFjayA9ICgpID0+IHtcclxuICAgICAgICBpZiAoaGFzU3dpdGNoZWQpIHJldHVybjtcclxuICAgICAgICBoYXNTd2l0Y2hlZCA9IHRydWU7XHJcblxyXG4gICAgICAgIC8vIDEuIENsZWFudXAgdGhlIGZhaWxpbmcgcHJpbWFyeVxyXG4gICAgICAgIHByaW1hcnkudW5waXBlKHByb3h5KTtcclxuICAgICAgICBwcmltYXJ5LmRlc3Ryb3koKTtcclxuXHJcbiAgICAgICAgLy8gMi4gSW5pdGlhbGl6ZSBhbmQgcGlwZSB0aGUgZmFsbGJhY2tcclxuICAgICAgICBjb25zdCBmYWxsYmFjayA9IGZhbGxiYWNrRmFjdG9yeSgpO1xyXG5cclxuICAgICAgICAvLyBPbiB0aGUgZmFsbGJhY2ssIHdlIGFsbG93IGl0IHRvIGVuZCB0aGUgcHJveHkgbmF0dXJhbGx5XHJcbiAgICAgICAgZmFsbGJhY2sucGlwZShwcm94eSk7XHJcblxyXG4gICAgICAgIGZhbGxiYWNrLm9uKCdlcnJvcicsIChlcnIpID0+IHtcclxuICAgICAgICAgICAgcHJveHkuZW1pdCgnZXJyb3InLCBlcnIpOyAvLyBJZiBmYWxsYmFjayBmYWlscyB0b28sIGl0J3MgYSBoYXJkIGVycm9yXHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIFBpcGUgcHJpbWFyeSBidXQgcHJldmVudCBpdCBmcm9tIGNsb3NpbmcgdGhlIHByb3h5IGF1dG9tYXRpY2FsbHlcclxuICAgIHByaW1hcnkucGlwZShwcm94eSwgeyBlbmQ6IGZhbHNlIH0pO1xyXG5cclxuICAgIHByaW1hcnkub24oJ2Vycm9yJywgKCkgPT4ge1xyXG4gICAgICAgIHN3aXRjaFRvRmFsbGJhY2soKTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIEhhbmRsZSB0aGUgXCJFYXJseSBFbmRcIiBjYXNlIChlLmcuLCBzdHJlYW0gY2xvc2VkIGJlZm9yZSBkYXRhIGZpbmlzaGVkKVxyXG4gICAgcHJpbWFyeS5vbignZW5kJywgKCkgPT4ge1xyXG4gICAgICAgIGlmICghaGFzU3dpdGNoZWQpIHtcclxuICAgICAgICAgICAgLy8gSWYgd2UgZmluaXNoZWQgc3VjY2Vzc2Z1bGx5IHdpdGhvdXQgZXJyb3JpbmcsIGNsb3NlIHRoZSBwcm94eVxyXG4gICAgICAgICAgICBwcm94eS5lbmQoKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gcHJveHk7XHJcbn1cclxuIl19
@@ -1,10 +1,19 @@
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
- driver;
4
+ drivers;
5
5
  get filename() {
6
6
  return this.data.filename;
7
7
  }
8
+ get streamId() {
9
+ return this.data.streamId || this.oid;
10
+ }
11
+ get driverId() {
12
+ return this.data.driverId;
13
+ }
14
+ get driver() {
15
+ return this.drivers.getDriver(this.driverId || this.drivers.missingDriver);
16
+ }
8
17
  get contentType() {
9
18
  return this.data.contentType;
10
19
  }
@@ -12,26 +21,20 @@ export class Asset extends BaseEntity {
12
21
  return this.data.metadata;
13
22
  }
14
23
  get stream() {
15
- return this.driver.openDownloadStream(this.oid);
24
+ return this.driver.openDownloadStream(this);
16
25
  }
17
- constructor(id, data, collection, driver) {
26
+ constructor(id, data, collection, drivers) {
18
27
  super(id, data, collection);
19
- this.driver = driver;
28
+ this.drivers = drivers;
20
29
  }
21
30
  async unlink() {
22
31
  try {
23
- await this.driver.delete(this.oid);
24
- await this.collection.deleteOne({ _id: this.oid });
32
+ await this.driver.delete(this);
25
33
  }
26
34
  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
- }
35
+ console.log("Failed to unlink", error?.message);
34
36
  }
37
+ await this.collection.deleteOne({ _id: this.oid });
35
38
  return this.id;
36
39
  }
37
40
  async setMeta(metadata) {
@@ -41,6 +44,38 @@ export class Asset extends BaseEntity {
41
44
  getBuffer() {
42
45
  return streamToBuffer(this.stream);
43
46
  }
47
+ async move(driverId) {
48
+ const oldDriver = this.driver;
49
+ const targetDriver = this.drivers.getDriver(driverId);
50
+ if (targetDriver === oldDriver)
51
+ return this;
52
+ const oldAsset = new Asset(this.oid, this.data, this.collection, this.drivers);
53
+ const streamId = await this.uploadTo(targetDriver);
54
+ this.data = {
55
+ ...this.data,
56
+ streamId,
57
+ driverId,
58
+ };
59
+ await this.save();
60
+ await oldDriver.delete(oldAsset);
61
+ }
62
+ uploadTo(driver) {
63
+ return new Promise((resolve, reject) => {
64
+ const uploaderStream = driver.openUploadStream(this.filename, {
65
+ chunkSizeBytes: 1048576,
66
+ contentType: this.contentType,
67
+ extension: this.metadata.extension,
68
+ metadata: this.metadata,
69
+ });
70
+ this.stream.pipe(uploaderStream)
71
+ .on("error", error => {
72
+ reject(error.message || error);
73
+ })
74
+ .on("finish", async () => {
75
+ resolve(uploaderStream.id);
76
+ });
77
+ });
78
+ }
44
79
  async download(metadata) {
45
80
  metadata = Object.assign(this.metadata, metadata || {});
46
81
  metadata.downloadCount = isNaN(metadata.downloadCount) || !metadata.firstDownload
@@ -58,4 +93,4 @@ export class Asset extends BaseEntity {
58
93
  return toImage(await this.download(metadata), params, this.metadata);
59
94
  }
60
95
  }
61
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvZW50aXRpZXMvYXNzZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxFQUFDLFFBQVEsRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQzlELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFekMsTUFBTSxPQUFPLEtBQU0sU0FBUSxVQUFrQjtJQXFCbkI7SUFuQnRCLElBQUksUUFBUTtRQUNSLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQUksV0FBVztRQUNYLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDakMsQ0FBQztJQUVELElBQUksUUFBUTtRQUNSLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQUksTUFBTTtRQUNOLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELFlBQVksRUFBWSxFQUNaLElBQXFCLEVBQ3JCLFVBQXNCLEVBQ1osTUFBb0I7UUFDdEMsS0FBSyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFEVixXQUFNLEdBQU4sTUFBTSxDQUFjO0lBRTFDLENBQUM7SUFFRCxLQUFLLENBQUMsTUFBTTtRQUNSLElBQUksQ0FBQztZQUNELE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25DLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7UUFDckQsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYixJQUFJLEdBQUcsR0FBRyxLQUFZLENBQUM7WUFDdkIsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDUixHQUFHLEdBQUcsS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUNuQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO29CQUNwRCxNQUFNLEdBQUcsQ0FBQztnQkFDZCxDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBNkI7UUFDdkMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLElBQUksRUFBRSxDQUFDLENBQUM7UUFDeEQsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFDLEVBQUUsRUFBQyxJQUFJLEVBQUUsRUFBQyxRQUFRLEVBQUMsRUFBQyxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVELFNBQVM7UUFDTCxPQUFPLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBcUI7UUFDaEMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLElBQUksRUFBRSxDQUFDLENBQUM7UUFDeEQsUUFBUSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWE7WUFDN0UsQ0FBQyxDQUFDLENBQUM7WUFDSCxDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUM7UUFDakMsUUFBUSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUMsYUFBYSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUM7UUFDOUQsUUFBUSxDQUFDLFlBQVksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBQyxFQUFFLEVBQUMsSUFBSSxFQUFFLEVBQUMsUUFBUSxFQUFDLEVBQUMsQ0FBQyxDQUFDO1FBQ3JFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUE0QixJQUFJO1FBQzNDLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUEwQixFQUFFLFFBQXFCO1FBQ2pFLE9BQU8sT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7UmVhZGFibGV9IGZyb20gXCJzdHJlYW1cIjtcclxuaW1wb3J0IHtDb2xsZWN0aW9ufSBmcm9tIFwibW9uZ29kYlwiO1xyXG5pbXBvcnQge09iamVjdElkfSBmcm9tIFwiYnNvblwiO1xyXG5cclxuaW1wb3J0IHtJQXNzZXQsIElBc3NldERyaXZlciwgSUFzc2V0SW1hZ2VQYXJhbXMsIElBc3NldE1ldGF9IGZyb20gXCIuLi8uLi9jb21tb24tdHlwZXNcIjtcclxuaW1wb3J0IHtpc1N0cmluZywgc3RyZWFtVG9CdWZmZXIsIHRvSW1hZ2V9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xyXG5pbXBvcnQge0Jhc2VFbnRpdHl9IGZyb20gXCIuL2Jhc2UtZW50aXR5XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQXNzZXQgZXh0ZW5kcyBCYXNlRW50aXR5PElBc3NldD4gaW1wbGVtZW50cyBJQXNzZXQge1xyXG5cclxuICAgIGdldCBmaWxlbmFtZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuZmlsZW5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNvbnRlbnRUeXBlKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5jb250ZW50VHlwZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbWV0YWRhdGEoKTogSUFzc2V0TWV0YSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5tZXRhZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc3RyZWFtKCk6IFJlYWRhYmxlIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kcml2ZXIub3BlbkRvd25sb2FkU3RyZWFtKHRoaXMub2lkKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpZDogT2JqZWN0SWQsXHJcbiAgICAgICAgICAgICAgICBkYXRhOiBQYXJ0aWFsPElBc3NldD4sXHJcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uLFxyXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIGRyaXZlcjogSUFzc2V0RHJpdmVyKSB7XHJcbiAgICAgICAgc3VwZXIoaWQsIGRhdGEsIGNvbGxlY3Rpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHVubGluaygpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyLmRlbGV0ZSh0aGlzLm9pZCk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29sbGVjdGlvbi5kZWxldGVPbmUoe19pZDogdGhpcy5vaWR9KTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBsZXQgZXJyID0gZXJyb3IgYXMgYW55O1xyXG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGVyciA9IGVycm9yLm1lc3NhZ2UgfHwgZXJyb3IgfHwgXCJcIjtcclxuICAgICAgICAgICAgICAgIGlmICghaXNTdHJpbmcoZXJyKSB8fCAhZXJyLnN0YXJ0c1dpdGgoXCJGaWxlTm90Rm91bmRcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaWQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2V0TWV0YShtZXRhZGF0YTogUGFydGlhbDxJQXNzZXRNZXRhPik6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgbWV0YWRhdGEgPSBPYmplY3QuYXNzaWduKHRoaXMubWV0YWRhdGEsIG1ldGFkYXRhIHx8IHt9KTtcclxuICAgICAgICBhd2FpdCB0aGlzLmNvbGxlY3Rpb24udXBkYXRlT25lKHtfaWQ6IHRoaXMub2lkfSwgeyRzZXQ6IHttZXRhZGF0YX19KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRCdWZmZXIoKTogUHJvbWlzZTxCdWZmZXI+IHtcclxuICAgICAgICByZXR1cm4gc3RyZWFtVG9CdWZmZXIodGhpcy5zdHJlYW0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRvd25sb2FkKG1ldGFkYXRhPzogSUFzc2V0TWV0YSk6IFByb21pc2U8UmVhZGFibGU+IHtcclxuICAgICAgICBtZXRhZGF0YSA9IE9iamVjdC5hc3NpZ24odGhpcy5tZXRhZGF0YSwgbWV0YWRhdGEgfHwge30pO1xyXG4gICAgICAgIG1ldGFkYXRhLmRvd25sb2FkQ291bnQgPSBpc05hTihtZXRhZGF0YS5kb3dubG9hZENvdW50KSB8fCAhbWV0YWRhdGEuZmlyc3REb3dubG9hZFxyXG4gICAgICAgICAgICA/IDFcclxuICAgICAgICAgICAgOiBtZXRhZGF0YS5kb3dubG9hZENvdW50ICsgMTtcclxuICAgICAgICBtZXRhZGF0YS5maXJzdERvd25sb2FkID0gbWV0YWRhdGEuZmlyc3REb3dubG9hZCB8fCBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIG1ldGFkYXRhLmxhc3REb3dubG9hZCA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5jb2xsZWN0aW9uLnVwZGF0ZU9uZSh7X2lkOiB0aGlzLm9pZH0sIHskc2V0OiB7bWV0YWRhdGF9fSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldEltYWdlKHBhcmFtczogSUFzc2V0SW1hZ2VQYXJhbXMgPSBudWxsKTogUHJvbWlzZTxSZWFkYWJsZT4ge1xyXG4gICAgICAgIHJldHVybiB0b0ltYWdlKHRoaXMuc3RyZWFtLCBwYXJhbXMsIHRoaXMubWV0YWRhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRvd25sb2FkSW1hZ2UocGFyYW1zPzogSUFzc2V0SW1hZ2VQYXJhbXMsIG1ldGFkYXRhPzogSUFzc2V0TWV0YSk6IFByb21pc2U8UmVhZGFibGU+IHtcclxuICAgICAgICByZXR1cm4gdG9JbWFnZShhd2FpdCB0aGlzLmRvd25sb2FkKG1ldGFkYXRhKSwgcGFyYW1zLCB0aGlzLm1ldGFkYXRhKTtcclxuICAgIH1cclxufVxyXG4iXX0=
96
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvZW50aXRpZXMvYXNzZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxFQUFXLGNBQWMsRUFBRSxPQUFPLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDOUQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUV6QyxNQUFNLE9BQU8sS0FBTSxTQUFRLFVBQWtCO0lBaUNuQjtJQS9CdEIsSUFBSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQzFDLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDUixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQzlCLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDTixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRUQsSUFBSSxXQUFXO1FBQ1gsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUNqQyxDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ04sT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCxZQUFZLEVBQVksRUFDWixJQUFxQixFQUNyQixVQUFzQixFQUNaLE9BQXNCO1FBQ3hDLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFVB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QztJQUVELEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBcUI7UUFDaEMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLElBQUksRUFBRSxDQUFDLENBQUM7UUFDeEQsUUFBUSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWE7WUFDN0UsQ0FBQyxDQUFDLENBQUM7WUFDSCxDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUM7UUFDakMsUUFBUSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUMsYUFBYSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUM7UUFDOUQsUUFBUSxDQUFDLFlBQVksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBQyxFQUFFLEVBQUMsSUFBSSxFQUFFLEVBQUMsUUFBUSxFQUFDLEVBQUMsQ0FBQyxDQUFDO1FBQ3JFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUE0QixJQUFJO1FBQzNDLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUEwQixFQUFFLFFBQXFCO1FBQ2pFLE9BQU8sT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7UmVhZGFibGV9IGZyb20gXCJzdHJlYW1cIjtcclxuaW1wb3J0IHtDb2xsZWN0aW9ufSBmcm9tIFwibW9uZ29kYlwiO1xyXG5pbXBvcnQge09iamVjdElkfSBmcm9tIFwiYnNvblwiO1xyXG5cclxuaW1wb3J0IHtJQXNzZXQsIElBc3NldERyaXZlciwgSUFzc2V0RHJpdmVycywgSUFzc2V0SW1hZ2VQYXJhbXMsIElBc3NldE1ldGF9IGZyb20gXCIuLi8uLi9jb21tb24tdHlwZXNcIjtcclxuaW1wb3J0IHtpc1N0cmluZywgc3RyZWFtVG9CdWZmZXIsIHRvSW1hZ2V9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xyXG5pbXBvcnQge0Jhc2VFbnRpdHl9IGZyb20gXCIuL2Jhc2UtZW50aXR5XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQXNzZXQgZXh0ZW5kcyBCYXNlRW50aXR5PElBc3NldD4gaW1wbGVtZW50cyBJQXNzZXQge1xyXG5cclxuICAgIGdldCBmaWxlbmFtZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuZmlsZW5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHN0cmVhbUlkKCk6IE9iamVjdElkIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLnN0cmVhbUlkIHx8IHRoaXMub2lkO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBkcml2ZXJJZCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuZHJpdmVySWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGRyaXZlcigpOiBJQXNzZXREcml2ZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRyaXZlcnMuZ2V0RHJpdmVyKHRoaXMuZHJpdmVySWQgfHwgdGhpcy5kcml2ZXJzLm1pc3NpbmdEcml2ZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjb250ZW50VHlwZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuY29udGVudFR5cGU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG1ldGFkYXRhKCk6IElBc3NldE1ldGEge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEubWV0YWRhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHN0cmVhbSgpOiBSZWFkYWJsZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJpdmVyLm9wZW5Eb3dubG9hZFN0cmVhbSh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpZDogT2JqZWN0SWQsXHJcbiAgICAgICAgICAgICAgICBkYXRhOiBQYXJ0aWFsPElBc3NldD4sXHJcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uLFxyXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIGRyaXZlcnM6IElBc3NldERyaXZlcnMpIHtcclxuICAgICAgICBzdXBlcihpZCwgZGF0YSwgY29sbGVjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgdW5saW5rKCk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5kcml2ZXIuZGVsZXRlKHRoaXMpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRmFpbGVkIHRvIHVubGlua1wiLCBlcnJvcj8ubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IHRoaXMuY29sbGVjdGlvbi5kZWxldGVPbmUoe19pZDogdGhpcy5vaWR9KTtcclxuICAgICAgICByZXR1cm4gdGhpcy5pZDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzZXRNZXRhKG1ldGFkYXRhOiBQYXJ0aWFsPElBc3NldE1ldGE+KTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICBtZXRhZGF0YSA9IE9iamVjdC5hc3NpZ24odGhpcy5tZXRhZGF0YSwgbWV0YWRhdGEgfHwge30pO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuY29sbGVjdGlvbi51cGRhdGVPbmUoe19pZDogdGhpcy5vaWR9LCB7JHNldDoge21ldGFkYXRhfX0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEJ1ZmZlcigpOiBQcm9taXNlPEJ1ZmZlcj4ge1xyXG4gICAgICAgIHJldHVybiBzdHJlYW1Ub0J1ZmZlcih0aGlzLnN0cmVhbSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbW92ZShkcml2ZXJJZDogc3RyaW5nKTogUHJvbWlzZTxJQXNzZXQ+IHtcclxuICAgICAgICBjb25zdCBvbGREcml2ZXIgPSB0aGlzLmRyaXZlcjtcclxuICAgICAgICBjb25zdCB0YXJnZXREcml2ZXIgPSB0aGlzLmRyaXZlcnMuZ2V0RHJpdmVyKGRyaXZlcklkKTtcclxuICAgICAgICBpZiAodGFyZ2V0RHJpdmVyID09PSBvbGREcml2ZXIpIHJldHVybiB0aGlzO1xyXG4gICAgICAgIGNvbnN0IG9sZEFzc2V0ID0gbmV3IEFzc2V0KHRoaXMub2lkLCB0aGlzLmRhdGEsIHRoaXMuY29sbGVjdGlvbiwgdGhpcy5kcml2ZXJzKTtcclxuICAgICAgICBjb25zdCBzdHJlYW1JZCA9IGF3YWl0IHRoaXMudXBsb2FkVG8odGFyZ2V0RHJpdmVyKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSB7XHJcbiAgICAgICAgICAgIC4uLnRoaXMuZGF0YSxcclxuICAgICAgICAgICAgc3RyZWFtSWQsXHJcbiAgICAgICAgICAgIGRyaXZlcklkLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlKCk7XHJcbiAgICAgICAgYXdhaXQgb2xkRHJpdmVyLmRlbGV0ZShvbGRBc3NldCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHVwbG9hZFRvKGRyaXZlcjogSUFzc2V0RHJpdmVyKTogUHJvbWlzZTxPYmplY3RJZD4ge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHVwbG9hZGVyU3RyZWFtID0gZHJpdmVyLm9wZW5VcGxvYWRTdHJlYW0odGhpcy5maWxlbmFtZSwge1xyXG4gICAgICAgICAgICAgICAgY2h1bmtTaXplQnl0ZXM6IDEwNDg1NzYsXHJcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogdGhpcy5jb250ZW50VHlwZSxcclxuICAgICAgICAgICAgICAgIGV4dGVuc2lvbjogdGhpcy5tZXRhZGF0YS5leHRlbnNpb24sXHJcbiAgICAgICAgICAgICAgICBtZXRhZGF0YTogdGhpcy5tZXRhZGF0YSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuc3RyZWFtLnBpcGUodXBsb2FkZXJTdHJlYW0pXHJcbiAgICAgICAgICAgICAgICAub24oXCJlcnJvclwiLCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yLm1lc3NhZ2UgfHwgZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIC5vbihcImZpbmlzaFwiLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh1cGxvYWRlclN0cmVhbS5pZCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkb3dubG9hZChtZXRhZGF0YT86IElBc3NldE1ldGEpOiBQcm9taXNlPFJlYWRhYmxlPiB7XHJcbiAgICAgICAgbWV0YWRhdGEgPSBPYmplY3QuYXNzaWduKHRoaXMubWV0YWRhdGEsIG1ldGFkYXRhIHx8IHt9KTtcclxuICAgICAgICBtZXRhZGF0YS5kb3dubG9hZENvdW50ID0gaXNOYU4obWV0YWRhdGEuZG93bmxvYWRDb3VudCkgfHwgIW1ldGFkYXRhLmZpcnN0RG93bmxvYWRcclxuICAgICAgICAgICAgPyAxXHJcbiAgICAgICAgICAgIDogbWV0YWRhdGEuZG93bmxvYWRDb3VudCArIDE7XHJcbiAgICAgICAgbWV0YWRhdGEuZmlyc3REb3dubG9hZCA9IG1ldGFkYXRhLmZpcnN0RG93bmxvYWQgfHwgbmV3IERhdGUoKTtcclxuICAgICAgICBtZXRhZGF0YS5sYXN0RG93bmxvYWQgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuY29sbGVjdGlvbi51cGRhdGVPbmUoe19pZDogdGhpcy5vaWR9LCB7JHNldDoge21ldGFkYXRhfX0pO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN0cmVhbTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRJbWFnZShwYXJhbXM6IElBc3NldEltYWdlUGFyYW1zID0gbnVsbCk6IFByb21pc2U8UmVhZGFibGU+IHtcclxuICAgICAgICByZXR1cm4gdG9JbWFnZSh0aGlzLnN0cmVhbSwgcGFyYW1zLCB0aGlzLm1ldGFkYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkb3dubG9hZEltYWdlKHBhcmFtcz86IElBc3NldEltYWdlUGFyYW1zLCBtZXRhZGF0YT86IElBc3NldE1ldGEpOiBQcm9taXNlPFJlYWRhYmxlPiB7XHJcbiAgICAgICAgcmV0dXJuIHRvSW1hZ2UoYXdhaXQgdGhpcy5kb3dubG9hZChtZXRhZGF0YSksIHBhcmFtcywgdGhpcy5tZXRhZGF0YSk7XHJcbiAgICB9XHJcbn1cclxuIl19