@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.
- package/commands/fixtures-command.d.ts +9 -0
- package/commands/index.d.ts +2 -0
- package/common-types.d.ts +11 -6
- package/esm2020/commands/clear-command.mjs +17 -0
- package/esm2020/commands/fixtures-command.mjs +23 -0
- package/esm2020/commands/index.mjs +7 -0
- package/esm2020/common-types.mjs +21 -0
- package/esm2020/public_api.mjs +379 -0
- package/esm2020/requests/asset-image-params.mjs +53 -0
- package/esm2020/rest-controllers/assets.controller.mjs +126 -0
- package/esm2020/rest-controllers/auth.controller.mjs +46 -0
- package/esm2020/rest-controllers/gallery.controller.mjs +21 -0
- package/esm2020/rest-controllers/progresses.controller.mjs +29 -0
- package/esm2020/rest-controllers/terminal-styles.mjs +67 -0
- package/esm2020/rest-controllers/terminal.controller.mjs +125 -0
- package/esm2020/rest-middlewares/container.middleware.mjs +20 -0
- package/esm2020/rest-middlewares/error-handler.middleware.mjs +74 -0
- package/esm2020/rest-middlewares/language.middleware.mjs +18 -0
- package/esm2020/rest-middlewares/request-ended.middleware.mjs +23 -0
- package/esm2020/rest-middlewares/request-started.middleware.mjs +22 -0
- package/esm2020/services/asset-processor.mjs +90 -0
- package/esm2020/services/asset-resolver.mjs +31 -0
- package/esm2020/services/assets.mjs +140 -0
- package/esm2020/services/backend-provider.mjs +22 -0
- package/esm2020/services/cache-processor.mjs +16 -0
- package/esm2020/services/cache.mjs +62 -0
- package/{esm2015/services/configuration.js → esm2020/services/configuration.mjs} +3 -15
- package/esm2020/services/endpoint-provider.mjs +13 -0
- package/esm2020/services/entities/asset.mjs +43 -0
- package/esm2020/services/entities/base-entity.mjs +26 -0
- package/esm2020/services/entities/lazy-asset.mjs +73 -0
- package/esm2020/services/entities/progress.mjs +176 -0
- package/esm2020/services/entities/temp-asset.mjs +45 -0
- package/esm2020/services/fixtures.mjs +26 -0
- package/esm2020/services/gallery-cache.mjs +27 -0
- package/esm2020/services/gallery-image.mjs +37 -0
- package/esm2020/services/gallery.mjs +116 -0
- package/esm2020/services/id-generator.mjs +42 -0
- package/esm2020/services/job-manager.mjs +187 -0
- package/esm2020/services/lazy-assets.mjs +48 -0
- package/esm2020/services/logger.mjs +21 -0
- package/esm2020/services/mail-sender.mjs +36 -0
- package/esm2020/services/memory-cache.mjs +57 -0
- package/esm2020/services/mongo-connector.mjs +37 -0
- package/esm2020/services/open-api.mjs +114 -0
- package/esm2020/services/progresses.mjs +86 -0
- package/esm2020/services/template-renderer.mjs +64 -0
- package/esm2020/services/terminal-manager.mjs +77 -0
- package/esm2020/services/token-generator.mjs +35 -0
- package/esm2020/services/translation-provider.mjs +34 -0
- package/esm2020/services/translator.mjs +63 -0
- package/esm2020/services/user-manager.mjs +27 -0
- package/esm2020/socket-controllers/progress.controller.mjs +52 -0
- package/esm2020/socket-controllers/terminal.controller.mjs +48 -0
- package/esm2020/socket-controllers/terminal.mjs +85 -0
- package/esm2020/socket-middlewares/compression.middleware.mjs +14 -0
- package/esm2020/static.mjs +23 -0
- package/esm2020/utilities/decorators.mjs +52 -0
- package/esm2020/utilities/di-container.mjs +83 -0
- package/esm2020/utilities/empty-job.mjs +13 -0
- package/esm2020/utilities/lazy-asset-generator.mjs +35 -0
- package/esm2020/utilities/mongoose.mjs +216 -0
- package/esm2020/utils.mjs +693 -0
- package/esm2020/validators.mjs +46 -0
- package/fesm2015/{stemy-backend.js → stemy-backend.mjs} +1638 -2403
- package/fesm2015/stemy-backend.mjs.map +1 -0
- package/fesm2020/stemy-backend.mjs +4202 -0
- package/fesm2020/stemy-backend.mjs.map +1 -0
- package/{stemy-backend.d.ts → index.d.ts} +1 -0
- package/package.json +35 -23
- package/public_api.d.ts +2 -2
- package/rest-controllers/terminal-styles.d.ts +2 -0
- package/rest-controllers/terminal.controller.d.ts +2 -0
- package/services/assets.d.ts +1 -0
- package/services/entities/asset.d.ts +1 -0
- package/services/entities/temp-asset.d.ts +1 -0
- package/services/fixtures.d.ts +2 -2
- package/utils.d.ts +3 -0
- package/bundles/stemy-backend.umd.js +0 -7553
- package/bundles/stemy-backend.umd.js.map +0 -1
- package/esm2015/common-types.js +0 -20
- package/esm2015/public_api.js +0 -380
- package/esm2015/requests/asset-image-params.js +0 -70
- package/esm2015/rest-controllers/assets.controller.js +0 -180
- package/esm2015/rest-controllers/auth.controller.js +0 -76
- package/esm2015/rest-controllers/gallery.controller.js +0 -37
- package/esm2015/rest-controllers/progresses.controller.js +0 -57
- package/esm2015/rest-controllers/terminal.controller.js +0 -151
- package/esm2015/rest-middlewares/container.middleware.js +0 -32
- package/esm2015/rest-middlewares/error-handler.middleware.js +0 -99
- package/esm2015/rest-middlewares/language.middleware.js +0 -28
- package/esm2015/rest-middlewares/request-ended.middleware.js +0 -33
- package/esm2015/rest-middlewares/request-started.middleware.js +0 -32
- package/esm2015/rest-openapi.js +0 -44
- package/esm2015/services/asset-processor.js +0 -108
- package/esm2015/services/asset-resolver.js +0 -53
- package/esm2015/services/assets.js +0 -181
- package/esm2015/services/backend-provider.js +0 -32
- package/esm2015/services/cache-processor.js +0 -34
- package/esm2015/services/cache.js +0 -93
- package/esm2015/services/endpoint-provider.js +0 -29
- package/esm2015/services/entities/asset.js +0 -60
- package/esm2015/services/entities/base-entity.js +0 -37
- package/esm2015/services/entities/lazy-asset.js +0 -90
- package/esm2015/services/entities/progress.js +0 -213
- package/esm2015/services/entities/temp-asset.js +0 -64
- package/esm2015/services/fixtures.js +0 -45
- package/esm2015/services/gallery-cache.js +0 -36
- package/esm2015/services/gallery-image.js +0 -48
- package/esm2015/services/gallery.js +0 -138
- package/esm2015/services/id-generator.js +0 -63
- package/esm2015/services/job-manager.js +0 -221
- package/esm2015/services/lazy-assets.js +0 -83
- package/esm2015/services/logger.js +0 -31
- package/esm2015/services/mail-sender.js +0 -58
- package/esm2015/services/memory-cache.js +0 -84
- package/esm2015/services/mongo-connector.js +0 -58
- package/esm2015/services/open-api.js +0 -140
- package/esm2015/services/progresses.js +0 -118
- package/esm2015/services/template-renderer.js +0 -88
- package/esm2015/services/terminal-manager.js +0 -94
- package/esm2015/services/token-generator.js +0 -55
- package/esm2015/services/translation-provider.js +0 -54
- package/esm2015/services/translator.js +0 -84
- package/esm2015/services/user-manager.js +0 -47
- package/esm2015/socket-controllers/progress.controller.js +0 -82
- package/esm2015/socket-controllers/terminal.controller.js +0 -83
- package/esm2015/socket-controllers/terminal.js +0 -98
- package/esm2015/socket-middlewares/compression.middleware.js +0 -19
- package/esm2015/static.js +0 -33
- package/esm2015/utilities/clear-command.js +0 -33
- package/esm2015/utilities/decorators.js +0 -54
- package/esm2015/utilities/di-container.js +0 -84
- package/esm2015/utilities/empty-job.js +0 -29
- package/esm2015/utilities/lazy-asset-generator.js +0 -46
- package/esm2015/utilities/mongoose.js +0 -225
- package/esm2015/utils.js +0 -699
- package/esm2015/validators.js +0 -51
- package/fesm2015/stemy-backend.js.map +0 -1
- package/rest-openapi.d.ts +0 -3
- package/stemy-backend.metadata.json +0 -1
- /package/{utilities → commands}/clear-command.d.ts +0 -0
- /package/{esm2015/stemy-backend.js → esm2020/stemy-backend.mjs} +0 -0
- /package/{esm2015/utilities/base-doc.js → esm2020/utilities/base-doc.mjs} +0 -0
- /package/{esm2015/utilities/tree.js → esm2020/utilities/tree.mjs} +0 -0
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { __decorate, __param } from "tslib";
|
|
2
|
+
import { inject, injectable, injectAll, Lifecycle, scoped } from "tsyringe";
|
|
3
|
+
import cron from "node-cron";
|
|
4
|
+
import { socket } from "zeromq";
|
|
5
|
+
import { Subject } from "rxjs";
|
|
6
|
+
import { filter, map } from "rxjs/operators";
|
|
7
|
+
import { ObjectId } from "bson";
|
|
8
|
+
import { DI_CONTAINER, JOB } from "../common-types";
|
|
9
|
+
import { colorize, ConsoleColor, getConstructorName, getType, isArray, isObject, jsonHighlight, promiseTimeout } from "../utils";
|
|
10
|
+
let JobManager = class JobManager {
|
|
11
|
+
constructor(config, logger, container, jobTypes) {
|
|
12
|
+
this.config = config;
|
|
13
|
+
this.logger = logger;
|
|
14
|
+
this.container = container;
|
|
15
|
+
this.jobTypes = jobTypes || [];
|
|
16
|
+
this.jobs = this.jobTypes.reduce((res, jobType) => {
|
|
17
|
+
const jobName = getConstructorName(jobType);
|
|
18
|
+
res[jobName] = (jobParams, uniqueId) => {
|
|
19
|
+
const job = this.resolveJobInstance(jobType, jobParams, uniqueId);
|
|
20
|
+
const messageBridge = {
|
|
21
|
+
sendMessage: (message, params) => {
|
|
22
|
+
params.uniqueId = uniqueId;
|
|
23
|
+
this.workerPush.send([message, JSON.stringify(params)]);
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
messageBridge.sendMessage(`job-started`, { name: jobName });
|
|
27
|
+
return job.process(messageBridge);
|
|
28
|
+
};
|
|
29
|
+
return res;
|
|
30
|
+
}, {});
|
|
31
|
+
this.messages = new Subject();
|
|
32
|
+
this.processing = false;
|
|
33
|
+
this.maxTimeout = this.config.resolve("jobTimeout");
|
|
34
|
+
}
|
|
35
|
+
on(message, cb) {
|
|
36
|
+
return this.messages
|
|
37
|
+
.pipe(filter(t => t.message === message))
|
|
38
|
+
.pipe(map(t => t.params)).subscribe(cb);
|
|
39
|
+
}
|
|
40
|
+
async process(jobType, params = {}) {
|
|
41
|
+
let instance = null;
|
|
42
|
+
try {
|
|
43
|
+
instance = this.resolveJobInstance(jobType, params);
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
const jobName = getConstructorName(jobType);
|
|
47
|
+
throw new Error(`Can't resolve params for job: ${jobName}, with params: ${JSON.stringify(params)}. Reason: ${e}`);
|
|
48
|
+
}
|
|
49
|
+
return instance.process();
|
|
50
|
+
}
|
|
51
|
+
async enqueueWithName(name, params = {}) {
|
|
52
|
+
return this.sendToWorkers(this.tryResolveFromName(name, params), params);
|
|
53
|
+
}
|
|
54
|
+
async enqueue(jobType, params = {}) {
|
|
55
|
+
return this.sendToWorkers(this.tryResolveAndInit(jobType, params), params);
|
|
56
|
+
}
|
|
57
|
+
schedule(minute, hour, dayOfMonth, month, dayOfWeek, jobType, params = {}) {
|
|
58
|
+
const expression = [minute, hour, dayOfMonth, month, dayOfWeek].map(t => {
|
|
59
|
+
if (isObject(t)) {
|
|
60
|
+
const range = t;
|
|
61
|
+
return `${range.min || 0}-${range.max || 0}`;
|
|
62
|
+
}
|
|
63
|
+
if (isArray(t)) {
|
|
64
|
+
return t.join(",");
|
|
65
|
+
}
|
|
66
|
+
return `${t}`;
|
|
67
|
+
}).join(" ");
|
|
68
|
+
const jobName = getConstructorName(jobType);
|
|
69
|
+
if (!cron.validate(expression)) {
|
|
70
|
+
this.logger.log("job-manager", `Can't schedule the task: '${jobName}' because time expression is invalid.`);
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
return cron.schedule(expression, () => {
|
|
74
|
+
this.enqueue(jobType, params).catch(e => {
|
|
75
|
+
this.logger.log("job-manager", `Can't enqueue job: '${jobName}' because: ${e}`);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
async startProcessing() {
|
|
80
|
+
if (this.processing)
|
|
81
|
+
return null;
|
|
82
|
+
this.processing = true;
|
|
83
|
+
if (!this.config.resolve("isWorker")) {
|
|
84
|
+
this.logger.log("job-manager", colorize(`Processing can not be started because this is NOT a worker process!`, ConsoleColor.FgRed));
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
const host = this.config.resolve("zmqRemoteHost");
|
|
88
|
+
const pushHost = `${host}:${this.config.resolve("zmqBackPort")}`;
|
|
89
|
+
this.workerPush = socket("push");
|
|
90
|
+
await this.workerPush.connect(pushHost);
|
|
91
|
+
this.logger.log("job-manager", `Worker producer connected to: ${pushHost}`);
|
|
92
|
+
const pullHost = `${host}:${this.config.resolve("zmqPort")}`;
|
|
93
|
+
this.workerPull = socket("pull");
|
|
94
|
+
await this.workerPull.connect(pullHost);
|
|
95
|
+
this.logger.log("job-manager", `Worker consumer connected to: ${pullHost}`);
|
|
96
|
+
this.workerPull.on("message", async (name, args, uniqId) => {
|
|
97
|
+
try {
|
|
98
|
+
const jobName = name.toString("utf8");
|
|
99
|
+
const jobParams = JSON.parse(args.toString("utf8"));
|
|
100
|
+
const uniqueId = uniqId?.toString("utf8");
|
|
101
|
+
console.time(uniqueId);
|
|
102
|
+
console.timeLog(uniqueId, `Started working on background job: ${colorize(jobName, ConsoleColor.FgCyan)} with args: \n${jsonHighlight(jobParams)}\n\n`);
|
|
103
|
+
try {
|
|
104
|
+
await Promise.race([this.jobs[jobName](jobParams, uniqueId), promiseTimeout(this.maxTimeout, true)]);
|
|
105
|
+
console.timeLog(uniqueId, `Finished working on background job: ${colorize(jobName, ConsoleColor.FgCyan)}\n\n`);
|
|
106
|
+
}
|
|
107
|
+
catch (e) {
|
|
108
|
+
console.timeLog(uniqueId, `Background job failed: ${colorize(jobName, ConsoleColor.FgRed)}\n${e}\n\n`);
|
|
109
|
+
}
|
|
110
|
+
console.timeEnd(uniqueId);
|
|
111
|
+
}
|
|
112
|
+
catch (e) {
|
|
113
|
+
this.logger.log("job-manager", `Failed to start job: ${e.message}`);
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
tryResolve(jobType, params) {
|
|
118
|
+
const jobName = getConstructorName(jobType);
|
|
119
|
+
if (!this.jobs[jobName]) {
|
|
120
|
+
throw `Can't find job with name: ${jobName} so it can't be enqueued!`;
|
|
121
|
+
}
|
|
122
|
+
try {
|
|
123
|
+
this.resolveJobInstance(jobType, params);
|
|
124
|
+
}
|
|
125
|
+
catch (e) {
|
|
126
|
+
throw `Can't resolve params for job: ${jobName}, with params: ${JSON.stringify(params)}. Reason: ${e}`;
|
|
127
|
+
}
|
|
128
|
+
return jobName;
|
|
129
|
+
}
|
|
130
|
+
tryResolveFromName(jobName, params) {
|
|
131
|
+
const jobType = this.jobTypes.find(type => {
|
|
132
|
+
return getConstructorName(type) == jobName;
|
|
133
|
+
});
|
|
134
|
+
if (!jobType) {
|
|
135
|
+
throw `Can't find job type with name: ${jobName} so it can't be enqueued!`;
|
|
136
|
+
}
|
|
137
|
+
return this.tryResolveAndInit(jobType, params);
|
|
138
|
+
}
|
|
139
|
+
tryResolveAndInit(jobType, params) {
|
|
140
|
+
if (!this.apiPush) {
|
|
141
|
+
const port = this.config.resolve("zmqPort");
|
|
142
|
+
this.apiPush = socket("push");
|
|
143
|
+
this.apiPush.bind(`tcp://0.0.0.0:${port}`);
|
|
144
|
+
this.logger.log("job-manager", `API producer bound to port: ${port}`);
|
|
145
|
+
}
|
|
146
|
+
if (!this.apiPull) {
|
|
147
|
+
const backPort = this.config.resolve("zmqBackPort");
|
|
148
|
+
this.apiPull = socket("pull");
|
|
149
|
+
this.apiPull.bind(`tcp://0.0.0.0:${backPort}`);
|
|
150
|
+
this.apiPull.on("message", (name, args) => {
|
|
151
|
+
const message = name.toString("utf8");
|
|
152
|
+
const params = JSON.parse(args?.toString("utf8") || "{}");
|
|
153
|
+
const paramTypes = Object.keys(params).reduce((res, key) => {
|
|
154
|
+
res[key] = getType(params[key]);
|
|
155
|
+
return res;
|
|
156
|
+
}, {});
|
|
157
|
+
this.logger.log("job-manager", `Received a message from worker: "${colorize(message, ConsoleColor.FgCyan)}" with args: ${jsonHighlight(paramTypes)}\n\n`);
|
|
158
|
+
this.messages.next({ message, params });
|
|
159
|
+
});
|
|
160
|
+
this.logger.log("job-manager", `API consumer bound to port: ${backPort}`);
|
|
161
|
+
}
|
|
162
|
+
return this.tryResolve(jobType, params);
|
|
163
|
+
}
|
|
164
|
+
resolveJobInstance(jobType, params, uniqueId = "") {
|
|
165
|
+
const container = this.container.createChildContainer();
|
|
166
|
+
Object.keys(params).map((name) => {
|
|
167
|
+
container.register(name, { useValue: params[name] });
|
|
168
|
+
});
|
|
169
|
+
container.register("uniqueId", { useValue: uniqueId });
|
|
170
|
+
container.register(jobType, jobType);
|
|
171
|
+
return container.resolve(jobType);
|
|
172
|
+
}
|
|
173
|
+
async sendToWorkers(jobName, params) {
|
|
174
|
+
const publisher = await this.apiPush;
|
|
175
|
+
const uniqueId = new ObjectId().toHexString();
|
|
176
|
+
await publisher.send([jobName, JSON.stringify(params), uniqueId]);
|
|
177
|
+
return uniqueId;
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
JobManager = __decorate([
|
|
181
|
+
injectable(),
|
|
182
|
+
scoped(Lifecycle.ContainerScoped),
|
|
183
|
+
__param(2, inject(DI_CONTAINER)),
|
|
184
|
+
__param(3, injectAll(JOB))
|
|
185
|
+
], JobManager);
|
|
186
|
+
export { JobManager };
|
|
187
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam9iLW1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvam9iLW1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBc0IsTUFBTSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUMvRixPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxFQUFDLE1BQU0sRUFBUyxNQUFNLFFBQVEsQ0FBQztBQUN0QyxPQUFPLEVBQUMsT0FBTyxFQUFlLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBQyxNQUFNLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM5QixPQUFPLEVBQ0gsWUFBWSxFQUtaLEdBQUcsRUFNTixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFDSCxRQUFRLEVBQ1IsWUFBWSxFQUNaLGtCQUFrQixFQUNsQixPQUFPLEVBQ1AsT0FBTyxFQUNQLFFBQVEsRUFDUixhQUFhLEVBQ2IsY0FBYyxFQUNqQixNQUFNLFVBQVUsQ0FBQztBQU1YLElBQU0sVUFBVSxHQUFoQixNQUFNLFVBQVU7SUFjbkIsWUFBcUIsTUFBcUIsRUFDckIsTUFBYyxFQUNRLFNBQThCLEVBQzdDLFFBQXNCO1FBSDdCLFdBQU0sR0FBTixNQUFNLENBQWU7UUFDckIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNRLGNBQVMsR0FBVCxTQUFTLENBQXFCO1FBRXJFLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQzlDLE1BQU0sT0FBTyxHQUFHLGtC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LFFBQVEsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzlDLE1BQU0sU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDbEUsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQztDQUNKLENBQUE7QUFsTVksVUFBVTtJQUZ0QixVQUFVLEVBQUU7SUFDWixNQUFNLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQztJQWlCakIsV0FBQSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUE7SUFDcEIsV0FBQSxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUE7R0FqQmxCLFVBQVUsQ0FrTXRCO1NBbE1ZLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RlcGVuZGVuY3lDb250YWluZXIsIGluamVjdCwgaW5qZWN0YWJsZSwgaW5qZWN0QWxsLCBMaWZlY3ljbGUsIHNjb3BlZH0gZnJvbSBcInRzeXJpbmdlXCI7XHJcbmltcG9ydCBjcm9uIGZyb20gXCJub2RlLWNyb25cIjtcclxuaW1wb3J0IHtzb2NrZXQsIFNvY2tldH0gZnJvbSBcInplcm9tcVwiO1xyXG5pbXBvcnQge1N1YmplY3QsIFN1YnNjcmlwdGlvbn0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHtmaWx0ZXIsIG1hcH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcbmltcG9ydCB7T2JqZWN0SWR9IGZyb20gXCJic29uXCI7XHJcbmltcG9ydCB7XHJcbiAgICBESV9DT05UQUlORVIsXHJcbiAgICBJSm9iLFxyXG4gICAgSUpvYlRhc2ssXHJcbiAgICBJTWVzc2FnZUJyaWRnZSxcclxuICAgIElTb2NrZXRNZXNzYWdlLFxyXG4gICAgSk9CLFxyXG4gICAgSm9iUGFyYW1zLFxyXG4gICAgSm9iU2NoZWR1bGVSYW5nZSxcclxuICAgIEpvYlNjaGVkdWxlVGltZSxcclxuICAgIFNvY2tldFBhcmFtcyxcclxuICAgIFR5cGVcclxufSBmcm9tIFwiLi4vY29tbW9uLXR5cGVzXCI7XHJcbmltcG9ydCB7XHJcbiAgICBjb2xvcml6ZSxcclxuICAgIENvbnNvbGVDb2xvcixcclxuICAgIGdldENvbnN0cnVjdG9yTmFtZSxcclxuICAgIGdldFR5cGUsXHJcbiAgICBpc0FycmF5LFxyXG4gICAgaXNPYmplY3QsXHJcbiAgICBqc29uSGlnaGxpZ2h0LFxyXG4gICAgcHJvbWlzZVRpbWVvdXRcclxufSBmcm9tIFwiLi4vdXRpbHNcIjtcclxuaW1wb3J0IHtDb25maWd1cmF0aW9ufSBmcm9tIFwiLi9jb25maWd1cmF0aW9uXCI7XHJcbmltcG9ydCB7TG9nZ2VyfSBmcm9tIFwiLi9sb2dnZXJcIjtcclxuXHJcbkBpbmplY3RhYmxlKClcclxuQHNjb3BlZChMaWZlY3ljbGUuQ29udGFpbmVyU2NvcGVkKVxyXG5leHBvcnQgY2xhc3MgSm9iTWFuYWdlciB7XHJcblxyXG4gICAgcHJvdGVjdGVkIGpvYlR5cGVzOiBUeXBlPElKb2I+W107XHJcbiAgICBwcm90ZWN0ZWQgam9iczogeyBbbmFtZTogc3RyaW5nXTogKGpvYlBhcmFtczogSm9iUGFyYW1zLCB1bmlxdWVJZDogc3RyaW5nKSA9PiBQcm9taXNlPGFueT4gfTtcclxuICAgIHByb3RlY3RlZCBtZXNzYWdlczogU3ViamVjdDxJU29ja2V0TWVzc2FnZT47XHJcbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc2luZzogYm9vbGVhbjtcclxuXHJcbiAgICBwcm90ZWN0ZWQgYXBpUHVzaDogU29ja2V0O1xyXG4gICAgcHJvdGVjdGVkIGFwaVB1bGw6IFNvY2tldDtcclxuICAgIHByb3RlY3RlZCB3b3JrZXJQdXNoOiBTb2NrZXQ7XHJcbiAgICBwcm90ZWN0ZWQgd29ya2VyUHVsbDogU29ja2V0O1xyXG5cclxuICAgIHJlYWRvbmx5IG1heFRpbWVvdXQ6IG51bWJlcjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihyZWFkb25seSBjb25maWc6IENvbmZpZ3VyYXRpb24sXHJcbiAgICAgICAgICAgICAgICByZWFkb25seSBsb2dnZXI6IExvZ2dlcixcclxuICAgICAgICAgICAgICAgIEBpbmplY3QoRElfQ09OVEFJTkVSKSByZWFkb25seSBjb250YWluZXI6IERlcGVuZGVuY3lDb250YWluZXIsXHJcbiAgICAgICAgICAgICAgICBAaW5qZWN0QWxsKEpPQikgam9iVHlwZXM6IFR5cGU8SUpvYj5bXSkge1xyXG4gICAgICAgIHRoaXMuam9iVHlwZXMgPSBqb2JUeXBlcyB8fCBbXTtcclxuICAgICAgICB0aGlzLmpvYnMgPSB0aGlzLmpvYlR5cGVzLnJlZHVjZSgocmVzLCBqb2JUeXBlKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGpvYk5hbWUgPSBnZXRDb25zdHJ1Y3Rvck5hbWUoam9iVHlwZSk7XHJcbiAgICAgICAgICAgIHJlc1tqb2JOYW1lXSA9IChqb2JQYXJhbXM6IEpvYlBhcmFtcywgdW5pcXVlSWQ6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgam9iID0gdGhpcy5yZXNvbHZlSm9iSW5zdGFuY2Uoam9iVHlwZSwgam9iUGFyYW1zLCB1bmlxdWVJZCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlQnJpZGdlOiBJTWVzc2FnZUJyaWRnZSA9IHtcclxuICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZTogKG1lc3NhZ2U6IHN0cmluZywgcGFyYW1zPzogU29ja2V0UGFyYW1zKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy51bmlxdWVJZCA9IHVuaXF1ZUlkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndvcmtlclB1c2guc2VuZChbbWVzc2FnZSwgSlNPTi5zdHJpbmdpZnkocGFyYW1zKV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlQnJpZGdlLnNlbmRNZXNzYWdlKGBqb2Itc3RhcnRlZGAsIHtuYW1lOiBqb2JOYW1lfSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gam9iLnByb2Nlc3MobWVzc2FnZUJyaWRnZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9LCB7fSk7XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlcyA9IG5ldyBTdWJqZWN0PElTb2NrZXRNZXNzYWdlPigpO1xyXG4gICAgICAgIHRoaXMucHJvY2Vzc2luZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubWF4VGltZW91dCA9IHRoaXMuY29uZmlnLnJlc29sdmUoXCJqb2JUaW1lb3V0XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uKG1lc3NhZ2U6IHN0cmluZywgY2I6IChwYXJhbXM6IFNvY2tldFBhcmFtcykgPT4gYW55KTogU3Vic2NyaXB0aW9uIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlc1xyXG4gICAgICAgICAgICAucGlwZShmaWx0ZXIodCA9PiB0Lm1lc3NhZ2UgPT09IG1lc3NhZ2UpKVxyXG4gICAgICAgICAgICAucGlwZShtYXAodCA9PiB0LnBhcmFtcykpLnN1YnNjcmliZShjYik7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgcHJvY2Vzcyhqb2JUeXBlOiBUeXBlPElKb2I+LCBwYXJhbXM6IEpvYlBhcmFtcyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICBsZXQgaW5zdGFuY2U6IElKb2IgPSBudWxsO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGluc3RhbmNlID0gdGhpcy5yZXNvbHZlSm9iSW5zdGFuY2Uoam9iVHlwZSwgcGFyYW1zKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGpvYk5hbWUgPSBnZXRDb25zdHJ1Y3Rvck5hbWUoam9iVHlwZSk7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3QgcmVzb2x2ZSBwYXJhbXMgZm9yIGpvYjogJHtqb2JOYW1lfSwgd2l0aCBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkocGFyYW1zKX0uIFJlYXNvbjogJHtlfWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaW5zdGFuY2UucHJvY2VzcygpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGVucXVldWVXaXRoTmFtZShuYW1lOiBzdHJpbmcsIHBhcmFtczogSm9iUGFyYW1zID0ge30pOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNlbmRUb1dvcmtlcnModGhpcy50cnlSZXNvbHZlRnJvbU5hbWUobmFtZSwgcGFyYW1zKSwgcGFyYW1zKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBlbnF1ZXVlKGpvYlR5cGU6IFR5cGU8SUpvYj4sIHBhcmFtczogSm9iUGFyYW1zID0ge30pOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNlbmRUb1dvcmtlcnModGhpcy50cnlSZXNvbHZlQW5kSW5pdChqb2JUeXBlLCBwYXJhbXMpLCBwYXJhbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHNjaGVkdWxlKG1pbnV0ZTogSm9iU2NoZWR1bGVUaW1lLCBob3VyOiBKb2JTY2hlZHVsZVRpbWUsIGRheU9mTW9udGg6IEpvYlNjaGVkdWxlVGltZSwgbW9udGg6IEpvYlNjaGVkdWxlVGltZSwgZGF5T2ZXZWVrOiBKb2JTY2hlZHVsZVRpbWUsIGpvYlR5cGU6IFR5cGU8SUpvYj4sIHBhcmFtczogSm9iUGFyYW1zID0ge30pOiBJSm9iVGFzayB7XHJcbiAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IFttaW51dGUsIGhvdXIsIGRheU9mTW9udGgsIG1vbnRoLCBkYXlPZldlZWtdLm1hcCh0ID0+IHtcclxuICAgICAgICAgICAgaWYgKGlzT2JqZWN0KHQpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByYW5nZSA9IHQgYXMgSm9iU2NoZWR1bGVSYW5nZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBgJHtyYW5nZS5taW4gfHwgMH0tJHtyYW5nZS5tYXggfHwgMH1gO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChpc0FycmF5KHQpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdC5qb2luKFwiLFwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gYCR7dH1gO1xyXG4gICAgICAgIH0pLmpvaW4oXCIgXCIpO1xyXG4gICAgICAgIGNvbnN0IGpvYk5hbWUgPSBnZXRDb25zdHJ1Y3Rvck5hbWUoam9iVHlwZSk7XHJcbiAgICAgICAgaWYgKCFjcm9uLnZhbGlkYXRlKGV4cHJlc3Npb24pKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhcImpvYi1tYW5hZ2VyXCIsIGBDYW4ndCBzY2hlZHVsZSB0aGUgdGFzazogJyR7am9iTmFtZX0nIGJlY2F1c2UgdGltZSBleHByZXNzaW9uIGlzIGludmFsaWQuYCk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY3Jvbi5zY2hlZHVsZShleHByZXNzaW9uLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZW5xdWV1ZShqb2JUeXBlLCBwYXJhbXMpLmNhdGNoKGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIubG9nKFwiam9iLW1hbmFnZXJcIiwgYENhbid0IGVucXVldWUgam9iOiAnJHtqb2JOYW1lfScgYmVjYXVzZTogJHtlfWApO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzdGFydFByb2Nlc3NpbmcoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICBpZiAodGhpcy5wcm9jZXNzaW5nKSByZXR1cm4gbnVsbDtcclxuICAgICAgICB0aGlzLnByb2Nlc3NpbmcgPSB0cnVlO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuY29uZmlnLnJlc29sdmUoXCJpc1dvcmtlclwiKSkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coXCJqb2ItbWFuYWdlclwiLCBjb2xvcml6ZShgUHJvY2Vzc2luZyBjYW4gbm90IGJlIHN0YXJ0ZWQgYmVjYXVzZSB0aGlzIGlzIE5PVCBhIHdvcmtlciBwcm9jZXNzIWAsIENvbnNvbGVDb2xvci5GZ1JlZCkpO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGhvc3QgPSB0aGlzLmNvbmZpZy5yZXNvbHZlKFwiem1xUmVtb3RlSG9zdFwiKTtcclxuICAgICAgICBjb25zdCBwdXNoSG9zdCA9IGAke2hvc3R9OiR7dGhpcy5jb25maWcucmVzb2x2ZShcInptcUJhY2tQb3J0XCIpfWA7XHJcbiAgICAgICAgdGhpcy53b3JrZXJQdXNoID0gc29ja2V0KFwicHVzaFwiKTtcclxuICAgICAgICBhd2FpdCB0aGlzLndvcmtlclB1c2guY29ubmVjdChwdXNoSG9zdCk7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIubG9nKFwiam9iLW1hbmFnZXJcIiwgYFdvcmtlciBwcm9kdWNlciBjb25uZWN0ZWQgdG86ICR7cHVzaEhvc3R9YCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHB1bGxIb3N0ID0gYCR7aG9zdH06JHt0aGlzLmNvbmZpZy5yZXNvbHZlKFwiem1xUG9ydFwiKX1gO1xyXG4gICAgICAgIHRoaXMud29ya2VyUHVsbCA9IHNvY2tldChcInB1bGxcIik7XHJcbiAgICAgICAgYXdhaXQgdGhpcy53b3JrZXJQdWxsLmNvbm5lY3QocHVsbEhvc3QpO1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLmxvZyhcImpvYi1tYW5hZ2VyXCIsIGBXb3JrZXIgY29uc3VtZXIgY29ubmVjdGVkIHRvOiAke3B1bGxIb3N0fWApO1xyXG5cclxuICAgICAgICB0aGlzLndvcmtlclB1bGwub24oXCJtZXNzYWdlXCIsIGFzeW5jIChuYW1lOiBCdWZmZXIsIGFyZ3M6IEJ1ZmZlciwgdW5pcUlkOiBCdWZmZXIpID0+IHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGpvYk5hbWUgPSBuYW1lLnRvU3RyaW5nKFwidXRmOFwiKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGpvYlBhcmFtcyA9IEpTT04ucGFyc2UoYXJncy50b1N0cmluZyhcInV0ZjhcIikpIGFzIEpvYlBhcmFtcztcclxuICAgICAgICAgICAgICAgIGNvbnN0IHVuaXF1ZUlkID0gdW5pcUlkPy50b1N0cmluZyhcInV0ZjhcIik7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc29sZS50aW1lKHVuaXF1ZUlkKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUudGltZUxvZyh1bmlxdWVJZCwgYFN0YXJ0ZWQgd29ya2luZyBvbiBiYWNrZ3JvdW5kIGpvYjogJHtjb2xvcml6ZShqb2JOYW1lLCBDb25zb2xlQ29sb3IuRmdDeWFuKX0gd2l0aCBhcmdzOiBcXG4ke2pzb25IaWdobGlnaHQoam9iUGFyYW1zKX1cXG5cXG5gKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UucmFjZShbdGhpcy5qb2JzW2pvYk5hbWVdKGpvYlBhcmFtcywgdW5pcXVlSWQpLCBwcm9taXNlVGltZW91dCh0aGlzLm1heFRpbWVvdXQsIHRydWUpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS50aW1lTG9nKHVuaXF1ZUlkLCBgRmluaXNoZWQgd29ya2luZyBvbiBiYWNrZ3JvdW5kIGpvYjogJHtjb2xvcml6ZShqb2JOYW1lLCBDb25zb2xlQ29sb3IuRmdDeWFuKX1cXG5cXG5gKTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLnRpbWVMb2codW5pcXVlSWQsIGBCYWNrZ3JvdW5kIGpvYiBmYWlsZWQ6ICR7Y29sb3JpemUoam9iTmFtZSwgQ29uc29sZUNvbG9yLkZnUmVkKX1cXG4ke2V9XFxuXFxuYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLnRpbWVFbmQodW5pcXVlSWQpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coXCJqb2ItbWFuYWdlclwiLCBgRmFpbGVkIHRvIHN0YXJ0IGpvYjogJHtlLm1lc3NhZ2V9YCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0cnlSZXNvbHZlKGpvYlR5cGU6IFR5cGU8SUpvYj4sIHBhcmFtczogSm9iUGFyYW1zKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBqb2JOYW1lID0gZ2V0Q29uc3RydWN0b3JOYW1lKGpvYlR5cGUpO1xyXG4gICAgICAgIGlmICghdGhpcy5qb2JzW2pvYk5hbWVdKSB7XHJcbiAgICAgICAgICAgIHRocm93IGBDYW4ndCBmaW5kIGpvYiB3aXRoIG5hbWU6ICR7am9iTmFtZX0gc28gaXQgY2FuJ3QgYmUgZW5xdWV1ZWQhYDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5yZXNvbHZlSm9iSW5zdGFuY2Uoam9iVHlwZSwgcGFyYW1zKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRocm93IGBDYW4ndCByZXNvbHZlIHBhcmFtcyBmb3Igam9iOiAke2pvYk5hbWV9LCB3aXRoIHBhcmFtczogJHtKU09OLnN0cmluZ2lmeShwYXJhbXMpfS4gUmVhc29uOiAke2V9YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGpvYk5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHRyeVJlc29sdmVGcm9tTmFtZShqb2JOYW1lOiBzdHJpbmcsIHBhcmFtczogSm9iUGFyYW1zKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBqb2JUeXBlID0gdGhpcy5qb2JUeXBlcy5maW5kKHR5cGUgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gZ2V0Q29uc3RydWN0b3JOYW1lKHR5cGUpID09IGpvYk5hbWU7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKCFqb2JUeXBlKSB7XHJcbiAgICAgICAgICAgIHRocm93IGBDYW4ndCBmaW5kIGpvYiB0eXBlIHdpdGggbmFtZTogJHtqb2JOYW1lfSBzbyBpdCBjYW4ndCBiZSBlbnF1ZXVlZCFgO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy50cnlSZXNvbHZlQW5kSW5pdChqb2JUeXBlLCBwYXJhbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCB0cnlSZXNvbHZlQW5kSW5pdChqb2JUeXBlOiBUeXBlPElKb2I+LCBwYXJhbXM6IEpvYlBhcmFtcyk6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmFwaVB1c2gpIHtcclxuICAgICAgICAgICAgY29uc3QgcG9ydCA9IHRoaXMuY29uZmlnLnJlc29sdmUoXCJ6bXFQb3J0XCIpO1xyXG4gICAgICAgICAgICB0aGlzLmFwaVB1c2ggPSBzb2NrZXQoXCJwdXNoXCIpO1xyXG4gICAgICAgICAgICB0aGlzLmFwaVB1c2guYmluZChgdGNwOi8vMC4wLjAuMDoke3BvcnR9YCk7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhcImpvYi1tYW5hZ2VyXCIsIGBBUEkgcHJvZHVjZXIgYm91bmQgdG8gcG9ydDogJHtwb3J0fWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuYXBpUHVsbCkge1xyXG4gICAgICAgICAgICBjb25zdCBiYWNrUG9ydCA9IHRoaXMuY29uZmlnLnJlc29sdmUoXCJ6bXFCYWNrUG9ydFwiKTtcclxuICAgICAgICAgICAgdGhpcy5hcGlQdWxsID0gc29ja2V0KFwicHVsbFwiKTtcclxuICAgICAgICAgICAgdGhpcy5hcGlQdWxsLmJpbmQoYHRjcDovLzAuMC4wLjA6JHtiYWNrUG9ydH1gKTtcclxuICAgICAgICAgICAgdGhpcy5hcGlQdWxsLm9uKFwibWVzc2FnZVwiLCAobmFtZTogQnVmZmVyLCBhcmdzPzogQnVmZmVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gbmFtZS50b1N0cmluZyhcInV0ZjhcIik7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBKU09OLnBhcnNlKGFyZ3M/LnRvU3RyaW5nKFwidXRmOFwiKSB8fCBcInt9XCIpIGFzIEpvYlBhcmFtcztcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtVHlwZXMgPSBPYmplY3Qua2V5cyhwYXJhbXMpLnJlZHVjZSgocmVzLCBrZXkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXNba2V5XSA9IGdldFR5cGUocGFyYW1zW2tleV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICAgICAgICB9LCB7fSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coXCJqb2ItbWFuYWdlclwiLCBgUmVjZWl2ZWQgYSBtZXNzYWdlIGZyb20gd29ya2VyOiBcIiR7Y29sb3JpemUobWVzc2FnZSwgQ29uc29sZUNvbG9yLkZnQ3lhbil9XCIgd2l0aCBhcmdzOiAke2pzb25IaWdobGlnaHQocGFyYW1UeXBlcyl9XFxuXFxuYCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VzLm5leHQoe21lc3NhZ2UsIHBhcmFtc30pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIubG9nKFwiam9iLW1hbmFnZXJcIiwgYEFQSSBjb25zdW1lciBib3VuZCB0byBwb3J0OiAke2JhY2tQb3J0fWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy50cnlSZXNvbHZlKGpvYlR5cGUsIHBhcmFtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHJlc29sdmVKb2JJbnN0YW5jZShqb2JUeXBlOiBUeXBlPElKb2I+LCBwYXJhbXM6IEpvYlBhcmFtcywgdW5pcXVlSWQ6IHN0cmluZyA9IFwiXCIpOiBJSm9iIHtcclxuICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lci5jcmVhdGVDaGlsZENvbnRhaW5lcigpO1xyXG4gICAgICAgIE9iamVjdC5rZXlzKHBhcmFtcykubWFwKChuYW1lKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5yZWdpc3RlcihuYW1lLCB7dXNlVmFsdWU6IHBhcmFtc1tuYW1lXX0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnRhaW5lci5yZWdpc3RlcihcInVuaXF1ZUlkXCIsIHt1c2VWYWx1ZTogdW5pcXVlSWR9KTtcclxuICAgICAgICBjb250YWluZXIucmVnaXN0ZXIoam9iVHlwZSwgam9iVHlwZSk7XHJcbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5yZXNvbHZlKGpvYlR5cGUpIGFzIElKb2I7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGFzeW5jIHNlbmRUb1dvcmtlcnMoam9iTmFtZTogc3RyaW5nLCBwYXJhbXM6IEpvYlBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICAgICAgY29uc3QgcHVibGlzaGVyID0gYXdhaXQgdGhpcy5hcGlQdXNoO1xyXG4gICAgICAgIGNvbnN0IHVuaXF1ZUlkID0gbmV3IE9iamVjdElkKCkudG9IZXhTdHJpbmcoKTtcclxuICAgICAgICBhd2FpdCBwdWJsaXNoZXIuc2VuZChbam9iTmFtZSwgSlNPTi5zdHJpbmdpZnkocGFyYW1zKSwgdW5pcXVlSWRdKTtcclxuICAgICAgICByZXR1cm4gdW5pcXVlSWQ7XHJcbiAgICB9XHJcbn1cclxuIl19
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { injectable, Lifecycle, scoped } from "tsyringe";
|
|
3
|
+
import { ObjectId } from "bson";
|
|
4
|
+
import { LazyAsset } from "./entities/lazy-asset";
|
|
5
|
+
let LazyAssets = class LazyAssets {
|
|
6
|
+
constructor(connector, assets, progresses, logger, jobMan) {
|
|
7
|
+
this.connector = connector;
|
|
8
|
+
this.assets = assets;
|
|
9
|
+
this.progresses = progresses;
|
|
10
|
+
this.logger = logger;
|
|
11
|
+
this.jobMan = jobMan;
|
|
12
|
+
this.collection = connector.database.collection("lazyassets");
|
|
13
|
+
}
|
|
14
|
+
async create(jobType, jobParams = {}, jobQue = "main") {
|
|
15
|
+
const jobName = this.jobMan.tryResolve(jobType, { ...jobParams, lazyId: "" });
|
|
16
|
+
const data = {
|
|
17
|
+
jobName,
|
|
18
|
+
jobParams,
|
|
19
|
+
jobQue
|
|
20
|
+
};
|
|
21
|
+
const existingAsset = await this.find(data);
|
|
22
|
+
if (existingAsset)
|
|
23
|
+
return existingAsset;
|
|
24
|
+
const res = await this.collection.insertOne(data);
|
|
25
|
+
return new LazyAsset(res.insertedId, data, this.collection, this.logger, this.assets, this.progresses);
|
|
26
|
+
}
|
|
27
|
+
async read(id) {
|
|
28
|
+
return !id ? null : this.find({ _id: new ObjectId(id) });
|
|
29
|
+
}
|
|
30
|
+
async find(where) {
|
|
31
|
+
const data = await this.collection.findOne(where);
|
|
32
|
+
return !data
|
|
33
|
+
? null
|
|
34
|
+
: new LazyAsset(data._id, data, this.collection, this.logger, this.assets, this.progresses);
|
|
35
|
+
}
|
|
36
|
+
async unlink(id) {
|
|
37
|
+
const asset = await this.read(id);
|
|
38
|
+
if (!asset)
|
|
39
|
+
return null;
|
|
40
|
+
return asset.unlink();
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
LazyAssets = __decorate([
|
|
44
|
+
injectable(),
|
|
45
|
+
scoped(Lifecycle.ContainerScoped)
|
|
46
|
+
], LazyAssets);
|
|
47
|
+
export { LazyAssets };
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF6eS1hc3NldHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvbGF6eS1hc3NldHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUN2RCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBTTlCLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQU96QyxJQUFNLFVBQVUsR0FBaEIsTUFBTSxVQUFVO0lBSW5CLFlBQXFCLFNBQXlCLEVBQ3pCLE1BQWMsRUFDZCxVQUFzQixFQUN0QixNQUFjLEVBQ2QsTUFBa0I7UUFKbEIsY0FBUyxHQUFULFNBQVMsQ0FBZ0I7UUFDekIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLFdBQU0sR0FBTixNQUFNLENBQVk7UUFDbkMsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFtQixFQUFFLFlBQXVCLEVBQUUsRUFBRSxTQUFpQixNQUFNO1FBQ2hGLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxFQUFDLEdBQUcsU0FBUyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUMsQ0FBQyxDQUFDO1FBQzVFLE1BQU0sSUFBSSxHQUFHO1lBQ1QsT0FBTztZQUNQLFNBQVM7WUFDVCxNQUFNO1NBQ1QsQ0FBQztRQUNGLE1BQU0sYUFBYSxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QyxJQUFJLGFBQWE7WUFBRSxPQUFPLGFBQWEsQ0FBQztRQUN4QyxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xELE9BQU8sSUFBSSxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzNHLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQVU7UUFDakIsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUMsR0FBRyxFQUFFLElBQUksUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUFDLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUE4QjtRQUNyQyxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xELE9BQU8sQ0FBQyxJQUFJO1lBQ1IsQ0FBQyxDQUFDLElBQUk7WUFDTixDQUFDLENBQUMsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3BHLENBQUM7SUFFRCxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQVU7UUFDbkIsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDeEIsT0FBTyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDMUIsQ0FBQztDQUNKLENBQUE7QUF6Q1ksVUFBVTtJQUZ0QixVQUFVLEVBQUU7SUFDWixNQUFNLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQztHQUNyQixVQUFVLENBeUN0QjtTQXpDWSxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpbmplY3RhYmxlLCBMaWZlY3ljbGUsIHNjb3BlZH0gZnJvbSBcInRzeXJpbmdlXCI7XHJcbmltcG9ydCB7T2JqZWN0SWR9IGZyb20gXCJic29uXCI7XHJcbmltcG9ydCB7Q29sbGVjdGlvbn0gZnJvbSBcIm1vbmdvZGJcIjtcclxuaW1wb3J0IHtGaWx0ZXJRdWVyeX0gZnJvbSBcIm1vbmdvb3NlXCI7XHJcbmltcG9ydCB7SUpvYiwgSUxhenlBc3NldCwgSm9iUGFyYW1zLCBUeXBlfSBmcm9tIFwiLi4vY29tbW9uLXR5cGVzXCI7XHJcbmltcG9ydCB7TW9uZ29Db25uZWN0b3J9IGZyb20gXCIuL21vbmdvLWNvbm5lY3RvclwiO1xyXG5pbXBvcnQge0Fzc2V0c30gZnJvbSBcIi4vYXNzZXRzXCI7XHJcbmltcG9ydCB7TGF6eUFzc2V0fSBmcm9tIFwiLi9lbnRpdGllcy9sYXp5LWFzc2V0XCI7XHJcbmltcG9ydCB7Sm9iTWFuYWdlcn0gZnJvbSBcIi4vam9iLW1hbmFnZXJcIjtcclxuaW1wb3J0IHtMb2dnZXJ9IGZyb20gXCIuL2xvZ2dlclwiO1xyXG5pbXBvcnQge1Byb2dyZXNzZXN9IGZyb20gXCIuL3Byb2dyZXNzZXNcIjtcclxuXHJcbkBpbmplY3RhYmxlKClcclxuQHNjb3BlZChMaWZlY3ljbGUuQ29udGFpbmVyU2NvcGVkKVxyXG5leHBvcnQgY2xhc3MgTGF6eUFzc2V0cyB7XHJcblxyXG4gICAgcHJvdGVjdGVkIGNvbGxlY3Rpb246IENvbGxlY3Rpb248UGFydGlhbDxJTGF6eUFzc2V0Pj47XHJcblxyXG4gICAgY29uc3RydWN0b3IocmVhZG9ubHkgY29ubmVjdG9yOiBNb25nb0Nvbm5lY3RvcixcclxuICAgICAgICAgICAgICAgIHJlYWRvbmx5IGFzc2V0czogQXNzZXRzLFxyXG4gICAgICAgICAgICAgICAgcmVhZG9ubHkgcHJvZ3Jlc3NlczogUHJvZ3Jlc3NlcyxcclxuICAgICAgICAgICAgICAgIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyLFxyXG4gICAgICAgICAgICAgICAgcmVhZG9ubHkgam9iTWFuOiBKb2JNYW5hZ2VyKSB7XHJcbiAgICAgICAgdGhpcy5jb2xsZWN0aW9uID0gY29ubmVjdG9yLmRhdGFiYXNlLmNvbGxlY3Rpb24oXCJsYXp5YXNzZXRzXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGNyZWF0ZShqb2JUeXBlOiBUeXBlPElKb2I+LCBqb2JQYXJhbXM6IEpvYlBhcmFtcyA9IHt9LCBqb2JRdWU6IHN0cmluZyA9IFwibWFpblwiKTogUHJvbWlzZTxJTGF6eUFzc2V0PiB7XHJcbiAgICAgICAgY29uc3Qgam9iTmFtZSA9IHRoaXMuam9iTWFuLnRyeVJlc29sdmUoam9iVHlwZSwgey4uLmpvYlBhcmFtcywgbGF6eUlkOiBcIlwifSk7XHJcbiAgICAgICAgY29uc3QgZGF0YSA9IHtcclxuICAgICAgICAgICAgam9iTmFtZSxcclxuICAgICAgICAgICAgam9iUGFyYW1zLFxyXG4gICAgICAgICAgICBqb2JRdWVcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nQXNzZXQgPSBhd2FpdCB0aGlzLmZpbmQoZGF0YSk7XHJcbiAgICAgICAgaWYgKGV4aXN0aW5nQXNzZXQpIHJldHVybiBleGlzdGluZ0Fzc2V0O1xyXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY29sbGVjdGlvbi5pbnNlcnRPbmUoZGF0YSk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBMYXp5QXNzZXQocmVzLmluc2VydGVkSWQsIGRhdGEsIHRoaXMuY29sbGVjdGlvbiwgdGhpcy5sb2dnZXIsIHRoaXMuYXNzZXRzLCB0aGlzLnByb2dyZXNzZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHJlYWQoaWQ6IHN0cmluZyk6IFByb21pc2U8SUxhenlBc3NldD4ge1xyXG4gICAgICAgIHJldHVybiAhaWQgPyBudWxsIDogdGhpcy5maW5kKHtfaWQ6IG5ldyBPYmplY3RJZChpZCl9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBmaW5kKHdoZXJlOiBGaWx0ZXJRdWVyeTxJTGF6eUFzc2V0Pik6IFByb21pc2U8SUxhenlBc3NldD4ge1xyXG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmNvbGxlY3Rpb24uZmluZE9uZSh3aGVyZSk7XHJcbiAgICAgICAgcmV0dXJuICFkYXRhXHJcbiAgICAgICAgICAgID8gbnVsbFxyXG4gICAgICAgICAgICA6IG5ldyBMYXp5QXNzZXQoZGF0YS5faWQsIGRhdGEsIHRoaXMuY29sbGVjdGlvbiwgdGhpcy5sb2dnZXIsIHRoaXMuYXNzZXRzLCB0aGlzLnByb2dyZXNzZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHVubGluayhpZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICBjb25zdCBhc3NldCA9IGF3YWl0IHRoaXMucmVhZChpZCk7XHJcbiAgICAgICAgaWYgKCFhc3NldCkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgcmV0dXJuIGFzc2V0LnVubGluaygpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { singleton } from "tsyringe";
|
|
3
|
+
let Logger = class Logger {
|
|
4
|
+
constructor(config) {
|
|
5
|
+
this.config = config;
|
|
6
|
+
this.tags = this.config.resolve("logTags");
|
|
7
|
+
this.ignoredTags = this.config.resolve("ignoredLogTags");
|
|
8
|
+
}
|
|
9
|
+
log(tag, ...params) {
|
|
10
|
+
if (this.ignoredTags.includes(tag))
|
|
11
|
+
return;
|
|
12
|
+
if (this.tags.length === 0 || this.tags.includes(tag)) {
|
|
13
|
+
console.log(`[${tag}]`, ...params);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
Logger = __decorate([
|
|
18
|
+
singleton()
|
|
19
|
+
], Logger);
|
|
20
|
+
export { Logger };
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL2xvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUk1QixJQUFNLE1BQU0sR0FBWixNQUFNLE1BQU07SUFLZixZQUFxQixNQUFxQjtRQUFyQixXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQ3RDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRCxHQUFHLENBQUMsR0FBVyxFQUFFLEdBQUcsTUFBYTtRQUM3QixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztZQUFFLE9BQU87UUFDM0MsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDbkQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUM7U0FDdEM7SUFDTCxDQUFDO0NBQ0osQ0FBQTtBQWhCWSxNQUFNO0lBRGxCLFNBQVMsRUFBRTtHQUNDLE1BQU0sQ0FnQmxCO1NBaEJZLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3NpbmdsZXRvbn0gZnJvbSBcInRzeXJpbmdlXCI7XHJcbmltcG9ydCB7Q29uZmlndXJhdGlvbn0gZnJvbSBcIi4vY29uZmlndXJhdGlvblwiO1xyXG5cclxuQHNpbmdsZXRvbigpXHJcbmV4cG9ydCBjbGFzcyBMb2dnZXIge1xyXG5cclxuICAgIHByb3RlY3RlZCB0YWdzOiBzdHJpbmdbXTtcclxuICAgIHByb3RlY3RlZCBpZ25vcmVkVGFnczogc3RyaW5nW107XHJcblxyXG4gICAgY29uc3RydWN0b3IocmVhZG9ubHkgY29uZmlnOiBDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgICAgdGhpcy50YWdzID0gdGhpcy5jb25maWcucmVzb2x2ZShcImxvZ1RhZ3NcIik7XHJcbiAgICAgICAgdGhpcy5pZ25vcmVkVGFncyA9IHRoaXMuY29uZmlnLnJlc29sdmUoXCJpZ25vcmVkTG9nVGFnc1wiKTtcclxuICAgIH1cclxuXHJcbiAgICBsb2codGFnOiBzdHJpbmcsIC4uLnBhcmFtczogYW55W10pOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5pZ25vcmVkVGFncy5pbmNsdWRlcyh0YWcpKSByZXR1cm47XHJcbiAgICAgICAgaWYgKHRoaXMudGFncy5sZW5ndGggPT09IDAgfHwgdGhpcy50YWdzLmluY2x1ZGVzKHRhZykpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYFske3RhZ31dYCwgLi4ucGFyYW1zKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIl19
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { singleton } from "tsyringe";
|
|
3
|
+
import { createTransport } from "nodemailer";
|
|
4
|
+
let MailSender = class MailSender {
|
|
5
|
+
constructor(config, renderer) {
|
|
6
|
+
this.config = config;
|
|
7
|
+
this.renderer = renderer;
|
|
8
|
+
this.transporter = createTransport({
|
|
9
|
+
host: this.config.resolve("smtpHost"),
|
|
10
|
+
port: this.config.resolve("smtpPort"),
|
|
11
|
+
auth: {
|
|
12
|
+
user: this.config.resolve("smtpUser"),
|
|
13
|
+
pass: this.config.resolve("smtpPassword"),
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
get translator() {
|
|
18
|
+
return this.renderer.translator;
|
|
19
|
+
}
|
|
20
|
+
async sendMail(language, options) {
|
|
21
|
+
const subject = await this.translator.getTranslation(language, options.subject || "-");
|
|
22
|
+
const html = await this.renderer.render(options.template, language, options.context);
|
|
23
|
+
return this.transporter.sendMail({
|
|
24
|
+
from: options.from || this.config.resolve("mailSenderAddress"),
|
|
25
|
+
to: options.to,
|
|
26
|
+
attachments: options.attachments,
|
|
27
|
+
subject,
|
|
28
|
+
html
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
MailSender = __decorate([
|
|
33
|
+
singleton()
|
|
34
|
+
], MailSender);
|
|
35
|
+
export { MailSender };
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbC1zZW5kZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvbWFpbC1zZW5kZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDbkMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLFlBQVksQ0FBQztBQWlCcEMsSUFBTSxVQUFVLEdBQWhCLE1BQU0sVUFBVTtJQVFuQixZQUFxQixNQUFxQixFQUFXLFFBQTBCO1FBQTFELFdBQU0sR0FBTixNQUFNLENBQWU7UUFBVyxhQUFRLEdBQVIsUUFBUSxDQUFrQjtRQUMzRSxJQUFJLENBQUMsV0FBVyxHQUFHLGVBQWUsQ0FBQztZQUMvQixJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO1lBQ3JDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7WUFDckMsSUFBSSxFQUFFO2dCQUNGLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7Z0JBQ3JDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUM7YUFDNUM7U0FDSixDQUFDLENBQUM7SUFDUCxDQUFDO0lBYkQsSUFBSSxVQUFVO1FBQ1YsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQztJQUNwQyxDQUFDO0lBYUQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFnQixFQUFFLE9BQW9CO1FBQ2pELE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxPQUFPLElBQUksR0FBRyxDQUFDLENBQUM7UUFDdkYsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckYsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQztZQUM3QixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQztZQUM5RCxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUU7WUFDZCxXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVc7WUFDaEMsT0FBTztZQUNQLElBQUk7U0FDUCxDQUFDLENBQUM7SUFDUCxDQUFDO0NBQ0osQ0FBQTtBQTlCWSxVQUFVO0lBRHRCLFNBQVMsRUFBRTtHQUNDLFVBQVUsQ0E4QnRCO1NBOUJZLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3NpbmdsZXRvbn0gZnJvbSBcInRzeXJpbmdlXCI7XHJcbmltcG9ydCB7Y3JlYXRlVHJhbnNwb3J0fSBmcm9tIFwibm9kZW1haWxlclwiO1xyXG5pbXBvcnQgKiBhcyBNYWlsIGZyb20gXCJub2RlbWFpbGVyL2xpYi9tYWlsZXJcIjtcclxuXHJcbmltcG9ydCB7VGVtcGxhdGVSZW5kZXJlcn0gZnJvbSBcIi4vdGVtcGxhdGUtcmVuZGVyZXJcIjtcclxuaW1wb3J0IHtUcmFuc2xhdG9yfSBmcm9tIFwiLi90cmFuc2xhdG9yXCI7XHJcbmltcG9ydCB7Q29uZmlndXJhdGlvbn0gZnJvbSBcIi4vY29uZmlndXJhdGlvblwiO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBNYWlsT3B0aW9ucyB7XHJcbiAgICB0bzogc3RyaW5nO1xyXG4gICAgZnJvbT86IHN0cmluZztcclxuICAgIHN1YmplY3Q/OiBzdHJpbmc7XHJcbiAgICB0ZW1wbGF0ZTogc3RyaW5nO1xyXG4gICAgY29udGV4dDogYW55O1xyXG4gICAgYXR0YWNobWVudHM/OiBNYWlsLkF0dGFjaG1lbnRbXVxyXG59XHJcblxyXG5Ac2luZ2xldG9uKClcclxuZXhwb3J0IGNsYXNzIE1haWxTZW5kZXIge1xyXG5cclxuICAgIHJlYWRvbmx5IHRyYW5zcG9ydGVyOiBNYWlsO1xyXG5cclxuICAgIGdldCB0cmFuc2xhdG9yKCk6IFRyYW5zbGF0b3Ige1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLnRyYW5zbGF0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IocmVhZG9ubHkgY29uZmlnOiBDb25maWd1cmF0aW9uLCByZWFkb25seSByZW5kZXJlcjogVGVtcGxhdGVSZW5kZXJlcikge1xyXG4gICAgICAgIHRoaXMudHJhbnNwb3J0ZXIgPSBjcmVhdGVUcmFuc3BvcnQoe1xyXG4gICAgICAgICAgICBob3N0OiB0aGlzLmNvbmZpZy5yZXNvbHZlKFwic210cEhvc3RcIiksXHJcbiAgICAgICAgICAgIHBvcnQ6IHRoaXMuY29uZmlnLnJlc29sdmUoXCJzbXRwUG9ydFwiKSxcclxuICAgICAgICAgICAgYXV0aDoge1xyXG4gICAgICAgICAgICAgICAgdXNlcjogdGhpcy5jb25maWcucmVzb2x2ZShcInNtdHBVc2VyXCIpLFxyXG4gICAgICAgICAgICAgICAgcGFzczogdGhpcy5jb25maWcucmVzb2x2ZShcInNtdHBQYXNzd29yZFwiKSxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNlbmRNYWlsKGxhbmd1YWdlOiBzdHJpbmcsIG9wdGlvbnM6IE1haWxPcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICBjb25zdCBzdWJqZWN0ID0gYXdhaXQgdGhpcy50cmFuc2xhdG9yLmdldFRyYW5zbGF0aW9uKGxhbmd1YWdlLCBvcHRpb25zLnN1YmplY3QgfHwgXCItXCIpO1xyXG4gICAgICAgIGNvbnN0IGh0bWwgPSBhd2FpdCB0aGlzLnJlbmRlcmVyLnJlbmRlcihvcHRpb25zLnRlbXBsYXRlLCBsYW5ndWFnZSwgb3B0aW9ucy5jb250ZXh0KTtcclxuICAgICAgICByZXR1cm4gdGhpcy50cmFuc3BvcnRlci5zZW5kTWFpbCh7XHJcbiAgICAgICAgICAgIGZyb206IG9wdGlvbnMuZnJvbSB8fCB0aGlzLmNvbmZpZy5yZXNvbHZlKFwibWFpbFNlbmRlckFkZHJlc3NcIiksXHJcbiAgICAgICAgICAgIHRvOiBvcHRpb25zLnRvLFxyXG4gICAgICAgICAgICBhdHRhY2htZW50czogb3B0aW9ucy5hdHRhY2htZW50cyxcclxuICAgICAgICAgICAgc3ViamVjdCxcclxuICAgICAgICAgICAgaHRtbFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { injectable, Lifecycle, scoped } from "tsyringe";
|
|
3
|
+
let MemoryCache = class MemoryCache {
|
|
4
|
+
constructor(cache) {
|
|
5
|
+
this.cache = cache;
|
|
6
|
+
this.cacheMap = new Map();
|
|
7
|
+
}
|
|
8
|
+
async set(key, value, ttl, expirationTimestamp = null, tags = {}) {
|
|
9
|
+
const now = Math.round(new Date().getTime() / 1000);
|
|
10
|
+
const expTimestamp = Math.min(isNaN(ttl) ? Number.MAX_SAFE_INTEGER : ttl, 3600);
|
|
11
|
+
this.cacheMap.set(key, {
|
|
12
|
+
_id: key,
|
|
13
|
+
data: value,
|
|
14
|
+
expirationTimestamp: expTimestamp,
|
|
15
|
+
expiresAt: now + expTimestamp,
|
|
16
|
+
});
|
|
17
|
+
return this.cache.set(key, value, ttl, expirationTimestamp, tags);
|
|
18
|
+
}
|
|
19
|
+
async get(key) {
|
|
20
|
+
let item = this.cacheMap.get(key);
|
|
21
|
+
const now = Math.round(new Date().getTime() / 1000);
|
|
22
|
+
let expTimestamp = 3600;
|
|
23
|
+
if (item && item.expiresAt && item.expiresAt < now) {
|
|
24
|
+
expTimestamp = item.expirationTimestamp;
|
|
25
|
+
item = null;
|
|
26
|
+
}
|
|
27
|
+
if (!item) {
|
|
28
|
+
const value = await this.cache.get(key);
|
|
29
|
+
this.cacheMap.set(key, {
|
|
30
|
+
_id: key,
|
|
31
|
+
data: value,
|
|
32
|
+
expirationTimestamp: expTimestamp,
|
|
33
|
+
expiresAt: now + expTimestamp,
|
|
34
|
+
});
|
|
35
|
+
return value;
|
|
36
|
+
}
|
|
37
|
+
return item.data;
|
|
38
|
+
}
|
|
39
|
+
async getOrSet(key, valueCb, ttl, expirationTimestamp = null, tags = {}) {
|
|
40
|
+
try {
|
|
41
|
+
return await this.get(key);
|
|
42
|
+
}
|
|
43
|
+
catch (e) {
|
|
44
|
+
return await this.set(key, await valueCb(), ttl, expirationTimestamp, tags);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async delete(key) {
|
|
48
|
+
this.cacheMap.delete(key);
|
|
49
|
+
await this.cacheMap.delete(key);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
MemoryCache = __decorate([
|
|
53
|
+
injectable(),
|
|
54
|
+
scoped(Lifecycle.ContainerScoped)
|
|
55
|
+
], MemoryCache);
|
|
56
|
+
export { MemoryCache };
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5LWNhY2hlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL21lbW9yeS1jYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBS2hELElBQU0sV0FBVyxHQUFqQixNQUFNLFdBQVc7SUFJcEIsWUFBK0IsS0FBWTtRQUFaLFVBQUssR0FBTCxLQUFLLENBQU87UUFDdkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBc0IsQ0FBQztJQUNsRCxDQUFDO0lBRUQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFXLEVBQUUsS0FBVSxFQUFFLEdBQVksRUFBRSxzQkFBOEIsSUFBSSxFQUFFLE9BQVksRUFBRTtRQUMvRixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDcEQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2hGLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNuQixHQUFHLEVBQUUsR0FBRztZQUNSLElBQUksRUFBRSxLQUFLO1lBQ1gsbUJBQW1CLEVBQUUsWUFBWTtZQUNqQyxTQUFTLEVBQUUsR0FBRyxHQUFHLFlBQVk7U0FDaEMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxtQkFBbUIsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRUQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFXO1FBQ2pCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNwRCxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDeEIsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsRUFBRTtZQUNoRCxZQUFZLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDO1lBQ3hDLElBQUksR0FBRyxJQUFJLENBQUM7U0FDZjtRQUNELElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDUCxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtnQkFDbkIsR0FBRyxFQUFFLEdBQUc7Z0JBQ1IsSUFBSSxFQUFFLEtBQUs7Z0JBQ1gsbUJBQW1CLEVBQUUsWUFBWTtnQkFDakMsU0FBUyxFQUFFLEdBQUcsR0FBRyxZQUFZO2FBQ2hDLENBQUMsQ0FBQztZQUNILE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQVcsRUFBRSxPQUEyQixFQUFFLEdBQVksRUFBRSxzQkFBOEIsSUFBSSxFQUFFLE9BQVksRUFBRTtRQUNySCxJQUFJO1lBQ0EsT0FBTyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDOUI7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNSLE9BQU8sTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxNQUFNLE9BQU8sRUFBRSxFQUFFLEdBQUcsRUFBRSxtQkFBbUIsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUMvRTtJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQVc7UUFDcEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUIsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNwQyxDQUFDO0NBQ0osQ0FBQTtBQXJEWSxXQUFXO0lBRnZCLFVBQVUsRUFBRTtJQUNaLE1BQU0sQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDO0dBQ3JCLFdBQVcsQ0FxRHZCO1NBckRZLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2luamVjdGFibGUsIExpZmVjeWNsZSwgc2NvcGVkfSBmcm9tIFwidHN5cmluZ2VcIjtcclxuaW1wb3J0IHtDYWNoZSwgSUNhY2hlSXRlbX0gZnJvbSBcIi4vY2FjaGVcIjtcclxuXHJcbkBpbmplY3RhYmxlKClcclxuQHNjb3BlZChMaWZlY3ljbGUuQ29udGFpbmVyU2NvcGVkKVxyXG5leHBvcnQgY2xhc3MgTWVtb3J5Q2FjaGUge1xyXG5cclxuICAgIHByb3RlY3RlZCByZWFkb25seSBjYWNoZU1hcDogTWFwPHN0cmluZywgSUNhY2hlSXRlbT47XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IGNhY2hlOiBDYWNoZSkge1xyXG4gICAgICAgIHRoaXMuY2FjaGVNYXAgPSBuZXcgTWFwPHN0cmluZywgSUNhY2hlSXRlbT4oKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnksIHR0bD86IG51bWJlciwgZXhwaXJhdGlvblRpbWVzdGFtcDogbnVtYmVyID0gbnVsbCwgdGFnczogYW55ID0ge30pOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIGNvbnN0IG5vdyA9IE1hdGgucm91bmQobmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwKTtcclxuICAgICAgICBjb25zdCBleHBUaW1lc3RhbXAgPSBNYXRoLm1pbihpc05hTih0dGwpID8gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgOiB0dGwsIDM2MDApO1xyXG4gICAgICAgIHRoaXMuY2FjaGVNYXAuc2V0KGtleSwge1xyXG4gICAgICAgICAgICBfaWQ6IGtleSxcclxuICAgICAgICAgICAgZGF0YTogdmFsdWUsXHJcbiAgICAgICAgICAgIGV4cGlyYXRpb25UaW1lc3RhbXA6IGV4cFRpbWVzdGFtcCxcclxuICAgICAgICAgICAgZXhwaXJlc0F0OiBub3cgKyBleHBUaW1lc3RhbXAsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuc2V0KGtleSwgdmFsdWUsIHR0bCwgZXhwaXJhdGlvblRpbWVzdGFtcCwgdGFncyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICBsZXQgaXRlbSA9IHRoaXMuY2FjaGVNYXAuZ2V0KGtleSk7XHJcbiAgICAgICAgY29uc3Qgbm93ID0gTWF0aC5yb3VuZChuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDApO1xyXG4gICAgICAgIGxldCBleHBUaW1lc3RhbXAgPSAzNjAwO1xyXG4gICAgICAgIGlmIChpdGVtICYmIGl0ZW0uZXhwaXJlc0F0ICYmIGl0ZW0uZXhwaXJlc0F0IDwgbm93KSB7XHJcbiAgICAgICAgICAgIGV4cFRpbWVzdGFtcCA9IGl0ZW0uZXhwaXJhdGlvblRpbWVzdGFtcDtcclxuICAgICAgICAgICAgaXRlbSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghaXRlbSkge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRoaXMuY2FjaGUuZ2V0KGtleSk7XHJcbiAgICAgICAgICAgIHRoaXMuY2FjaGVNYXAuc2V0KGtleSwge1xyXG4gICAgICAgICAgICAgICAgX2lkOiBrZXksXHJcbiAgICAgICAgICAgICAgICBkYXRhOiB2YWx1ZSxcclxuICAgICAgICAgICAgICAgIGV4cGlyYXRpb25UaW1lc3RhbXA6IGV4cFRpbWVzdGFtcCxcclxuICAgICAgICAgICAgICAgIGV4cGlyZXNBdDogbm93ICsgZXhwVGltZXN0YW1wLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaXRlbS5kYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldE9yU2V0KGtleTogc3RyaW5nLCB2YWx1ZUNiOiAoKSA9PiBQcm9taXNlPGFueT4sIHR0bD86IG51bWJlciwgZXhwaXJhdGlvblRpbWVzdGFtcDogbnVtYmVyID0gbnVsbCwgdGFnczogYW55ID0ge30pOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldChrZXkpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2V0KGtleSwgYXdhaXQgdmFsdWVDYigpLCB0dGwsIGV4cGlyYXRpb25UaW1lc3RhbXAsIHRhZ3MpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkZWxldGUoa2V5OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIHRoaXMuY2FjaGVNYXAuZGVsZXRlKGtleSk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5jYWNoZU1hcC5kZWxldGUoa2V5KTtcclxuICAgIH1cclxufVxyXG4iXX0=
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { singleton } from "tsyringe";
|
|
3
|
+
import { GridFSBucket } from "mongodb";
|
|
4
|
+
import { connect } from "mongoose";
|
|
5
|
+
let MongoConnector = class MongoConnector {
|
|
6
|
+
constructor(configuration) {
|
|
7
|
+
this.configuration = configuration;
|
|
8
|
+
this.conn = null;
|
|
9
|
+
this.db = null;
|
|
10
|
+
this.fsBucket = null;
|
|
11
|
+
}
|
|
12
|
+
get connection() {
|
|
13
|
+
return this.conn;
|
|
14
|
+
}
|
|
15
|
+
get database() {
|
|
16
|
+
return this.db;
|
|
17
|
+
}
|
|
18
|
+
get bucket() {
|
|
19
|
+
return this.fsBucket;
|
|
20
|
+
}
|
|
21
|
+
async connect() {
|
|
22
|
+
if (this.db)
|
|
23
|
+
return this.db;
|
|
24
|
+
this.conn = (await connect(this.configuration.resolve("mongoUri"), {
|
|
25
|
+
dbName: this.configuration.resolve("mongoDb"),
|
|
26
|
+
user: this.configuration.resolve("mongoUser"),
|
|
27
|
+
pass: this.configuration.resolve("mongoPassword")
|
|
28
|
+
})).connection;
|
|
29
|
+
this.db = this.conn.db;
|
|
30
|
+
this.fsBucket = new GridFSBucket(this.db, { bucketName: "assets" });
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
MongoConnector = __decorate([
|
|
34
|
+
singleton()
|
|
35
|
+
], MongoConnector);
|
|
36
|
+
export { MongoConnector };
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9uZ28tY29ubmVjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL21vbmdvLWNvbm5lY3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNuQyxPQUFPLEVBQUssWUFBWSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQ3pDLE9BQU8sRUFBQyxPQUFPLEVBQWEsTUFBTSxVQUFVLENBQUM7QUFJdEMsSUFBTSxjQUFjLEdBQXBCLE1BQU0sY0FBYztJQWtCdkIsWUFBcUIsYUFBNEI7UUFBNUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDN0MsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDZixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztJQUN6QixDQUFDO0lBcEJELElBQUksVUFBVTtRQUNWLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNyQixDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDTixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDekIsQ0FBQztJQVlELEtBQUssQ0FBQyxPQUFPO1FBQ1QsSUFBSSxJQUFJLENBQUMsRUFBRTtZQUFFLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFXLEVBQUU7WUFDekUsTUFBTSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztZQUM3QyxJQUFJLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO1lBQzdDLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUM7U0FDcEQsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1FBQ2YsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQVMsQ0FBQztRQUM5QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBQyxVQUFVLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQztJQUN0RSxDQUFDO0NBQ0osQ0FBQTtBQWxDWSxjQUFjO0lBRDFCLFNBQVMsRUFBRTtHQUNDLGNBQWMsQ0FrQzFCO1NBbENZLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3NpbmdsZXRvbn0gZnJvbSBcInRzeXJpbmdlXCI7XHJcbmltcG9ydCB7RGIsIEdyaWRGU0J1Y2tldH0gZnJvbSBcIm1vbmdvZGJcIjtcclxuaW1wb3J0IHtjb25uZWN0LCBDb25uZWN0aW9ufSBmcm9tIFwibW9uZ29vc2VcIjtcclxuaW1wb3J0IHtDb25maWd1cmF0aW9ufSBmcm9tIFwiLi9jb25maWd1cmF0aW9uXCI7XHJcblxyXG5Ac2luZ2xldG9uKClcclxuZXhwb3J0IGNsYXNzIE1vbmdvQ29ubmVjdG9yIHtcclxuXHJcbiAgICBnZXQgY29ubmVjdGlvbigpOiBDb25uZWN0aW9uIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb25uO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBkYXRhYmFzZSgpOiBEYiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGI7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGJ1Y2tldCgpOiBHcmlkRlNCdWNrZXQge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZzQnVja2V0O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBjb25uOiBDb25uZWN0aW9uO1xyXG4gICAgcHJvdGVjdGVkIGRiOiBEYjtcclxuICAgIHByb3RlY3RlZCBmc0J1Y2tldDogR3JpZEZTQnVja2V0O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGNvbmZpZ3VyYXRpb246IENvbmZpZ3VyYXRpb24pIHtcclxuICAgICAgICB0aGlzLmNvbm4gPSBudWxsO1xyXG4gICAgICAgIHRoaXMuZGIgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuZnNCdWNrZXQgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGNvbm5lY3QoKTogUHJvbWlzZTxEYj4ge1xyXG4gICAgICAgIGlmICh0aGlzLmRiKSByZXR1cm4gdGhpcy5kYjtcclxuICAgICAgICB0aGlzLmNvbm4gPSAoYXdhaXQgY29ubmVjdCh0aGlzLmNvbmZpZ3VyYXRpb24ucmVzb2x2ZShcIm1vbmdvVXJpXCIpIGFzIHN0cmluZywge1xyXG4gICAgICAgICAgICBkYk5hbWU6IHRoaXMuY29uZmlndXJhdGlvbi5yZXNvbHZlKFwibW9uZ29EYlwiKSxcclxuICAgICAgICAgICAgdXNlcjogdGhpcy5jb25maWd1cmF0aW9uLnJlc29sdmUoXCJtb25nb1VzZXJcIiksXHJcbiAgICAgICAgICAgIHBhc3M6IHRoaXMuY29uZmlndXJhdGlvbi5yZXNvbHZlKFwibW9uZ29QYXNzd29yZFwiKVxyXG4gICAgICAgIH0pKS5jb25uZWN0aW9uO1xyXG4gICAgICAgIHRoaXMuZGIgPSB0aGlzLmNvbm4uZGIgYXMgYW55O1xyXG4gICAgICAgIHRoaXMuZnNCdWNrZXQgPSBuZXcgR3JpZEZTQnVja2V0KHRoaXMuZGIsIHtidWNrZXROYW1lOiBcImFzc2V0c1wifSk7XHJcbiAgICB9XHJcbn1cclxuIl19
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { __decorate, __param } from "tslib";
|
|
2
|
+
import { inject, singleton } from "tsyringe";
|
|
3
|
+
import { getMetadataArgsStorage } from "routing-controllers";
|
|
4
|
+
import { routingControllersToSpec } from "routing-controllers-openapi";
|
|
5
|
+
import { validationMetadatasToSchemas } from "class-validator-jsonschema";
|
|
6
|
+
import { ValidationTypes } from "class-validator";
|
|
7
|
+
import { isDefined, isFunction, isObject } from "../utils";
|
|
8
|
+
import { IsFile, IsObjectId } from "../validators";
|
|
9
|
+
import { DI_CONTAINER, OPENAPI_VALIDATION } from "../common-types";
|
|
10
|
+
let OpenApi = class OpenApi {
|
|
11
|
+
constructor(container, customValidation) {
|
|
12
|
+
this.container = container;
|
|
13
|
+
this.customValidation = customValidation;
|
|
14
|
+
this.docs = null;
|
|
15
|
+
}
|
|
16
|
+
get apiDocs() {
|
|
17
|
+
if (!this.docs)
|
|
18
|
+
this.docs = this.createApiDocs();
|
|
19
|
+
return this.docs;
|
|
20
|
+
}
|
|
21
|
+
get apiDocsStr() {
|
|
22
|
+
if (!this.docsStr)
|
|
23
|
+
this.docsStr = JSON.stringify(this.apiDocs);
|
|
24
|
+
return this.docsStr;
|
|
25
|
+
}
|
|
26
|
+
async schemaToExample(src, req) {
|
|
27
|
+
if (src.$ref) {
|
|
28
|
+
const schemas = this.apiDocs.components.schemas;
|
|
29
|
+
const schema = src.$ref
|
|
30
|
+
.replace("#/components/schemas/", "")
|
|
31
|
+
.replace("#/definitions/", "");
|
|
32
|
+
return this.schemaToExample(schemas[schema], req);
|
|
33
|
+
}
|
|
34
|
+
let schema = src;
|
|
35
|
+
if (schema.oneOf) {
|
|
36
|
+
schema = Object.assign({}, schema, schema.oneOf[0]);
|
|
37
|
+
}
|
|
38
|
+
if (schema.type === "object") {
|
|
39
|
+
const result = {};
|
|
40
|
+
await Promise.all(Object.keys(schema.properties).map(async (key) => {
|
|
41
|
+
result[key] = await this.schemaToExample(schema.properties[key], req);
|
|
42
|
+
}));
|
|
43
|
+
return result;
|
|
44
|
+
}
|
|
45
|
+
if (schema.type === "array") {
|
|
46
|
+
return [await this.schemaToExample(schema.items, req)];
|
|
47
|
+
}
|
|
48
|
+
if (schema.type === "string") {
|
|
49
|
+
if (isDefined(schema.default)) {
|
|
50
|
+
if (isFunction(schema.default)) {
|
|
51
|
+
return schema.default(this.container);
|
|
52
|
+
}
|
|
53
|
+
return schema.default;
|
|
54
|
+
}
|
|
55
|
+
if (schema.format == "date") {
|
|
56
|
+
return new Date().toISOString().substr(0, 10);
|
|
57
|
+
}
|
|
58
|
+
if (schema.format == "date-time") {
|
|
59
|
+
return new Date().toISOString();
|
|
60
|
+
}
|
|
61
|
+
if (schema.enum) {
|
|
62
|
+
return schema.enum[0];
|
|
63
|
+
}
|
|
64
|
+
return "string";
|
|
65
|
+
}
|
|
66
|
+
if (schema.type === "number") {
|
|
67
|
+
return schema.default ?? 0;
|
|
68
|
+
}
|
|
69
|
+
else if (schema.type === "boolean") {
|
|
70
|
+
return schema.default ?? false;
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
return schema.default ?? null;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
createApiDocs() {
|
|
77
|
+
const storage = getMetadataArgsStorage();
|
|
78
|
+
const docs = routingControllersToSpec(storage);
|
|
79
|
+
docs.basePath = "/api/";
|
|
80
|
+
docs.definitions = validationMetadatasToSchemas({
|
|
81
|
+
additionalConverters: {
|
|
82
|
+
[ValidationTypes.CUSTOM_VALIDATION]: (meta, options) => {
|
|
83
|
+
const res = isFunction(this.customValidation) ? this.customValidation(meta, options) : this.customValidation;
|
|
84
|
+
if (isObject(res))
|
|
85
|
+
return res;
|
|
86
|
+
const constraints = meta.constraints || [];
|
|
87
|
+
if (meta.constraintCls === IsFile) {
|
|
88
|
+
return {
|
|
89
|
+
multi: constraints[0] || false,
|
|
90
|
+
type: "file"
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
if (meta.constraintCls === IsObjectId) {
|
|
94
|
+
return {
|
|
95
|
+
endpoint: constraints[0] || false,
|
|
96
|
+
multi: constraints[1] || false,
|
|
97
|
+
type: "list"
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
docs.components.schemas = docs.definitions;
|
|
105
|
+
return docs;
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
OpenApi = __decorate([
|
|
109
|
+
singleton(),
|
|
110
|
+
__param(0, inject(DI_CONTAINER)),
|
|
111
|
+
__param(1, inject(OPENAPI_VALIDATION))
|
|
112
|
+
], OpenApi);
|
|
113
|
+
export { OpenApi };
|
|
114
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3Blbi1hcGkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvb3Blbi1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsU0FBUyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRTNDLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQzNELE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBQ3JFLE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ3hFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDekQsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFDLFlBQVksRUFBa0Msa0JBQWtCLEVBQW9CLE1BQU0saUJBQWlCLENBQUM7QUFHN0csSUFBTSxPQUFPLEdBQWIsTUFBTSxPQUFPO0lBZWhCLFlBQTRDLFNBQStCLEVBQ3pCLGdCQUFtQztRQUR6QyxjQUFTLEdBQVQsU0FBUyxDQUFzQjtRQUN6QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQW1CO1FBQ2pGLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLENBQUM7SUFiRCxJQUFJLE9BQU87UUFDUCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7WUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNqRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDckIsQ0FBQztJQUVELElBQUksVUFBVTtRQUNWLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztZQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxD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Q0FBQzthQUNKO1NBQ0osQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUMzQyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0NBQ0osQ0FBQTtBQW5HWSxPQUFPO0lBRG5CLFNBQVMsRUFBRTtJQWdCSyxXQUFBLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQTtJQUNwQixXQUFBLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO0dBaEI5QixPQUFPLENBbUduQjtTQW5HWSxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpbmplY3QsIHNpbmdsZXRvbn0gZnJvbSBcInRzeXJpbmdlXCI7XHJcbmltcG9ydCB7T3BlbkFQSU9iamVjdCwgUmVmZXJlbmNlT2JqZWN0LCBTY2hlbWFPYmplY3R9IGZyb20gXCJvcGVuYXBpMy10c1wiO1xyXG5pbXBvcnQge2dldE1ldGFkYXRhQXJnc1N0b3JhZ2V9IGZyb20gXCJyb3V0aW5nLWNvbnRyb2xsZXJzXCI7XHJcbmltcG9ydCB7cm91dGluZ0NvbnRyb2xsZXJzVG9TcGVjfSBmcm9tIFwicm91dGluZy1jb250cm9sbGVycy1vcGVuYXBpXCI7XHJcbmltcG9ydCB7dmFsaWRhdGlvbk1ldGFkYXRhc1RvU2NoZW1hc30gZnJvbSBcImNsYXNzLXZhbGlkYXRvci1qc29uc2NoZW1hXCI7XHJcbmltcG9ydCB7VmFsaWRhdGlvblR5cGVzfSBmcm9tIFwiY2xhc3MtdmFsaWRhdG9yXCI7XHJcbmltcG9ydCB7aXNEZWZpbmVkLCBpc0Z1bmN0aW9uLCBpc09iamVjdH0gZnJvbSBcIi4uL3V0aWxzXCI7XHJcbmltcG9ydCB7SXNGaWxlLCBJc09iamVjdElkfSBmcm9tIFwiLi4vdmFsaWRhdG9yc1wiO1xyXG5pbXBvcnQge0RJX0NPTlRBSU5FUiwgSURlcGVuZGVuY3lDb250YWluZXIsIElSZXF1ZXN0LCBPUEVOQVBJX1ZBTElEQVRJT04sIE9wZW5BcGlWYWxpZGF0aW9ufSBmcm9tIFwiLi4vY29tbW9uLXR5cGVzXCI7XHJcblxyXG5Ac2luZ2xldG9uKClcclxuZXhwb3J0IGNsYXNzIE9wZW5BcGkge1xyXG5cclxuICAgIHByb3RlY3RlZCBkb2NzOiBPcGVuQVBJT2JqZWN0O1xyXG4gICAgcHJvdGVjdGVkIGRvY3NTdHI6IHN0cmluZztcclxuXHJcbiAgICBnZXQgYXBpRG9jcygpOiBPcGVuQVBJT2JqZWN0IHtcclxuICAgICAgICBpZiAoIXRoaXMuZG9jcykgdGhpcy5kb2NzID0gdGhpcy5jcmVhdGVBcGlEb2NzKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jcztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgYXBpRG9jc1N0cigpOiBzdHJpbmcge1xyXG4gICAgICAgIGlmICghdGhpcy5kb2NzU3RyKSB0aGlzLmRvY3NTdHIgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmFwaURvY3MpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRvY3NTdHI7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IoQGluamVjdChESV9DT05UQUlORVIpIHByb3RlY3RlZCBjb250YWluZXI6IElEZXBlbmRlbmN5Q29udGFpbmVyLFxyXG4gICAgICAgICAgICAgICAgQGluamVjdChPUEVOQVBJX1ZBTElEQVRJT04pIHByb3RlY3RlZCBjdXN0b21WYWxpZGF0aW9uOiBPcGVuQXBpVmFsaWRhdGlvbikge1xyXG4gICAgICAgIHRoaXMuZG9jcyA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2NoZW1hVG9FeGFtcGxlKHNyYzogUmVmZXJlbmNlT2JqZWN0IHwgU2NoZW1hT2JqZWN0LCByZXE/OiBJUmVxdWVzdCk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgaWYgKHNyYy4kcmVmKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNjaGVtYXMgPSB0aGlzLmFwaURvY3MuY29tcG9uZW50cy5zY2hlbWFzO1xyXG4gICAgICAgICAgICBjb25zdCBzY2hlbWEgPSBzcmMuJHJlZlxyXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoXCIjL2NvbXBvbmVudHMvc2NoZW1hcy9cIiwgXCJcIilcclxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKFwiIy9kZWZpbml0aW9ucy9cIiwgXCJcIik7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNjaGVtYVRvRXhhbXBsZShzY2hlbWFzW3NjaGVtYV0sIHJlcSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBzY2hlbWEgPSBzcmMgYXMgU2NoZW1hT2JqZWN0O1xyXG4gICAgICAgIGlmIChzY2hlbWEub25lT2YpIHtcclxuICAgICAgICAgICAgc2NoZW1hID0gT2JqZWN0LmFzc2lnbih7fSwgc2NoZW1hLCBzY2hlbWEub25lT2ZbMF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc2NoZW1hLnR5cGUgPT09IFwib2JqZWN0XCIpIHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XHJcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKE9iamVjdC5rZXlzKHNjaGVtYS5wcm9wZXJ0aWVzKS5tYXAoYXN5bmMga2V5ID0+IHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gYXdhaXQgdGhpcy5zY2hlbWFUb0V4YW1wbGUoc2NoZW1hLnByb3BlcnRpZXNba2V5XSwgcmVxKTtcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc2NoZW1hLnR5cGUgPT09IFwiYXJyYXlcIikge1xyXG4gICAgICAgICAgICByZXR1cm4gW2F3YWl0IHRoaXMuc2NoZW1hVG9FeGFtcGxlKHNjaGVtYS5pdGVtcywgcmVxKV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzY2hlbWEudHlwZSA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICBpZiAoaXNEZWZpbmVkKHNjaGVtYS5kZWZhdWx0KSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24oc2NoZW1hLmRlZmF1bHQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNjaGVtYS5kZWZhdWx0KHRoaXMuY29udGFpbmVyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBzY2hlbWEuZGVmYXVsdDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoc2NoZW1hLmZvcm1hdCA9PSBcImRhdGVcIikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zdWJzdHIoMCwgMTApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChzY2hlbWEuZm9ybWF0ID09IFwiZGF0ZS10aW1lXCIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHNjaGVtYS5lbnVtKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc2NoZW1hLmVudW1bMF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzY2hlbWEudHlwZSA9PT0gXCJudW1iZXJcIikge1xyXG4gICAgICAgICAgICByZXR1cm4gc2NoZW1hLmRlZmF1bHQgPz8gMDtcclxuICAgICAgICB9IGVsc2UgaWYgKHNjaGVtYS50eXBlID09PSBcImJvb2xlYW5cIikge1xyXG4gICAgICAgICAgICByZXR1cm4gc2NoZW1hLmRlZmF1bHQgPz8gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHNjaGVtYS5kZWZhdWx0ID8/IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBjcmVhdGVBcGlEb2NzKCk6IE9wZW5BUElPYmplY3Qge1xyXG4gICAgICAgIGNvbnN0IHN0b3JhZ2UgPSBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCk7XHJcbiAgICAgICAgY29uc3QgZG9jcyA9IHJvdXRpbmdDb250cm9sbGVyc1RvU3BlYyhzdG9yYWdlKTtcclxuICAgICAgICBkb2NzLmJhc2VQYXRoID0gXCIvYXBpL1wiO1xyXG4gICAgICAgIGRvY3MuZGVmaW5pdGlvbnMgPSB2YWxpZGF0aW9uTWV0YWRhdGFzVG9TY2hlbWFzKHtcclxuICAgICAgICAgICAgYWRkaXRpb25hbENvbnZlcnRlcnM6IHtcclxuICAgICAgICAgICAgICAgIFtWYWxpZGF0aW9uVHlwZXMuQ1VTVE9NX1ZBTElEQVRJT05dOiAobWV0YSwgb3B0aW9ucykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGlzRnVuY3Rpb24odGhpcy5jdXN0b21WYWxpZGF0aW9uKSA/IHRoaXMuY3VzdG9tVmFsaWRhdGlvbihtZXRhLCBvcHRpb25zKSA6IHRoaXMuY3VzdG9tVmFsaWRhdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNPYmplY3QocmVzKSkgcmV0dXJuIHJlcztcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJhaW50cyA9IG1ldGEuY29uc3RyYWludHMgfHwgW107XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGEuY29uc3RyYWludENscyA9PT0gSXNGaWxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aTogY29uc3RyYWludHNbMF0gfHwgZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImZpbGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGFzIGFueTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGEuY29uc3RyYWludENscyA9PT0gSXNPYmplY3RJZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnQ6IGNvbnN0cmFpbnRzWzBdIHx8IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGk6IGNvbnN0cmFpbnRzWzFdIHx8IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJsaXN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBhbnk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZG9jcy5jb21wb25lbnRzLnNjaGVtYXMgPSBkb2NzLmRlZmluaXRpb25zO1xyXG4gICAgICAgIHJldHVybiBkb2NzO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|