@pilotdev/pilot-bim-dataprovider 25.9.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 (123) 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 +5 -9
  11. package/lib/src/model/BimDataCloudPart.js +11 -12
  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 +17 -16
  26. package/lib/src/utils/ViewerTools.js +39 -21
  27. package/lib/src/utils/ViewerTools.js.map +1 -1
  28. package/lib/src/wasm/WasmWorker.d.ts +22 -70
  29. package/lib/src/wasm/WasmWorker.js +89 -180
  30. package/lib/src/wasm/WasmWorker.js.map +1 -1
  31. package/lib/src/wasm/{WasmWorkerThreadSafeWrapper.d.ts → WorkerApi.d.ts} +39 -21
  32. package/lib/src/wasm/WorkerApi.js +2 -0
  33. package/lib/src/wasm/WorkerApi.js.map +1 -0
  34. package/lib/src/wasm/cloud_readers/BinaryCloudReader.d.ts +18 -0
  35. package/lib/src/wasm/cloud_readers/BinaryCloudReader.js +228 -0
  36. package/lib/src/wasm/cloud_readers/BinaryCloudReader.js.map +1 -0
  37. package/lib/src/wasm/{DataAccessors → cloud_readers}/ICloudReader.d.ts +6 -6
  38. package/lib/src/wasm/cloud_readers/ICloudReader.js.map +1 -0
  39. package/lib/src/wasm/cloud_readers/WasmCloudReader.d.ts +20 -0
  40. package/lib/src/wasm/cloud_readers/WasmCloudReader.js +53 -0
  41. package/lib/src/wasm/cloud_readers/WasmCloudReader.js.map +1 -0
  42. package/lib/src/wasm/data_accessors/CloudPartAccessor.d.ts +20 -0
  43. package/lib/src/wasm/data_accessors/CloudPartAccessor.js +70 -0
  44. package/lib/src/wasm/data_accessors/CloudPartAccessor.js.map +1 -0
  45. package/lib/src/wasm/data_accessors/FileAccessor.d.ts +37 -0
  46. package/lib/src/wasm/data_accessors/FileAccessor.js +237 -0
  47. package/lib/src/wasm/data_accessors/FileAccessor.js.map +1 -0
  48. package/lib/src/wasm/data_accessors/ModelPartAccessor.d.ts +27 -0
  49. package/lib/src/wasm/data_accessors/ModelPartAccessor.js +142 -0
  50. package/lib/src/wasm/data_accessors/ModelPartAccessor.js.map +1 -0
  51. package/lib/src/wasm/file-system/File.d.ts +30 -0
  52. package/lib/src/wasm/file-system/File.js +58 -0
  53. package/lib/src/wasm/file-system/File.js.map +1 -0
  54. package/lib/src/wasm/file-system/FileAccessDispatcher.d.ts +12 -0
  55. package/lib/src/{model → wasm/file-system}/FileAccessDispatcher.js +59 -21
  56. package/lib/src/wasm/file-system/FileAccessDispatcher.js.map +1 -0
  57. package/lib/src/wasm/file-system/FileLoader.d.ts +41 -0
  58. package/lib/src/wasm/file-system/FileLoader.js +107 -0
  59. package/lib/src/wasm/file-system/FileLoader.js.map +1 -0
  60. package/lib/src/wasm/file-system/IFileSystem.d.ts +76 -0
  61. package/lib/src/wasm/file-system/IFileSystem.js +308 -0
  62. package/lib/src/wasm/file-system/IFileSystem.js.map +1 -0
  63. package/lib/src/{file-system → wasm/file-system}/IFileSystemCache.d.ts +10 -6
  64. package/lib/src/{file-system → wasm/file-system}/IFileSystemCache.js +11 -13
  65. package/lib/src/wasm/file-system/IFileSystemCache.js.map +1 -0
  66. package/lib/src/{file-system → wasm/file-system}/OPFS.d.ts +6 -6
  67. package/lib/src/{file-system → wasm/file-system}/OPFS.js +7 -3
  68. package/lib/src/wasm/file-system/OPFS.js.map +1 -0
  69. package/lib/src/wasm/file-system/PATH.js.map +1 -0
  70. package/lib/src/wasm/file-system/PartialFile.d.ts +48 -0
  71. package/lib/src/wasm/file-system/PartialFile.js +367 -0
  72. package/lib/src/wasm/file-system/PartialFile.js.map +1 -0
  73. package/lib/src/wasm/pilot_bim_dataprovider.d.ts +17 -1
  74. package/lib/src/wasm/wasm.worker-node.cjs +1 -1
  75. package/lib/src/wasm/wasm.worker-web.cjs +1 -1
  76. package/lib/src/wasm/worker.js +2 -0
  77. package/lib/src/wasm/worker.js.map +1 -1
  78. package/package.json +3 -4
  79. package/lib/src/file-system/IFileSystem.d.ts +0 -50
  80. package/lib/src/file-system/IFileSystem.js +0 -233
  81. package/lib/src/file-system/IFileSystem.js.map +0 -1
  82. package/lib/src/file-system/IFileSystemCache.js.map +0 -1
  83. package/lib/src/file-system/OPFS.js.map +0 -1
  84. package/lib/src/file-system/PATH.js.map +0 -1
  85. package/lib/src/model/BimDataElement.d.ts +0 -113
  86. package/lib/src/model/BimDataElement.js +0 -45
  87. package/lib/src/model/BimDataElement.js.map +0 -1
  88. package/lib/src/model/BimDataElementPropertySet.d.ts +0 -26
  89. package/lib/src/model/BimDataElementPropertySet.js +0 -90
  90. package/lib/src/model/BimDataElementPropertySet.js.map +0 -1
  91. package/lib/src/model/BimDataIfcRepresentationStatus.d.ts +0 -10
  92. package/lib/src/model/BimDataIfcRepresentationStatus.js +0 -12
  93. package/lib/src/model/BimDataIfcRepresentationStatus.js.map +0 -1
  94. package/lib/src/model/BimDataIfcType.js.map +0 -1
  95. package/lib/src/model/BimDataTessellation.d.ts +0 -13
  96. package/lib/src/model/BimDataTessellation.js +0 -16
  97. package/lib/src/model/BimDataTessellation.js.map +0 -1
  98. package/lib/src/model/Consts.d.ts +0 -7
  99. package/lib/src/model/Consts.js +0 -8
  100. package/lib/src/model/Consts.js.map +0 -1
  101. package/lib/src/model/FileAccessDispatcher.d.ts +0 -14
  102. package/lib/src/model/FileAccessDispatcher.js.map +0 -1
  103. package/lib/src/wasm/DataAccessors/BimCloudPartAccessor.d.ts +0 -17
  104. package/lib/src/wasm/DataAccessors/BimCloudPartAccessor.js +0 -60
  105. package/lib/src/wasm/DataAccessors/BimCloudPartAccessor.js.map +0 -1
  106. package/lib/src/wasm/DataAccessors/BimDataModelPartAccessor.d.ts +0 -20
  107. package/lib/src/wasm/DataAccessors/BimDataModelPartAccessor.js +0 -89
  108. package/lib/src/wasm/DataAccessors/BimDataModelPartAccessor.js.map +0 -1
  109. package/lib/src/wasm/DataAccessors/BimDataPartAccessor.d.ts +0 -8
  110. package/lib/src/wasm/DataAccessors/BimDataPartAccessor.js +0 -19
  111. package/lib/src/wasm/DataAccessors/BimDataPartAccessor.js.map +0 -1
  112. package/lib/src/wasm/DataAccessors/BinaryCloudReader.d.ts +0 -16
  113. package/lib/src/wasm/DataAccessors/BinaryCloudReader.js +0 -268
  114. package/lib/src/wasm/DataAccessors/BinaryCloudReader.js.map +0 -1
  115. package/lib/src/wasm/DataAccessors/ICloudReader.js.map +0 -1
  116. package/lib/src/wasm/DataAccessors/WasmCloudReader.d.ts +0 -16
  117. package/lib/src/wasm/DataAccessors/WasmCloudReader.js +0 -47
  118. package/lib/src/wasm/DataAccessors/WasmCloudReader.js.map +0 -1
  119. package/lib/src/wasm/WasmWorkerThreadSafeWrapper.js +0 -141
  120. package/lib/src/wasm/WasmWorkerThreadSafeWrapper.js.map +0 -1
  121. /package/lib/src/wasm/{DataAccessors → cloud_readers}/ICloudReader.js +0 -0
  122. /package/lib/src/{file-system → wasm/file-system}/PATH.d.ts +0 -0
  123. /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,31 +36,45 @@ 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;
