@loaders.gl/i3s 4.0.0-alpha.19 → 4.0.0-alpha.20

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 (95) hide show
  1. package/dist/dist.min.js +277 -260
  2. package/dist/es5/arcgis-webscene-loader.js +1 -1
  3. package/dist/es5/i3s-attribute-loader.js +1 -1
  4. package/dist/es5/i3s-building-scene-layer-loader.js +1 -1
  5. package/dist/es5/i3s-content-loader.js +1 -1
  6. package/dist/es5/i3s-loader.js +1 -1
  7. package/dist/es5/i3s-node-page-loader.js +1 -1
  8. package/dist/es5/i3s-slpk-loader.js +3 -3
  9. package/dist/es5/i3s-slpk-loader.js.map +1 -1
  10. package/dist/es5/index.js +0 -7
  11. package/dist/es5/index.js.map +1 -1
  12. package/dist/es5/lib/parsers/parse-slpk/parse-slpk.js +9 -25
  13. package/dist/es5/lib/parsers/parse-slpk/parse-slpk.js.map +1 -1
  14. package/dist/es5/lib/parsers/parse-slpk/slpk-archieve.js +9 -33
  15. package/dist/es5/lib/parsers/parse-slpk/slpk-archieve.js.map +1 -1
  16. package/dist/esm/arcgis-webscene-loader.js +1 -1
  17. package/dist/esm/i3s-attribute-loader.js +1 -1
  18. package/dist/esm/i3s-building-scene-layer-loader.js +1 -1
  19. package/dist/esm/i3s-content-loader.js +1 -1
  20. package/dist/esm/i3s-loader.js +1 -1
  21. package/dist/esm/i3s-node-page-loader.js +1 -1
  22. package/dist/esm/i3s-slpk-loader.js +3 -3
  23. package/dist/esm/i3s-slpk-loader.js.map +1 -1
  24. package/dist/esm/index.js +0 -1
  25. package/dist/esm/index.js.map +1 -1
  26. package/dist/esm/lib/parsers/parse-slpk/parse-slpk.js +2 -18
  27. package/dist/esm/lib/parsers/parse-slpk/parse-slpk.js.map +1 -1
  28. package/dist/esm/lib/parsers/parse-slpk/slpk-archieve.js +5 -29
  29. package/dist/esm/lib/parsers/parse-slpk/slpk-archieve.js.map +1 -1
  30. package/dist/i3s-content-worker-node.js +2 -2
  31. package/dist/i3s-content-worker-node.js.map +2 -2
  32. package/dist/i3s-content-worker.js +12 -12
  33. package/dist/i3s-slpk-loader.js +2 -2
  34. package/dist/index.d.ts +0 -2
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +1 -3
  37. package/dist/lib/parsers/parse-slpk/parse-slpk.d.ts +1 -1
  38. package/dist/lib/parsers/parse-slpk/parse-slpk.d.ts.map +1 -1
  39. package/dist/lib/parsers/parse-slpk/parse-slpk.js +9 -30
  40. package/dist/lib/parsers/parse-slpk/slpk-archieve.d.ts +2 -21
  41. package/dist/lib/parsers/parse-slpk/slpk-archieve.d.ts.map +1 -1
  42. package/dist/lib/parsers/parse-slpk/slpk-archieve.js +7 -46
  43. package/package.json +9 -9
  44. package/src/i3s-slpk-loader.ts +2 -2
  45. package/src/index.ts +0 -2
  46. package/src/lib/parsers/parse-slpk/parse-slpk.ts +12 -32
  47. package/src/lib/parsers/parse-slpk/slpk-archieve.ts +5 -54
  48. package/dist/es5/lib/parsers/parse-zip/cd-file-header.js +0 -121
  49. package/dist/es5/lib/parsers/parse-zip/cd-file-header.js.map +0 -1
  50. package/dist/es5/lib/parsers/parse-zip/data-view-file-provider.js +0 -129
  51. package/dist/es5/lib/parsers/parse-zip/data-view-file-provider.js.map +0 -1
  52. package/dist/es5/lib/parsers/parse-zip/end-of-central-directory.js +0 -100
  53. package/dist/es5/lib/parsers/parse-zip/end-of-central-directory.js.map +0 -1
  54. package/dist/es5/lib/parsers/parse-zip/file-provider.js +0 -2
  55. package/dist/es5/lib/parsers/parse-zip/file-provider.js.map +0 -1
  56. package/dist/es5/lib/parsers/parse-zip/local-file-header.js +0 -113
  57. package/dist/es5/lib/parsers/parse-zip/local-file-header.js.map +0 -1
  58. package/dist/es5/lib/parsers/parse-zip/search-from-the-end.js +0 -69
  59. package/dist/es5/lib/parsers/parse-zip/search-from-the-end.js.map +0 -1
  60. package/dist/esm/lib/parsers/parse-zip/cd-file-header.js +0 -45
  61. package/dist/esm/lib/parsers/parse-zip/cd-file-header.js.map +0 -1
  62. package/dist/esm/lib/parsers/parse-zip/data-view-file-provider.js +0 -32
  63. package/dist/esm/lib/parsers/parse-zip/data-view-file-provider.js.map +0 -1
  64. package/dist/esm/lib/parsers/parse-zip/end-of-central-directory.js +0 -33
  65. package/dist/esm/lib/parsers/parse-zip/end-of-central-directory.js.map +0 -1
  66. package/dist/esm/lib/parsers/parse-zip/file-provider.js +0 -2
  67. package/dist/esm/lib/parsers/parse-zip/file-provider.js.map +0 -1
  68. package/dist/esm/lib/parsers/parse-zip/local-file-header.js +0 -40
  69. package/dist/esm/lib/parsers/parse-zip/local-file-header.js.map +0 -1
  70. package/dist/esm/lib/parsers/parse-zip/search-from-the-end.js +0 -16
  71. package/dist/esm/lib/parsers/parse-zip/search-from-the-end.js.map +0 -1
  72. package/dist/lib/parsers/parse-zip/cd-file-header.d.ts +0 -31
  73. package/dist/lib/parsers/parse-zip/cd-file-header.d.ts.map +0 -1
  74. package/dist/lib/parsers/parse-zip/cd-file-header.js +0 -55
  75. package/dist/lib/parsers/parse-zip/data-view-file-provider.d.ts +0 -36
  76. package/dist/lib/parsers/parse-zip/data-view-file-provider.d.ts.map +0 -1
  77. package/dist/lib/parsers/parse-zip/data-view-file-provider.js +0 -61
  78. package/dist/lib/parsers/parse-zip/end-of-central-directory.d.ts +0 -18
  79. package/dist/lib/parsers/parse-zip/end-of-central-directory.d.ts.map +0 -1
  80. package/dist/lib/parsers/parse-zip/end-of-central-directory.js +0 -41
  81. package/dist/lib/parsers/parse-zip/file-provider.d.ts +0 -36
  82. package/dist/lib/parsers/parse-zip/file-provider.d.ts.map +0 -1
  83. package/dist/lib/parsers/parse-zip/file-provider.js +0 -2
  84. package/dist/lib/parsers/parse-zip/local-file-header.d.ts +0 -27
  85. package/dist/lib/parsers/parse-zip/local-file-header.d.ts.map +0 -1
  86. package/dist/lib/parsers/parse-zip/local-file-header.js +0 -53
  87. package/dist/lib/parsers/parse-zip/search-from-the-end.d.ts +0 -11
  88. package/dist/lib/parsers/parse-zip/search-from-the-end.d.ts.map +0 -1
  89. package/dist/lib/parsers/parse-zip/search-from-the-end.js +0 -31
  90. package/src/lib/parsers/parse-zip/cd-file-header.ts +0 -106
  91. package/src/lib/parsers/parse-zip/data-view-file-provider.ts +0 -69
  92. package/src/lib/parsers/parse-zip/end-of-central-directory.ts +0 -78
  93. package/src/lib/parsers/parse-zip/file-provider.ts +0 -40
  94. package/src/lib/parsers/parse-zip/local-file-header.ts +0 -91
  95. package/src/lib/parsers/parse-zip/search-from-the-end.ts +0 -38
