@stemy/backend 2.8.6 → 2.9.3

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.
@@ -17,10 +17,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
17
17
  });
18
18
  };
19
19
  import { injectable, Lifecycle, scoped } from "tsyringe";
20
- import { fromStream } from "file-type";
21
20
  import { ObjectId } from "bson";
22
21
  import axios from "axios";
23
- import { bufferToStream, copyStream } from "../utils";
22
+ import { bufferToStream, copyStream, streamToBuffer } from "../utils";
24
23
  import { MongoConnector } from "./mongo-connector";
25
24
  import { AssetProcessor } from "./asset-processor";
26
25
  import { Asset } from "./entities/asset";
@@ -34,56 +33,37 @@ let Assets = class Assets {
34
33
  }
35
34
  write(stream, contentType = null, metadata = null) {
36
35
  return __awaiter(this, void 0, void 0, function* () {
37
- let extension = null;
38
- const fileTypeStream = copyStream(stream);
39
36
  const uploadStream = copyStream(stream);
37
+ const buffer = yield streamToBuffer(stream);
38
+ let fileType = { ext: "", mime: contentType };
40
39
  try {
41
- const fileType = yield fromStream(fileTypeStream);
42
- contentType = fileType.mime;
43
- extension = fileType.ext;
40
+ fileType = yield AssetProcessor.fileTypeFromBuffer(buffer);
44
41
  }
45
42
  catch (e) {
46
- if (!contentType) {
47
- throw `Can't determine content type`;
43
+ if (!fileType.mime) {
44
+ throw `Can't determine mime type`;
48
45
  }
49
- console.log(`Can't determine content type`, e);
46
+ console.log(`Can't determine mime type`, e);
50
47
  }
51
- contentType = contentType.trim();
52
- extension = (extension || "").trim();
53
- metadata = Object.assign({
54
- extension,
55
- downloadCount: 0,
56
- firstDownload: null,
57
- lastDownload: null
58
- }, metadata || {});
59
- metadata.filename = metadata.filename || new ObjectId().toHexString();
60
- return new Promise(((resolve, reject) => {
61
- const uploaderStream = this.bucket.openUploadStream(metadata.filename);
62
- uploadStream.pipe(uploaderStream)
63
- .on("error", error => {
64
- reject(error.message || error);
65
- })
66
- .on("finish", () => {
67
- const asset = new Asset(uploaderStream.id, {
68
- filename: metadata.filename,
69
- contentType,
70
- metadata
71
- }, this.collection, this.bucket);
72
- asset.save().then(() => {
73
- resolve(asset);
74
- }, error => {
75
- reject(error.message || error);
76
- });
77
- });
78
- }));
48
+ metadata = metadata || {};
49
+ return this.upload(uploadStream, fileType, metadata);
79
50
  });
80
51
  }
81
52
  writeBuffer(buffer, metadata = null, contentType = null) {
82
53
  return __awaiter(this, void 0, void 0, function* () {
83
- contentType = yield AssetProcessor.getMimeType(buffer, contentType);
54
+ let fileType = { ext: "", mime: contentType };
55
+ try {
56
+ fileType = yield AssetProcessor.fileTypeFromBuffer(buffer);
57
+ }
58
+ catch (e) {
59
+ if (!fileType.mime) {
60
+ throw `Can't determine mime type`;
61
+ }
62
+ console.log(`Can't determine mime type`, e);
63
+ }
84
64
  metadata = metadata || {};
85
- buffer = yield this.assetProcessor.process(buffer, metadata, contentType);
86
- return this.write(bufferToStream(buffer), contentType, metadata);
65
+ buffer = yield this.assetProcessor.process(buffer, metadata, fileType);
66
+ return this.upload(bufferToStream(buffer), fileType, metadata);
87
67
  });
88
68
  }
89
69
  writeUrl(url, metadata = null) {
@@ -124,6 +104,37 @@ let Assets = class Assets {
124
104
  return asset.unlink();
125
105
  });
126
106
  }
107
+ upload(stream, fileType, metadata) {
108
+ return __awaiter(this, void 0, void 0, function* () {
109
+ const contentType = fileType.mime.trim();
110
+ metadata = Object.assign({
111
+ downloadCount: 0,
112
+ firstDownload: null,
113
+ lastDownload: null
114
+ }, metadata || {});
115
+ metadata.filename = metadata.filename || new ObjectId().toHexString();
116
+ metadata.extension = (fileType.ext || "").trim();
117
+ return new Promise(((resolve, reject) => {
118
+ const uploaderStream = this.bucket.openUploadStream(metadata.filename);
119
+ stream.pipe(uploaderStream)
120
+ .on("error", error => {
121
+ reject(error.message || error);
122
+ })
123
+ .on("finish", () => {
124
+ const asset = new Asset(uploaderStream.id, {
125
+ filename: metadata.filename,
126
+ contentType,
127
+ metadata
128
+ }, this.collection, this.bucket);
129
+ asset.save().then(() => {
130
+ resolve(asset);
131
+ }, error => {
132
+ reject(error.message || error);
133
+ });
134
+ });
135
+ }));
136
+ });
137
+ }
127
138
  };
