@componentor/fs 1.2.5 → 1.2.7
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/index.js +56 -88
- package/dist/index.js.map +1 -1
- package/dist/opfs-hybrid.js +56 -88
- package/dist/opfs-hybrid.js.map +1 -1
- package/dist/opfs-worker.js +56 -88
- package/dist/opfs-worker.js.map +1 -1
- package/package.json +1 -1
- package/src/handle-manager.ts +37 -49
- package/src/index.ts +19 -39
- package/src/packed-storage.ts +11 -11
- package/src/symlink-manager.ts +3 -3
package/dist/opfs-worker.js
CHANGED
|
@@ -145,52 +145,40 @@ function segments(path) {
|
|
|
145
145
|
// src/handle-manager.ts
|
|
146
146
|
var FILE_HANDLE_POOL_SIZE = 50;
|
|
147
147
|
var DIR_CACHE_MAX_SIZE = 200;
|
|
148
|
-
var
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
waitQueues = /* @__PURE__ */ new Map();
|
|
152
|
-
/**
|
|
153
|
-
* Acquire an exclusive lock on a file path.
|
|
154
|
-
* If the file is already locked, waits until it's released.
|
|
155
|
-
* Returns a release function that MUST be called when done.
|
|
156
|
-
*/
|
|
148
|
+
var FileLock = class {
|
|
149
|
+
active = /* @__PURE__ */ new Set();
|
|
150
|
+
queues = /* @__PURE__ */ new Map();
|
|
157
151
|
async acquire(path) {
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
152
|
+
if (!this.active.has(path)) {
|
|
153
|
+
this.active.add(path);
|
|
154
|
+
return this.createRelease(path);
|
|
161
155
|
}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
156
|
+
await new Promise((resolve) => {
|
|
157
|
+
let queue = this.queues.get(path);
|
|
158
|
+
if (!queue) {
|
|
159
|
+
queue = [];
|
|
160
|
+
this.queues.set(path, queue);
|
|
161
|
+
}
|
|
162
|
+
queue.push(resolve);
|
|
165
163
|
});
|
|
166
|
-
this.
|
|
167
|
-
|
|
164
|
+
return this.createRelease(path);
|
|
165
|
+
}
|
|
166
|
+
createRelease(path) {
|
|
168
167
|
return () => {
|
|
169
|
-
const
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
168
|
+
const queue = this.queues.get(path);
|
|
169
|
+
if (queue && queue.length > 0) {
|
|
170
|
+
const next = queue.shift();
|
|
171
|
+
if (queue.length === 0) {
|
|
172
|
+
this.queues.delete(path);
|
|
173
|
+
}
|
|
174
|
+
next();
|
|
175
|
+
} else {
|
|
176
|
+
this.active.delete(path);
|
|
177
|
+
}
|
|
173
178
|
};
|
|
174
179
|
}
|
|
175
|
-
/**
|
|
176
|
-
* Check if a file is currently locked
|
|
177
|
-
*/
|
|
178
|
-
isLocked(path) {
|
|
179
|
-
return this.locks.has(normalize(path));
|
|
180
|
-
}
|
|
181
|
-
/**
|
|
182
|
-
* Clear all locks (use with caution, mainly for cleanup)
|
|
183
|
-
*/
|
|
184
|
-
clearAll() {
|
|
185
|
-
for (const resolver of this.lockResolvers.values()) {
|
|
186
|
-
resolver();
|
|
187
|
-
}
|
|
188
|
-
this.locks.clear();
|
|
189
|
-
this.lockResolvers.clear();
|
|
190
|
-
this.waitQueues.clear();
|
|
191
|
-
}
|
|
192
180
|
};
|
|
193
|
-
var
|
|
181
|
+
var fileLock = new FileLock();
|
|
194
182
|
var HandleManager = class {
|
|
195
183
|
rootPromise;
|
|
196
184
|
dirCache = /* @__PURE__ */ new Map();
|
|
@@ -448,7 +436,7 @@ var SymlinkManager = class {
|
|
|
448
436
|
if (!fileHandle) return;
|
|
449
437
|
const buffer = new TextEncoder().encode(data);
|
|
450
438
|
if (this.useSync) {
|
|
451
|
-
const
|
|
439
|
+
const release = await fileLock.acquire(SYMLINK_FILE);
|
|
452
440
|
try {
|
|
453
441
|
const access = await fileHandle.createSyncAccessHandle();
|
|
454
442
|
try {
|
|
@@ -461,7 +449,7 @@ var SymlinkManager = class {
|
|
|
461
449
|
access.close();
|
|
462
450
|
}
|
|
463
451
|
} finally {
|
|
464
|
-
|
|
452
|
+
release();
|
|
465
453
|
}
|
|
466
454
|
} else {
|
|
467
455
|
const writable = await fileHandle.createWritable();
|
|
@@ -744,7 +732,7 @@ var PackedStorage = class {
|
|
|
744
732
|
return {};
|
|
745
733
|
}
|
|
746
734
|
if (this.useSync) {
|
|
747
|
-
const
|
|
735
|
+
const release = await fileLock.acquire(PACK_FILE);
|
|
748
736
|
try {
|
|
749
737
|
const access = await fileHandle.createSyncAccessHandle();
|
|
750
738
|
try {
|
|
@@ -772,7 +760,7 @@ var PackedStorage = class {
|
|
|
772
760
|
access.close();
|
|
773
761
|
}
|
|
774
762
|
} finally {
|
|
775
|
-
|
|
763
|
+
release();
|
|
776
764
|
}
|
|
777
765
|
} else {
|
|
778
766
|
const file = await fileHandle.getFile();
|
|
@@ -826,7 +814,7 @@ var PackedStorage = class {
|
|
|
826
814
|
if (!fileHandle) return null;
|
|
827
815
|
let buffer;
|
|
828
816
|
if (this.useSync) {
|
|
829
|
-
const
|
|
817
|
+
const release = await fileLock.acquire(PACK_FILE);
|
|
830
818
|
try {
|
|
831
819
|
const access = await fileHandle.createSyncAccessHandle();
|
|
832
820
|
try {
|
|
@@ -836,7 +824,7 @@ var PackedStorage = class {
|
|
|
836
824
|
access.close();
|
|
837
825
|
}
|
|
838
826
|
} finally {
|
|
839
|
-
|
|
827
|
+
release();
|
|
840
828
|
}
|
|
841
829
|
} else {
|
|
842
830
|
const file = await fileHandle.getFile();
|
|
@@ -876,7 +864,7 @@ var PackedStorage = class {
|
|
|
876
864
|
}
|
|
877
865
|
const decompressPromises = [];
|
|
878
866
|
if (this.useSync) {
|
|
879
|
-
const
|
|
867
|
+
const release = await fileLock.acquire(PACK_FILE);
|
|
880
868
|
try {
|
|
881
869
|
const access = await fileHandle.createSyncAccessHandle();
|
|
882
870
|
try {
|
|
@@ -893,7 +881,7 @@ var PackedStorage = class {
|
|
|
893
881
|
access.close();
|
|
894
882
|
}
|
|
895
883
|
} finally {
|
|
896
|
-
|
|
884
|
+
release();
|
|
897
885
|
}
|
|
898
886
|
} else {
|
|
899
887
|
const file = await fileHandle.getFile();
|
|
@@ -981,7 +969,7 @@ var PackedStorage = class {
|
|
|
981
969
|
const { fileHandle } = await this.handleManager.getHandle(PACK_FILE, { create: true });
|
|
982
970
|
if (!fileHandle) return;
|
|
983
971
|
if (this.useSync) {
|
|
984
|
-
const
|
|
972
|
+
const release = await fileLock.acquire(PACK_FILE);
|
|
985
973
|
try {
|
|
986
974
|
const access = await fileHandle.createSyncAccessHandle();
|
|
987
975
|
try {
|
|
@@ -991,7 +979,7 @@ var PackedStorage = class {
|
|
|
991
979
|
access.close();
|
|
992
980
|
}
|
|
993
981
|
} finally {
|
|
994
|
-
|
|
982
|
+
release();
|
|
995
983
|
}
|
|
996
984
|
} else {
|
|
997
985
|
const writable = await fileHandle.createWritable();
|
|
@@ -1012,7 +1000,7 @@ var PackedStorage = class {
|
|
|
1012
1000
|
const encoder = new TextEncoder();
|
|
1013
1001
|
const newIndexBuf = encoder.encode(JSON.stringify(index));
|
|
1014
1002
|
if (this.useSync) {
|
|
1015
|
-
const
|
|
1003
|
+
const release = await fileLock.acquire(PACK_FILE);
|
|
1016
1004
|
try {
|
|
1017
1005
|
const access = await fileHandle.createSyncAccessHandle();
|
|
1018
1006
|
try {
|
|
@@ -1045,7 +1033,7 @@ var PackedStorage = class {
|
|
|
1045
1033
|
access.close();
|
|
1046
1034
|
}
|
|
1047
1035
|
} finally {
|
|
1048
|
-
|
|
1036
|
+
release();
|
|
1049
1037
|
}
|
|
1050
1038
|
} else {
|
|
1051
1039
|
const file = await fileHandle.getFile();
|
|
@@ -1716,18 +1704,13 @@ var OPFS = class {
|
|
|
1716
1704
|
if (fileHandle) {
|
|
1717
1705
|
let buffer;
|
|
1718
1706
|
if (this.useSync) {
|
|
1719
|
-
const
|
|
1707
|
+
const access = await fileHandle.createSyncAccessHandle();
|
|
1720
1708
|
try {
|
|
1721
|
-
const
|
|
1722
|
-
|
|
1723
|
-
|
|
1724
|
-
buffer = new Uint8Array(size);
|
|
1725
|
-
access.read(buffer);
|
|
1726
|
-
} finally {
|
|
1727
|
-
access.close();
|
|
1728
|
-
}
|
|
1709
|
+
const size = access.getSize();
|
|
1710
|
+
buffer = new Uint8Array(size);
|
|
1711
|
+
access.read(buffer);
|
|
1729
1712
|
} finally {
|
|
1730
|
-
|
|
1713
|
+
access.close();
|
|
1731
1714
|
}
|
|
1732
1715
|
} else {
|
|
1733
1716
|
const file = await fileHandle.getFile();
|
|
@@ -1785,18 +1768,13 @@ var OPFS = class {
|
|
|
1785
1768
|
}
|
|
1786
1769
|
let buffer;
|
|
1787
1770
|
if (this.useSync) {
|
|
1788
|
-
const
|
|
1771
|
+
const access = await fileHandle.createSyncAccessHandle();
|
|
1789
1772
|
try {
|
|
1790
|
-
const
|
|
1791
|
-
|
|
1792
|
-
|
|
1793
|
-
buffer = new Uint8Array(size);
|
|
1794
|
-
access.read(buffer);
|
|
1795
|
-
} finally {
|
|
1796
|
-
access.close();
|
|
1797
|
-
}
|
|
1773
|
+
const size = access.getSize();
|
|
1774
|
+
buffer = new Uint8Array(size);
|
|
1775
|
+
access.read(buffer);
|
|
1798
1776
|
} finally {
|
|
1799
|
-
|
|
1777
|
+
access.close();
|
|
1800
1778
|
}
|
|
1801
1779
|
} else {
|
|
1802
1780
|
const file = await fileHandle.getFile();
|
|
@@ -1829,17 +1807,12 @@ var OPFS = class {
|
|
|
1829
1807
|
const { fileHandle } = await this.handleManager.getHandle(resolvedPath, { create: true });
|
|
1830
1808
|
const buffer = typeof data === "string" ? new TextEncoder().encode(data) : data;
|
|
1831
1809
|
if (this.useSync) {
|
|
1832
|
-
const
|
|
1810
|
+
const access = await fileHandle.createSyncAccessHandle();
|
|
1833
1811
|
try {
|
|
1834
|
-
|
|
1835
|
-
|
|
1836
|
-
access.truncate(buffer.length);
|
|
1837
|
-
access.write(buffer, { at: 0 });
|
|
1838
|
-
} finally {
|
|
1839
|
-
access.close();
|
|
1840
|
-
}
|
|
1812
|
+
access.truncate(buffer.length);
|
|
1813
|
+
access.write(buffer, { at: 0 });
|
|
1841
1814
|
} finally {
|
|
1842
|
-
|
|
1815
|
+
access.close();
|
|
1843
1816
|
}
|
|
1844
1817
|
} else {
|
|
1845
1818
|
const writable = await fileHandle.createWritable();
|
|
@@ -2453,16 +2426,11 @@ var OPFS = class {
|
|
|
2453
2426
|
const { fileHandle } = await this.handleManager.getHandle(resolvedPath);
|
|
2454
2427
|
if (!fileHandle) throw createENOENT(path);
|
|
2455
2428
|
if (this.useSync) {
|
|
2456
|
-
const
|
|
2429
|
+
const access = await fileHandle.createSyncAccessHandle();
|
|
2457
2430
|
try {
|
|
2458
|
-
|
|
2459
|
-
try {
|
|
2460
|
-
access.truncate(len);
|
|
2461
|
-
} finally {
|
|
2462
|
-
access.close();
|
|
2463
|
-
}
|
|
2431
|
+
access.truncate(len);
|
|
2464
2432
|
} finally {
|
|
2465
|
-
|
|
2433
|
+
access.close();
|
|
2466
2434
|
}
|
|
2467
2435
|
} else {
|
|
2468
2436
|
const file = await fileHandle.getFile();
|