@simplysm/core-browser 13.0.100 → 14.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +183 -65
  2. package/dist/extensions/element-ext.d.ts +36 -36
  3. package/dist/extensions/element-ext.d.ts.map +1 -1
  4. package/dist/extensions/element-ext.js +132 -111
  5. package/dist/extensions/element-ext.js.map +1 -6
  6. package/dist/extensions/html-element-ext.d.ts +22 -22
  7. package/dist/extensions/html-element-ext.js +50 -45
  8. package/dist/extensions/html-element-ext.js.map +1 -6
  9. package/dist/index.js +4 -1
  10. package/dist/index.js.map +1 -6
  11. package/dist/utils/IndexedDbStore.js +115 -112
  12. package/dist/utils/IndexedDbStore.js.map +1 -6
  13. package/dist/utils/IndexedDbVirtualFs.js +81 -83
  14. package/dist/utils/IndexedDbVirtualFs.js.map +1 -6
  15. package/dist/utils/download.d.ts +3 -3
  16. package/dist/utils/download.js +18 -14
  17. package/dist/utils/download.js.map +1 -6
  18. package/dist/utils/fetch.d.ts +1 -1
  19. package/dist/utils/fetch.d.ts.map +1 -1
  20. package/dist/utils/fetch.js +46 -36
  21. package/dist/utils/fetch.js.map +1 -6
  22. package/dist/utils/file-dialog.d.ts +1 -1
  23. package/dist/utils/file-dialog.js +19 -19
  24. package/dist/utils/file-dialog.js.map +1 -6
  25. package/package.json +7 -10
  26. package/src/extensions/element-ext.ts +40 -40
  27. package/src/extensions/html-element-ext.ts +24 -24
  28. package/src/index.ts +3 -3
  29. package/src/utils/IndexedDbStore.ts +3 -3
  30. package/src/utils/download.ts +3 -3
  31. package/src/utils/fetch.ts +17 -5
  32. package/src/utils/file-dialog.ts +1 -1
  33. package/docs/classes.md +0 -184
  34. package/docs/element-extensions.md +0 -134
  35. package/docs/html-element-extensions.md +0 -56
  36. package/docs/utilities.md +0 -71
  37. package/tests/extensions/element-ext.spec.ts +0 -693
  38. package/tests/extensions/html-element-ext.spec.ts +0 -175
  39. package/tests/utils/IndexedDbStore.spec.ts +0 -103
  40. package/tests/utils/IndexedDbVirtualFs.spec.ts +0 -171
  41. package/tests/utils/download.spec.ts +0 -66
  42. package/tests/utils/fetch.spec.ts +0 -154
