template-replacement 3.3.2 → 3.3.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.
- package/dist/{base-BuKBOMgk.js → base-CJv023nf.js} +127 -112
- package/dist/main/general.js +838 -816
- package/dist/main/sign.js +731 -707
- package/dist/replace/general.js +72 -67
- package/dist/replace/sign.js +134 -127
- package/fileSystem/db/index.ts +1 -1
- package/fileSystem/db/indexedDBCache.ts +67 -51
- package/helper/index.ts +29 -12
- package/index.ts +4 -12
- package/office/zip.ts +3 -3
- package/package.json +8 -8
- package/replace/base.ts +30 -22
- package/replace/general.ts +9 -4
- package/replace/image.ts +6 -2
- package/replace/paramsData.ts +1 -1
- package/replace/sign.ts +19 -10
- package/task/urlDownloadTask.ts +10 -17
- package/temp/index.ts +7 -14
- package/worker/index.ts +4 -2
package/fileSystem/db/index.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import _init from '../../worker/child/base';
|
|
1
2
|
|
|
2
3
|
type templateData<T> = {
|
|
3
|
-
|
|
4
|
-
data: T
|
|
4
|
+
key: string // 主键
|
|
5
|
+
data: T // 文件数据
|
|
5
6
|
}
|
|
6
7
|
|
|
7
8
|
export default class indexedDBCache {
|
|
@@ -9,10 +10,12 @@ export default class indexedDBCache {
|
|
|
9
10
|
_isInitFinish: boolean = false //是否初始化完成
|
|
10
11
|
|
|
11
12
|
_db?: IDBDatabase //数据库
|
|
12
|
-
_dbName: string = '
|
|
13
|
+
_dbName: string = 'template_replacement_db' //数据库名
|
|
13
14
|
_dbversion: number = 1 //数据库版本
|
|
14
|
-
_cacheTableName: string = '
|
|
15
|
-
_tableMap:
|
|
15
|
+
_cacheTableName: string = 'template_files' //表名
|
|
16
|
+
_tableMap: unknown = {} //表配置
|
|
17
|
+
|
|
18
|
+
_init: Promise<unknown> | undefined
|
|
16
19
|
|
|
17
20
|
|
|
18
21
|
// 构造函数
|
|
@@ -21,7 +24,10 @@ export default class indexedDBCache {
|
|
|
21
24
|
}
|
|
22
25
|
|
|
23
26
|
initDB(): Promise<any> {
|
|
24
|
-
|
|
27
|
+
if (this._init) {
|
|
28
|
+
return this._init
|
|
29
|
+
}
|
|
30
|
+
this._init = new Promise((resolve, reject) => {
|
|
25
31
|
const request = indexedDB.open(this._dbName, this._dbversion) // 打开数据库
|
|
26
32
|
// 数据库初始化成功
|
|
27
33
|
request.onsuccess = (event) => {
|
|
@@ -48,12 +54,14 @@ export default class indexedDBCache {
|
|
|
48
54
|
let db = request.result
|
|
49
55
|
if (!db.objectStoreNames.contains(this._cacheTableName)) {
|
|
50
56
|
db.createObjectStore(this._cacheTableName, {
|
|
51
|
-
keyPath: '
|
|
57
|
+
keyPath: 'key', // 设置主键
|
|
52
58
|
})
|
|
53
59
|
}
|
|
54
60
|
resolve(event)
|
|
55
61
|
}
|
|
56
62
|
})
|
|
63
|
+
|
|
64
|
+
return this._init
|
|
57
65
|
}
|
|
58
66
|
|
|
59
67
|
async awaitInit(): Promise<void> {
|
|
@@ -78,67 +86,75 @@ export default class indexedDBCache {
|
|
|
78
86
|
|
|
79
87
|
/**
|
|
80
88
|
* @description : 更新数据
|
|
81
|
-
* @param {
|
|
89
|
+
* @param {templateData} params 添加到数据库中的数据 { key: 文件key, data: 文件blob }
|
|
82
90
|
* @return {*}
|
|
83
91
|
*/
|
|
84
92
|
putData<T>(params: templateData<T>): Promise<any> {
|
|
85
|
-
return new Promise(
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
93
|
+
return new Promise((resolve, reject) => {
|
|
94
|
+
this.store('readwrite').then(store => {
|
|
95
|
+
const response = store.put(params)
|
|
96
|
+
// 操作成功
|
|
97
|
+
response.onsuccess = (event) => {
|
|
98
|
+
resolve(event)
|
|
99
|
+
}
|
|
100
|
+
// 操作失败
|
|
101
|
+
response.onerror = (event) => {
|
|
102
|
+
reject(event)
|
|
103
|
+
}
|
|
104
|
+
}).catch(reject)
|
|
95
105
|
})
|
|
96
106
|
}
|
|
97
107
|
|
|
98
108
|
// 通过主键读取数据
|
|
99
109
|
getDataByKey<T>(key: string): Promise<templateData<T>> {
|
|
100
|
-
return new Promise(
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
110
|
+
return new Promise((resolve, reject) => {
|
|
111
|
+
this.store().then(store => {
|
|
112
|
+
// 通过主键读取数据
|
|
113
|
+
const request = store.get(key)
|
|
114
|
+
// 操作成功
|
|
115
|
+
request.onsuccess = () => {
|
|
116
|
+
resolve(request.result)
|
|
117
|
+
}
|
|
118
|
+
// 操作失败
|
|
119
|
+
request.onerror = (event) => {
|
|
120
|
+
reject(event)
|
|
121
|
+
}
|
|
122
|
+
}).catch(reject)
|
|
111
123
|
})
|
|
112
124
|
}
|
|
113
125
|
|
|
114
126
|
// 通过主键移除数据
|
|
115
|
-
deleteDataByKey
|
|
116
|
-
return new Promise(
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
+
deleteDataByKey(key: string): Promise<void> {
|
|
128
|
+
return new Promise((resolve, reject) => {
|
|
129
|
+
this.store().then(store => {
|
|
130
|
+
// 通过主键读取数据
|
|
131
|
+
const request = store.delete(key)
|
|
132
|
+
// 操作成功
|
|
133
|
+
request.onsuccess = () => {
|
|
134
|
+
resolve(request.result)
|
|
135
|
+
}
|
|
136
|
+
// 操作失败
|
|
137
|
+
request.onerror = (event) => {
|
|
138
|
+
reject(event)
|
|
139
|
+
}
|
|
140
|
+
}).catch(reject)
|
|
127
141
|
})
|
|
128
142
|
}
|
|
129
143
|
|
|
130
144
|
// 清空数据库数据
|
|
131
145
|
clearDB(): Promise<any> {
|
|
132
|
-
return new Promise(
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
146
|
+
return new Promise((resolve, reject) => {
|
|
147
|
+
this.store('readwrite').then(store => {
|
|
148
|
+
const response = store.clear()
|
|
149
|
+
// 操作成功
|
|
150
|
+
response.onsuccess = (event) => {
|
|
151
|
+
resolve(event)
|
|
152
|
+
}
|
|
153
|
+
// 操作失败
|
|
154
|
+
response.onerror = (event) => {
|
|
155
|
+
reject(event)
|
|
156
|
+
}
|
|
157
|
+
}).catch(reject)
|
|
142
158
|
})
|
|
143
159
|
}
|
|
144
160
|
|
package/helper/index.ts
CHANGED
|
@@ -46,9 +46,13 @@ export function fileTypeByName(name: string): fileTypes {
|
|
|
46
46
|
|
|
47
47
|
export async function fileTypeByBuffer(buffer: Uint8Array|ArrayBuffer|Blob): Promise<fileTypes> {
|
|
48
48
|
if (buffer instanceof Blob) {
|
|
49
|
+
if (buffer.type && officeMIMETypes[buffer.type]) {
|
|
50
|
+
return officeMIMETypes[buffer.type]
|
|
51
|
+
}
|
|
49
52
|
buffer = await buffer.arrayBuffer()
|
|
50
53
|
}
|
|
51
54
|
const type = await fileTypeFromBuffer(buffer)
|
|
55
|
+
|
|
52
56
|
if (type && officeMIMETypes[type.mime]) {
|
|
53
57
|
return officeMIMETypes[type.mime]
|
|
54
58
|
}
|
|
@@ -64,21 +68,23 @@ export type fileArrayBufferData = {
|
|
|
64
68
|
buffer: ArrayBuffer
|
|
65
69
|
}
|
|
66
70
|
|
|
67
|
-
export
|
|
68
|
-
const awaits = []
|
|
71
|
+
export function filesReaderArrayBuffer(files: File[]): Promise<fileArrayBufferData[]> {
|
|
72
|
+
const awaits: Promise<fileArrayBufferData>[] = []
|
|
69
73
|
for (const file of files) {
|
|
70
|
-
awaits.push(new Promise(
|
|
74
|
+
awaits.push(new Promise((resolve, reject) => {
|
|
71
75
|
try {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
+
file.arrayBuffer().then(buffer => {
|
|
77
|
+
resolve({
|
|
78
|
+
name: file.name,
|
|
79
|
+
buffer
|
|
80
|
+
})
|
|
81
|
+
}).catch(reject)
|
|
76
82
|
} catch (error) {
|
|
77
83
|
reject(error)
|
|
78
84
|
}
|
|
79
85
|
}))
|
|
80
86
|
}
|
|
81
|
-
return
|
|
87
|
+
return Promise.all(awaits)
|
|
82
88
|
}
|
|
83
89
|
|
|
84
90
|
|
|
@@ -87,8 +93,8 @@ export type fileBase64Data = {
|
|
|
87
93
|
base64: string
|
|
88
94
|
}
|
|
89
95
|
|
|
90
|
-
export
|
|
91
|
-
const awaits = []
|
|
96
|
+
export function filesReaderBase64(files: File[]): Promise<fileBase64Data[]> {
|
|
97
|
+
const awaits: Promise<fileBase64Data>[] = []
|
|
92
98
|
for (const file of files) {
|
|
93
99
|
awaits.push(new Promise((resolve, reject) => {
|
|
94
100
|
const fileReader = new FileReader()
|
|
@@ -116,7 +122,7 @@ export async function filesReaderBase64(files: File[]): Promise<fileBase64Data[]
|
|
|
116
122
|
fileReader.readAsDataURL(file)
|
|
117
123
|
}))
|
|
118
124
|
}
|
|
119
|
-
return
|
|
125
|
+
return Promise.all(awaits)
|
|
120
126
|
}
|
|
121
127
|
|
|
122
128
|
export function base64ToBlob(base64: string): Blob {
|
|
@@ -157,4 +163,15 @@ export function splitArrayIntoChunks<T>(array: T[], chunkSize: number): T[][] {
|
|
|
157
163
|
result.push(chunk)
|
|
158
164
|
}
|
|
159
165
|
return result
|
|
160
|
-
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// 字符串SHA-1哈希值
|
|
169
|
+
export async function hashString(str: string): Promise<string> {
|
|
170
|
+
const encoder = new TextEncoder();
|
|
171
|
+
const data = encoder.encode(str);
|
|
172
|
+
const hashBuffer = await window.crypto.subtle.digest("SHA-1", data);
|
|
173
|
+
const hashArray = Array.from(new Uint8Array(hashBuffer));
|
|
174
|
+
return hashArray
|
|
175
|
+
.map((b) => b.toString(16).padStart(2, "0"))
|
|
176
|
+
.join("");
|
|
177
|
+
}
|
package/index.ts
CHANGED
|
@@ -4,21 +4,13 @@ import workerGeneral from './dispatcher/workerGeneral'
|
|
|
4
4
|
import workerSign from './dispatcher/workerSign'
|
|
5
5
|
import ReplaceInterface from './replace/interface'
|
|
6
6
|
|
|
7
|
-
export
|
|
8
|
-
return general()
|
|
9
|
-
}
|
|
7
|
+
export const General = general
|
|
10
8
|
|
|
11
|
-
export
|
|
12
|
-
return sign()
|
|
13
|
-
}
|
|
9
|
+
export const Sign = sign
|
|
14
10
|
|
|
15
|
-
export
|
|
16
|
-
return workerGeneral(concurrency)
|
|
17
|
-
}
|
|
11
|
+
export const WorkerGeneral = workerGeneral
|
|
18
12
|
|
|
19
|
-
export
|
|
20
|
-
return workerSign(concurrency)
|
|
21
|
-
}
|
|
13
|
+
export const WorkerSign = workerSign
|
|
22
14
|
|
|
23
15
|
type signFun = (data: any) => Promise<string>;
|
|
24
16
|
|
package/office/zip.ts
CHANGED
|
@@ -27,7 +27,7 @@ export default class Zip {
|
|
|
27
27
|
const blob = this.getFileBlob()
|
|
28
28
|
if (blob) {
|
|
29
29
|
const arrayBuffer = await blob.arrayBuffer()
|
|
30
|
-
this._unzipData = await new Promise(
|
|
30
|
+
this._unzipData = await new Promise((resolve, reject) => {
|
|
31
31
|
unzip(new Uint8Array(arrayBuffer), (err: FlateError | null, data: Unzipped) => {
|
|
32
32
|
if (err) {
|
|
33
33
|
return reject(err)
|
|
@@ -72,12 +72,12 @@ export default class Zip {
|
|
|
72
72
|
if (!Object.keys(data).length) {
|
|
73
73
|
return undefined
|
|
74
74
|
}
|
|
75
|
-
return await new Promise(
|
|
75
|
+
return await new Promise((resolve, reject) => {
|
|
76
76
|
zip(data, options, (err: FlateError | null, data: Uint8Array) => {
|
|
77
77
|
if (err) {
|
|
78
78
|
return reject(err)
|
|
79
79
|
}
|
|
80
|
-
resolve(new Blob([data]))
|
|
80
|
+
resolve(new Blob([data as BlobPart]))
|
|
81
81
|
})
|
|
82
82
|
})
|
|
83
83
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "template-replacement",
|
|
3
3
|
"description": "模板文件替换",
|
|
4
|
-
"version": "3.3.
|
|
4
|
+
"version": "3.3.3",
|
|
5
5
|
"author": "fushiliang <994301536@qq.com>",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "index.ts",
|
|
@@ -10,20 +10,20 @@
|
|
|
10
10
|
"build": "npx vite build --config vite.config.ts"
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"
|
|
14
|
-
"axios": "^1.13.1",
|
|
13
|
+
"axios": "^1.13.2",
|
|
15
14
|
"fflate": "^0.8.2",
|
|
16
15
|
"file-type": "^19.6.0",
|
|
17
16
|
"streamsaver": "^2.0.6",
|
|
18
17
|
"template-replacement-core-wasm": "^1.4.0",
|
|
19
|
-
"template-replacement-sign-core-wasm": "^1.4.0"
|
|
20
|
-
"vite-plugin-wasm-pack": "^0.1.12"
|
|
18
|
+
"template-replacement-sign-core-wasm": "^1.4.0"
|
|
21
19
|
},
|
|
22
20
|
"devDependencies": {
|
|
23
|
-
"
|
|
21
|
+
"@types/streamsaver": "^2.0.5",
|
|
22
|
+
"terser": "^5.44.1",
|
|
24
23
|
"typescript": "^5.9.3",
|
|
25
|
-
"vite": "^7.
|
|
26
|
-
"vite-plugin-dts": "^4.5.4"
|
|
24
|
+
"vite": "^7.2.2",
|
|
25
|
+
"vite-plugin-dts": "^4.5.4",
|
|
26
|
+
"vite-plugin-wasm-pack": "^0.1.12"
|
|
27
27
|
},
|
|
28
28
|
"keywords": [
|
|
29
29
|
"template-replacement"
|
package/replace/base.ts
CHANGED
|
@@ -27,12 +27,16 @@ export default class Base implements Interface{
|
|
|
27
27
|
const data: Record<string, string[]> = {}
|
|
28
28
|
const tasks = []
|
|
29
29
|
for (const file of files) {
|
|
30
|
-
tasks.push(new Promise<void>(async
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
30
|
+
tasks.push(new Promise<void>(async resolve => {
|
|
31
|
+
try {
|
|
32
|
+
const buffer = await file.getBuffer()
|
|
33
|
+
if (buffer && (file.isDecode || (await file.type()) !== fileTypes.unknown)) {
|
|
34
|
+
data[file.name] = await this.#core.extract_one_file_variable_names(buffer, file.isDecode)
|
|
35
|
+
}
|
|
36
|
+
resolve()
|
|
37
|
+
} catch (error) {
|
|
38
|
+
console.error(error)
|
|
34
39
|
}
|
|
35
|
-
resolve()
|
|
36
40
|
}))
|
|
37
41
|
}
|
|
38
42
|
await Promise.all(tasks)
|
|
@@ -46,23 +50,27 @@ export default class Base implements Interface{
|
|
|
46
50
|
const data: Record<string, media[]> = {}
|
|
47
51
|
const tasks = []
|
|
48
52
|
for (const file of files) {
|
|
49
|
-
tasks.push(new Promise<void>(async
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
53
|
+
tasks.push(new Promise<void>(async resolve => {
|
|
54
|
+
try {
|
|
55
|
+
const buffer = await file.getBuffer()
|
|
56
|
+
if (buffer && (file.isDecode || (await file.type()) !== fileTypes.unknown)) {
|
|
57
|
+
let medias = await this.#core.extract_one_file_medias(buffer, file.isDecode)
|
|
58
|
+
data[file.name] = []
|
|
59
|
+
if (medias && Array.isArray(medias)) {
|
|
60
|
+
for (const m of medias) {
|
|
61
|
+
if (m.id && m.data) {
|
|
62
|
+
data[file.name].push({
|
|
63
|
+
id: m.id,
|
|
64
|
+
data: new Uint8Array(m.data)
|
|
65
|
+
})
|
|
66
|
+
}
|
|
61
67
|
}
|
|
62
68
|
}
|
|
63
69
|
}
|
|
70
|
+
resolve()
|
|
71
|
+
} catch (error) {
|
|
72
|
+
console.error(error)
|
|
64
73
|
}
|
|
65
|
-
resolve()
|
|
66
74
|
}))
|
|
67
75
|
}
|
|
68
76
|
await Promise.all(tasks)
|
|
@@ -218,11 +226,11 @@ export default class Base implements Interface{
|
|
|
218
226
|
return result
|
|
219
227
|
}
|
|
220
228
|
|
|
221
|
-
|
|
222
|
-
return
|
|
229
|
+
fileEncrypt(file: Uint8Array): Promise<Uint8Array> {
|
|
230
|
+
return this.#core.file_encrypt(file)
|
|
223
231
|
}
|
|
224
232
|
|
|
225
|
-
|
|
226
|
-
return
|
|
233
|
+
filesEncrypt(files: (Uint8Array)[]): Promise<(Uint8Array)[]> {
|
|
234
|
+
return this.#core.files_encrypt(files)
|
|
227
235
|
}
|
|
228
236
|
}
|
package/replace/general.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import Base from './base';
|
|
2
2
|
import core, { replace_batch, replace_batch_multiple_params } from '../core/general'
|
|
3
|
-
import paramsData from './paramsData';
|
|
3
|
+
import paramsData, { replaceParams } from './paramsData';
|
|
4
4
|
|
|
5
5
|
export default class General extends Base {
|
|
6
6
|
constructor() {
|
|
@@ -13,11 +13,16 @@ export default class General extends Base {
|
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
async handleMultipleParams(paramsList: paramsData[], files: Uint8Array[], isDecode: boolean = false): Promise<Uint8Array[]> {
|
|
16
|
-
|
|
16
|
+
const mediaBuffers: Uint8Array[] = [],
|
|
17
|
+
newParamsListTasks: Promise<replaceParams>[] = []
|
|
17
18
|
for (const paramsData of paramsList) {
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
newParamsListTasks.push(new Promise<replaceParams>((resolve, reject) => {
|
|
20
|
+
paramsData.toReplaceParams(mediaBuffers).then(([params]) => {
|
|
21
|
+
resolve(params)
|
|
22
|
+
}).catch(reject)
|
|
23
|
+
}))
|
|
20
24
|
}
|
|
25
|
+
const newParamsList = await Promise.all(newParamsListTasks)
|
|
21
26
|
return replace_batch_multiple_params(newParamsList, mediaBuffers, files, isDecode)
|
|
22
27
|
}
|
|
23
28
|
}
|
package/replace/image.ts
CHANGED
|
@@ -79,14 +79,18 @@ export default class image {
|
|
|
79
79
|
if (this.file.size) {
|
|
80
80
|
try {
|
|
81
81
|
const bitmap = await createImageBitmap(this.file)
|
|
82
|
-
|
|
82
|
+
if (this.wpExtent) {
|
|
83
|
+
this.setPxExtent(bitmap.width, bitmap.height)
|
|
84
|
+
}
|
|
83
85
|
bitmap.close()
|
|
84
86
|
return this.wpExtent!
|
|
85
87
|
} catch (error) {
|
|
86
88
|
console.error(error)
|
|
87
89
|
}
|
|
88
90
|
}
|
|
89
|
-
!this.wpExtent
|
|
91
|
+
if (!this.wpExtent) {
|
|
92
|
+
this.setPxExtent(0, 0)
|
|
93
|
+
}
|
|
90
94
|
}
|
|
91
95
|
return this.wpExtent!
|
|
92
96
|
}
|
package/replace/paramsData.ts
CHANGED
package/replace/sign.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import Base from './base';
|
|
2
2
|
import core, { add_template, add_media, replace_batch_verify, replace_params_encode, replace_batch_verify_multiple_params, replace_params_encode_multiple_params } from '../core/sign'
|
|
3
|
-
import paramsData from './paramsData';
|
|
3
|
+
import paramsData, { replaceParams } from './paramsData';
|
|
4
4
|
|
|
5
5
|
export default class Sign extends Base {
|
|
6
6
|
constructor() {
|
|
@@ -9,30 +9,34 @@ export default class Sign extends Base {
|
|
|
9
9
|
|
|
10
10
|
async handle(paramsData: paramsData, files: Uint8Array[], isDecode: boolean = false): Promise<Uint8Array[]> {
|
|
11
11
|
paramsData.add_media = add_media
|
|
12
|
-
const [params] = await paramsData.toReplaceParams()
|
|
13
12
|
|
|
14
13
|
const addFileTasks: Promise<number>[] = []
|
|
15
14
|
for (const file of files) {
|
|
16
15
|
addFileTasks.push(add_template(file, isDecode))
|
|
17
16
|
}
|
|
18
|
-
|
|
17
|
+
const [tempFiles, [variables]] = await Promise.all([
|
|
18
|
+
Promise.all(addFileTasks),
|
|
19
|
+
paramsData.toReplaceParams(),
|
|
20
|
+
])
|
|
19
21
|
const encodeData = {
|
|
20
|
-
files:
|
|
21
|
-
variables
|
|
22
|
+
files: tempFiles,
|
|
23
|
+
variables
|
|
22
24
|
}
|
|
23
25
|
|
|
24
26
|
const paramsEncode = await replace_params_encode(encodeData)
|
|
25
|
-
|
|
26
27
|
const verifyCode = await this.sign(paramsEncode)
|
|
27
28
|
return replace_batch_verify(String(verifyCode), paramsEncode.data)
|
|
28
29
|
}
|
|
29
30
|
|
|
30
31
|
async handleMultipleParams(paramsList: paramsData[], files: Uint8Array[], isDecode: boolean = false): Promise<Uint8Array[]> {
|
|
31
|
-
let
|
|
32
|
+
let variablesTasks: Promise<replaceParams>[] = []
|
|
32
33
|
for (const paramsData of paramsList) {
|
|
33
34
|
paramsData.add_media = add_media
|
|
34
|
-
|
|
35
|
-
|
|
35
|
+
variablesTasks.push(new Promise((resolve, reject) => {
|
|
36
|
+
paramsData.toReplaceParams().then(([params]) => {
|
|
37
|
+
resolve(params)
|
|
38
|
+
}).catch(reject)
|
|
39
|
+
}))
|
|
36
40
|
}
|
|
37
41
|
|
|
38
42
|
const addFileTasks: Promise<number>[] = []
|
|
@@ -40,8 +44,13 @@ export default class Sign extends Base {
|
|
|
40
44
|
addFileTasks.push(add_template(file, isDecode))
|
|
41
45
|
}
|
|
42
46
|
|
|
47
|
+
const [tempFiles, variables] = await Promise.all([
|
|
48
|
+
Promise.all(addFileTasks),
|
|
49
|
+
Promise.all(variablesTasks),
|
|
50
|
+
])
|
|
51
|
+
|
|
43
52
|
const encodeData = {
|
|
44
|
-
files:
|
|
53
|
+
files: tempFiles,
|
|
45
54
|
variables
|
|
46
55
|
}
|
|
47
56
|
|
package/task/urlDownloadTask.ts
CHANGED
|
@@ -1,16 +1,6 @@
|
|
|
1
1
|
import axios, { AxiosProgressEvent } from "axios"
|
|
2
2
|
import file from "../fileSystem"
|
|
3
|
-
|
|
4
|
-
async function hashString(str: string): Promise<string> {
|
|
5
|
-
const encoder = new TextEncoder();
|
|
6
|
-
const data = encoder.encode(str);
|
|
7
|
-
const hashBuffer = await window.crypto.subtle.digest("SHA-1", data);
|
|
8
|
-
const hashArray = Array.from(new Uint8Array(hashBuffer));
|
|
9
|
-
const hashHex = hashArray
|
|
10
|
-
.map((b) => b.toString(16).padStart(2, "0"))
|
|
11
|
-
.join("");
|
|
12
|
-
return hashHex;
|
|
13
|
-
}
|
|
3
|
+
import { hashString } from "../helper"
|
|
14
4
|
|
|
15
5
|
export default class urlDownloadTask {
|
|
16
6
|
urls: string[]
|
|
@@ -23,7 +13,7 @@ export default class urlDownloadTask {
|
|
|
23
13
|
this.urls = urls
|
|
24
14
|
}
|
|
25
15
|
|
|
26
|
-
|
|
16
|
+
start(): Promise<(Blob|undefined)[]> {
|
|
27
17
|
const tasks = []
|
|
28
18
|
for (const url of this.urls) {
|
|
29
19
|
tasks.push(this.getUrlData(url))
|
|
@@ -47,9 +37,7 @@ export default class urlDownloadTask {
|
|
|
47
37
|
}
|
|
48
38
|
|
|
49
39
|
async download(url: string): Promise<Blob> {
|
|
50
|
-
const response = await axios({
|
|
51
|
-
url: url,
|
|
52
|
-
method: 'get',
|
|
40
|
+
const response = await axios.get(url, {
|
|
53
41
|
responseType: 'blob',
|
|
54
42
|
onDownloadProgress: (progressEvent: AxiosProgressEvent) => {
|
|
55
43
|
for (const fun of this.downloadProgressListener) {
|
|
@@ -64,8 +52,13 @@ export default class urlDownloadTask {
|
|
|
64
52
|
const matches = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/.exec(contentDisposition)
|
|
65
53
|
if (matches != null && matches[1]) {
|
|
66
54
|
const filename = matches[1].replace(/['"]/g, '')
|
|
67
|
-
|
|
68
|
-
|
|
55
|
+
return new File(
|
|
56
|
+
[response.data],
|
|
57
|
+
filename,
|
|
58
|
+
{
|
|
59
|
+
type: response.headers['content-type'] ?? 'application/octet-stream'
|
|
60
|
+
}
|
|
61
|
+
)
|
|
69
62
|
}
|
|
70
63
|
}
|
|
71
64
|
return response.data
|
package/temp/index.ts
CHANGED
|
@@ -81,15 +81,11 @@ export default class Temp implements TempInterface{
|
|
|
81
81
|
if (this._type) {
|
|
82
82
|
return this._type
|
|
83
83
|
}
|
|
84
|
-
|
|
85
|
-
|
|
84
|
+
const buffer = await this.getBuffer()
|
|
85
|
+
if (buffer) {
|
|
86
|
+
this._type = await fileTypeByBuffer(buffer)
|
|
86
87
|
}else{
|
|
87
|
-
|
|
88
|
-
if (file) {
|
|
89
|
-
this._type = await fileTypeByBuffer(file)
|
|
90
|
-
}else{
|
|
91
|
-
this._type = fileTypes.unknown
|
|
92
|
-
}
|
|
88
|
+
this._type = fileTypes.unknown
|
|
93
89
|
}
|
|
94
90
|
return this._type
|
|
95
91
|
}
|
|
@@ -146,17 +142,14 @@ export default class Temp implements TempInterface{
|
|
|
146
142
|
}
|
|
147
143
|
|
|
148
144
|
async getTransmitFileInfo(): Promise<transmitFileInfo|undefined> {
|
|
149
|
-
|
|
150
|
-
this.uint8Array = undefined
|
|
151
|
-
if (!uint8Array) {
|
|
152
|
-
uint8Array = await this.getBuffer()
|
|
153
|
-
}
|
|
145
|
+
const uint8Array = this.uint8Array ? this.uint8Array : await this.getBuffer()
|
|
154
146
|
if (!uint8Array) {
|
|
155
147
|
return undefined
|
|
156
148
|
}
|
|
149
|
+
this.uint8Array = undefined
|
|
157
150
|
return {
|
|
158
151
|
name: this.getName(),
|
|
159
|
-
uint8Array
|
|
152
|
+
uint8Array,
|
|
160
153
|
isDecode: this.isDecode,
|
|
161
154
|
}
|
|
162
155
|
}
|