@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,73 @@
|
|
|
1
|
+
import { ObjectId } from "bson";
|
|
2
|
+
import { deleteFromBucket } from "../../utils";
|
|
3
|
+
import { BaseEntity } from "./base-entity";
|
|
4
|
+
export class LazyAsset extends BaseEntity {
|
|
5
|
+
constructor(id, data, collection, logger, assets, progresses) {
|
|
6
|
+
super(id, data, collection);
|
|
7
|
+
this.logger = logger;
|
|
8
|
+
this.assets = assets;
|
|
9
|
+
this.progresses = progresses;
|
|
10
|
+
}
|
|
11
|
+
get jobName() {
|
|
12
|
+
return this.data.jobName;
|
|
13
|
+
}
|
|
14
|
+
get jobParams() {
|
|
15
|
+
return this.data.jobParams;
|
|
16
|
+
}
|
|
17
|
+
get jobQue() {
|
|
18
|
+
return this.data.jobQue;
|
|
19
|
+
}
|
|
20
|
+
get progressId() {
|
|
21
|
+
return this.data.progressId;
|
|
22
|
+
}
|
|
23
|
+
get assetId() {
|
|
24
|
+
return this.data.assetId;
|
|
25
|
+
}
|
|
26
|
+
async unlink() {
|
|
27
|
+
await this.load();
|
|
28
|
+
if (!this.progressId) {
|
|
29
|
+
await this.collection.deleteOne({ _id: this.mId });
|
|
30
|
+
}
|
|
31
|
+
return deleteFromBucket(this.assets.bucket, new ObjectId(this.assetId));
|
|
32
|
+
}
|
|
33
|
+
startWorking() {
|
|
34
|
+
this.load().then(() => {
|
|
35
|
+
if (this.deleted)
|
|
36
|
+
return;
|
|
37
|
+
this.progresses.get(this.progressId).then(p => {
|
|
38
|
+
p?.cancel();
|
|
39
|
+
});
|
|
40
|
+
this.startWorkingOnAsset(false).then(() => {
|
|
41
|
+
this.logger.log("lazy-assets", `Started working on lazy asset: ${this.id}`);
|
|
42
|
+
}).catch(reason => {
|
|
43
|
+
this.logger.log("lazy-assets", `Can't start working on lazy asset: ${this.id}\nReason: ${reason}`);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
async loadAsset() {
|
|
48
|
+
await this.load();
|
|
49
|
+
if (this.deleted)
|
|
50
|
+
return null;
|
|
51
|
+
if (this.assetId) {
|
|
52
|
+
return this.assets.read(this.assetId);
|
|
53
|
+
}
|
|
54
|
+
if (this.progressId) {
|
|
55
|
+
await this.progresses.waitToFinish(this.progressId);
|
|
56
|
+
return this.loadAsset();
|
|
57
|
+
}
|
|
58
|
+
await this.startWorkingOnAsset(true);
|
|
59
|
+
return this.loadAsset();
|
|
60
|
+
}
|
|
61
|
+
async writeAsset(asset) {
|
|
62
|
+
this.data.assetId = asset.id;
|
|
63
|
+
await this.save();
|
|
64
|
+
return asset;
|
|
65
|
+
}
|
|
66
|
+
async startWorkingOnAsset(fromLoad) {
|
|
67
|
+
this.data.progressId = (await this.progresses.create()).id;
|
|
68
|
+
this.data.assetId = null;
|
|
69
|
+
await this.save();
|
|
70
|
+
await this.progresses.jobMan.enqueueWithName(this.data.jobName, { ...this.data.jobParams, lazyId: this.id, fromLoad });
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF6eS1hc3NldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9lbnRpdGllcy9sYXp5LWFzc2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFHOUIsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRzdDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFHekMsTUFBTSxPQUFPLFNBQVUsU0FBUSxVQUFzQjtJQXNCakQsWUFBWSxFQUFZLEVBQ1osSUFBeUIsRUFDekIsVUFBc0IsRUFDWixNQUFjLEVBQ2QsTUFBYyxFQUNkLFVBQXNCO1FBQ3hDLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBSFYsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxlQUFVLEdBQVYsVUFBVSxDQUFZO0lBRTVDLENBQUM7SUEzQkQsSUFBSSxPQUFPO1FBQ1AsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBSSxTQUFTO1FBQ1QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ04sT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUM1QixDQUFDO0lBRUQsSUFBSSxVQUFVO1FBQ1YsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUNoQyxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1AsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUM3QixDQUFDO0lBV0QsS0FBSyxDQUFDLE1BQU07UUFDUixNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQixJQUFJLENB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WyJpbXBvcnQge0NvbGxlY3Rpb259IGZyb20gXCJtb25nb2RiXCI7XHJcbmltcG9ydCB7T2JqZWN0SWR9IGZyb20gXCJic29uXCI7XHJcblxyXG5pbXBvcnQge0lBc3NldCwgSUxhenlBc3NldH0gZnJvbSBcIi4uLy4uL2NvbW1vbi10eXBlc1wiO1xyXG5pbXBvcnQge2RlbGV0ZUZyb21CdWNrZXR9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xyXG5pbXBvcnQge0Fzc2V0c30gZnJvbSBcIi4uL2Fzc2V0c1wiO1xyXG5pbXBvcnQge1Byb2dyZXNzZXN9IGZyb20gXCIuLi9wcm9ncmVzc2VzXCI7XHJcbmltcG9ydCB7QmFzZUVudGl0eX0gZnJvbSBcIi4vYmFzZS1lbnRpdHlcIjtcclxuaW1wb3J0IHtMb2dnZXJ9IGZyb20gXCIuLi9sb2dnZXJcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBMYXp5QXNzZXQgZXh0ZW5kcyBCYXNlRW50aXR5PElMYXp5QXNzZXQ+IGltcGxlbWVudHMgSUxhenlBc3NldCB7XHJcblxyXG4gICAgZ2V0IGpvYk5hbWUoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmpvYk5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGpvYlBhcmFtcygpOiBhbnkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuam9iUGFyYW1zO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBqb2JRdWUoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmpvYlF1ZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcHJvZ3Jlc3NJZCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEucHJvZ3Jlc3NJZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgYXNzZXRJZCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuYXNzZXRJZDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpZDogT2JqZWN0SWQsXHJcbiAgICAgICAgICAgICAgICBkYXRhOiBQYXJ0aWFsPElMYXp5QXNzZXQ+LFxyXG4gICAgICAgICAgICAgICAgY29sbGVjdGlvbjogQ29sbGVjdGlvbixcclxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBsb2dnZXI6IExvZ2dlcixcclxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBhc3NldHM6IEFzc2V0cyxcclxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBwcm9ncmVzc2VzOiBQcm9ncmVzc2VzKSB7XHJcbiAgICAgICAgc3VwZXIoaWQsIGRhdGEsIGNvbGxlY3Rpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHVubGluaygpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgICAgIGF3YWl0IHRoaXMubG9hZCgpO1xyXG4gICAgICAgIGlmICghdGhpcy5wcm9ncmVzc0lkKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29sbGVjdGlvbi5kZWxldGVPbmUoe19pZDogdGhpcy5tSWR9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGRlbGV0ZUZyb21CdWNrZXQodGhpcy5hc3NldHMuYnVja2V0LCBuZXcgT2JqZWN0SWQodGhpcy5hc3NldElkKSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhcnRXb3JraW5nKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubG9hZCgpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5kZWxldGVkKSByZXR1cm47XHJcbiAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3Nlcy5nZXQodGhpcy5wcm9ncmVzc0lkKS50aGVuKHAgPT4ge1xyXG4gICAgICAgICAgICAgICAgcD8uY2FuY2VsKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLnN0YXJ0V29ya2luZ09uQXNzZXQoZmFsc2UpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIubG9nKFwibGF6eS1hc3NldHNcIiwgYFN0YXJ0ZWQgd29ya2luZyBvbiBsYXp5IGFzc2V0OiAke3RoaXMuaWR9YCk7XHJcbiAgICAgICAgICAgIH0pLmNhdGNoKHJlYXNvbiA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coXCJsYXp5LWFzc2V0c1wiLCBgQ2FuJ3Qgc3RhcnQgd29ya2luZyBvbiBsYXp5IGFzc2V0OiAke3RoaXMuaWR9XFxuUmVhc29uOiAke3JlYXNvbn1gKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbG9hZEFzc2V0KCk6IFByb21pc2U8SUFzc2V0PiB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuZGVsZXRlZCkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgaWYgKHRoaXMuYXNzZXRJZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hc3NldHMucmVhZCh0aGlzLmFzc2V0SWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5wcm9ncmVzc0lkKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvZ3Jlc3Nlcy53YWl0VG9GaW5pc2godGhpcy5wcm9ncmVzc0lkKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZEFzc2V0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IHRoaXMuc3RhcnRXb3JraW5nT25Bc3NldCh0cnVlKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5sb2FkQXNzZXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyB3cml0ZUFzc2V0KGFzc2V0OiBJQXNzZXQpOiBQcm9taXNlPElBc3NldD4ge1xyXG4gICAgICAgIHRoaXMuZGF0YS5hc3NldElkID0gYXNzZXQuaWQ7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlKCk7XHJcbiAgICAgICAgcmV0dXJuIGFzc2V0O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBhc3luYyBzdGFydFdvcmtpbmdPbkFzc2V0KGZyb21Mb2FkOiBib29sZWFuKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICB0aGlzLmRhdGEucHJvZ3Jlc3NJZCA9IChhd2FpdCB0aGlzLnByb2dyZXNzZXMuY3JlYXRlKCkpLmlkO1xyXG4gICAgICAgIHRoaXMuZGF0YS5hc3NldElkID0gbnVsbDtcclxuICAgICAgICBhd2FpdCB0aGlzLnNhdmUoKTtcclxuICAgICAgICBhd2FpdCB0aGlzLnByb2dyZXNzZXMuam9iTWFuLmVucXVldWVXaXRoTmFtZSh0aGlzLmRhdGEuam9iTmFtZSwgey4uLnRoaXMuZGF0YS5qb2JQYXJhbXMsIGxhenlJZDogdGhpcy5pZCwgZnJvbUxvYWR9KTtcclxuICAgIH1cclxufVxyXG4iXX0=
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { BaseEntity } from "./base-entity";
|
|
2
|
+
export class Progress extends BaseEntity {
|
|
3
|
+
constructor(id, data, collection) {
|
|
4
|
+
super(id, data, collection);
|
|
5
|
+
}
|
|
6
|
+
get current() {
|
|
7
|
+
return this.data.current;
|
|
8
|
+
}
|
|
9
|
+
get max() {
|
|
10
|
+
return this.data.max;
|
|
11
|
+
}
|
|
12
|
+
get message() {
|
|
13
|
+
return this.data.message;
|
|
14
|
+
}
|
|
15
|
+
get error() {
|
|
16
|
+
return this.data.error;
|
|
17
|
+
}
|
|
18
|
+
get canceled() {
|
|
19
|
+
return this.data.canceled;
|
|
20
|
+
}
|
|
21
|
+
get percent() {
|
|
22
|
+
return this.max > 0 ? Math.round(this.current / this.max * 100) : 0;
|
|
23
|
+
}
|
|
24
|
+
get remaining() {
|
|
25
|
+
return this.max > 0 ? this.max - this.current : 0;
|
|
26
|
+
}
|
|
27
|
+
setMessageBridge(messageBridge) {
|
|
28
|
+
this.messageBridge = messageBridge || this.messageBridge;
|
|
29
|
+
return this;
|
|
30
|
+
}
|
|
31
|
+
async createSubProgress(progressValue, max, message) {
|
|
32
|
+
if (max <= 0 && progressValue > 0) {
|
|
33
|
+
await this.advance(progressValue);
|
|
34
|
+
}
|
|
35
|
+
if (message !== null) {
|
|
36
|
+
this.data.message = message;
|
|
37
|
+
await this.save();
|
|
38
|
+
}
|
|
39
|
+
return new SubProgress(this, this.current, progressValue, Math.max(max, 1));
|
|
40
|
+
}
|
|
41
|
+
async setMax(max) {
|
|
42
|
+
if (isNaN(max) || max <= 0) {
|
|
43
|
+
throw "Max progress value must be bigger than zero";
|
|
44
|
+
}
|
|
45
|
+
this.data.max = max;
|
|
46
|
+
await this.save();
|
|
47
|
+
}
|
|
48
|
+
async setMessage(message) {
|
|
49
|
+
this.data.message = message;
|
|
50
|
+
await this.save();
|
|
51
|
+
}
|
|
52
|
+
async setError(error) {
|
|
53
|
+
this.data.error = error;
|
|
54
|
+
await this.save();
|
|
55
|
+
}
|
|
56
|
+
async advance(value = 1) {
|
|
57
|
+
if (isNaN(value) || value <= 0) {
|
|
58
|
+
throw new Error(`Advance value must be bigger than zero: ${this.id}`);
|
|
59
|
+
}
|
|
60
|
+
await this.load();
|
|
61
|
+
if (this.deleted || this.canceled) {
|
|
62
|
+
const status = this.deleted ? "deleted" : "canceled";
|
|
63
|
+
throw new Error(`Can't advance ${status} progress: ${this.id}`);
|
|
64
|
+
}
|
|
65
|
+
this.data.current = Math.min(this.max, this.current + value);
|
|
66
|
+
await this.save();
|
|
67
|
+
}
|
|
68
|
+
async cancel() {
|
|
69
|
+
this.data.canceled = true;
|
|
70
|
+
await this.save();
|
|
71
|
+
}
|
|
72
|
+
save() {
|
|
73
|
+
if (this.messageBridge) {
|
|
74
|
+
this.messageBridge.sendMessage(`progress-changed`, this.toJSON());
|
|
75
|
+
}
|
|
76
|
+
return super.save();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
export class SubProgress {
|
|
80
|
+
constructor(parent, progressFrom, progressValue, mMax = 100) {
|
|
81
|
+
this.parent = parent;
|
|
82
|
+
this.progressFrom = progressFrom;
|
|
83
|
+
this.progressValue = progressValue;
|
|
84
|
+
this.mMax = mMax;
|
|
85
|
+
if (progressFrom < 0) {
|
|
86
|
+
throw "Progress from must be bigger than or zero";
|
|
87
|
+
}
|
|
88
|
+
if (progressValue <= 0) {
|
|
89
|
+
throw "Progress value must be bigger than zero";
|
|
90
|
+
}
|
|
91
|
+
this.mCurrent = 0;
|
|
92
|
+
}
|
|
93
|
+
get id() {
|
|
94
|
+
return this.parent.id;
|
|
95
|
+
}
|
|
96
|
+
get current() {
|
|
97
|
+
return this.mCurrent;
|
|
98
|
+
}
|
|
99
|
+
get max() {
|
|
100
|
+
return this.mMax;
|
|
101
|
+
}
|
|
102
|
+
get message() {
|
|
103
|
+
return this.parent.message;
|
|
104
|
+
}
|
|
105
|
+
get error() {
|
|
106
|
+
return this.parent.error;
|
|
107
|
+
}
|
|
108
|
+
get percent() {
|
|
109
|
+
return this.parent.percent;
|
|
110
|
+
}
|
|
111
|
+
get remaining() {
|
|
112
|
+
return this.max - this.mCurrent;
|
|
113
|
+
}
|
|
114
|
+
get canceled() {
|
|
115
|
+
return !this.parent || this.parent.canceled;
|
|
116
|
+
}
|
|
117
|
+
setMessageBridge(messageBridge) {
|
|
118
|
+
if (!this.parent)
|
|
119
|
+
return this;
|
|
120
|
+
this.parent.setMessageBridge(messageBridge);
|
|
121
|
+
return this;
|
|
122
|
+
}
|
|
123
|
+
async createSubProgress(progressValue, max, message) {
|
|
124
|
+
if (max <= 0 && progressValue > 0) {
|
|
125
|
+
await this.advance(progressValue);
|
|
126
|
+
}
|
|
127
|
+
if (message !== null) {
|
|
128
|
+
await this.setMessage(message);
|
|
129
|
+
}
|
|
130
|
+
return new SubProgress(this, this.current, progressValue, Math.max(max, 1));
|
|
131
|
+
}
|
|
132
|
+
async setMax(max) {
|
|
133
|
+
if (isNaN(max) || max <= 0) {
|
|
134
|
+
throw "Max progress value must be bigger than zero";
|
|
135
|
+
}
|
|
136
|
+
this.mMax = max;
|
|
137
|
+
await this.save();
|
|
138
|
+
}
|
|
139
|
+
async setMessage(message) {
|
|
140
|
+
if (!this.parent)
|
|
141
|
+
return null;
|
|
142
|
+
await this.parent.setMessage(message);
|
|
143
|
+
}
|
|
144
|
+
async setError(error) {
|
|
145
|
+
if (!this.parent)
|
|
146
|
+
return null;
|
|
147
|
+
await this.parent.setError(error);
|
|
148
|
+
}
|
|
149
|
+
async advance(value = 1) {
|
|
150
|
+
if (isNaN(value) || value <= 0) {
|
|
151
|
+
throw "Advance value must be bigger than zero";
|
|
152
|
+
}
|
|
153
|
+
this.mCurrent = Math.min(this.max, this.mCurrent + value);
|
|
154
|
+
await this.save();
|
|
155
|
+
}
|
|
156
|
+
async cancel() {
|
|
157
|
+
if (!this.parent)
|
|
158
|
+
return null;
|
|
159
|
+
await this.parent.cancel();
|
|
160
|
+
}
|
|
161
|
+
async save() {
|
|
162
|
+
const ratio = this.max > 0 ? this.mCurrent / this.max : 0;
|
|
163
|
+
const newProgress = this.progressFrom + Math.round(this.progressValue * ratio);
|
|
164
|
+
const current = this.parent.current;
|
|
165
|
+
if (newProgress <= current)
|
|
166
|
+
return null;
|
|
167
|
+
await this.parent.advance(newProgress);
|
|
168
|
+
}
|
|
169
|
+
async load() {
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
toJSON() {
|
|
173
|
+
return this.parent.toJSON();
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3Jlc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvZW50aXRpZXMvcHJvZ3Jlc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUV6QyxNQUFNLE9BQU8sUUFBUyxTQUFRLFVBQXFCO0lBZ0MvQyxZQUFZLEVBQVksRUFDWixJQUF3QixFQUN4QixVQUFzQjtRQUM5QixLQUFLLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBaENELElBQUksT0FBTztRQUNQLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDN0IsQ0FBQztJQUVELElBQUksR0FBRztRQUNILE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDekIsQ0FBQztJQUVELElBQUksT0FBTztRQUNQLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDN0IsQ0FBQztJQUVELElBQUksS0FBSztRQUNMLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQUVELElBQUksUUFBUTtRQUNSLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQUksT0FBTztRQUNQLE9BQU8sSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVELElBQUksU0FBUztRQUNULE9BQU8sSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFRRCxnQkFBZ0IsQ0FBQyxhQUE2QjtRQUMxQyxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3pELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxLQUFLLENBQUMsaUJBQWlCLENBQUMsYUFBcUIsRUFBRSxHQUFZLEVBQUUsT0FBZ0I7UUFDekUsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLGFBQWEsR0FBRyxDQUFDLEVBQUU7WUFDL0IsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ3JDO1FBQ0QsSUFBSSxPQUFPLEtBQUssSUFBSSxFQUFFO1lBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztZQUM1QixNQUFNLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNyQjtRQUNELE9BQU8sSUFBSSxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUVELEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBVztRQUNwQixJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFO1lBQ3hCLE1BQU0sNkNBQTZDLENBQUM7U0FDdkQ7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDcEIsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBZTtRQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDNUIsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBYTtRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDeEIsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBZ0IsQ0FBQztRQUMzQixJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFO1lBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ3pFO1FBQ0QsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEIsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDL0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7WUFDckQsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsTUFBTSxjQUFjLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ25FO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUM7UUFDN0QsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELEtBQUssQ0FBQyxNQUFNO1FBQ1IsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQzFCLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxJQUFJO1FBQ0EsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3BCLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1NBQ3JFO1FBQ0QsT0FBTyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDeEIsQ0FBQztDQUNKO0FBRUQsTUFBTSxPQUFPLFdBQVc7SUFvQ3BCLFlBQXNCLE1BQWlCLEVBQVksWUFBb0IsRUFBWSxhQUFxQixFQUFZLE9BQWUsR0FBRztRQUFoSCxXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQVksaUJBQVksR0FBWixZQUFZLENBQVE7UUFBWSxrQkFBYSxHQUFiLGFBQWEsQ0FBUTtRQUFZLFNBQUksR0FBSixJQUFJLENBQWM7UUFDbEksSUFBSSxZQUFZLEdBQUcsQ0FBQyxFQUFFO1lBQ2xCLE1BQU0sMkNBQTJDLENBQUM7U0FDckQ7UUFDRCxJQUFJLGFBQWEsSUFBSSxDQUFDLEVBQUU7WUFDcEIsTUFBTSx5Q0FBeUMsQ0FBQztTQUNuRDtRQUNELElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUExQ0QsSUFBSSxFQUFFO1FBQ0YsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1AsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxJQUFJLEdBQUc7UUFDSCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDckIsQ0FBQztJQUVELElBQUksT0FBTztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQUksS0FBSztRQUNMLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDN0IsQ0FBQztJQUVELElBQUksT0FBTztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQUksU0FBUztRQUNULE9BQU8sSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDUixPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztJQUNoRCxDQUFDO0lBY0QsZ0JBQWdCLENBQUMsYUFBNkI7UUFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM1QyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsS0FBSyxDQUFDLGlCQUFpQixDQUFDLGFBQXFCLEVBQUUsR0FBWSxFQUFFLE9BQWdCO1FBQ3pFLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxhQUFhLEdBQUcsQ0FBQyxFQUFFO1lBQy9CLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUNyQztRQUNELElBQUksT0FBTyxLQUFLLElBQUksRUFBRTtZQUNsQixNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDbEM7UUFDRCxPQUFPLElBQUksV0FBVyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFFRCxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQVc7UUFDcEIsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRTtZQUN4QixNQUFNLDZDQUE2QyxDQUFDO1NBQ3ZEO1FBQ0QsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7UUFDaEIsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBZTtRQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLElBQUksQ0FBQztRQUM5QixNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQWE7UUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDOUIsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFnQixDQUFDO1FBQzNCLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUU7WUFDNUIsTUFBTSx3Q0FBd0MsQ0FBQztTQUNsRDtRQUNELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUM7UUFDMUQsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELEtBQUssQ0FBQyxNQUFNO1FBQ1IsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDOUIsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSTtRQUNOLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsQ0FBQztRQUMvRSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUNwQyxJQUFJLFdBQVcsSUFBSSxPQUFPO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDeEMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUMxQyxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsTUFBTTtRQUNGLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge09iamVjdElkfSBmcm9tIFwiYnNvblwiO1xyXG5pbXBvcnQge0NvbGxlY3Rpb259IGZyb20gXCJtb25nb2RiXCI7XHJcbmltcG9ydCB7SU1lc3NhZ2VCcmlkZ2UsIElQcm9ncmVzc30gZnJvbSBcIi4uLy4uL2NvbW1vbi10eXBlc1wiO1xyXG5pbXBvcnQge0Jhc2VFbnRpdHl9IGZyb20gXCIuL2Jhc2UtZW50aXR5XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgUHJvZ3Jlc3MgZXh0ZW5kcyBCYXNlRW50aXR5PElQcm9ncmVzcz4gaW1wbGVtZW50cyBJUHJvZ3Jlc3Mge1xyXG5cclxuICAgIHByb3RlY3RlZCBtZXNzYWdlQnJpZGdlOiBJTWVzc2FnZUJyaWRnZTtcclxuXHJcbiAgICBnZXQgY3VycmVudCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuY3VycmVudDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbWF4KCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5tYXg7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG1lc3NhZ2UoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLm1lc3NhZ2U7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGVycm9yKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5lcnJvcjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY2FuY2VsZWQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5jYW5jZWxlZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcGVyY2VudCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1heCA+IDAgPyBNYXRoLnJvdW5kKHRoaXMuY3VycmVudCAvIHRoaXMubWF4ICogMTAwKSA6IDA7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHJlbWFpbmluZygpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1heCA+IDAgPyB0aGlzLm1heCAtIHRoaXMuY3VycmVudCA6IDA7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IoaWQ6IE9iamVjdElkLFxyXG4gICAgICAgICAgICAgICAgZGF0YTogUGFydGlhbDxJUHJvZ3Jlc3M+LFxyXG4gICAgICAgICAgICAgICAgY29sbGVjdGlvbjogQ29sbGVjdGlvbikge1xyXG4gICAgICAgIHN1cGVyKGlkLCBkYXRhLCBjb2xsZWN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRNZXNzYWdlQnJpZGdlKG1lc3NhZ2VCcmlkZ2U6IElNZXNzYWdlQnJpZGdlKTogdGhpcyB7XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlQnJpZGdlID0gbWVzc2FnZUJyaWRnZSB8fCB0aGlzLm1lc3NhZ2VCcmlkZ2U7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgY3JlYXRlU3ViUHJvZ3Jlc3MocHJvZ3Jlc3NWYWx1ZTogbnVtYmVyLCBtYXg/OiBudW1iZXIsIG1lc3NhZ2U/OiBzdHJpbmcpOiBQcm9taXNlPElQcm9ncmVzcz4ge1xyXG4gICAgICAgIGlmIChtYXggPD0gMCAmJiBwcm9ncmVzc1ZhbHVlID4gMCkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFkdmFuY2UocHJvZ3Jlc3NWYWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChtZXNzYWdlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YS5tZXNzYWdlID0gbWVzc2FnZTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zYXZlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgU3ViUHJvZ3Jlc3ModGhpcywgdGhpcy5jdXJyZW50LCBwcm9ncmVzc1ZhbHVlLCBNYXRoLm1heChtYXgsIDEpKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzZXRNYXgobWF4OiBudW1iZXIpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIGlmIChpc05hTihtYXgpIHx8IG1heCA8PSAwKSB7XHJcbiAgICAgICAgICAgIHRocm93IFwiTWF4IHByb2dyZXNzIHZhbHVlIG11c3QgYmUgYmlnZ2VyIHRoYW4gemVyb1wiO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmRhdGEubWF4ID0gbWF4O1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2F2ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNldE1lc3NhZ2UobWVzc2FnZTogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICB0aGlzLmRhdGEubWVzc2FnZSA9IG1lc3NhZ2U7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2V0RXJyb3IoZXJyb3I6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhLmVycm9yID0gZXJyb3I7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgYWR2YW5jZSh2YWx1ZTogbnVtYmVyID0gMSk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA8PSAwKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQWR2YW5jZSB2YWx1ZSBtdXN0IGJlIGJpZ2dlciB0aGFuIHplcm86ICR7dGhpcy5pZH1gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuZGVsZXRlZCB8fCB0aGlzLmNhbmNlbGVkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IHRoaXMuZGVsZXRlZCA/IFwiZGVsZXRlZFwiIDogXCJjYW5jZWxlZFwiO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IGFkdmFuY2UgJHtzdGF0dXN9IHByb2dyZXNzOiAke3RoaXMuaWR9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZGF0YS5jdXJyZW50ID0gTWF0aC5taW4odGhpcy5tYXgsIHRoaXMuY3VycmVudCArIHZhbHVlKTtcclxuICAgICAgICBhd2FpdCB0aGlzLnNhdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBjYW5jZWwoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICB0aGlzLmRhdGEuY2FuY2VsZWQgPSB0cnVlO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2F2ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNhdmUoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICBpZiAodGhpcy5tZXNzYWdlQnJpZGdlKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZUJyaWRnZS5zZW5kTWVzc2FnZShgcHJvZ3Jlc3MtY2hhbmdlZGAsIHRoaXMudG9KU09OKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3VwZXIuc2F2ZSgpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgU3ViUHJvZ3Jlc3MgaW1wbGVtZW50cyBJUHJvZ3Jlc3Mge1xyXG5cclxuICAgIGdldCBpZCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudC5pZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY3VycmVudCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1DdXJyZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBtYXgoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5tTWF4O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBtZXNzYWdlKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50Lm1lc3NhZ2U7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGVycm9yKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50LmVycm9yO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBwZXJjZW50KCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50LnBlcmNlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHJlbWFpbmluZygpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1heCAtIHRoaXMubUN1cnJlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNhbmNlbGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAhdGhpcy5wYXJlbnQgfHwgdGhpcy5wYXJlbnQuY2FuY2VsZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIG1DdXJyZW50OiBudW1iZXI7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIHBhcmVudDogSVByb2dyZXNzLCBwcm90ZWN0ZWQgcHJvZ3Jlc3NGcm9tOiBudW1iZXIsIHByb3RlY3RlZCBwcm9ncmVzc1ZhbHVlOiBudW1iZXIsIHByb3RlY3RlZCBtTWF4OiBudW1iZXIgPSAxMDApIHtcclxuICAgICAgICBpZiAocHJvZ3Jlc3NGcm9tIDwgMCkge1xyXG4gICAgICAgICAgICB0aHJvdyBcIlByb2dyZXNzIGZyb20gbXVzdCBiZSBiaWdnZXIgdGhhbiBvciB6ZXJvXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwcm9ncmVzc1ZhbHVlIDw9IDApIHtcclxuICAgICAgICAgICAgdGhyb3cgXCJQcm9ncmVzcyB2YWx1ZSBtdXN0IGJlIGJpZ2dlciB0aGFuIHplcm9cIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5tQ3VycmVudCA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0TWVzc2FnZUJyaWRnZShtZXNzYWdlQnJpZGdlOiBJTWVzc2FnZUJyaWRnZSk6IHRoaXMge1xyXG4gICAgICAgIGlmICghdGhpcy5wYXJlbnQpIHJldHVybiB0aGlzO1xyXG4gICAgICAgIHRoaXMucGFyZW50LnNldE1lc3NhZ2VCcmlkZ2UobWVzc2FnZUJyaWRnZSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgY3JlYXRlU3ViUHJvZ3Jlc3MocHJvZ3Jlc3NWYWx1ZTogbnVtYmVyLCBtYXg/OiBudW1iZXIsIG1lc3NhZ2U/OiBzdHJpbmcpOiBQcm9taXNlPElQcm9ncmVzcz4ge1xyXG4gICAgICAgIGlmIChtYXggPD0gMCAmJiBwcm9ncmVzc1ZhbHVlID4gMCkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFkdmFuY2UocHJvZ3Jlc3NWYWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChtZXNzYWdlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0TWVzc2FnZShtZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5ldyBTdWJQcm9ncmVzcyh0aGlzLCB0aGlzLmN1cnJlbnQsIHByb2dyZXNzVmFsdWUsIE1hdGgubWF4KG1heCwgMSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNldE1heChtYXg6IG51bWJlcik6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgaWYgKGlzTmFOKG1heCkgfHwgbWF4IDw9IDApIHtcclxuICAgICAgICAgICAgdGhyb3cgXCJNYXggcHJvZ3Jlc3MgdmFsdWUgbXVzdCBiZSBiaWdnZXIgdGhhbiB6ZXJvXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubU1heCA9IG1heDtcclxuICAgICAgICBhd2FpdCB0aGlzLnNhdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzZXRNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnBhcmVudCkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5wYXJlbnQuc2V0TWVzc2FnZShtZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzZXRFcnJvcihlcnJvcjogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICBpZiAoIXRoaXMucGFyZW50KSByZXR1cm4gbnVsbDtcclxuICAgICAgICBhd2FpdCB0aGlzLnBhcmVudC5zZXRFcnJvcihlcnJvcik7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgYWR2YW5jZSh2YWx1ZTogbnVtYmVyID0gMSk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA8PSAwKSB7XHJcbiAgICAgICAgICAgIHRocm93IFwiQWR2YW5jZSB2YWx1ZSBtdXN0IGJlIGJpZ2dlciB0aGFuIHplcm9cIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5tQ3VycmVudCA9IE1hdGgubWluKHRoaXMubWF4LCB0aGlzLm1DdXJyZW50ICsgdmFsdWUpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2F2ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGNhbmNlbCgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5wYXJlbnQpIHJldHVybiBudWxsO1xyXG4gICAgICAgIGF3YWl0IHRoaXMucGFyZW50LmNhbmNlbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNhdmUoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICBjb25zdCByYXRpbyA9IHRoaXMubWF4ID4gMCA/IHRoaXMubUN1cnJlbnQgLyB0aGlzLm1heCA6IDA7XHJcbiAgICAgICAgY29uc3QgbmV3UHJvZ3Jlc3MgPSB0aGlzLnByb2dyZXNzRnJvbSArIE1hdGgucm91bmQodGhpcy5wcm9ncmVzc1ZhbHVlICogcmF0aW8pO1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnBhcmVudC5jdXJyZW50O1xyXG4gICAgICAgIGlmIChuZXdQcm9ncmVzcyA8PSBjdXJyZW50KSByZXR1cm4gbnVsbDtcclxuICAgICAgICBhd2FpdCB0aGlzLnBhcmVudC5hZHZhbmNlKG5ld1Byb2dyZXNzKVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGxvYWQoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICB0b0pTT04oKTogYW55IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQudG9KU09OKCk7XHJcbiAgICB9XHJcbn1cclxuIl19
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { ObjectId } from "bson";
|
|
2
|
+
import { bufferToStream, toImage } from "../../utils";
|
|
3
|
+
export class TempAsset {
|
|
4
|
+
constructor(buffer, filename, contentType, metadata) {
|
|
5
|
+
this.buffer = buffer;
|
|
6
|
+
this.filename = filename;
|
|
7
|
+
this.contentType = contentType;
|
|
8
|
+
this.metadata = metadata;
|
|
9
|
+
this.id = new ObjectId().toHexString();
|
|
10
|
+
}
|
|
11
|
+
get stream() {
|
|
12
|
+
return bufferToStream(this.buffer);
|
|
13
|
+
}
|
|
14
|
+
async unlink() {
|
|
15
|
+
throw new Error(`Temp asset '${this.id}' can not be removed!`);
|
|
16
|
+
}
|
|
17
|
+
async getBuffer() {
|
|
18
|
+
return this.buffer;
|
|
19
|
+
}
|
|
20
|
+
async download(metadata) {
|
|
21
|
+
return this.stream;
|
|
22
|
+
}
|
|
23
|
+
downloadImage(params, metadata) {
|
|
24
|
+
Object.assign(this.metadata, metadata || {});
|
|
25
|
+
return toImage(this.stream, params, this.metadata);
|
|
26
|
+
}
|
|
27
|
+
getImage(params) {
|
|
28
|
+
return this.downloadImage(params);
|
|
29
|
+
}
|
|
30
|
+
async save() {
|
|
31
|
+
return this;
|
|
32
|
+
}
|
|
33
|
+
async load() {
|
|
34
|
+
return this;
|
|
35
|
+
}
|
|
36
|
+
toJSON() {
|
|
37
|
+
return {
|
|
38
|
+
id: this.id,
|
|
39
|
+
filename: this.filename,
|
|
40
|
+
contentType: this.contentType,
|
|
41
|
+
metadata: this.metadata
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcC1hc3NldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9lbnRpdGllcy90ZW1wLWFzc2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFOUIsT0FBTyxFQUFDLGNBQWMsRUFBRSxPQUFPLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFcEQsTUFBTSxPQUFPLFNBQVM7SUFRbEIsWUFBc0IsTUFBYyxFQUFXLFFBQWdCLEVBQVcsV0FBbUIsRUFBVyxRQUFvQjtRQUF0RyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQVcsYUFBUSxHQUFSLFFBQVEsQ0FBUTtRQUFXLGdCQUFXLEdBQVgsV0FBVyxDQUFRO1FBQVcsYUFBUSxHQUFSLFFBQVEsQ0FBWTtRQUN4SCxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDM0MsQ0FBQztJQU5ELElBQUksTUFBTTtRQUNOLE9BQU8sY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBTUQsS0FBSyxDQUFDLE1BQU07UUFDUixNQUFNLElBQUksS0FBSyxDQUFDLGVBQWUsSUFBSSxDQUFDLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsS0FBSyxDQUFDLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBcUI7UUFDaEMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxhQUFhLENBQUMsTUFBMEIsRUFBRSxRQUFxQjtRQUMzRCxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzdDLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsUUFBUSxDQUFDLE1BQTBCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsTUFBTTtRQUNGLE9BQU87WUFDSCxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7WUFDWCxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzdCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtTQUMxQixDQUFDO0lBQ04sQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtSZWFkYWJsZX0gZnJvbSBcInN0cmVhbVwiO1xyXG5pbXBvcnQge09iamVjdElkfSBmcm9tIFwiYnNvblwiO1xyXG5pbXBvcnQge0lBc3NldCwgSUFzc2V0SW1hZ2VQYXJhbXMsIElBc3NldE1ldGF9IGZyb20gXCIuLi8uLi9jb21tb24tdHlwZXNcIjtcclxuaW1wb3J0IHtidWZmZXJUb1N0cmVhbSwgdG9JbWFnZX0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgVGVtcEFzc2V0IGltcGxlbWVudHMgSUFzc2V0IHtcclxuXHJcbiAgICByZWFkb25seSBpZDogc3RyaW5nO1xyXG5cclxuICAgIGdldCBzdHJlYW0oKTogUmVhZGFibGUge1xyXG4gICAgICAgIHJldHVybiBidWZmZXJUb1N0cmVhbSh0aGlzLmJ1ZmZlcik7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIGJ1ZmZlcjogQnVmZmVyLCByZWFkb25seSBmaWxlbmFtZTogc3RyaW5nLCByZWFkb25seSBjb250ZW50VHlwZTogc3RyaW5nLCByZWFkb25seSBtZXRhZGF0YTogSUFzc2V0TWV0YSkge1xyXG4gICAgICAgIHRoaXMuaWQgPSBuZXcgT2JqZWN0SWQoKS50b0hleFN0cmluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHVubGluaygpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGVtcCBhc3NldCAnJHt0aGlzLmlkfScgY2FuIG5vdCBiZSByZW1vdmVkIWApO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldEJ1ZmZlcigpOiBQcm9taXNlPEJ1ZmZlcj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlcjtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkb3dubG9hZChtZXRhZGF0YT86IElBc3NldE1ldGEpOiBQcm9taXNlPFJlYWRhYmxlPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtO1xyXG4gICAgfVxyXG5cclxuICAgIGRvd25sb2FkSW1hZ2UocGFyYW1zPzogSUFzc2V0SW1hZ2VQYXJhbXMsIG1ldGFkYXRhPzogSUFzc2V0TWV0YSk6IFByb21pc2U8UmVhZGFibGU+IHtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMubWV0YWRhdGEsIG1ldGFkYXRhIHx8IHt9KTtcclxuICAgICAgICByZXR1cm4gdG9JbWFnZSh0aGlzLnN0cmVhbSwgcGFyYW1zLCB0aGlzLm1ldGFkYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRJbWFnZShwYXJhbXM/OiBJQXNzZXRJbWFnZVBhcmFtcyk6IFByb21pc2U8UmVhZGFibGU+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kb3dubG9hZEltYWdlKHBhcmFtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2F2ZSgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGxvYWQoKTogUHJvbWlzZTx0aGlzPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgdG9KU09OKCk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXHJcbiAgICAgICAgICAgIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLFxyXG4gICAgICAgICAgICBjb250ZW50VHlwZTogdGhpcy5jb250ZW50VHlwZSxcclxuICAgICAgICAgICAgbWV0YWRhdGE6IHRoaXMubWV0YWRhdGFcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { __decorate, __param } from "tslib";
|
|
2
|
+
import { injectable, injectAll, Lifecycle, scoped } from "tsyringe";
|
|
3
|
+
import { FIXTURE } from "../common-types";
|
|
4
|
+
let Fixtures = class Fixtures {
|
|
5
|
+
constructor(fixtures) {
|
|
6
|
+
this.fixtures = fixtures;
|
|
7
|
+
}
|
|
8
|
+
async load(output) {
|
|
9
|
+
if (!this.fixtures)
|
|
10
|
+
return;
|
|
11
|
+
output = output || {
|
|
12
|
+
write: console.log,
|
|
13
|
+
writeln: t => console.log(t + "\n")
|
|
14
|
+
};
|
|
15
|
+
for (let fixture of this.fixtures) {
|
|
16
|
+
await fixture.load(output);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
Fixtures = __decorate([
|
|
21
|
+
injectable(),
|
|
22
|
+
scoped(Lifecycle.ContainerScoped),
|
|
23
|
+
__param(0, injectAll(FIXTURE))
|
|
24
|
+
], Fixtures);
|
|
25
|
+
export { Fixtures };
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvZml4dHVyZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDbEUsT0FBTyxFQUFDLE9BQU8sRUFBMkIsTUFBTSxpQkFBaUIsQ0FBQztBQUkzRCxJQUFNLFFBQVEsR0FBZCxNQUFNLFFBQVE7SUFFakIsWUFBMEMsUUFBb0I7UUFBcEIsYUFBUSxHQUFSLFFBQVEsQ0FBWTtJQUU5RCxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFzQjtRQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBQzNCLE1BQU0sR0FBRyxNQUFNLElBQUk7WUFDZixLQUFLLEVBQUUsT0FBTyxDQUFDLEdBQUc7WUFDbEIsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1NBQ3RDLENBQUM7UUFDRixLQUFLLElBQUksT0FBTyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDL0IsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzlCO0lBQ0wsQ0FBQztDQUNKLENBQUE7QUFoQlksUUFBUTtJQUZwQixVQUFVLEVBQUU7SUFDWixNQUFNLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQztJQUdqQixXQUFBLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtHQUZ0QixRQUFRLENBZ0JwQjtTQWhCWSxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpbmplY3RhYmxlLCBpbmplY3RBbGwsIExpZmVjeWNsZSwgc2NvcGVkfSBmcm9tIFwidHN5cmluZ2VcIjtcclxuaW1wb3J0IHtGSVhUVVJFLCBJRml4dHVyZSwgSUZpeHR1cmVPdXRwdXR9IGZyb20gXCIuLi9jb21tb24tdHlwZXNcIjtcclxuXHJcbkBpbmplY3RhYmxlKClcclxuQHNjb3BlZChMaWZlY3ljbGUuQ29udGFpbmVyU2NvcGVkKVxyXG5leHBvcnQgY2xhc3MgRml4dHVyZXMge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKEBpbmplY3RBbGwoRklYVFVSRSkgcHJvdGVjdGVkIGZpeHR1cmVzOiBJRml4dHVyZVtdKSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGxvYWQob3V0cHV0OiBJRml4dHVyZU91dHB1dCk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmZpeHR1cmVzKSByZXR1cm47XHJcbiAgICAgICAgb3V0cHV0ID0gb3V0cHV0IHx8IHtcclxuICAgICAgICAgICAgd3JpdGU6IGNvbnNvbGUubG9nLFxyXG4gICAgICAgICAgICB3cml0ZWxuOiB0ID0+IGNvbnNvbGUubG9nKHQgKyBcIlxcblwiKVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgZm9yIChsZXQgZml4dHVyZSBvZiB0aGlzLmZpeHR1cmVzKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGZpeHR1cmUubG9hZChvdXRwdXQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { injectable, Lifecycle, scoped } from "tsyringe";
|
|
3
|
+
import { GalleryImage } from "./gallery-image";
|
|
4
|
+
let GalleryCache = class GalleryCache {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.imgCache = {};
|
|
7
|
+
}
|
|
8
|
+
put(img) {
|
|
9
|
+
this.imgCache[img.thumb] = img;
|
|
10
|
+
this.imgCache[img.big] = img;
|
|
11
|
+
}
|
|
12
|
+
serve(id) {
|
|
13
|
+
const img = this.imgCache[id];
|
|
14
|
+
return !img ? null : img.serve(id);
|
|
15
|
+
}
|
|
16
|
+
create(folder, targetSize, handler) {
|
|
17
|
+
const image = new GalleryImage(folder, targetSize, handler);
|
|
18
|
+
this.put(image);
|
|
19
|
+
return image;
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
GalleryCache = __decorate([
|
|
23
|
+
injectable(),
|
|
24
|
+
scoped(Lifecycle.ContainerScoped)
|
|
25
|
+
], GalleryCache);
|
|
26
|
+
export { GalleryCache };
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FsbGVyeS1jYWNoZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9nYWxsZXJ5LWNhY2hlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFFdkQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBSXRDLElBQU0sWUFBWSxHQUFsQixNQUFNLFlBQVk7SUFJckI7UUFDSSxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQsR0FBRyxDQUFDLEdBQWtCO1FBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUMvQixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDakMsQ0FBQztJQUVELEtBQUssQ0FBQyxFQUFVO1FBQ1osTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5QixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELE1BQU0sQ0FBQyxNQUFjLEVBQUUsVUFBd0IsRUFBRSxPQUE2QjtRQUMxRSxNQUFNLEtBQUssR0FBRyxJQUFJLFlBQVksQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEIsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztDQUNKLENBQUE7QUF2QlksWUFBWTtJQUZ4QixVQUFVLEVBQUU7SUFDWixNQUFNLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQztHQUNyQixZQUFZLENBdUJ4QjtTQXZCWSxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpbmplY3RhYmxlLCBMaWZlY3ljbGUsIHNjb3BlZH0gZnJvbSBcInRzeXJpbmdlXCI7XHJcbmltcG9ydCB7SUdhbGxlcnlJbWFnZSwgSUdhbGxlcnlJbWFnZUhhbmRsZXIsIElHYWxsZXJ5U2l6ZX0gZnJvbSBcIi4uL2NvbW1vbi10eXBlc1wiO1xyXG5pbXBvcnQge0dhbGxlcnlJbWFnZX0gZnJvbSBcIi4vZ2FsbGVyeS1pbWFnZVwiO1xyXG5cclxuQGluamVjdGFibGUoKVxyXG5Ac2NvcGVkKExpZmVjeWNsZS5Db250YWluZXJTY29wZWQpXHJcbmV4cG9ydCBjbGFzcyBHYWxsZXJ5Q2FjaGUge1xyXG5cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgaW1nQ2FjaGU6IHsgW2lkOiBzdHJpbmddOiBJR2FsbGVyeUltYWdlIH07XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5pbWdDYWNoZSA9IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIHB1dChpbWc6IElHYWxsZXJ5SW1hZ2UpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmltZ0NhY2hlW2ltZy50aHVtYl0gPSBpbWc7XHJcbiAgICAgICAgdGhpcy5pbWdDYWNoZVtpbWcuYmlnXSA9IGltZztcclxuICAgIH1cclxuXHJcbiAgICBzZXJ2ZShpZDogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcclxuICAgICAgICBjb25zdCBpbWcgPSB0aGlzLmltZ0NhY2hlW2lkXTtcclxuICAgICAgICByZXR1cm4gIWltZyA/IG51bGwgOiBpbWcuc2VydmUoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZShmb2xkZXI6IHN0cmluZywgdGFyZ2V0U2l6ZTogSUdhbGxlcnlTaXplLCBoYW5kbGVyOiBJR2FsbGVyeUltYWdlSGFuZGxlcik6IElHYWxsZXJ5SW1hZ2Uge1xyXG4gICAgICAgIGNvbnN0IGltYWdlID0gbmV3IEdhbGxlcnlJbWFnZShmb2xkZXIsIHRhcmdldFNpemUsIGhhbmRsZXIpO1xyXG4gICAgICAgIHRoaXMucHV0KGltYWdlKTtcclxuICAgICAgICByZXR1cm4gaW1hZ2U7XHJcbiAgICB9XHJcbn1cclxuIl19
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { v4 as uuidv4 } from "uuid";
|
|
2
|
+
import sharp_ from "sharp";
|
|
3
|
+
const sharp = sharp_;
|
|
4
|
+
const bigSize = 1500;
|
|
5
|
+
const thumbSize = 250;
|
|
6
|
+
export class GalleryImage {
|
|
7
|
+
constructor(folder, size, handler) {
|
|
8
|
+
this.folder = folder;
|
|
9
|
+
this.handler = handler;
|
|
10
|
+
this.thumb = uuidv4();
|
|
11
|
+
this.big = uuidv4();
|
|
12
|
+
this.targetSize = !size ? { width: thumbSize, height: thumbSize } : size;
|
|
13
|
+
}
|
|
14
|
+
async serve(id) {
|
|
15
|
+
const isThumb = id == this.thumb;
|
|
16
|
+
if (await this.handler.hasResult(isThumb)) {
|
|
17
|
+
return this.handler.serveResult(isThumb);
|
|
18
|
+
}
|
|
19
|
+
const original = sharp(await this.handler.getOriginal()).rotate();
|
|
20
|
+
const meta = await original.metadata();
|
|
21
|
+
const ratio = meta.width / meta.height;
|
|
22
|
+
const sizeRatio = isThumb ? this.targetSize.width / this.targetSize.height : 1;
|
|
23
|
+
const size = isThumb ? Math.max(this.targetSize.width, this.targetSize.height) : bigSize;
|
|
24
|
+
const targetHeight = ratio > sizeRatio ? size : Math.round(size / ratio);
|
|
25
|
+
const targetWidth = Math.round(targetHeight * ratio);
|
|
26
|
+
const resized = original.resize(targetWidth, targetHeight);
|
|
27
|
+
const buffer = await (isThumb ? resized.extract({
|
|
28
|
+
left: Math.floor((targetWidth - this.targetSize.width) / 2),
|
|
29
|
+
top: Math.floor((targetHeight - this.targetSize.height) / 2),
|
|
30
|
+
width: this.targetSize.width,
|
|
31
|
+
height: this.targetSize.height
|
|
32
|
+
}).toBuffer() : resized.toBuffer());
|
|
33
|
+
await this.handler.writeResult(isThumb, buffer);
|
|
34
|
+
return this.handler.serveResult(isThumb);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FsbGVyeS1pbWFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9nYWxsZXJ5LWltYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxFQUFFLElBQUksTUFBTSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ2xDLE9BQU8sTUFBTSxNQUFNLE9BQU8sQ0FBQztBQUczQixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUM7QUFDckIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDO0FBQ3JCLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQztBQUV0QixNQUFNLE9BQU8sWUFBWTtJQU1yQixZQUFxQixNQUFjLEVBQUUsSUFBa0IsRUFBVyxPQUE2QjtRQUExRSxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQStCLFlBQU8sR0FBUCxPQUFPLENBQXNCO1FBQzNGLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxNQUFNLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDM0UsQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBVTtRQUNsQixNQUFNLE9BQU8sR0FBRyxFQUFFLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQztRQUVqQyxJQUFJLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDdkMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM1QztRQUVELE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNsRSxNQUFNLElBQUksR0FBRyxNQUFNLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN2QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDdkMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9FLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDekYsTUFBTSxZQUFZLEdBQUcsS0FBSyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQztRQUN6RSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsQ0FBQztRQUVyRCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUMzRCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1lBQzVDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzNELEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzVELEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUs7WUFDNUIsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTTtTQUNqQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBRXBDLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2hELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDN0MsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHt2NCBhcyB1dWlkdjR9IGZyb20gXCJ1dWlkXCI7XHJcbmltcG9ydCBzaGFycF8gZnJvbSBcInNoYXJwXCI7XHJcbmltcG9ydCB7SUdhbGxlcnlJbWFnZSwgSUdhbGxlcnlTaXplLCBJR2FsbGVyeUltYWdlSGFuZGxlcn0gZnJvbSBcIi4uL2NvbW1vbi10eXBlc1wiO1xyXG5cclxuY29uc3Qgc2hhcnAgPSBzaGFycF87XHJcbmNvbnN0IGJpZ1NpemUgPSAxNTAwO1xyXG5jb25zdCB0aHVtYlNpemUgPSAyNTA7XHJcblxyXG5leHBvcnQgY2xhc3MgR2FsbGVyeUltYWdlIGltcGxlbWVudHMgSUdhbGxlcnlJbWFnZSB7XHJcblxyXG4gICAgcmVhZG9ubHkgdGh1bWI6IHN0cmluZztcclxuICAgIHJlYWRvbmx5IGJpZzogc3RyaW5nO1xyXG4gICAgcmVhZG9ubHkgdGFyZ2V0U2l6ZTogSUdhbGxlcnlTaXplO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGZvbGRlcjogc3RyaW5nLCBzaXplOiBJR2FsbGVyeVNpemUsIHJlYWRvbmx5IGhhbmRsZXI6IElHYWxsZXJ5SW1hZ2VIYW5kbGVyKSB7XHJcbiAgICAgICAgdGhpcy50aHVtYiA9IHV1aWR2NCgpO1xyXG4gICAgICAgIHRoaXMuYmlnID0gdXVpZHY0KCk7XHJcbiAgICAgICAgdGhpcy50YXJnZXRTaXplID0gIXNpemUgPyB7d2lkdGg6IHRodW1iU2l6ZSwgaGVpZ2h0OiB0aHVtYlNpemV9IDogc2l6ZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzZXJ2ZShpZDogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcclxuICAgICAgICBjb25zdCBpc1RodW1iID0gaWQgPT0gdGhpcy50aHVtYjtcclxuXHJcbiAgICAgICAgaWYgKGF3YWl0IHRoaXMuaGFuZGxlci5oYXNSZXN1bHQoaXNUaHVtYikpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlci5zZXJ2ZVJlc3VsdChpc1RodW1iKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsID0gc2hhcnAoYXdhaXQgdGhpcy5oYW5kbGVyLmdldE9yaWdpbmFsKCkpLnJvdGF0ZSgpO1xyXG4gICAgICAgIGNvbnN0IG1ldGEgPSBhd2FpdCBvcmlnaW5hbC5tZXRhZGF0YSgpO1xyXG4gICAgICAgIGNvbnN0IHJhdGlvID0gbWV0YS53aWR0aCAvIG1ldGEuaGVpZ2h0O1xyXG4gICAgICAgIGNvbnN0IHNpemVSYXRpbyA9IGlzVGh1bWIgPyB0aGlzLnRhcmdldFNpemUud2lkdGggLyB0aGlzLnRhcmdldFNpemUuaGVpZ2h0IDogMTtcclxuICAgICAgICBjb25zdCBzaXplID0gaXNUaHVtYiA/IE1hdGgubWF4KHRoaXMudGFyZ2V0U2l6ZS53aWR0aCwgdGhpcy50YXJnZXRTaXplLmhlaWdodCkgOiBiaWdTaXplO1xyXG4gICAgICAgIGNvbnN0IHRhcmdldEhlaWdodCA9IHJhdGlvID4gc2l6ZVJhdGlvID8gc2l6ZSA6IE1hdGgucm91bmQoc2l6ZSAvIHJhdGlvKTtcclxuICAgICAgICBjb25zdCB0YXJnZXRXaWR0aCA9IE1hdGgucm91bmQodGFyZ2V0SGVpZ2h0ICogcmF0aW8pO1xyXG5cclxuICAgICAgICBjb25zdCByZXNpemVkID0gb3JpZ2luYWwucmVzaXplKHRhcmdldFdpZHRoLCB0YXJnZXRIZWlnaHQpO1xyXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IChpc1RodW1iID8gcmVzaXplZC5leHRyYWN0KHtcclxuICAgICAgICAgICAgbGVmdDogTWF0aC5mbG9vcigodGFyZ2V0V2lkdGggLSB0aGlzLnRhcmdldFNpemUud2lkdGgpIC8gMiksXHJcbiAgICAgICAgICAgIHRvcDogTWF0aC5mbG9vcigodGFyZ2V0SGVpZ2h0IC0gdGhpcy50YXJnZXRTaXplLmhlaWdodCkgLyAyKSxcclxuICAgICAgICAgICAgd2lkdGg6IHRoaXMudGFyZ2V0U2l6ZS53aWR0aCxcclxuICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLnRhcmdldFNpemUuaGVpZ2h0XHJcbiAgICAgICAgfSkudG9CdWZmZXIoKSA6IHJlc2l6ZWQudG9CdWZmZXIoKSk7XHJcblxyXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlci53cml0ZVJlc3VsdChpc1RodW1iLCBidWZmZXIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXIuc2VydmVSZXN1bHQoaXNUaHVtYik7XHJcbiAgICB9XHJcbn1cclxuIl19
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { injectable, Lifecycle, scoped } from "tsyringe";
|
|
3
|
+
import sharp_ from "sharp";
|
|
4
|
+
import { access, constants, lstat, readdir, readFile, writeFile } from "fs";
|
|
5
|
+
import { join, dirname } from "path";
|
|
6
|
+
import { mkdirRecursive } from "../utils";
|
|
7
|
+
const sharp = sharp_;
|
|
8
|
+
let Gallery = class Gallery {
|
|
9
|
+
constructor(config, galleryCache) {
|
|
10
|
+
this.config = config;
|
|
11
|
+
this.galleryCache = galleryCache;
|
|
12
|
+
this.cache = {};
|
|
13
|
+
this.dir = this.config.resolve("galleryDir");
|
|
14
|
+
this.output = join(this.config.resolve("cacheDir"), "gallery");
|
|
15
|
+
}
|
|
16
|
+
async getFolder(folder, size = null) {
|
|
17
|
+
this.cache[folder] = this.cache[folder] || new Promise(resolve => {
|
|
18
|
+
lstat(join(this.dir, folder), (err, stats) => {
|
|
19
|
+
if (err || !stats.isDirectory()) {
|
|
20
|
+
resolve([]);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
this.readRecursive(folder, "", size).then(resolve, () => resolve([]));
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
return this.cache[folder];
|
|
27
|
+
}
|
|
28
|
+
readRecursive(path, folder, size) {
|
|
29
|
+
return new Promise(resolve => {
|
|
30
|
+
readdir(join(this.dir, path), (err, files) => {
|
|
31
|
+
if (err) {
|
|
32
|
+
resolve([]);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const promises = files.map(file => {
|
|
36
|
+
return new Promise(async (resolve) => {
|
|
37
|
+
const filePath = join(path, file);
|
|
38
|
+
const absoluteFilePath = join(this.dir, filePath);
|
|
39
|
+
lstat(absoluteFilePath, (err, stats) => {
|
|
40
|
+
if (err) {
|
|
41
|
+
resolve([]);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (stats.isDirectory()) {
|
|
45
|
+
this.readRecursive(filePath, join(folder, file), size).then(resolve);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const sharpImg = sharp(absoluteFilePath);
|
|
49
|
+
sharpImg.rotate().metadata().then(() => {
|
|
50
|
+
const getResultPath = (isThumb) => {
|
|
51
|
+
return join(this.output, filePath.replace(/.([a-z|A-Z]+)$/gi, function (ext) {
|
|
52
|
+
const suffix = isThumb ? 'thumb' : 'big';
|
|
53
|
+
return `-${suffix}${ext}`;
|
|
54
|
+
}));
|
|
55
|
+
};
|
|
56
|
+
resolve([this.galleryCache.create(folder, size, {
|
|
57
|
+
getOriginal: () => {
|
|
58
|
+
return new Promise((res, rej) => {
|
|
59
|
+
readFile(absoluteFilePath, (err, data) => {
|
|
60
|
+
if (err) {
|
|
61
|
+
rej(err);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
res(data);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
},
|
|
68
|
+
writeResult: (isThumb, buffer) => {
|
|
69
|
+
return new Promise(async (res, rej) => {
|
|
70
|
+
const resultPath = getResultPath(isThumb);
|
|
71
|
+
await mkdirRecursive(dirname(resultPath));
|
|
72
|
+
writeFile(resultPath, buffer, err => {
|
|
73
|
+
if (err) {
|
|
74
|
+
rej(err);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
res();
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
},
|
|
81
|
+
hasResult: (isThumb) => {
|
|
82
|
+
return new Promise(res => {
|
|
83
|
+
access(getResultPath(isThumb), constants.R_OK, err => {
|
|
84
|
+
res(!err);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
},
|
|
88
|
+
serveResult: (isThumb) => {
|
|
89
|
+
return new Promise((res, rej) => {
|
|
90
|
+
readFile(getResultPath(isThumb), (err, data) => {
|
|
91
|
+
if (err) {
|
|
92
|
+
rej(err);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
res(data);
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
})]);
|
|
100
|
+
}, () => resolve([]));
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
Promise.all(promises).then(folders => {
|
|
105
|
+
resolve([].concat.apply([], folders));
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
Gallery = __decorate([
|
|
112
|
+
injectable(),
|
|
113
|
+
scoped(Lifecycle.ContainerScoped)
|
|
114
|
+
], Gallery);
|
|
115
|
+
export { Gallery };
|
|
116
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FsbGVyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9nYWxsZXJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDdkQsT0FBTyxNQUFNLE1BQU0sT0FBTyxDQUFDO0FBQzNCLE9BQU8sRUFBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBQyxNQUFNLElBQUksQ0FBQztBQUMxRSxPQUFPLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUluQyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRXhDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQztBQUlkLElBQU0sT0FBTyxHQUFiLE1BQU0sT0FBTztJQU1oQixZQUFxQixNQUFxQixFQUFXLFlBQTBCO1FBQTFELFdBQU0sR0FBTixNQUFNLENBQWU7UUFBVyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMzRSxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRCxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQWMsRUFBRSxPQUFxQixJQUFJO1FBQ3JELElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBa0IsT0FBTyxDQUFDLEVB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O2dEQUNwQyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFO29EQUMzQyxJQUFJLEdBQUcsRUFBRTt3REFDTCxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7d0RBQ1QsT0FBTztxREFDVjtvREFDRCxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7Z0RBQ2QsQ0FBQyxDQUFDLENBQUM7NENBQ1AsQ0FBQyxDQUFDLENBQUM7d0NBQ1AsQ0FBQztxQ0FDSixDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUNULENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDMUIsQ0FBQyxDQUFDLENBQUM7b0JBQ1AsQ0FBQyxDQUFDLENBQUM7Z0JBQ1AsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ2pDLE9BQU8sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDMUMsQ0FBQyxDQUFDLENBQUM7WUFDUCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztDQUNKLENBQUE7QUEzR1ksT0FBTztJQUZuQixVQUFVLEVBQUU7SUFDWixNQUFNLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQztHQUNyQixPQUFPLENBMkduQjtTQTNHWSxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpbmplY3RhYmxlLCBMaWZlY3ljbGUsIHNjb3BlZH0gZnJvbSBcInRzeXJpbmdlXCI7XHJcbmltcG9ydCBzaGFycF8gZnJvbSBcInNoYXJwXCI7XHJcbmltcG9ydCB7YWNjZXNzLCBjb25zdGFudHMsIGxzdGF0LCByZWFkZGlyLCByZWFkRmlsZSwgd3JpdGVGaWxlfSBmcm9tIFwiZnNcIjtcclxuaW1wb3J0IHtqb2luLCBkaXJuYW1lfSBmcm9tIFwicGF0aFwiO1xyXG5pbXBvcnQge0lHYWxsZXJ5SW1hZ2UsIElHYWxsZXJ5U2l6ZX0gZnJvbSBcIi4uL2NvbW1vbi10eXBlc1wiO1xyXG5pbXBvcnQge0NvbmZpZ3VyYXRpb259IGZyb20gXCIuL2NvbmZpZ3VyYXRpb25cIjtcclxuaW1wb3J0IHtHYWxsZXJ5Q2FjaGV9IGZyb20gXCIuL2dhbGxlcnktY2FjaGVcIjtcclxuaW1wb3J0IHtta2RpclJlY3Vyc2l2ZX0gZnJvbSBcIi4uL3V0aWxzXCI7XHJcblxyXG5jb25zdCBzaGFycCA9IHNoYXJwXztcclxuXHJcbkBpbmplY3RhYmxlKClcclxuQHNjb3BlZChMaWZlY3ljbGUuQ29udGFpbmVyU2NvcGVkKVxyXG5leHBvcnQgY2xhc3MgR2FsbGVyeSB7XHJcblxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBkaXI6IHN0cmluZztcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3V0cHV0OiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhY2hlOiB7IFtmb2xkZXI6IHN0cmluZ106IFByb21pc2U8SUdhbGxlcnlJbWFnZVtdPiB9O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGNvbmZpZzogQ29uZmlndXJhdGlvbiwgcmVhZG9ubHkgZ2FsbGVyeUNhY2hlOiBHYWxsZXJ5Q2FjaGUpIHtcclxuICAgICAgICB0aGlzLmNhY2hlID0ge307XHJcbiAgICAgICAgdGhpcy5kaXIgPSB0aGlzLmNvbmZpZy5yZXNvbHZlKFwiZ2FsbGVyeURpclwiKTtcclxuICAgICAgICB0aGlzLm91dHB1dCA9IGpvaW4odGhpcy5jb25maWcucmVzb2x2ZShcImNhY2hlRGlyXCIpLCBcImdhbGxlcnlcIik7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZ2V0Rm9sZGVyKGZvbGRlcjogc3RyaW5nLCBzaXplOiBJR2FsbGVyeVNpemUgPSBudWxsKTogUHJvbWlzZTxJR2FsbGVyeUltYWdlW10+IHtcclxuICAgICAgICB0aGlzLmNhY2hlW2ZvbGRlcl0gPSB0aGlzLmNhY2hlW2ZvbGRlcl0gfHwgbmV3IFByb21pc2U8SUdhbGxlcnlJbWFnZVtdPihyZXNvbHZlID0+IHtcclxuICAgICAgICAgICAgbHN0YXQoam9pbih0aGlzLmRpciwgZm9sZGVyKSwgKGVyciwgc3RhdHMpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChlcnIgfHwgIXN0YXRzLmlzRGlyZWN0b3J5KCkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKFtdKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlYWRSZWN1cnNpdmUoZm9sZGVyLCBcIlwiLCBzaXplKS50aGVuKHJlc29sdmUsICgpID0+IHJlc29sdmUoW10pKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVbZm9sZGVyXTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVhZFJlY3Vyc2l2ZShwYXRoOiBzdHJpbmcsIGZvbGRlcjogc3RyaW5nLCBzaXplOiBJR2FsbGVyeVNpemUpOiBQcm9taXNlPElHYWxsZXJ5SW1hZ2VbXT4ge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxJR2FsbGVyeUltYWdlW10+KHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICByZWFkZGlyKGpvaW4odGhpcy5kaXIsIHBhdGgpLCAoZXJyLCBmaWxlcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoW10pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IHByb21pc2VzID0gZmlsZXMubWFwKGZpbGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxJR2FsbGVyeUltYWdlW10+KGFzeW5jIHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4ocGF0aCwgZmlsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFic29sdXRlRmlsZVBhdGggPSBqb2luKHRoaXMuZGlyLCBmaWxlUGF0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxzdGF0KGFic29sdXRlRmlsZVBhdGgsIChlcnIsIHN0YXRzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShbXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRzLmlzRGlyZWN0b3J5KCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlYWRSZWN1cnNpdmUoZmlsZVBhdGgsIGpvaW4oZm9sZGVyLCBmaWxlKSwgc2l6ZSkudGhlbihyZXNvbHZlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFycEltZyA9IHNoYXJwKGFic29sdXRlRmlsZVBhdGgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcnBJbWcucm90YXRlKCkubWV0YWRhdGEoKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnZXRSZXN1bHRQYXRoID0gKGlzVGh1bWIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpvaW4odGhpcy5vdXRwdXQsIGZpbGVQYXRoLnJlcGxhY2UoLy4oW2EtenxBLVpdKykkL2dpLCBmdW5jdGlvbiAoZXh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWZmaXggPSBpc1RodW1iID8gJ3RodW1iJyA6ICdiaWcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAtJHtzdWZmaXh9JHtleHR9YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShbdGhpcy5nYWxsZXJ5Q2FjaGUuY3JlYXRlKGZvbGRlciwgc2l6ZSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPcmlnaW5hbDogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPEJ1ZmZlcj4oKHJlcywgcmVqKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEZpbGUoYWJzb2x1dGVGaWxlUGF0aCwgKGVyciwgZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWooZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMoZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVSZXN1bHQ6IChpc1RodW1iOiBib29sZWFuLCBidWZmZXI6IEJ1ZmZlcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KGFzeW5jIChyZXMsIHJlaikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdFBhdGggPSBnZXRSZXN1bHRQYXRoKGlzVGh1bWIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IG1rZGlyUmVjdXJzaXZlKGRpcm5hbWUocmVzdWx0UGF0aCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlRmlsZShyZXN1bHRQYXRoLCBidWZmZXIsIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaihlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1Jlc3VsdDogKGlzVGh1bWI6IGJvb2xlYW4pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPihyZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VzcyhnZXRSZXN1bHRQYXRoKGlzVGh1bWIpLCBjb25zdGFudHMuUl9PSywgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzKCFlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlUmVzdWx0OiAoaXNUaHVtYjogYm9vbGVhbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPEJ1ZmZlcj4oKHJlcywgcmVqKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEZpbGUoZ2V0UmVzdWx0UGF0aChpc1RodW1iKSwgKGVyciwgZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWooZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMoZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAoKSA9PiByZXNvbHZlKFtdKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbihmb2xkZXJzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKFtdLmNvbmNhdC5hcHBseShbXSwgZm9sZGVycykpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { injectable, Lifecycle, scoped } from "tsyringe";
|
|
3
|
+
import { rand } from "../utils";
|
|
4
|
+
let IdGenerator = class IdGenerator {
|
|
5
|
+
constructor(config) {
|
|
6
|
+
this.config = config;
|
|
7
|
+
this.prefix = config.resolve("idPrefix");
|
|
8
|
+
this.separator = config.resolve("idSeparator");
|
|
9
|
+
this.chars = config.resolve("idChars");
|
|
10
|
+
this.parts = config.resolve("idParts");
|
|
11
|
+
}
|
|
12
|
+
async generate(checkCb) {
|
|
13
|
+
let id = null;
|
|
14
|
+
let tries = 0;
|
|
15
|
+
let notGood = true;
|
|
16
|
+
while (notGood && tries < 5) {
|
|
17
|
+
id = this.generateId();
|
|
18
|
+
notGood = await checkCb(id);
|
|
19
|
+
tries++;
|
|
20
|
+
}
|
|
21
|
+
if (notGood) {
|
|
22
|
+
throw `Couldn't generate an unique id..`;
|
|
23
|
+
}
|
|
24
|
+
return id;
|
|
25
|
+
}
|
|
26
|
+
generateId() {
|
|
27
|
+
return this.prefix + this.parts.map(num => {
|
|
28
|
+
let s = "";
|
|
29
|
+
for (let i = 0; i < num; i++) {
|
|
30
|
+
const ix = rand(0, this.chars.length - 1);
|
|
31
|
+
s += this.chars[ix];
|
|
32
|
+
}
|
|
33
|
+
return s;
|
|
34
|
+
}).join(this.separator);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
IdGenerator = __decorate([
|
|
38
|
+
injectable(),
|
|
39
|
+
scoped(Lifecycle.ContainerScoped)
|
|
40
|
+
], IdGenerator);
|
|
41
|
+
export { IdGenerator };
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWQtZ2VuZXJhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL2lkLWdlbmVyYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRXZELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFJdkIsSUFBTSxXQUFXLEdBQWpCLE1BQU0sV0FBVztJQU9wQixZQUFxQixNQUFxQjtRQUFyQixXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQ3RDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUF5QztRQUNwRCxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDZCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZCxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDbkIsT0FBTyxPQUFPLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRTtZQUN6QixFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM1QixLQUFLLEVBQUUsQ0FBQztTQUNYO1FBQ0QsSUFBSSxPQUFPLEVBQUU7WUFDVCxNQUFNLGtDQUFrQyxDQUFDO1NBQzVDO1FBQ0QsT0FBTyxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRU8sVUFBVTtRQUNkLE9BQU8sSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUN0QyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDWCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUMxQixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUMxQyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUN2QjtZQUNELE9BQU8sQ0FBQyxDQUFDO1FBQ2IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM1QixDQUFDO0NBQ0osQ0FBQTtBQXZDWSxXQUFXO0lBRnZCLFVBQVUsRUFBRTtJQUNaLE1BQU0sQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDO0dBQ3JCLFdBQVcsQ0F1Q3ZCO1NBdkNZLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2luamVjdGFibGUsIExpZmVjeWNsZSwgc2NvcGVkfSBmcm9tIFwidHN5cmluZ2VcIjtcclxuaW1wb3J0IHtDb25maWd1cmF0aW9ufSBmcm9tIFwiLi9jb25maWd1cmF0aW9uXCI7XHJcbmltcG9ydCB7cmFuZH0gZnJvbSBcIi4uL3V0aWxzXCI7XHJcblxyXG5AaW5qZWN0YWJsZSgpXHJcbkBzY29wZWQoTGlmZWN5Y2xlLkNvbnRhaW5lclNjb3BlZClcclxuZXhwb3J0IGNsYXNzIElkR2VuZXJhdG9yIHtcclxuXHJcbiAgICBwcm90ZWN0ZWQgcHJlZml4OiBzdHJpbmc7XHJcbiAgICBwcm90ZWN0ZWQgc2VwYXJhdG9yOiBzdHJpbmc7XHJcbiAgICBwcm90ZWN0ZWQgY2hhcnM6IHN0cmluZztcclxuICAgIHByb3RlY3RlZCBwYXJ0czogbnVtYmVyW107XHJcblxyXG4gICAgY29uc3RydWN0b3IocmVhZG9ubHkgY29uZmlnOiBDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5wcmVmaXggPSBjb25maWcucmVzb2x2ZShcImlkUHJlZml4XCIpO1xyXG4gICAgICAgIHRoaXMuc2VwYXJhdG9yID0gY29uZmlnLnJlc29sdmUoXCJpZFNlcGFyYXRvclwiKTtcclxuICAgICAgICB0aGlzLmNoYXJzID0gY29uZmlnLnJlc29sdmUoXCJpZENoYXJzXCIpO1xyXG4gICAgICAgIHRoaXMucGFydHMgPSBjb25maWcucmVzb2x2ZShcImlkUGFydHNcIik7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZ2VuZXJhdGUoY2hlY2tDYjogKGlkOiBzdHJpbmcpID0+IFByb21pc2U8Ym9vbGVhbj4pOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgICAgIGxldCBpZCA9IG51bGw7XHJcbiAgICAgICAgbGV0IHRyaWVzID0gMDtcclxuICAgICAgICBsZXQgbm90R29vZCA9IHRydWU7XHJcbiAgICAgICAgd2hpbGUgKG5vdEdvb2QgJiYgdHJpZXMgPCA1KSB7XHJcbiAgICAgICAgICAgIGlkID0gdGhpcy5nZW5lcmF0ZUlkKCk7XHJcbiAgICAgICAgICAgIG5vdEdvb2QgPSBhd2FpdCBjaGVja0NiKGlkKTtcclxuICAgICAgICAgICAgdHJpZXMrKztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG5vdEdvb2QpIHtcclxuICAgICAgICAgICAgdGhyb3cgYENvdWxkbid0IGdlbmVyYXRlIGFuIHVuaXF1ZSBpZC4uYDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGlkO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2VuZXJhdGVJZCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnByZWZpeCArIHRoaXMucGFydHMubWFwKG51bSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBzID0gXCJcIjtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW07IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXggPSByYW5kKDAsIHRoaXMuY2hhcnMubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgICAgICAgICBzICs9IHRoaXMuY2hhcnNbaXhdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBzO1xyXG4gICAgICAgIH0pLmpvaW4odGhpcy5zZXBhcmF0b3IpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|