128
139
  Assets = __decorate([
129
140
  injectable(),
@@ -131,4 +142,4 @@ Assets = __decorate([
131
142
  __metadata("design:paramtypes", [MongoConnector, AssetProcessor])
132
143
  ], Assets);
133
144
  export { Assets };
134
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL2Fzc2V0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDdkQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVyQyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRzlCLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUUxQixPQUFPLEVBQUMsY0FBYyxFQUFFLFVBQVUsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUVwRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztJQUkxQixNQUFNLFNBQU4sTUFBTTtJQUtmLFlBQXFCLFNBQXlCLEVBQVcsY0FBOEI7O1FBQWxFLGNBQVMsR0FBVCxTQUFTLENBQWdCO1FBQVcsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQ25GLElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztRQUMvQixJQUFJLENBQUMsVUFBVSxTQUFHLFNBQVMsQ0FBQyxRQUFRLDBDQUFFLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUssS0FBSyxDQUFDLE1BQWdCLEVBQUUsY0FBc0IsSUFBSSxFQUFFLFdBQXVCLElBQUk7O1lBQ2pGLElBQUksU0FBUyxHQUFXLElBQUksQ0FBQztZQUM3QixNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDMUMsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lB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WUFDRCxPQUFPLE1BQU0sQ0FBQztRQUNsQixDQUFDO0tBQUE7SUFFSyxNQUFNLENBQUMsRUFBVTs7WUFDbkIsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxLQUFLO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBQ3hCLE9BQU8sS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzFCLENBQUM7S0FBQTtDQUNKLENBQUE7QUEzRlksTUFBTTtJQUZsQixVQUFVLEVBQUU7SUFDWixNQUFNLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQztxQ0FNRSxjQUFjLEVBQTJCLGNBQWM7R0FMOUUsTUFBTSxDQTJGbEI7U0EzRlksTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aW5qZWN0YWJsZSwgTGlmZWN5Y2xlLCBzY29wZWR9IGZyb20gXCJ0c3lyaW5nZVwiO1xyXG5pbXBvcnQge2Zyb21TdHJlYW19IGZyb20gXCJmaWxlLXR5cGVcIjtcclxuaW1wb3J0IHtSZWFkYWJsZX0gZnJvbSBcInN0cmVhbVwiO1xyXG5pbXBvcnQge09iamVjdElkfSBmcm9tIFwiYnNvblwiO1xyXG5pbXBvcnQge0NvbGxlY3Rpb24sIEdyaWRGU0J1Y2tldH0gZnJvbSBcIm1vbmdvZGJcIjtcclxuaW1wb3J0IHtGaWx0ZXJRdWVyeX0gZnJvbSBcIm1vbmdvb3NlXCI7XHJcbmltcG9ydCBheGlvcyBmcm9tIFwiYXhpb3NcIjtcclxuXHJcbmltcG9ydCB7YnVmZmVyVG9TdHJlYW0sIGNvcHlTdHJlYW19IGZyb20gXCIuLi91dGlsc1wiO1xyXG5pbXBvcnQge0lBc3NldCwgSUFzc2V0TWV0YX0gZnJvbSBcIi4uL2NvbW1vbi10eXBlc1wiO1xyXG5pbXBvcnQge01vbmdvQ29ubmVjdG9yfSBmcm9tIFwiLi9tb25nby1jb25uZWN0b3JcIjtcclxuaW1wb3J0IHtBc3NldFByb2Nlc3Nvcn0gZnJvbSBcIi4vYXNzZXQtcHJvY2Vzc29yXCI7XHJcbmltcG9ydCB7QXNzZXR9IGZyb20gXCIuL2VudGl0aWVzL2Fzc2V0XCI7XHJcblxyXG5AaW5qZWN0YWJsZSgpXHJcbkBzY29wZWQoTGlmZWN5Y2xlLkNvbnRhaW5lclNjb3BlZClcclxuZXhwb3J0IGNsYXNzIEFzc2V0cyB7XHJcblxyXG4gICAgcmVhZG9ubHkgYnVja2V0OiBHcmlkRlNCdWNrZXQ7XHJcbiAgICByZWFkb25seSBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGNvbm5lY3RvcjogTW9uZ29Db25uZWN0b3IsIHJlYWRvbmx5IGFzc2V0UHJvY2Vzc29yOiBBc3NldFByb2Nlc3Nvcikge1xyXG4gICAgICAgIHRoaXMuYnVja2V0ID0gY29ubmVjdG9yLmJ1Y2tldDtcclxuICAgICAgICB0aGlzLmNvbGxlY3Rpb24gPSBjb25uZWN0b3IuZGF0YWJhc2U/LmNvbGxlY3Rpb24oXCJhc3NldHMuZmlsZXNcIik7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgd3JpdGUoc3RyZWFtOiBSZWFkYWJsZSwgY29udGVudFR5cGU6IHN0cmluZyA9IG51bGwsIG1ldGFkYXRhOiBJQXNzZXRNZXRhID0gbnVsbCk6IFByb21pc2U8SUFzc2V0PiB7XHJcbiAgICAgICAgbGV0IGV4dGVuc2lvbjogc3RyaW5nID0gbnVsbDtcclxuICAgICAgICBjb25zdCBmaWxlVHlwZVN0cmVhbSA9IGNvcHlTdHJlYW0oc3RyZWFtKTtcclxuICAgICAgICBjb25zdCB1cGxvYWRTdHJlYW0gPSBjb3B5U3RyZWFtKHN0cmVhbSk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgZmlsZVR5cGUgPSBhd2FpdCBmcm9tU3RyZWFtKGZpbGVUeXBlU3RyZWFtKTtcclxuICAgICAgICAgICAgY29udGVudFR5cGUgPSBmaWxlVHlwZS5taW1lO1xyXG4gICAgICAgICAgICBleHRlbnNpb24gPSBmaWxlVHlwZS5leHQ7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBpZiAoIWNvbnRlbnRUeXBlKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBgQ2FuJ3QgZGV0ZXJtaW5lIGNvbnRlbnQgdHlwZWA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc29sZS5sb2coYENhbid0IGRldGVybWluZSBjb250ZW50IHR5cGVgLCBlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29udGVudFR5cGUgPSBjb250ZW50VHlwZS50cmltKCk7XHJcbiAgICAgICAgZXh0ZW5zaW9uID0gKGV4dGVuc2lvbiB8fCBcIlwiKS50cmltKCk7XHJcbiAgICAgICAgbWV0YWRhdGEgPSBPYmplY3QuYXNzaWduKHtcclxuICAgICAgICAgICAgZXh0ZW5zaW9uLFxyXG4gICAgICAgICAgICBkb3dubG9hZENvdW50OiAwLFxyXG4gICAgICAgICAgICBmaXJzdERvd25sb2FkOiBudWxsLFxyXG4gICAgICAgICAgICBsYXN0RG93bmxvYWQ6IG51bGxcclxuICAgICAgICB9LCBtZXRhZGF0YSB8fCB7fSk7XHJcbiAgICAgICAgbWV0YWRhdGEuZmlsZW5hbWUgPSBtZXRhZGF0YS5maWxlbmFtZSB8fCBuZXcgT2JqZWN0SWQoKS50b0hleFN0cmluZygpO1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxJQXNzZXQ+KCgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHVwbG9hZGVyU3RyZWFtID0gdGhpcy5idWNrZXQub3BlblVwbG9hZFN0cmVhbShtZXRhZGF0YS5maWxlbmFtZSk7XHJcbiAgICAgICAgICAgIHVwbG9hZFN0cmVhbS5waXBlKHVwbG9hZGVyU3RyZWFtKVxyXG4gICAgICAgICAgICAgICAgLm9uKFwiZXJyb3JcIiwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvci5tZXNzYWdlIHx8IGVycm9yKTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAub24oXCJmaW5pc2hcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFzc2V0ID0gbmV3IEFzc2V0KHVwbG9hZGVyU3RyZWFtLmlkIGFzIE9iamVjdElkLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBtZXRhZGF0YS5maWxlbmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhXHJcbiAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5jb2xsZWN0aW9uLCB0aGlzLmJ1Y2tldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXNzZXQuc2F2ZSgpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGFzc2V0KTtcclxuICAgICAgICAgICAgICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvci5tZXNzYWdlIHx8IGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyB3cml0ZUJ1ZmZlcihidWZmZXI6IEJ1ZmZlciwgbWV0YWRhdGE6IElBc3NldE1ldGEgPSBudWxsLCBjb250ZW50VHlwZTogc3RyaW5nID0gbnVsbCk6IFByb21pc2U8SUFzc2V0PiB7XHJcbiAgICAgICAgY29udGVudFR5cGUgPSBhd2FpdCBBc3NldFByb2Nlc3Nvci5nZXRNaW1lVHlwZShidWZmZXIsIGNvbnRlbnRUeXBlKTtcclxuICAgICAgICBtZXRhZGF0YSA9IG1ldGFkYXRhIHx8IHt9O1xyXG4gICAgICAgIGJ1ZmZlciA9IGF3YWl0IHRoaXMuYXNzZXRQcm9jZXNzb3IucHJvY2VzcyhidWZmZXIsIG1ldGFkYXRhLCBjb250ZW50VHlwZSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMud3JpdGUoYnVmZmVyVG9TdHJlYW0oYnVmZmVyKSwgY29udGVudFR5cGUsIG1ldGFkYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyB3cml0ZVVybCh1cmw6IHN0cmluZywgbWV0YWRhdGE6IElBc3NldE1ldGEgPSBudWxsKTogUHJvbWlzZTxJQXNzZXQ+IHtcclxuICAgICAgICBjb25zdCBidWZmZXIgPSAoYXdhaXQgYXhpb3MoeyB1cmwsIHJlc3BvbnNlVHlwZTogXCJhcnJheWJ1ZmZlclwiIH0pKS5kYXRhIGFzIEJ1ZmZlcjtcclxuICAgICAgICByZXR1cm4gdGhpcy53cml0ZUJ1ZmZlcihidWZmZXIsIG1ldGFkYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyByZWFkKGlkOiBzdHJpbmcpOiBQcm9taXNlPElBc3NldD4ge1xyXG4gICAgICAgIHJldHVybiAhaWQgPyBudWxsIDogdGhpcy5maW5kKHtfaWQ6IG5ldyBPYmplY3RJZChpZCl9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBmaW5kKHdoZXJlOiBGaWx0ZXJRdWVyeTxJQXNzZXQ+KTogUHJvbWlzZTxJQXNzZXQ+IHtcclxuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5jb2xsZWN0aW9uLmZpbmRPbmUod2hlcmUpO1xyXG4gICAgICAgIHJldHVybiAhZGF0YSA/IG51bGwgOiBuZXcgQXNzZXQoZGF0YS5faWQsIGRhdGEsIHRoaXMuY29sbGVjdGlvbiwgdGhpcy5idWNrZXQpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGZpbmRNYW55KHdoZXJlOiBGaWx0ZXJRdWVyeTxJQXNzZXQ+KTogUHJvbWlzZTxSZWFkb25seUFycmF5PElBc3NldD4+IHtcclxuICAgICAgICBjb25zdCBjdXJzb3IgPSB0aGlzLmNvbGxlY3Rpb24uZmluZCh3aGVyZSk7XHJcbiAgICAgICAgY29uc3QgaXRlbXMgPSBhd2FpdCBjdXJzb3IudG9BcnJheSgpIHx8IFtdO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogSUFzc2V0W10gPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpdGVtIG9mIGl0ZW1zKSB7XHJcbiAgICAgICAgICAgIGlmICghaXRlbSkgY29udGludWU7XHJcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ldyBBc3NldChpdGVtLl9pZCwgaXRlbSwgdGhpcy5jb2xsZWN0aW9uLCB0aGlzLmJ1Y2tldCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHVubGluayhpZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICBjb25zdCBhc3NldCA9IGF3YWl0IHRoaXMucmVhZChpZCk7XHJcbiAgICAgICAgaWYgKCFhc3NldCkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgcmV0dXJuIGFzc2V0LnVubGluaygpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
145
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL2Fzc2V0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFFdkQsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUc5QixPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFFMUIsT0FBTyxFQUFDLGNBQWMsRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRXBFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGtCQUFrQixDQUFDO0lBSTFCLE1BQU0sU0FBTixNQUFNO0lBS2YsWUFBcUIsU0FBeUIsRUFBVyxjQUE4Qjs7UUFBbEUsY0FBUyxHQUFULFNBQVMsQ0FBZ0I7UUFBVyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDbkYsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBQy9CLElBQUksQ0FBQyxVQUFVLFNBQUcsU0FBUyxDQUFDLFFBQVEsMENBQUUsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFSyxLQUFLLENBQUMsTUFBZ0IsRUFBRSxjQUFzQixJQUFJLEVBQUUsV0FBdUIsSUFBSTs7WUFDakYsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hDLE1BQU0sTUFBTSxHQUFHLE1BQU0sY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzVDLElBQUksUUFBUSxHQUFHLEVBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FB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SSxDQUFDLGNBQWMsQ0FBQztxQkFDdEIsRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsRUFBRTtvQkFDakIsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLENBQUM7Z0JBQ25DLENBQUMsQ0FBQztxQkFDRCxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRTtvQkFDZixNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxjQUFjLENBQUMsRUFBYyxFQUFFO3dCQUNuRCxRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVE7d0JBQzNCLFdBQVc7d0JBQ1gsUUFBUTtxQkFDWCxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUNqQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTt3QkFDbkIsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNuQixDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUU7d0JBQ1AsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLENBQUM7b0JBQ25DLENBQUMsQ0FBQyxDQUFDO2dCQUNQLENBQUMsQ0FBQyxDQUFDO1lBQ1gsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNSLENBQUM7S0FBQTtDQUNKLENBQUE7QUFyR1ksTUFBTTtJQUZsQixVQUFVLEVBQUU7SUFDWixNQUFNLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQztxQ0FNRSxjQUFjLEVBQTJCLGNBQWM7R0FMOUUsTUFBTSxDQXFHbEI7U0FyR1ksTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aW5qZWN0YWJsZSwgTGlmZWN5Y2xlLCBzY29wZWR9IGZyb20gXCJ0c3lyaW5nZVwiO1xyXG5pbXBvcnQge1JlYWRhYmxlfSBmcm9tIFwic3RyZWFtXCI7XHJcbmltcG9ydCB7T2JqZWN0SWR9IGZyb20gXCJic29uXCI7XHJcbmltcG9ydCB7Q29sbGVjdGlvbiwgR3JpZEZTQnVja2V0fSBmcm9tIFwibW9uZ29kYlwiO1xyXG5pbXBvcnQge0ZpbHRlclF1ZXJ5fSBmcm9tIFwibW9uZ29vc2VcIjtcclxuaW1wb3J0IGF4aW9zIGZyb20gXCJheGlvc1wiO1xyXG5cclxuaW1wb3J0IHtidWZmZXJUb1N0cmVhbSwgY29weVN0cmVhbSwgc3RyZWFtVG9CdWZmZXJ9IGZyb20gXCIuLi91dGlsc1wiO1xyXG5pbXBvcnQge0lBc3NldCwgSUFzc2V0TWV0YSwgSUZpbGVUeXBlfSBmcm9tIFwiLi4vY29tbW9uLXR5cGVzXCI7XHJcbmltcG9ydCB7TW9uZ29Db25uZWN0b3J9IGZyb20gXCIuL21vbmdvLWNvbm5lY3RvclwiO1xyXG5pbXBvcnQge0Fzc2V0UHJvY2Vzc29yfSBmcm9tIFwiLi9hc3NldC1wcm9jZXNzb3JcIjtcclxuaW1wb3J0IHtBc3NldH0gZnJvbSBcIi4vZW50aXRpZXMvYXNzZXRcIjtcclxuXHJcbkBpbmplY3RhYmxlKClcclxuQHNjb3BlZChMaWZlY3ljbGUuQ29udGFpbmVyU2NvcGVkKVxyXG5leHBvcnQgY2xhc3MgQXNzZXRzIHtcclxuXHJcbiAgICByZWFkb25seSBidWNrZXQ6IEdyaWRGU0J1Y2tldDtcclxuICAgIHJlYWRvbmx5IGNvbGxlY3Rpb246IENvbGxlY3Rpb247XHJcblxyXG4gICAgY29uc3RydWN0b3IocmVhZG9ubHkgY29ubmVjdG9yOiBNb25nb0Nvbm5lY3RvciwgcmVhZG9ubHkgYXNzZXRQcm9jZXNzb3I6IEFzc2V0UHJvY2Vzc29yKSB7XHJcbiAgICAgICAgdGhpcy5idWNrZXQgPSBjb25uZWN0b3IuYnVja2V0O1xyXG4gICAgICAgIHRoaXMuY29sbGVjdGlvbiA9IGNvbm5lY3Rvci5kYXRhYmFzZT8uY29sbGVjdGlvbihcImFzc2V0cy5maWxlc1wiKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyB3cml0ZShzdHJlYW06IFJlYWRhYmxlLCBjb250ZW50VHlwZTogc3RyaW5nID0gbnVsbCwgbWV0YWRhdGE6IElBc3NldE1ldGEgPSBudWxsKTogUHJvbWlzZTxJQXNzZXQ+IHtcclxuICAgICAgICBjb25zdCB1cGxvYWRTdHJlYW0gPSBjb3B5U3RyZWFtKHN0cmVhbSk7XHJcbiAgICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgc3RyZWFtVG9CdWZmZXIoc3RyZWFtKTtcclxuICAgICAgICBsZXQgZmlsZVR5cGUgPSB7ZXh0OiBcIlwiLCBtaW1lOiBjb250ZW50VHlwZX0gYXMgSUZpbGVUeXBlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGZpbGVUeXBlID0gYXdhaXQgQXNzZXRQcm9jZXNzb3IuZmlsZVR5cGVGcm9tQnVmZmVyKGJ1ZmZlcik7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBpZiAoIWZpbGVUeXBlLm1pbWUpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IGBDYW4ndCBkZXRlcm1pbmUgbWltZSB0eXBlYDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgQ2FuJ3QgZGV0ZXJtaW5lIG1pbWUgdHlwZWAsIGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBtZXRhZGF0YSA9IG1ldGFkYXRhIHx8IHt9O1xyXG4gICAgICAgIHJldHVybiB0aGlzLnVwbG9hZCh1cGxvYWRTdHJlYW0sIGZpbGVUeXBlLCBtZXRhZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgd3JpdGVCdWZmZXIoYnVmZmVyOiBCdWZmZXIsIG1ldGFkYXRhOiBJQXNzZXRNZXRhID0gbnVsbCwgY29udGVudFR5cGU6IHN0cmluZyA9IG51bGwpOiBQcm9taXNlPElBc3NldD4ge1xyXG4gICAgICAgIGxldCBmaWxlVHlwZSA9IHtleHQ6IFwiXCIsIG1pbWU6IGNvbnRlbnRUeXBlfSBhcyBJRmlsZVR5cGU7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZmlsZVR5cGUgPSBhd2FpdCBBc3NldFByb2Nlc3Nvci5maWxlVHlwZUZyb21CdWZmZXIoYnVmZmVyKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGlmICghZmlsZVR5cGUubWltZSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgYENhbid0IGRldGVybWluZSBtaW1lIHR5cGVgO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBDYW4ndCBkZXRlcm1pbmUgbWltZSB0eXBlYCwgZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG1ldGFkYXRhID0gbWV0YWRhdGEgfHwge307XHJcbiAgICAgICAgYnVmZmVyID0gYXdhaXQgdGhpcy5hc3NldFByb2Nlc3Nvci5wcm9jZXNzKGJ1ZmZlciwgbWV0YWRhdGEsIGZpbGVUeXBlKTtcclxuICAgICAgICByZXR1cm4gdGhpcy51cGxvYWQoYnVmZmVyVG9TdHJlYW0oYnVmZmVyKSwgZmlsZVR5cGUsIG1ldGFkYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyB3cml0ZVVybCh1cmw6IHN0cmluZywgbWV0YWRhdGE6IElBc3NldE1ldGEgPSBudWxsKTogUHJvbWlzZTxJQXNzZXQ+IHtcclxuICAgICAgICBjb25zdCBidWZmZXIgPSAoYXdhaXQgYXhpb3MoeyB1cmwsIHJlc3BvbnNlVHlwZTogXCJhcnJheWJ1ZmZlclwiIH0pKS5kYXRhIGFzIEJ1ZmZlcjtcclxuICAgICAgICByZXR1cm4gdGhpcy53cml0ZUJ1ZmZlcihidWZmZXIsIG1ldGFkYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyByZWFkKGlkOiBzdHJpbmcpOiBQcm9taXNlPElBc3NldD4ge1xyXG4gICAgICAgIHJldHVybiAhaWQgPyBudWxsIDogdGhpcy5maW5kKHtfaWQ6IG5ldyBPYmplY3RJZChpZCl9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBmaW5kKHdoZXJlOiBGaWx0ZXJRdWVyeTxJQXNzZXQ+KTogUHJvbWlzZTxJQXNzZXQ+IHtcclxuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5jb2xsZWN0aW9uLmZpbmRPbmUod2hlcmUpO1xyXG4gICAgICAgIHJldHVybiAhZGF0YSA/IG51bGwgOiBuZXcgQXNzZXQoZGF0YS5faWQsIGRhdGEsIHRoaXMuY29sbGVjdGlvbiwgdGhpcy5idWNrZXQpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGZpbmRNYW55KHdoZXJlOiBGaWx0ZXJRdWVyeTxJQXNzZXQ+KTogUHJvbWlzZTxSZWFkb25seUFycmF5PElBc3NldD4+IHtcclxuICAgICAgICBjb25zdCBjdXJzb3IgPSB0aGlzLmNvbGxlY3Rpb24uZmluZCh3aGVyZSk7XHJcbiAgICAgICAgY29uc3QgaXRlbXMgPSBhd2FpdCBjdXJzb3IudG9BcnJheSgpIHx8IFtdO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogSUFzc2V0W10gPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpdGVtIG9mIGl0ZW1zKSB7XHJcbiAgICAgICAgICAgIGlmICghaXRlbSkgY29udGludWU7XHJcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ldyBBc3NldChpdGVtLl9pZCwgaXRlbSwgdGhpcy5jb2xsZWN0aW9uLCB0aGlzLmJ1Y2tldCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHVubGluayhpZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICBjb25zdCBhc3NldCA9IGF3YWl0IHRoaXMucmVhZChpZCk7XHJcbiAgICAgICAgaWYgKCFhc3NldCkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgcmV0dXJuIGFzc2V0LnVubGluaygpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBhc3luYyB1cGxvYWQoc3RyZWFtOiBSZWFkYWJsZSwgZmlsZVR5cGU6IElGaWxlVHlwZSwgbWV0YWRhdGE6IElBc3NldE1ldGEpOiBQcm9taXNlPElBc3NldD4ge1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gZmlsZVR5cGUubWltZS50cmltKCk7XHJcbiAgICAgICAgbWV0YWRhdGEgPSBPYmplY3QuYXNzaWduKHtcclxuICAgICAgICAgICAgZG93bmxvYWRDb3VudDogMCxcclxuICAgICAgICAgICAgZmlyc3REb3dubG9hZDogbnVsbCxcclxuICAgICAgICAgICAgbGFzdERvd25sb2FkOiBudWxsXHJcbiAgICAgICAgfSwgbWV0YWRhdGEgfHwge30pO1xyXG4gICAgICAgIG1ldGFkYXRhLmZpbGVuYW1lID0gbWV0YWRhdGEuZmlsZW5hbWUgfHwgbmV3IE9iamVjdElkKCkudG9IZXhTdHJpbmcoKTtcclxuICAgICAgICBtZXRhZGF0YS5leHRlbnNpb24gPSAoZmlsZVR5cGUuZXh0IHx8IFwiXCIpLnRyaW0oKTtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8SUFzc2V0PigoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCB1cGxvYWRlclN0cmVhbSA9IHRoaXMuYnVja2V0Lm9wZW5VcGxvYWRTdHJlYW0obWV0YWRhdGEuZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICBzdHJlYW0ucGlwZSh1cGxvYWRlclN0cmVhbSlcclxuICAgICAgICAgICAgICAgIC5vbihcImVycm9yXCIsIGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IubWVzc2FnZSB8fCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLm9uKFwiZmluaXNoXCIsICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhc3NldCA9IG5ldyBBc3NldCh1cGxvYWRlclN0cmVhbS5pZCBhcyBPYmplY3RJZCwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTogbWV0YWRhdGEuZmlsZW5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YVxyXG4gICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuY29sbGVjdGlvbiwgdGhpcy5idWNrZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGFzc2V0LnNhdmUoKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShhc3NldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IubWVzc2FnZSB8fCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9KSk7XHJcbiAgICB9XHJcbn1cclxuIl19
@@ -2,7 +2,7 @@ import { dirname, basename, join, resolve } from 'path';
2
2
  import { json } from 'body-parser';
3
3
  import { sign, verify } from 'jsonwebtoken';
4
4
  import { injectable, scoped, Lifecycle, injectAll, singleton, inject, isFactoryProvider, container } from 'tsyringe';
5
- import { createParamDecorator, BadRequestError, HttpError, getMetadataArgsStorage, Authorized, Post, UploadedFile, Body, Get, Param, QueryParams, QueryParam, Res, Controller, CurrentUser, Middleware, useContainer, useExpressServer } from 'routing-controllers';
5
+ import { createParamDecorator, BadRequestError, HttpError, getMetadataArgsStorage, Authorized, Post, UploadedFile, Body, Get, Param, QueryParams, Res, QueryParam, Controller, CurrentUser, Middleware, useContainer, useExpressServer } from 'routing-controllers';
6
6
  import { OnMessage, ConnectedSocket, MessageBody, SocketController, Middleware as Middleware$1, useContainer as useContainer$1, useSocketServer } from 'socket-controllers';
7
7
  import { routingControllersToSpec } from 'routing-controllers-openapi';
8
8
  import { defaultMetadataStorage } from 'class-transformer/storage';
@@ -18,7 +18,7 @@ import { getValue as getValue$1, setValue } from 'mongoose/lib/utils';
18
18
  import { PassThrough, Readable } from 'stream';
19
19
  import { ObjectId } from 'bson';
20
20
  import fontKit_ from 'fontkit';
21
- import { fromBuffer, fromStream } from 'file-type';
21
+ import { fromBuffer } from 'file-type';
22
22
  import sharp_ from 'sharp';
23
23
  import axios from 'axios';
24
24
  import { GridFSBucket } from 'mongodb';
@@ -774,18 +774,24 @@ const fontProps = [
774
774
  "xHeight", "numGlyphs", "characterSet", "availableFeatures"
775
775
  ];
776
776
  let AssetProcessor = AssetProcessor_1 = class AssetProcessor {
777
- static getMimeType(buffer, mimeType) {
777
+ static checkTextFileType(type) {
778
+ return type.mime.indexOf("text") >= 0 || type.mime.indexOf("xml") >= 0;
779
+ }
780
+ static fixTextFileType(type, buffer) {
781
+ const text = buffer.toString("utf8");
782
+ if (text.indexOf("<svg") >= 0) {
783
+ return { ext: "svg", mime: "image/svg+xml" };
784
+ }
785
+ return type;
786
+ }
787
+ static fileTypeFromBuffer(buffer) {
788
+ var _a;
778
789
  return __awaiter$u(this, void 0, void 0, function* () {
779
- try {
780
- mimeType = (yield fromBuffer(buffer)).mime;
790
+ const type = ((_a = yield fromBuffer(buffer)) !== null && _a !== void 0 ? _a : { ext: "txt", mime: "text/plain" });
791
+ if (AssetProcessor_1.checkTextFileType(type)) {
792
+ return AssetProcessor_1.fixTextFileType(type, buffer);
781
793
  }
782
- catch (e) {
783
- if (!mimeType) {
784
- throw `Can't determine mime type`;
785
- }
786
- console.log(`Can't determine mime type`, e);
787
- }
788
- return mimeType;
794
+ return type;
789
795
  });
790
796
  }
791
797
  static extractFontFormat(font) {
@@ -823,12 +829,12 @@ let AssetProcessor = AssetProcessor_1 = class AssetProcessor {
823
829
  metadata[prop] = font[prop];
824
830
  });
825
831
  }
826
- process(buffer, metadata, contentType) {
832
+ process(buffer, metadata, fileType) {
827
833
  return __awaiter$u(this, void 0, void 0, function* () {
828
- if (AssetProcessor_1.isImage(contentType)) {
834
+ if (AssetProcessor_1.isImage(fileType.mime)) {
829
835
  buffer = yield AssetProcessor_1.copyImageMeta(buffer, metadata);
830
836
  }
831
- if (AssetProcessor_1.isFont(contentType)) {
837
+ if (AssetProcessor_1.isFont(fileType.mime)) {
832
838
  AssetProcessor_1.copyFontMeta(buffer, metadata);
833
839
  }
834
840
  return buffer;
@@ -1171,56 +1177,37 @@ let Assets = class Assets {
1171
1177
  }
1172
1178
  write(stream, contentType = null, metadata = null) {
1173
1179
  return __awaiter$q(this, void 0, void 0, function* () {
1174
- let extension = null;
1175
- const fileTypeStream = copyStream(stream);
1176
1180
  const uploadStream = copyStream(stream);
1181
+ const buffer = yield streamToBuffer(stream);
1182
+ let fileType = { ext: "", mime: contentType };
1177
1183
  try {
1178
- const fileType = yield fromStream(fileTypeStream);
1179
- contentType = fileType.mime;
1180
- extension = fileType.ext;
1184
+ fileType = yield AssetProcessor.fileTypeFromBuffer(buffer);
1181
1185
  }
1182
1186
  catch (e) {
1183
- if (!contentType) {
1184
- throw `Can't determine content type`;
1187
+ if (!fileType.mime) {
1188
+ throw `Can't determine mime type`;
1185
1189
  }
1186
- console.log(`Can't determine content type`, e);
1190
+ console.log(`Can't determine mime type`, e);
1187
1191
  }
1188
- contentType = contentType.trim();
1189
- extension = (extension || "").trim();
1190
- metadata = Object.assign({
1191
- extension,
1192
- downloadCount: 0,
1193
- firstDownload: null,
1194
- lastDownload: null
1195
- }, metadata || {});
1196
- metadata.filename = metadata.filename || new ObjectId().toHexString();
1197
- return new Promise(((resolve, reject) => {
1198
- const uploaderStream = this.bucket.openUploadStream(metadata.filename);
1199
- uploadStream.pipe(uploaderStream)
1200
- .on("error", error => {
1201
- reject(error.message || error);
1202
- })
1203
- .on("finish", () => {
1204
- const asset = new Asset(uploaderStream.id, {
1205
- filename: metadata.filename,
1206
- contentType,
1207
- metadata
1208
- }, this.collection, this.bucket);
1209
- asset.save().then(() => {
1210
- resolve(asset);
1211
- }, error => {
1212
- reject(error.message || error);
1213
- });
1214
- });
1215
- }));
1192
+ metadata = metadata || {};
1193
+ return this.upload(uploadStream, fileType, metadata);
1216
1194
  });
1217
1195
  }
1218
1196
  writeBuffer(buffer, metadata = null, contentType = null) {
1219
1197
  return __awaiter$q(this, void 0, void 0, function* () {
1220
- contentType = yield AssetProcessor.getMimeType(buffer, contentType);
1198
+ let fileType = { ext: "", mime: contentType };
1199
+ try {
1200
+ fileType = yield AssetProcessor.fileTypeFromBuffer(buffer);
1201
+ }
1202
+ catch (e) {
1203
+ if (!fileType.mime) {
1204
+ throw `Can't determine mime type`;
1205
+ }
1206
+ console.log(`Can't determine mime type`, e);
1207
+ }
1221
1208
  metadata = metadata || {};
1222
- buffer = yield this.assetProcessor.process(buffer, metadata, contentType);
1223
- return this.write(bufferToStream(buffer), contentType, metadata);
1209
+ buffer = yield this.assetProcessor.process(buffer, metadata, fileType);
1210
+ return this.upload(bufferToStream(buffer), fileType, metadata);
1224
1211
  });
1225
1212
  }
1226
1213
  writeUrl(url, metadata = null) {
@@ -1261,6 +1248,37 @@ let Assets = class Assets {
1261
1248
  return asset.unlink();
1262
1249
  });
1263
1250
  }
1251
+ upload(stream, fileType, metadata) {
1252
+ return __awaiter$q(this, void 0, void 0, function* () {
1253
+ const contentType = fileType.mime.trim();
1254
+ metadata = Object.assign({
1255
+ downloadCount: 0,
1256
+ firstDownload: null,
1257
+ lastDownload: null
1258
+ }, metadata || {});
1259
+ metadata.filename = metadata.filename || new ObjectId().toHexString();
1260
+ metadata.extension = (fileType.ext || "").trim();
1261
+ return new Promise(((resolve, reject) => {
1262
+ const uploaderStream = this.bucket.openUploadStream(metadata.filename);
1263
+ stream.pipe(uploaderStream)
1264
+ .on("error", error => {
1265
+ reject(error.message || error);
1266
+ })
1267
+ .on("finish", () => {
1268
+ const asset = new Asset(uploaderStream.id, {
1269
+ filename: metadata.filename,
1270
+ contentType,
1271
+ metadata
1272
+ }, this.collection, this.bucket);
1273
+ asset.save().then(() => {
1274
+ resolve(asset);
1275
+ }, error => {
1276
+ reject(error.message || error);
1277
+ });
1278
+ });
1279
+ }));
1280
+ });
1281
+ }
1264
1282
  };
1265
1283
  Assets = __decorate$t([
1266
1284
  injectable(),
@@ -2860,40 +2878,42 @@ let AssetsController = class AssetsController {
2860
2878
  }
2861
2879
  });
2862
2880
  }
2863
- getImageRotation(id, params, rotation = 0) {
2864
- var _a;
2881
+ getImageRotation(id, params, res, rotation = 0) {
2865
2882
  return __awaiter$7(this, void 0, void 0, function* () {
2866
- const asset = yield this.assetResolver.resolve(id, params.lazy);
2867
- if (!asset) {
2868
- throw new HttpError(404, `Image with id: '${id}' not found.`);
2869
- }
2870
- if ((_a = asset.metadata) === null || _a === void 0 ? void 0 : _a.classified) {
2871
- throw new HttpError(403, `Image is classified, and can be only downloaded from a custom url.`);
2872
- }
2883
+ const asset = yield this.getAsset("Image", id, params.lazy, res);
2873
2884
  params.rotation = params.rotation || rotation;
2874
2885
  return asset.downloadImage(params);
2875
2886
  });
2876
2887
  }
2877
- getImage(id, params) {
2888
+ getImage(id, params, res) {
2878
2889
  return __awaiter$7(this, void 0, void 0, function* () {
2879
- return this.getImageRotation(id, params);
2890
+ return this.getImageRotation(id, params, res);
2880
2891
  });
2881
2892
  }
2882
2893
  getFile(id, lazy, res) {
2894
+ return __awaiter$7(this, void 0, void 0, function* () {
2895
+ const asset = yield this.getAsset("Asset", id, lazy, res);
2896
+ return asset.download();
2897
+ });
2898
+ }
2899
+ getAsset(type, id, lazy, res) {
2883
2900
  var _a, _b;
2884
2901
  return __awaiter$7(this, void 0, void 0, function* () {
2885
2902
  const asset = yield this.assetResolver.resolve(id, lazy);
2886
2903
  if (!asset) {
2887
- throw new HttpError(404, `File with id: '${id}' not found.`);
2904
+ throw new HttpError(404, `${type} with id: '${id}' not found.`);
2888
2905
  }
2889
2906
  if ((_a = asset.metadata) === null || _a === void 0 ? void 0 : _a.classified) {
2890
- throw new HttpError(403, `Asset is classified, and can be only downloaded from a custom url.`);
2907
+ throw new HttpError(403, `${type} is classified, and can be only downloaded from a custom url.`);
2891
2908
  }
2892
2909
  const ext = (_b = asset.metadata) === null || _b === void 0 ? void 0 : _b.extension;
2893
2910
  if (ext) {
2894
2911
  res.header("content-disposition", `inline; filename=${asset.filename}.${ext}`);
2895
2912
  }
2896
- return asset.download();
2913
+ if (asset.contentType) {
2914
+ res.header("content-type", asset.contentType);
2915
+ }
2916
+ return asset;
2897
2917
  });
2898
2918
  }
2899
2919
  };
@@ -2915,16 +2935,16 @@ __decorate$a([
2915
2935
  ], AssetsController.prototype, "uploadUrl", null);
2916
2936
  __decorate$a([
2917
2937
  Get("/image/:id/:rotation"),
2918
- __param$5(0, Param("id")), __param$5(1, QueryParams()), __param$5(2, Param("rotation")),
2938
+ __param$5(0, Param("id")), __param$5(1, QueryParams()), __param$5(2, Res()), __param$5(3, Param("rotation")),
2919
2939
  __metadata$7("design:type", Function),
2920
- __metadata$7("design:paramtypes", [String, Object, Number]),
2940
+ __metadata$7("design:paramtypes", [String, Object, Object, Number]),
2921
2941
  __metadata$7("design:returntype", Promise)
2922
2942
  ], AssetsController.prototype, "getImageRotation", null);
2923
2943
  __decorate$a([
2924
2944
  Get("/image/:id"),
2925
- __param$5(0, Param("id")), __param$5(1, QueryParams()),
2945
+ __param$5(0, Param("id")), __param$5(1, QueryParams()), __param$5(2, Res()),
2926
2946
  __metadata$7("design:type", Function),
2927
- __metadata$7("design:paramtypes", [String, Object]),
2947
+ __metadata$7("design:paramtypes", [String, Object, Object]),
2928
2948
  __metadata$7("design:returntype", Promise)
2929
2949
  ], AssetsController.prototype, "getImage", null);
2930
2950
  __decorate$a([