fmode-ng 0.0.41 → 0.0.43
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/LICENSE.md +8 -0
- package/esm2022/fmode-ng.mjs +10 -5
- package/esm2022/lib/aigc/agent/agent.prompt.mjs +10 -122
- package/esm2022/lib/aigc/agent/index.mjs +10 -2
- package/esm2022/lib/aigc/avatar/avatar.module.mjs +10 -45
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/avatar.role.mjs +10 -2
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/comp-avatar-particle.component.mjs +10 -315
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/index.mjs +10 -3
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/role-points.class.mjs +10 -57
- package/esm2022/lib/aigc/avatar/comp-avatar-role-image/comp-avatar-role-image.component.mjs +10 -97
- package/esm2022/lib/aigc/avatar/comp-avatar-role-video/comp-avatar-role-video.component.mjs +10 -104
- package/esm2022/lib/aigc/avatar/comp-avatar-talk/comp-avatar-talk.component.mjs +10 -111
- package/esm2022/lib/aigc/avatar/index.mjs +10 -8
- package/esm2022/lib/aigc/avatar/interface-avatar-role.mjs +10 -2
- package/esm2022/lib/aigc/avatar/modal-chat-voice-input/modal-chat-voice-input.component.mjs +8 -166
- package/esm2022/lib/aigc/chat/chat-header-area/comp-header-area.component.mjs +10 -36
- package/esm2022/lib/aigc/chat/chat-header-area/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/chat-list/chat-list.component.mjs +8 -141
- package/esm2022/lib/aigc/chat/chat-list/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/chat-message-area/comp-message-area.component.mjs +10 -40
- package/esm2022/lib/aigc/chat/chat-message-area/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/chat-message-card/comp-message-card.component.mjs +10 -92
- package/esm2022/lib/aigc/chat/chat-message-card/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/chat-modal-input/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component.mjs +8 -207
- package/esm2022/lib/aigc/chat/chat-modal-input/modal-input.component.mjs +10 -236
- package/esm2022/lib/aigc/chat/chat-panel/chat-panel.component.mjs +10 -137
- package/esm2022/lib/aigc/chat/comp-role-prompt/comp-role-prompt.component.mjs +10 -69
- package/esm2022/lib/aigc/chat/comp-role-prompt/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/index.mjs +10 -8
- package/esm2022/lib/aigc/comp-markdown-preview/clipboard.service.mjs +10 -82
- package/esm2022/lib/aigc/comp-markdown-preview/markdown-parse.mjs +8 -269
- package/esm2022/lib/aigc/comp-markdown-preview/markdown-preview.component.mjs +10 -51
- package/esm2022/lib/aigc/comp-markdown-preview/markdown-preview.module.mjs +10 -24
- package/esm2022/lib/aigc/comp-markdown-preview/plugins/md-mathjax/index.mjs +10 -94
- package/esm2022/lib/aigc/index.mjs +10 -13
- package/esm2022/lib/aigc/service-fmai/fmai.service.mjs +10 -21
- package/esm2022/lib/aigc/service-fmai/service-chat/chat-class.mjs +8 -736
- package/esm2022/lib/aigc/service-fmai/service-chat/chat.service.mjs +8 -181
- package/esm2022/lib/aigc/service-fmai/service-chat/index.mjs +10 -7
- package/esm2022/lib/aigc/service-fmai/service-chat/mask-list.mjs +9 -194
- package/esm2022/lib/aigc/service-fmai/service-chat/pipes/chat-content.pipe.mjs +10 -27
- package/esm2022/lib/aigc/service-fmai/service-chat/pipes/hidexml.pipe.mjs +10 -27
- package/esm2022/lib/aigc/service-fmai/service-chat/utilnow.pipe.mjs +10 -68
- package/esm2022/lib/aigc/service-fmai/service-imagine/imagine.service.mjs +8 -229
- package/esm2022/lib/aigc/service-fmai/service-imagine/index.mjs +10 -2
- package/esm2022/lib/aigc/voice/audio.player.mjs +10 -52
- package/esm2022/lib/aigc/voice/class-asr.mjs +8 -79
- package/esm2022/lib/aigc/voice/fmode-voice.service.mjs +8 -501
- package/esm2022/lib/aigc/voice/index.mjs +10 -3
- package/esm2022/lib/aigc/voice/lib/pcm2wav.mjs +10 -38
- package/esm2022/lib/aigc/voice/lib/resample.mjs +10 -34
- package/esm2022/lib/aigc/voice/stream.player.mjs +10 -0
- package/esm2022/lib/aigc/voice/tts/fmode-tts-class.mjs +8 -233
- package/esm2022/lib/aigc/voice/tts/index.mjs +10 -2
- package/esm2022/lib/map/comp-poi-picker/comp-poi-picker.component.mjs +10 -190
- package/esm2022/lib/map/comp-poi-picker/comp-poi-picker.module.mjs +10 -33
- package/esm2022/lib/map/index.mjs +10 -4
- package/esm2022/lib/map/map.module.mjs +10 -61
- package/esm2022/lib/map/page-loca-scatter/page-loca-scatter.component.mjs +10 -110
- package/esm2022/lib/map/page-map.start/page-map.start.component.mjs +8 -98
- package/esm2022/lib/map/page-plan-route/page-plan-route.component.mjs +8 -100
- package/esm2022/lib/nova-cloud/index.mjs +10 -2
- package/esm2022/lib/nova-cloud/nova-cloud.service.mjs +10 -148
- package/esm2022/lib/platform/cross.service.mjs +10 -63
- package/esm2022/lib/platform/index.mjs +10 -2
- package/esm2022/lib/social/index.mjs +10 -2
- package/esm2022/lib/social/wechat/wechat-jssdk.service.mjs +8 -236
- package/esm2022/lib/storage/comp-hwobs-manager/hwobs-manager.component.mjs +10 -59
- package/esm2022/lib/storage/index.mjs +10 -5
- package/esm2022/lib/storage/service-hwobs/hwobs.service.mjs +8 -130
- package/esm2022/lib/storage/service-upload/index.mjs +10 -2
- package/esm2022/lib/storage/service-upload/nova-upload.service.mjs +8 -462
- package/esm2022/lib/storage/service-upload/util-file-md5.mjs +10 -28
- package/esm2022/lib/storage/storage.module.mjs +10 -41
- package/esm2022/lib/user/account/account.service.mjs +10 -221
- package/esm2022/lib/user/captcha/captcha.component.mjs +10 -135
- package/esm2022/lib/user/comp-user-avatar/comp-user-avatar.component.mjs +10 -62
- package/esm2022/lib/user/index.mjs +10 -17
- package/esm2022/lib/user/login/auth.guard.mjs +10 -28
- package/esm2022/lib/user/login/auth.service.mjs +8 -373
- package/esm2022/lib/user/login/login.component.mjs +10 -913
- package/esm2022/lib/user/modal-user-login/modal-user-login.component.mjs +10 -273
- package/esm2022/lib/user/profile/auth-profile.guard.mjs +10 -27
- package/esm2022/lib/user/profile/auth-profile.service.mjs +10 -122
- package/esm2022/lib/user/profile/profile-bind/profile-bind.component.mjs +10 -115
- package/esm2022/lib/user/profile/profile.module.mjs +10 -57
- package/esm2022/lib/user/staff/index.mjs +10 -4
- package/esm2022/lib/user/staff/staff.guard.mjs +10 -26
- package/esm2022/lib/user/staff/staff.module.mjs +10 -18
- package/esm2022/lib/user/staff/staff.service.mjs +10 -85
- package/esm2022/lib/user/user-name.pipe.mjs +10 -29
- package/esm2022/lib/user/user.module.mjs +10 -106
- package/esm2022/lib/video/fm-video/fm-video.component.mjs +10 -67
- package/esm2022/lib/video/index.mjs +10 -2
- package/esm2022/public-api.mjs +10 -13
- package/fesm2022/fmode-ng.mjs +7 -8895
- package/fesm2022/fmode-ng.mjs.map +1 -1
- package/lib/aigc/voice/fmode-voice.service.d.ts +18 -1
- package/lib/aigc/voice/stream.player.d.ts +10 -0
- package/lib/aigc/voice/tts/fmode-tts-class.d.ts +2 -2
- package/package.json +1 -1
|
@@ -1,464 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
import { Injectable } from '@angular/core';
|
|
3
|
-
import { Platform } from '@ionic/angular';
|
|
4
|
-
import { Camera, CameraResultType, CameraSource } from "@capacitor/camera";
|
|
5
|
-
import { Capacitor } from "@capacitor/core";
|
|
6
|
-
import { Filesystem } from "@capacitor/filesystem";
|
|
7
|
-
import { FilesystemWeb } from '@capacitor/filesystem/dist/esm/web.js';
|
|
8
|
-
import * as qiniu from "qiniu-js";
|
|
9
|
-
import Parse from "parse";
|
|
10
|
-
import { Diagnostic } from '@awesome-cordova-plugins/diagnostic/ngx';
|
|
11
|
-
import CryptoJS from "crypto-js";
|
|
12
|
-
/**
|
|
13
|
-
* MediaCapture插件
|
|
14
|
-
* @private
|
|
15
|
-
* @description
|
|
16
|
-
* 依赖:File
|
|
17
|
-
* npm i -S cordova-plugin-file @awesome-cordova-plugins/file
|
|
18
|
-
*/
|
|
19
|
-
import { MediaCapture } from "@awesome-cordova-plugins/media-capture";
|
|
20
|
-
import { calcFileMd5 } from './util-file-md5';
|
|
21
|
-
import * as i0 from "@angular/core";
|
|
22
|
-
import * as i1 from "@ionic/angular";
|
|
23
|
-
import * as i2 from "@awesome-cordova-plugins/diagnostic/ngx";
|
|
24
|
-
/**
|
|
25
|
-
* NovaUploadService 上传服务
|
|
26
|
-
* @public
|
|
27
|
-
*/
|
|
28
|
-
export class NovaUploadService {
|
|
29
|
-
constructor(platform, diagnostic) {
|
|
30
|
-
this.platform = platform;
|
|
31
|
-
this.diagnostic = diagnostic;
|
|
32
|
-
this.maxSize = 5 * 1024 * 1024;
|
|
33
|
-
this.getUptoken(true);
|
|
34
|
-
this.requestPermission();
|
|
35
|
-
this.queryDomain();
|
|
36
|
-
}
|
|
1
|
+
|
|
37
2
|
/**
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
* progressData {
|
|
43
|
-
"total": {
|
|
44
|
-
"size": 8491,
|
|
45
|
-
"loaded": 8490,
|
|
46
|
-
"percent": 99.98822282416675
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
* novafileData {
|
|
50
|
-
"id":"xxxxxxxxxx" // Attachment.objectId
|
|
51
|
-
"hash": "FoYHjpyTif1t8uOMv6N6sVIeGTvq",
|
|
52
|
-
"key": "E4KpGvTEto/20230901/053605467.jpg",
|
|
53
|
-
"url": "https://file-cloud.fmode.cn/E4KpGvTEto/20230901/053605467.jpg",
|
|
54
|
-
"name": "20230901173605.jpg",
|
|
55
|
-
"type": "image/jpg",
|
|
56
|
-
"size": 7853
|
|
57
|
-
}
|
|
3
|
+
* @copyright © 未来飞马 © 未来全栈 www.fmode.cn
|
|
4
|
+
* 版权所有 © 未来飞马 © 江西脑控科技有限公司 Copyright © Fmode Technology Co., Ltd.
|
|
5
|
+
* 保留所有权利 All Rights Reserved.
|
|
6
|
+
* /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/storage/service-upload/nova-upload.service.mjs
|
|
58
7
|
*/
|
|
59
|
-
async upload(file,
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
let nameList = file.name?.split(".");
|
|
63
|
-
let format = nameList[nameList.length - 1]; // 文件后缀
|
|
64
|
-
// 计算文件md5
|
|
65
|
-
let md5File;
|
|
66
|
-
try {
|
|
67
|
-
md5File = await calcFileMd5(file);
|
|
68
|
-
}
|
|
69
|
-
catch (errmd5) { }
|
|
70
|
-
// 转换文件blob
|
|
71
|
-
let blob = this.fileToBlob(file);
|
|
72
|
-
// 图片上传
|
|
73
|
-
let uploadFile;
|
|
74
|
-
if (type.indexOf('image') > -1) {
|
|
75
|
-
uploadFile = await this.saveQiniuImageFile(blob, format, null, onProgress);
|
|
76
|
-
}
|
|
77
|
-
else {
|
|
78
|
-
uploadFile = await this.saveQiniuMediaFile(file, blob, null, onProgress);
|
|
79
|
-
}
|
|
80
|
-
uploadFile.md5 = md5File;
|
|
81
|
-
// 纠正file.url
|
|
82
|
-
if (uploadFile?.url?.indexOf('undefined') > -1) {
|
|
83
|
-
uploadFile.url = (this.qiniuDomain || "https://file-cloud.fmode.cn/") + uploadFile.url.replace("undefined/", "");
|
|
84
|
-
}
|
|
85
|
-
// 保存附件
|
|
86
|
-
let attachment;
|
|
87
|
-
if (uploadFile?.url) {
|
|
88
|
-
attachment = await this.saveAttachment(uploadFile, this.qiniuDomain, null, this.getCompanyId());
|
|
89
|
-
}
|
|
90
|
-
if (attachment?.id) {
|
|
91
|
-
uploadFile.id = attachment?.id;
|
|
92
|
-
}
|
|
93
|
-
return uploadFile;
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* 移动端上传专用方法
|
|
97
|
-
* @returns
|
|
98
|
-
*/
|
|
99
|
-
isCapacitor() {
|
|
100
|
-
return this.platform.is("capacitor") || this.platform.is("cordova");
|
|
101
|
-
}
|
|
102
|
-
async requestPermission() {
|
|
103
|
-
if (!this.isCapacitor())
|
|
104
|
-
return;
|
|
105
|
-
await this.requestStoagePermission();
|
|
106
|
-
await this.requestCameraPermission();
|
|
107
|
-
}
|
|
108
|
-
async requestStoagePermission() {
|
|
109
|
-
let isAvailable = await this.diagnostic.isExternalStorageAuthorized();
|
|
110
|
-
console.log("permisson_STORAGE:", isAvailable);
|
|
111
|
-
if (!isAvailable) {
|
|
112
|
-
let data = await this.diagnostic.requestExternalStorageAuthorization();
|
|
113
|
-
}
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
116
|
-
async requestCameraPermission() {
|
|
117
|
-
let isAvailable = await this.diagnostic.isCameraAuthorized();
|
|
118
|
-
console.log("permisson_Camera:", isAvailable);
|
|
119
|
-
if (!isAvailable) {
|
|
120
|
-
let data = await this.diagnostic.requestCameraAuthorization();
|
|
121
|
-
}
|
|
122
|
-
return;
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* 上传Token获取方法
|
|
126
|
-
* @returns
|
|
127
|
-
*/
|
|
128
|
-
async getUptoken(refresh = false) {
|
|
129
|
-
console.log("getUptoken");
|
|
130
|
-
if (!this.qiniuConf && !refresh)
|
|
131
|
-
return;
|
|
132
|
-
try {
|
|
133
|
-
console.log(this.getCompanyId());
|
|
134
|
-
let data = await Parse.Cloud.run("qiniu_uptoken", {
|
|
135
|
-
company: this.getCompanyId(),
|
|
136
|
-
});
|
|
137
|
-
console.log(data);
|
|
138
|
-
this.qiniuConf = data;
|
|
139
|
-
}
|
|
140
|
-
catch (err) {
|
|
141
|
-
console.error(err);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* 生成文件上传Key值:<公司id>/<yyyymmdd>/<file.id><hhMMss>.<ext>
|
|
146
|
-
* @desc 用于对象存储含全路径的文件名称
|
|
147
|
-
*/
|
|
148
|
-
genFileKey(file, company) {
|
|
149
|
-
let today = new Date();
|
|
150
|
-
let dp = new DatePipe("en");
|
|
151
|
-
if (!company) {
|
|
152
|
-
company = this.getCompanyId();
|
|
153
|
-
}
|
|
154
|
-
return "" + company + "/" + dp.transform(today, "yMMdd") + "/" + String(file.id).substr(20, 6) + dp.transform(today, "hhmmssSSS") + /\.[^\.]+/.exec(file.name);
|
|
155
|
-
}
|
|
156
|
-
/**
|
|
157
|
-
* 获取当前登录用户公司ID
|
|
158
|
-
* @returns 公司ID
|
|
159
|
-
*/
|
|
160
|
-
getCompanyId() {
|
|
161
|
-
// 获取公司ID,或无指定值,则获取localStorage中company
|
|
162
|
-
if (this.company) {
|
|
163
|
-
return this.company;
|
|
164
|
-
}
|
|
165
|
-
let id = localStorage.getItem("company");
|
|
166
|
-
return id;
|
|
167
|
-
}
|
|
168
|
-
async queryDomain() {
|
|
169
|
-
let Company = new Parse.Query('Company');
|
|
170
|
-
let company = await Company.get(this.getCompanyId());
|
|
171
|
-
if (company.get("configQiniu") && company.get("configQiniu").domain) {
|
|
172
|
-
console.log(company.get("configQiniu").domain);
|
|
173
|
-
this.qiniuDomain = company.get("configQiniu").domain;
|
|
174
|
-
}
|
|
175
|
-
else {
|
|
176
|
-
this.qiniuDomain = 'https://file-cloud.fmode.cn';
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
/**
|
|
180
|
-
* 保存上传信息至附件表 Attachment
|
|
181
|
-
* @param file 附件信息
|
|
182
|
-
* @returns attachment Parse.Object
|
|
183
|
-
*/
|
|
184
|
-
async saveAttachment(file, domain, cateId, company) {
|
|
185
|
-
let url = file.url;
|
|
186
|
-
if (url.startsWith("http")) {
|
|
187
|
-
}
|
|
188
|
-
else {
|
|
189
|
-
url = domain + url;
|
|
190
|
-
}
|
|
191
|
-
url = url.replace(/undefined\//, "");
|
|
192
|
-
// 帐套参数默认加载本地存储
|
|
193
|
-
if (!company) {
|
|
194
|
-
company = localStorage.getItem("company");
|
|
195
|
-
}
|
|
196
|
-
let user = Parse.User.current();
|
|
197
|
-
// 检测文件是否存在
|
|
198
|
-
let query = new Parse.Query("Attachment");
|
|
199
|
-
query.equalTo("url", url);
|
|
200
|
-
let attachment = await query.first();
|
|
201
|
-
if (attachment && attachment.id) {
|
|
202
|
-
console.error("该文件已存在,无需重复上传");
|
|
203
|
-
return attachment;
|
|
204
|
-
}
|
|
205
|
-
else {
|
|
206
|
-
let Attachment = Parse.Object.extend("Attachment");
|
|
207
|
-
attachment = new Attachment();
|
|
208
|
-
attachment.set("size", file.size);
|
|
209
|
-
attachment.set("url", url);
|
|
210
|
-
attachment.set("name", file.name);
|
|
211
|
-
attachment.set("mime", file.type);
|
|
212
|
-
attachment.set("md5", file?.md5);
|
|
213
|
-
if (user?.id) {
|
|
214
|
-
attachment.set("user", user.toPointer());
|
|
215
|
-
}
|
|
216
|
-
if (company) {
|
|
217
|
-
attachment.set("company", {
|
|
218
|
-
__type: "Pointer",
|
|
219
|
-
className: "Company",
|
|
220
|
-
objectId: localStorage.getItem("company")
|
|
221
|
-
});
|
|
222
|
-
}
|
|
223
|
-
if (cateId) {
|
|
224
|
-
attachment.set("category", {
|
|
225
|
-
__type: "Pointer",
|
|
226
|
-
className: "Category",
|
|
227
|
-
objectId: cateId
|
|
228
|
-
});
|
|
229
|
-
}
|
|
230
|
-
return await attachment.save();
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
/**
|
|
234
|
-
* 录像并上传
|
|
235
|
-
*/
|
|
236
|
-
async captureVideo(conf) {
|
|
237
|
-
this.qiniuConf = conf;
|
|
238
|
-
if (!this.isCapacitor())
|
|
239
|
-
return;
|
|
240
|
-
// {"name":"VID_20230513_182235.mp4","localURL":"https://localhost/__cdvfile_sdcard__/DCIM/Camera/VID_20230513_182235.mp4","type":"video/mp4","lastModified":null,"lastModifiedDate":1683973355000,"size":6100161,"start":0,"end":0,"fullPath":"file:///storage/emulated/0/DCIM/Camera/VID_20230513_182235.mp4"}
|
|
241
|
-
let mediaFile = await this.cameraCaptureVideoFile();
|
|
242
|
-
// let mediaData:string = await this.getMediaFileDataString(mediaFile);
|
|
243
|
-
let fileBlob = await this.getMediaFileDataString(mediaFile);
|
|
244
|
-
// let fileBlob = await this.base64ToBlobType(mediaData,mediaFile.type);
|
|
245
|
-
let qiniuFile = await this.saveQiniuMediaFile(mediaFile, fileBlob);
|
|
246
|
-
return qiniuFile;
|
|
247
|
-
}
|
|
248
|
-
async cameraCaptureVideoFile() {
|
|
249
|
-
let options = {
|
|
250
|
-
limit: 1,
|
|
251
|
-
// quality:50
|
|
252
|
-
};
|
|
253
|
-
let mediaCapture = MediaCapture;
|
|
254
|
-
let list = await mediaCapture.captureVideo(options);
|
|
255
|
-
if (list?.length > 0) {
|
|
256
|
-
return list[0];
|
|
257
|
-
}
|
|
258
|
-
return null;
|
|
259
|
-
}
|
|
260
|
-
async getMediaFileDataString(mediafile) {
|
|
261
|
-
let filesystem = new FilesystemWeb();
|
|
262
|
-
let path = mediafile.fullPath.replaceAll("///", "//");
|
|
263
|
-
let stat = await Filesystem.stat({ path: mediafile.fullPath });
|
|
264
|
-
let webUri = Capacitor.convertFileSrc(stat.uri);
|
|
265
|
-
let content = await fetch(webUri);
|
|
266
|
-
let blob = await content.blob();
|
|
267
|
-
console.log(blob.size);
|
|
268
|
-
console.log(JSON.stringify(stat));
|
|
269
|
-
// CapacitorConver
|
|
270
|
-
// file:///storage/emulated/0/DCIM/Camera/VID_20230612_125907030.mp4
|
|
271
|
-
// let filesystem = Filesystem
|
|
272
|
-
// let content = await filesystem.readFile({
|
|
273
|
-
// path:mediafile.fullPath
|
|
274
|
-
// })
|
|
275
|
-
console.log(JSON.stringify(content));
|
|
276
|
-
console.log(JSON.stringify(Object.keys(content)));
|
|
277
|
-
// console.log(content?.data)
|
|
278
|
-
if (blob) {
|
|
279
|
-
return blob;
|
|
280
|
-
}
|
|
281
|
-
else {
|
|
282
|
-
throw "读取文件失败";
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
/**
|
|
286
|
-
* 拍照并上传
|
|
287
|
-
* @returns -- {hash?:string,url:string,name:string,size:number,key:stirng}
|
|
288
|
-
*/
|
|
289
|
-
async takePicture(conf) {
|
|
290
|
-
this.qiniuConf = conf;
|
|
291
|
-
if (!this.isCapacitor())
|
|
292
|
-
return;
|
|
293
|
-
await this.getUptoken();
|
|
294
|
-
let image = await this.cameraTakePictureDataUrl();
|
|
295
|
-
// image.format
|
|
296
|
-
if (!image?.dataUrl)
|
|
297
|
-
return;
|
|
298
|
-
let blob = await this.base64ToBlob(image?.dataUrl);
|
|
299
|
-
let qiniuFile = await this.saveQiniuImageFile(blob, image?.format);
|
|
300
|
-
console.log(JSON.stringify(qiniuFile));
|
|
301
|
-
// this.saveAttachment()
|
|
302
|
-
return qiniuFile;
|
|
303
|
-
}
|
|
304
|
-
;
|
|
305
|
-
async cameraTakePictureDataUrl() {
|
|
306
|
-
if (!this.isCapacitor())
|
|
307
|
-
return;
|
|
308
|
-
const image = await Camera.getPhoto({
|
|
309
|
-
quality: 90,
|
|
310
|
-
allowEditing: false,
|
|
311
|
-
// saveToGallery:true,
|
|
312
|
-
source: CameraSource.Camera,
|
|
313
|
-
resultType: CameraResultType.DataUrl
|
|
314
|
-
});
|
|
315
|
-
return image;
|
|
316
|
-
}
|
|
317
|
-
/**
|
|
318
|
-
* 七牛上传函数:无需前端组件
|
|
319
|
-
* @param imageBlob: Blob
|
|
320
|
-
* @param format: string
|
|
321
|
-
*/
|
|
322
|
-
async saveQiniuImageFile(imageBlob, format, company, onProgress) {
|
|
323
|
-
// let that = this
|
|
324
|
-
let maxSize = this.maxSize;
|
|
325
|
-
if (imageBlob.size > maxSize) {
|
|
326
|
-
await console.log(`照片过大,超出限制5MB`);
|
|
327
|
-
throw "超出文件大小";
|
|
328
|
-
}
|
|
329
|
-
let dp = new DatePipe("en");
|
|
330
|
-
let id = dp.transform(new Date(), "yyyyMMddHHmmss");
|
|
331
|
-
let name = `${id}.${format}`;
|
|
332
|
-
let type = `image/${format}`;
|
|
333
|
-
// let file = new File([imageBlob], filename, { type: "image/jpeg" })
|
|
334
|
-
let putExtra = {
|
|
335
|
-
fname: name,
|
|
336
|
-
params: {},
|
|
337
|
-
mimeType: "image/*",
|
|
338
|
-
};
|
|
339
|
-
let config = {
|
|
340
|
-
useCdnDomain: true, //使用cdn加速
|
|
341
|
-
forceDirect: true // 强制不分片,放置上传报错
|
|
342
|
-
};
|
|
343
|
-
console.log(this.qiniuConf);
|
|
344
|
-
let qiniuFileKey = this.genFileKey({ id: id, name: name });
|
|
345
|
-
console.log("图片上传前");
|
|
346
|
-
return new Promise((resolve, reject) => {
|
|
347
|
-
console.log("进入了上传");
|
|
348
|
-
let observable = qiniu.upload(imageBlob, qiniuFileKey, this.qiniuConf?.uptoken, putExtra, config);
|
|
349
|
-
observable.subscribe({
|
|
350
|
-
next: (result_2) => {
|
|
351
|
-
// 主要用来展示进度
|
|
352
|
-
console.log(result_2);
|
|
353
|
-
onProgress && onProgress(result_2);
|
|
354
|
-
},
|
|
355
|
-
error: async (err_1) => {
|
|
356
|
-
// this.$notify('上传图片失败');
|
|
357
|
-
// await that.presentToast(`检测失败`, 1500, "danger")
|
|
358
|
-
console.log(err_1);
|
|
359
|
-
},
|
|
360
|
-
complete: (res_1) => {
|
|
361
|
-
console.log("上传完成");
|
|
362
|
-
console.log(`${this.qiniuConf?.domain}${res_1.key}`);
|
|
363
|
-
res_1.url = `${this.qiniuConf?.domain}${res_1.key}`;
|
|
364
|
-
res_1.name = name;
|
|
365
|
-
res_1.type = type;
|
|
366
|
-
res_1.size = imageBlob.size;
|
|
367
|
-
resolve(res_1);
|
|
368
|
-
},
|
|
369
|
-
});
|
|
370
|
-
});
|
|
371
|
-
}
|
|
372
|
-
async saveQiniuMediaFile(mediafile, fileBlob, company, onProgress) {
|
|
373
|
-
// let that = this
|
|
374
|
-
let name = mediafile.name;
|
|
375
|
-
let type = mediafile.type;
|
|
376
|
-
let size = mediafile.size;
|
|
377
|
-
let maxSize = 100 * 1024 * 1024; // 限100M
|
|
378
|
-
if (size > maxSize) {
|
|
379
|
-
console.log(`视频过大,超出限制100MB`);
|
|
380
|
-
throw "超出文件大小";
|
|
381
|
-
}
|
|
382
|
-
let dp = new DatePipe("en");
|
|
383
|
-
let id = dp.transform(new Date(), "yyyyMMddHHmmss");
|
|
384
|
-
// let file = new File([mediaBlob], filename, { type: "image/jpeg" })
|
|
385
|
-
let putExtra = {
|
|
386
|
-
fname: name,
|
|
387
|
-
params: {},
|
|
388
|
-
mimeType: type,
|
|
389
|
-
};
|
|
390
|
-
let config = {
|
|
391
|
-
useCdnDomain: true, //使用cdn加速
|
|
392
|
-
forceDirect: true // 强制不分片,放置上传报错
|
|
393
|
-
};
|
|
394
|
-
let qiniuFileKey = this.genFileKey({ id: id, name: name });
|
|
395
|
-
console.log("图片上传前");
|
|
396
|
-
console.log(mediafile.name, fileBlob.size);
|
|
397
|
-
console.log(fileBlob.size);
|
|
398
|
-
console.log(fileBlob.size / 1024 / 1024);
|
|
399
|
-
return new Promise((resolve, reject) => {
|
|
400
|
-
console.log("进入了上传");
|
|
401
|
-
let observable = qiniu.upload(fileBlob, qiniuFileKey, this.qiniuConf?.uptoken, putExtra, config);
|
|
402
|
-
observable.subscribe({
|
|
403
|
-
next: (result_2) => {
|
|
404
|
-
// 主要用来展示进度
|
|
405
|
-
console.log("主要用来展示进度");
|
|
406
|
-
onProgress && onProgress(result_2);
|
|
407
|
-
console.log(JSON.stringify(result_2));
|
|
408
|
-
},
|
|
409
|
-
error: async (err_1) => {
|
|
410
|
-
console.log("上传失败");
|
|
411
|
-
// this.$notify('上传图片失败');
|
|
412
|
-
// await that.presentToast(`检测失败`, 1500, "danger")
|
|
413
|
-
console.log(JSON.stringify(err_1));
|
|
414
|
-
},
|
|
415
|
-
complete: (res_1) => {
|
|
416
|
-
console.log("上传完成");
|
|
417
|
-
console.log(JSON.stringify(res_1));
|
|
418
|
-
// console.log(`${this.qiniuConf?.domain}${res_1.key}`)
|
|
419
|
-
// res_1.url = `${this.qiniuConf?.domain}${res_1.key}`
|
|
420
|
-
// res_1.name = name
|
|
421
|
-
// res_1.type= type
|
|
422
|
-
// res_1.size = size;
|
|
423
|
-
mediafile.key = res_1.key;
|
|
424
|
-
console.log(mediafile.type);
|
|
425
|
-
mediafile.url = `${this.qiniuConf?.domain}${res_1.key}`;
|
|
426
|
-
console.log(mediafile.url);
|
|
427
|
-
resolve(mediafile);
|
|
428
|
-
},
|
|
429
|
-
});
|
|
430
|
-
});
|
|
431
|
-
}
|
|
432
|
-
//string转File文件
|
|
433
|
-
async base64ToBlobType(string, type) {
|
|
434
|
-
let base64Response = await fetch(`data:${type};base64,${string}`);
|
|
435
|
-
let blob = await base64Response.blob();
|
|
436
|
-
return blob;
|
|
437
|
-
string = atob(string);
|
|
438
|
-
return new Blob([string], {
|
|
439
|
-
type: type
|
|
440
|
-
});
|
|
441
|
-
}
|
|
442
|
-
//base64转File文件
|
|
443
|
-
async base64ToBlob(base64Img) {
|
|
444
|
-
let base64Response = await fetch(base64Img);
|
|
445
|
-
let blob = await base64Response.blob();
|
|
446
|
-
return blob;
|
|
447
|
-
}
|
|
448
|
-
fileToBlob(file) {
|
|
449
|
-
const blob = file.slice(0, file.size, file.type);
|
|
450
|
-
return new Blob([blob], { type: file.type });
|
|
451
|
-
}
|
|
452
|
-
genMd5(inputString) {
|
|
453
|
-
return CryptoJS.MD5(inputString).toString();
|
|
454
|
-
}
|
|
455
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NovaUploadService, deps: [{ token: i1.Platform }, { token: i2.Diagnostic }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
456
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NovaUploadService, providedIn: 'root' }); }
|
|
457
|
-
}
|
|
458
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NovaUploadService, decorators: [{
|
|
459
|
-
type: Injectable,
|
|
460
|
-
args: [{
|
|
461
|
-
providedIn: 'root'
|
|
462
|
-
}]
|
|
463
|
-
}], ctorParameters: () => [{ type: i1.Platform }, { type: i2.Diagnostic }] });
|
|
464
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm92YS11cGxvYWQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Ztb2RlLW5nL3NyYy9saWIvc3RvcmFnZS9zZXJ2aWNlLXVwbG9hZC9ub3ZhLXVwbG9hZC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsTUFBTSxFQUFDLGdCQUFnQixFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBQ3pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHVDQUF1QyxDQUFBO0FBQ3JFLE9BQU8sS0FBSyxLQUFLLE1BQU0sVUFBVSxDQUFBO0FBQ2pDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDckUsT0FBTyxRQUFRLE1BQU0sV0FBVyxDQUFBO0FBRWhDOzs7Ozs7R0FNRztBQUNILE9BQU8sRUFBRSxZQUFZLEVBQTZDLE1BQU0sd0NBQXdDLENBQUE7QUFDaEgsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7O0FBZ0I5Qzs7O0dBR0c7QUFJSCxNQUFNLE9BQU8saUJBQWlCO0lBTzVCLFlBQ1UsUUFBaUIsRUFDakIsVUFBc0I7UUFEdEIsYUFBUSxHQUFSLFFBQVEsQ0FBUztRQUNqQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBcVNoQyxZQUFPLEdBQUcsQ0FBQyxHQUFHLElB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QUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqRCxPQUFPLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUNELE1BQU0sQ0FBQyxXQUFrQjtRQUN2QixPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDOUMsQ0FBQzsrR0F2Y1UsaUJBQWlCO21IQUFqQixpQkFBaUIsY0FGaEIsTUFBTTs7NEZBRVAsaUJBQWlCO2tCQUg3QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGVQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFBsYXRmb3JtIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgQ2FtZXJhLENhbWVyYVJlc3VsdFR5cGUsIENhbWVyYVNvdXJjZSB9IGZyb20gXCJAY2FwYWNpdG9yL2NhbWVyYVwiXG5pbXBvcnQgeyBDYXBhY2l0b3IgfSBmcm9tIFwiQGNhcGFjaXRvci9jb3JlXCI7XG5pbXBvcnQgeyBGaWxlc3lzdGVtIH0gZnJvbSBcIkBjYXBhY2l0b3IvZmlsZXN5c3RlbVwiO1xuaW1wb3J0IHsgRmlsZXN5c3RlbVdlYiB9IGZyb20gJ0BjYXBhY2l0b3IvZmlsZXN5c3RlbS9kaXN0L2VzbS93ZWIuanMnXG5pbXBvcnQgKiBhcyBxaW5pdSBmcm9tIFwicWluaXUtanNcIlxuaW1wb3J0IFBhcnNlIGZyb20gXCJwYXJzZVwiO1xuaW1wb3J0IHsgRGlhZ25vc3RpYyB9IGZyb20gJ0Bhd2Vzb21lLWNvcmRvdmEtcGx1Z2lucy9kaWFnbm9zdGljL25neCc7XG5pbXBvcnQgQ3J5cHRvSlMgZnJvbSBcImNyeXB0by1qc1wiXG5cbi8qKlxuICogTWVkaWFDYXB0dXJl5o+S5Lu2XG4gKiBAcHJpdmF0ZVxuICogQGRlc2NyaXB0aW9uXG4gKiDkvp3otZbvvJpGaWxlXG4gKiBucG0gaSAtUyBjb3Jkb3ZhLXBsdWdpbi1maWxlIEBhd2Vzb21lLWNvcmRvdmEtcGx1Z2lucy9maWxlXG4gKi9cbmltcG9ydCB7IE1lZGlhQ2FwdHVyZSxNZWRpYUZpbGUsQ2FwdHVyZVZpZGVvT3B0aW9ucyxDYXB0dXJlRXJyb3IgfSBmcm9tIFwiQGF3ZXNvbWUtY29yZG92YS1wbHVnaW5zL21lZGlhLWNhcHR1cmVcIlxuaW1wb3J0IHsgY2FsY0ZpbGVNZDUgfSBmcm9tICcuL3V0aWwtZmlsZS1tZDUnO1xuXG4vKipcbiAqIE5vdmFGaWxlIOaWh+S7tuexu+Wei1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE5vdmFGaWxle1xuICBpZDpzdHJpbmdcbiAga2V5OnN0cmluZ1xuICB1cmw6c3RyaW5nXG4gIG5hbWU6c3RyaW5nXG4gIHR5cGU6c3RyaW5nXG4gIHNpemU6bnVtYmVyXG4gIG1kNT86c3RyaW5nXG59XG5cbi8qKlxuICogTm92YVVwbG9hZFNlcnZpY2Ug5LiK5Lyg5pyN5YqhXG4gKiBAcHVibGljXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIE5vdmFVcGxvYWRTZXJ2aWNlIHtcblxuICBjb21wYW55OnN0cmluZ1xuICB1cHRva2VuOnN0cmluZ1xuICBxaW5pdUNvbmY6YW55IFxuICBkb21haW46c3RyaW5nXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwbGF0Zm9ybTpQbGF0Zm9ybSxcbiAgICBwcml2YXRlIGRpYWdub3N0aWM6IERpYWdub3N0aWMsIFxuICApIHsgXG4gICAgdGhpcy5nZXRVcHRva2VuKHRydWUpXG4gICAgdGhpcy5yZXF1ZXN0UGVybWlzc2lvbigpO1xuICAgIHRoaXMucXVlcnlEb21haW4oKTtcbiAgfVxuICAvKipcbiAgICog5YWo56uv6YCa55So5LiK5Lyg5pa55rOVXG4gICAqIEBwYXJhbXMgZmlsZTpGaWxlIOW+heS4iuS8oOaWh+S7tlxuICAgKiBAcGFyYW1zIG9uUHJvZ3Jlc3M6RnVuY3Rpb24g5LiK5Lyg6L+b5bqm5Zue6LCD5Ye95pWwXG4gICAqIEByZXR1cm5zXG4gICAqIHByb2dyZXNzRGF0YSB7XG4gICAgICAgICAgICBcInRvdGFsXCI6IHtcbiAgICAgICAgICAgICAgICBcInNpemVcIjogODQ5MSxcbiAgICAgICAgICAgICAgICBcImxvYWRlZFwiOiA4NDkwLFxuICAgICAgICAgICAgICAgIFwicGVyY2VudFwiOiA5OS45ODgyMjI4MjQxNjY3NVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAqIG5vdmFmaWxlRGF0YSB7XG4gICAgICAgIFwiaWRcIjpcInh4eHh4eHh4eHhcIiAvLyBBdHRhY2htZW50Lm9iamVjdElkXG4gICAgICBcImhhc2hcIjogXCJGb1lIanB5VGlmMXQ4dU9NdjZONnNWSWVHVHZxXCIsXG4gICAgICBcImtleVwiOiBcIkU0S3BHdlRFdG8vMjAyMzA5MDEvMDUzNjA1NDY3LmpwZ1wiLFxuICAgICAgXCJ1cmxcIjogXCJodHRwczovL2ZpbGUtY2xvdWQuZm1vZGUuY24vRTRLcEd2VEV0by8yMDIzMDkwMS8wNTM2MDU0NjcuanBnXCIsXG4gICAgICBcIm5hbWVcIjogXCIyMDIzMDkwMTE3MzYwNS5qcGdcIixcbiAgICAgIFwidHlwZVwiOiBcImltYWdlL2pwZ1wiLFxuICAgICAgXCJzaXplXCI6IDc4NTNcbiAgfVxuICAgKi9cbiAgYXN5bmMgdXBsb2FkKGZpbGU6RmlsZSxvblByb2dyZXNzPzpGdW5jdGlvbik6UHJvbWlzZTxOb3ZhRmlsZT57XG4gICAgLy8g6Kej5p6Q5paH5Lu257G75Z6L77yM5bm26I635b6X5paH5Lu25ZCO57yAXG4gICAgbGV0IHR5cGUgPSBmaWxlLnR5cGUgXG5cbiAgICBsZXQgbmFtZUxpc3QgPSBmaWxlLm5hbWU/LnNwbGl0KFwiLlwiKVxuICAgIGxldCBmb3JtYXQgPSBuYW1lTGlzdFtuYW1lTGlzdC5sZW5ndGgtMV0gLy8g5paH5Lu25ZCO57yAXG5cbiAgICAvLyDorqHnrpfmlofku7ZtZDVcbiAgICBsZXQgbWQ1RmlsZVxuICAgIHRyeXtcbiAgICAgIG1kNUZpbGUgPSBhd2FpdCBjYWxjRmlsZU1kNShmaWxlKVxuICAgIH1jYXRjaChlcnJtZDUpe31cbiAgICAvLyDovazmjaLmlofku7ZibG9iXG4gICAgbGV0IGJsb2IgPSB0aGlzLmZpbGVUb0Jsb2IoZmlsZSlcblxuICAgIC8vIOWbvueJh+S4iuS8oFxuICAgIGxldCB1cGxvYWRGaWxlOk5vdmFGaWxlXG4gICAgaWYodHlwZS5pbmRleE9mKCdpbWFnZScpPi0xKXtcbiAgICAgIHVwbG9hZEZpbGUgPSBhd2FpdCB0aGlzLnNhdmVRaW5pdUltYWdlRmlsZShibG9iLGZvcm1hdCxudWxsLG9uUHJvZ3Jlc3MpXG4gICAgfWVsc2V7XG4gICAgICB1cGxvYWRGaWxlID0gYXdhaXQgdGhpcy5zYXZlUWluaXVNZWRpYUZpbGUoZmlsZSxibG9iLG51bGwsb25Qcm9ncmVzcylcbiAgICB9XG4gICAgdXBsb2FkRmlsZS5tZDUgPSBtZDVGaWxlXG5cbiAgICAvLyDnuqDmraNmaWxlLnVybFxuICAgIGlmKHVwbG9hZEZpbGU/LnVybD8uaW5kZXhPZigndW5kZWZpbmVkJyk+LTEpe1xuICAgICAgdXBsb2FkRmlsZS51cmwgPSAodGhpcy5xaW5pdURvbWFpbiB8fCBcImh0dHBzOi8vZmlsZS1jbG91ZC5mbW9kZS5jbi9cIikgKyB1cGxvYWRGaWxlLnVybC5yZXBsYWNlKFwidW5kZWZpbmVkL1wiLCBcIlwiKTtcbiAgICB9XG5cbiAgICAvLyDkv53lrZjpmYTku7ZcbiAgICBsZXQgYXR0YWNobWVudFxuICAgIGlmKHVwbG9hZEZpbGU/LnVybCl7XG4gICAgICBhdHRhY2htZW50ID0gYXdhaXQgdGhpcy5zYXZlQXR0YWNobWVudCh1cGxvYWRGaWxlLHRoaXMucWluaXVEb21haW4sbnVsbCx0aGlzLmdldENvbXBhbnlJZCgpKVxuICAgIH1cbiAgICBpZihhdHRhY2htZW50Py5pZCl7XG4gICAgICB1cGxvYWRGaWxlLmlkID0gYXR0YWNobWVudD8uaWRcbiAgICB9XG4gICAgcmV0dXJuIHVwbG9hZEZpbGVcbiAgfVxuXG4gIC8qKlxuICAgKiDnp7vliqjnq6/kuIrkvKDkuJPnlKjmlrnms5VcbiAgICogQHJldHVybnMgXG4gICAqL1xuICBpc0NhcGFjaXRvcigpe1xuICAgIHJldHVybiB0aGlzLnBsYXRmb3JtLmlzKFwiY2FwYWNpdG9yXCIpIHx8IHRoaXMucGxhdGZvcm0uaXMoXCJjb3Jkb3ZhXCIpXG4gIH1cbiAgYXN5bmMgcmVxdWVzdFBlcm1pc3Npb24oKXtcbiAgICBpZighdGhpcy5pc0NhcGFjaXRvcigpKSByZXR1cm5cbiAgICBhd2FpdCB0aGlzLnJlcXVlc3RTdG9hZ2VQZXJtaXNzaW9uKCk7XG4gICAgYXdhaXQgdGhpcy5yZXF1ZXN0Q2FtZXJhUGVybWlzc2lvbigpO1xuICB9XG4gIGFzeW5jIHJlcXVlc3RTdG9hZ2VQZXJtaXNzaW9uKCl7XG4gICAgICBsZXQgaXNBdmFpbGFibGUgPSBhd2FpdCB0aGlzLmRpYWdub3N0aWMuaXNFeHRlcm5hbFN0b3JhZ2VBdXRob3JpemVkKClcbiAgICAgIGNvbnNvbGUubG9nKFwicGVybWlzc29uX1NUT1JBR0U6XCIsIGlzQXZhaWxhYmxlKVxuICAgICAgaWYgKCFpc0F2YWlsYWJsZSkge1xuICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IHRoaXMuZGlhZ25vc3RpYy5yZXF1ZXN0RXh0ZXJuYWxTdG9yYWdlQXV0aG9yaXphdGlvbigpXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgfVxuICBhc3luYyByZXF1ZXN0Q2FtZXJhUGVybWlzc2lvbigpe1xuICAgIGxldCBpc0F2YWlsYWJsZSA9IGF3YWl0IHRoaXMuZGlhZ25vc3RpYy5pc0NhbWVyYUF1dGhvcml6ZWQoKVxuICAgIGNvbnNvbGUubG9nKFwicGVybWlzc29uX0NhbWVyYTpcIiwgaXNBdmFpbGFibGUpXG4gICAgaWYgKCFpc0F2YWlsYWJsZSkge1xuICAgICAgbGV0IGRhdGEgPSBhd2FpdCB0aGlzLmRpYWdub3N0aWMucmVxdWVzdENhbWVyYUF1dGhvcml6YXRpb24oKVxuICAgIH1cbiAgICByZXR1cm5cbn1cblxuLyoqXG4gKiDkuIrkvKBUb2tlbuiOt+WPluaWueazlVxuICogQHJldHVybnMgXG4gKi9cbiAgYXN5bmMgZ2V0VXB0b2tlbihyZWZyZXNoOmJvb2xlYW49ZmFsc2UpIHtcbiAgICBjb25zb2xlLmxvZyhcImdldFVwdG9rZW5cIilcbiAgICBpZighdGhpcy5xaW5pdUNvbmYgJiYgIXJlZnJlc2gpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgY29uc29sZS5sb2codGhpcy5nZXRDb21wYW55SWQoKSlcbiAgICAgIGxldCBkYXRhID0gYXdhaXQgUGFyc2UuQ2xvdWQucnVuKFwicWluaXVfdXB0b2tlblwiLCB7XG4gICAgICAgIGNvbXBhbnk6IHRoaXMuZ2V0Q29tcGFueUlkKCksXG4gICAgICB9KVxuICAgICAgY29uc29sZS5sb2coZGF0YSlcbiAgICAgIHRoaXMucWluaXVDb25mID0gZGF0YVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpXG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiDnlJ/miJDmlofku7bkuIrkvKBLZXnlgLzvvJo85YWs5Y+4aWQ+Lzx5eXl5bW1kZD4vPGZpbGUuaWQ+PGhoTU1zcz4uPGV4dD5cbiAgICogQGRlc2Mg55So5LqO5a+56LGh5a2Y5YKo5ZCr5YWo6Lev5b6E55qE5paH5Lu25ZCN56ewXG4gICAqL1xuICBnZW5GaWxlS2V5KGZpbGU6e2lkOnN0cmluZyxuYW1lOnN0cmluZ30sY29tcGFueT8pe1xuICAgIGxldCB0b2RheSA9IG5ldyBEYXRlKClcbiAgICBsZXQgZHAgPSBuZXcgRGF0ZVBpcGUoXCJlblwiKVxuICAgIGlmKCFjb21wYW55KXtcbiAgICAgIGNvbXBhbnkgPSB0aGlzLmdldENvbXBhbnlJZCgpO1xuICAgIH1cbiAgICByZXR1cm4gXCJcIiArIGNvbXBhbnkgKyBcIi9cIiArIGRwLnRyYW5zZm9ybSh0b2RheSwgXCJ5TU1kZFwiKSArIFwiL1wiICsgU3RyaW5nKGZpbGUuaWQpLnN1YnN0cigyMCwgNikgKyBkcC50cmFuc2Zvcm0odG9kYXksIFwiaGhtbXNzU1NTXCIpICsgL1xcLlteXFwuXSsvLmV4ZWMoZmlsZS5uYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blvZPliY3nmbvlvZXnlKjmiLflhazlj7hJRFxuICAgKiBAcmV0dXJucyDlhazlj7hJRFxuICAgKi9cbiAgZ2V0Q29tcGFueUlkKCl7XG4gICAgLy8g6I635Y+W5YWs5Y+4SUTvvIzmiJbml6DmjIflrprlgLzvvIzliJnojrflj5Zsb2NhbFN0b3JhZ2XkuK1jb21wYW55XG4gICAgaWYodGhpcy5jb21wYW55KXtcbiAgICAgIHJldHVybiB0aGlzLmNvbXBhbnlcbiAgICB9XG4gICAgbGV0IGlkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJjb21wYW55XCIpXG4gICAgcmV0dXJuIGlkXG4gIH1cbiAgcWluaXVEb21haW46c3RyaW5nXG4gIGFzeW5jIHF1ZXJ5RG9tYWluKCkge1xuICAgIGxldCBDb21wYW55ID0gbmV3IFBhcnNlLlF1ZXJ5KCdDb21wYW55JylcbiAgICBsZXQgY29tcGFueSA9IGF3YWl0IENvbXBhbnkuZ2V0KHRoaXMuZ2V0Q29tcGFueUlkKCkpXG4gICAgaWYgKGNvbXBhbnkuZ2V0KFwiY29uZmlnUWluaXVcIikgJiYgY29tcGFueS5nZXQoXCJjb25maWdRaW5pdVwiKS5kb21haW4pIHtcbiAgICAgIGNvbnNvbGUubG9nKGNvbXBhbnkuZ2V0KFwiY29uZmlnUWluaXVcIikuZG9tYWluKVxuICAgICAgdGhpcy5xaW5pdURvbWFpbiA9IGNvbXBhbnkuZ2V0KFwiY29uZmlnUWluaXVcIikuZG9tYWluO1xuICAgIH0gZWxzZXtcbiAgICAgIHRoaXMucWluaXVEb21haW4gPSAnaHR0cHM6Ly9maWxlLWNsb3VkLmZtb2RlLmNuJztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5L+d5a2Y5LiK5Lyg5L+h5oGv6Iez6ZmE5Lu26KGoIEF0dGFjaG1lbnRcbiAgICogQHBhcmFtIGZpbGUg6ZmE5Lu25L+h5oGvXG4gICAqIEByZXR1cm5zIGF0dGFjaG1lbnQgUGFyc2UuT2JqZWN0XG4gICAqL1xuICBhc3luYyBzYXZlQXR0YWNobWVudChmaWxlOk5vdmFGaWxlfHt1cmw6c3RyaW5nLHNpemU6c3RyaW5nLG5hbWU6c3RyaW5nLHR5cGU6c3RyaW5nLG1kNT86c3RyaW5nfSxkb21haW4sY2F0ZUlkPyxjb21wYW55Pyk6UHJvbWlzZTxQYXJzZS5PYmplY3Q+IHtcbiAgICBsZXQgdXJsID0gZmlsZS51cmxcbiAgICBpZiAodXJsLnN0YXJ0c1dpdGgoXCJodHRwXCIpKSB7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdXJsID0gZG9tYWluICsgdXJsXG4gICAgfVxuICAgIHVybCA9IHVybC5yZXBsYWNlKC91bmRlZmluZWRcXC8vLCBcIlwiKTtcblxuXG4gICAgLy8g5biQ5aWX5Y+C5pWw6buY6K6k5Yqg6L295pys5Zyw5a2Y5YKoXG4gICAgaWYoIWNvbXBhbnkpe1xuICAgICAgY29tcGFueSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiY29tcGFueVwiKVxuICAgIH1cbiAgICBsZXQgdXNlciA9IFBhcnNlLlVzZXIuY3VycmVudCgpO1xuXG4gICAgLy8g5qOA5rWL5paH5Lu25piv5ZCm5a2Y5ZyoXG4gICAgbGV0IHF1ZXJ5ID0gbmV3IFBhcnNlLlF1ZXJ5KFwiQXR0YWNobWVudFwiKTtcbiAgICBxdWVyeS5lcXVhbFRvKFwidXJsXCIsIHVybCk7XG4gICAgbGV0IGF0dGFjaG1lbnQgPSBhd2FpdCBxdWVyeS5maXJzdCgpO1xuXG4gICAgaWYgKGF0dGFjaG1lbnQgJiYgYXR0YWNobWVudC5pZCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwi6K+l5paH5Lu25bey5a2Y5Zyo77yM5peg6ZyA6YeN5aSN5LiK5LygXCIpO1xuICAgICAgICByZXR1cm4gYXR0YWNobWVudFxuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBBdHRhY2htZW50ID0gUGFyc2UuT2JqZWN0LmV4dGVuZChcIkF0dGFjaG1lbnRcIilcbiAgICAgICAgYXR0YWNobWVudCA9IG5ldyBBdHRhY2htZW50KCk7XG4gICAgICAgIGF0dGFjaG1lbnQuc2V0KFwic2l6ZVwiLCBmaWxlLnNpemUpXG4gICAgICAgIGF0dGFjaG1lbnQuc2V0KFwidXJsXCIsIHVybClcbiAgICAgICAgYXR0YWNobWVudC5zZXQoXCJuYW1lXCIsIGZpbGUubmFtZSlcbiAgICAgICAgYXR0YWNobWVudC5zZXQoXCJtaW1lXCIsIGZpbGUudHlwZSlcbiAgICAgICAgYXR0YWNobWVudC5zZXQoXCJtZDVcIixmaWxlPy5tZDUpXG4gICAgICAgIGlmKHVzZXI/LmlkKXtcbiAgICAgICAgICBhdHRhY2htZW50LnNldChcInVzZXJcIix1c2VyLnRvUG9pbnRlcigpKVxuICAgICAgICB9XG4gICAgICAgIGlmKGNvbXBhbnkpe1xuICAgICAgICAgIGF0dGFjaG1lbnQuc2V0KFwiY29tcGFueVwiLCB7XG4gICAgICAgICAgICBfX3R5cGU6IFwiUG9pbnRlclwiLFxuICAgICAgICAgICAgY2xhc3NOYW1lOiBcIkNvbXBhbnlcIixcbiAgICAgICAgICAgIG9iamVjdElkOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImNvbXBhbnlcIilcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGlmIChjYXRlSWQpIHtcbiAgICAgICAgICAgIGF0dGFjaG1lbnQuc2V0KFwiY2F0ZWdvcnlcIiwge1xuICAgICAgICAgICAgICAgIF9fdHlwZTogXCJQb2ludGVyXCIsXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIkNhdGVnb3J5XCIsXG4gICAgICAgICAgICAgICAgb2JqZWN0SWQ6IGNhdGVJZFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgYXR0YWNobWVudC5zYXZlKClcbiAgICB9XG59XG5cbi8qKlxuICog5b2V5YOP5bm25LiK5LygXG4gKi9cbmFzeW5jIGNhcHR1cmVWaWRlbyhjb25mKTogUHJvbWlzZTxhbnk+e1xuICB0aGlzLnFpbml1Q29uZiA9IGNvbmY7XG4gIGlmKCF0aGlzLmlzQ2FwYWNpdG9yKCkpIHJldHVybjtcbiAgLy8ge1wibmFtZVwiOlwiVklEXzIwMjMwNTEzXzE4MjIzNS5tcDRcIixcImxvY2FsVVJMXCI6XCJodHRwczovL2xvY2FsaG9zdC9fX2NkdmZpbGVfc2RjYXJkX18vRENJTS9DYW1lcmEvVklEXzIwMjMwNTEzXzE4MjIzNS5tcDRcIixcInR5cGVcIjpcInZpZGVvL21wNFwiLFwibGFzdE1vZGlmaWVkXCI6bnVsbCxcImxhc3RNb2RpZmllZERhdGVcIjoxNjgzOTczMzU1MDAwLFwic2l6ZVwiOjYxMDAxNjEsXCJzdGFydFwiOjAsXCJlbmRcIjowLFwiZnVsbFBhdGhcIjpcImZpbGU6Ly8vc3RvcmFnZS9lbXVsYXRlZC8wL0RDSU0vQ2FtZXJhL1ZJRF8yMDIzMDUxM18xODIyMzUubXA0XCJ9XG4gIGxldCBtZWRpYUZpbGU6YW55ID0gYXdhaXQgdGhpcy5jYW1lcmFDYXB0dXJlVmlkZW9GaWxlKCk7XG4gIC8vIGxldCBtZWRpYURhdGE6c3RyaW5nID0gYXdhaXQgdGhpcy5nZXRNZWRpYUZpbGVEYXRhU3RyaW5nKG1lZGlhRmlsZSk7XG4gIGxldCBmaWxlQmxvYiA9IGF3YWl0IHRoaXMuZ2V0TWVkaWFGaWxlRGF0YVN0cmluZyhtZWRpYUZpbGUpO1xuICAvLyBsZXQgZmlsZUJsb2IgPSBhd2FpdCB0aGlzLmJhc2U2NFRvQmxvYlR5cGUobWVkaWFEYXRhLG1lZGlhRmlsZS50eXBlKTtcbiAgbGV0IHFpbml1RmlsZSA9IGF3YWl0IHRoaXMuc2F2ZVFpbml1TWVkaWFGaWxlKG1lZGlhRmlsZSxmaWxlQmxvYilcbiAgcmV0dXJuIHFpbml1RmlsZVxufVxuYXN5bmMgY2FtZXJhQ2FwdHVyZVZpZGVvRmlsZSgpOlByb21pc2U8TWVkaWFGaWxlfGFueXxudWxsPntcbiAgbGV0IG9wdGlvbnM6IENhcHR1cmVWaWRlb09wdGlvbnMgPSB7XG4gICAgbGltaXQ6MSxcbiAgICAvLyBxdWFsaXR5OjUwXG4gIH1cbiAgbGV0IG1lZGlhQ2FwdHVyZSA9IE1lZGlhQ2FwdHVyZTtcbiAgbGV0IGxpc3Q6TWVkaWFGaWxlW10gfCBDYXB0dXJlRXJyb3IgIHwgYW55PSBhd2FpdCBtZWRpYUNhcHR1cmUuY2FwdHVyZVZpZGVvKG9wdGlvbnMpXG4gIGlmKGxpc3Q/Lmxlbmd0aD4wKXtcbiAgICByZXR1cm4gbGlzdFswXVxuICB9XG4gIHJldHVybiBudWxsXG59XG5cblxuYXN5bmMgZ2V0TWVkaWFGaWxlRGF0YVN0cmluZyhtZWRpYWZpbGUpe1xuICBsZXQgZmlsZXN5c3RlbSA9IG5ldyBGaWxlc3lzdGVtV2ViKClcbiAgbGV0IHBhdGggPSBtZWRpYWZpbGUuZnVsbFBhdGgucmVwbGFjZUFsbChcIi8vL1wiLFwiLy9cIilcbiAgXG4gIGxldCBzdGF0ID0gYXdhaXQgRmlsZXN5c3RlbS5zdGF0KHsgcGF0aDptZWRpYWZpbGUuZnVsbFBhdGh9KTtcbiAgbGV0IHdlYlVyaSA9IENhcGFjaXRvci5jb252ZXJ0RmlsZVNyYyhzdGF0LnVyaSlcbiAgbGV0IGNvbnRlbnQgPSBhd2FpdCBmZXRjaCh3ZWJVcmkpXG4gIGxldCBibG9iID0gYXdhaXQgY29udGVudC5ibG9iKClcbiAgY29uc29sZS5sb2coYmxvYi5zaXplKVxuICBcbiAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoc3RhdCkpXG4gIC8vIENhcGFjaXRvckNvbnZlclxuXG4gIC8vIGZpbGU6Ly8vc3RvcmFnZS9lbXVsYXRlZC8wL0RDSU0vQ2FtZXJhL1ZJRF8yMDIzMDYxMl8xMjU5MDcwMzAubXA0XG4gIC8vIGxldCBmaWxlc3lzdGVtID0gRmlsZXN5c3RlbVxuICAvLyBsZXQgY29udGVudCA9IGF3YWl0IGZpbGVzeXN0ZW0ucmVhZEZpbGUoe1xuICAvLyAgIHBhdGg6bWVkaWFmaWxlLmZ1bGxQYXRoXG4gIC8vIH0pXG4gIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGNvbnRlbnQpKVxuICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShPYmplY3Qua2V5cyhjb250ZW50KSkpXG4gIC8vIGNvbnNvbGUubG9nKGNvbnRlbnQ/LmRhdGEpXG4gIGlmKGJsb2Ipe1xuICAgIHJldHVybiBibG9iXG4gIH1lbHNle1xuICAgIHRocm93IFwi6K+75Y+W5paH5Lu25aSx6LSlXCJcbiAgfVxufVxuICAvKipcbiAgICog5ouN54Wn5bm25LiK5LygXG4gICAqIEByZXR1cm5zIC0tIHtoYXNoPzpzdHJpbmcsdXJsOnN0cmluZyxuYW1lOnN0cmluZyxzaXplOm51bWJlcixrZXk6c3Rpcm5nfVxuICAgKi9cbiAgYXN5bmMgdGFrZVBpY3R1cmUoY29uZik6IFByb21pc2U8YW55PntcbiAgICB0aGlzLnFpbml1Q29uZiA9IGNvbmY7XG4gICAgaWYoIXRoaXMuaXNDYXBhY2l0b3IoKSkgcmV0dXJuXG4gICAgYXdhaXQgdGhpcy5nZXRVcHRva2VuKCk7XG4gICAgbGV0IGltYWdlID0gYXdhaXQgdGhpcy5jYW1lcmFUYWtlUGljdHVyZURhdGFVcmwoKVxuICAgIC8vIGltYWdlLmZvcm1hdFxuICAgIGlmKCFpbWFnZT8uZGF0YVVybCkgcmV0dXJuXG4gICAgbGV0IGJsb2IgPSBhd2FpdCB0aGlzLmJhc2U2NFRvQmxvYihpbWFnZT8uZGF0YVVybClcbiAgICBsZXQgcWluaXVGaWxlID0gYXdhaXQgdGhpcy5zYXZlUWluaXVJbWFnZUZpbGUoYmxvYixpbWFnZT8uZm9ybWF0KVxuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHFpbml1RmlsZSkpXG4gICAgLy8gdGhpcy5zYXZlQXR0YWNobWVudCgpXG4gICAgcmV0dXJuIHFpbml1RmlsZVxuICB9O1xuICBhc3luYyBjYW1lcmFUYWtlUGljdHVyZURhdGFVcmwoKXsgLy8gV2ViVXJsICsgQmFzZTY0XG4gICAgaWYoIXRoaXMuaXNDYXBhY2l0b3IoKSkgcmV0dXJuXG4gICAgY29uc3QgaW1hZ2UgPSBhd2FpdCBDYW1lcmEuZ2V0UGhvdG8oe1xuICAgICAgcXVhbGl0eTogOTAsXG4gICAgICBhbGxvd0VkaXRpbmc6IGZhbHNlLFxuICAgICAgLy8gc2F2ZVRvR2FsbGVyeTp0cnVlLFxuICAgICAgc291cmNlOkNhbWVyYVNvdXJjZS5DYW1lcmEsXG4gICAgICByZXN1bHRUeXBlOiBDYW1lcmFSZXN1bHRUeXBlLkRhdGFVcmxcbiAgICB9KTtcbiAgICByZXR1cm4gaW1hZ2U7XG4gIH1cblxuICBtYXhTaXplID0gNSAqIDEwMjQgKiAxMDI0XG4gIC8qKlxuICAgKiDkuIPniZvkuIrkvKDlh73mlbDvvJrml6DpnIDliY3nq6/nu4Tku7ZcbiAgICogQHBhcmFtIGltYWdlQmxvYjogQmxvYlxuICAgKiBAcGFyYW0gZm9ybWF0OiBzdHJpbmdcbiAgICovXG4gICBhc3luYyBzYXZlUWluaXVJbWFnZUZpbGUoaW1hZ2VCbG9iOiBCbG9iLGZvcm1hdDpzdHJpbmcsY29tcGFueT86c3RyaW5nLG9uUHJvZ3Jlc3M/OkZ1bmN0aW9uKTogUHJvbWlzZTxOb3ZhRmlsZXxhbnk+IHtcbiAgICAvLyBsZXQgdGhhdCA9IHRoaXNcbiAgICBsZXQgbWF4U2l6ZSA9IHRoaXMubWF4U2l6ZVxuICAgIGlmIChpbWFnZUJsb2Iuc2l6ZSA+IG1heFNpemUpIHtcbiAgICAgIGF3YWl0IGNvbnNvbGUubG9nKGDnhafniYfov4flpKfvvIzotoXlh7rpmZDliLY1TUJgKVxuICAgICAgdGhyb3cgXCLotoXlh7rmlofku7blpKflsI9cIlxuICAgIH1cbiAgICBsZXQgZHAgPSBuZXcgRGF0ZVBpcGUoXCJlblwiKVxuICAgIGxldCBpZCA9IGRwLnRyYW5zZm9ybShuZXcgRGF0ZSgpLCBcInl5eXlNTWRkSEhtbXNzXCIpXG4gICAgbGV0IG5hbWUgPSBgJHtpZH0uJHtmb3JtYXR9YFxuICAgIGxldCB0eXBlID0gYGltYWdlLyR7Zm9ybWF0fWBcbiAgICAvLyBsZXQgZmlsZSA9IG5ldyBGaWxlKFtpbWFnZUJsb2JdLCBmaWxlbmFtZSwgeyB0eXBlOiBcImltYWdlL2pwZWdcIiB9KVxuICAgIGxldCBwdXRFeHRyYSA9IHtcbiAgICAgIGZuYW1lOiBuYW1lLFxuICAgICAgcGFyYW1zOiB7fSxcbiAgICAgIG1pbWVUeXBlOiBcImltYWdlLypcIixcbiAgICB9XG4gICAgbGV0IGNvbmZpZyA9IHtcbiAgICAgIHVzZUNkbkRvbWFpbjogdHJ1ZSwgLy/kvb/nlKhjZG7liqDpgJ9cbiAgICAgIGZvcmNlRGlyZWN0OnRydWUgLy8g5by65Yi25LiN5YiG54mH77yM5pS+572u5LiK5Lyg5oql6ZSZXG4gICAgfVxuICAgIGNvbnNvbGUubG9nKHRoaXMucWluaXVDb25mKVxuXG4gICAgbGV0IHFpbml1RmlsZUtleSA9IHRoaXMuZ2VuRmlsZUtleSh7aWQ6aWQsbmFtZTpuYW1lfSlcbiAgICBjb25zb2xlLmxvZyhcIuWbvueJh+S4iuS8oOWJjVwiKVxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coXCLov5vlhaXkuobkuIrkvKBcIilcbiAgICAgICAgbGV0IG9ic2VydmFibGUgPSAocWluaXUgYXMgYW55KS51cGxvYWQoXG4gICAgICAgICAgaW1hZ2VCbG9iLFxuICAgICAgICAgIHFpbml1RmlsZUtleSxcbiAgICAgICAgICB0aGlzLnFpbml1Q29uZj8udXB0b2tlbixcbiAgICAgICAgICBwdXRFeHRyYSxcbiAgICAgICAgICBjb25maWdcbiAgICAgICAgKVxuICAgICAgICBvYnNlcnZhYmxlLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKHJlc3VsdF8yKSA9PiB7XG4gICAgICAgICAgICAvLyDkuLvopoHnlKjmnaXlsZXnpLrov5vluqZcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdF8yKVxuICAgICAgICAgICAgb25Qcm9ncmVzcyYmb25Qcm9ncmVzcyhyZXN1bHRfMilcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiBhc3luYyAoZXJyXzEpID0+IHtcbiAgICAgICAgICAgIC8vIHRoaXMuJG5vdGlmeSgn5LiK5Lyg5Zu+54mH5aSx6LSlJyk7XG4gICAgICAgICAgICAvLyBhd2FpdCB0aGF0LnByZXNlbnRUb2FzdChg5qOA5rWL5aSx6LSlYCwgMTUwMCwgXCJkYW5nZXJcIilcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycl8xKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgY29tcGxldGU6IChyZXNfMSkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCLkuIrkvKDlrozmiJBcIilcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAke3RoaXMucWluaXVDb25mPy5kb21haW59JHtyZXNfMS5rZXl9YClcbiAgICAgICAgICAgIHJlc18xLnVybCA9IGAke3RoaXMucWluaXVDb25mPy5kb21haW59JHtyZXNfMS5rZXl9YFxuICAgICAgICAgICAgcmVzXzEubmFtZSA9IG5hbWVcbiAgICAgICAgICAgIHJlc18xLnR5cGU9IHR5cGVcbiAgICAgICAgICAgIHJlc18xLnNpemUgPSBpbWFnZUJsb2Iuc2l6ZTtcbiAgICAgICAgICAgIHJlc29sdmUocmVzXzEpXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gIH1cbiAgYXN5bmMgc2F2ZVFpbml1TWVkaWFGaWxlKG1lZGlhZmlsZTphbnksZmlsZUJsb2I6IEJsb2IsY29tcGFueT86c3RyaW5nLG9uUHJvZ3Jlc3M/OkZ1bmN0aW9uKTogUHJvbWlzZTxOb3ZhRmlsZXxhbnk+IHtcbiAgICAvLyBsZXQgdGhhdCA9IHRoaXNcbiAgICBsZXQgbmFtZSA9IG1lZGlhZmlsZS5uYW1lXG4gICAgbGV0IHR5cGUgPSBtZWRpYWZpbGUudHlwZVxuICAgIGxldCBzaXplID0gbWVkaWFmaWxlLnNpemVcbiAgICBsZXQgbWF4U2l6ZSA9IDEwMCAqIDEwMjQgKiAxMDI0IC8vIOmZkDEwME1cbiAgICBpZiAoc2l6ZSA+IG1heFNpemUpIHtcbiAgICAgIGNvbnNvbGUubG9nKGDop4bpopHov4flpKfvvIzotoXlh7rpmZDliLYxMDBNQmApXG4gICAgICB0aHJvdyBcIui2heWHuuaWh+S7tuWkp+Wwj1wiXG4gICAgfVxuICAgIGxldCBkcCA9IG5ldyBEYXRlUGlwZShcImVuXCIpXG4gICAgbGV0IGlkID0gZHAudHJhbnNmb3JtKG5ldyBEYXRlKCksIFwieXl5eU1NZGRISG1tc3NcIilcbiAgICAvLyBsZXQgZmlsZSA9IG5ldyBGaWxlKFttZWRpYUJsb2JdLCBmaWxlbmFtZSwgeyB0eXBlOiBcImltYWdlL2pwZWdcIiB9KVxuICAgIGxldCBwdXRFeHRyYSA9IHtcbiAgICAgIGZuYW1lOiBuYW1lLFxuICAgICAgcGFyYW1zOiB7fSxcbiAgICAgIG1pbWVUeXBlOiB0eXBlLFxuICAgIH1cbiAgICBsZXQgY29uZmlnID0ge1xuICAgICAgdXNlQ2RuRG9tYWluOiB0cnVlLCAvL+S9v+eUqGNkbuWKoOmAn1xuICAgICAgZm9yY2VEaXJlY3Q6dHJ1ZSAvLyDlvLrliLbkuI3liIbniYfvvIzmlL7nva7kuIrkvKDmiqXplJlcbiAgICB9XG5cbiAgICBsZXQgcWluaXVGaWxlS2V5ID0gdGhpcy5nZW5GaWxlS2V5KHtpZDppZCxuYW1lOm5hbWV9KVxuICAgIGNvbnNvbGUubG9nKFwi5Zu+54mH5LiK5Lyg5YmNXCIpXG4gICAgY29uc29sZS5sb2cobWVkaWFmaWxlLm5hbWUsZmlsZUJsb2Iuc2l6ZSlcbiAgICBjb25zb2xlLmxvZyhmaWxlQmxvYi5zaXplKVxuICAgIGNvbnNvbGUubG9nKGZpbGVCbG9iLnNpemUvMTAyNC8xMDI0KVxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coXCLov5vlhaXkuobkuIrkvKBcIilcbiAgICAgICAgbGV0IG9ic2VydmFibGUgPSAocWluaXUgYXMgYW55KS51cGxvYWQoXG4gICAgICAgICAgZmlsZUJsb2IsXG4gICAgICAgICAgcWluaXVGaWxlS2V5LFxuICAgICAgICAgIHRoaXMucWluaXVDb25mPy51cHRva2VuLFxuICAgICAgICAgIHB1dEV4dHJhLFxuICAgICAgICAgIGNvbmZpZ1xuICAgICAgICApXG4gICAgICAgIG9ic2VydmFibGUuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAocmVzdWx0XzIpID0+IHtcbiAgICAgICAgICAgIC8vIOS4u+imgeeUqOadpeWxleekuui/m+W6plxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLkuLvopoHnlKjmnaXlsZXnpLrov5vluqZcIilcbiAgICAgICAgICAgIG9uUHJvZ3Jlc3MmJm9uUHJvZ3Jlc3MocmVzdWx0XzIpXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyZXN1bHRfMikpXG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogYXN5bmMgKGVycl8xKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIuS4iuS8oOWksei0pVwiKVxuICAgICAgICAgICAgLy8gdGhpcy4kbm90aWZ5KCfkuIrkvKDlm77niYflpLHotKUnKTtcbiAgICAgICAgICAgIC8vIGF3YWl0IHRoYXQucHJlc2VudFRvYXN0KGDmo4DmtYvlpLHotKVgLCAxNTAwLCBcImRhbmdlclwiKVxuICAgICAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoZXJyXzEpKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgY29tcGxldGU6IChyZXNfMSkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCLkuIrkvKDlrozmiJBcIilcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlc18xKSlcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGAke3RoaXMucWluaXVDb25mPy5kb21haW59JHtyZXNfMS5rZXl9YClcbiAgICAgICAgICAgIC8vIHJlc18xLnVybCA9IGAke3RoaXMucWluaXVDb25mPy5kb21haW59JHtyZXNfMS5rZXl9YFxuICAgICAgICAgICAgLy8gcmVzXzEubmFtZSA9IG5hbWVcbiAgICAgICAgICAgIC8vIHJlc18xLnR5cGU9IHR5cGVcbiAgICAgICAgICAgIC8vIHJlc18xLnNpemUgPSBzaXplO1xuICAgICAgICAgICAgbWVkaWFmaWxlLmtleSA9IHJlc18xLmtleVxuICAgICAgICAgICAgY29uc29sZS5sb2cobWVkaWFmaWxlLnR5cGUpXG4gICAgICAgICAgICBtZWRpYWZpbGUudXJsID0gYCR7dGhpcy5xaW5pdUNvbmY/LmRvbWFpbn0ke3Jlc18xLmtleX1gXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhtZWRpYWZpbGUudXJsKVxuICAgICAgICAgICAgcmVzb2x2ZShtZWRpYWZpbGUpXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gIH1cblxuICAvL3N0cmluZ+i9rEZpbGXmlofku7ZcbiAgYXN5bmMgYmFzZTY0VG9CbG9iVHlwZShzdHJpbmcsdHlwZSl7XG4gICAgbGV0IGJhc2U2NFJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYGRhdGE6JHt0eXBlfTtiYXNlNjQsJHtzdHJpbmd9YCk7XG4gICAgbGV0IGJsb2IgPSBhd2FpdCBiYXNlNjRSZXNwb25zZS5ibG9iKCk7XG4gICAgcmV0dXJuIGJsb2JcbiAgICBzdHJpbmcgPSBhdG9iKHN0cmluZylcbiAgICByZXR1cm4gbmV3IEJsb2IoW3N0cmluZ10se1xuICAgICAgdHlwZTp0eXBlXG4gICAgfSlcbiAgfVxuICAvL2Jhc2U2NOi9rEZpbGXmlofku7ZcbiAgYXN5bmMgYmFzZTY0VG9CbG9iKGJhc2U2NEltZzogc3RyaW5nKSB7XG4gICAgbGV0IGJhc2U2NFJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYmFzZTY0SW1nKTtcbiAgICBsZXQgYmxvYiA9IGF3YWl0IGJhc2U2NFJlc3BvbnNlLmJsb2IoKTtcbiAgICByZXR1cm4gYmxvYlxuICB9XG4gIGZpbGVUb0Jsb2IoZmlsZTpGaWxlKTpCbG9iIHtcbiAgICBjb25zdCBibG9iID0gZmlsZS5zbGljZSgwLCBmaWxlLnNpemUsIGZpbGUudHlwZSk7XG4gICAgcmV0dXJuIG5ldyBCbG9iKFtibG9iXSwgeyB0eXBlOiBmaWxlLnR5cGUgfSk7XG4gIH1cbiAgZ2VuTWQ1KGlucHV0U3RyaW5nOnN0cmluZyl7XG4gICAgcmV0dXJuIENyeXB0b0pTLk1ENShpbnB1dFN0cmluZykudG9TdHJpbmcoKTtcbiAgfVxufVxuIl19
|
|
8
|
+
import{DatePipe}from"@angular/common";import{Injectable}from"@angular/core";import{Platform}from"@ionic/angular";import{Camera,CameraResultType,CameraSource}from"@capacitor/camera";import{Capacitor}from"@capacitor/core";import{Filesystem}from"@capacitor/filesystem";import{FilesystemWeb}from"@capacitor/filesystem/dist/esm/web.js";import*as qiniu from"qiniu-js";import Parse from"parse";import{Diagnostic}from"@awesome-cordova-plugins/diagnostic/ngx";import CryptoJS from"crypto-js";import{MediaCapture}from"@awesome-cordova-plugins/media-capture";import{calcFileMd5}from"./util-file-md5";import*as i0 from"@angular/core";import*as i1 from"@ionic/angular";import*as i2 from"@awesome-cordova-plugins/diagnostic/ngx";export class NovaUploadService{constructor(e,i){this.platform=e,this.diagnostic=i,this.maxSize=5242880,this.getUptoken(!0),this.requestPermission(),this.queryDomain()}async upload(e,i){let t,a=e.type,o=e.name?.split("."),r=o[o.length-1];try{t=await calcFileMd5(e)}catch(e){}let n,s,l=this.fileToBlob(e);return n=a.indexOf("image")>-1?await this.saveQiniuImageFile(l,r,null,i):await this.saveQiniuMediaFile(e,l,null,i),n.md5=t,n?.url?.indexOf("undefined")>-1&&(n.url=(this.qiniuDomain||"https://file-cloud.fmode.cn/")+n.url.replace("undefined/","")),n?.url&&(s=await this.saveAttachment(n,this.qiniuDomain,null,this.getCompanyId())),s?.id&&(n.id=s?.id),n}isCapacitor(){return this.platform.is("capacitor")||this.platform.is("cordova")}async requestPermission(){this.isCapacitor()&&(await this.requestStoagePermission(),await this.requestCameraPermission())}async requestStoagePermission(){let e=await this.diagnostic.isExternalStorageAuthorized();if(console.log("permisson_STORAGE:",e),!e){await this.diagnostic.requestExternalStorageAuthorization()}}async requestCameraPermission(){let e=await this.diagnostic.isCameraAuthorized();if(console.log("permisson_Camera:",e),!e){await this.diagnostic.requestCameraAuthorization()}}async getUptoken(e=!1){if(console.log("getUptoken"),this.qiniuConf||e)try{console.log(this.getCompanyId());let e=await Parse.Cloud.run("qiniu_uptoken",{company:this.getCompanyId()});console.log(e),this.qiniuConf=e}catch(e){console.error(e)}}genFileKey(e,i){let t=new Date,a=new DatePipe("en");return i||(i=this.getCompanyId()),i+"/"+a.transform(t,"yMMdd")+"/"+String(e.id).substr(20,6)+a.transform(t,"hhmmssSSS")+/\.[^\.]+/.exec(e.name)}getCompanyId(){if(this.company)return this.company;return localStorage.getItem("company")}async queryDomain(){let e=new Parse.Query("Company"),i=await e.get(this.getCompanyId());i.get("configQiniu")&&i.get("configQiniu").domain?(console.log(i.get("configQiniu").domain),this.qiniuDomain=i.get("configQiniu").domain):this.qiniuDomain="https://file-cloud.fmode.cn"}async saveAttachment(e,i,t,a){let o=e.url;o.startsWith("http")||(o=i+o),o=o.replace(/undefined\//,""),a||(a=localStorage.getItem("company"));let r=Parse.User.current(),n=new Parse.Query("Attachment");n.equalTo("url",o);let s=await n.first();if(s&&s.id)return console.error("该文件已存在,无需重复上传"),s;return s=new(Parse.Object.extend("Attachment")),s.set("size",e.size),s.set("url",o),s.set("name",e.name),s.set("mime",e.type),s.set("md5",e?.md5),r?.id&&s.set("user",r.toPointer()),a&&s.set("company",{__type:"Pointer",className:"Company",objectId:localStorage.getItem("company")}),t&&s.set("category",{__type:"Pointer",className:"Category",objectId:t}),await s.save()}async captureVideo(e){if(this.qiniuConf=e,!this.isCapacitor())return;let i=await this.cameraCaptureVideoFile(),t=await this.getMediaFileDataString(i);return await this.saveQiniuMediaFile(i,t)}async cameraCaptureVideoFile(){let e=MediaCapture,i=await e.captureVideo({limit:1});return i?.length>0?i[0]:null}async getMediaFileDataString(e){new FilesystemWeb,e.fullPath.replaceAll("///","//");let i=await Filesystem.stat({path:e.fullPath}),t=Capacitor.convertFileSrc(i.uri),a=await fetch(t),o=await a.blob();if(console.log(o.size),console.log(JSON.stringify(i)),console.log(JSON.stringify(a)),console.log(JSON.stringify(Object.keys(a))),o)return o;throw"读取文件失败"}async takePicture(e){if(this.qiniuConf=e,!this.isCapacitor())return;await this.getUptoken();let i=await this.cameraTakePictureDataUrl();if(!i?.dataUrl)return;let t=await this.base64ToBlob(i?.dataUrl),a=await this.saveQiniuImageFile(t,i?.format);return console.log(JSON.stringify(a)),a}async cameraTakePictureDataUrl(){if(!this.isCapacitor())return;return await Camera.getPhoto({quality:90,allowEditing:!1,source:CameraSource.Camera,resultType:CameraResultType.DataUrl})}async saveQiniuImageFile(e,i,t,a){let o=this.maxSize;if(e.size>o)throw await console.log("照片过大,超出限制5MB"),"超出文件大小";let r=new DatePipe("en").transform(new Date,"yyyyMMddHHmmss"),n=`${r}.${i}`,s=`image/${i}`,l={fname:n,params:{},mimeType:"image/*"},c={useCdnDomain:!0,forceDirect:!0};console.log(this.qiniuConf);let m=this.genFileKey({id:r,name:n});return console.log("图片上传前"),new Promise(((i,t)=>{console.log("进入了上传"),qiniu.upload(e,m,this.qiniuConf?.uptoken,l,c).subscribe({next:e=>{console.log(e),a&&a(e)},error:async e=>{console.log(e)},complete:t=>{console.log("上传完成"),console.log(`${this.qiniuConf?.domain}${t.key}`),t.url=`${this.qiniuConf?.domain}${t.key}`,t.name=n,t.type=s,t.size=e.size,i(t)}})}))}async saveQiniuMediaFile(e,i,t,a){let o=e.name,r=e.type;if(e.size>104857600)throw console.log("视频过大,超出限制100MB"),"超出文件大小";let n=new DatePipe("en").transform(new Date,"yyyyMMddHHmmss"),s={fname:o,params:{},mimeType:r},l={useCdnDomain:!0,forceDirect:!0},c=this.genFileKey({id:n,name:o});return console.log("图片上传前"),console.log(e.name,i.size),console.log(i.size),console.log(i.size/1024/1024),new Promise(((t,o)=>{console.log("进入了上传"),qiniu.upload(i,c,this.qiniuConf?.uptoken,s,l).subscribe({next:e=>{console.log("主要用来展示进度"),a&&a(e),console.log(JSON.stringify(e))},error:async e=>{console.log("上传失败"),console.log(JSON.stringify(e))},complete:i=>{console.log("上传完成"),console.log(JSON.stringify(i)),e.key=i.key,console.log(e.type),e.url=`${this.qiniuConf?.domain}${i.key}`,console.log(e.url),t(e)}})}))}async base64ToBlobType(e,i){let t=await fetch(`data:${i};base64,${e}`);return await t.blob()}async base64ToBlob(e){let i=await fetch(e);return await i.blob()}fileToBlob(e){const i=e.slice(0,e.size,e.type);return new Blob([i],{type:e.type})}genMd5(e){return CryptoJS.MD5(e).toString()}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:NovaUploadService,deps:[{token:i1.Platform},{token:i2.Diagnostic}],target:i0.ɵɵFactoryTarget.Injectable})}static{this.ɵprov=i0.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:NovaUploadService,providedIn:"root"})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:NovaUploadService,decorators:[{type:Injectable,args:[{providedIn:"root"}]}],ctorParameters:()=>[{type:i1.Platform},{type:i2.Diagnostic}]});
|
|
9
|
+
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9zdG9yYWdlL3NlcnZpY2UtdXBsb2FkL25vdmEtdXBsb2FkLnNlcnZpY2UubWpz`
|
|
10
|
+
|
|
@@ -1,28 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const hash = spark.end();
|
|
12
|
-
resolve(hash);
|
|
13
|
-
}
|
|
14
|
-
else {
|
|
15
|
-
reject(new Error("Failed to load file"));
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
catch (error) {
|
|
19
|
-
reject(error);
|
|
20
|
-
}
|
|
21
|
-
};
|
|
22
|
-
reader.onerror = (error) => {
|
|
23
|
-
reject(error);
|
|
24
|
-
};
|
|
25
|
-
reader.readAsArrayBuffer(file);
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC1maWxlLW1kNS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Ztb2RlLW5nL3NyYy9saWIvc3RvcmFnZS9zZXJ2aWNlLXVwbG9hZC91dGlsLWZpbGUtbWQ1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sUUFBUSxNQUFNLFdBQVcsQ0FBQztBQUNqQyxNQUFNLFVBQVUsV0FBVyxDQUFDLElBQVU7SUFDbEMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNuQyxNQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN0QixJQUFJLENBQUM7Z0JBQ0QsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7Z0JBQ2xDLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQ1AsTUFBTSxLQUFLLEdBQUcsSUFBSSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQ3pDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBbUIsQ0FBQyxDQUFDO29CQUNsQyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBQ3pCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbEIsQ0FBQztxQkFBTSxDQUFDO29CQUNKLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7Z0JBQzdDLENBQUM7WUFDTCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDYixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEIsQ0FBQztRQUNMLENBQUMsQ0FBQztRQUNGLE1BQU0sQ0FBQyxPQUFPLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN2QixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEIsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTcGFya01ENSBmcm9tICdzcGFyay1tZDUnO1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGNGaWxlTWQ1KGZpbGU6IEZpbGUpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGV2ZW50LnRhcmdldD8ucmVzdWx0O1xuICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwYXJrID0gbmV3IFNwYXJrTUQ1LkFycmF5QnVmZmVyKCk7XG4gICAgICAgICAgICAgICAgICAgIHNwYXJrLmFwcGVuZChkYXRhIGFzIEFycmF5QnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFzaCA9IHNwYXJrLmVuZCgpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGhhc2gpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJGYWlsZWQgdG8gbG9hZCBmaWxlXCIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJlYWRlci5vbmVycm9yID0gKGVycm9yKSA9PiB7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9O1xuICAgICAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZSk7XG4gICAgfSk7XG59XG4iXX0=
|
|
1
|
+
|
|
2
|
+
/**
|
|
3
|
+
* @copyright © 未来飞马 © 未来全栈 www.fmode.cn
|
|
4
|
+
* 版权所有 © 未来飞马 © 江西脑控科技有限公司 Copyright © Fmode Technology Co., Ltd.
|
|
5
|
+
* 保留所有权利 All Rights Reserved.
|
|
6
|
+
* /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/storage/service-upload/util-file-md5.mjs
|
|
7
|
+
*/
|
|
8
|
+
import SparkMD5 from"spark-md5";export function calcFileMd5(r){return new Promise(((e,o)=>{const n=new FileReader;n.onload=r=>{try{const n=r.target?.result;if(n){const r=new SparkMD5.ArrayBuffer;r.append(n);const o=r.end();e(o)}else o(new Error("Failed to load file"))}catch(r){o(r)}},n.onerror=r=>{o(r)},n.readAsArrayBuffer(r)}))}
|
|
9
|
+
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9zdG9yYWdlL3NlcnZpY2UtdXBsb2FkL3V0aWwtZmlsZS1tZDUubWpz`
|
|
10
|
+
|