@nger/fk-upload 1.0.7 → 1.0.10

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.
@@ -8,286 +8,43 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
8
8
  var __metadata = (this && this.__metadata) || function (k, v) {
9
9
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
10
  };
11
- var __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
11
  Object.defineProperty(exports, "__esModule", { value: true });
15
12
  exports.UploadService = void 0;
16
- const path_1 = require("path");
17
13
  const entities_1 = require("../entities");
18
- const cids_1 = __importDefault(require("cids"));
19
- const multihashing_async_1 = __importDefault(require("multihashing-async"));
20
14
  const typeorm_1 = require("@nger/typeorm");
21
- const rxjs_1 = require("rxjs");
22
- const request_1 = require("request");
23
- const fs_1 = require("fs");
24
- const md5_file_1 = __importDefault(require("md5-file"));
25
15
  const core_1 = require("@nger/core");
26
- const axios_1 = __importDefault(require("axios"));
27
- const form_data_1 = __importDefault(require("form-data"));
16
+ const ws_1 = require("@nger/ws");
17
+ const task_service_1 = require("./task.service");
28
18
  let UploadService = class UploadService {
29
19
  db;
30
- constructor(db) {
31
- this.db = db;
32
- }
33
- async createDownLoadTask(url, fkLoginId) {
34
- const observable = await this.createObservable(url);
35
- return observable.listen.pipe((0, rxjs_1.throttleTime)(1000), (0, rxjs_1.switchMap)(async (res) => {
36
- const exist = await this.db.manager.findOne(entities_1.FkDownloadTaskEntity, { where: { filename: observable.filename } });
37
- if (exist) {
38
- const size = res.size;
39
- const total = res.totalSize;
40
- const num = Math.floor((size / total) * 100);
41
- await this.db.manager.update(entities_1.FkDownloadTaskEntity, exist.filename, { size: num });
42
- }
43
- else {
44
- await this.db.manager.save(entities_1.FkDownloadTaskEntity, res);
45
- }
46
- return res;
47
- })).subscribe({
48
- next: () => { },
49
- complete: async () => {
50
- const exist = await this.db.manager.findOne(entities_1.FkDownloadTaskEntity, { where: { filename: observable.filename } });
51
- const md5 = await (0, md5_file_1.default)(exist.path);
52
- await this.db.manager.update(entities_1.FkDownloadTaskEntity, observable.filename, { status: 1, size: 100, fileMd5: md5, loginId: fkLoginId });
53
- // upload
54
- return await this.createUplaodTask(exist.filename);
55
- }
56
- });
57
- }
58
- getUploadUrl(token, forceDirect = true) {
59
- if (forceDirect) {
60
- return `https://${token.url}/${token.visitType}/${token.app}/upload?cmd=${token.cmd}&token=${token.token}`;
61
- }
62
- else {
63
- return `https://${token.url}/${token.visitType}/${token.app}/advance?cmd=${token.cmd}&token=${token.token}`;
64
- }
20
+ injector;
21
+ get ws() {
22
+ return this.injector.get(ws_1.WsService);
65
23
  }
66
- getUploadInfourl(token) {
67
- return `https://${token.url}/${token.visitType}/${token.app}/advance/info?cmd=${token.cmd}&token=${token.token}`;
24
+ get task() {
25
+ return this.injector.get(task_service_1.TaskService);
68
26
  }
69
- encodeURIComponent(data) {
70
- return Object.keys(data).map(key => {
71
- const value = Reflect.get(data, key);
72
- return `${key}=${encodeURIComponent(value)}`;
73
- }).join('&');
27
+ constructor(db, injector) {
28
+ this.db = db;
29
+ this.injector = injector;
74
30
  }
75
- async createUplaodTask(filename) {
76
- //
31
+ async continueTask(filename) {
77
32
  const task = await this.db.manager.findOne(entities_1.FkDownloadTaskEntity, { where: { filename } });
78
33
  if (task) {
79
34
  if (task.status === 0) {
80
- return {
81
- msg: 'downloading'
82
- };
83
- }
84
- if (task.status === 2) {
85
- return {
86
- msg: 'uploaded'
87
- };
35
+ return this.task.createDownLoadTask(task.url, task.loginId, 0);
88
36
  }
89
- const loginEntity = await this.db.manager.findOne(entities_1.FkLoginEntity, { where: { fkLoginId: task.loginId } });
90
- const cookies = await this.db.manager.find(entities_1.FkLoginCookieEntity, { where: { fkLoginId: task.loginId } });
91
- const cookie = cookies.map(cookie => `${cookie.key}=${cookie.value}`).join(';');
92
- // 00 take token
93
- const url = `https://i.vip.webportal.top/`;
94
- const iVipWebPortal = await axios_1.default.get(url, {
95
- headers: {
96
- Cookie: cookie
97
- }
98
- }).then(res => res.data);
99
- const items = iVipWebPortal.match(/<meta id='_TOKEN' value='(.*?)'\/>/);
100
- let token = ``;
101
- if (items && items.length === 2) {
102
- token = items[1];
37
+ else if (task.status === 1) {
38
+ return this.task.startUploadTask(task.filename);
103
39
  }
104
- if (token.length > 0) {
105
- // 01
106
- const url = `https://smr00.vip.webportal.top/cn/api/manage/advanceUpload/genAccessKey?_v=1651232099799&_TOKEN=${token}`;
107
- const accessKey = await axios_1.default.get(url).then(res => res.data);
108
- if (accessKey.success) {
109
- const accessTokenString = decode(accessKey.accessKey);
110
- if (accessTokenString) {
111
- const accessToken = JSON.parse(accessTokenString);
112
- const uploadInfoUrl = this.getUploadInfourl(accessToken);
113
- const bssInfo = {
114
- fromSite: true, siteId: 0, groupId: 0, fileSizeLimit: 1024
115
- };
116
- const info = await axios_1.default.post(uploadInfoUrl, this.encodeURIComponent({
117
- fileMd5: task.fileMd5,
118
- fileSize: task.totalSize,
119
- isFreeVer: false,
120
- aid: loginEntity.aid,
121
- folderId: loginEntity.uploadGroupId,
122
- bssInfo: JSON.stringify(bssInfo),
123
- fileName: task.filename
124
- }), { headers: { cookie: cookie } }).then(res => res.data);
125
- if (info.code === 200) {
126
- const data = info.data;
127
- const { delayTime, splitSize, uploadedSize } = data;
128
- const uploadUrl = this.getUploadUrl(accessToken, false);
129
- const totalChunks = Math.ceil((task.totalSize - uploadedSize) / splitSize);
130
- let start = uploadedSize;
131
- let index = Math.ceil(uploadedSize / splitSize);
132
- let complete = false;
133
- do {
134
- if (index >= totalChunks - 1) {
135
- complete = true;
136
- }
137
- const fileStream = (0, fs_1.createReadStream)(task.path, { start: start, end: start + splitSize });
138
- const formdata = new form_data_1.default();
139
- formdata.append('ctrl', fileStream);
140
- formdata.append('isFreeVer', 'false');
141
- formdata.append('aid', `${loginEntity.aid || 0}`);
142
- formdata.append('folderId', `${loginEntity.uploadGroupId || 0}`);
143
- formdata.append('fileName', task.filename);
144
- formdata.append(`totalSize`, `${task.totalSize}`);
145
- formdata.append(`fileMd5`, task.fileMd5);
146
- formdata.append('index', `${index}`);
147
- formdata.append('chunkSize', `${splitSize}`);
148
- formdata.append('totalChunks', `${totalChunks}`);
149
- formdata.append(`complete`, `${complete}`);
150
- formdata.append('bssInfo', JSON.stringify(bssInfo));
151
- const headers = formdata.getHeaders();
152
- const uploadResult = await axios_1.default.post(uploadUrl, formdata, {
153
- headers: {
154
- ...headers,
155
- Cookie: cookie
156
- }
157
- }).then(res => {
158
- const data = res.data;
159
- return data;
160
- });
161
- if (uploadResult.code === 200) {
162
- const data = uploadResult.data;
163
- if (data) {
164
- const downUrl = data.downUrl;
165
- if (downUrl) {
166
- await this.db.manager.update(entities_1.FkDownloadTaskEntity, task.filename, {
167
- status: 2,
168
- uploadUrl: `https://` + downUrl,
169
- uploadSize: 100
170
- });
171
- }
172
- else {
173
- await this.db.manager.update(entities_1.FkDownloadTaskEntity, task.filename, {
174
- uploadSize: Math.floor(((index + 1) / totalChunks) * 100)
175
- });
176
- }
177
- }
178
- index = index + 1;
179
- start = start + splitSize;
180
- }
181
- } while (!complete);
182
- }
183
- }
184
- }
185
- }
186
- }
187
- }
188
- async createObservable(url) {
189
- const hash = await (0, multihashing_async_1.default)(Buffer.from(url), 'sha1', 16);
190
- const cid = new cids_1.default(1, 'raw', hash, 'base64');
191
- // const _url = new URL(url);
192
- // const pathname = _url.pathname;
193
- // const ext = extname(pathname)
194
- const filename = cid.toString('base64');
195
- let item = await this.db.manager.findOne(entities_1.FkDownloadTaskEntity, { where: { filename } });
196
- if (item) {
197
- let task = item;
198
- if (task.status) {
199
- return {
200
- listen: (0, rxjs_1.of)(task),
201
- filename
202
- };
40
+ else {
41
+ console.log(task);
203
42
  }
204
- const observable = new rxjs_1.Observable((sub) => {
205
- // go on
206
- const writeStream = (0, fs_1.createWriteStream)(task.path, { start: task.size });
207
- const req = (0, request_1.get)(url, {
208
- headers: {
209
- 'Content-Type': 'application/octet-stream'
210
- }
211
- });
212
- let length = 0;
213
- req.on('data', (buf) => {
214
- length += buf.length;
215
- if (length >= task.size) {
216
- task.size = length;
217
- writeStream.write(buf, (err) => {
218
- if (err)
219
- sub.error(err);
220
- });
221
- sub.next(task);
222
- }
223
- });
224
- req.on('end', () => {
225
- sub.complete();
226
- writeStream.end();
227
- });
228
- });
229
- return { listen: observable, filename };
230
43
  }
231
- ;
232
- const observable = new rxjs_1.Observable((sub) => {
233
- let task = new entities_1.FkDownloadTaskEntity();
234
- task.url = url;
235
- const req = (0, request_1.get)(url);
236
- const path = (0, path_1.join)(__dirname, 'dist', encodeURIComponent(filename));
237
- const writeStream = (0, fs_1.createWriteStream)(path);
238
- task.path = path;
239
- let total = 0;
240
- let length = 0;
241
- task.filename = filename;
242
- task.uploadSize = 0;
243
- req.on('data', (buf) => {
244
- length += buf.length;
245
- task.size = length;
246
- writeStream.write(buf, (err) => {
247
- if (err)
248
- sub.error(err);
249
- });
250
- sub.next(task);
251
- });
252
- req.on('end', () => {
253
- sub.complete();
254
- writeStream.end();
255
- });
256
- req.on('response', (resp) => {
257
- const headers = resp.headers;
258
- total = Number(Reflect.get(headers, 'content-length'));
259
- task.totalSize = total;
260
- task.size = 0;
261
- task.status = 0;
262
- sub.next(task);
263
- });
264
- });
265
- return { listen: observable, filename };
266
44
  }
267
45
  };
268
46
  UploadService = __decorate([
269
47
  (0, core_1.Injectable)(),
270
- __metadata("design:paramtypes", [typeorm_1.Db])
48
+ __metadata("design:paramtypes", [typeorm_1.Db, core_1.Injector])
271
49
  ], UploadService);
272
50
  exports.UploadService = UploadService;
273
- function decode(base64Str) {
274
- if (!base64Str)
275
- return;
276
- const t = base64Str.replace(/_/g, "/").replace(/-/g, "+");
277
- const f = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
278
- let l = 0;
279
- let p = 0;
280
- let h = [];
281
- do {
282
- const o = f.indexOf(t.charAt(l++));
283
- const u = f.indexOf(t.charAt(l++));
284
- const a = f.indexOf(t.charAt(l++));
285
- const c = f.indexOf(t.charAt(l++));
286
- const s = o << 18 | u << 12 | a << 6 | c;
287
- const e = s >> 16 & 255;
288
- const r = s >> 8 & 255;
289
- const n = 255 & s;
290
- h[p++] = 64 === a ? String.fromCharCode(e) : 64 === c ? String.fromCharCode(e, r) : String.fromCharCode(e, r, n);
291
- } while (l < t.length);
292
- return h.join('');
293
- }
package/docs.md ADDED
@@ -0,0 +1,34 @@
1
+ ## host
2
+
3
+ ### ssh
4
+
5
+ ```ts
6
+ ssh root@111.229.255.176
7
+ Yang1989.
8
+ ```
9
+
10
+ ### manage url
11
+
12
+ ```
13
+ http://111.229.255.176:8081/@nger/fk-upload/help
14
+ ```
15
+
16
+ ### redis
17
+
18
+ ```
19
+ REDIS_HOST=111.229.255.176
20
+ REDIS_PORT=6379
21
+ REDIS_PASS=123qwe
22
+ ```
23
+
24
+ ### rabbit mq
25
+
26
+ http://111.229.255.176:15672/#/
27
+
28
+ ```
29
+ RABBITMQ_HOST=111.229.255.176
30
+ RABBITMQ_PORT=5672
31
+ RABBITMQ_USERNAME=imeepos
32
+ RABBITMQ_PASSWORD=123qwe
33
+ ```
34
+
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nger/fk-upload",
3
- "version": "1.0.7",
3
+ "version": "1.0.10",
4
4
  "description": "",
5
5
  "main": "dist/core.js",
6
6
  "types": "dist/core.d.ts",
@@ -14,7 +14,11 @@
14
14
  "@nger/api": "^1.0.0",
15
15
  "@nger/http": "^4.0.0",
16
16
  "@nger/typeorm": "^1.0.0",
17
+ "@nger/redis": "^1.0.0",
18
+ "@nger/rabbitmq": "^1.0.0",
17
19
  "@nger/ws": "^1.0.0",
20
+ "@nger/schedule": "^1.0.0",
21
+ "@nger/w7": "^1.0.0",
18
22
  "@types/download": "^8.0.1",
19
23
  "@types/request": "^2.48.8",
20
24
  "axios": "^0.26.1",
package/pnpm-lock.yaml CHANGED
@@ -4,7 +4,11 @@ specifiers:
4
4
  '@nger/api': workspace:^1.0.0
5
5
  '@nger/core': workspace:^1.0.0
6
6
  '@nger/http': workspace:^4.0.0
7
+ '@nger/rabbitmq': workspace:^1.0.0
8
+ '@nger/redis': workspace:^1.0.0
9
+ '@nger/schedule': workspace:^1.0.0
7
10
  '@nger/typeorm': workspace:^1.0.0
11
+ '@nger/w7': workspace:^1.0.0
8
12
  '@nger/ws': workspace:^1.0.0
9
13
  '@types/download': ^8.0.1
10
14
  '@types/request': ^2.48.8
@@ -21,7 +25,11 @@ dependencies:
21
25
  '@nger/api': link:../api
22
26
  '@nger/core': link:../core
23
27
  '@nger/http': link:../http
28
+ '@nger/rabbitmq': link:../rabbitmq
29
+ '@nger/redis': link:../redis
30
+ '@nger/schedule': link:../schedule
24
31
  '@nger/typeorm': link:../typeorm
32
+ '@nger/w7': link:../w7
25
33
  '@nger/ws': link:../ws
26
34
  '@types/download': 8.0.1
27
35
  '@types/request': 2.48.8