@abtnode/util 1.7.23 → 1.7.24

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.
Files changed (2) hide show
  1. package/lib/user-avatar.js +69 -0
  2. package/package.json +3 -2
@@ -0,0 +1,69 @@
1
+ const path = require('path');
2
+ const fs = require('fs-extra');
3
+
4
+ const { USER_AVATAR_DIR, USER_AVATAR_URL_PREFIX } = require('@abtnode/constant');
5
+
6
+ const md5 = require('./md5');
7
+
8
+ const getAvatarFile = (dataDir, fileName) =>
9
+ path.join(dataDir, USER_AVATAR_DIR, fileName.substring(0, 2), fileName.substring(2));
10
+
11
+ /**
12
+ * save base64 avatar data to storage and return url
13
+ */
14
+ const extractUserAvatar = async (avatar, { dataDir } = {}) => {
15
+ if (!avatar) {
16
+ return avatar;
17
+ }
18
+
19
+ const regex = /^data:image\/(\w+);base64,/;
20
+ const match = regex.exec(avatar);
21
+
22
+ if (!match) {
23
+ return avatar;
24
+ }
25
+
26
+ const fileData = Buffer.from(avatar.replace(regex, ''), 'base64');
27
+ const fileName = `${md5(fileData)}.${match[1]}`;
28
+
29
+ const avatarFile = getAvatarFile(dataDir, fileName);
30
+ await fs.outputFile(avatarFile, fileData);
31
+
32
+ const url = `${USER_AVATAR_URL_PREFIX}/${fileName}`;
33
+
34
+ return url;
35
+ };
36
+
37
+ /**
38
+ * generate base64 avatar data to from file by url
39
+ */
40
+ const parseUserAvatar = async (avatar, { dataDir } = {}) => {
41
+ if (!avatar) {
42
+ return avatar;
43
+ }
44
+
45
+ if (!avatar.startsWith(USER_AVATAR_URL_PREFIX)) {
46
+ return avatar;
47
+ }
48
+
49
+ const fileName = avatar.split('/').slice(-1)[0];
50
+
51
+ const avatarFile = getAvatarFile(dataDir, fileName);
52
+
53
+ if (!fs.existsSync(avatarFile)) {
54
+ return avatar;
55
+ }
56
+
57
+ const buf = await fs.promises.readFile(avatarFile);
58
+ const extname = path.extname(fileName).substring(1);
59
+
60
+ const data = `data:image/${extname};base64,${buf.toString('base64')}`;
61
+
62
+ return data;
63
+ };
64
+
65
+ module.exports = {
66
+ extractUserAvatar,
67
+ parseUserAvatar,
68
+ getAvatarFile,
69
+ };
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "1.7.23",
6
+ "version": "1.7.24",
7
7
  "description": "ArcBlock's JavaScript utility",
8
8
  "main": "lib/index.js",
9
9
  "files": [
@@ -18,6 +18,7 @@
18
18
  "author": "polunzh <polunzh@gmail.com> (http://github.com/polunzh)",
19
19
  "license": "MIT",
20
20
  "dependencies": {
21
+ "@abtnode/constant": "1.7.24",
21
22
  "@ocap/mcrypto": "^1.16.15",
22
23
  "@ocap/util": "^1.16.15",
23
24
  "@ocap/wallet": "^1.16.15",
@@ -54,5 +55,5 @@
54
55
  "fs-extra": "^10.0.1",
55
56
  "jest": "^27.4.5"
56
57
  },
57
- "gitHead": "aa13838b7597bce11851d0b902575f861aa1ab34"
58
+ "gitHead": "904178e4dd0cd14c2a0a8b9131708c7ec68351e1"
58
59
  }