@@ -74,13 +95,15 @@ export class FileAccessDispatcher {
74
95
  }
75
96
  });
76
97
  }
77
- async lockFile(path, copyPath, copyFunc) {
78
- const locksNamePrefix = 'PilotOPFSFile ';
98
+ async lockFile(path, copyFunc, removeFunc) {
99
+ const copyPath = this._tabId + '_' + path;
79
100
  if (this._locks.has(path)) {
80
- return FileStatus.Source;
101
+ this._locks.get(path).lockCounter++;
102
+ return path;
81
103
  }
82
104
  if (this._locks.has(copyPath)) {
83
- return FileStatus.Copy;
105
+ this._locks.get(copyPath).lockCounter++;
106
+ return copyPath;
84
107
  }
85
108
  let resolvePrepareFile;
86
109
  const prepareFilePromise = new Promise((resolve) => {
@@ -90,9 +113,11 @@ export class FileAccessDispatcher {
90
113
  const innerLockPromise = new Promise((resolve) => {
91
114
  releaseLock = resolve;
92
115
  });
93
- 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) => {
94
117
  if (lock == null) {
95
- 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;
96
121
  if (copySucess) {
97
122
  resolvePrepareFile(FileStatus.Copy);
98
123
  }
@@ -105,32 +130,45 @@ export class FileAccessDispatcher {
105
130
  await innerLockPromise;
106
131
  }
107
132
  });
108
- return await prepareFilePromise.then(fileStatus => {
133
+ return prepareFilePromise.then(fileStatus => {
109
134
  switch (fileStatus) {
110
135
  case FileStatus.Source:
111
136
  this._locks.set(path, new LockedFile(lockPromise, releaseLock, copyFunc));
112
- break;
137
+ return path;
113
138
  case FileStatus.Copy:
114
139
  {
115
- const lockCopyPromise = navigator.locks.request(locksNamePrefix + copyPath, () => innerLockPromise);
116
- this._locks.set(copyPath, new LockedFile(lockCopyPromise, releaseLock, copyFunc));
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;
117
143
  }
118
- break;
119
144
  case FileStatus.Failed:
120
- break;
145
+ throw new Error("Failed to copy file.");
121
146
  }
122
- return fileStatus;
123
147
  });
124
148
  }
125
149
  async unlockFile(path) {
126
- await this._locks.get(path)?.dispose();
127
- 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);
128
165
  }
129
166
  async dispose() {
130
167
  const pathes = Array.from(this._locks.keys());
131
168
  for (let i = 0; i < pathes.length; i++) {
132
169
  await this.unlockFile(pathes[i]);
133
170
  }
171
+ this._locks.clear();
134
172
  this._broadcastChannel.close();
135
173
  }
136
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
+ }