@simplysm/core-browser 13.0.100 → 14.0.1
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/extensions/element-ext.d.ts +36 -36
- package/dist/extensions/element-ext.d.ts.map +1 -1
- package/dist/extensions/element-ext.js +132 -111
- package/dist/extensions/element-ext.js.map +1 -6
- package/dist/extensions/html-element-ext.d.ts +22 -22
- package/dist/extensions/html-element-ext.js +50 -45
- package/dist/extensions/html-element-ext.js.map +1 -6
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -6
- package/dist/utils/IndexedDbStore.js +115 -112
- package/dist/utils/IndexedDbStore.js.map +1 -6
- package/dist/utils/IndexedDbVirtualFs.js +81 -83
- package/dist/utils/IndexedDbVirtualFs.js.map +1 -6
- package/dist/utils/download.d.ts +3 -3
- package/dist/utils/download.js +18 -14
- package/dist/utils/download.js.map +1 -6
- package/dist/utils/fetch.d.ts +1 -1
- package/dist/utils/fetch.d.ts.map +1 -1
- package/dist/utils/fetch.js +46 -36
- package/dist/utils/fetch.js.map +1 -6
- package/dist/utils/file-dialog.d.ts +1 -1
- package/dist/utils/file-dialog.js +19 -19
- package/dist/utils/file-dialog.js.map +1 -6
- package/package.json +7 -10
- package/src/extensions/element-ext.ts +40 -40
- package/src/extensions/html-element-ext.ts +24 -24
- package/src/index.ts +3 -3
- package/src/utils/IndexedDbStore.ts +3 -3
- package/src/utils/download.ts +3 -3
- package/src/utils/fetch.ts +17 -5
- package/src/utils/file-dialog.ts +1 -1
- package/README.md +0 -106
- package/docs/classes.md +0 -184
- package/docs/element-extensions.md +0 -134
- package/docs/html-element-extensions.md +0 -56
- package/docs/utilities.md +0 -71
- package/tests/extensions/element-ext.spec.ts +0 -693
- package/tests/extensions/html-element-ext.spec.ts +0 -175
- package/tests/utils/IndexedDbStore.spec.ts +0 -103
- package/tests/utils/IndexedDbVirtualFs.spec.ts +0 -171
- package/tests/utils/download.spec.ts +0 -66
- package/tests/utils/fetch.spec.ts +0 -154
package/dist/index.js.map
CHANGED
|
@@ -1,6 +1 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/index.ts"],
|
|
4
|
-
"mappings": "AAGA,OAAO;AACP,OAAO;AAGP,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;",
|
|
5
|
-
"names": []
|
|
6
|
-
}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["..\\src\\index.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAE7B,eAAe;AACf,OAAO,0BAA0B,CAAC;AAClC,OAAO,+BAA+B,CAAC;AAEvC,QAAQ;AACR,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC"}
|
|
@@ -1,117 +1,120 @@
|
|
|
1
|
-
class IndexedDbStore {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
return this._db;
|
|
1
|
+
export class IndexedDbStore {
|
|
2
|
+
_dbName;
|
|
3
|
+
_dbVersion;
|
|
4
|
+
_storeConfigs;
|
|
5
|
+
_db;
|
|
6
|
+
_opening;
|
|
7
|
+
constructor(_dbName, _dbVersion, _storeConfigs) {
|
|
8
|
+
this._dbName = _dbName;
|
|
9
|
+
this._dbVersion = _dbVersion;
|
|
10
|
+
this._storeConfigs = _storeConfigs;
|
|
12
11
|
}
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
async open() {
|
|
13
|
+
if (this._db != null) {
|
|
14
|
+
return this._db;
|
|
15
|
+
}
|
|
16
|
+
if (this._opening != null) {
|
|
17
|
+
return this._opening;
|
|
18
|
+
}
|
|
19
|
+
this._opening = new Promise((resolve, reject) => {
|
|
20
|
+
const req = indexedDB.open(this._dbName, this._dbVersion);
|
|
21
|
+
req.onupgradeneeded = () => {
|
|
22
|
+
const db = req.result;
|
|
23
|
+
for (const config of this._storeConfigs) {
|
|
24
|
+
if (!db.objectStoreNames.contains(config.name)) {
|
|
25
|
+
db.createObjectStore(config.name, { keyPath: config.keyPath });
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
req.onsuccess = () => {
|
|
30
|
+
const db = req.result;
|
|
31
|
+
db.onversionchange = () => {
|
|
32
|
+
db.close();
|
|
33
|
+
this._db = undefined;
|
|
34
|
+
this._opening = undefined;
|
|
35
|
+
};
|
|
36
|
+
db.onclose = () => {
|
|
37
|
+
this._db = undefined;
|
|
38
|
+
this._opening = undefined;
|
|
39
|
+
};
|
|
40
|
+
this._db = db;
|
|
41
|
+
this._opening = undefined;
|
|
42
|
+
resolve(db);
|
|
43
|
+
};
|
|
44
|
+
req.onerror = () => {
|
|
45
|
+
this._opening = undefined;
|
|
46
|
+
reject(req.error);
|
|
47
|
+
};
|
|
48
|
+
req.onblocked = () => {
|
|
49
|
+
this._opening = undefined;
|
|
50
|
+
reject(new Error("다른 연결에 의해 데이터베이스가 차단되었습니다"));
|
|
51
|
+
};
|
|
52
|
+
});
|
|
53
|
+
return this._opening;
|
|
15
54
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
55
|
+
async withStore(storeName, mode, fn) {
|
|
56
|
+
const db = await this.open();
|
|
57
|
+
const tx = db.transaction(storeName, mode);
|
|
58
|
+
const store = tx.objectStore(storeName);
|
|
59
|
+
// 먼저 fn 결과를 대기
|
|
60
|
+
let result;
|
|
61
|
+
let fnError;
|
|
62
|
+
let hasFnError = false;
|
|
63
|
+
try {
|
|
64
|
+
result = await fn(store);
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
fnError = err;
|
|
68
|
+
hasFnError = true;
|
|
69
|
+
tx.abort();
|
|
24
70
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
71
|
+
// 트랜잭션 완료 대기
|
|
72
|
+
return new Promise((resolve, reject) => {
|
|
73
|
+
if (hasFnError) {
|
|
74
|
+
tx.onabort = () => {
|
|
75
|
+
reject(fnError);
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
tx.oncomplete = () => {
|
|
80
|
+
resolve(result);
|
|
81
|
+
};
|
|
82
|
+
tx.onerror = () => {
|
|
83
|
+
reject(tx.error);
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
async get(storeName, key) {
|
|
89
|
+
return this.withStore(storeName, "readonly", async (store) => {
|
|
90
|
+
return this._resolveRequest(store.get(key));
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
async put(storeName, value) {
|
|
94
|
+
await this.withStore(storeName, "readwrite", async (store) => {
|
|
95
|
+
await this._resolveRequest(store.put(value));
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
async delete(storeName, key) {
|
|
99
|
+
await this.withStore(storeName, "readwrite", async (store) => {
|
|
100
|
+
await this._resolveRequest(store.delete(key));
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
async getAll(storeName) {
|
|
104
|
+
return this.withStore(storeName, "readonly", async (store) => {
|
|
105
|
+
return this._resolveRequest(store.getAll());
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
_resolveRequest(req) {
|
|
109
|
+
return new Promise((resolve, reject) => {
|
|
110
|
+
req.onsuccess = () => resolve(req.result);
|
|
111
|
+
req.onerror = () => reject(req.error);
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
close() {
|
|
115
|
+
this._db?.close();
|
|
116
|
+
this._db = undefined;
|
|
117
|
+
this._opening = undefined;
|
|
65
118
|
}
|
|
66
|
-
return new Promise((resolve, reject) => {
|
|
67
|
-
if (hasFnError) {
|
|
68
|
-
tx.onabort = () => {
|
|
69
|
-
reject(fnError);
|
|
70
|
-
};
|
|
71
|
-
} else {
|
|
72
|
-
tx.oncomplete = () => {
|
|
73
|
-
resolve(result);
|
|
74
|
-
};
|
|
75
|
-
tx.onerror = () => {
|
|
76
|
-
reject(tx.error);
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
async get(storeName, key) {
|
|
82
|
-
return this.withStore(storeName, "readonly", async (store) => {
|
|
83
|
-
return this._resolveRequest(store.get(key));
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
async put(storeName, value) {
|
|
87
|
-
await this.withStore(storeName, "readwrite", async (store) => {
|
|
88
|
-
await this._resolveRequest(store.put(value));
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
async delete(storeName, key) {
|
|
92
|
-
await this.withStore(storeName, "readwrite", async (store) => {
|
|
93
|
-
await this._resolveRequest(store.delete(key));
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
async getAll(storeName) {
|
|
97
|
-
return this.withStore(storeName, "readonly", async (store) => {
|
|
98
|
-
return this._resolveRequest(store.getAll());
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
_resolveRequest(req) {
|
|
102
|
-
return new Promise((resolve, reject) => {
|
|
103
|
-
req.onsuccess = () => resolve(req.result);
|
|
104
|
-
req.onerror = () => reject(req.error);
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
close() {
|
|
108
|
-
var _a;
|
|
109
|
-
(_a = this._db) == null ? void 0 : _a.close();
|
|
110
|
-
this._db = void 0;
|
|
111
|
-
this._opening = void 0;
|
|
112
|
-
}
|
|
113
119
|
}
|
|
114
|
-
|
|
115
|
-
IndexedDbStore
|
|
116
|
-
};
|
|
117
|
-
//# sourceMappingURL=IndexedDbStore.js.map
|
|
120
|
+
//# sourceMappingURL=IndexedDbStore.js.map
|
|
@@ -1,6 +1 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/utils/IndexedDbStore.ts"],
|
|
4
|
-
"mappings": "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",
|
|
5
|
-
"names": []
|
|
6
|
-
}
|
|
1
|
+
{"version":3,"file":"IndexedDbStore.js","sourceRoot":"","sources":["..\\..\\src\\utils\\IndexedDbStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,87 +1,85 @@
|
|
|
1
|
-
class IndexedDbVirtualFs {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
1
|
+
export class IndexedDbVirtualFs {
|
|
2
|
+
_db;
|
|
3
|
+
_storeName;
|
|
4
|
+
_keyField;
|
|
5
|
+
constructor(_db, _storeName, _keyField) {
|
|
6
|
+
this._db = _db;
|
|
7
|
+
this._storeName = _storeName;
|
|
8
|
+
this._keyField = _keyField;
|
|
9
|
+
}
|
|
10
|
+
async getEntry(fullKey) {
|
|
11
|
+
return this._db.get(this._storeName, fullKey);
|
|
12
|
+
}
|
|
13
|
+
async putEntry(fullKey, kind, dataBase64) {
|
|
14
|
+
await this._db.put(this._storeName, { [this._keyField]: fullKey, kind, dataBase64 });
|
|
15
|
+
}
|
|
16
|
+
async deleteByPrefix(keyPrefix) {
|
|
17
|
+
return this._db.withStore(this._storeName, "readwrite", async (store) => {
|
|
18
|
+
return new Promise((resolve, reject) => {
|
|
19
|
+
const req = store.openCursor(IDBKeyRange.bound(keyPrefix, keyPrefix + "\uffff"));
|
|
20
|
+
let found = false;
|
|
21
|
+
req.onsuccess = () => {
|
|
22
|
+
const cursor = req.result;
|
|
23
|
+
if (!cursor) {
|
|
24
|
+
resolve(found);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const key = String(cursor.key);
|
|
28
|
+
if (key === keyPrefix || key.startsWith(keyPrefix + "/")) {
|
|
29
|
+
found = true;
|
|
30
|
+
cursor.delete();
|
|
31
|
+
}
|
|
32
|
+
cursor.continue();
|
|
33
|
+
};
|
|
34
|
+
req.onerror = () => reject(req.error);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
async listChildren(prefix) {
|
|
39
|
+
return this._db.withStore(this._storeName, "readonly", async (store) => {
|
|
40
|
+
return new Promise((resolve, reject) => {
|
|
41
|
+
const req = store.openCursor(IDBKeyRange.bound(prefix, prefix + "\uffff"));
|
|
42
|
+
const map = new Map();
|
|
43
|
+
req.onsuccess = () => {
|
|
44
|
+
const cursor = req.result;
|
|
45
|
+
if (!cursor) {
|
|
46
|
+
resolve(Array.from(map.entries()).map(([name, isDirectory]) => ({ name, isDirectory })));
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const key = String(cursor.key);
|
|
50
|
+
if (key.startsWith(prefix)) {
|
|
51
|
+
const rest = key.slice(prefix.length);
|
|
52
|
+
if (rest) {
|
|
53
|
+
const segments = rest.split("/").filter(Boolean);
|
|
54
|
+
if (segments.length > 0) {
|
|
55
|
+
const firstSeg = segments[0];
|
|
56
|
+
if (!map.has(firstSeg)) {
|
|
57
|
+
const isDir = segments.length > 1 || cursor.value.kind === "dir";
|
|
58
|
+
map.set(firstSeg, isDir);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
cursor.continue();
|
|
64
|
+
};
|
|
65
|
+
req.onerror = () => reject(req.error);
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
async ensureDir(fullKeyBuilder, dirPath) {
|
|
70
|
+
if (dirPath === "/") {
|
|
71
|
+
await this.putEntry(fullKeyBuilder("/"), "dir");
|
|
46
72
|
return;
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
if (!map.has(firstSeg)) {
|
|
56
|
-
const isDir = segments.length > 1 || cursor.value.kind === "dir";
|
|
57
|
-
map.set(firstSeg, isDir);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
73
|
+
}
|
|
74
|
+
const segments = dirPath.split("/").filter(Boolean);
|
|
75
|
+
let acc = "";
|
|
76
|
+
for (const seg of segments) {
|
|
77
|
+
acc += "/" + seg;
|
|
78
|
+
const existing = await this.getEntry(fullKeyBuilder(acc));
|
|
79
|
+
if (!existing) {
|
|
80
|
+
await this.putEntry(fullKeyBuilder(acc), "dir");
|
|
60
81
|
}
|
|
61
|
-
|
|
62
|
-
cursor.continue();
|
|
63
|
-
};
|
|
64
|
-
req.onerror = () => reject(req.error);
|
|
65
|
-
});
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
async ensureDir(fullKeyBuilder, dirPath) {
|
|
69
|
-
if (dirPath === "/") {
|
|
70
|
-
await this.putEntry(fullKeyBuilder("/"), "dir");
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
const segments = dirPath.split("/").filter(Boolean);
|
|
74
|
-
let acc = "";
|
|
75
|
-
for (const seg of segments) {
|
|
76
|
-
acc += "/" + seg;
|
|
77
|
-
const existing = await this.getEntry(fullKeyBuilder(acc));
|
|
78
|
-
if (!existing) {
|
|
79
|
-
await this.putEntry(fullKeyBuilder(acc), "dir");
|
|
80
|
-
}
|
|
82
|
+
}
|
|
81
83
|
}
|
|
82
|
-
}
|
|
83
84
|
}
|
|
84
|
-
|
|
85
|
-
IndexedDbVirtualFs
|
|
86
|
-
};
|
|
87
|
-
//# sourceMappingURL=IndexedDbVirtualFs.js.map
|
|
85
|
+
//# sourceMappingURL=IndexedDbVirtualFs.js.map
|
|
@@ -1,6 +1 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/utils/IndexedDbVirtualFs.ts"],
|
|
4
|
-
"mappings": "AAOO,MAAM,mBAAmB;AAAA,EAC9B,YACmB,KACA,YACA,WACjB;AAHiB;AACA;AACA;AAAA,EAChB;AAAA,EAEH,MAAM,SAAS,SAAsD;AACnE,WAAO,KAAK,IAAI,IAAoB,KAAK,YAAY,OAAO;AAAA,EAC9D;AAAA,EAEA,MAAM,SAAS,SAAiB,MAAsB,YAAoC;AACxF,UAAM,KAAK,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC,KAAK,SAAS,GAAG,SAAS,MAAM,WAAW,CAAC;AAAA,EACrF;AAAA,EAEA,MAAM,eAAe,WAAqC;AACxD,WAAO,KAAK,IAAI,UAAU,KAAK,YAAY,aAAa,OAAO,UAAU;AACvE,aAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,cAAM,MAAM,MAAM,WAAW,YAAY,MAAM,WAAW,YAAY,QAAQ,CAAC;AAC/E,YAAI,QAAQ;AACZ,YAAI,YAAY,MAAM;AACpB,gBAAM,SAAS,IAAI;AACnB,cAAI,CAAC,QAAQ;AACX,oBAAQ,KAAK;AACb;AAAA,UACF;AACA,gBAAM,MAAM,OAAO,OAAO,GAAG;AAC7B,cAAI,QAAQ,aAAa,IAAI,WAAW,YAAY,GAAG,GAAG;AACxD,oBAAQ;AACR,mBAAO,OAAO;AAAA,UAChB;AACA,iBAAO,SAAS;AAAA,QAClB;AACA,YAAI,UAAU,MAAM,OAAO,IAAI,KAAK;AAAA,MACtC,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aAAa,QAAmE;AACpF,WAAO,KAAK,IAAI,UAAU,KAAK,YAAY,YAAY,OAAO,UAAU;AACtE,aAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,cAAM,MAAM,MAAM,WAAW,YAAY,MAAM,QAAQ,SAAS,QAAQ,CAAC;AACzE,cAAM,MAAM,oBAAI,IAAqB;AACrC,YAAI,YAAY,MAAM;AACpB,gBAAM,SAAS,IAAI;AACnB,cAAI,CAAC,QAAQ;AACX;AAAA,cACE,MAAM,KAAK,IAAI,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,WAAW,OAAO,EAAE,MAAM,YAAY,EAAE;AAAA,YAChF;AACA;AAAA,UACF;AACA,gBAAM,MAAM,OAAO,OAAO,GAAG;AAC7B,cAAI,IAAI,WAAW,MAAM,GAAG;AAC1B,kBAAM,OAAO,IAAI,MAAM,OAAO,MAAM;AACpC,gBAAI,MAAM;AACR,oBAAM,WAAW,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AAC/C,kBAAI,SAAS,SAAS,GAAG;AACvB,sBAAM,WAAW,SAAS,CAAC;AAC3B,oBAAI,CAAC,IAAI,IAAI,QAAQ,GAAG;AACtB,wBAAM,QACJ,SAAS,SAAS,KAAM,OAAO,MAAyB,SAAS;AACnE,sBAAI,IAAI,UAAU,KAAK;AAAA,gBACzB;AAAA,cACF;AAAA,YACF;AAAA,UACF;AACA,iBAAO,SAAS;AAAA,QAClB;AACA,YAAI,UAAU,MAAM,OAAO,IAAI,KAAK;AAAA,MACtC,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,UACJ,gBACA,SACe;AACf,QAAI,YAAY,KAAK;AACnB,YAAM,KAAK,SAAS,eAAe,GAAG,GAAG,KAAK;AAC9C;AAAA,IACF;AACA,UAAM,WAAW,QAAQ,MAAM,GAAG,EAAE,OAAO,OAAO;AAClD,QAAI,MAAM;AACV,eAAW,OAAO,UAAU;AAC1B,aAAO,MAAM;AACb,YAAM,WAAW,MAAM,KAAK,SAAS,eAAe,GAAG,CAAC;AACxD,UAAI,CAAC,UAAU;AACb,cAAM,KAAK,SAAS,eAAe,GAAG,GAAG,KAAK;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AACF;",
|
|
5
|
-
"names": []
|
|
6
|
-
}
|
|
1
|
+
{"version":3,"file":"IndexedDbVirtualFs.js","sourceRoot":"","sources":["..\\..\\src\\utils\\IndexedDbVirtualFs.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/download.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Blob을 파일로 다운로드
|
|
3
3
|
*
|
|
4
|
-
* @param blob - Blob
|
|
5
|
-
* @param fileName -
|
|
4
|
+
* @param blob - 다운로드할 Blob 객체
|
|
5
|
+
* @param fileName - 저장할 파일명
|
|
6
6
|
*/
|
|
7
7
|
export declare function downloadBlob(blob: Blob, fileName: string): void;
|
|
8
8
|
//# sourceMappingURL=download.d.ts.map
|
package/dist/utils/download.js
CHANGED
|
@@ -1,15 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Blob을 파일로 다운로드
|
|
3
|
+
*
|
|
4
|
+
* @param blob - 다운로드할 Blob 객체
|
|
5
|
+
* @param fileName - 저장할 파일명
|
|
6
|
+
*/
|
|
7
|
+
export function downloadBlob(blob, fileName) {
|
|
8
|
+
const url = URL.createObjectURL(blob);
|
|
9
|
+
try {
|
|
10
|
+
const link = document.createElement("a");
|
|
11
|
+
link.href = url;
|
|
12
|
+
link.download = fileName;
|
|
13
|
+
link.click();
|
|
14
|
+
}
|
|
15
|
+
finally {
|
|
16
|
+
setTimeout(() => URL.revokeObjectURL(url), 1000);
|
|
17
|
+
}
|
|
11
18
|
}
|
|
12
|
-
|
|
13
|
-
downloadBlob
|
|
14
|
-
};
|
|
15
|
-
//# sourceMappingURL=download.js.map
|
|
19
|
+
//# sourceMappingURL=download.js.map
|
|
@@ -1,6 +1 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/utils/download.ts"],
|
|
4
|
-
"mappings": "AAMO,SAAS,aAAa,MAAY,UAAwB;AAC/D,QAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,MAAI;AACF,UAAM,OAAO,SAAS,cAAc,GAAG;AACvC,SAAK,OAAO;AACZ,SAAK,WAAW;AAChB,SAAK,MAAM;AAAA,EACb,UAAE;AACA,eAAW,MAAM,IAAI,gBAAgB,GAAG,GAAG,GAAI;AAAA,EACjD;AACF;",
|
|
5
|
-
"names": []
|
|
6
|
-
}
|
|
1
|
+
{"version":3,"file":"download.js","sourceRoot":"","sources":["..\\..\\src\\utils\\download.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,IAAU,EAAE,QAAgB;IACvD,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;QAChB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;YAAS,CAAC;QACT,UAAU,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;IACnD,CAAC;AACH,CAAC"}
|
package/dist/utils/fetch.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ export interface DownloadProgress {
|
|
|
3
3
|
contentLength: number;
|
|
4
4
|
}
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
6
|
+
* URL에서 바이너리 데이터 다운로드 (진행 콜백 지원)
|
|
7
7
|
*/
|
|
8
8
|
export declare function fetchUrlBytes(url: string, options?: {
|
|
9
9
|
onProgress?: (progress: DownloadProgress) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["..\\..\\src\\utils\\fetch.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAA;CAAE,GAC9D,OAAO,CAAC,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["..\\..\\src\\utils\\fetch.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAA;CAAE,GAC9D,OAAO,CAAC,UAAU,CAAC,CAwDrB"}
|
package/dist/utils/fetch.js
CHANGED
|
@@ -1,40 +1,50 @@
|
|
|
1
1
|
import { bytes } from "@simplysm/core-common";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const reader = (_a = response.body) == null ? void 0 : _a.getReader();
|
|
10
|
-
if (!reader) {
|
|
11
|
-
throw new Error("Response body is not readable");
|
|
12
|
-
}
|
|
13
|
-
try {
|
|
14
|
-
if (contentLength > 0) {
|
|
15
|
-
const result = new Uint8Array(contentLength);
|
|
16
|
-
let receivedLength = 0;
|
|
17
|
-
while (true) {
|
|
18
|
-
const { done, value } = await reader.read();
|
|
19
|
-
if (done) break;
|
|
20
|
-
result.set(value, receivedLength);
|
|
21
|
-
receivedLength += value.length;
|
|
22
|
-
(_b = options == null ? void 0 : options.onProgress) == null ? void 0 : _b.call(options, { receivedLength, contentLength });
|
|
23
|
-
}
|
|
24
|
-
return result;
|
|
2
|
+
/**
|
|
3
|
+
* URL에서 바이너리 데이터 다운로드 (진행 콜백 지원)
|
|
4
|
+
*/
|
|
5
|
+
export async function fetchUrlBytes(url, options) {
|
|
6
|
+
const response = await fetch(url);
|
|
7
|
+
if (!response.ok) {
|
|
8
|
+
throw new Error(`다운로드 실패: ${response.status} ${response.statusText}`);
|
|
25
9
|
}
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
10
|
+
const contentLength = Number(response.headers.get("Content-Length") ?? 0);
|
|
11
|
+
const reader = response.body?.getReader();
|
|
12
|
+
if (!reader) {
|
|
13
|
+
throw new Error("응답 본문을 읽을 수 없습니다");
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
// Content-Length를 알 수 있는 경우, 메모리 효율을 위해 사전 할당
|
|
17
|
+
if (contentLength > 0) {
|
|
18
|
+
const result = new Uint8Array(contentLength);
|
|
19
|
+
let receivedLength = 0;
|
|
20
|
+
while (true) {
|
|
21
|
+
const { done, value } = await reader.read();
|
|
22
|
+
if (done)
|
|
23
|
+
break;
|
|
24
|
+
if (receivedLength + value.length > contentLength) {
|
|
25
|
+
throw new Error(`수신 데이터가 Content-Length를 초과했습니다 (Content-Length: ${contentLength}, 수신: ${receivedLength + value.length}+)`);
|
|
26
|
+
}
|
|
27
|
+
result.set(value, receivedLength);
|
|
28
|
+
receivedLength += value.length;
|
|
29
|
+
options?.onProgress?.({ receivedLength, contentLength });
|
|
30
|
+
}
|
|
31
|
+
if (receivedLength < contentLength) {
|
|
32
|
+
throw new Error(`수신 데이터가 Content-Length보다 부족합니다 (Content-Length: ${contentLength}, 수신: ${receivedLength})`);
|
|
33
|
+
}
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
// Content-Length를 알 수 없는 경우, 청크를 수집 후 병합 (chunked encoding)
|
|
37
|
+
const chunks = [];
|
|
38
|
+
while (true) {
|
|
39
|
+
const { done, value } = await reader.read();
|
|
40
|
+
if (done)
|
|
41
|
+
break;
|
|
42
|
+
chunks.push(value);
|
|
43
|
+
}
|
|
44
|
+
return bytes.concat(chunks);
|
|
45
|
+
}
|
|
46
|
+
finally {
|
|
47
|
+
reader.releaseLock();
|
|
31
48
|
}
|
|
32
|
-
return bytes.concat(chunks);
|
|
33
|
-
} finally {
|
|
34
|
-
reader.releaseLock();
|
|
35
|
-
}
|
|
36
49
|
}
|
|
37
|
-
|
|
38
|
-
fetchUrlBytes
|
|
39
|
-
};
|
|
40
|
-
//# sourceMappingURL=fetch.js.map
|
|
50
|
+
//# sourceMappingURL=fetch.js.map
|
package/dist/utils/fetch.js.map
CHANGED
|
@@ -1,6 +1 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/utils/fetch.ts"],
|
|
4
|
-
"mappings": "AAAA,SAAS,aAAa;AAUtB,eAAsB,cACpB,KACA,SACqB;AAbvB;AAcE,QAAM,WAAW,MAAM,MAAM,GAAG;AAChC,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,oBAAoB,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AAAA,EAC9E;AAEA,QAAM,gBAAgB,OAAO,SAAS,QAAQ,IAAI,gBAAgB,KAAK,CAAC;AACxE,QAAM,UAAS,cAAS,SAAT,mBAAe;AAC9B,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACjD;AAEA,MAAI;AAEF,QAAI,gBAAgB,GAAG;AACrB,YAAM,SAAS,IAAI,WAAW,aAAa;AAC3C,UAAI,iBAAiB;AAErB,aAAO,MAAM;AACX,cAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,YAAI,KAAM;AAEV,eAAO,IAAI,OAAO,cAAc;AAChC,0BAAkB,MAAM;AACxB,iDAAS,eAAT,iCAAsB,EAAE,gBAAgB,cAAc;AAAA,MACxD;AAEA,aAAO;AAAA,IACT;AAGA,UAAM,SAAuB,CAAC;AAE9B,WAAO,MAAM;AACX,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AAEV,aAAO,KAAK,KAAK;AAAA,IACnB;AAEA,WAAO,MAAM,OAAO,MAAM;AAAA,EAC5B,UAAE;AACA,WAAO,YAAY;AAAA,EACrB;AACF;",
|
|
5
|
-
"names": []
|
|
6
|
-
}
|
|
1
|
+
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["..\\..\\src\\utils\\fetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAO9C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAW,EACX,OAA+D;IAE/D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,YAAY,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1E,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;IAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,CAAC;QACH,8CAA8C;QAC9C,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,aAAa,CAAC,CAAC;YAC7C,IAAI,cAAc,GAAG,CAAC,CAAC;YAEvB,OAAO,IAAI,EAAE,CAAC;gBACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC5C,IAAI,IAAI;oBAAE,MAAM;gBAEhB,IAAI,cAAc,GAAG,KAAK,CAAC,MAAM,GAAG,aAAa,EAAE,CAAC;oBAClD,MAAM,IAAI,KAAK,CACb,mDAAmD,aAAa,SAAS,cAAc,GAAG,KAAK,CAAC,MAAM,IAAI,CAC3G,CAAC;gBACJ,CAAC;gBAED,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;gBAClC,cAAc,IAAI,KAAK,CAAC,MAAM,CAAC;gBAC/B,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC,CAAC;YAC3D,CAAC;YAED,IAAI,cAAc,GAAG,aAAa,EAAE,CAAC;gBACnC,MAAM,IAAI,KAAK,CACb,mDAAmD,aAAa,SAAS,cAAc,GAAG,CAC3F,CAAC;YACJ,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,4DAA4D;QAC5D,MAAM,MAAM,GAAiB,EAAE,CAAC;QAEhC,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,IAAI;gBAAE,MAAM;YAEhB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QAED,OAAO,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;AACH,CAAC"}
|