@@ -1,117 +1,120 @@
1
- class IndexedDbStore {
2
- constructor(_dbName, _dbVersion, _storeConfigs) {
3
- this._dbName = _dbName;
4
- this._dbVersion = _dbVersion;
5
- this._storeConfigs = _storeConfigs;
6
- }
7
- _db;
8
- _opening;
9
- async open() {
10
- if (this._db != null) {
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
- if (this._opening != null) {
14
- return this._opening;
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
- this._opening = new Promise((resolve, reject) => {
17
- const req = indexedDB.open(this._dbName, this._dbVersion);
18
- req.onupgradeneeded = () => {
19
- const db = req.result;
20
- for (const config of this._storeConfigs) {
21
- if (!db.objectStoreNames.contains(config.name)) {
22
- db.createObjectStore(config.name, { keyPath: config.keyPath });
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
- req.onsuccess = () => {
27
- const db = req.result;
28
- db.onversionchange = () => {
29
- db.close();
30
- this._db = void 0;
31
- this._opening = void 0;
32
- };
33
- db.onclose = () => {
34
- this._db = void 0;
35
- this._opening = void 0;
36
- };
37
- this._db = db;
38
- this._opening = void 0;
39
- resolve(db);
40
- };
41
- req.onerror = () => {
42
- this._opening = void 0;
43
- reject(req.error);
44
- };
45
- req.onblocked = () => {
46
- this._opening = void 0;
47
- reject(new Error("Database blocked by another connection"));
48
- };
49
- });
50
- return this._opening;
51
- }
52
- async withStore(storeName, mode, fn) {
53
- const db = await this.open();
54
- const tx = db.transaction(storeName, mode);
55
- const store = tx.objectStore(storeName);
56
- let result;
57
- let fnError;
58
- let hasFnError = false;
59
- try {
60
- result = await fn(store);
61
- } catch (err) {
62
- fnError = err;
63
- hasFnError = true;
64
- tx.abort();
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
- export {
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
- constructor(_db, _storeName, _keyField) {
3
- this._db = _db;
4
- this._storeName = _storeName;
5
- this._keyField = _keyField;
6
- }
7
- async getEntry(fullKey) {
8
- return this._db.get(this._storeName, fullKey);
9
- }
10
- async putEntry(fullKey, kind, dataBase64) {
11
- await this._db.put(this._storeName, { [this._keyField]: fullKey, kind, dataBase64 });
12
- }
13
- async deleteByPrefix(keyPrefix) {
14
- return this._db.withStore(this._storeName, "readwrite", async (store) => {
15
- return new Promise((resolve, reject) => {
16
- const req = store.openCursor(IDBKeyRange.bound(keyPrefix, keyPrefix + "\uFFFF"));
17
- let found = false;
18
- req.onsuccess = () => {
19
- const cursor = req.result;
20
- if (!cursor) {
21
- resolve(found);
22
- return;
23
- }
24
- const key = String(cursor.key);
25
- if (key === keyPrefix || key.startsWith(keyPrefix + "/")) {
26
- found = true;
27
- cursor.delete();
28
- }
29
- cursor.continue();
30
- };
31
- req.onerror = () => reject(req.error);
32
- });
33
- });
34
- }
35
- async listChildren(prefix) {
36
- return this._db.withStore(this._storeName, "readonly", async (store) => {
37
- return new Promise((resolve, reject) => {
38
- const req = store.openCursor(IDBKeyRange.bound(prefix, prefix + "\uFFFF"));
39
- const map = /* @__PURE__ */ new Map();
40
- req.onsuccess = () => {
41
- const cursor = req.result;
42
- if (!cursor) {
43
- resolve(
44
- Array.from(map.entries()).map(([name, isDirectory]) => ({ name, isDirectory }))
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
- const key = String(cursor.key);
49
- if (key.startsWith(prefix)) {
50
- const rest = key.slice(prefix.length);
51
- if (rest) {
52
- const segments = rest.split("/").filter(Boolean);
53
- if (segments.length > 0) {
54
- const firstSeg = segments[0];
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
- export {
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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"}
@@ -1,8 +1,8 @@
1
1
  /**
2
- * Download Blob as file
2
+ * Blob 파일로 다운로드
3
3
  *
4
- * @param blob - Blob object to download
5
- * @param fileName - File name to save as
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
@@ -1,15 +1,19 @@
1
- function downloadBlob(blob, fileName) {
2
- const url = URL.createObjectURL(blob);
3
- try {
4
- const link = document.createElement("a");
5
- link.href = url;
6
- link.download = fileName;
7
- link.click();
8
- } finally {
9
- setTimeout(() => URL.revokeObjectURL(url), 1e3);
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
- export {
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"}
@@ -3,7 +3,7 @@ export interface DownloadProgress {
3
3
  contentLength: number;
4
4
  }
5
5
  /**
6
- * Download binary data from URL (with progress callback support)
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,CA4CrB"}
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"}
@@ -1,40 +1,50 @@
1
1
  import { bytes } from "@simplysm/core-common";
2
- async function fetchUrlBytes(url, options) {
3
- var _a, _b;
4
- const response = await fetch(url);
5
- if (!response.ok) {
6
- throw new Error(`Download failed: ${response.status} ${response.statusText}`);
7
- }
8
- const contentLength = Number(response.headers.get("Content-Length") ?? 0);
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 chunks = [];
27
- while (true) {
28
- const { done, value } = await reader.read();
29
- if (done) break;
30
- chunks.push(value);
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
- export {
38
- fetchUrlBytes
39
- };
40
- //# sourceMappingURL=fetch.js.map
50
+ //# sourceMappingURL=fetch.js.map
@@ -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"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Programmatically open file selection dialog
2
+ * 프로그래밍 방식으로 파일 선택 대화상자 열기
3
3
  */
4
4
  export declare function openFileDialog(options?: {
5
5
  accept?: string;