@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.
Files changed (122) hide show
  1. package/lib/index.d.ts +4 -9
  2. package/lib/index.js +2 -5
  3. package/lib/index.js.map +1 -1
  4. package/lib/src/BimDataProviderApi.d.ts +52 -0
  5. package/lib/src/BimDataProviderApi.js +2 -0
  6. package/lib/src/BimDataProviderApi.js.map +1 -0
  7. package/lib/src/model/{BimDataIfcType.d.ts → BimDataClasses.d.ts} +159 -0
  8. package/lib/src/model/{BimDataIfcType.js → BimDataClasses.js} +203 -1
  9. package/lib/src/model/BimDataClasses.js.map +1 -0
  10. package/lib/src/model/BimDataCloudPart.d.ts +6 -12
  11. package/lib/src/model/BimDataCloudPart.js +12 -17
  12. package/lib/src/model/BimDataCloudPart.js.map +1 -1
  13. package/lib/src/model/BimDataModelPart.d.ts +4 -23
  14. package/lib/src/model/BimDataModelPart.js +22 -36
  15. package/lib/src/model/BimDataModelPart.js.map +1 -1
  16. package/lib/src/model/BimDataPart.d.ts +11 -21
  17. package/lib/src/model/BimDataPart.js +41 -67
  18. package/lib/src/model/BimDataPart.js.map +1 -1
  19. package/lib/src/model/BimDataProvider.d.ts +4 -17
  20. package/lib/src/model/BimDataProvider.js +18 -27
  21. package/lib/src/model/BimDataProvider.js.map +1 -1
  22. package/lib/src/utils/Consts.d.ts +17 -0
  23. package/lib/src/utils/Consts.js +20 -0
  24. package/lib/src/utils/Consts.js.map +1 -0
  25. package/lib/src/utils/ViewerTools.d.ts +34 -15
  26. package/lib/src/utils/ViewerTools.js +121 -14
  27. package/lib/src/utils/ViewerTools.js.map +1 -1
  28. package/lib/src/utils/WasmTools.js +1 -1
  29. package/lib/src/utils/WasmTools.js.map +1 -1
  30. package/lib/src/wasm/WasmWorker.d.ts +22 -72
  31. package/lib/src/wasm/WasmWorker.js +89 -184
  32. package/lib/src/wasm/WasmWorker.js.map +1 -1
  33. package/lib/src/wasm/{WasmWorkerThreadSafeWrapper.d.ts → WorkerApi.d.ts} +40 -23
  34. package/lib/src/wasm/WorkerApi.js +2 -0
  35. package/lib/src/wasm/WorkerApi.js.map +1 -0
  36. package/lib/src/wasm/cloud_readers/BinaryCloudReader.d.ts +18 -0
  37. package/lib/src/wasm/cloud_readers/BinaryCloudReader.js +228 -0
  38. package/lib/src/wasm/cloud_readers/BinaryCloudReader.js.map +1 -0
  39. package/lib/src/wasm/cloud_readers/ICloudReader.d.ts +10 -0
  40. package/lib/src/wasm/cloud_readers/ICloudReader.js +2 -0
  41. package/lib/src/wasm/cloud_readers/ICloudReader.js.map +1 -0
  42. package/lib/src/wasm/cloud_readers/WasmCloudReader.d.ts +20 -0
  43. package/lib/src/wasm/cloud_readers/WasmCloudReader.js +53 -0
  44. package/lib/src/wasm/cloud_readers/WasmCloudReader.js.map +1 -0
  45. package/lib/src/wasm/data_accessors/CloudPartAccessor.d.ts +20 -0
  46. package/lib/src/wasm/data_accessors/CloudPartAccessor.js +70 -0
  47. package/lib/src/wasm/data_accessors/CloudPartAccessor.js.map +1 -0
  48. package/lib/src/wasm/data_accessors/FileAccessor.d.ts +37 -0
  49. package/lib/src/wasm/data_accessors/FileAccessor.js +237 -0
  50. package/lib/src/wasm/data_accessors/FileAccessor.js.map +1 -0
  51. package/lib/src/wasm/data_accessors/ModelPartAccessor.d.ts +27 -0
  52. package/lib/src/wasm/data_accessors/ModelPartAccessor.js +142 -0
  53. package/lib/src/wasm/data_accessors/ModelPartAccessor.js.map +1 -0
  54. package/lib/src/wasm/file-system/File.d.ts +30 -0
  55. package/lib/src/wasm/file-system/File.js +58 -0
  56. package/lib/src/wasm/file-system/File.js.map +1 -0
  57. package/lib/src/wasm/file-system/FileAccessDispatcher.d.ts +12 -0
  58. package/lib/src/{model → wasm/file-system}/FileAccessDispatcher.js +68 -26
  59. package/lib/src/wasm/file-system/FileAccessDispatcher.js.map +1 -0
  60. package/lib/src/wasm/file-system/FileLoader.d.ts +41 -0
  61. package/lib/src/wasm/file-system/FileLoader.js +107 -0
  62. package/lib/src/wasm/file-system/FileLoader.js.map +1 -0
  63. package/lib/src/wasm/file-system/IFileSystem.d.ts +76 -0
  64. package/lib/src/wasm/file-system/IFileSystem.js +308 -0
  65. package/lib/src/wasm/file-system/IFileSystem.js.map +1 -0
  66. package/lib/src/{file-system → wasm/file-system}/IFileSystemCache.d.ts +10 -6
  67. package/lib/src/{file-system → wasm/file-system}/IFileSystemCache.js +11 -13
  68. package/lib/src/wasm/file-system/IFileSystemCache.js.map +1 -0
  69. package/lib/src/{file-system → wasm/file-system}/OPFS.d.ts +8 -8
  70. package/lib/src/{file-system → wasm/file-system}/OPFS.js +7 -3
  71. package/lib/src/wasm/file-system/OPFS.js.map +1 -0
  72. package/lib/src/wasm/file-system/PATH.js.map +1 -0
  73. package/lib/src/wasm/file-system/PartialFile.d.ts +48 -0
  74. package/lib/src/wasm/file-system/PartialFile.js +367 -0
  75. package/lib/src/wasm/file-system/PartialFile.js.map +1 -0
  76. package/lib/src/wasm/pilot_bim_dataprovider.d.ts +26 -5
  77. package/lib/src/wasm/pilot_bim_dataprovider.wasm +0 -0
  78. package/lib/src/wasm/wasm.worker-node.cjs +1 -1
  79. package/lib/src/wasm/wasm.worker-web.cjs +1 -1
  80. package/lib/src/wasm/worker.js +2 -0
  81. package/lib/src/wasm/worker.js.map +1 -1
  82. package/package.json +3 -4
  83. package/lib/src/file-system/IFileSystem.d.ts +0 -50
  84. package/lib/src/file-system/IFileSystem.js +0 -232
  85. package/lib/src/file-system/IFileSystem.js.map +0 -1
  86. package/lib/src/file-system/IFileSystemCache.js.map +0 -1
  87. package/lib/src/file-system/OPFS.js.map +0 -1
  88. package/lib/src/file-system/PATH.js.map +0 -1
  89. package/lib/src/model/BimDataElement.d.ts +0 -106
  90. package/lib/src/model/BimDataElement.js +0 -45
  91. package/lib/src/model/BimDataElement.js.map +0 -1
  92. package/lib/src/model/BimDataElementPropertySet.d.ts +0 -26
  93. package/lib/src/model/BimDataElementPropertySet.js +0 -90
  94. package/lib/src/model/BimDataElementPropertySet.js.map +0 -1
  95. package/lib/src/model/BimDataIfcRepresentationStatus.d.ts +0 -10
  96. package/lib/src/model/BimDataIfcRepresentationStatus.js +0 -12
  97. package/lib/src/model/BimDataIfcRepresentationStatus.js.map +0 -1
  98. package/lib/src/model/BimDataIfcType.js.map +0 -1
  99. package/lib/src/model/BimDataTessellation.d.ts +0 -13
  100. package/lib/src/model/BimDataTessellation.js +0 -16
  101. package/lib/src/model/BimDataTessellation.js.map +0 -1
  102. package/lib/src/model/Consts.d.ts +0 -7
  103. package/lib/src/model/Consts.js +0 -8
  104. package/lib/src/model/Consts.js.map +0 -1
  105. package/lib/src/model/FileAccessDispatcher.d.ts +0 -14
  106. package/lib/src/model/FileAccessDispatcher.js.map +0 -1
  107. package/lib/src/wasm/BimCloudPartAccessor.d.ts +0 -16
  108. package/lib/src/wasm/BimCloudPartAccessor.js +0 -49
  109. package/lib/src/wasm/BimCloudPartAccessor.js.map +0 -1
  110. package/lib/src/wasm/BimDataModelPartAccessor.d.ts +0 -20
  111. package/lib/src/wasm/BimDataModelPartAccessor.js +0 -89
  112. package/lib/src/wasm/BimDataModelPartAccessor.js.map +0 -1
  113. package/lib/src/wasm/BimDataPartAccessor.d.ts +0 -8
  114. package/lib/src/wasm/BimDataPartAccessor.js +0 -19
  115. package/lib/src/wasm/BimDataPartAccessor.js.map +0 -1
  116. package/lib/src/wasm/WasmWorkerThreadSafeWrapper.js +0 -144
  117. package/lib/src/wasm/WasmWorkerThreadSafeWrapper.js.map +0 -1
  118. package/lib/src/wasm/index.d.ts +0 -0
  119. package/lib/src/wasm/index.js +0 -3
  120. package/lib/src/wasm/index.js.map +0 -1
  121. /package/lib/src/{file-system → wasm/file-system}/PATH.d.ts +0 -0
  122. /package/lib/src/{file-system → wasm/file-system}/PATH.js +0 -0
