@pilotdev/pilot-bim-dataprovider 25.8.0 → 25.10.0
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/lib/index.d.ts +4 -9
- package/lib/index.js +2 -5
- package/lib/index.js.map +1 -1
- package/lib/src/BimDataProviderApi.d.ts +52 -0
- package/lib/src/BimDataProviderApi.js +2 -0
- package/lib/src/BimDataProviderApi.js.map +1 -0
- package/lib/src/model/{BimDataIfcType.d.ts → BimDataClasses.d.ts} +159 -0
- package/lib/src/model/{BimDataIfcType.js → BimDataClasses.js} +203 -1
- package/lib/src/model/BimDataClasses.js.map +1 -0
- package/lib/src/model/BimDataCloudPart.d.ts +6 -12
- package/lib/src/model/BimDataCloudPart.js +12 -17
- package/lib/src/model/BimDataCloudPart.js.map +1 -1
- package/lib/src/model/BimDataModelPart.d.ts +4 -23
- package/lib/src/model/BimDataModelPart.js +22 -36
- package/lib/src/model/BimDataModelPart.js.map +1 -1
- package/lib/src/model/BimDataPart.d.ts +11 -21
- package/lib/src/model/BimDataPart.js +41 -67
- package/lib/src/model/BimDataPart.js.map +1 -1
- package/lib/src/model/BimDataProvider.d.ts +4 -17
- package/lib/src/model/BimDataProvider.js +18 -27
- package/lib/src/model/BimDataProvider.js.map +1 -1
- package/lib/src/utils/Consts.d.ts +17 -0
- package/lib/src/utils/Consts.js +20 -0
- package/lib/src/utils/Consts.js.map +1 -0
- package/lib/src/utils/ViewerTools.d.ts +34 -15
- package/lib/src/utils/ViewerTools.js +121 -14
- package/lib/src/utils/ViewerTools.js.map +1 -1
- package/lib/src/utils/WasmTools.js +1 -1
- package/lib/src/utils/WasmTools.js.map +1 -1
- package/lib/src/wasm/WasmWorker.d.ts +22 -72
- package/lib/src/wasm/WasmWorker.js +89 -184
- package/lib/src/wasm/WasmWorker.js.map +1 -1
- package/lib/src/wasm/{WasmWorkerThreadSafeWrapper.d.ts → WorkerApi.d.ts} +40 -23
- package/lib/src/wasm/WorkerApi.js +2 -0
- package/lib/src/wasm/WorkerApi.js.map +1 -0
- package/lib/src/wasm/cloud_readers/BinaryCloudReader.d.ts +18 -0
- package/lib/src/wasm/cloud_readers/BinaryCloudReader.js +228 -0
- package/lib/src/wasm/cloud_readers/BinaryCloudReader.js.map +1 -0
- package/lib/src/wasm/cloud_readers/ICloudReader.d.ts +10 -0
- package/lib/src/wasm/cloud_readers/ICloudReader.js +2 -0
- package/lib/src/wasm/cloud_readers/ICloudReader.js.map +1 -0
- package/lib/src/wasm/cloud_readers/WasmCloudReader.d.ts +20 -0
- package/lib/src/wasm/cloud_readers/WasmCloudReader.js +53 -0
- package/lib/src/wasm/cloud_readers/WasmCloudReader.js.map +1 -0
- package/lib/src/wasm/data_accessors/CloudPartAccessor.d.ts +20 -0
- package/lib/src/wasm/data_accessors/CloudPartAccessor.js +70 -0
- package/lib/src/wasm/data_accessors/CloudPartAccessor.js.map +1 -0
- package/lib/src/wasm/data_accessors/FileAccessor.d.ts +37 -0
- package/lib/src/wasm/data_accessors/FileAccessor.js +237 -0
- package/lib/src/wasm/data_accessors/FileAccessor.js.map +1 -0
- package/lib/src/wasm/data_accessors/ModelPartAccessor.d.ts +27 -0
- package/lib/src/wasm/data_accessors/ModelPartAccessor.js +142 -0
- package/lib/src/wasm/data_accessors/ModelPartAccessor.js.map +1 -0
- package/lib/src/wasm/file-system/File.d.ts +30 -0
- package/lib/src/wasm/file-system/File.js +58 -0
- package/lib/src/wasm/file-system/File.js.map +1 -0
- package/lib/src/wasm/file-system/FileAccessDispatcher.d.ts +12 -0
- package/lib/src/{model → wasm/file-system}/FileAccessDispatcher.js +68 -26
- package/lib/src/wasm/file-system/FileAccessDispatcher.js.map +1 -0
- package/lib/src/wasm/file-system/FileLoader.d.ts +41 -0
- package/lib/src/wasm/file-system/FileLoader.js +107 -0
- package/lib/src/wasm/file-system/FileLoader.js.map +1 -0
- package/lib/src/wasm/file-system/IFileSystem.d.ts +76 -0
- package/lib/src/wasm/file-system/IFileSystem.js +308 -0
- package/lib/src/wasm/file-system/IFileSystem.js.map +1 -0
- package/lib/src/{file-system → wasm/file-system}/IFileSystemCache.d.ts +10 -6
- package/lib/src/{file-system → wasm/file-system}/IFileSystemCache.js +11 -13
- package/lib/src/wasm/file-system/IFileSystemCache.js.map +1 -0
- package/lib/src/{file-system → wasm/file-system}/OPFS.d.ts +8 -8
- package/lib/src/{file-system → wasm/file-system}/OPFS.js +7 -3
- package/lib/src/wasm/file-system/OPFS.js.map +1 -0
- package/lib/src/wasm/file-system/PATH.js.map +1 -0
- package/lib/src/wasm/file-system/PartialFile.d.ts +48 -0
- package/lib/src/wasm/file-system/PartialFile.js +367 -0
- package/lib/src/wasm/file-system/PartialFile.js.map +1 -0
- package/lib/src/wasm/pilot_bim_dataprovider.d.ts +26 -5
- package/lib/src/wasm/pilot_bim_dataprovider.wasm +0 -0
- package/lib/src/wasm/wasm.worker-node.cjs +1 -1
- package/lib/src/wasm/wasm.worker-web.cjs +1 -1
- package/lib/src/wasm/worker.js +2 -0
- package/lib/src/wasm/worker.js.map +1 -1
- package/package.json +3 -4
- package/lib/src/file-system/IFileSystem.d.ts +0 -50
- package/lib/src/file-system/IFileSystem.js +0 -232
- package/lib/src/file-system/IFileSystem.js.map +0 -1
- package/lib/src/file-system/IFileSystemCache.js.map +0 -1
- package/lib/src/file-system/OPFS.js.map +0 -1
- package/lib/src/file-system/PATH.js.map +0 -1
- package/lib/src/model/BimDataElement.d.ts +0 -106
- package/lib/src/model/BimDataElement.js +0 -45
- package/lib/src/model/BimDataElement.js.map +0 -1
- package/lib/src/model/BimDataElementPropertySet.d.ts +0 -26
- package/lib/src/model/BimDataElementPropertySet.js +0 -90
- package/lib/src/model/BimDataElementPropertySet.js.map +0 -1
- package/lib/src/model/BimDataIfcRepresentationStatus.d.ts +0 -10
- package/lib/src/model/BimDataIfcRepresentationStatus.js +0 -12
- package/lib/src/model/BimDataIfcRepresentationStatus.js.map +0 -1
- package/lib/src/model/BimDataIfcType.js.map +0 -1
- package/lib/src/model/BimDataTessellation.d.ts +0 -13
- package/lib/src/model/BimDataTessellation.js +0 -16
- package/lib/src/model/BimDataTessellation.js.map +0 -1
- package/lib/src/model/Consts.d.ts +0 -7
- package/lib/src/model/Consts.js +0 -8
- package/lib/src/model/Consts.js.map +0 -1
- package/lib/src/model/FileAccessDispatcher.d.ts +0 -14
- package/lib/src/model/FileAccessDispatcher.js.map +0 -1
- package/lib/src/wasm/BimCloudPartAccessor.d.ts +0 -16
- package/lib/src/wasm/BimCloudPartAccessor.js +0 -49
- package/lib/src/wasm/BimCloudPartAccessor.js.map +0 -1
- package/lib/src/wasm/BimDataModelPartAccessor.d.ts +0 -20
- package/lib/src/wasm/BimDataModelPartAccessor.js +0 -89
- package/lib/src/wasm/BimDataModelPartAccessor.js.map +0 -1
- package/lib/src/wasm/BimDataPartAccessor.d.ts +0 -8
- package/lib/src/wasm/BimDataPartAccessor.js +0 -19
- package/lib/src/wasm/BimDataPartAccessor.js.map +0 -1
- package/lib/src/wasm/WasmWorkerThreadSafeWrapper.js +0 -144
- package/lib/src/wasm/WasmWorkerThreadSafeWrapper.js.map +0 -1
- package/lib/src/wasm/index.d.ts +0 -0
- package/lib/src/wasm/index.js +0 -3
- package/lib/src/wasm/index.js.map +0 -1
- /package/lib/src/{file-system → wasm/file-system}/PATH.d.ts +0 -0
- /package/lib/src/{file-system → wasm/file-system}/PATH.js +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
var FileStatus;
|
|
2
2
|
(function (FileStatus) {
|
|
3
3
|
FileStatus[FileStatus["Source"] = 0] = "Source";
|
|
4
4
|
FileStatus[FileStatus["Copy"] = 1] = "Copy";
|
|
@@ -9,12 +9,17 @@ var MsgType;
|
|
|
9
9
|
MsgType[MsgType["CopyRequestMsg"] = 0] = "CopyRequestMsg";
|
|
10
10
|
MsgType[MsgType["OnCopyFinishedMsg"] = 1] = "OnCopyFinishedMsg";
|
|
11
11
|
})(MsgType || (MsgType = {}));
|
|
12
|
+
const LOCK_FILE_PREFIX = 'PilotOPFSFile_';
|
|
13
|
+
const PILOT_LOCK_CHANNEL_NAME = 'PilotFileAccessChannel';
|
|
12
14
|
class MsgBase {
|
|
15
|
+
type;
|
|
13
16
|
constructor(type) {
|
|
14
17
|
this.type = type;
|
|
15
18
|
}
|
|
16
19
|
}
|
|
17
20
|
class CopyRequestMsg extends MsgBase {
|
|
21
|
+
targetPath;
|
|
22
|
+
sourcePath;
|
|
18
23
|
constructor(targetPath, sourcePath) {
|
|
19
24
|
super(MsgType.CopyRequestMsg);
|
|
20
25
|
this.targetPath = targetPath;
|
|
@@ -22,6 +27,8 @@ class CopyRequestMsg extends MsgBase {
|
|
|
22
27
|
}
|
|
23
28
|
}
|
|
24
29
|
class OnCopyFinishedMsg extends MsgBase {
|
|
30
|
+
targetPath;
|
|
31
|
+
success;
|
|
25
32
|
constructor(targetPath, success) {
|
|
26
33
|
super(MsgType.OnCopyFinishedMsg);
|
|
27
34
|
this.targetPath = targetPath;
|
|
@@ -29,42 +36,58 @@ class OnCopyFinishedMsg extends MsgBase {
|
|
|
29
36
|
}
|
|
30
37
|
}
|
|
31
38
|
class LockedFile {
|
|
32
|
-
|
|
39
|
+
lockPromise;
|
|
40
|
+
promiseResolver;
|
|
41
|
+
copyFunc;
|
|
42
|
+
removeFunc;
|
|
43
|
+
_isDisposed = false;
|
|
44
|
+
_operations = new Set;
|
|
45
|
+
lockCounter = 1;
|
|
46
|
+
constructor(lockPromise, promiseResolver, copyFunc, removeFunc) {
|
|
33
47
|
this.lockPromise = lockPromise;
|
|
34
48
|
this.promiseResolver = promiseResolver;
|
|
35
49
|
this.copyFunc = copyFunc;
|
|
36
|
-
this.
|
|
37
|
-
this._operations = new Set;
|
|
50
|
+
this.removeFunc = removeFunc;
|
|
38
51
|
}
|
|
39
52
|
async copy(targetPath, sourcePath) {
|
|
40
53
|
if (this._isDisposed)
|
|
41
54
|
return false;
|
|
42
|
-
const operation = this.copyFunc(targetPath, sourcePath)
|
|
55
|
+
const operation = this.copyFunc(targetPath, sourcePath)
|
|
56
|
+
.then(() => true)
|
|
57
|
+
.catch(() => false);
|
|
43
58
|
this._operations.add(operation);
|
|
44
59
|
return operation.then((result) => { this._operations.delete(operation); return result; });
|
|
45
60
|
}
|
|
46
61
|
async dispose() {
|
|
47
62
|
this._isDisposed = true;
|
|
48
63
|
await Promise.all(this._operations);
|
|
64
|
+
if (this.removeFunc)
|
|
65
|
+
this.removeFunc();
|
|
49
66
|
this.promiseResolver();
|
|
50
67
|
await this.lockPromise;
|
|
51
68
|
}
|
|
52
69
|
}
|
|
53
70
|
export class FileAccessDispatcher {
|
|
71
|
+
_locks;
|
|
72
|
+
_broadcastChannel;
|
|
73
|
+
_tabId;
|
|
54
74
|
constructor() {
|
|
75
|
+
this._tabId = (0xffffffff * Math.random() >>> 0) + '';
|
|
55
76
|
this._locks = new Map();
|
|
56
|
-
this._broadcastChannel = new BroadcastChannel(
|
|
77
|
+
this._broadcastChannel = new BroadcastChannel(PILOT_LOCK_CHANNEL_NAME);
|
|
57
78
|
this._broadcastChannel.addEventListener('message', ({ data }) => {
|
|
58
79
|
if (data?.type == null) {
|
|
59
80
|
return;
|
|
60
81
|
}
|
|
61
82
|
switch (data.type) {
|
|
62
83
|
case MsgType.CopyRequestMsg:
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
84
|
+
{
|
|
85
|
+
const copyMsg = data;
|
|
86
|
+
this._locks.get(copyMsg.sourcePath)?.copy(copyMsg.targetPath, copyMsg.sourcePath).then((success) => {
|
|
87
|
+
const echo = new OnCopyFinishedMsg(copyMsg.targetPath, success);
|
|
88
|
+
this._broadcastChannel.postMessage(echo);
|
|
89
|
+
});
|
|
90
|
+
}
|
|
68
91
|
break;
|
|
69
92
|
case MsgType.OnCopyFinishedMsg:
|
|
70
93
|
// do nothing
|
|
@@ -72,13 +95,15 @@ export class FileAccessDispatcher {
|
|
|
72
95
|
}
|
|
73
96
|
});
|
|
74
97
|
}
|
|
75
|
-
async lockFile(path,
|
|
76
|
-
const
|
|
98
|
+
async lockFile(path, copyFunc, removeFunc) {
|
|
99
|
+
const copyPath = this._tabId + '_' + path;
|
|
77
100
|
if (this._locks.has(path)) {
|
|
78
|
-
|
|
101
|
+
this._locks.get(path).lockCounter++;
|
|
102
|
+
return path;
|
|
79
103
|
}
|
|
80
104
|
if (this._locks.has(copyPath)) {
|
|
81
|
-
|
|
105
|
+
this._locks.get(copyPath).lockCounter++;
|
|
106
|
+
return copyPath;
|
|
82
107
|
}
|
|
83
108
|
let resolvePrepareFile;
|
|
84
109
|
const prepareFilePromise = new Promise((resolve) => {
|
|
@@ -88,9 +113,11 @@ export class FileAccessDispatcher {
|
|
|
88
113
|
const innerLockPromise = new Promise((resolve) => {
|
|
89
114
|
releaseLock = resolve;
|
|
90
115
|
});
|
|
91
|
-
const lockPromise = navigator.locks.request(
|
|
116
|
+
const lockPromise = navigator.locks.request(LOCK_FILE_PREFIX + path, { ifAvailable: true }, async (lock) => {
|
|
92
117
|
if (lock == null) {
|
|
93
|
-
const
|
|
118
|
+
const requestCopyPromise = this.requestCopy(copyPath, path);
|
|
119
|
+
navigator.locks.request(LOCK_FILE_PREFIX + copyPath, () => requestCopyPromise);
|
|
120
|
+
const copySucess = await requestCopyPromise;
|
|
94
121
|
if (copySucess) {
|
|
95
122
|
resolvePrepareFile(FileStatus.Copy);
|
|
96
123
|
}
|
|
@@ -103,30 +130,45 @@ export class FileAccessDispatcher {
|
|
|
103
130
|
await innerLockPromise;
|
|
104
131
|
}
|
|
105
132
|
});
|
|
106
|
-
return
|
|
133
|
+
return prepareFilePromise.then(fileStatus => {
|
|
107
134
|
switch (fileStatus) {
|
|
108
135
|
case FileStatus.Source:
|
|
109
136
|
this._locks.set(path, new LockedFile(lockPromise, releaseLock, copyFunc));
|
|
110
|
-
|
|
137
|
+
return path;
|
|
111
138
|
case FileStatus.Copy:
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
139
|
+
{
|
|
140
|
+
const lockCopyPromise = navigator.locks.request(LOCK_FILE_PREFIX + copyPath, () => innerLockPromise);
|
|
141
|
+
this._locks.set(copyPath, new LockedFile(lockCopyPromise, releaseLock, copyFunc, () => removeFunc(copyPath)));
|
|
142
|
+
return copyPath;
|
|
143
|
+
}
|
|
115
144
|
case FileStatus.Failed:
|
|
116
|
-
|
|
145
|
+
throw new Error("Failed to copy file.");
|
|
117
146
|
}
|
|
118
|
-
return fileStatus;
|
|
119
147
|
});
|
|
120
148
|
}
|
|
121
149
|
async unlockFile(path) {
|
|
122
|
-
|
|
123
|
-
|
|
150
|
+
const lockedFile = this._locks.get(path);
|
|
151
|
+
if (lockedFile && --lockedFile.lockCounter < 1) {
|
|
152
|
+
this._locks.delete(path);
|
|
153
|
+
await lockedFile.dispose();
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
isLockedByThisTab(path) {
|
|
157
|
+
return this._locks.has(path);
|
|
158
|
+
}
|
|
159
|
+
async isLocked(path) {
|
|
160
|
+
if (this.isLockedByThisTab(path))
|
|
161
|
+
return true;
|
|
162
|
+
const locks = await navigator.locks.query();
|
|
163
|
+
return (locks.held?.some(lock => lock.name == LOCK_FILE_PREFIX + path) ?? false) ||
|
|
164
|
+
(locks.pending?.some(lock => lock.name == LOCK_FILE_PREFIX + path) ?? false);
|
|
124
165
|
}
|
|
125
166
|
async dispose() {
|
|
126
167
|
const pathes = Array.from(this._locks.keys());
|
|
127
168
|
for (let i = 0; i < pathes.length; i++) {
|
|
128
169
|
await this.unlockFile(pathes[i]);
|
|
129
170
|
}
|
|
171
|
+
this._locks.clear();
|
|
130
172
|
this._broadcastChannel.close();
|
|
131
173
|
}
|
|
132
174
|
requestCopy(copyPath, path) {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileAccessDispatcher.js","sourceRoot":"","sources":["../../../../src/wasm/file-system/FileAccessDispatcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { IFile } from "./File.js";
|
|
2
|
+
export declare enum FetchStatus {
|
|
3
|
+
Error = 0,
|
|
4
|
+
FullFile = 200,
|
|
5
|
+
PartialContent = 206,
|
|
6
|
+
InvalidRange = 416
|
|
7
|
+
}
|
|
8
|
+
export type Range = {
|
|
9
|
+
startByte: number;
|
|
10
|
+
endByte: number;
|
|
11
|
+
};
|
|
12
|
+
type InvalidRangeResponse = {
|
|
13
|
+
status: FetchStatus.InvalidRange;
|
|
14
|
+
length: number;
|
|
15
|
+
};
|
|
16
|
+
type PartialContentResponse = {
|
|
17
|
+
status: FetchStatus.PartialContent;
|
|
18
|
+
data: ArrayBuffer;
|
|
19
|
+
range: Range;
|
|
20
|
+
length: number;
|
|
21
|
+
};
|
|
22
|
+
type FullFileResponse = {
|
|
23
|
+
status: FetchStatus.FullFile;
|
|
24
|
+
data: Blob;
|
|
25
|
+
};
|
|
26
|
+
type ErrorResponse = {
|
|
27
|
+
status: FetchStatus.Error;
|
|
28
|
+
data: string;
|
|
29
|
+
};
|
|
30
|
+
type Response = InvalidRangeResponse | PartialContentResponse | FullFileResponse | ErrorResponse;
|
|
31
|
+
export declare class FileLoader {
|
|
32
|
+
static fetchRange(source: string | URL, range: Range): Promise<Response>;
|
|
33
|
+
static fetchFile(source: string | URL, chunkSize: number, file: IFile, fileLength?: number, offset?: number): Promise<void>;
|
|
34
|
+
static writeBlobToFile(source: Blob, chunkSize: number, file: IFile): Promise<void>;
|
|
35
|
+
static readChunk(start: number, size: number, source: Blob): Promise<ArrayBuffer>;
|
|
36
|
+
static parseContentRange(headerString: string | null): {
|
|
37
|
+
range: Range;
|
|
38
|
+
length: number;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
export {};
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
export var FetchStatus;
|
|
2
|
+
(function (FetchStatus) {
|
|
3
|
+
FetchStatus[FetchStatus["Error"] = 0] = "Error";
|
|
4
|
+
FetchStatus[FetchStatus["FullFile"] = 200] = "FullFile";
|
|
5
|
+
FetchStatus[FetchStatus["PartialContent"] = 206] = "PartialContent";
|
|
6
|
+
FetchStatus[FetchStatus["InvalidRange"] = 416] = "InvalidRange";
|
|
7
|
+
})(FetchStatus || (FetchStatus = {}));
|
|
8
|
+
export class FileLoader {
|
|
9
|
+
static async fetchRange(source, range) {
|
|
10
|
+
try {
|
|
11
|
+
const response = await fetch(source, {
|
|
12
|
+
headers: {
|
|
13
|
+
'Range': `bytes=${range.startByte}-${range.endByte}`
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
switch (response.status) {
|
|
17
|
+
case FetchStatus.InvalidRange:
|
|
18
|
+
{
|
|
19
|
+
const contentRange = this.parseContentRange(response.headers.get('content-range'));
|
|
20
|
+
return { status: FetchStatus.InvalidRange, length: contentRange.length };
|
|
21
|
+
}
|
|
22
|
+
case FetchStatus.PartialContent:
|
|
23
|
+
{
|
|
24
|
+
const contentRange = this.parseContentRange(response.headers.get('content-range'));
|
|
25
|
+
const data = await response.arrayBuffer();
|
|
26
|
+
return { status: FetchStatus.PartialContent, data, range: contentRange.range, length: contentRange.length };
|
|
27
|
+
}
|
|
28
|
+
case FetchStatus.FullFile: {
|
|
29
|
+
const blob = await response.blob();
|
|
30
|
+
return { status: FetchStatus.FullFile, data: blob };
|
|
31
|
+
}
|
|
32
|
+
default:
|
|
33
|
+
return { status: FetchStatus.Error, data: response.statusText };
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
catch (e) {
|
|
37
|
+
return { status: FetchStatus.Error, data: `Failed to fetch file: ${e}` };
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
static async fetchFile(source, chunkSize, file, fileLength, offset) {
|
|
41
|
+
let fileSize = fileLength ?? Number.MAX_SAFE_INTEGER;
|
|
42
|
+
let startByte = offset ?? 0;
|
|
43
|
+
let endByte = Math.min(fileSize, startByte + chunkSize) - 1;
|
|
44
|
+
const range = { startByte, endByte };
|
|
45
|
+
while (startByte < fileSize) {
|
|
46
|
+
// TODO: Parallel fetch with cancellation
|
|
47
|
+
const response = await this.fetchRange(source, range);
|
|
48
|
+
if (response.status == FetchStatus.FullFile) {
|
|
49
|
+
const blob = await response.data;
|
|
50
|
+
return this.writeBlobToFile(blob, chunkSize, file);
|
|
51
|
+
}
|
|
52
|
+
if (response.status == FetchStatus.PartialContent) {
|
|
53
|
+
fileSize = response.length;
|
|
54
|
+
await file.write(response.data, startByte);
|
|
55
|
+
range.startByte = startByte = endByte + 1;
|
|
56
|
+
range.endByte = endByte = Math.min(fileSize, startByte + chunkSize) - 1;
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
if (response.status == FetchStatus.InvalidRange && fileSize == Number.MAX_SAFE_INTEGER) {
|
|
60
|
+
// In case of InvalidRange due to unset fileSize we need to update fileSize and try again.
|
|
61
|
+
fileSize = response.length;
|
|
62
|
+
range.endByte = endByte = Math.min(fileSize, startByte + chunkSize) - 1;
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
if (startByte < fileSize) {
|
|
68
|
+
// If we failed to fetch file via fetchRange, fallback to usual fetch
|
|
69
|
+
const response = await fetch(source);
|
|
70
|
+
const blob = await response.blob();
|
|
71
|
+
return this.writeBlobToFile(blob, chunkSize, file);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
static async writeBlobToFile(source, chunkSize, file) {
|
|
75
|
+
const numOfChunks = Math.floor(source.size / chunkSize) + (source.size % chunkSize > 0 ? 1 : 0);
|
|
76
|
+
for (let i = 0, position = 0; i < numOfChunks; i++, position += chunkSize) {
|
|
77
|
+
const buffer = await this.readChunk(position, chunkSize, source);
|
|
78
|
+
await file.write(buffer, position);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
static async readChunk(start, size, source) {
|
|
82
|
+
const end = Math.min(start + size, source.size);
|
|
83
|
+
const slice = (start == 0 && end == source.size) ? source : source.slice(start, end);
|
|
84
|
+
const fileReader = new FileReader();
|
|
85
|
+
return new Promise((resolve, reject) => {
|
|
86
|
+
fileReader.onload = () => resolve(fileReader.result);
|
|
87
|
+
fileReader.onerror = reject;
|
|
88
|
+
fileReader.readAsArrayBuffer(slice);
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
static parseContentRange(headerString) {
|
|
92
|
+
if (!headerString)
|
|
93
|
+
throw new Error("Content-Range header is not defined.");
|
|
94
|
+
const contentRange = headerString.toLowerCase().trim();
|
|
95
|
+
const pattern = /^(?:\w+)\s+(?:(?:(\d+)-(\d+))+|\*)\/(?:(\d+)|\*)$/;
|
|
96
|
+
const match = contentRange.match(pattern);
|
|
97
|
+
if (!match)
|
|
98
|
+
throw new Error("Failed to parse Content-Range header.");
|
|
99
|
+
const [, startByte, endByte, contentLength] = match;
|
|
100
|
+
const length = Number(contentLength);
|
|
101
|
+
if (!Number.isInteger(length))
|
|
102
|
+
throw new Error("Invalid Content-Range: the document size must be specified.");
|
|
103
|
+
const range = { startByte: Number(startByte), endByte: Number(endByte) };
|
|
104
|
+
return { range, length };
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=FileLoader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileLoader.js","sourceRoot":"","sources":["../../../../src/wasm/file-system/FileLoader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { FS } from "../pilot_bim_dataprovider.js";
|
|
2
|
+
import { IOpfsDirNode, IOpfsFileNode } from "./IFileSystemCache.js";
|
|
3
|
+
import { ISyncFileSystem } from "./OPFS.js";
|
|
4
|
+
import { IMemoryGuard } from "../WorkerApi.js";
|
|
5
|
+
export type FileInfo = {
|
|
6
|
+
path: string;
|
|
7
|
+
size: number;
|
|
8
|
+
sizeOnDisk: number;
|
|
9
|
+
lastModified: number;
|
|
10
|
+
};
|
|
11
|
+
export interface IFileSystem {
|
|
12
|
+
init(opfsRoot: string): Promise<void>;
|
|
13
|
+
mountTo(fs: FS, mountpoint: string): void;
|
|
14
|
+
makeDir(path: string): Promise<void>;
|
|
15
|
+
makeFile(path: string, data: Uint8Array): Promise<void>;
|
|
16
|
+
writeFile(path: string, data: Uint8Array, position?: number): Promise<void>;
|
|
17
|
+
readFile(path: string, position: number, size: number, buffer?: Uint8Array, offset?: number): Promise<Uint8Array>;
|
|
18
|
+
isFileExists(path: string): boolean;
|
|
19
|
+
remove(path: string): Promise<void>;
|
|
20
|
+
copyFile(modelPartTarget: string, modelPartSource: string): Promise<void>;
|
|
21
|
+
dispose(): Promise<void>;
|
|
22
|
+
openSyncFileAccess(path: string): Promise<void>;
|
|
23
|
+
closeSyncFileAccess(path: string, force?: boolean): void;
|
|
24
|
+
estimate(): Promise<StorageEstimate>;
|
|
25
|
+
actualizeFilePath(path: string): Promise<void>;
|
|
26
|
+
getFileInfo(path: string): FileInfo;
|
|
27
|
+
getCachedFiles(): Promise<Array<FileInfo>>;
|
|
28
|
+
}
|
|
29
|
+
export declare class AsyncFileSystem implements IFileSystem, ISyncFileSystem {
|
|
30
|
+
private _cache;
|
|
31
|
+
private _root?;
|
|
32
|
+
constructor();
|
|
33
|
+
mountTo(fs: FS, mountpoint: string): void;
|
|
34
|
+
init(opfsRoot: string): Promise<void>;
|
|
35
|
+
estimate(): Promise<StorageEstimate>;
|
|
36
|
+
makeDir(path: string): Promise<void>;
|
|
37
|
+
makeFile(path: string, data: Uint8Array): Promise<void>;
|
|
38
|
+
writeFile(path: string, data: Uint8Array, position?: number): Promise<void>;
|
|
39
|
+
readFile(path: string, position: number, size: number, buffer?: Uint8Array, offset?: number): Promise<Uint8Array>;
|
|
40
|
+
remove(path: string): Promise<void>;
|
|
41
|
+
copyFile(pathTarget: string, pathSource: string): Promise<void>;
|
|
42
|
+
openSyncFileAccess(path: string): Promise<void>;
|
|
43
|
+
closeSyncFileAccess(path: string, force?: boolean): void;
|
|
44
|
+
readdir(path: string): string[];
|
|
45
|
+
lookup(path: string): IOpfsDirNode | IOpfsFileNode | undefined;
|
|
46
|
+
dispose(): Promise<void>;
|
|
47
|
+
actualizeFilePath(path: string): Promise<void>;
|
|
48
|
+
getCachedFiles(): Promise<Array<FileInfo>>;
|
|
49
|
+
isFileExists(path: string): boolean;
|
|
50
|
+
getFileInfo(path: string): FileInfo;
|
|
51
|
+
private getLocalPath;
|
|
52
|
+
}
|
|
53
|
+
export declare class ProxyFileSystem implements IFileSystem {
|
|
54
|
+
readonly memoryGuard: IMemoryGuard;
|
|
55
|
+
private _fs;
|
|
56
|
+
private _mountpoint;
|
|
57
|
+
constructor(memoryGuard: IMemoryGuard);
|
|
58
|
+
init(): Promise<void>;
|
|
59
|
+
estimate(): Promise<StorageEstimate>;
|
|
60
|
+
mountTo(fs: FS, mountpoint: string): void;
|
|
61
|
+
makeDir(path: string): Promise<void>;
|
|
62
|
+
makeFile(path: string, data: Uint8Array): Promise<void>;
|
|
63
|
+
writeFile(path: string, data: Uint8Array, position?: number): Promise<void>;
|
|
64
|
+
readFile(path: string, position: number, size: number): Promise<Uint8Array>;
|
|
65
|
+
remove(path: string): Promise<void>;
|
|
66
|
+
copyFile(): Promise<void>;
|
|
67
|
+
openSyncFileAccess(): Promise<void>;
|
|
68
|
+
closeSyncFileAccess(): void;
|
|
69
|
+
dispose(): Promise<void>;
|
|
70
|
+
actualizeFilePath(): Promise<void>;
|
|
71
|
+
getCachedFiles(): Promise<Array<FileInfo>>;
|
|
72
|
+
isFileExists(path: string): boolean;
|
|
73
|
+
getSize(path: string): number;
|
|
74
|
+
getFileInfo(path: string): FileInfo;
|
|
75
|
+
private getLocalPath;
|
|
76
|
+
}
|