@stemy/backend 3.6.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/commands/fixtures-command.d.ts +9 -0
  2. package/commands/index.d.ts +2 -0
  3. package/common-types.d.ts +11 -6
  4. package/esm2020/commands/clear-command.mjs +17 -0
  5. package/esm2020/commands/fixtures-command.mjs +23 -0
  6. package/esm2020/commands/index.mjs +7 -0
  7. package/esm2020/common-types.mjs +21 -0
  8. package/esm2020/public_api.mjs +379 -0
  9. package/esm2020/requests/asset-image-params.mjs +53 -0
  10. package/esm2020/rest-controllers/assets.controller.mjs +126 -0
  11. package/esm2020/rest-controllers/auth.controller.mjs +46 -0
  12. package/esm2020/rest-controllers/gallery.controller.mjs +21 -0
  13. package/esm2020/rest-controllers/progresses.controller.mjs +29 -0
  14. package/esm2020/rest-controllers/terminal-styles.mjs +67 -0
  15. package/esm2020/rest-controllers/terminal.controller.mjs +125 -0
  16. package/esm2020/rest-middlewares/container.middleware.mjs +20 -0
  17. package/esm2020/rest-middlewares/error-handler.middleware.mjs +74 -0
  18. package/esm2020/rest-middlewares/language.middleware.mjs +18 -0
  19. package/esm2020/rest-middlewares/request-ended.middleware.mjs +23 -0
  20. package/esm2020/rest-middlewares/request-started.middleware.mjs +22 -0
  21. package/esm2020/services/asset-processor.mjs +90 -0
  22. package/esm2020/services/asset-resolver.mjs +31 -0
  23. package/esm2020/services/assets.mjs +140 -0
  24. package/esm2020/services/backend-provider.mjs +22 -0
  25. package/esm2020/services/cache-processor.mjs +16 -0
  26. package/esm2020/services/cache.mjs +62 -0
  27. package/{esm2015/services/configuration.js → esm2020/services/configuration.mjs} +3 -15
  28. package/esm2020/services/endpoint-provider.mjs +13 -0
  29. package/esm2020/services/entities/asset.mjs +43 -0
  30. package/esm2020/services/entities/base-entity.mjs +26 -0
  31. package/esm2020/services/entities/lazy-asset.mjs +73 -0
  32. package/esm2020/services/entities/progress.mjs +176 -0
  33. package/esm2020/services/entities/temp-asset.mjs +45 -0
  34. package/esm2020/services/fixtures.mjs +26 -0
  35. package/esm2020/services/gallery-cache.mjs +27 -0
  36. package/esm2020/services/gallery-image.mjs +37 -0
  37. package/esm2020/services/gallery.mjs +116 -0
  38. package/esm2020/services/id-generator.mjs +42 -0
  39. package/esm2020/services/job-manager.mjs +187 -0
  40. package/esm2020/services/lazy-assets.mjs +48 -0
  41. package/esm2020/services/logger.mjs +21 -0
  42. package/esm2020/services/mail-sender.mjs +36 -0
  43. package/esm2020/services/memory-cache.mjs +57 -0
  44. package/esm2020/services/mongo-connector.mjs +37 -0
  45. package/esm2020/services/open-api.mjs +114 -0
  46. package/esm2020/services/progresses.mjs +86 -0
  47. package/esm2020/services/template-renderer.mjs +64 -0
  48. package/esm2020/services/terminal-manager.mjs +77 -0
  49. package/esm2020/services/token-generator.mjs +35 -0
  50. package/esm2020/services/translation-provider.mjs +34 -0
  51. package/esm2020/services/translator.mjs +63 -0
  52. package/esm2020/services/user-manager.mjs +27 -0
  53. package/esm2020/socket-controllers/progress.controller.mjs +52 -0
  54. package/esm2020/socket-controllers/terminal.controller.mjs +48 -0
  55. package/esm2020/socket-controllers/terminal.mjs +85 -0
  56. package/esm2020/socket-middlewares/compression.middleware.mjs +14 -0
  57. package/esm2020/static.mjs +23 -0
  58. package/esm2020/utilities/decorators.mjs +52 -0
  59. package/esm2020/utilities/di-container.mjs +83 -0
  60. package/esm2020/utilities/empty-job.mjs +13 -0
  61. package/esm2020/utilities/lazy-asset-generator.mjs +35 -0
  62. package/esm2020/utilities/mongoose.mjs +216 -0
  63. package/esm2020/utils.mjs +693 -0
  64. package/esm2020/validators.mjs +46 -0
  65. package/fesm2015/{stemy-backend.js → stemy-backend.mjs} +1638 -2403
  66. package/fesm2015/stemy-backend.mjs.map +1 -0
  67. package/fesm2020/stemy-backend.mjs +4202 -0
  68. package/fesm2020/stemy-backend.mjs.map +1 -0
  69. package/{stemy-backend.d.ts → index.d.ts} +1 -0
  70. package/package.json +35 -23
  71. package/public_api.d.ts +2 -2
  72. package/rest-controllers/terminal-styles.d.ts +2 -0
  73. package/rest-controllers/terminal.controller.d.ts +2 -0
  74. package/services/assets.d.ts +1 -0
  75. package/services/entities/asset.d.ts +1 -0
  76. package/services/entities/temp-asset.d.ts +1 -0
  77. package/services/fixtures.d.ts +2 -2
  78. package/utils.d.ts +3 -0
  79. package/bundles/stemy-backend.umd.js +0 -7553
  80. package/bundles/stemy-backend.umd.js.map +0 -1
  81. package/esm2015/common-types.js +0 -20
  82. package/esm2015/public_api.js +0 -380
  83. package/esm2015/requests/asset-image-params.js +0 -70
  84. package/esm2015/rest-controllers/assets.controller.js +0 -180
  85. package/esm2015/rest-controllers/auth.controller.js +0 -76
  86. package/esm2015/rest-controllers/gallery.controller.js +0 -37
  87. package/esm2015/rest-controllers/progresses.controller.js +0 -57
  88. package/esm2015/rest-controllers/terminal.controller.js +0 -151
  89. package/esm2015/rest-middlewares/container.middleware.js +0 -32
  90. package/esm2015/rest-middlewares/error-handler.middleware.js +0 -99
  91. package/esm2015/rest-middlewares/language.middleware.js +0 -28
  92. package/esm2015/rest-middlewares/request-ended.middleware.js +0 -33
  93. package/esm2015/rest-middlewares/request-started.middleware.js +0 -32
  94. package/esm2015/rest-openapi.js +0 -44
  95. package/esm2015/services/asset-processor.js +0 -108
  96. package/esm2015/services/asset-resolver.js +0 -53
  97. package/esm2015/services/assets.js +0 -181
  98. package/esm2015/services/backend-provider.js +0 -32
  99. package/esm2015/services/cache-processor.js +0 -34
  100. package/esm2015/services/cache.js +0 -93
  101. package/esm2015/services/endpoint-provider.js +0 -29
  102. package/esm2015/services/entities/asset.js +0 -60
  103. package/esm2015/services/entities/base-entity.js +0 -37
  104. package/esm2015/services/entities/lazy-asset.js +0 -90
  105. package/esm2015/services/entities/progress.js +0 -213
  106. package/esm2015/services/entities/temp-asset.js +0 -64
  107. package/esm2015/services/fixtures.js +0 -45
  108. package/esm2015/services/gallery-cache.js +0 -36
  109. package/esm2015/services/gallery-image.js +0 -48
  110. package/esm2015/services/gallery.js +0 -138
  111. package/esm2015/services/id-generator.js +0 -63
  112. package/esm2015/services/job-manager.js +0 -221
  113. package/esm2015/services/lazy-assets.js +0 -83
  114. package/esm2015/services/logger.js +0 -31
  115. package/esm2015/services/mail-sender.js +0 -58
  116. package/esm2015/services/memory-cache.js +0 -84
  117. package/esm2015/services/mongo-connector.js +0 -58
  118. package/esm2015/services/open-api.js +0 -140
  119. package/esm2015/services/progresses.js +0 -118
  120. package/esm2015/services/template-renderer.js +0 -88
  121. package/esm2015/services/terminal-manager.js +0 -94
  122. package/esm2015/services/token-generator.js +0 -55
  123. package/esm2015/services/translation-provider.js +0 -54
  124. package/esm2015/services/translator.js +0 -84
  125. package/esm2015/services/user-manager.js +0 -47
  126. package/esm2015/socket-controllers/progress.controller.js +0 -82
  127. package/esm2015/socket-controllers/terminal.controller.js +0 -83
  128. package/esm2015/socket-controllers/terminal.js +0 -98
  129. package/esm2015/socket-middlewares/compression.middleware.js +0 -19
  130. package/esm2015/static.js +0 -33
  131. package/esm2015/utilities/clear-command.js +0 -33
  132. package/esm2015/utilities/decorators.js +0 -54
  133. package/esm2015/utilities/di-container.js +0 -84
  134. package/esm2015/utilities/empty-job.js +0 -29
  135. package/esm2015/utilities/lazy-asset-generator.js +0 -46
  136. package/esm2015/utilities/mongoose.js +0 -225
  137. package/esm2015/utils.js +0 -699
  138. package/esm2015/validators.js +0 -51
  139. package/fesm2015/stemy-backend.js.map +0 -1
  140. package/rest-openapi.d.ts +0 -3
  141. package/stemy-backend.metadata.json +0 -1
  142. /package/{utilities → commands}/clear-command.d.ts +0 -0
  143. /package/{esm2015/stemy-backend.js → esm2020/stemy-backend.mjs} +0 -0
  144. /package/{esm2015/utilities/base-doc.js → esm2020/utilities/base-doc.mjs} +0 -0
  145. /package/{esm2015/utilities/tree.js → esm2020/utilities/tree.mjs} +0 -0
