Skip to content

Commit a01ef7e

Browse files
imageViewer - tiny fix to read file faster
1 parent edbf3c6 commit a01ef7e

File tree

2 files changed

+61
-22
lines changed

2 files changed

+61
-22
lines changed

src/util/imageViewer.js

Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import PhotoSwipeLightbox from 'photoswipe';
55
import ExifReader from 'exifreader';
66
import { fetchFn } from '@src/client/initMatrix';
77

8-
import { getFileContentType } from './fileMime';
98
import { btModal, toast } from './tools';
9+
import blobUrlManager from './libs/blobUrlManager';
1010

1111
export default function imageViewer(data) {
1212
return new Promise(async (resolve, reject) => {
@@ -16,24 +16,11 @@ export default function imageViewer(data) {
1616
if (img) {
1717
// Get Mime
1818
let filename = data.name;
19-
let tinyImgData = null;
20-
if (data.readMime) {
21-
try {
22-
// Read Mime
23-
tinyImgData = await getFileContentType({ target: img }, data.url);
24-
25-
// Insert Mime
26-
if (
27-
Array.isArray(tinyImgData.type) &&
28-
tinyImgData.type.length > 1 &&
29-
typeof tinyImgData.type[1] === 'string'
30-
) {
31-
filename += `.${tinyImgData.type[1]}`;
32-
}
33-
} catch (err) {
34-
console.error(err);
35-
tinyImgData = null;
36-
}
19+
20+
// Insert Mime
21+
const mime = blobUrlManager.getMime(data.imgQuery.attr('src'));
22+
if (Array.isArray(mime) && mime.length > 1 && typeof mime[1] === 'string') {
23+
filename += `.${mime[1]}`;
3724
}
3825

3926
// Prepare Data
@@ -44,9 +31,10 @@ export default function imageViewer(data) {
4431
}
4532

4633
// Get Data
47-
else if (tinyImgData) {
48-
imgData.height = tinyImgData.height;
49-
imgData.width = tinyImgData.width;
34+
else {
35+
const { height, width } = await blobUrlManager.forceGetImgSize(data.imgQuery.attr('src'));
36+
if (typeof height === 'number') imgData.height = height;
37+
if (typeof width === 'number') imgData.width = width;
5038
}
5139

5240
// Create Lightbox

src/util/libs/blobUrlManager.js

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import { EventEmitter } from 'events';
22
import { generateApiKey } from 'generate-api-key';
33
import md5 from 'md5';
44

5+
import { objType } from 'for-promise/utils/lib.mjs';
6+
57
class BlobUrlManager extends EventEmitter {
68
// Constructor
79
constructor() {
@@ -13,6 +15,8 @@ class BlobUrlManager extends EventEmitter {
1315
this.queue = {};
1416
this.ids = {};
1517
this.mime = {};
18+
this.size = {};
19+
this.imgSize = {};
1620
this.idsReverse = {};
1721
}
1822

@@ -46,6 +50,45 @@ class BlobUrlManager extends EventEmitter {
4650
return null;
4751
}
4852

53+
getImgSize(blobUrl) {
54+
if (objType(this.imgSize[blobUrl], 'object')) return this.imgSize[blobUrl];
55+
return null;
56+
}
57+
58+
async forceGetImgSize(blobUrl) {
59+
const file = this.getImgSize(blobUrl);
60+
if (objType(file, 'object')) {
61+
if (typeof file.height === 'number' && typeof file.width === 'number') return file;
62+
else return this.fetchImgSize(blobUrl);
63+
}
64+
return null;
65+
}
66+
67+
fetchImgSize(blobUrl) {
68+
if (objType(this.imgSize[blobUrl], 'object')) {
69+
const tinyThis = this;
70+
return new Promise((resolve, reject) => {
71+
const img = new Image();
72+
img.onload = () => {
73+
if (objType(tinyThis.imgSize[blobUrl], 'object')) {
74+
tinyThis.imgSize[blobUrl] = { height: img.height, width: img.width };
75+
resolve(tinyThis.imgSize[blobUrl]);
76+
} else {
77+
reject(new Error('Invalid file url!'));
78+
}
79+
};
80+
img.onerror = reject;
81+
img.src = blobUrl;
82+
});
83+
}
84+
return null;
85+
}
86+
87+
getSize(blobUrl) {
88+
if (typeof this.size[blobUrl] === 'number') return this.size[blobUrl];
89+
return null;
90+
}
91+
4992
async insert(file, ops = {}) {
5093
// Insert using Hash
5194
const tinyKey = generateApiKey();
@@ -86,6 +129,12 @@ class BlobUrlManager extends EventEmitter {
86129
// Mime
87130
this.mime[tinyUrl] = typeof file.type === 'string' ? file.type.split('/') : [];
88131

132+
// Size
133+
this.size[tinyUrl] = file.size;
134+
135+
// Image Size
136+
this.imgSize[tinyUrl] = { height: file.height, width: file.width };
137+
89138
// Hash
90139
this.urls[tinyUrl] = hash;
91140

@@ -159,6 +208,8 @@ class BlobUrlManager extends EventEmitter {
159208
}
160209

161210
delete this.mime[tinyUrl];
211+
delete this.size[tinyUrl];
212+
delete this.imgSize[tinyUrl];
162213
delete this.hashes[hash];
163214
delete this.timeout[hash];
164215
delete this.urls[tinyUrl];

0 commit comments

Comments
 (0)