@@ -1,18 +1,7 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
2
  import md5 from 'md5';
3
- import { parseZipLocalFileHeader } from '../parse-zip/local-file-header';
3
+ import { parseZipLocalFileHeader, findBin } from '@loaders.gl/zip';
4
4
  import { GZipCompression } from '@loaders.gl/compression';
5
- export const compareHashes = (hash1, hash2) => {
6
- const h1 = new BigUint64Array(hash1.buffer, hash1.byteOffset, 2);
7
- const h2 = new BigUint64Array(hash2.buffer, hash2.byteOffset, 2);
8
- const diff = h1[0] === h2[0] ? h1[1] - h2[1] : h1[0] - h2[0];
9
- if (diff < 0n) {
10
- return -1;
11
- } else if (diff === 0n) {
12
- return 0;
13
- }
14
- return 1;
15
- };
16
5
  const PATH_DESCRIPTIONS = [{
17
6
  test: /^$/,
18
7
  extensions: ['3dSceneLayer.json.gz']
@@ -42,22 +31,6 @@ export class SLPKArchive {
42
31
  constructor(slpkArchive, hashFile) {
43
32
  _defineProperty(this, "slpkArchive", void 0);
44
33
  _defineProperty(this, "hashArray", void 0);
45
- _defineProperty(this, "findBin", hashToSearch => {
46
- let lowerBorder = 0;
47
- let upperBorder = this.hashArray.length;
48
- while (upperBorder - lowerBorder > 1) {
49
- const middle = lowerBorder + Math.floor((upperBorder - lowerBorder) / 2);
50
- const value = compareHashes(this.hashArray[middle].hash, hashToSearch);
51
- if (value === 0) {
52
- return this.hashArray[middle];
53
- } else if (value < 0) {
54
- lowerBorder = middle;
55
- } else {
56
- upperBorder = middle;
57
- }
58
- }
59
- return undefined;
60
- });
61
34
  this.slpkArchive = slpkArchive;
62
35
  this.hashArray = hashFile;
63
36
  }
@@ -108,7 +81,7 @@ export class SLPKArchive {
108
81
  }
109
82
  async getFileBytes(path) {
110
83
  const nameHash = Buffer.from(md5(path), 'hex');
111
- const fileInfo = this.findBin(nameHash);
84
+ const fileInfo = findBin(nameHash, this.hashArray);
112
85
  if (!fileInfo) {
113
86
  return undefined;
114
87
  }
@@ -119,5 +92,8 @@ export class SLPKArchive {
119
92
  const compressedFile = this.slpkArchive.slice(localFileHeader.fileDataOffset, localFileHeader.fileDataOffset + localFileHeader.compressedSize);
120
93
  return compressedFile;
121
94
  }
95
+ findBin(nameHash) {
96
+ throw new Error('Method not implemented.');
97
+ }
122
98
  }
123
99
  //# sourceMappingURL=slpk-archieve.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"slpk-archieve.js","names":["md5","parseZipLocalFileHeader","GZipCompression","compareHashes","hash1","hash2","h1","BigUint64Array","buffer","byteOffset","h2","diff","PATH_DESCRIPTIONS","test","extensions","SLPKArchive","constructor","slpkArchive","hashFile","_defineProperty","hashToSearch","lowerBorder","upperBorder","hashArray","length","middle","Math","floor","value","hash","undefined","getFile","path","mode","arguments","_PATH_DESCRIPTIONS$fi","find","val","data","ext","getDataByPath","concat","Buffer","from","decompressedFile","fileWithoutCompression","getFileBytes","Error","toLocaleLowerCase","compression","decompressedData","decompress","nameHash","fileInfo","findBin","localFileHeader","offset","compressedFile","slice","fileDataOffset","compressedSize"],"sources":["../../../../../src/lib/parsers/parse-slpk/slpk-archieve.ts"],"sourcesContent":["import md5 from 'md5';\nimport {parseZipLocalFileHeader} from '../parse-zip/local-file-header';\nimport {GZipCompression} from '@loaders.gl/compression';\nimport {FileProvider} from '../parse-zip/file-provider';\n\n/** Element of hash array */\nexport type HashElement = {\n /** File name hash */\n hash: Buffer;\n /** File offset in the archive */\n offset: bigint;\n};\n\n/**\n * Comparing md5 hashes according to https://github.com/Esri/i3s-spec/blob/master/docs/2.0/slpk_hashtable.pcsl.md step 5\n * @param hash1 hash to compare\n * @param hash2 hash to compare\n * @returns -1 if hash1 < hash2, 0 of hash1 === hash2, 1 if hash1 > hash2\n */\nexport const compareHashes = (hash1: Buffer, hash2: Buffer): number => {\n const h1 = new BigUint64Array(hash1.buffer, hash1.byteOffset, 2);\n const h2 = new BigUint64Array(hash2.buffer, hash2.byteOffset, 2);\n\n const diff = h1[0] === h2[0] ? h1[1] - h2[1] : h1[0] - h2[0];\n\n if (diff < 0n) {\n return -1;\n } else if (diff === 0n) {\n return 0;\n }\n return 1;\n};\n\n/** Description of real paths for different file types */\nconst PATH_DESCRIPTIONS: {test: RegExp; extensions: string[]}[] = [\n {\n test: /^$/,\n extensions: ['3dSceneLayer.json.gz']\n },\n {\n test: /^nodepages\\/\\d+$/,\n extensions: ['.json.gz']\n },\n {\n test: /^nodes\\/(\\d+|root)$/,\n extensions: ['/3dNodeIndexDocument.json.gz']\n },\n {\n test: /^nodes\\/\\d+\\/textures\\/.+$/,\n extensions: ['.jpg', '.png', '.bin.dds.gz', '.ktx']\n },\n {\n test: /^nodes\\/\\d+\\/geometries\\/\\d+$/,\n extensions: ['.bin.gz', '.draco.gz']\n },\n {\n test: /^nodes\\/\\d+\\/attributes\\/f_\\d+\\/\\d+$/,\n extensions: ['.bin.gz']\n },\n {\n test: /^statistics\\/f_\\d+\\/\\d+$/,\n extensions: ['.json.gz']\n },\n {\n test: /^nodes\\/\\d+\\/shared$/,\n extensions: ['/sharedResource.json.gz']\n }\n];\n\n/**\n * Class for handling information about slpk file\n */\nexport class SLPKArchive {\n private slpkArchive: FileProvider;\n private hashArray: HashElement[];\n constructor(slpkArchive: FileProvider, hashFile: HashElement[]) {\n this.slpkArchive = slpkArchive;\n this.hashArray = hashFile;\n }\n\n /**\n * Binary search in the hash info\n * @param hashToSearch hash that we need to find\n * @returns required hash element or undefined if not found\n */\n private findBin = (hashToSearch: Buffer): HashElement | undefined => {\n let lowerBorder = 0;\n let upperBorder = this.hashArray.length;\n\n while (upperBorder - lowerBorder > 1) {\n const middle = lowerBorder + Math.floor((upperBorder - lowerBorder) / 2);\n const value = compareHashes(this.hashArray[middle].hash, hashToSearch);\n if (value === 0) {\n return this.hashArray[middle];\n } else if (value < 0) {\n lowerBorder = middle;\n } else {\n upperBorder = middle;\n }\n }\n return undefined;\n };\n\n /**\n * Returns file with the given path from slpk archive\n * @param path - path inside the slpk\n * @param mode - currently only raw mode supported\n * @returns buffer with ready to use file\n */\n async getFile(path: string, mode: 'http' | 'raw' = 'raw'): Promise<Buffer> {\n if (mode === 'http') {\n const extensions = PATH_DESCRIPTIONS.find((val) => val.test.test(path))?.extensions;\n if (extensions) {\n let data: ArrayBuffer | undefined;\n for (const ext of extensions) {\n data = await this.getDataByPath(`${path}${ext}`);\n if (data) {\n break;\n }\n }\n if (data) {\n return Buffer.from(data);\n }\n }\n }\n if (mode === 'raw') {\n const decompressedFile = await this.getDataByPath(`${path}.gz`);\n if (decompressedFile) {\n return Buffer.from(decompressedFile);\n }\n const fileWithoutCompression = await this.getFileBytes(path);\n if (fileWithoutCompression) {\n return Buffer.from(fileWithoutCompression);\n }\n }\n\n throw new Error('No such file in the archieve');\n }\n\n /**\n * returning uncompressed data for paths that ends with .gz and raw data for all other paths\n * @param path - path inside the archive\n * @returns buffer with the file data\n */\n private async getDataByPath(path: string): Promise<ArrayBuffer | undefined> {\n // sometimes paths are not in lower case when hash file is created,\n // so first we're looking for lower case file name and then for original one\n let data = await this.getFileBytes(path.toLocaleLowerCase());\n if (!data) {\n data = await this.getFileBytes(path);\n }\n if (!data) {\n return undefined;\n }\n if (/\\.gz$/.test(path)) {\n const compression = new GZipCompression();\n\n const decompressedData = await compression.decompress(data);\n return decompressedData;\n }\n return Buffer.from(data);\n }\n\n /**\n * Trying to get raw file data by adress\n * @param path - path inside the archive\n * @returns buffer with the raw file data\n */\n private async getFileBytes(path: string): Promise<ArrayBuffer | undefined> {\n const nameHash = Buffer.from(md5(path), 'hex');\n const fileInfo = this.findBin(nameHash); // implement binary search\n if (!fileInfo) {\n return undefined;\n }\n\n const localFileHeader = await parseZipLocalFileHeader(fileInfo.offset, this.slpkArchive);\n if (!localFileHeader) {\n return undefined;\n }\n\n const compressedFile = this.slpkArchive.slice(\n localFileHeader.fileDataOffset,\n localFileHeader.fileDataOffset + localFileHeader.compressedSize\n );\n\n return compressedFile;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"slpk-archieve.js","names":["md5","parseZipLocalFileHeader","findBin","GZipCompression","PATH_DESCRIPTIONS","test","extensions","SLPKArchive","constructor","slpkArchive","hashFile","_defineProperty","hashArray","getFile","path","mode","arguments","length","undefined","_PATH_DESCRIPTIONS$fi","find","val","data","ext","getDataByPath","concat","Buffer","from","decompressedFile","fileWithoutCompression","getFileBytes","Error","toLocaleLowerCase","compression","decompressedData","decompress","nameHash","fileInfo","localFileHeader","offset","compressedFile","slice","fileDataOffset","compressedSize"],"sources":["../../../../../src/lib/parsers/parse-slpk/slpk-archieve.ts"],"sourcesContent":["import md5 from 'md5';\nimport {FileProvider, parseZipLocalFileHeader, HashElement, findBin} from '@loaders.gl/zip';\nimport {GZipCompression} from '@loaders.gl/compression';\n\n/** Description of real paths for different file types */\nconst PATH_DESCRIPTIONS: {test: RegExp; extensions: string[]}[] = [\n {\n test: /^$/,\n extensions: ['3dSceneLayer.json.gz']\n },\n {\n test: /^nodepages\\/\\d+$/,\n extensions: ['.json.gz']\n },\n {\n test: /^nodes\\/(\\d+|root)$/,\n extensions: ['/3dNodeIndexDocument.json.gz']\n },\n {\n test: /^nodes\\/\\d+\\/textures\\/.+$/,\n extensions: ['.jpg', '.png', '.bin.dds.gz', '.ktx']\n },\n {\n test: /^nodes\\/\\d+\\/geometries\\/\\d+$/,\n extensions: ['.bin.gz', '.draco.gz']\n },\n {\n test: /^nodes\\/\\d+\\/attributes\\/f_\\d+\\/\\d+$/,\n extensions: ['.bin.gz']\n },\n {\n test: /^statistics\\/f_\\d+\\/\\d+$/,\n extensions: ['.json.gz']\n },\n {\n test: /^nodes\\/\\d+\\/shared$/,\n extensions: ['/sharedResource.json.gz']\n }\n];\n\n/**\n * Class for handling information about slpk file\n */\nexport class SLPKArchive {\n private slpkArchive: FileProvider;\n private hashArray: HashElement[];\n constructor(slpkArchive: FileProvider, hashFile: HashElement[]) {\n this.slpkArchive = slpkArchive;\n this.hashArray = hashFile;\n }\n\n /**\n * Returns file with the given path from slpk archive\n * @param path - path inside the slpk\n * @param mode - currently only raw mode supported\n * @returns buffer with ready to use file\n */\n async getFile(path: string, mode: 'http' | 'raw' = 'raw'): Promise<Buffer> {\n if (mode === 'http') {\n const extensions = PATH_DESCRIPTIONS.find((val) => val.test.test(path))?.extensions;\n if (extensions) {\n let data: ArrayBuffer | undefined;\n for (const ext of extensions) {\n data = await this.getDataByPath(`${path}${ext}`);\n if (data) {\n break;\n }\n }\n if (data) {\n return Buffer.from(data);\n }\n }\n }\n if (mode === 'raw') {\n const decompressedFile = await this.getDataByPath(`${path}.gz`);\n if (decompressedFile) {\n return Buffer.from(decompressedFile);\n }\n const fileWithoutCompression = await this.getFileBytes(path);\n if (fileWithoutCompression) {\n return Buffer.from(fileWithoutCompression);\n }\n }\n\n throw new Error('No such file in the archieve');\n }\n\n /**\n * returning uncompressed data for paths that ends with .gz and raw data for all other paths\n * @param path - path inside the archive\n * @returns buffer with the file data\n */\n private async getDataByPath(path: string): Promise<ArrayBuffer | undefined> {\n // sometimes paths are not in lower case when hash file is created,\n // so first we're looking for lower case file name and then for original one\n let data = await this.getFileBytes(path.toLocaleLowerCase());\n if (!data) {\n data = await this.getFileBytes(path);\n }\n if (!data) {\n return undefined;\n }\n if (/\\.gz$/.test(path)) {\n const compression = new GZipCompression();\n\n const decompressedData = await compression.decompress(data);\n return decompressedData;\n }\n return Buffer.from(data);\n }\n\n /**\n * Trying to get raw file data by adress\n * @param path - path inside the archive\n * @returns buffer with the raw file data\n */\n private async getFileBytes(path: string): Promise<ArrayBuffer | undefined> {\n const nameHash = Buffer.from(md5(path), 'hex');\n const fileInfo = findBin(nameHash, this.hashArray); // implement binary search\n if (!fileInfo) {\n return undefined;\n }\n\n const localFileHeader = await parseZipLocalFileHeader(fileInfo.offset, this.slpkArchive);\n if (!localFileHeader) {\n return undefined;\n }\n\n const compressedFile = this.slpkArchive.slice(\n localFileHeader.fileDataOffset,\n localFileHeader.fileDataOffset + localFileHeader.compressedSize\n );\n\n return compressedFile;\n }\n findBin(nameHash: Buffer) {\n throw new Error('Method not implemented.');\n }\n}\n"],"mappings":"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"}