@@ -0,0 +1,85 @@
1
+ import { BehaviorSubject, Subject } from "rxjs";
2
+ import { first, map, timeout } from "rxjs/operators";
3
+ import { fileTypeFromBuffer } from "../utils";
4
+ export class Terminal {
5
+ constructor(client) {
6
+ this.client = client;
7
+ this.addons = [];
8
+ this.files$ = new BehaviorSubject([]);
9
+ this.input$ = new Subject();
10
+ }
11
+ onData(cb) {
12
+ const sub = this.input$.pipe(map(v => {
13
+ if (v === "\b") {
14
+ return "\x7f";
15
+ }
16
+ return v;
17
+ })).subscribe(cb);
18
+ return {
19
+ dispose: () => sub.unsubscribe()
20
+ };
21
+ }
22
+ write(data) {
23
+ this.client.emit("terminal-data", data);
24
+ }
25
+ writeln(data) {
26
+ this.write(data + "\n");
27
+ }
28
+ loadAddon(addon) {
29
+ addon.activate(this);
30
+ this.addons.push(addon);
31
+ }
32
+ dispose() {
33
+ this.input$.complete();
34
+ this.client = null;
35
+ this.addons.forEach(a => a.dispose());
36
+ }
37
+ async suggestFiles(accept) {
38
+ const rand = Math.round(Math.random() * 1000);
39
+ const id = `${Date.now()}-${rand}`;
40
+ const files = this.files$.value;
41
+ return files.filter(f => f.accept === accept).concat([
42
+ {
43
+ id,
44
+ label: "...",
45
+ onAccept: async () => {
46
+ this.client.emit("terminal-upload", {
47
+ id,
48
+ accept
49
+ });
50
+ const file = await this.files$
51
+ .pipe(first(v => v.some(f => f.id === id)))
52
+ .pipe(timeout(120000))
53
+ .pipe(map(v => v.find(f => f.id === id)))
54
+ .toPromise();
55
+ if (file.error) {
56
+ this.files$.next(this.files$.value.filter(f => f.id !== id));
57
+ throw new Error(file.error);
58
+ }
59
+ return file;
60
+ },
61
+ showAlways: true,
62
+ accept: accept,
63
+ }
64
+ ]);
65
+ }
66
+ async downloadFile(filename, buffer) {
67
+ const type = await fileTypeFromBuffer(buffer);
68
+ const data = buffer.toString("base64");
69
+ const content = `data:${type.mime};base64,${data}`;
70
+ this.client.emit("terminal-download", {
71
+ filename,
72
+ content
73
+ });
74
+ }
75
+ addFile(upload) {
76
+ if (upload.content) {
77
+ upload.buffer = Buffer.from(upload.content, "base64");
78
+ }
79
+ this.files$.next(this.files$.value.concat(upload));
80
+ }
81
+ input(data) {
82
+ this.input$.next(data);
83
+ }
84
+ }
85
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVybWluYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc29ja2V0LWNvbnRyb2xsZXJzL3Rlcm1pbmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxlQUFlLEVBQUUsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzlDLE9BQU8sRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBR25ELE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUU1QyxNQUFNLE9BQU8sUUFBUTtJQUtqQixZQUFzQixNQUFxQjtRQUFyQixXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQ3ZDLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxNQUFNLENBQUMsRUFBeUI7UUFDNUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDWixPQUFPLE1BQU0sQ0FBQzthQUNqQjtZQUNELE9BQU8sQ0FBQyxDQUFDO1FBQ2IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEIsT0FBTztZQUNILE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFO1NBQ25DLENBQUM7SUFDTixDQUFDO0lBRUQsS0FBSyxDQUFDLElBQVk7UUFDZCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJ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SUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQ2xDLFFBQVE7WUFDUixPQUFPO1NBQ1YsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELE9BQU8sQ0FBQyxNQUFxQjtRQUN6QixJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUU7WUFDaEIsTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FDekQ7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQVk7UUFDZCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgU3ViamVjdH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHtmaXJzdCwgbWFwLCB0aW1lb3V0fSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuaW1wb3J0IHtJRGlzcG9zYWJsZSwgSVN1Z2dlc3Rpb24sIElUZXJtaW5hbEFkZG9ufSBmcm9tIFwiQHN0ZW15L3Rlcm1pbmFsLWNvbW1hbmRzLWFkZG9uXCI7XHJcbmltcG9ydCB7SUNsaWVudFNvY2tldCwgSVRlcm1pbmFsLCBJVGVybWluYWxGaWxlfSBmcm9tIFwiLi4vY29tbW9uLXR5cGVzXCI7XHJcbmltcG9ydCB7ZmlsZVR5cGVGcm9tQnVmZmVyfSBmcm9tIFwiLi4vdXRpbHNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUZXJtaW5hbCBpbXBsZW1lbnRzIElUZXJtaW5hbCB7XHJcbiAgICBwcm90ZWN0ZWQgYWRkb25zOiBJVGVybWluYWxBZGRvbltdO1xyXG4gICAgcHJvdGVjdGVkIGZpbGVzJDogQmVoYXZpb3JTdWJqZWN0PElUZXJtaW5hbEZpbGVbXT47XHJcbiAgICBwcm90ZWN0ZWQgaW5wdXQkOiBTdWJqZWN0PHN0cmluZz47XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIGNsaWVudDogSUNsaWVudFNvY2tldCkge1xyXG4gICAgICAgIHRoaXMuYWRkb25zID0gW107XHJcbiAgICAgICAgdGhpcy5maWxlcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KFtdKTtcclxuICAgICAgICB0aGlzLmlucHV0JCA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25EYXRhKGNiOiAoZGF0YTogc3RyaW5nKSA9PiBhbnkpOiBJRGlzcG9zYWJsZSB7XHJcbiAgICAgICAgY29uc3Qgc3ViID0gdGhpcy5pbnB1dCQucGlwZShtYXAodiA9PiB7XHJcbiAgICAgICAgICAgIGlmICh2ID09PSBcIlxcYlwiKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcXHg3ZlwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB2O1xyXG4gICAgICAgIH0pKS5zdWJzY3JpYmUoY2IpO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHN1Yi51bnN1YnNjcmliZSgpXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICB3cml0ZShkYXRhOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmNsaWVudC5lbWl0KFwidGVybWluYWwtZGF0YVwiLCBkYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICB3cml0ZWxuKGRhdGE6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMud3JpdGUoZGF0YSArIFwiXFxuXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGxvYWRBZGRvbihhZGRvbjogSVRlcm1pbmFsQWRkb24pIHtcclxuICAgICAgICBhZGRvbi5hY3RpdmF0ZSh0aGlzKTtcclxuICAgICAgICB0aGlzLmFkZG9ucy5wdXNoKGFkZG9uKTtcclxuICAgIH1cclxuXHJcbiAgICBkaXNwb3NlKCkge1xyXG4gICAgICAgIHRoaXMuaW5wdXQkLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgdGhpcy5jbGllbnQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuYWRkb25zLmZvckVhY2goYSA9PiBhLmRpc3Bvc2UoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc3VnZ2VzdEZpbGVzKGFjY2VwdDogc3RyaW5nKTogUHJvbWlzZTxJVGVybWluYWxGaWxlW10+IHtcclxuICAgICAgICBjb25zdCByYW5kID0gTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpICogMTAwMCk7XHJcbiAgICAgICAgY29uc3QgaWQgPSBgJHtEYXRlLm5vdygpfS0ke3JhbmR9YDtcclxuICAgICAgICBjb25zdCBmaWxlcyA9IHRoaXMuZmlsZXMkLnZhbHVlIGFzIElTdWdnZXN0aW9uW107XHJcbiAgICAgICAgcmV0dXJuIGZpbGVzLmZpbHRlcihmID0+IGYuYWNjZXB0ID09PSBhY2NlcHQpLmNvbmNhdChbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlkLFxyXG4gICAgICAgICAgICAgICAgbGFiZWw6IFwiLi4uXCIsXHJcbiAgICAgICAgICAgICAgICBvbkFjY2VwdDogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xpZW50LmVtaXQoXCJ0ZXJtaW5hbC11cGxvYWRcIiwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXB0XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IGF3YWl0IHRoaXMuZmlsZXMkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5waXBlKGZpcnN0KHYgPT4gdi5zb21lKGYgPT4gZi5pZCA9PT0gaWQpKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnBpcGUodGltZW91dCgxMjAwMDApKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAucGlwZShtYXAodiA9PiB2LmZpbmQoZiA9PiBmLmlkID09PSBpZCkpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUuZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maWxlcyQubmV4dCh0aGlzLmZpbGVzJC52YWx1ZS5maWx0ZXIoZiA9PiBmLmlkICE9PSBpZCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZmlsZS5lcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWxlO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHNob3dBbHdheXM6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBhY2NlcHQ6IGFjY2VwdCxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRvd25sb2FkRmlsZShmaWxlbmFtZTogc3RyaW5nLCBidWZmZXI6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGNvbnN0IHR5cGUgPSBhd2FpdCBmaWxlVHlwZUZyb21CdWZmZXIoYnVmZmVyKTtcclxuICAgICAgICBjb25zdCBkYXRhID0gYnVmZmVyLnRvU3RyaW5nKFwiYmFzZTY0XCIpO1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBgZGF0YToke3R5cGUubWltZX07YmFzZTY0LCR7ZGF0YX1gO1xyXG4gICAgICAgIHRoaXMuY2xpZW50LmVtaXQoXCJ0ZXJtaW5hbC1kb3dubG9hZFwiLCB7XHJcbiAgICAgICAgICAgIGZpbGVuYW1lLFxyXG4gICAgICAgICAgICBjb250ZW50XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkRmlsZSh1cGxvYWQ6IElUZXJtaW5hbEZpbGUpIHtcclxuICAgICAgICBpZiAodXBsb2FkLmNvbnRlbnQpIHtcclxuICAgICAgICAgICAgdXBsb2FkLmJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHVwbG9hZC5jb250ZW50LCBcImJhc2U2NFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5maWxlcyQubmV4dCh0aGlzLmZpbGVzJC52YWx1ZS5jb25jYXQodXBsb2FkKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5wdXQoZGF0YTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5pbnB1dCQubmV4dChkYXRhKTtcclxuICAgIH1cclxufVxyXG4iXX0=
@@ -0,0 +1,14 @@
1
+ import { __decorate } from "tslib";
2
+ import { injectable } from "tsyringe";
3
+ import { Middleware } from "socket-controllers";
4
+ let CompressionMiddleware = class CompressionMiddleware {
5
+ use(socket, next) {
6
+ next();
7
+ }
8
+ };
9
+ CompressionMiddleware = __decorate([
10
+ injectable(),
11
+ Middleware()
12
+ ], CompressionMiddleware);
13
+ export { CompressionMiddleware };
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcHJlc3Npb24ubWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zb2NrZXQtbWlkZGxld2FyZXMvY29tcHJlc3Npb24ubWlkZGxld2FyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNwQyxPQUFPLEVBQUMsVUFBVSxFQUFzQixNQUFNLG9CQUFvQixDQUFDO0FBSTVELElBQU0scUJBQXFCLEdBQTNCLE1BQU0scUJBQXFCO0lBRTlCLEdBQUcsQ0FBQyxNQUFXLEVBQUUsSUFBd0I7UUFDckMsSUFBSSxFQUFFLENBQUM7SUFDWCxDQUFDO0NBQ0osQ0FBQTtBQUxZLHFCQUFxQjtJQUZqQyxVQUFVLEVBQUU7SUFDWixVQUFVLEVBQUU7R0FDQSxxQkFBcUIsQ0FLakM7U0FMWSxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2luamVjdGFibGV9IGZyb20gXCJ0c3lyaW5nZVwiO1xyXG5pbXBvcnQge01pZGRsZXdhcmUsIE1pZGRsZXdhcmVJbnRlcmZhY2V9IGZyb20gXCJzb2NrZXQtY29udHJvbGxlcnNcIjtcclxuXHJcbkBpbmplY3RhYmxlKClcclxuQE1pZGRsZXdhcmUoKVxyXG5leHBvcnQgY2xhc3MgQ29tcHJlc3Npb25NaWRkbGV3YXJlIGltcGxlbWVudHMgTWlkZGxld2FyZUludGVyZmFjZSB7XHJcblxyXG4gICAgdXNlKHNvY2tldDogYW55LCBuZXh0OiAoZXJyPzogYW55KSA9PiBhbnkpIHtcclxuICAgICAgICBuZXh0KCk7XHJcbiAgICB9XHJcbn1cclxuIl19
@@ -0,0 +1,23 @@
1
+ import { existsSync } from "fs";
2
+ import { resolve } from "path";
3
+ import { static as serveStatic } from "express";
4
+ import { EXPRESS } from "./common-types";
5
+ import { EndpointProvider } from "./services/endpoint-provider";
6
+ import { getDirName } from "./utils";
7
+ export async function setupStatic(rootFolder, container) {
8
+ const browserFolder = resolve(rootFolder || getDirName(), `public_html`);
9
+ const app = container.get(EXPRESS);
10
+ const ep = container.get(EndpointProvider);
11
+ console.log(browserFolder, existsSync(browserFolder));
12
+ if (existsSync(browserFolder)) {
13
+ console.log(`public_html exists. setting up static files serving...`);
14
+ app.use(serveStatic(browserFolder, {
15
+ maxAge: "1y"
16
+ }));
17
+ }
18
+ else {
19
+ console.log(`public_html does not exist on path: "${browserFolder}"`);
20
+ }
21
+ await ep.configure(app);
22
+ }
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGljLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0YXRpYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sSUFBSSxDQUFDO0FBQzlCLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFDLE1BQU0sSUFBSSxXQUFXLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDOUMsT0FBTyxFQUFDLE9BQU8sRUFBdUIsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3RCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRW5DLE1BQU0sQ0FBQyxLQUFLLFVBQVUsV0FBVyxDQUFDLFVBQWtCLEVBQUUsU0FBK0I7SUFFakYsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLFVBQVUsSUFBSSxVQUFVLEVBQUUsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUN6RSxNQUFNLEdBQUcsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25DLE1BQU0sRUFBRSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUUzQyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUV0RCxJQUFJLFVBQVUsQ0FBQyxhQUFhLENBQUMsRUFBRTtRQUMzQixPQUFPLENBQUMsR0FBRyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7UUFDdEUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFO1lBQy9CLE1BQU0sRUFBRSxJQUFJO1NBQ2YsQ0FBQyxDQUFDLENBQUM7S0FDUDtTQUFNO1FBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQyx3Q0FBd0MsYUFBYSxHQUFHLENBQUMsQ0FBQztLQUN6RTtJQUVELE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtleGlzdHNTeW5jfSBmcm9tIFwiZnNcIjtcclxuaW1wb3J0IHtyZXNvbHZlfSBmcm9tIFwicGF0aFwiO1xyXG5pbXBvcnQge3N0YXRpYyBhcyBzZXJ2ZVN0YXRpY30gZnJvbSBcImV4cHJlc3NcIjtcclxuaW1wb3J0IHtFWFBSRVNTLCBJRGVwZW5kZW5jeUNvbnRhaW5lcn0gZnJvbSBcIi4vY29tbW9uLXR5cGVzXCI7XHJcbmltcG9ydCB7RW5kcG9pbnRQcm92aWRlcn0gZnJvbSBcIi4vc2VydmljZXMvZW5kcG9pbnQtcHJvdmlkZXJcIjtcclxuaW1wb3J0IHtnZXREaXJOYW1lfSBmcm9tIFwiLi91dGlsc1wiO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwU3RhdGljKHJvb3RGb2xkZXI6IHN0cmluZywgY29udGFpbmVyOiBJRGVwZW5kZW5jeUNvbnRhaW5lcik6IFByb21pc2U8YW55PiB7XHJcblxyXG4gICAgY29uc3QgYnJvd3NlckZvbGRlciA9IHJlc29sdmUocm9vdEZvbGRlciB8fCBnZXREaXJOYW1lKCksIGBwdWJsaWNfaHRtbGApO1xyXG4gICAgY29uc3QgYXBwID0gY29udGFpbmVyLmdldChFWFBSRVNTKTtcclxuICAgIGNvbnN0IGVwID0gY29udGFpbmVyLmdldChFbmRwb2ludFByb3ZpZGVyKTtcclxuXHJcbiAgICBjb25zb2xlLmxvZyhicm93c2VyRm9sZGVyLCBleGlzdHNTeW5jKGJyb3dzZXJGb2xkZXIpKTtcclxuXHJcbiAgICBpZiAoZXhpc3RzU3luYyhicm93c2VyRm9sZGVyKSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGBwdWJsaWNfaHRtbCBleGlzdHMuIHNldHRpbmcgdXAgc3RhdGljIGZpbGVzIHNlcnZpbmcuLi5gKTtcclxuICAgICAgICBhcHAudXNlKHNlcnZlU3RhdGljKGJyb3dzZXJGb2xkZXIsIHtcclxuICAgICAgICAgICAgbWF4QWdlOiBcIjF5XCJcclxuICAgICAgICB9KSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGBwdWJsaWNfaHRtbCBkb2VzIG5vdCBleGlzdCBvbiBwYXRoOiBcIiR7YnJvd3NlckZvbGRlcn1cImApO1xyXG4gICAgfVxyXG5cclxuICAgIGF3YWl0IGVwLmNvbmZpZ3VyZShhcHApO1xyXG59XHJcbiJdfQ==
@@ -0,0 +1,52 @@
1
+ import { getStatusCode, OpenAPI } from "routing-controllers-openapi";
2
+ export function IsDocumented(summary = null, paramDescriptions = {}) {
3
+ return OpenAPI(op => {
4
+ op.summary = summary || op.summary;
5
+ op.tags = ["Documented"].concat(op.tags || []);
6
+ op.parameters?.forEach(p => {
7
+ if (p.$ref)
8
+ return;
9
+ const schema = p;
10
+ schema.description = paramDescriptions[schema.name]
11
+ || schema.description
12
+ || `param.${op.operationId}.${schema.name}`.toLowerCase();
13
+ });
14
+ return op;
15
+ });
16
+ }
17
+ export function JsonResponse(description = "Success", statusCode = null) {
18
+ return OpenAPI((op, route) => {
19
+ const status = statusCode ?? getStatusCode(route) + "";
20
+ op.responses = op.responses || {};
21
+ op.responses[status] = {
22
+ description,
23
+ content: {
24
+ "application/json": {}
25
+ }
26
+ };
27
+ return op;
28
+ });
29
+ }
30
+ export function ResponseType(type, options = {}) {
31
+ return OpenAPI((op, route) => {
32
+ const contentType = "application/json";
33
+ const statusCode = options?.statusCode ?? getStatusCode(route) + "";
34
+ const reference = {
35
+ $ref: `#/components/schemas/${type.name}`,
36
+ };
37
+ const schema = options.isArray
38
+ ? { items: reference, type: "array" }
39
+ : reference;
40
+ op.responses = op.responses || {};
41
+ op.responses[statusCode] = {
42
+ description: options.description || "Success",
43
+ content: {
44
+ [contentType]: {
45
+ schema
46
+ }
47
+ }
48
+ };
49
+ return op;
50
+ });
51
+ }
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlsaXRpZXMvZGVjb3JhdG9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsYUFBYSxFQUFFLE9BQU8sRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBR25FLE1BQU0sVUFBVSxZQUFZLENBQUMsVUFBa0IsSUFBSSxFQUFFLG9CQUE4QyxFQUFFO0lBQ2pHLE9BQU8sT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQ2hCLEVBQUUsQ0FBQyxPQUFPLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUM7UUFDbkMsRUFBRSxDQUFDLElBQUksR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLEVBQUUsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxDQUFDLElBQUk7Z0JBQUUsT0FBTztZQUNuQixNQUFNLE1BQU0sR0FBRyxDQUFpQixDQUFDO1lBQ2pDLE1BQU0sQ0FBQyxXQUFXLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQzttQkFDNUMsTUFBTSxDQUFDLFdBQVc7bUJBQ2xCLFNBQVMsRUFBRSxDQUFDLFdBQVcsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbEUsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLEVBQUUsQ0FBQztJQUNkLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUVELE1BQU0sVUFBVSxZQUFZLENBQUMsY0FBc0IsU0FBUyxFQUFFLGFBQXFCLElBQUk7SUFDbkYsT0FBTyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDekIsTUFBTSxNQUFNLEdBQUcsVUFBVSxJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdkQsRUFBRSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztRQUNsQyxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHO1lBQ25CLFdBQVc7WUFDWCxPQUFPLEVBQUU7Z0JBQ0wsa0JBQWtCLEVBQUUsRUFBRTthQUN6QjtTQUNKLENBQUM7UUFDRixPQUFPLEVBQUUsQ0FBQztJQUNkLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQVFELE1BQU0sVUFBVSxZQUFZLENBQUMsSUFBYyxFQUFFLFVBQWdDLEVBQUU7SUFDM0UsT0FBTyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDekIsTUFBTSxXQUFXLEdBQUcsa0JBQWtCLENBQUM7UUFDdkMsTUFBTSxVQUFVLEdBQUcsT0FBTyxFQUFFLFVBQVUsSUFBSSxhQUFhLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3BFLE1BQU0sU0FBUyxHQUFvQjtZQUMvQixJQUFJLEVBQUUsd0JBQXdCLElBQUksQ0FBQyxJQUFJLEVBQUU7U0FDNUMsQ0FBQztRQUNGLE1BQU0sTUFBTSxHQUFpQixPQUFPLENBQUMsT0FBTztZQUN4QyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUU7WUFDckMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNoQixFQUFFLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDO1FBQ2xDLEVBQUUsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUc7WUFDdkIsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXLElBQUksU0FBUztZQUM3QyxPQUFPLEVBQUU7Z0JBQ0wsQ0FBQyxXQUFXLENBQUMsRUFBRTtvQkFDWCxNQUFNO2lCQUNUO2FBQ0o7U0FDSixDQUFDO1FBQ0YsT0FBTyxFQUFFLENBQUM7SUFDZCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2dldFN0YXR1c0NvZGUsIE9wZW5BUEl9IGZyb20gXCJyb3V0aW5nLWNvbnRyb2xsZXJzLW9wZW5hcGlcIjtcclxuaW1wb3J0IHtSZWZlcmVuY2VPYmplY3QsIFNjaGVtYU9iamVjdH0gZnJvbSBcIm9wZW5hcGkzLXRzXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gSXNEb2N1bWVudGVkKHN1bW1hcnk6IHN0cmluZyA9IG51bGwsIHBhcmFtRGVzY3JpcHRpb25zOiB7W25hbWU6IHN0cmluZ106IHN0cmluZ30gPSB7fSkge1xyXG4gICAgcmV0dXJuIE9wZW5BUEkob3AgPT4ge1xyXG4gICAgICAgIG9wLnN1bW1hcnkgPSBzdW1tYXJ5IHx8IG9wLnN1bW1hcnk7XHJcbiAgICAgICAgb3AudGFncyA9IFtcIkRvY3VtZW50ZWRcIl0uY29uY2F0KG9wLnRhZ3MgfHwgW10pO1xyXG4gICAgICAgIG9wLnBhcmFtZXRlcnM/LmZvckVhY2gocCA9PiB7XHJcbiAgICAgICAgICAgIGlmIChwLiRyZWYpIHJldHVybjtcclxuICAgICAgICAgICAgY29uc3Qgc2NoZW1hID0gcCBhcyBTY2hlbWFPYmplY3Q7XHJcbiAgICAgICAgICAgIHNjaGVtYS5kZXNjcmlwdGlvbiA9IHBhcmFtRGVzY3JpcHRpb25zW3NjaGVtYS5uYW1lXVxyXG4gICAgICAgICAgICAgICAgfHwgc2NoZW1hLmRlc2NyaXB0aW9uXHJcbiAgICAgICAgICAgICAgICB8fCBgcGFyYW0uJHtvcC5vcGVyYXRpb25JZH0uJHtzY2hlbWEubmFtZX1gLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIG9wO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBKc29uUmVzcG9uc2UoZGVzY3JpcHRpb246IHN0cmluZyA9IFwiU3VjY2Vzc1wiLCBzdGF0dXNDb2RlOiBudW1iZXIgPSBudWxsKSB7XHJcbiAgICByZXR1cm4gT3BlbkFQSSgob3AsIHJvdXRlKSA9PiB7XHJcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gc3RhdHVzQ29kZSA/PyBnZXRTdGF0dXNDb2RlKHJvdXRlKSArIFwiXCI7XHJcbiAgICAgICAgb3AucmVzcG9uc2VzID0gb3AucmVzcG9uc2VzIHx8IHt9O1xyXG4gICAgICAgIG9wLnJlc3BvbnNlc1tzdGF0dXNdID0ge1xyXG4gICAgICAgICAgICBkZXNjcmlwdGlvbixcclxuICAgICAgICAgICAgY29udGVudDoge1xyXG4gICAgICAgICAgICAgICAgXCJhcHBsaWNhdGlvbi9qc29uXCI6IHt9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBvcDtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElSZXNwb25zZVR5cGVPcHRpb25zIHtcclxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xyXG4gICAgc3RhdHVzQ29kZT86IG51bWJlcjtcclxuICAgIGlzQXJyYXk/OiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gUmVzcG9uc2VUeXBlKHR5cGU6IEZ1bmN0aW9uLCBvcHRpb25zOiBJUmVzcG9uc2VUeXBlT3B0aW9ucyA9IHt9KSB7XHJcbiAgICByZXR1cm4gT3BlbkFQSSgob3AsIHJvdXRlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcclxuICAgICAgICBjb25zdCBzdGF0dXNDb2RlID0gb3B0aW9ucz8uc3RhdHVzQ29kZSA/PyBnZXRTdGF0dXNDb2RlKHJvdXRlKSArIFwiXCI7XHJcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlOiBSZWZlcmVuY2VPYmplY3QgPSB7XHJcbiAgICAgICAgICAgICRyZWY6IGAjL2NvbXBvbmVudHMvc2NoZW1hcy8ke3R5cGUubmFtZX1gLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3Qgc2NoZW1hOiBTY2hlbWFPYmplY3QgPSBvcHRpb25zLmlzQXJyYXlcclxuICAgICAgICAgICAgPyB7IGl0ZW1zOiByZWZlcmVuY2UsIHR5cGU6IFwiYXJyYXlcIiB9XHJcbiAgICAgICAgICAgIDogcmVmZXJlbmNlO1xyXG4gICAgICAgIG9wLnJlc3BvbnNlcyA9IG9wLnJlc3BvbnNlcyB8fCB7fTtcclxuICAgICAgICBvcC5yZXNwb25zZXNbc3RhdHVzQ29kZV0gPSB7XHJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBvcHRpb25zLmRlc2NyaXB0aW9uIHx8IFwiU3VjY2Vzc1wiLFxyXG4gICAgICAgICAgICBjb250ZW50OiB7XHJcbiAgICAgICAgICAgICAgICBbY29udGVudFR5cGVdOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2NoZW1hXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBvcDtcclxuICAgIH0pO1xyXG59XHJcbiJdfQ==
@@ -0,0 +1,83 @@
1
+ import { isFactoryProvider } from "tsyringe";
2
+ import { Tree } from "./tree";
3
+ import { isString } from "../utils";
4
+ export class DiContainer {
5
+ constructor(container, parent = null) {
6
+ this.container = container;
7
+ this.parent = parent;
8
+ container["wrapperContainer"] = this;
9
+ this.tokens = [];
10
+ this.tokenSet = new Set();
11
+ this.root = new Tree(this, false, "");
12
+ }
13
+ get registeredTokens() {
14
+ return (this.parent?.registeredTokens || []).concat(this.tokens);
15
+ }
16
+ get tree() {
17
+ return this.root;
18
+ }
19
+ beforeResolution(token, callback, options) {
20
+ this.container.beforeResolution(token, callback, options);
21
+ }
22
+ afterResolution(token, callback, options) {
23
+ this.container.afterResolution(token, callback, options);
24
+ }
25
+ clearInstances() {
26
+ this.container.clearInstances();
27
+ }
28
+ createChildContainer() {
29
+ return new DiContainer(this.container.createChildContainer(), this);
30
+ }
31
+ isRegistered(token, recursive) {
32
+ return this.container.isRegistered(token, recursive);
33
+ }
34
+ register(token, provider, options) {
35
+ if (isFactoryProvider(provider)) {
36
+ this.container.register(token, {
37
+ useFactory: dc => {
38
+ return provider.useFactory(dc["wrapperContainer"]);
39
+ }
40
+ });
41
+ return this.addToken(token);
42
+ }
43
+ this.container.register(token, provider);
44
+ return this.addToken(token);
45
+ }
46
+ registerInstance(token, instance) {
47
+ this.container.registerInstance(token, instance);
48
+ return this.addToken(token);
49
+ }
50
+ registerSingleton(from, to) {
51
+ this.container.registerSingleton(from, to);
52
+ return this.addToken(from);
53
+ }
54
+ registerType(from, to) {
55
+ this.container.registerType(from, to);
56
+ return this.addToken(from);
57
+ }
58
+ reset() {
59
+ this.tokens = [];
60
+ this.tokenSet = new Set();
61
+ this.container.reset();
62
+ }
63
+ resolve(token) {
64
+ return this.container.resolve(token);
65
+ }
66
+ resolveAll(token) {
67
+ return this.container.resolveAll(token);
68
+ }
69
+ get(token) {
70
+ return this.container.resolve(token);
71
+ }
72
+ addToken(token) {
73
+ if (this.tokenSet.has(token))
74
+ return this;
75
+ this.tokenSet.add(token);
76
+ this.tokens.push(token);
77
+ if (isString(token)) {
78
+ this.root.addPath(token);
79
+ }
80
+ return this;
81
+ }
82
+ }
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGktY29udGFpbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxpdGllcy9kaS1jb250YWluZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUtILGlCQUFpQixFQUlwQixNQUFNLFVBQVUsQ0FBQztBQUVsQixPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFVbEMsTUFBTSxPQUFPLFdBQVc7SUFjcEIsWUFBc0IsU0FBOEIsRUFBVyxTQUErQixJQUFJO1FBQTVFLGNBQVMsR0FBVCxTQUFTLENBQXFCO1FBQVcsV0FBTSxHQUFOLE1BQU0sQ0FBNkI7UUFDOUYsU0FBUyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7UUFDMUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFqQkQsSUFBSSxnQkFBZ0I7UUFDaEIsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ0osT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ3JCLENBQUM7SUFhRCxnQkFBZ0IsQ0FBSSxLQUF3QixFQUFFLFFBQTZDLEVBQUUsT0FBa0M7UUFDM0gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRCxlQUFlLENB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Q0FBQztRQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUM1QjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBDbGFzc1Byb3ZpZGVyLFxyXG4gICAgRGVwZW5kZW5jeUNvbnRhaW5lcixcclxuICAgIEZyZXF1ZW5jeSxcclxuICAgIEluamVjdGlvblRva2VuLFxyXG4gICAgaXNGYWN0b3J5UHJvdmlkZXIsXHJcbiAgICBSZWdpc3RyYXRpb25PcHRpb25zLFxyXG4gICAgVG9rZW5Qcm92aWRlcixcclxuICAgIFZhbHVlUHJvdmlkZXJcclxufSBmcm9tIFwidHN5cmluZ2VcIjtcclxuaW1wb3J0IHtGYWN0b3J5UHJvdmlkZXIsIElEZXBlbmRlbmN5Q29udGFpbmVyLCBJVHJlZSwgVHlwZX0gZnJvbSBcIi4uL2NvbW1vbi10eXBlc1wiO1xyXG5pbXBvcnQge1RyZWV9IGZyb20gXCIuL3RyZWVcIjtcclxuaW1wb3J0IHtpc1N0cmluZ30gZnJvbSBcIi4uL3V0aWxzXCI7XHJcblxyXG5pbnRlcmZhY2UgUHJlUmVzb2x1dGlvbkludGVyY2VwdG9yQ2FsbGJhY2s8VCA9IGFueT4ge1xyXG4gICAgKHRva2VuOiBJbmplY3Rpb25Ub2tlbjxUPiwgcmVzb2x1dGlvblR5cGU6IFwiU2luZ2xlXCIgfCBcIkFsbFwiKTogdm9pZDtcclxufVxyXG5cclxuaW50ZXJmYWNlIFBvc3RSZXNvbHV0aW9uSW50ZXJjZXB0b3JDYWxsYmFjazxUID0gYW55PiB7XHJcbiAgICAodG9rZW46IEluamVjdGlvblRva2VuPFQ+LCByZXN1bHQ6IFQgfCBUW10sIHJlc29sdXRpb25UeXBlOiBcIlNpbmdsZVwiIHwgXCJBbGxcIik6IHZvaWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBEaUNvbnRhaW5lciBpbXBsZW1lbnRzIElEZXBlbmRlbmN5Q29udGFpbmVyIHtcclxuXHJcbiAgICBnZXQgcmVnaXN0ZXJlZFRva2VucygpOiBSZWFkb25seUFycmF5PEluamVjdGlvblRva2VuPiB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLnBhcmVudD8ucmVnaXN0ZXJlZFRva2VucyB8fCBbXSkuY29uY2F0KHRoaXMudG9rZW5zKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgdHJlZSgpOiBJVHJlZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucm9vdDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgdG9rZW5zOiBBcnJheTxJbmplY3Rpb25Ub2tlbj47XHJcbiAgICBwcm90ZWN0ZWQgdG9rZW5TZXQ6IFNldDxJbmplY3Rpb25Ub2tlbj47XHJcbiAgICBwcm90ZWN0ZWQgcm9vdDogVHJlZTtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgY29udGFpbmVyOiBEZXBlbmRlbmN5Q29udGFpbmVyLCByZWFkb25seSBwYXJlbnQ6IElEZXBlbmRlbmN5Q29udGFpbmVyID0gbnVsbCkge1xyXG4gICAgICAgIGNvbnRhaW5lcltcIndyYXBwZXJDb250YWluZXJcIl0gPSB0aGlzO1xyXG4gICAgICAgIHRoaXMudG9rZW5zID0gW107XHJcbiAgICAgICAgdGhpcy50b2tlblNldCA9IG5ldyBTZXQ8SW5qZWN0aW9uVG9rZW4+KCk7XHJcbiAgICAgICAgdGhpcy5yb290ID0gbmV3IFRyZWUodGhpcywgZmFsc2UsIFwiXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGJlZm9yZVJlc29sdXRpb248VD4odG9rZW46IEluamVjdGlvblRva2VuPFQ+LCBjYWxsYmFjazogUHJlUmVzb2x1dGlvbkludGVyY2VwdG9yQ2FsbGJhY2s8VD4sIG9wdGlvbnM/OiB7IGZyZXF1ZW5jeTogRnJlcXVlbmN5IH0pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lci5iZWZvcmVSZXNvbHV0aW9uKHRva2VuLCBjYWxsYmFjaywgb3B0aW9ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgYWZ0ZXJSZXNvbHV0aW9uPFQ+KHRva2VuOiBJbmplY3Rpb25Ub2tlbjxUPiwgY2FsbGJhY2s6IFBvc3RSZXNvbHV0aW9uSW50ZXJjZXB0b3JDYWxsYmFjazxUPiwgb3B0aW9ucz86IHsgZnJlcXVlbmN5OiBGcmVxdWVuY3kgfSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyLmFmdGVyUmVzb2x1dGlvbih0b2tlbiwgY2FsbGJhY2ssIG9wdGlvbnMpO1xyXG4gICAgfVxyXG5cclxuICAgIGNsZWFySW5zdGFuY2VzKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyLmNsZWFySW5zdGFuY2VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlQ2hpbGRDb250YWluZXIoKTogSURlcGVuZGVuY3lDb250YWluZXIge1xyXG4gICAgICAgIHJldHVybiBuZXcgRGlDb250YWluZXIodGhpcy5jb250YWluZXIuY3JlYXRlQ2hpbGRDb250YWluZXIoKSwgdGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgaXNSZWdpc3RlcmVkPFQ+KHRva2VuOiBJbmplY3Rpb25Ub2tlbjxUPiwgcmVjdXJzaXZlPzogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lci5pc1JlZ2lzdGVyZWQodG9rZW4sIHJlY3Vyc2l2ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVnaXN0ZXI8VD4odG9rZW46IEluamVjdGlvblRva2VuPFQ+LCBwcm92aWRlcjogVmFsdWVQcm92aWRlcjxUPik6IElEZXBlbmRlbmN5Q29udGFpbmVyO1xyXG4gICAgcmVnaXN0ZXI8VD4odG9rZW46IEluamVjdGlvblRva2VuPFQ+LCBwcm92aWRlcjogRmFjdG9yeVByb3ZpZGVyPFQ+KTogSURlcGVuZGVuY3lDb250YWluZXI7XHJcbiAgICByZWdpc3RlcjxUPih0b2tlbjogSW5qZWN0aW9uVG9rZW48VD4sIHByb3ZpZGVyOiBUb2tlblByb3ZpZGVyPFQ+LCBvcHRpb25zPzogUmVnaXN0cmF0aW9uT3B0aW9ucyk6IElEZXBlbmRlbmN5Q29udGFpbmVyO1xyXG4gICAgcmVnaXN0ZXI8VD4odG9rZW46IEluamVjdGlvblRva2VuPFQ+LCBwcm92aWRlcjogQ2xhc3NQcm92aWRlcjxUPiwgb3B0aW9ucz86IFJlZ2lzdHJhdGlvbk9wdGlvbnMpOiBJRGVwZW5kZW5jeUNvbnRhaW5lcjtcclxuICAgIHJlZ2lzdGVyPFQ+KHRva2VuOiBJbmplY3Rpb25Ub2tlbjxUPiwgcHJvdmlkZXI6IFR5cGU8VD4sIG9wdGlvbnM/OiBSZWdpc3RyYXRpb25PcHRpb25zKTogSURlcGVuZGVuY3lDb250YWluZXI7XHJcbiAgICByZWdpc3Rlcih0b2tlbiwgcHJvdmlkZXIsIG9wdGlvbnM/OiBSZWdpc3RyYXRpb25PcHRpb25zKTogSURlcGVuZGVuY3lDb250YWluZXIge1xyXG4gICAgICAgIGlmIChpc0ZhY3RvcnlQcm92aWRlcihwcm92aWRlcikpIHtcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIucmVnaXN0ZXIodG9rZW4sIHtcclxuICAgICAgICAgICAgICAgIHVzZUZhY3Rvcnk6IGRjID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXIudXNlRmFjdG9yeShkY1tcIndyYXBwZXJDb250YWluZXJcIl0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWRkVG9rZW4odG9rZW4pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNvbnRhaW5lci5yZWdpc3Rlcih0b2tlbiwgcHJvdmlkZXIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFkZFRva2VuKHRva2VuKTtcclxuICAgIH1cclxuXHJcbiAgICByZWdpc3Rlckluc3RhbmNlPFQ+KHRva2VuOiBJbmplY3Rpb25Ub2tlbjxUPiwgaW5zdGFuY2U6IFQpOiBJRGVwZW5kZW5jeUNvbnRhaW5lciB7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXIucmVnaXN0ZXJJbnN0YW5jZSh0b2tlbiwgaW5zdGFuY2UpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFkZFRva2VuKHRva2VuKTtcclxuICAgIH1cclxuXHJcbiAgICByZWdpc3RlclNpbmdsZXRvbjxUPihmcm9tOiBJbmplY3Rpb25Ub2tlbjxUPiwgdG86IEluamVjdGlvblRva2VuPFQ+KTogSURlcGVuZGVuY3lDb250YWluZXI7XHJcbiAgICByZWdpc3RlclNpbmdsZXRvbjxUPih0b2tlbjogVHlwZTxUPik6IElEZXBlbmRlbmN5Q29udGFpbmVyO1xyXG4gICAgcmVnaXN0ZXJTaW5nbGV0b24oZnJvbSwgdG8/KTogSURlcGVuZGVuY3lDb250YWluZXIge1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyLnJlZ2lzdGVyU2luZ2xldG9uKGZyb20sIHRvKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5hZGRUb2tlbihmcm9tKTtcclxuICAgIH1cclxuXHJcbiAgICByZWdpc3RlclR5cGU8VD4oZnJvbTogSW5qZWN0aW9uVG9rZW48VD4sIHRvOiBJbmplY3Rpb25Ub2tlbjxUPik6IElEZXBlbmRlbmN5Q29udGFpbmVyIHtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lci5yZWdpc3RlclR5cGUoZnJvbSwgdG8pO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFkZFRva2VuKGZyb20pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc2V0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudG9rZW5zID0gW107XHJcbiAgICAgICAgdGhpcy50b2tlblNldCA9IG5ldyBTZXQ8SW5qZWN0aW9uVG9rZW4+KCk7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXIucmVzZXQoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXNvbHZlPFQ+KHRva2VuOiBJbmplY3Rpb25Ub2tlbjxUPik6IFQge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lci5yZXNvbHZlKHRva2VuKTtcclxuICAgIH1cclxuXHJcbiAgICByZXNvbHZlQWxsPFQ+KHRva2VuOiBJbmplY3Rpb25Ub2tlbjxUPik6IFRbXSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLnJlc29sdmVBbGwodG9rZW4pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldDxUPih0b2tlbjogSW5qZWN0aW9uVG9rZW48VD4pOiBUIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXIucmVzb2x2ZSh0b2tlbik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGFkZFRva2VuPFQ+KHRva2VuOiBJbmplY3Rpb25Ub2tlbjxUPik6IHRoaXMge1xyXG4gICAgICAgIGlmICh0aGlzLnRva2VuU2V0Lmhhcyh0b2tlbikpIHJldHVybiB0aGlzO1xyXG4gICAgICAgIHRoaXMudG9rZW5TZXQuYWRkKHRva2VuKTtcclxuICAgICAgICB0aGlzLnRva2Vucy5wdXNoKHRva2VuKTtcclxuICAgICAgICBpZiAoaXNTdHJpbmcodG9rZW4pKSB7XHJcbiAgICAgICAgICAgIHRoaXMucm9vdC5hZGRQYXRoKHRva2VuKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbn1cclxuIl19
@@ -0,0 +1,13 @@
1
+ import { __decorate } from "tslib";
2
+ import { injectable, Lifecycle, scoped } from "tsyringe";
3
+ let EmptyJob = class EmptyJob {
4
+ async process() {
5
+ return null;
6
+ }
7
+ };
8
+ EmptyJob = __decorate([
9
+ injectable(),
10
+ scoped(Lifecycle.ContainerScoped)
11
+ ], EmptyJob);
12
+ export { EmptyJob };
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1wdHktam9iLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxpdGllcy9lbXB0eS1qb2IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUtoRCxJQUFNLFFBQVEsR0FBZCxNQUFNLFFBQVE7SUFFakIsS0FBSyxDQUFDLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0NBQ0osQ0FBQTtBQUxZLFFBQVE7SUFGcEIsVUFBVSxFQUFFO0lBQ1osTUFBTSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUM7R0FDckIsUUFBUSxDQUtwQjtTQUxZLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2luamVjdGFibGUsIExpZmVjeWNsZSwgc2NvcGVkfSBmcm9tIFwidHN5cmluZ2VcIjtcclxuaW1wb3J0IHtJSm9ifSBmcm9tIFwiLi4vY29tbW9uLXR5cGVzXCI7XHJcblxyXG5AaW5qZWN0YWJsZSgpXHJcbkBzY29wZWQoTGlmZWN5Y2xlLkNvbnRhaW5lclNjb3BlZClcclxuZXhwb3J0IGNsYXNzIEVtcHR5Sm9iIGltcGxlbWVudHMgSUpvYiB7XHJcblxyXG4gICAgYXN5bmMgcHJvY2VzcygpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,35 @@
1
+ export class LazyAssetGenerator {
2
+ constructor(assetResolver, progresses, lazyId) {
3
+ this.assetResolver = assetResolver;
4
+ this.progresses = progresses;
5
+ this.lazyId = lazyId;
6
+ }
7
+ get assets() {
8
+ return this.assetResolver.assets;
9
+ }
10
+ get lazyAssets() {
11
+ return this.assetResolver.lazyAssets;
12
+ }
13
+ async process(messaging) {
14
+ const lazyAsset = await this.lazyAssets.read(this.lazyId);
15
+ let progress = await this.progresses.get(lazyAsset.progressId);
16
+ if (!progress || progress.canceled)
17
+ return null;
18
+ progress.setMessageBridge(messaging);
19
+ try {
20
+ const asset = await this.generate(progress, messaging);
21
+ progress = await progress.load();
22
+ if (!progress || progress.canceled)
23
+ return null;
24
+ await lazyAsset.writeAsset(asset);
25
+ }
26
+ catch (e) {
27
+ await progress.setError(e.message || e);
28
+ throw e;
29
+ }
30
+ if (progress.remaining > 0) {
31
+ await progress.advance(progress.remaining);
32
+ }
33
+ }
34
+ }
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF6eS1hc3NldC1nZW5lcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbGl0aWVzL2xhenktYXNzZXQtZ2VuZXJhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU1BLE1BQU0sT0FBZ0Isa0JBQWtCO0lBVXBDLFlBQWdDLGFBQTRCLEVBQVksVUFBc0IsRUFBWSxNQUFjO1FBQXhGLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQVksZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUFZLFdBQU0sR0FBTixNQUFNLENBQVE7SUFDeEgsQ0FBQztJQVRELElBQUksTUFBTTtRQUNOLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7SUFDckMsQ0FBQztJQUVELElBQUksVUFBVTtRQUNWLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUM7SUFDekMsQ0FBQztJQU9ELEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBeUI7UUFDbkMsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUQsSUFBSSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsUUFBUTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ2hELFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyQyxJQUFJO1lBQ0EsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUN2RCxRQUFRLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsUUFBUTtnQkFBRSxPQUFPLElBQUksQ0FBQztZQUNoRCxNQUFNLFNBQVMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDckM7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNSLE1BQU0sUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLE1BQU0sQ0FBQyxDQUFDO1NBQ1g7UUFDRCxJQUFJLFFBQVEsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUFFO1lBQ3hCLE1BQU0sUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDOUM7SUFDTCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0lBc3NldCwgSUpvYiwgSU1lc3NhZ2VCcmlkZ2UsIElQcm9ncmVzc30gZnJvbSBcIi4uL2NvbW1vbi10eXBlc1wiO1xyXG5pbXBvcnQge0Fzc2V0c30gZnJvbSBcIi4uL3NlcnZpY2VzL2Fzc2V0c1wiO1xyXG5pbXBvcnQge0xhenlBc3NldHN9IGZyb20gXCIuLi9zZXJ2aWNlcy9sYXp5LWFzc2V0c1wiO1xyXG5pbXBvcnQge0Fzc2V0UmVzb2x2ZXJ9IGZyb20gXCIuLi9zZXJ2aWNlcy9hc3NldC1yZXNvbHZlclwiO1xyXG5pbXBvcnQge1Byb2dyZXNzZXN9IGZyb20gXCIuLi9zZXJ2aWNlcy9wcm9ncmVzc2VzXCI7XHJcblxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTGF6eUFzc2V0R2VuZXJhdG9yIGltcGxlbWVudHMgSUpvYiB7XHJcblxyXG4gICAgZ2V0IGFzc2V0cygpOiBBc3NldHMge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFzc2V0UmVzb2x2ZXIuYXNzZXRzO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBsYXp5QXNzZXRzKCk6IExhenlBc3NldHMge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFzc2V0UmVzb2x2ZXIubGF6eUFzc2V0cztcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocHJvdGVjdGVkIGFzc2V0UmVzb2x2ZXI6IEFzc2V0UmVzb2x2ZXIsIHByb3RlY3RlZCBwcm9ncmVzc2VzOiBQcm9ncmVzc2VzLCBwcm90ZWN0ZWQgbGF6eUlkOiBzdHJpbmcpIHtcclxuICAgIH1cclxuXHJcbiAgICBhYnN0cmFjdCBnZW5lcmF0ZShwcm9ncmVzczogSVByb2dyZXNzLCBtZXNzYWdpbmc/OiBJTWVzc2FnZUJyaWRnZSk6IFByb21pc2U8SUFzc2V0PjtcclxuXHJcbiAgICBhc3luYyBwcm9jZXNzKG1lc3NhZ2luZzogSU1lc3NhZ2VCcmlkZ2UpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIGNvbnN0IGxhenlBc3NldCA9IGF3YWl0IHRoaXMubGF6eUFzc2V0cy5yZWFkKHRoaXMubGF6eUlkKTtcclxuICAgICAgICBsZXQgcHJvZ3Jlc3MgPSBhd2FpdCB0aGlzLnByb2dyZXNzZXMuZ2V0KGxhenlBc3NldC5wcm9ncmVzc0lkKTtcclxuICAgICAgICBpZiAoIXByb2dyZXNzIHx8IHByb2dyZXNzLmNhbmNlbGVkKSByZXR1cm4gbnVsbDtcclxuICAgICAgICBwcm9ncmVzcy5zZXRNZXNzYWdlQnJpZGdlKG1lc3NhZ2luZyk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgYXNzZXQgPSBhd2FpdCB0aGlzLmdlbmVyYXRlKHByb2dyZXNzLCBtZXNzYWdpbmcpO1xyXG4gICAgICAgICAgICBwcm9ncmVzcyA9IGF3YWl0IHByb2dyZXNzLmxvYWQoKTtcclxuICAgICAgICAgICAgaWYgKCFwcm9ncmVzcyB8fCBwcm9ncmVzcy5jYW5jZWxlZCkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIGF3YWl0IGxhenlBc3NldC53cml0ZUFzc2V0KGFzc2V0KTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHByb2dyZXNzLnNldEVycm9yKGUubWVzc2FnZSB8fCBlKTtcclxuICAgICAgICAgICAgdGhyb3cgZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHByb2dyZXNzLnJlbWFpbmluZyA+IDApIHtcclxuICAgICAgICAgICAgYXdhaXQgcHJvZ3Jlc3MuYWR2YW5jZShwcm9ncmVzcy5yZW1haW5pbmcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=
@@ -0,0 +1,216 @@
1
+ import { model, Types } from "mongoose";
2
+ import { getValue as getMongoValue, setValue as setMongoValue } from "mongoose/lib/utils";
3
+ import { BadRequestError, createParamDecorator, HttpError } from "routing-controllers";
4
+ import { diContainers, isArray, isFunction, isObject, isString, valueToPromise } from "../utils";
5
+ const pluginsKey = "typegoose:plugins";
6
+ /**
7
+ * A mongoose/typegoose plugin to inject services from the main di container to a schema as virtuals
8
+ * @param schema
9
+ * @param services
10
+ */
11
+ export function injectServices(schema, services) {
12
+ const serviceMap = {};
13
+ if (!isObject(services)) {
14
+ throw new Error(`services object should be defined to inject services to schema!`);
15
+ }
16
+ Object.keys(services).forEach(prop => {
17
+ schema
18
+ .virtual(prop)
19
+ .get(() => {
20
+ const diContainer = diContainers.appContainer;
21
+ serviceMap[prop] = serviceMap[prop] || (!diContainer ? {} : diContainer.resolve(services[prop]));
22
+ return serviceMap[prop];
23
+ });
24
+ });
25
+ }
26
+ /**
27
+ * Decorates a property to inject a service with the help of the injectServices mongoose/typegoose plugin
28
+ * @param token optional InjectionToken to use
29
+ * @return PropertyDecorator
30
+ */
31
+ export function service(token) {
32
+ return (target, propertyKey) => {
33
+ const propertyType = Reflect.getOwnMetadata("design:type", target, propertyKey);
34
+ const plugins = Array.from(Reflect.getMetadata(pluginsKey, target.constructor) ?? []);
35
+ let plugin = plugins.find(t => t.mongoosePlugin === injectServices);
36
+ if (!plugin) {
37
+ plugin = { mongoosePlugin: injectServices, options: {} };
38
+ plugins.push(plugin);
39
+ }
40
+ plugin.options = Object.assign(plugin.options || {}, { [propertyKey]: token ?? propertyType });
41
+ Reflect.defineMetadata(pluginsKey, plugins, target.constructor);
42
+ };
43
+ }
44
+ /**
45
+ * Paginate using a typegoose model using a simple where query and pagination params
46
+ * @param model Typegoose model
47
+ * @param where Simple query to filter the results
48
+ * @param params Pagination params
49
+ */
50
+ export function paginate(model, where, params) {
51
+ return model.countDocuments(where).then(count => {
52
+ let query = model.find(where);
53
+ if (isString(params.sort)) {
54
+ query = query.sort(params.sort);
55
+ }
56
+ if (isArray(params.populate)) {
57
+ params.populate.forEach(field => {
58
+ query = query.populate(field);
59
+ });
60
+ }
61
+ return (params.limit > 0 ? query.skip(params.page * params.limit).limit(params.limit) : query).then(items => {
62
+ const meta = { total: count };
63
+ return { count, items, meta };
64
+ });
65
+ });
66
+ }
67
+ export function lookupStages(from, localField, as = null, foreignField = "_id", shouldUnwind = true) {
68
+ as = as || localField.replace("Id", "");
69
+ const stages = [
70
+ {
71
+ $lookup: {
72
+ from,
73
+ localField,
74
+ foreignField,
75
+ as
76
+ }
77
+ },
78
+ {
79
+ $unwind: {
80
+ path: `$${as}`,
81
+ preserveNullAndEmptyArrays: true
82
+ }
83
+ }
84
+ ];
85
+ if (!shouldUnwind) {
86
+ stages.splice(1, 1);
87
+ }
88
+ return stages;
89
+ }
90
+ export function letsLookupStage(from, pipeline, as = null, letFields = null) {
91
+ as = as || from;
92
+ letFields = letFields || { id: "$_id" };
93
+ return {
94
+ $lookup: {
95
+ from,
96
+ let: letFields,
97
+ pipeline,
98
+ as
99
+ }
100
+ };
101
+ }
102
+ export function matchStage(match) {
103
+ return { $match: match };
104
+ }
105
+ export function matchField(field, filter, when) {
106
+ return { field, filter, when };
107
+ }
108
+ export function matchFieldStages(...fields) {
109
+ const match = {};
110
+ fields.forEach(field => {
111
+ if (field.when) {
112
+ match[field.field] = field.filter;
113
+ }
114
+ });
115
+ return Object.keys(match).length > 0 ? [matchStage(match)] : [];
116
+ }
117
+ export function projectStage(fields) {
118
+ return { $project: fields };
119
+ }
120
+ export function unwindStage(fieldOrOpts) {
121
+ return { $unwind: fieldOrOpts };
122
+ }
123
+ export function hydratePopulated(modelType, json) {
124
+ let object = modelType.hydrate(json);
125
+ for (const [path, obj] of Object.entries(modelType.schema.obj)) {
126
+ let { ref, type } = obj;
127
+ if (Array.isArray(type) && type.length > 0) {
128
+ ref = type[0].ref;
129
+ }
130
+ if (!ref)
131
+ continue;
132
+ const value = getMongoValue(path, json);
133
+ const hydrateVal = val => {
134
+ if (val == null || val instanceof Types.ObjectId)
135
+ return val;
136
+ return hydratePopulated(model(ref), val);
137
+ };
138
+ if (Array.isArray(value)) {
139
+ setMongoValue(path, value.map(hydrateVal), object);
140
+ continue;
141
+ }
142
+ setMongoValue(path, hydrateVal(value), object);
143
+ }
144
+ return object;
145
+ }
146
+ export async function paginateAggregations(model, aggregations, params, metaProjection = {}) {
147
+ const sortField = !isString(params.sort) || !params.sort ? null : (params.sort.startsWith("-") ? params.sort.substr(1) : params.sort);
148
+ const sortAggregation = !sortField ? [] : [{
149
+ $sort: { [sortField]: sortField == params.sort ? 1 : -1 }
150
+ }];
151
+ const result = await model.aggregate([
152
+ ...aggregations,
153
+ ...sortAggregation,
154
+ {
155
+ $group: {
156
+ _id: "results",
157
+ result: { $push: "$$CURRENT" }
158
+ }
159
+ },
160
+ {
161
+ $project: {
162
+ _id: 0,
163
+ items: params.limit > 0 ? { $slice: ["$result", params.page * params.limit, params.limit] } : "$result",
164
+ count: { $size: "$result" },
165
+ meta: {
166
+ total: { $size: "$result" },
167
+ ...metaProjection
168
+ }
169
+ }
170
+ }
171
+ ]);
172
+ const pagination = result[0];
173
+ if (!pagination) {
174
+ return { items: [], count: 0, meta: { total: 0 } };
175
+ }
176
+ pagination.items = pagination.items.map(i => hydratePopulated(model, i));
177
+ return pagination;
178
+ }
179
+ export function ResolveEntity(model, extraCheck) {
180
+ const modelName = model.modelName;
181
+ const paramName = modelName.toLowerCase();
182
+ return createParamDecorator({
183
+ required: false,
184
+ value: async (action) => {
185
+ const req = action.request;
186
+ const token = req.header(`x-${paramName}-token`);
187
+ const id = req.params[`${paramName}Id`];
188
+ if (!id && !token) {
189
+ throw new BadRequestError(`${modelName} id or token should be defined!`);
190
+ }
191
+ const query = !token
192
+ ? model.findById(id)
193
+ : model.findOne({ token });
194
+ let doc = null;
195
+ if (isFunction(extraCheck)) {
196
+ try {
197
+ doc = await valueToPromise(extraCheck(query, action));
198
+ }
199
+ catch (e) {
200
+ throw new BadRequestError(`${modelName} check error: ${e.message || e}`);
201
+ }
202
+ }
203
+ else {
204
+ doc = await query;
205
+ }
206
+ if (!doc) {
207
+ throw new HttpError(404, !token
208
+ ? `${modelName} could not be found with id: ${id}`
209
+ : `${modelName} could not be found with token: ${token}`);
210
+ }
211
+ action.request[paramName] = doc;
212
+ return doc;
213
+ }
214
+ });
215
+ }
216
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9uZ29vc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbGl0aWVzL21vbmdvb3NlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBd0IsS0FBSyxFQUF1QyxLQUFLLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDbEcsT0FBTyxFQUFDLFFBQVEsSUFBSSxhQUFhLEVBQUUsUUFBUSxJQUFJLGFBQWEsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRXhGLE9BQU8sRUFBUyxlQUFlLEVBQUUsb0JBQW9CLEVBQUUsU0FBUyxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFZN0YsT0FBTyxFQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRS9GLE1BQU0sVUFBVSxHQUFHLG1CQUFtQixDQUFDO0FBT3ZDOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLE1BQW1CLEVBQUUsUUFBa0Q7SUFDbEcsTUFBTSxVQUFVLEdBQTRCLEVBQUUsQ0FBQztJQUMvQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1FBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsaUVBQWlFLENBQUMsQ0FBQTtLQUNyRjtJQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ2pDLE1BQU07YUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDO2FBQ2IsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNOLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUM7WUFDOUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFP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U0FBUyxpQkFBaUIsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUM1RTthQUNKO2lCQUFNO2dCQUNILEdBQUcsR0FBRyxNQUFNLEtBQUssQ0FBQzthQUNyQjtZQUNELElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQ04sTUFBTSxJQUFJLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLO29CQUMzQixDQUFDLENBQUMsR0FBRyxTQUFTLGdDQUFnQyxFQUFFLEVBQUU7b0JBQ2xELENBQUMsQ0FBQyxHQUFHLFNBQVMsbUNBQW1DLEtBQUssRUFBRSxDQUFDLENBQUM7YUFDakU7WUFDRCxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztZQUNoQyxPQUFPLEdBQUcsQ0FBQztRQUNmLENBQUM7S0FDSixDQUFDLENBQUM7QUFDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEb2N1bWVudCwgRmlsdGVyUXVlcnksIG1vZGVsLCBNb2RlbCwgUGlwZWxpbmVTdGFnZSwgUXVlcnksIFNjaGVtYSwgVHlwZXN9IGZyb20gXCJtb25nb29zZVwiO1xyXG5pbXBvcnQge2dldFZhbHVlIGFzIGdldE1vbmdvVmFsdWUsIHNldFZhbHVlIGFzIHNldE1vbmdvVmFsdWV9IGZyb20gXCJtb25nb29zZS9saWIvdXRpbHNcIjtcclxuaW1wb3J0IHtEb2N1bWVudFR5cGUsIFJldHVybk1vZGVsVHlwZX0gZnJvbSBcIkB0eXBlZ29vc2UvdHlwZWdvb3NlXCI7XHJcbmltcG9ydCB7QWN0aW9uLCBCYWRSZXF1ZXN0RXJyb3IsIGNyZWF0ZVBhcmFtRGVjb3JhdG9yLCBIdHRwRXJyb3J9IGZyb20gXCJyb3V0aW5nLWNvbnRyb2xsZXJzXCI7XHJcbmltcG9ydCB7SW5qZWN0aW9uVG9rZW59IGZyb20gXCJ0c3lyaW5nZVwiO1xyXG5pbXBvcnQge1xyXG4gICAgSU1hdGNoRmllbGQsXHJcbiAgICBJbmZlckdlbmVyaWMsXHJcbiAgICBJUGFnaW5hdGlvbkJhc2UsXHJcbiAgICBJUGFnaW5hdGlvblBhcmFtcyxcclxuICAgIElQcm9qZWN0T3B0aW9ucyxcclxuICAgIElSZXF1ZXN0LFxyXG4gICAgSVVud2luZE9wdGlvbnMsXHJcbiAgICBUeXBlXHJcbn0gZnJvbSBcIi4uL2NvbW1vbi10eXBlc1wiO1xyXG5pbXBvcnQge2RpQ29udGFpbmVycywgaXNBcnJheSwgaXNGdW5jdGlvbiwgaXNPYmplY3QsIGlzU3RyaW5nLCB2YWx1ZVRvUHJvbWlzZX0gZnJvbSBcIi4uL3V0aWxzXCI7XHJcblxyXG5jb25zdCBwbHVnaW5zS2V5ID0gXCJ0eXBlZ29vc2U6cGx1Z2luc1wiO1xyXG5cclxuaW50ZXJmYWNlIElQbHVnaW5XaXRoT3B0aW9ucyB7XHJcbiAgICBtb25nb29zZVBsdWdpbjogRnVuY3Rpb247XHJcbiAgICBvcHRpb25zOiBhbnk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIG1vbmdvb3NlL3R5cGVnb29zZSBwbHVnaW4gdG8gaW5qZWN0IHNlcnZpY2VzIGZyb20gdGhlIG1haW4gZGkgY29udGFpbmVyIHRvIGEgc2NoZW1hIGFzIHZpcnR1YWxzXHJcbiAqIEBwYXJhbSBzY2hlbWFcclxuICogQHBhcmFtIHNlcnZpY2VzXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0U2VydmljZXMoc2NoZW1hOiBTY2hlbWE8YW55Piwgc2VydmljZXM/OiB7IFtwcm9wOiBzdHJpbmddOiBJbmplY3Rpb25Ub2tlbjxhbnk+IH0pOiB2b2lkIHtcclxuICAgIGNvbnN0IHNlcnZpY2VNYXA6IHsgW3Byb3A6IHN0cmluZ106IGFueSB9ID0ge307XHJcbiAgICBpZiAoIWlzT2JqZWN0KHNlcnZpY2VzKSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgc2VydmljZXMgb2JqZWN0IHNob3VsZCBiZSBkZWZpbmVkIHRvIGluamVjdCBzZXJ2aWNlcyB0byBzY2hlbWEhYClcclxuICAgIH1cclxuICAgIE9iamVjdC5rZXlzKHNlcnZpY2VzKS5mb3JFYWNoKHByb3AgPT4ge1xyXG4gICAgICAgIHNjaGVtYVxyXG4gICAgICAgICAgICAudmlydHVhbChwcm9wKVxyXG4gICAgICAgICAgICAuZ2V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRpQ29udGFpbmVyID0gZGlDb250YWluZXJzLmFwcENvbnRhaW5lcjtcclxuICAgICAgICAgICAgICAgIHNlcnZpY2VNYXBbcHJvcF0gPSBzZXJ2aWNlTWFwW3Byb3BdIHx8ICghZGlDb250YWluZXIgPyB7fSA6IGRpQ29udGFpbmVyLnJlc29sdmUoc2VydmljZXNbcHJvcF0pKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlTWFwW3Byb3BdO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogRGVjb3JhdGVzIGEgcHJvcGVydHkgdG8gaW5qZWN0IGEgc2VydmljZSB3aXRoIHRoZSBoZWxwIG9mIHRoZSBpbmplY3RTZXJ2aWNlcyBtb25nb29zZS90eXBlZ29vc2UgcGx1Z2luXHJcbiAqIEBwYXJhbSB0b2tlbiBvcHRpb25hbCBJbmplY3Rpb25Ub2tlbiB0byB1c2VcclxuICogQHJldHVybiBQcm9wZXJ0eURlY29yYXRvclxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNlcnZpY2UodG9rZW4/OiBJbmplY3Rpb25Ub2tlbjxhbnk+KTogUHJvcGVydHlEZWNvcmF0b3Ige1xyXG4gICAgcmV0dXJuICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IHN0cmluZyk6IHZvaWQgPT4ge1xyXG4gICAgICAgIGNvbnN0IHByb3BlcnR5VHlwZSA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcclxuICAgICAgICBjb25zdCBwbHVnaW5zID0gQXJyYXkuZnJvbShSZWZsZWN0LmdldE1ldGFkYXRhKHBsdWdpbnNLZXksIHRhcmdldC5jb25zdHJ1Y3RvcikgPz8gW10pIGFzIElQbHVnaW5XaXRoT3B0aW9uc1tdO1xyXG4gICAgICAgIGxldCBwbHVnaW4gPSBwbHVnaW5zLmZpbmQodCA9PiB0Lm1vbmdvb3NlUGx1Z2luID09PSBpbmplY3RTZXJ2aWNlcyk7XHJcbiAgICAgICAgaWYgKCFwbHVnaW4pIHtcclxuICAgICAgICAgICAgcGx1Z2luID0geyBtb25nb29zZVBsdWdpbjogaW5qZWN0U2VydmljZXMsIG9wdGlvbnM6IHt9IH07XHJcbiAgICAgICAgICAgIHBsdWdpbnMucHVzaChwbHVnaW4pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBwbHVnaW4ub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24ocGx1Z2luLm9wdGlvbnMgfHwge30sIHtbcHJvcGVydHlLZXldOiB0b2tlbiA/PyBwcm9wZXJ0eVR5cGV9KTtcclxuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKHBsdWdpbnNLZXksIHBsdWdpbnMsIHRhcmdldC5jb25zdHJ1Y3Rvcik7XHJcbiAgICB9O1xyXG59XHJcblxyXG4vKipcclxuICogUGFnaW5hdGUgdXNpbmcgYSB0eXBlZ29vc2UgbW9kZWwgdXNpbmcgYSBzaW1wbGUgd2hlcmUgcXVlcnkgYW5kIHBhZ2luYXRpb24gcGFyYW1zXHJcbiAqIEBwYXJhbSBtb2RlbCBUeXBlZ29vc2UgbW9kZWxcclxuICogQHBhcmFtIHdoZXJlIFNpbXBsZSBxdWVyeSB0byBmaWx0ZXIgdGhlIHJlc3VsdHNcclxuICogQHBhcmFtIHBhcmFtcyBQYWdpbmF0aW9uIHBhcmFtc1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHBhZ2luYXRlPFQgZXh0ZW5kcyBUeXBlPGFueT4sIFUgPSBJbmZlckdlbmVyaWM8VD4+KG1vZGVsOiBSZXR1cm5Nb2RlbFR5cGU8VD4sIHdoZXJlOiBGaWx0ZXJRdWVyeTxEb2N1bWVudFR5cGU8VT4+LCBwYXJhbXM6IElQYWdpbmF0aW9uUGFyYW1zKTogUHJvbWlzZTxJUGFnaW5hdGlvbkJhc2U8RG9jdW1lbnRUeXBlPFU+Pj4ge1xyXG4gICAgcmV0dXJuIG1vZGVsLmNvdW50RG9jdW1lbnRzKHdoZXJlKS50aGVuKGNvdW50ID0+IHtcclxuICAgICAgICBsZXQgcXVlcnk6IFF1ZXJ5PGFueSwgYW55PiA9IG1vZGVsLmZpbmQod2hlcmUpO1xyXG4gICAgICAgIGlmIChpc1N0cmluZyhwYXJhbXMuc29ydCkpIHtcclxuICAgICAgICAgICAgcXVlcnkgPSBxdWVyeS5zb3J0KHBhcmFtcy5zb3J0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlzQXJyYXkocGFyYW1zLnBvcHVsYXRlKSkge1xyXG4gICAgICAgICAgICBwYXJhbXMucG9wdWxhdGUuZm9yRWFjaChmaWVsZCA9PiB7XHJcbiAgICAgICAgICAgICAgICBxdWVyeSA9IHF1ZXJ5LnBvcHVsYXRlKGZpZWxkKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAocGFyYW1zLmxpbWl0ID4gMCA/IHF1ZXJ5LnNraXAocGFyYW1zLnBhZ2UgKiBwYXJhbXMubGltaXQpLmxpbWl0KHBhcmFtcy5saW1pdCkgOiBxdWVyeSkudGhlbihpdGVtcyA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1ldGEgPSB7dG90YWw6IGNvdW50fTtcclxuICAgICAgICAgICAgcmV0dXJuIHtjb3VudCwgaXRlbXMsIG1ldGF9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBsb29rdXBTdGFnZXMoZnJvbTogc3RyaW5nLCBsb2NhbEZpZWxkOiBzdHJpbmcsIGFzOiBzdHJpbmcgPSBudWxsLCBmb3JlaWduRmllbGQ6IHN0cmluZyA9IFwiX2lkXCIsIHNob3VsZFVud2luZDogYm9vbGVhbiA9IHRydWUpOiBbUGlwZWxpbmVTdGFnZS5Mb29rdXAsIFBpcGVsaW5lU3RhZ2UuVW53aW5kXSB7XHJcbiAgICBhcyA9IGFzIHx8IGxvY2FsRmllbGQucmVwbGFjZShcIklkXCIsIFwiXCIpO1xyXG4gICAgY29uc3Qgc3RhZ2VzOiBbUGlwZWxpbmVTdGFnZS5Mb29rdXAsIFBpcGVsaW5lU3RhZ2UuVW53aW5kXSA9IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgICRsb29rdXA6IHtcclxuICAgICAgICAgICAgICAgIGZyb20sXHJcbiAgICAgICAgICAgICAgICBsb2NhbEZpZWxkLFxyXG4gICAgICAgICAgICAgICAgZm9yZWlnbkZpZWxkLFxyXG4gICAgICAgICAgICAgICAgYXNcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICAkdW53aW5kOiB7XHJcbiAgICAgICAgICAgICAgICBwYXRoOiBgJCR7YXN9YCxcclxuICAgICAgICAgICAgICAgIHByZXNlcnZlTnVsbEFuZEVtcHR5QXJyYXlzOiB0cnVlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICBdO1xyXG4gICAgaWYgKCFzaG91bGRVbndpbmQpIHtcclxuICAgICAgICBzdGFnZXMuc3BsaWNlKDEsIDEpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN0YWdlcztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGxldHNMb29rdXBTdGFnZShmcm9tOiBzdHJpbmcsIHBpcGVsaW5lOiBFeGNsdWRlPFBpcGVsaW5lU3RhZ2UsIFBpcGVsaW5lU3RhZ2UuTWVyZ2UgfCBQaXBlbGluZVN0YWdlLk91dCB8IFBpcGVsaW5lU3RhZ2UuU2VhcmNoPltdLCBhczogc3RyaW5nID0gbnVsbCwgbGV0RmllbGRzOiBhbnkgPSBudWxsKTogUGlwZWxpbmVTdGFnZS5Mb29rdXAge1xyXG4gICAgYXMgPSBhcyB8fCBmcm9tO1xyXG4gICAgbGV0RmllbGRzID0gbGV0RmllbGRzIHx8IHtpZDogXCIkX2lkXCJ9O1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICAkbG9va3VwOiB7XHJcbiAgICAgICAgICAgIGZyb20sXHJcbiAgICAgICAgICAgIGxldDogbGV0RmllbGRzLFxyXG4gICAgICAgICAgICBwaXBlbGluZSxcclxuICAgICAgICAgICAgYXNcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hTdGFnZShtYXRjaDogRmlsdGVyUXVlcnk8YW55Pik6IFBpcGVsaW5lU3RhZ2UuTWF0Y2gge1xyXG4gICAgcmV0dXJuIHskbWF0Y2g6IG1hdGNofTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoRmllbGQoZmllbGQ6IHN0cmluZywgZmlsdGVyOiBhbnksIHdoZW46IGJvb2xlYW4pOiBJTWF0Y2hGaWVsZCB7XHJcbiAgICByZXR1cm4ge2ZpZWxkLCBmaWx0ZXIsIHdoZW59O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hGaWVsZFN0YWdlcyguLi5maWVsZHM6IElNYXRjaEZpZWxkW10pOiBSZWFkb25seUFycmF5PFBpcGVsaW5lU3RhZ2UuTWF0Y2g+IHtcclxuICAgIGNvbnN0IG1hdGNoID0ge307XHJcbiAgICBmaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XHJcbiAgICAgICAgaWYgKGZpZWxkLndoZW4pIHtcclxuICAgICAgICAgICAgbWF0Y2hbZmllbGQuZmllbGRdID0gZmllbGQuZmlsdGVyO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG1hdGNoKS5sZW5ndGggPiAwID8gW21hdGNoU3RhZ2UobWF0Y2gpXSA6IFtdO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcHJvamVjdFN0YWdlKGZpZWxkczogSVByb2plY3RPcHRpb25zKTogUGlwZWxpbmVTdGFnZS5Qcm9qZWN0IHtcclxuICAgIHJldHVybiB7JHByb2plY3Q6IGZpZWxkc307XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1bndpbmRTdGFnZShmaWVsZE9yT3B0czogc3RyaW5nIHwgSVVud2luZE9wdGlvbnMpOiBQaXBlbGluZVN0YWdlLlVud2luZCB7XHJcbiAgICByZXR1cm4geyR1bndpbmQ6IGZpZWxkT3JPcHRzfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGh5ZHJhdGVQb3B1bGF0ZWQ8VCBleHRlbmRzIERvY3VtZW50Pihtb2RlbFR5cGU6IE1vZGVsPFQ+LCBqc29uOiBhbnkpOiBUIHtcclxuICAgIGxldCBvYmplY3QgPSBtb2RlbFR5cGUuaHlkcmF0ZShqc29uKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IFtwYXRoLCBvYmpdIG9mIE9iamVjdC5lbnRyaWVzKG1vZGVsVHlwZS5zY2hlbWEub2JqKSkge1xyXG4gICAgICAgIGxldCB7cmVmLCB0eXBlfSA9IG9iaiBhcyBhbnk7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodHlwZSkgJiYgdHlwZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHJlZiA9IHR5cGVbMF0ucmVmO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXJlZikgY29udGludWU7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRNb25nb1ZhbHVlKHBhdGgsIGpzb24pO1xyXG4gICAgICAgIGNvbnN0IGh5ZHJhdGVWYWwgPSB2YWwgPT4ge1xyXG4gICAgICAgICAgICBpZiAodmFsID09IG51bGwgfHwgdmFsIGluc3RhbmNlb2YgVHlwZXMuT2JqZWN0SWQpIHJldHVybiB2YWw7XHJcbiAgICAgICAgICAgIHJldHVybiBoeWRyYXRlUG9wdWxhdGVkKG1vZGVsKHJlZikgYXMgYW55LCB2YWwpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XHJcbiAgICAgICAgICAgIHNldE1vbmdvVmFsdWUocGF0aCwgdmFsdWUubWFwKGh5ZHJhdGVWYWwpLCBvYmplY3QpO1xyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0TW9uZ29WYWx1ZShwYXRoLCBoeWRyYXRlVmFsKHZhbHVlKSwgb2JqZWN0KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb2JqZWN0O1xyXG5cclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBhZ2luYXRlQWdncmVnYXRpb25zPFQgZXh0ZW5kcyBUeXBlPGFueT4sIFUgPSBJbmZlckdlbmVyaWM8VD4+KG1vZGVsOiBSZXR1cm5Nb2RlbFR5cGU8VD4sIGFnZ3JlZ2F0aW9uczogUGlwZWxpbmVTdGFnZVtdLCBwYXJhbXM6IElQYWdpbmF0aW9uUGFyYW1zLCBtZXRhUHJvamVjdGlvbjogYW55ID0ge30pOiBQcm9taXNlPElQYWdpbmF0aW9uQmFzZTxEb2N1bWVudFR5cGU8VT4+PiB7XHJcbiAgICBjb25zdCBzb3J0RmllbGQgPSAhaXNTdHJpbmcocGFyYW1zLnNvcnQpIHx8ICFwYXJhbXMuc29ydCA/IG51bGwgOiAocGFyYW1zLnNvcnQuc3RhcnRzV2l0aChcIi1cIikgPyBwYXJhbXMuc29ydC5zdWJzdHIoMSkgOiBwYXJhbXMuc29ydCk7XHJcbiAgICBjb25zdCBzb3J0QWdncmVnYXRpb246IFBpcGVsaW5lU3RhZ2UuU29ydFtdID0gIXNvcnRGaWVsZCA/IFtdIDogW3tcclxuICAgICAgICAkc29ydDoge1tzb3J0RmllbGRdOiBzb3J0RmllbGQgPT0gcGFyYW1zLnNvcnQgPyAxIDogLTF9XHJcbiAgICB9XTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1vZGVsLmFnZ3JlZ2F0ZShbXHJcbiAgICAgICAgLi4uYWdncmVnYXRpb25zLFxyXG4gICAgICAgIC4uLnNvcnRBZ2dyZWdhdGlvbixcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgICRncm91cDoge1xyXG4gICAgICAgICAgICAgICAgX2lkOiBcInJlc3VsdHNcIixcclxuICAgICAgICAgICAgICAgIHJlc3VsdDogeyRwdXNoOiBcIiQkQ1VSUkVOVFwifVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgICRwcm9qZWN0OiB7XHJcbiAgICAgICAgICAgICAgICBfaWQ6IDAsXHJcbiAgICAgICAgICAgICAgICBpdGVtczogcGFyYW1zLmxpbWl0ID4gMCA/IHskc2xpY2U6IFtcIiRyZXN1bHRcIiwgcGFyYW1zLnBhZ2UgKiBwYXJhbXMubGltaXQsIHBhcmFtcy5saW1pdF19IDogXCIkcmVzdWx0XCIsXHJcbiAgICAgICAgICAgICAgICBjb3VudDogeyRzaXplOiBcIiRyZXN1bHRcIn0sXHJcbiAgICAgICAgICAgICAgICBtZXRhOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdG90YWw6IHskc2l6ZTogXCIkcmVzdWx0XCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIC4uLm1ldGFQcm9qZWN0aW9uXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICBdKTtcclxuICAgIGNvbnN0IHBhZ2luYXRpb24gPSByZXN1bHRbMF0gYXMgSVBhZ2luYXRpb25CYXNlPERvY3VtZW50VHlwZTxVPj47XHJcbiAgICBpZiAoIXBhZ2luYXRpb24pIHtcclxuICAgICAgICByZXR1cm4ge2l0ZW1zOiBbXSwgY291bnQ6IDAsIG1ldGE6IHt0b3RhbDogMH19O1xyXG4gICAgfVxyXG4gICAgcGFnaW5hdGlvbi5pdGVtcyA9IHBhZ2luYXRpb24uaXRlbXMubWFwKGkgPT4gaHlkcmF0ZVBvcHVsYXRlZChtb2RlbCwgaSkgYXMgYW55KTtcclxuICAgIHJldHVybiBwYWdpbmF0aW9uO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gUmVzb2x2ZUVudGl0eTxUIGV4dGVuZHMgVHlwZTxhbnk+LCBVID0gSW5mZXJHZW5lcmljPFQ+Pihtb2RlbDogUmV0dXJuTW9kZWxUeXBlPFQ+LCBleHRyYUNoZWNrPzogKHF1ZXJ5OiBRdWVyeTxEb2N1bWVudFR5cGU8VT4sIGFueT4sIGFjdGlvbjogQWN0aW9uKSA9PiBQcm9taXNlPERvY3VtZW50VHlwZTxVPj4pOiBQYXJhbWV0ZXJEZWNvcmF0b3Ige1xyXG4gICAgY29uc3QgbW9kZWxOYW1lID0gbW9kZWwubW9kZWxOYW1lO1xyXG4gICAgY29uc3QgcGFyYW1OYW1lID0gbW9kZWxOYW1lLnRvTG93ZXJDYXNlKCk7XHJcbiAgICByZXR1cm4gY3JlYXRlUGFyYW1EZWNvcmF0b3Ioe1xyXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgICB2YWx1ZTogYXN5bmMgYWN0aW9uID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcmVxID0gYWN0aW9uLnJlcXVlc3QgYXMgSVJlcXVlc3Q7XHJcbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0gcmVxLmhlYWRlcihgeC0ke3BhcmFtTmFtZX0tdG9rZW5gKTtcclxuICAgICAgICAgICAgY29uc3QgaWQgPSByZXEucGFyYW1zW2Ake3BhcmFtTmFtZX1JZGBdIGFzIHN0cmluZztcclxuICAgICAgICAgICAgaWYgKCFpZCAmJiAhdG9rZW4pIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXJyb3IoYCR7bW9kZWxOYW1lfSBpZCBvciB0b2tlbiBzaG91bGQgYmUgZGVmaW5lZCFgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBxdWVyeSA9ICF0b2tlblxyXG4gICAgICAgICAgICAgICAgPyBtb2RlbC5maW5kQnlJZChpZClcclxuICAgICAgICAgICAgICAgIDogbW9kZWwuZmluZE9uZSh7dG9rZW59IGFzIGFueSk7XHJcbiAgICAgICAgICAgIGxldCBkb2M6IERvY3VtZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24oZXh0cmFDaGVjaykpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9jID0gYXdhaXQgdmFsdWVUb1Byb21pc2UoZXh0cmFDaGVjayhxdWVyeSwgYWN0aW9uKSk7XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFcnJvcihgJHttb2RlbE5hbWV9IGNoZWNrIGVycm9yOiAke2UubWVzc2FnZSB8fCBlfWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZG9jID0gYXdhaXQgcXVlcnk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFkb2MpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBIdHRwRXJyb3IoNDA0LCAhdG9rZW5cclxuICAgICAgICAgICAgICAgICAgICA/IGAke21vZGVsTmFtZX0gY291bGQgbm90IGJlIGZvdW5kIHdpdGggaWQ6ICR7aWR9YFxyXG4gICAgICAgICAgICAgICAgICAgIDogYCR7bW9kZWxOYW1lfSBjb3VsZCBub3QgYmUgZm91bmQgd2l0aCB0b2tlbjogJHt0b2tlbn1gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhY3Rpb24ucmVxdWVzdFtwYXJhbU5hbWVdID0gZG9jO1xyXG4gICAgICAgICAgICByZXR1cm4gZG9jO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59XHJcbiJdfQ==