@stemy/backend 5.2.2 → 6.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/clear-command.d.ts +6 -6
- package/commands/fixtures-command.d.ts +9 -9
- package/commands/index.d.ts +2 -2
- package/common-types.d.ts +325 -326
- package/esm2022/commands/clear-command.mjs +15 -0
- package/esm2022/commands/fixtures-command.mjs +26 -0
- package/esm2022/commands/index.mjs +7 -0
- package/esm2022/common-types.mjs +26 -0
- package/esm2022/fixtures/index.mjs +5 -0
- package/esm2022/fixtures/ttl.fixture.mjs +23 -0
- package/esm2022/public_api.mjs +378 -0
- package/esm2022/requests/asset-image-params.mjs +60 -0
- package/esm2022/rest-controllers/assets.controller.mjs +177 -0
- package/esm2022/rest-controllers/auth.controller.mjs +57 -0
- package/esm2022/rest-controllers/gallery.controller.mjs +27 -0
- package/esm2022/rest-controllers/progresses.controller.mjs +38 -0
- package/esm2022/rest-controllers/terminal-styles.mjs +67 -0
- package/esm2022/rest-controllers/terminal.controller.mjs +132 -0
- package/esm2022/rest-middlewares/container.middleware.mjs +22 -0
- package/esm2022/rest-middlewares/error-handler.middleware.mjs +79 -0
- package/esm2022/rest-middlewares/language.middleware.mjs +21 -0
- package/esm2022/rest-middlewares/request-ended.middleware.mjs +26 -0
- package/esm2022/rest-middlewares/request-started.middleware.mjs +25 -0
- package/esm2022/services/asset-processor.mjs +90 -0
- package/esm2022/services/asset-resolver.mjs +36 -0
- package/esm2022/services/assets.mjs +154 -0
- package/esm2022/services/backend-provider.mjs +83 -0
- package/esm2022/services/cache-processor.mjs +16 -0
- package/esm2022/services/cache.mjs +70 -0
- package/esm2022/services/configuration.mjs +68 -0
- package/esm2022/services/drivers/asset-grid.driver.mjs +27 -0
- package/esm2022/services/drivers/asset-local.driver.mjs +41 -0
- package/esm2022/services/endpoint-provider.mjs +13 -0
- package/esm2022/services/entities/asset.mjs +61 -0
- package/esm2022/services/entities/base-entity.mjs +32 -0
- package/esm2022/services/entities/lazy-asset.mjs +87 -0
- package/esm2022/services/entities/progress.mjs +182 -0
- package/esm2022/services/entities/temp-asset.mjs +53 -0
- package/esm2022/services/fixtures.mjs +38 -0
- package/esm2022/services/gallery-cache.mjs +29 -0
- package/esm2022/services/gallery-image.mjs +42 -0
- package/esm2022/services/gallery.mjs +124 -0
- package/esm2022/services/id-generator.mjs +49 -0
- package/esm2022/services/job-manager.mjs +198 -0
- package/esm2022/services/lazy-assets.mjs +68 -0
- package/esm2022/services/logger.mjs +26 -0
- package/esm2022/services/mail-sender.mjs +42 -0
- package/esm2022/services/memory-cache.mjs +61 -0
- package/esm2022/services/mongo-connector.mjs +36 -0
- package/esm2022/services/open-api.mjs +124 -0
- package/esm2022/services/progresses.mjs +93 -0
- package/esm2022/services/template-renderer.mjs +71 -0
- package/esm2022/services/terminal-manager.mjs +88 -0
- package/esm2022/services/token-generator.mjs +37 -0
- package/esm2022/services/translation-provider.mjs +39 -0
- package/esm2022/services/translator.mjs +67 -0
- package/esm2022/services/user-manager.mjs +27 -0
- package/esm2022/socket-controllers/progress.controller.mjs +63 -0
- package/esm2022/socket-controllers/terminal.controller.mjs +61 -0
- package/esm2022/socket-controllers/terminal.mjs +89 -0
- package/esm2022/socket-middlewares/compression.middleware.mjs +14 -0
- package/esm2022/static.mjs +23 -0
- package/esm2022/stemy-backend.mjs +5 -0
- package/esm2022/utilities/base-doc.mjs +33 -0
- package/esm2022/utilities/decorators.mjs +51 -0
- package/esm2022/utilities/di-container.mjs +88 -0
- package/esm2022/utilities/empty-job.mjs +13 -0
- package/esm2022/utilities/lazy-asset-generator.mjs +38 -0
- package/esm2022/utilities/mongoose.mjs +216 -0
- package/esm2022/utilities/tree.mjs +119 -0
- package/esm2022/utils.mjs +726 -0
- package/esm2022/validators.mjs +46 -0
- package/fesm2022/stemy-backend.mjs +4690 -0
- package/fesm2022/stemy-backend.mjs.map +1 -0
- package/fixtures/index.d.ts +2 -2
- package/fixtures/ttl.fixture.d.ts +7 -7
- package/index.d.ts +5 -5
- package/package.json +43 -49
- package/public_api.d.ts +44 -44
- package/requests/asset-image-params.d.ts +12 -12
- package/rest-controllers/assets.controller.d.ts +25 -27
- package/rest-controllers/auth.controller.d.ts +14 -14
- package/rest-controllers/gallery.controller.d.ts +6 -7
- package/rest-controllers/progresses.controller.d.ts +9 -9
- package/rest-controllers/terminal-styles.d.ts +2 -2
- package/rest-controllers/terminal.controller.d.ts +10 -10
- package/rest-middlewares/container.middleware.d.ts +8 -8
- package/rest-middlewares/error-handler.middleware.d.ts +13 -13
- package/rest-middlewares/language.middleware.d.ts +8 -8
- package/rest-middlewares/request-ended.middleware.d.ts +8 -8
- package/rest-middlewares/request-started.middleware.d.ts +8 -8
- package/services/asset-processor.d.ts +10 -11
- package/services/asset-resolver.d.ts +10 -10
- package/services/assets.d.ts +24 -26
- package/services/backend-provider.d.ts +19 -20
- package/services/cache-processor.d.ts +4 -4
- package/services/cache.d.ts +23 -23
- package/services/configuration.d.ts +15 -15
- package/services/drivers/asset-grid.driver.d.ts +11 -11
- package/services/drivers/asset-local.driver.d.ts +10 -11
- package/services/endpoint-provider.d.ts +4 -4
- package/services/entities/asset.d.ts +19 -21
- package/services/entities/base-entity.d.ts +13 -13
- package/services/entities/lazy-asset.d.ts +25 -25
- package/services/entities/progress.d.ts +49 -49
- package/services/entities/temp-asset.d.ts +20 -22
- package/services/fixtures.d.ts +8 -8
- package/services/gallery-cache.d.ts +8 -9
- package/services/gallery-image.d.ts +10 -11
- package/services/gallery.d.ts +13 -13
- package/services/id-generator.d.ts +11 -11
- package/services/job-manager.d.ts +35 -35
- package/services/lazy-assets.d.ts +22 -22
- package/services/logger.d.ts +8 -8
- package/services/mail-sender.d.ts +20 -20
- package/services/memory-cache.d.ts +10 -10
- package/services/mongo-connector.d.ts +12 -12
- package/services/open-api.d.ts +13 -13
- package/services/progresses.d.ts +20 -20
- package/services/template-renderer.d.ts +14 -14
- package/services/terminal-manager.d.ts +15 -15
- package/services/token-generator.d.ts +6 -6
- package/services/translation-provider.d.ts +9 -9
- package/services/translator.d.ts +15 -15
- package/services/user-manager.d.ts +6 -6
- package/socket-controllers/progress.controller.d.ts +10 -10
- package/socket-controllers/terminal.controller.d.ts +13 -13
- package/socket-controllers/terminal.d.ts +19 -20
- package/socket-middlewares/compression.middleware.d.ts +4 -4
- package/static.d.ts +2 -2
- package/utilities/base-doc.d.ts +40 -40
- package/utilities/decorators.d.ts +10 -10
- package/utilities/di-container.d.ts +43 -43
- package/utilities/empty-job.d.ts +4 -4
- package/utilities/lazy-asset-generator.d.ts +15 -15
- package/utilities/mongoose.d.ts +36 -36
- package/utilities/tree.d.ts +15 -15
- package/utils.d.ts +120 -123
- package/validators.d.ts +7 -7
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { BaseEntity } from "./base-entity";
|
|
2
|
+
export class Progress extends BaseEntity {
|
|
3
|
+
messageBridge;
|
|
4
|
+
get current() {
|
|
5
|
+
return this.data.current;
|
|
6
|
+
}
|
|
7
|
+
get max() {
|
|
8
|
+
return this.data.max;
|
|
9
|
+
}
|
|
10
|
+
get message() {
|
|
11
|
+
return this.data.message;
|
|
12
|
+
}
|
|
13
|
+
get error() {
|
|
14
|
+
return this.data.error;
|
|
15
|
+
}
|
|
16
|
+
get canceled() {
|
|
17
|
+
return this.data.canceled;
|
|
18
|
+
}
|
|
19
|
+
get percent() {
|
|
20
|
+
return this.max > 0 ? Math.round(this.current / this.max * 100) : 0;
|
|
21
|
+
}
|
|
22
|
+
get remaining() {
|
|
23
|
+
return this.max > 0 ? this.max - this.current : 0;
|
|
24
|
+
}
|
|
25
|
+
constructor(id, data, collection) {
|
|
26
|
+
super(id, data, collection);
|
|
27
|
+
}
|
|
28
|
+
setMessageBridge(messageBridge) {
|
|
29
|
+
this.messageBridge = messageBridge || this.messageBridge;
|
|
30
|
+
return this;
|
|
31
|
+
}
|
|
32
|
+
async createSubProgress(progressValue, max, message) {
|
|
33
|
+
if (max <= 0 && progressValue > 0) {
|
|
34
|
+
await this.advance(progressValue);
|
|
35
|
+
}
|
|
36
|
+
if (message !== null) {
|
|
37
|
+
this.data.message = message;
|
|
38
|
+
await this.save();
|
|
39
|
+
}
|
|
40
|
+
return new SubProgress(this, this.current, progressValue, Math.max(max, 1));
|
|
41
|
+
}
|
|
42
|
+
async setMax(max) {
|
|
43
|
+
if (isNaN(max) || max <= 0) {
|
|
44
|
+
throw "Max progress value must be bigger than zero";
|
|
45
|
+
}
|
|
46
|
+
this.data.max = max;
|
|
47
|
+
await this.save();
|
|
48
|
+
}
|
|
49
|
+
async setMessage(message) {
|
|
50
|
+
this.data.message = message;
|
|
51
|
+
await this.save();
|
|
52
|
+
}
|
|
53
|
+
async setError(error) {
|
|
54
|
+
this.data.error = error;
|
|
55
|
+
await this.save();
|
|
56
|
+
}
|
|
57
|
+
async advance(value = 1) {
|
|
58
|
+
if (isNaN(value) || value <= 0) {
|
|
59
|
+
throw new Error(`Advance value must be bigger than zero: ${this.id}`);
|
|
60
|
+
}
|
|
61
|
+
await this.load();
|
|
62
|
+
if (this.deleted || this.canceled) {
|
|
63
|
+
const status = this.deleted ? "deleted" : "canceled";
|
|
64
|
+
throw new Error(`Can't advance ${status} progress: ${this.id}`);
|
|
65
|
+
}
|
|
66
|
+
this.data.current = Math.min(this.max, this.current + value);
|
|
67
|
+
await this.save();
|
|
68
|
+
}
|
|
69
|
+
async cancel() {
|
|
70
|
+
this.data.canceled = true;
|
|
71
|
+
await this.save();
|
|
72
|
+
}
|
|
73
|
+
save() {
|
|
74
|
+
if (this.messageBridge) {
|
|
75
|
+
this.messageBridge.sendMessage(`progress-changed`, this.toJSON());
|
|
76
|
+
}
|
|
77
|
+
return super.save();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
export class SubProgress {
|
|
81
|
+
parent;
|
|
82
|
+
progressFrom;
|
|
83
|
+
progressValue;
|
|
84
|
+
mMax;
|
|
85
|
+
get id() {
|
|
86
|
+
return this.parent.id;
|
|
87
|
+
}
|
|
88
|
+
get current() {
|
|
89
|
+
return this.mCurrent;
|
|
90
|
+
}
|
|
91
|
+
get max() {
|
|
92
|
+
return this.mMax;
|
|
93
|
+
}
|
|
94
|
+
get message() {
|
|
95
|
+
return this.parent.message;
|
|
96
|
+
}
|
|
97
|
+
get error() {
|
|
98
|
+
return this.parent.error;
|
|
99
|
+
}
|
|
100
|
+
get percent() {
|
|
101
|
+
return this.parent.percent;
|
|
102
|
+
}
|
|
103
|
+
get remaining() {
|
|
104
|
+
return this.max - this.mCurrent;
|
|
105
|
+
}
|
|
106
|
+
get canceled() {
|
|
107
|
+
return !this.parent || this.parent.canceled;
|
|
108
|
+
}
|
|
109
|
+
mCurrent;
|
|
110
|
+
constructor(parent, progressFrom, progressValue, mMax = 100) {
|
|
111
|
+
this.parent = parent;
|
|
112
|
+
this.progressFrom = progressFrom;
|
|
113
|
+
this.progressValue = progressValue;
|
|
114
|
+
this.mMax = mMax;
|
|
115
|
+
if (progressFrom < 0) {
|
|
116
|
+
throw "Progress from must be bigger than or zero";
|
|
117
|
+
}
|
|
118
|
+
if (progressValue <= 0) {
|
|
119
|
+
throw "Progress value must be bigger than zero";
|
|
120
|
+
}
|
|
121
|
+
this.mCurrent = 0;
|
|
122
|
+
}
|
|
123
|
+
setMessageBridge(messageBridge) {
|
|
124
|
+
if (!this.parent)
|
|
125
|
+
return this;
|
|
126
|
+
this.parent.setMessageBridge(messageBridge);
|
|
127
|
+
return this;
|
|
128
|
+
}
|
|
129
|
+
async createSubProgress(progressValue, max, message) {
|
|
130
|
+
if (max <= 0 && progressValue > 0) {
|
|
131
|
+
await this.advance(progressValue);
|
|
132
|
+
}
|
|
133
|
+
if (message !== null) {
|
|
134
|
+
await this.setMessage(message);
|
|
135
|
+
}
|
|
136
|
+
return new SubProgress(this, this.current, progressValue, Math.max(max, 1));
|
|
137
|
+
}
|
|
138
|
+
async setMax(max) {
|
|
139
|
+
if (isNaN(max) || max <= 0) {
|
|
140
|
+
throw "Max progress value must be bigger than zero";
|
|
141
|
+
}
|
|
142
|
+
this.mMax = max;
|
|
143
|
+
await this.save();
|
|
144
|
+
}
|
|
145
|
+
async setMessage(message) {
|
|
146
|
+
if (!this.parent)
|
|
147
|
+
return null;
|
|
148
|
+
await this.parent.setMessage(message);
|
|
149
|
+
}
|
|
150
|
+
async setError(error) {
|
|
151
|
+
if (!this.parent)
|
|
152
|
+
return null;
|
|
153
|
+
await this.parent.setError(error);
|
|
154
|
+
}
|
|
155
|
+
async advance(value = 1) {
|
|
156
|
+
if (isNaN(value) || value <= 0) {
|
|
157
|
+
throw "Advance value must be bigger than zero";
|
|
158
|
+
}
|
|
159
|
+
this.mCurrent = Math.min(this.max, this.mCurrent + value);
|
|
160
|
+
await this.save();
|
|
161
|
+
}
|
|
162
|
+
async cancel() {
|
|
163
|
+
if (!this.parent)
|
|
164
|
+
return null;
|
|
165
|
+
await this.parent.cancel();
|
|
166
|
+
}
|
|
167
|
+
async save() {
|
|
168
|
+
const ratio = this.max > 0 ? this.mCurrent / this.max : 0;
|
|
169
|
+
const newProgress = this.progressFrom + Math.round(this.progressValue * ratio);
|
|
170
|
+
const current = this.parent.current;
|
|
171
|
+
if (newProgress <= current)
|
|
172
|
+
return null;
|
|
173
|
+
await this.parent.advance(newProgress);
|
|
174
|
+
}
|
|
175
|
+
async load() {
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
toJSON() {
|
|
179
|
+
return this.parent.toJSON();
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3Jlc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvZW50aXRpZXMvcHJvZ3Jlc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUV6QyxNQUFNLE9BQU8sUUFBUyxTQUFRLFVBQXFCO0lBRXJDLGFBQWEsQ0FBaUI7SUFFeEMsSUFBSSxPQUFPO1FBQ1AsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBSSxHQUFHO1FBQ0gsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1AsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBSSxLQUFLO1FBQ0wsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1AsT0FBTyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQsSUFBSSxTQUFTO1FBQ1QsT0FBTyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVELFlBQVksRUFBWSxFQUNaLElBQXdCLEVBQ3hCLFVBQXNCO1FB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LENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsQ0FBQztRQUMvRSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUNwQyxJQUFJLFdBQVcsSUFBSSxPQUFPO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDeEMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUMxQyxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsTUFBTTtRQUNGLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge09iamVjdElkfSBmcm9tIFwiYnNvblwiO1xyXG5pbXBvcnQge0NvbGxlY3Rpb259IGZyb20gXCJtb25nb2RiXCI7XHJcbmltcG9ydCB7SU1lc3NhZ2VCcmlkZ2UsIElQcm9ncmVzc30gZnJvbSBcIi4uLy4uL2NvbW1vbi10eXBlc1wiO1xyXG5pbXBvcnQge0Jhc2VFbnRpdHl9IGZyb20gXCIuL2Jhc2UtZW50aXR5XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgUHJvZ3Jlc3MgZXh0ZW5kcyBCYXNlRW50aXR5PElQcm9ncmVzcz4gaW1wbGVtZW50cyBJUHJvZ3Jlc3Mge1xyXG5cclxuICAgIHByb3RlY3RlZCBtZXNzYWdlQnJpZGdlOiBJTWVzc2FnZUJyaWRnZTtcclxuXHJcbiAgICBnZXQgY3VycmVudCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuY3VycmVudDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbWF4KCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5tYXg7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG1lc3NhZ2UoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLm1lc3NhZ2U7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGVycm9yKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5lcnJvcjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY2FuY2VsZWQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5jYW5jZWxlZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcGVyY2VudCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1heCA+IDAgPyBNYXRoLnJvdW5kKHRoaXMuY3VycmVudCAvIHRoaXMubWF4ICogMTAwKSA6IDA7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHJlbWFpbmluZygpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1heCA+IDAgPyB0aGlzLm1heCAtIHRoaXMuY3VycmVudCA6IDA7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IoaWQ6IE9iamVjdElkLFxyXG4gICAgICAgICAgICAgICAgZGF0YTogUGFydGlhbDxJUHJvZ3Jlc3M+LFxyXG4gICAgICAgICAgICAgICAgY29sbGVjdGlvbjogQ29sbGVjdGlvbikge1xyXG4gICAgICAgIHN1cGVyKGlkLCBkYXRhLCBjb2xsZWN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRNZXNzYWdlQnJpZGdlKG1lc3NhZ2VCcmlkZ2U6IElNZXNzYWdlQnJpZGdlKTogdGhpcyB7XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlQnJpZGdlID0gbWVzc2FnZUJyaWRnZSB8fCB0aGlzLm1lc3NhZ2VCcmlkZ2U7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgY3JlYXRlU3ViUHJvZ3Jlc3MocHJvZ3Jlc3NWYWx1ZTogbnVtYmVyLCBtYXg/OiBudW1iZXIsIG1lc3NhZ2U/OiBzdHJpbmcpOiBQcm9taXNlPElQcm9ncmVzcz4ge1xyXG4gICAgICAgIGlmIChtYXggPD0gMCAmJiBwcm9ncmVzc1ZhbHVlID4gMCkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFkdmFuY2UocHJvZ3Jlc3NWYWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChtZXNzYWdlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YS5tZXNzYWdlID0gbWVzc2FnZTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zYXZlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgU3ViUHJvZ3Jlc3ModGhpcywgdGhpcy5jdXJyZW50LCBwcm9ncmVzc1ZhbHVlLCBNYXRoLm1heChtYXgsIDEpKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzZXRNYXgobWF4OiBudW1iZXIpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIGlmIChpc05hTihtYXgpIHx8IG1heCA8PSAwKSB7XHJcbiAgICAgICAgICAgIHRocm93IFwiTWF4IHByb2dyZXNzIHZhbHVlIG11c3QgYmUgYmlnZ2VyIHRoYW4gemVyb1wiO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmRhdGEubWF4ID0gbWF4O1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2F2ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNldE1lc3NhZ2UobWVzc2FnZTogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICB0aGlzLmRhdGEubWVzc2FnZSA9IG1lc3NhZ2U7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2V0RXJyb3IoZXJyb3I6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhLmVycm9yID0gZXJyb3I7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgYWR2YW5jZSh2YWx1ZTogbnVtYmVyID0gMSk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA8PSAwKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQWR2YW5jZSB2YWx1ZSBtdXN0IGJlIGJpZ2dlciB0aGFuIHplcm86ICR7dGhpcy5pZH1gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuZGVsZXRlZCB8fCB0aGlzLmNhbmNlbGVkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IHRoaXMuZGVsZXRlZCA/IFwiZGVsZXRlZFwiIDogXCJjYW5jZWxlZFwiO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IGFkdmFuY2UgJHtzdGF0dXN9IHByb2dyZXNzOiAke3RoaXMuaWR9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZGF0YS5jdXJyZW50ID0gTWF0aC5taW4odGhpcy5tYXgsIHRoaXMuY3VycmVudCArIHZhbHVlKTtcclxuICAgICAgICBhd2FpdCB0aGlzLnNhdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBjYW5jZWwoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICB0aGlzLmRhdGEuY2FuY2VsZWQgPSB0cnVlO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2F2ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNhdmUoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICBpZiAodGhpcy5tZXNzYWdlQnJpZGdlKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZUJyaWRnZS5zZW5kTWVzc2FnZShgcHJvZ3Jlc3MtY2hhbmdlZGAsIHRoaXMudG9KU09OKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3VwZXIuc2F2ZSgpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgU3ViUHJvZ3Jlc3MgaW1wbGVtZW50cyBJUHJvZ3Jlc3Mge1xyXG5cclxuICAgIGdldCBpZCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudC5pZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY3VycmVudCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1DdXJyZW50O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBtYXgoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5tTWF4O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBtZXNzYWdlKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50Lm1lc3NhZ2U7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGVycm9yKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50LmVycm9yO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBwZXJjZW50KCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50LnBlcmNlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHJlbWFpbmluZygpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1heCAtIHRoaXMubUN1cnJlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNhbmNlbGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAhdGhpcy5wYXJlbnQgfHwgdGhpcy5wYXJlbnQuY2FuY2VsZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIG1DdXJyZW50OiBudW1iZXI7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIHBhcmVudDogSVByb2dyZXNzLCBwcm90ZWN0ZWQgcHJvZ3Jlc3NGcm9tOiBudW1iZXIsIHByb3RlY3RlZCBwcm9ncmVzc1ZhbHVlOiBudW1iZXIsIHByb3RlY3RlZCBtTWF4OiBudW1iZXIgPSAxMDApIHtcclxuICAgICAgICBpZiAocHJvZ3Jlc3NGcm9tIDwgMCkge1xyXG4gICAgICAgICAgICB0aHJvdyBcIlByb2dyZXNzIGZyb20gbXVzdCBiZSBiaWdnZXIgdGhhbiBvciB6ZXJvXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwcm9ncmVzc1ZhbHVlIDw9IDApIHtcclxuICAgICAgICAgICAgdGhyb3cgXCJQcm9ncmVzcyB2YWx1ZSBtdXN0IGJlIGJpZ2dlciB0aGFuIHplcm9cIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5tQ3VycmVudCA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0TWVzc2FnZUJyaWRnZShtZXNzYWdlQnJpZGdlOiBJTWVzc2FnZUJyaWRnZSk6IHRoaXMge1xyXG4gICAgICAgIGlmICghdGhpcy5wYXJlbnQpIHJldHVybiB0aGlzO1xyXG4gICAgICAgIHRoaXMucGFyZW50LnNldE1lc3NhZ2VCcmlkZ2UobWVzc2FnZUJyaWRnZSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgY3JlYXRlU3ViUHJvZ3Jlc3MocHJvZ3Jlc3NWYWx1ZTogbnVtYmVyLCBtYXg/OiBudW1iZXIsIG1lc3NhZ2U/OiBzdHJpbmcpOiBQcm9taXNlPElQcm9ncmVzcz4ge1xyXG4gICAgICAgIGlmIChtYXggPD0gMCAmJiBwcm9ncmVzc1ZhbHVlID4gMCkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFkdmFuY2UocHJvZ3Jlc3NWYWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChtZXNzYWdlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0TWVzc2FnZShtZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5ldyBTdWJQcm9ncmVzcyh0aGlzLCB0aGlzLmN1cnJlbnQsIHByb2dyZXNzVmFsdWUsIE1hdGgubWF4KG1heCwgMSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNldE1heChtYXg6IG51bWJlcik6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgaWYgKGlzTmFOKG1heCkgfHwgbWF4IDw9IDApIHtcclxuICAgICAgICAgICAgdGhyb3cgXCJNYXggcHJvZ3Jlc3MgdmFsdWUgbXVzdCBiZSBiaWdnZXIgdGhhbiB6ZXJvXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubU1heCA9IG1heDtcclxuICAgICAgICBhd2FpdCB0aGlzLnNhdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzZXRNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnBhcmVudCkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5wYXJlbnQuc2V0TWVzc2FnZShtZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzZXRFcnJvcihlcnJvcjogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICBpZiAoIXRoaXMucGFyZW50KSByZXR1cm4gbnVsbDtcclxuICAgICAgICBhd2FpdCB0aGlzLnBhcmVudC5zZXRFcnJvcihlcnJvcik7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgYWR2YW5jZSh2YWx1ZTogbnVtYmVyID0gMSk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA8PSAwKSB7XHJcbiAgICAgICAgICAgIHRocm93IFwiQWR2YW5jZSB2YWx1ZSBtdXN0IGJlIGJpZ2dlciB0aGFuIHplcm9cIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5tQ3VycmVudCA9IE1hdGgubWluKHRoaXMubWF4LCB0aGlzLm1DdXJyZW50ICsgdmFsdWUpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2F2ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGNhbmNlbCgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5wYXJlbnQpIHJldHVybiBudWxsO1xyXG4gICAgICAgIGF3YWl0IHRoaXMucGFyZW50LmNhbmNlbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNhdmUoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICBjb25zdCByYXRpbyA9IHRoaXMubWF4ID4gMCA/IHRoaXMubUN1cnJlbnQgLyB0aGlzLm1heCA6IDA7XHJcbiAgICAgICAgY29uc3QgbmV3UHJvZ3Jlc3MgPSB0aGlzLnByb2dyZXNzRnJvbSArIE1hdGgucm91bmQodGhpcy5wcm9ncmVzc1ZhbHVlICogcmF0aW8pO1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnBhcmVudC5jdXJyZW50O1xyXG4gICAgICAgIGlmIChuZXdQcm9ncmVzcyA8PSBjdXJyZW50KSByZXR1cm4gbnVsbDtcclxuICAgICAgICBhd2FpdCB0aGlzLnBhcmVudC5hZHZhbmNlKG5ld1Byb2dyZXNzKVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGxvYWQoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICB0b0pTT04oKTogYW55IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQudG9KU09OKCk7XHJcbiAgICB9XHJcbn1cclxuIl19
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { ObjectId } from "bson";
|
|
2
|
+
import { bufferToStream, toImage } from "../../utils";
|
|
3
|
+
export class TempAsset {
|
|
4
|
+
buffer;
|
|
5
|
+
filename;
|
|
6
|
+
contentType;
|
|
7
|
+
metadata;
|
|
8
|
+
id;
|
|
9
|
+
get stream() {
|
|
10
|
+
return bufferToStream(this.buffer);
|
|
11
|
+
}
|
|
12
|
+
constructor(buffer, filename, contentType, metadata) {
|
|
13
|
+
this.buffer = buffer;
|
|
14
|
+
this.filename = filename;
|
|
15
|
+
this.contentType = contentType;
|
|
16
|
+
this.metadata = metadata;
|
|
17
|
+
this.id = new ObjectId().toHexString();
|
|
18
|
+
}
|
|
19
|
+
async unlink() {
|
|
20
|
+
throw new Error(`Temp asset '${this.id}' can not be removed!`);
|
|
21
|
+
}
|
|
22
|
+
async setMeta(meta) {
|
|
23
|
+
Object.assign(this.metadata, meta || {});
|
|
24
|
+
}
|
|
25
|
+
async getBuffer() {
|
|
26
|
+
return this.buffer;
|
|
27
|
+
}
|
|
28
|
+
async download(metadata) {
|
|
29
|
+
return this.stream;
|
|
30
|
+
}
|
|
31
|
+
downloadImage(params, metadata) {
|
|
32
|
+
Object.assign(this.metadata, metadata || {});
|
|
33
|
+
return toImage(this.stream, params, this.metadata);
|
|
34
|
+
}
|
|
35
|
+
getImage(params) {
|
|
36
|
+
return this.downloadImage(params);
|
|
37
|
+
}
|
|
38
|
+
async save() {
|
|
39
|
+
return this;
|
|
40
|
+
}
|
|
41
|
+
async load() {
|
|
42
|
+
return this;
|
|
43
|
+
}
|
|
44
|
+
toJSON() {
|
|
45
|
+
return {
|
|
46
|
+
id: this.id,
|
|
47
|
+
filename: this.filename,
|
|
48
|
+
contentType: this.contentType,
|
|
49
|
+
metadata: this.metadata
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcC1hc3NldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9lbnRpdGllcy90ZW1wLWFzc2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFOUIsT0FBTyxFQUFDLGNBQWMsRUFBRSxPQUFPLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFcEQsTUFBTSxPQUFPLFNBQVM7SUFRSTtJQUF5QjtJQUEyQjtJQUE4QjtJQU4vRixFQUFFLENBQVM7SUFFcEIsSUFBSSxNQUFNO1FBQ04sT0FBTyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxZQUFzQixNQUFjLEVBQVcsUUFBZ0IsRUFBVyxXQUFtQixFQUFXLFFBQW9CO1FBQXRHLFdBQU0sR0FBTixNQUFNLENBQVE7UUFBVyxhQUFRLEdBQVIsUUFBUSxDQUFRO1FBQVcsZ0JBQVcsR0FBWCxXQUFXLENBQVE7UUFBVyxhQUFRLEdBQVIsUUFBUSxDQUFZO1FBQ3hILElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBRUQsS0FBSyxDQUFDLE1BQU07UUFDUixNQUFNLElBQUksS0FBSyxDQUFDLGVBQWUsSUFBSSxDQUFDLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUF5QjtRQUNuQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxLQUFLLENBQUMsU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFxQjtRQUNoQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUVELGFBQWEsQ0FBQyxNQUEwQixFQUFFLFFBQXFCO1FBQzNELE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLElBQUksRUFBRSxDQUFDLENBQUM7UUFDN0MsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxRQUFRLENBQUMsTUFBMEI7UUFDL0IsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxNQUFNO1FBQ0YsT0FBTztZQUNILEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNYLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDN0IsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1NBQzFCLENBQUM7SUFDTixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1JlYWRhYmxlfSBmcm9tIFwic3RyZWFtXCI7XHJcbmltcG9ydCB7T2JqZWN0SWR9IGZyb20gXCJic29uXCI7XHJcbmltcG9ydCB7SUFzc2V0LCBJQXNzZXRJbWFnZVBhcmFtcywgSUFzc2V0TWV0YX0gZnJvbSBcIi4uLy4uL2NvbW1vbi10eXBlc1wiO1xyXG5pbXBvcnQge2J1ZmZlclRvU3RyZWFtLCB0b0ltYWdlfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUZW1wQXNzZXQgaW1wbGVtZW50cyBJQXNzZXQge1xyXG5cclxuICAgIHJlYWRvbmx5IGlkOiBzdHJpbmc7XHJcblxyXG4gICAgZ2V0IHN0cmVhbSgpOiBSZWFkYWJsZSB7XHJcbiAgICAgICAgcmV0dXJuIGJ1ZmZlclRvU3RyZWFtKHRoaXMuYnVmZmVyKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgYnVmZmVyOiBCdWZmZXIsIHJlYWRvbmx5IGZpbGVuYW1lOiBzdHJpbmcsIHJlYWRvbmx5IGNvbnRlbnRUeXBlOiBzdHJpbmcsIHJlYWRvbmx5IG1ldGFkYXRhOiBJQXNzZXRNZXRhKSB7XHJcbiAgICAgICAgdGhpcy5pZCA9IG5ldyBPYmplY3RJZCgpLnRvSGV4U3RyaW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgdW5saW5rKCk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUZW1wIGFzc2V0ICcke3RoaXMuaWR9JyBjYW4gbm90IGJlIHJlbW92ZWQhYCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2V0TWV0YShtZXRhOiBQYXJ0aWFsPElBc3NldE1ldGE+KTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMubWV0YWRhdGEsIG1ldGEgfHwge30pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldEJ1ZmZlcigpOiBQcm9taXNlPEJ1ZmZlcj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlcjtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkb3dubG9hZChtZXRhZGF0YT86IElBc3NldE1ldGEpOiBQcm9taXNlPFJlYWRhYmxlPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtO1xyXG4gICAgfVxyXG5cclxuICAgIGRvd25sb2FkSW1hZ2UocGFyYW1zPzogSUFzc2V0SW1hZ2VQYXJhbXMsIG1ldGFkYXRhPzogSUFzc2V0TWV0YSk6IFByb21pc2U8UmVhZGFibGU+IHtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMubWV0YWRhdGEsIG1ldGFkYXRhIHx8IHt9KTtcclxuICAgICAgICByZXR1cm4gdG9JbWFnZSh0aGlzLnN0cmVhbSwgcGFyYW1zLCB0aGlzLm1ldGFkYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRJbWFnZShwYXJhbXM/OiBJQXNzZXRJbWFnZVBhcmFtcyk6IFByb21pc2U8UmVhZGFibGU+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kb3dubG9hZEltYWdlKHBhcmFtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2F2ZSgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGxvYWQoKTogUHJvbWlzZTx0aGlzPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgdG9KU09OKCk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXHJcbiAgICAgICAgICAgIGZpbGVuYW1lOiB0aGlzLmZpbGVuYW1lLFxyXG4gICAgICAgICAgICBjb250ZW50VHlwZTogdGhpcy5jb250ZW50VHlwZSxcclxuICAgICAgICAgICAgbWV0YWRhdGE6IHRoaXMubWV0YWRhdGFcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { __decorate, __metadata, __param } from "tslib";
|
|
2
|
+
import { inject, injectable, Lifecycle, scoped } from "tsyringe";
|
|
3
|
+
import { DI_CONTAINER, FIXTURE } from "../common-types";
|
|
4
|
+
let Fixtures = class Fixtures {
|
|
5
|
+
container;
|
|
6
|
+
fixtures;
|
|
7
|
+
constructor(container) {
|
|
8
|
+
this.container = container;
|
|
9
|
+
}
|
|
10
|
+
init(output) {
|
|
11
|
+
try {
|
|
12
|
+
return this.container.resolveAll(FIXTURE);
|
|
13
|
+
}
|
|
14
|
+
catch (e) {
|
|
15
|
+
output.writeln(e.message);
|
|
16
|
+
return [];
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
async load(output) {
|
|
20
|
+
output = output || {
|
|
21
|
+
write: console.log,
|
|
22
|
+
writeln: t => console.log(t + "\n")
|
|
23
|
+
};
|
|
24
|
+
this.fixtures = this.fixtures || this.init(output);
|
|
25
|
+
output.write(`Loading fixtures: ${this.fixtures.length} items`);
|
|
26
|
+
for (let fixture of this.fixtures) {
|
|
27
|
+
await fixture.load(output);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
Fixtures = __decorate([
|
|
32
|
+
injectable(),
|
|
33
|
+
scoped(Lifecycle.ContainerScoped),
|
|
34
|
+
__param(0, inject(DI_CONTAINER)),
|
|
35
|
+
__metadata("design:paramtypes", [Object])
|
|
36
|
+
], Fixtures);
|
|
37
|
+
export { Fixtures };
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvZml4dHVyZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDL0QsT0FBTyxFQUFDLFlBQVksRUFBRSxPQUFPLEVBQWlELE1BQU0saUJBQWlCLENBQUM7QUFJL0YsSUFBTSxRQUFRLEdBQWQsTUFBTSxRQUFRO0lBSTJCO0lBRmxDLFFBQVEsQ0FBYTtJQUUvQixZQUE0QyxTQUErQjtRQUEvQixjQUFTLEdBQVQsU0FBUyxDQUFzQjtJQUMzRSxDQUFDO0lBRVMsSUFBSSxDQUFDLE1BQXVCO1FBQ2xDLElBQUksQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDVCxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMxQixPQUFPLEVBQUUsQ0FBQztRQUNkLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUF1QjtRQUM5QixNQUFNLEdBQUcsTUFBTSxJQUFJO1lBQ2YsS0FBSyxFQUFFLE9BQU8sQ0FBQyxHQUFHO1lBQ2xCLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztTQUN0QyxDQUFDO1FBQ0YsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkQsTUFBTSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxDQUFDO1FBQ2hFLEtBQUssSUFBSSxPQUFPLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvQixDQUFDO0lBQ0wsQ0FBQztDQUNKLENBQUE7QUEzQlksUUFBUTtJQUZwQixVQUFVLEVBQUU7SUFDWixNQUFNLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQztJQUtqQixXQUFBLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQTs7R0FKeEIsUUFBUSxDQTJCcEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2luamVjdCwgaW5qZWN0YWJsZSwgTGlmZWN5Y2xlLCBzY29wZWR9IGZyb20gXCJ0c3lyaW5nZVwiO1xyXG5pbXBvcnQge0RJX0NPTlRBSU5FUiwgRklYVFVSRSwgSURlcGVuZGVuY3lDb250YWluZXIsIElGaXh0dXJlLCBJRml4dHVyZU91dHB1dH0gZnJvbSBcIi4uL2NvbW1vbi10eXBlc1wiO1xyXG5cclxuQGluamVjdGFibGUoKVxyXG5Ac2NvcGVkKExpZmVjeWNsZS5Db250YWluZXJTY29wZWQpXHJcbmV4cG9ydCBjbGFzcyBGaXh0dXJlcyB7XHJcblxyXG4gICAgcHJvdGVjdGVkIGZpeHR1cmVzOiBJRml4dHVyZVtdO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKEBpbmplY3QoRElfQ09OVEFJTkVSKSBwcm90ZWN0ZWQgY29udGFpbmVyOiBJRGVwZW5kZW5jeUNvbnRhaW5lcikge1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpbml0KG91dHB1dD86IElGaXh0dXJlT3V0cHV0KTogSUZpeHR1cmVbXSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLnJlc29sdmVBbGwoRklYVFVSRSk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBvdXRwdXQud3JpdGVsbihlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGxvYWQob3V0cHV0PzogSUZpeHR1cmVPdXRwdXQpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIG91dHB1dCA9IG91dHB1dCB8fCB7XHJcbiAgICAgICAgICAgIHdyaXRlOiBjb25zb2xlLmxvZyxcclxuICAgICAgICAgICAgd3JpdGVsbjogdCA9PiBjb25zb2xlLmxvZyh0ICsgXCJcXG5cIilcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZml4dHVyZXMgPSB0aGlzLmZpeHR1cmVzIHx8IHRoaXMuaW5pdChvdXRwdXQpO1xyXG4gICAgICAgIG91dHB1dC53cml0ZShgTG9hZGluZyBmaXh0dXJlczogJHt0aGlzLmZpeHR1cmVzLmxlbmd0aH0gaXRlbXNgKTtcclxuICAgICAgICBmb3IgKGxldCBmaXh0dXJlIG9mIHRoaXMuZml4dHVyZXMpIHtcclxuICAgICAgICAgICAgYXdhaXQgZml4dHVyZS5sb2FkKG91dHB1dCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { __decorate, __metadata } from "tslib";
|
|
2
|
+
import { injectable, Lifecycle, scoped } from "tsyringe";
|
|
3
|
+
import { GalleryImage } from "./gallery-image";
|
|
4
|
+
let GalleryCache = class GalleryCache {
|
|
5
|
+
imgCache;
|
|
6
|
+
constructor() {
|
|
7
|
+
this.imgCache = {};
|
|
8
|
+
}
|
|
9
|
+
put(img) {
|
|
10
|
+
this.imgCache[img.thumb] = img;
|
|
11
|
+
this.imgCache[img.big] = img;
|
|
12
|
+
}
|
|
13
|
+
serve(id) {
|
|
14
|
+
const img = this.imgCache[id];
|
|
15
|
+
return !img ? null : img.serve(id);
|
|
16
|
+
}
|
|
17
|
+
create(folder, targetSize, handler) {
|
|
18
|
+
const image = new GalleryImage(folder, targetSize, handler);
|
|
19
|
+
this.put(image);
|
|
20
|
+
return image;
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
GalleryCache = __decorate([
|
|
24
|
+
injectable(),
|
|
25
|
+
scoped(Lifecycle.ContainerScoped),
|
|
26
|
+
__metadata("design:paramtypes", [])
|
|
27
|
+
], GalleryCache);
|
|
28
|
+
export { GalleryCache };
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FsbGVyeS1jYWNoZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9nYWxsZXJ5LWNhY2hlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFFdkQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBSXRDLElBQU0sWUFBWSxHQUFsQixNQUFNLFlBQVk7SUFFSixRQUFRLENBQWtDO0lBRTNEO1FBQ0ksSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVELEdBQUcsQ0FBQyxHQUFrQjtRQUNsQixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxLQUFLLENBQUMsRUFBVTtRQUNaLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxNQUFNLENBQUMsTUFBYyxFQUFFLFVBQXdCLEVBQUUsT0FBNkI7UUFDMUUsTUFBTSxLQUFLLEdBQUcsSUFBSSxZQUFZLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hCLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7Q0FDSixDQUFBO0FBdkJZLFlBQVk7SUFGeEIsVUFBVSxFQUFFO0lBQ1osTUFBTSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUM7O0dBQ3JCLFlBQVksQ0F1QnhCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpbmplY3RhYmxlLCBMaWZlY3ljbGUsIHNjb3BlZH0gZnJvbSBcInRzeXJpbmdlXCI7XHJcbmltcG9ydCB7SUdhbGxlcnlJbWFnZSwgSUdhbGxlcnlJbWFnZUhhbmRsZXIsIElHYWxsZXJ5U2l6ZX0gZnJvbSBcIi4uL2NvbW1vbi10eXBlc1wiO1xyXG5pbXBvcnQge0dhbGxlcnlJbWFnZX0gZnJvbSBcIi4vZ2FsbGVyeS1pbWFnZVwiO1xyXG5cclxuQGluamVjdGFibGUoKVxyXG5Ac2NvcGVkKExpZmVjeWNsZS5Db250YWluZXJTY29wZWQpXHJcbmV4cG9ydCBjbGFzcyBHYWxsZXJ5Q2FjaGUge1xyXG5cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgaW1nQ2FjaGU6IHsgW2lkOiBzdHJpbmddOiBJR2FsbGVyeUltYWdlIH07XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5pbWdDYWNoZSA9IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIHB1dChpbWc6IElHYWxsZXJ5SW1hZ2UpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmltZ0NhY2hlW2ltZy50aHVtYl0gPSBpbWc7XHJcbiAgICAgICAgdGhpcy5pbWdDYWNoZVtpbWcuYmlnXSA9IGltZztcclxuICAgIH1cclxuXHJcbiAgICBzZXJ2ZShpZDogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcclxuICAgICAgICBjb25zdCBpbWcgPSB0aGlzLmltZ0NhY2hlW2lkXTtcclxuICAgICAgICByZXR1cm4gIWltZyA/IG51bGwgOiBpbWcuc2VydmUoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZShmb2xkZXI6IHN0cmluZywgdGFyZ2V0U2l6ZTogSUdhbGxlcnlTaXplLCBoYW5kbGVyOiBJR2FsbGVyeUltYWdlSGFuZGxlcik6IElHYWxsZXJ5SW1hZ2Uge1xyXG4gICAgICAgIGNvbnN0IGltYWdlID0gbmV3IEdhbGxlcnlJbWFnZShmb2xkZXIsIHRhcmdldFNpemUsIGhhbmRsZXIpO1xyXG4gICAgICAgIHRoaXMucHV0KGltYWdlKTtcclxuICAgICAgICByZXR1cm4gaW1hZ2U7XHJcbiAgICB9XHJcbn1cclxuIl19
|
|
@@ -0,0 +1,42 @@
|
|
|
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
|
+
folder;
|
|
8
|
+
handler;
|
|
9
|
+
thumb;
|
|
10
|
+
big;
|
|
11
|
+
targetSize;
|
|
12
|
+
constructor(folder, size, handler) {
|
|
13
|
+
this.folder = folder;
|
|
14
|
+
this.handler = handler;
|
|
15
|
+
this.thumb = uuidv4();
|
|
16
|
+
this.big = uuidv4();
|
|
17
|
+
this.targetSize = !size ? { width: thumbSize, height: thumbSize } : size;
|
|
18
|
+
}
|
|
19
|
+
async serve(id) {
|
|
20
|
+
const isThumb = id == this.thumb;
|
|
21
|
+
if (await this.handler.hasResult(isThumb)) {
|
|
22
|
+
return this.handler.serveResult(isThumb);
|
|
23
|
+
}
|
|
24
|
+
const original = sharp(await this.handler.getOriginal()).rotate();
|
|
25
|
+
const meta = await original.metadata();
|
|
26
|
+
const ratio = meta.width / meta.height;
|
|
27
|
+
const sizeRatio = isThumb ? this.targetSize.width / this.targetSize.height : 1;
|
|
28
|
+
const size = isThumb ? Math.max(this.targetSize.width, this.targetSize.height) : bigSize;
|
|
29
|
+
const targetHeight = ratio > sizeRatio ? size : Math.round(size / ratio);
|
|
30
|
+
const targetWidth = Math.round(targetHeight * ratio);
|
|
31
|
+
const resized = original.resize(targetWidth, targetHeight);
|
|
32
|
+
const buffer = await (isThumb ? resized.extract({
|
|
33
|
+
left: Math.floor((targetWidth - this.targetSize.width) / 2),
|
|
34
|
+
top: Math.floor((targetHeight - this.targetSize.height) / 2),
|
|
35
|
+
width: this.targetSize.width,
|
|
36
|
+
height: this.targetSize.height
|
|
37
|
+
}).toBuffer() : resized.toBuffer());
|
|
38
|
+
await this.handler.writeResult(isThumb, buffer);
|
|
39
|
+
return this.handler.serveResult(isThumb);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FsbGVyeS1pbWFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9nYWxsZXJ5LWltYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxFQUFFLElBQUksTUFBTSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ2xDLE9BQU8sTUFBTSxNQUFNLE9BQU8sQ0FBQztBQUczQixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUM7QUFDckIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDO0FBQ3JCLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQztBQUV0QixNQUFNLE9BQU8sWUFBWTtJQU1BO0lBQTZDO0lBSnpELEtBQUssQ0FBUztJQUNkLEdBQUcsQ0FBUztJQUNaLFVBQVUsQ0FBZTtJQUVsQyxZQUFxQixNQUFjLEVBQUUsSUFBa0IsRUFBVyxPQUE2QjtRQUExRSxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQStCLFlBQU8sR0FBUCxPQUFPLENBQXNCO1FBQzNGLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxNQUFNLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDM0UsQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBVTtRQUNsQixNQUFNLE9BQU8sR0FBRyxFQUFFLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQztRQUVqQyxJQUFJLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUN4QyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbEUsTUFBTSxJQUFJLEdBQUcsTUFBTSxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDdkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3ZDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvRSxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQ3pGLE1BQU0sWUFBWSxHQUFHLEtBQUssR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUM7UUFDekUsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLENBQUM7UUFFckQsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDM0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztZQUM1QyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMzRCxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM1RCxLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLO1lBQzVCLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU07U0FDakMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUVwQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNoRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdDLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7djQgYXMgdXVpZHY0fSBmcm9tIFwidXVpZFwiO1xyXG5pbXBvcnQgc2hhcnBfIGZyb20gXCJzaGFycFwiO1xyXG5pbXBvcnQge0lHYWxsZXJ5SW1hZ2UsIElHYWxsZXJ5U2l6ZSwgSUdhbGxlcnlJbWFnZUhhbmRsZXJ9IGZyb20gXCIuLi9jb21tb24tdHlwZXNcIjtcclxuXHJcbmNvbnN0IHNoYXJwID0gc2hhcnBfO1xyXG5jb25zdCBiaWdTaXplID0gMTUwMDtcclxuY29uc3QgdGh1bWJTaXplID0gMjUwO1xyXG5cclxuZXhwb3J0IGNsYXNzIEdhbGxlcnlJbWFnZSBpbXBsZW1lbnRzIElHYWxsZXJ5SW1hZ2Uge1xyXG5cclxuICAgIHJlYWRvbmx5IHRodW1iOiBzdHJpbmc7XHJcbiAgICByZWFkb25seSBiaWc6IHN0cmluZztcclxuICAgIHJlYWRvbmx5IHRhcmdldFNpemU6IElHYWxsZXJ5U2l6ZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihyZWFkb25seSBmb2xkZXI6IHN0cmluZywgc2l6ZTogSUdhbGxlcnlTaXplLCByZWFkb25seSBoYW5kbGVyOiBJR2FsbGVyeUltYWdlSGFuZGxlcikge1xyXG4gICAgICAgIHRoaXMudGh1bWIgPSB1dWlkdjQoKTtcclxuICAgICAgICB0aGlzLmJpZyA9IHV1aWR2NCgpO1xyXG4gICAgICAgIHRoaXMudGFyZ2V0U2l6ZSA9ICFzaXplID8ge3dpZHRoOiB0aHVtYlNpemUsIGhlaWdodDogdGh1bWJTaXplfSA6IHNpemU7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2VydmUoaWQ6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPiB7XHJcbiAgICAgICAgY29uc3QgaXNUaHVtYiA9IGlkID09IHRoaXMudGh1bWI7XHJcblxyXG4gICAgICAgIGlmIChhd2FpdCB0aGlzLmhhbmRsZXIuaGFzUmVzdWx0KGlzVGh1bWIpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXIuc2VydmVSZXN1bHQoaXNUaHVtYik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBvcmlnaW5hbCA9IHNoYXJwKGF3YWl0IHRoaXMuaGFuZGxlci5nZXRPcmlnaW5hbCgpKS5yb3RhdGUoKTtcclxuICAgICAgICBjb25zdCBtZXRhID0gYXdhaXQgb3JpZ2luYWwubWV0YWRhdGEoKTtcclxuICAgICAgICBjb25zdCByYXRpbyA9IG1ldGEud2lkdGggLyBtZXRhLmhlaWdodDtcclxuICAgICAgICBjb25zdCBzaXplUmF0aW8gPSBpc1RodW1iID8gdGhpcy50YXJnZXRTaXplLndpZHRoIC8gdGhpcy50YXJnZXRTaXplLmhlaWdodCA6IDE7XHJcbiAgICAgICAgY29uc3Qgc2l6ZSA9IGlzVGh1bWIgPyBNYXRoLm1heCh0aGlzLnRhcmdldFNpemUud2lkdGgsIHRoaXMudGFyZ2V0U2l6ZS5oZWlnaHQpIDogYmlnU2l6ZTtcclxuICAgICAgICBjb25zdCB0YXJnZXRIZWlnaHQgPSByYXRpbyA+IHNpemVSYXRpbyA/IHNpemUgOiBNYXRoLnJvdW5kKHNpemUgLyByYXRpbyk7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0V2lkdGggPSBNYXRoLnJvdW5kKHRhcmdldEhlaWdodCAqIHJhdGlvKTtcclxuXHJcbiAgICAgICAgY29uc3QgcmVzaXplZCA9IG9yaWdpbmFsLnJlc2l6ZSh0YXJnZXRXaWR0aCwgdGFyZ2V0SGVpZ2h0KTtcclxuICAgICAgICBjb25zdCBidWZmZXIgPSBhd2FpdCAoaXNUaHVtYiA/IHJlc2l6ZWQuZXh0cmFjdCh7XHJcbiAgICAgICAgICAgIGxlZnQ6IE1hdGguZmxvb3IoKHRhcmdldFdpZHRoIC0gdGhpcy50YXJnZXRTaXplLndpZHRoKSAvIDIpLFxyXG4gICAgICAgICAgICB0b3A6IE1hdGguZmxvb3IoKHRhcmdldEhlaWdodCAtIHRoaXMudGFyZ2V0U2l6ZS5oZWlnaHQpIC8gMiksXHJcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLnRhcmdldFNpemUud2lkdGgsXHJcbiAgICAgICAgICAgIGhlaWdodDogdGhpcy50YXJnZXRTaXplLmhlaWdodFxyXG4gICAgICAgIH0pLnRvQnVmZmVyKCkgOiByZXNpemVkLnRvQnVmZmVyKCkpO1xyXG5cclxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZXIud3JpdGVSZXN1bHQoaXNUaHVtYiwgYnVmZmVyKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVyLnNlcnZlUmVzdWx0KGlzVGh1bWIpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { __decorate, __metadata } 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 { Configuration } from "./configuration";
|
|
7
|
+
import { GalleryCache } from "./gallery-cache";
|
|
8
|
+
import { mkdirRecursive } from "../utils";
|
|
9
|
+
const sharp = sharp_;
|
|
10
|
+
let Gallery = class Gallery {
|
|
11
|
+
config;
|
|
12
|
+
galleryCache;
|
|
13
|
+
dir;
|
|
14
|
+
output;
|
|
15
|
+
cache;
|
|
16
|
+
constructor(config, galleryCache) {
|
|
17
|
+
this.config = config;
|
|
18
|
+
this.galleryCache = galleryCache;
|
|
19
|
+
this.cache = {};
|
|
20
|
+
this.dir = this.config.resolve("galleryDir");
|
|
21
|
+
this.output = join(this.config.resolve("cacheDir"), "gallery");
|
|
22
|
+
}
|
|
23
|
+
async getFolder(folder, size = null) {
|
|
24
|
+
this.cache[folder] = this.cache[folder] || new Promise(resolve => {
|
|
25
|
+
lstat(join(this.dir, folder), (err, stats) => {
|
|
26
|
+
if (err || !stats.isDirectory()) {
|
|
27
|
+
resolve([]);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
this.readRecursive(folder, "", size).then(resolve, () => resolve([]));
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
return this.cache[folder];
|
|
34
|
+
}
|
|
35
|
+
readRecursive(path, folder, size) {
|
|
36
|
+
return new Promise(resolve => {
|
|
37
|
+
readdir(join(this.dir, path), (err, files) => {
|
|
38
|
+
if (err) {
|
|
39
|
+
resolve([]);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const promises = files.map(file => {
|
|
43
|
+
return new Promise(async (resolve) => {
|
|
44
|
+
const filePath = join(path, file);
|
|
45
|
+
const absoluteFilePath = join(this.dir, filePath);
|
|
46
|
+
lstat(absoluteFilePath, (err, stats) => {
|
|
47
|
+
if (err) {
|
|
48
|
+
resolve([]);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (stats.isDirectory()) {
|
|
52
|
+
this.readRecursive(filePath, join(folder, file), size).then(resolve);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const sharpImg = sharp(absoluteFilePath);
|
|
56
|
+
sharpImg.rotate().metadata().then(() => {
|
|
57
|
+
const getResultPath = (isThumb) => {
|
|
58
|
+
return join(this.output, filePath.replace(/.([a-z|A-Z]+)$/gi, function (ext) {
|
|
59
|
+
const suffix = isThumb ? 'thumb' : 'big';
|
|
60
|
+
return `-${suffix}${ext}`;
|
|
61
|
+
}));
|
|
62
|
+
};
|
|
63
|
+
resolve([this.galleryCache.create(folder, size, {
|
|
64
|
+
getOriginal: () => {
|
|
65
|
+
return new Promise((res, rej) => {
|
|
66
|
+
readFile(absoluteFilePath, (err, data) => {
|
|
67
|
+
if (err) {
|
|
68
|
+
rej(err);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
res(data);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
},
|
|
75
|
+
writeResult: (isThumb, buffer) => {
|
|
76
|
+
return new Promise(async (res, rej) => {
|
|
77
|
+
const resultPath = getResultPath(isThumb);
|
|
78
|
+
await mkdirRecursive(dirname(resultPath));
|
|
79
|
+
writeFile(resultPath, buffer, err => {
|
|
80
|
+
if (err) {
|
|
81
|
+
rej(err);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
res();
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
},
|
|
88
|
+
hasResult: (isThumb) => {
|
|
89
|
+
return new Promise(res => {
|
|
90
|
+
access(getResultPath(isThumb), constants.R_OK, err => {
|
|
91
|
+
res(!err);
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
},
|
|
95
|
+
serveResult: (isThumb) => {
|
|
96
|
+
return new Promise((res, rej) => {
|
|
97
|
+
readFile(getResultPath(isThumb), (err, data) => {
|
|
98
|
+
if (err) {
|
|
99
|
+
rej(err);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
res(data);
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
})]);
|
|
107
|
+
}, () => resolve([]));
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
Promise.all(promises).then(folders => {
|
|
112
|
+
resolve([].concat.apply([], folders));
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
Gallery = __decorate([
|
|
119
|
+
injectable(),
|
|
120
|
+
scoped(Lifecycle.ContainerScoped),
|
|
121
|
+
__metadata("design:paramtypes", [Configuration, GalleryCache])
|
|
122
|
+
], Gallery);
|
|
123
|
+
export { Gallery };
|
|
124
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FsbGVyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9nYWxsZXJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDdkQsT0FBTyxNQUFNLE1BQU0sT0FBTyxDQUFDO0FBQzNCLE9BQU8sRUFBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBQyxNQUFNLElBQUksQ0FBQztBQUMxRSxPQUFPLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUVuQyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFFeEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDO0FBSWQsSUFBTSxPQUFPLEdBQWIsTUFBTSxPQUFPO0lBTUs7SUFBZ0M7SUFKcEMsR0FBRyxDQUFTO0lBQ1osTUFBTSxDQUFTO0lBQ2YsS0FBSyxDQUFpRDtJQUV2RSxZQUFxQixNQUFxQixFQUFXLFlBQTBCO1FBQTFELFdBQU0sR0FBTixNQUFNLENBQWU7UUFBVyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMzRSxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRCxL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O0dBTnRFLE9BQU8sQ0EyR25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpbmplY3RhYmxlLCBMaWZlY3ljbGUsIHNjb3BlZH0gZnJvbSBcInRzeXJpbmdlXCI7XHJcbmltcG9ydCBzaGFycF8gZnJvbSBcInNoYXJwXCI7XHJcbmltcG9ydCB7YWNjZXNzLCBjb25zdGFudHMsIGxzdGF0LCByZWFkZGlyLCByZWFkRmlsZSwgd3JpdGVGaWxlfSBmcm9tIFwiZnNcIjtcclxuaW1wb3J0IHtqb2luLCBkaXJuYW1lfSBmcm9tIFwicGF0aFwiO1xyXG5pbXBvcnQge0lHYWxsZXJ5SW1hZ2UsIElHYWxsZXJ5U2l6ZX0gZnJvbSBcIi4uL2NvbW1vbi10eXBlc1wiO1xyXG5pbXBvcnQge0NvbmZpZ3VyYXRpb259IGZyb20gXCIuL2NvbmZpZ3VyYXRpb25cIjtcclxuaW1wb3J0IHtHYWxsZXJ5Q2FjaGV9IGZyb20gXCIuL2dhbGxlcnktY2FjaGVcIjtcclxuaW1wb3J0IHtta2RpclJlY3Vyc2l2ZX0gZnJvbSBcIi4uL3V0aWxzXCI7XHJcblxyXG5jb25zdCBzaGFycCA9IHNoYXJwXztcclxuXHJcbkBpbmplY3RhYmxlKClcclxuQHNjb3BlZChMaWZlY3ljbGUuQ29udGFpbmVyU2NvcGVkKVxyXG5leHBvcnQgY2xhc3MgR2FsbGVyeSB7XHJcblxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBkaXI6IHN0cmluZztcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3V0cHV0OiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhY2hlOiB7IFtmb2xkZXI6IHN0cmluZ106IFByb21pc2U8SUdhbGxlcnlJbWFnZVtdPiB9O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGNvbmZpZzogQ29uZmlndXJhdGlvbiwgcmVhZG9ubHkgZ2FsbGVyeUNhY2hlOiBHYWxsZXJ5Q2FjaGUpIHtcclxuICAgICAgICB0aGlzLmNhY2hlID0ge307XHJcbiAgICAgICAgdGhpcy5kaXIgPSB0aGlzLmNvbmZpZy5yZXNvbHZlKFwiZ2FsbGVyeURpclwiKTtcclxuICAgICAgICB0aGlzLm91dHB1dCA9IGpvaW4odGhpcy5jb25maWcucmVzb2x2ZShcImNhY2hlRGlyXCIpLCBcImdhbGxlcnlcIik7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZ2V0Rm9sZGVyKGZvbGRlcjogc3RyaW5nLCBzaXplOiBJR2FsbGVyeVNpemUgPSBudWxsKTogUHJvbWlzZTxJR2FsbGVyeUltYWdlW10+IHtcclxuICAgICAgICB0aGlzLmNhY2hlW2ZvbGRlcl0gPSB0aGlzLmNhY2hlW2ZvbGRlcl0gfHwgbmV3IFByb21pc2U8SUdhbGxlcnlJbWFnZVtdPihyZXNvbHZlID0+IHtcclxuICAgICAgICAgICAgbHN0YXQoam9pbih0aGlzLmRpciwgZm9sZGVyKSwgKGVyciwgc3RhdHMpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChlcnIgfHwgIXN0YXRzLmlzRGlyZWN0b3J5KCkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKFtdKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlYWRSZWN1cnNpdmUoZm9sZGVyLCBcIlwiLCBzaXplKS50aGVuKHJlc29sdmUsICgpID0+IHJlc29sdmUoW10pKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVbZm9sZGVyXTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcmVhZFJlY3Vyc2l2ZShwYXRoOiBzdHJpbmcsIGZvbGRlcjogc3RyaW5nLCBzaXplOiBJR2FsbGVyeVNpemUpOiBQcm9taXNlPElHYWxsZXJ5SW1hZ2VbXT4ge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxJR2FsbGVyeUltYWdlW10+KHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICByZWFkZGlyKGpvaW4odGhpcy5kaXIsIHBhdGgpLCAoZXJyLCBmaWxlcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoW10pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IHByb21pc2VzID0gZmlsZXMubWFwKGZpbGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxJR2FsbGVyeUltYWdlW10+KGFzeW5jIHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4ocGF0aCwgZmlsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFic29sdXRlRmlsZVBhdGggPSBqb2luKHRoaXMuZGlyLCBmaWxlUGF0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxzdGF0KGFic29sdXRlRmlsZVBhdGgsIChlcnIsIHN0YXRzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShbXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRzLmlzRGlyZWN0b3J5KCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlYWRSZWN1cnNpdmUoZmlsZVBhdGgsIGpvaW4oZm9sZGVyLCBmaWxlKSwgc2l6ZSkudGhlbihyZXNvbHZlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFycEltZyA9IHNoYXJwKGFic29sdXRlRmlsZVBhdGgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcnBJbWcucm90YXRlKCkubWV0YWRhdGEoKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnZXRSZXN1bHRQYXRoID0gKGlzVGh1bWIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpvaW4odGhpcy5vdXRwdXQsIGZpbGVQYXRoLnJlcGxhY2UoLy4oW2EtenxBLVpdKykkL2dpLCBmdW5jdGlvbiAoZXh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWZmaXggPSBpc1RodW1iID8gJ3RodW1iJyA6ICdiaWcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAtJHtzdWZmaXh9JHtleHR9YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShbdGhpcy5nYWxsZXJ5Q2FjaGUuY3JlYXRlKGZvbGRlciwgc2l6ZSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPcmlnaW5hbDogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPEJ1ZmZlcj4oKHJlcywgcmVqKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEZpbGUoYWJzb2x1dGVGaWxlUGF0aCwgKGVyciwgZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWooZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMoZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVSZXN1bHQ6IChpc1RodW1iOiBib29sZWFuLCBidWZmZXI6IEJ1ZmZlcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KGFzeW5jIChyZXMsIHJlaikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdFBhdGggPSBnZXRSZXN1bHRQYXRoKGlzVGh1bWIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IG1rZGlyUmVjdXJzaXZlKGRpcm5hbWUocmVzdWx0UGF0aCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlRmlsZShyZXN1bHRQYXRoLCBidWZmZXIsIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaihlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1Jlc3VsdDogKGlzVGh1bWI6IGJvb2xlYW4pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPihyZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VzcyhnZXRSZXN1bHRQYXRoKGlzVGh1bWIpLCBjb25zdGFudHMuUl9PSywgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzKCFlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlUmVzdWx0OiAoaXNUaHVtYjogYm9vbGVhbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPEJ1ZmZlcj4oKHJlcywgcmVqKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEZpbGUoZ2V0UmVzdWx0UGF0aChpc1RodW1iKSwgKGVyciwgZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWooZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMoZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAoKSA9PiByZXNvbHZlKFtdKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbihmb2xkZXJzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKFtdLmNvbmNhdC5hcHBseShbXSwgZm9sZGVycykpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { __decorate, __metadata } from "tslib";
|
|
2
|
+
import { injectable, Lifecycle, scoped } from "tsyringe";
|
|
3
|
+
import { Configuration } from "./configuration";
|
|
4
|
+
import { rand } from "../utils";
|
|
5
|
+
let IdGenerator = class IdGenerator {
|
|
6
|
+
config;
|
|
7
|
+
prefix;
|
|
8
|
+
separator;
|
|
9
|
+
chars;
|
|
10
|
+
parts;
|
|
11
|
+
constructor(config) {
|
|
12
|
+
this.config = config;
|
|
13
|
+
this.prefix = config.resolve("idPrefix");
|
|
14
|
+
this.separator = config.resolve("idSeparator");
|
|
15
|
+
this.chars = config.resolve("idChars");
|
|
16
|
+
this.parts = config.resolve("idParts");
|
|
17
|
+
}
|
|
18
|
+
async generate(checkCb) {
|
|
19
|
+
let id = null;
|
|
20
|
+
let tries = 0;
|
|
21
|
+
let notGood = true;
|
|
22
|
+
while (notGood && tries < 5) {
|
|
23
|
+
id = this.generateId();
|
|
24
|
+
notGood = await checkCb(id);
|
|
25
|
+
tries++;
|
|
26
|
+
}
|
|
27
|
+
if (notGood) {
|
|
28
|
+
throw `Couldn't generate an unique id..`;
|
|
29
|
+
}
|
|
30
|
+
return id;
|
|
31
|
+
}
|
|
32
|
+
generateId() {
|
|
33
|
+
return this.prefix + this.parts.map(num => {
|
|
34
|
+
let s = "";
|
|
35
|
+
for (let i = 0; i < num; i++) {
|
|
36
|
+
const ix = rand(0, this.chars.length - 1);
|
|
37
|
+
s += this.chars[ix];
|
|
38
|
+
}
|
|
39
|
+
return s;
|
|
40
|
+
}).join(this.separator);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
IdGenerator = __decorate([
|
|
44
|
+
injectable(),
|
|
45
|
+
scoped(Lifecycle.ContainerScoped),
|
|
46
|
+
__metadata("design:paramtypes", [Configuration])
|
|
47
|
+
], IdGenerator);
|
|
48
|
+
export { IdGenerator };
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWQtZ2VuZXJhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL2lkLWdlbmVyYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ3ZELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBSXZCLElBQU0sV0FBVyxHQUFqQixNQUFNLFdBQVc7SUFPQztJQUxYLE1BQU0sQ0FBUztJQUNmLFNBQVMsQ0FBUztJQUNsQixLQUFLLENBQVM7SUFDZCxLQUFLLENBQVc7SUFFMUIsWUFBcUIsTUFBcUI7UUFBckIsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQUN0QyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBeUM7UUFDcEQsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQ2QsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE9BQU8sT0FBTyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMxQixFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM1QixLQUFLLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFDRCxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1YsTUFBTSxrQ0FBa0MsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsT0FBTyxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRU8sVUFBVTtRQUNkLE9BQU8sSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUN0QyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDWCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzNCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQzFDLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3hCLENBQUM7WUFDRCxPQUFPLENBQUMsQ0FBQztRQUNiLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDNUIsQ0FBQztDQUNKLENBQUE7QUF2Q1ksV0FBVztJQUZ2QixVQUFVLEVBQUU7SUFDWixNQUFNLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQztxQ0FRRCxhQUFhO0dBUGpDLFdBQVcsQ0F1Q3ZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpbmplY3RhYmxlLCBMaWZlY3ljbGUsIHNjb3BlZH0gZnJvbSBcInRzeXJpbmdlXCI7XHJcbmltcG9ydCB7Q29uZmlndXJhdGlvbn0gZnJvbSBcIi4vY29uZmlndXJhdGlvblwiO1xyXG5pbXBvcnQge3JhbmR9IGZyb20gXCIuLi91dGlsc1wiO1xyXG5cclxuQGluamVjdGFibGUoKVxyXG5Ac2NvcGVkKExpZmVjeWNsZS5Db250YWluZXJTY29wZWQpXHJcbmV4cG9ydCBjbGFzcyBJZEdlbmVyYXRvciB7XHJcblxyXG4gICAgcHJvdGVjdGVkIHByZWZpeDogc3RyaW5nO1xyXG4gICAgcHJvdGVjdGVkIHNlcGFyYXRvcjogc3RyaW5nO1xyXG4gICAgcHJvdGVjdGVkIGNoYXJzOiBzdHJpbmc7XHJcbiAgICBwcm90ZWN0ZWQgcGFydHM6IG51bWJlcltdO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGNvbmZpZzogQ29uZmlndXJhdGlvbikge1xyXG4gICAgICAgIHRoaXMucHJlZml4ID0gY29uZmlnLnJlc29sdmUoXCJpZFByZWZpeFwiKTtcclxuICAgICAgICB0aGlzLnNlcGFyYXRvciA9IGNvbmZpZy5yZXNvbHZlKFwiaWRTZXBhcmF0b3JcIik7XHJcbiAgICAgICAgdGhpcy5jaGFycyA9IGNvbmZpZy5yZXNvbHZlKFwiaWRDaGFyc1wiKTtcclxuICAgICAgICB0aGlzLnBhcnRzID0gY29uZmlnLnJlc29sdmUoXCJpZFBhcnRzXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdlbmVyYXRlKGNoZWNrQ2I6IChpZDogc3RyaW5nKSA9PiBQcm9taXNlPGJvb2xlYW4+KTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgICAgICBsZXQgaWQgPSBudWxsO1xyXG4gICAgICAgIGxldCB0cmllcyA9IDA7XHJcbiAgICAgICAgbGV0IG5vdEdvb2QgPSB0cnVlO1xyXG4gICAgICAgIHdoaWxlIChub3RHb29kICYmIHRyaWVzIDwgNSkge1xyXG4gICAgICAgICAgICBpZCA9IHRoaXMuZ2VuZXJhdGVJZCgpO1xyXG4gICAgICAgICAgICBub3RHb29kID0gYXdhaXQgY2hlY2tDYihpZCk7XHJcbiAgICAgICAgICAgIHRyaWVzKys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChub3RHb29kKSB7XHJcbiAgICAgICAgICAgIHRocm93IGBDb3VsZG4ndCBnZW5lcmF0ZSBhbiB1bmlxdWUgaWQuLmA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpZDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdlbmVyYXRlSWQoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wcmVmaXggKyB0aGlzLnBhcnRzLm1hcChudW0gPT4ge1xyXG4gICAgICAgICAgICBsZXQgcyA9IFwiXCI7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGl4ID0gcmFuZCgwLCB0aGlzLmNoYXJzLmxlbmd0aCAtIDEpO1xyXG4gICAgICAgICAgICAgICAgcyArPSB0aGlzLmNoYXJzW2l4XTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcztcclxuICAgICAgICB9KS5qb2luKHRoaXMuc2VwYXJhdG9yKTtcclxuICAgIH1cclxufVxyXG4iXX0=
|