@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-hybrid.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();
|
|
@@ -1310,18 +1298,13 @@ var OPFS = class {
|
|
|
1310
1298
|
if (fileHandle) {
|
|
1311
1299
|
let buffer;
|
|
1312
1300
|
if (this.useSync) {
|
|
1313
|
-
const
|
|
1301
|
+
const access = await fileHandle.createSyncAccessHandle();
|
|
1314
1302
|
try {
|
|
1315
|
-
const
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
buffer = new Uint8Array(size);
|
|
1319
|
-
access.read(buffer);
|
|
1320
|
-
} finally {
|
|
1321
|
-
access.close();
|
|
1322
|
-
}
|
|
1303
|
+
const size = access.getSize();
|
|
1304
|
+
buffer = new Uint8Array(size);
|
|
1305
|
+
access.read(buffer);
|
|
1323
1306
|
} finally {
|
|
1324
|
-
|
|
1307
|
+
access.close();
|
|
1325
1308
|
}
|
|
1326
1309
|
} else {
|
|
1327
1310
|
const file = await fileHandle.getFile();
|
|
@@ -1379,18 +1362,13 @@ var OPFS = class {
|
|
|
1379
1362
|
}
|
|
1380
1363
|
let buffer;
|
|
1381
1364
|
if (this.useSync) {
|
|
1382
|
-
const
|
|
1365
|
+
const access = await fileHandle.createSyncAccessHandle();
|
|
1383
1366
|
try {
|
|
1384
|
-
const
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
buffer = new Uint8Array(size);
|
|
1388
|
-
access.read(buffer);
|
|
1389
|
-
} finally {
|
|
1390
|
-
access.close();
|
|
1391
|
-
}
|
|
1367
|
+
const size = access.getSize();
|
|
1368
|
+
buffer = new Uint8Array(size);
|
|
1369
|
+
access.read(buffer);
|
|
1392
1370
|
} finally {
|
|
1393
|
-
|
|
1371
|
+
access.close();
|
|
1394
1372
|
}
|
|
1395
1373
|
} else {
|
|
1396
1374
|
const file = await fileHandle.getFile();
|
|
@@ -1423,17 +1401,12 @@ var OPFS = class {
|
|
|
1423
1401
|
const { fileHandle } = await this.handleManager.getHandle(resolvedPath, { create: true });
|
|
1424
1402
|
const buffer = typeof data === "string" ? new TextEncoder().encode(data) : data;
|
|
1425
1403
|
if (this.useSync) {
|
|
1426
|
-
const
|
|
1404
|
+
const access = await fileHandle.createSyncAccessHandle();
|
|
1427
1405
|
try {
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
access.truncate(buffer.length);
|
|
1431
|
-
access.write(buffer, { at: 0 });
|
|
1432
|
-
} finally {
|
|
1433
|
-
access.close();
|
|
1434
|
-
}
|
|
1406
|
+
access.truncate(buffer.length);
|
|
1407
|
+
access.write(buffer, { at: 0 });
|
|
1435
1408
|
} finally {
|
|
1436
|
-
|
|
1409
|
+
access.close();
|
|
1437
1410
|
}
|
|
1438
1411
|
} else {
|
|
1439
1412
|
const writable = await fileHandle.createWritable();
|
|
@@ -2047,16 +2020,11 @@ var OPFS = class {
|
|
|
2047
2020
|
const { fileHandle } = await this.handleManager.getHandle(resolvedPath);
|
|
2048
2021
|
if (!fileHandle) throw createENOENT(path);
|
|
2049
2022
|
if (this.useSync) {
|
|
2050
|
-
const
|
|
2023
|
+
const access = await fileHandle.createSyncAccessHandle();
|
|
2051
2024
|
try {
|
|
2052
|
-
|
|
2053
|
-
try {
|
|
2054
|
-
access.truncate(len);
|
|
2055
|
-
} finally {
|
|
2056
|
-
access.close();
|
|
2057
|
-
}
|
|
2025
|
+
access.truncate(len);
|
|
2058
2026
|
} finally {
|
|
2059
|
-
|
|
2027
|
+
access.close();
|
|
2060
2028
|
}
|
|
2061
2029
|
} else {
|
|
2062
2030
|
const file = await fileHandle.getFile();
|