@@ -1,4 +1,4 @@
1
- export var FileStatus;
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
- constructor(lockPromise, promiseResolver, copyFunc) {
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._isDisposed = false;
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("PilotFileAccessChannel");
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
- const copyMsg = data;
64
- this._locks.get(copyMsg.sourcePath)?.copy(copyMsg.targetPath, copyMsg.sourcePath).then((success) => {
65
- const echo = new OnCopyFinishedMsg(copyMsg.targetPath, success);
66
- this._broadcastChannel.postMessage(echo);
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, copyPath, copyFunc) {
76
- const locksNamePrefix = 'PilotOPFSFile ';
98
+ async lockFile(path, copyFunc, removeFunc) {
99
+ const copyPath = this._tabId + '_' + path;
77
100
  if (this._locks.has(path)) {
78
- return FileStatus.Source;
101
+ this._locks.get(path).lockCounter++;
102
+ return path;
79
103
  }
80
104
  if (this._locks.has(copyPath)) {
81
- return FileStatus.Copy;
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(locksNamePrefix + path, { ifAvailable: true }, async (lock) => {
116
+ const lockPromise = navigator.locks.request(LOCK_FILE_PREFIX + path, { ifAvailable: true }, async (lock) => {
92
117
  if (lock == null) {
93
- const copySucess = await this.requestCopy(copyPath, path);
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 await prepareFilePromise.then(fileStatus => {
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
- break;
137
+ return path;
111
138
  case FileStatus.Copy:
112
- const lockCopyPromise = navigator.locks.request(locksNamePrefix + copyPath, () => innerLockPromise);
113
- this._locks.set(copyPath, new LockedFile(lockCopyPromise, releaseLock, copyFunc));
114
- break;
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
- break;
145
+ throw new Error("Failed to copy file.");
117
146
  }
118
- return fileStatus;
119
147
  });
120
148
  }
121
149
  async unlockFile(path) {
122
- await this._locks.get(path)?.dispose();
123
- this._locks.delete(path);
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":"AAEA,MAAM,CAAN,IAAY,WAKX;AALD,WAAY,WAAW;IACrB,+CAAS,CAAA;IACT,uDAAc,CAAA;IACd,mEAAoB,CAAA;IACpB,+DAAkB,CAAA;AACpB,CAAC,EALW,WAAW,KAAX,WAAW,QAKtB;AAcD,MAAM,OAAO,UAAU;IACrB,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAoB,EAAE,KAAY;QACxD,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE;gBACnC,OAAO,EAAE;oBACP,OAAO,EAAE,SAAS,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,OAAO,EAAE;iBACrD;aACF,CAAC,CAAC;YAEH,QAAQ,QAAQ,CAAC,MAAM,EAAE;gBACvB,KAAK,WAAW,CAAC,YAAY;oBAC3B;wBACE,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;wBACnF,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,CAAC,MAAM,EAAE,CAAC;qBAC1E;gBAEH,KAAK,WAAW,CAAC,cAAc;oBAC7B;wBACE,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;wBACnF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;wBAC1C,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,MAAM,EAAE,CAAC;qBAC7G;gBAEH,KAAK,WAAW,CAAC,QAAQ,CAAC,CAAC;oBACzB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;oBACnC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;iBACrD;gBAED;oBACE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC;aACnE;SACF;QACD,OAAO,CAAC,EAAE;YACR,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,yBAAyB,CAAC,EAAE,EAAE,CAAA;SACzE;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAoB,EAAE,SAAiB,EAAE,IAAW,EAAE,UAAmB,EAAE,MAAe;QAC/G,IAAI,QAAQ,GAAG,UAAU,IAAI,MAAM,CAAC,gBAAgB,CAAC;QACrD,IAAI,SAAS,GAAG,MAAM,IAAI,CAAC,CAAC;QAC5B,IAAI,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAC5D,MAAM,KAAK,GAAU,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;QAE5C,OAAO,SAAS,GAAG,QAAQ,EAAE;YAC3B,yCAAyC;YACzC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAEtD,IAAI,QAAQ,CAAC,MAAM,IAAI,WAAW,CAAC,QAAQ,EAAE;gBAC3C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC;gBACjC,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;aACpD;YAED,IAAI,QAAQ,CAAC,MAAM,IAAI,WAAW,CAAC,cAAc,EAAE;gBACjD,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC;gBAC3B,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;gBAC3C,KAAK,CAAC,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,CAAC,CAAC;gBAC1C,KAAK,CAAC,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;gBACxE,SAAS;aACV;YAED,IAAI,QAAQ,CAAC,MAAM,IAAI,WAAW,CAAC,YAAY,IAAI,QAAQ,IAAI,MAAM,CAAC,gBAAgB,EAAE;gBACtF,0FAA0F;gBAC1F,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC;gBAC3B,KAAK,CAAC,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;gBACxE,SAAS;aACV;YAED,MAAM;SACP;QAED,IAAI,SAAS,GAAG,QAAQ,EAAE;YACxB,qEAAqE;YACrE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;YACrC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;SACpD;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,MAAY,EAAE,SAAiB,EAAE,IAAW;QACvE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEhG,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,QAAQ,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,QAAQ,IAAI,SAAS,EAAE;YACzE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;YACjE,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;SACpC;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,KAAa,EAAE,IAAY,EAAE,MAAY;QAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAErF,MAAM,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;QACpC,OAAO,IAAI,OAAO,CAAc,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAClD,UAAU,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,MAAqB,CAAC,CAAC;YACpE,UAAU,CAAC,OAAO,GAAG,MAAM,CAAC;YAC5B,UAAU,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,iBAAiB,CAAC,YAA2B;QAClD,IAAI,CAAC,YAAY;YACf,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAE1D,MAAM,YAAY,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;QACvD,MAAM,OAAO,GAAG,mDAAmD,CAAC;QACpE,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK;YACR,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAE3D,MAAM,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,CAAC,GAAG,KAAK,CAAC;QACpD,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;QAEjF,MAAM,KAAK,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QACzE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC3B,CAAC;CACF"}
@@ -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
+ }