@itwin/core-frontend 5.15.1 → 5.16.0-dev.11

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 (172) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/lib/cjs/RealityDataSourceTilesetUrlImpl.d.ts +5 -2
  3. package/lib/cjs/RealityDataSourceTilesetUrlImpl.d.ts.map +1 -1
  4. package/lib/cjs/RealityDataSourceTilesetUrlImpl.js +6 -0
  5. package/lib/cjs/RealityDataSourceTilesetUrlImpl.js.map +1 -1
  6. package/lib/cjs/core-frontend.d.ts +1 -1
  7. package/lib/cjs/core-frontend.d.ts.map +1 -1
  8. package/lib/cjs/core-frontend.js +3 -2
  9. package/lib/cjs/core-frontend.js.map +1 -1
  10. package/lib/cjs/internal/RealityDataSourceGoogle3dTilesImpl.d.ts +2 -0
  11. package/lib/cjs/internal/RealityDataSourceGoogle3dTilesImpl.d.ts.map +1 -1
  12. package/lib/cjs/internal/RealityDataSourceGoogle3dTilesImpl.js +13 -4
  13. package/lib/cjs/internal/RealityDataSourceGoogle3dTilesImpl.js.map +1 -1
  14. package/lib/cjs/internal/cross-package.d.ts +1 -1
  15. package/lib/cjs/internal/cross-package.d.ts.map +1 -1
  16. package/lib/cjs/internal/cross-package.js +4 -1
  17. package/lib/cjs/internal/cross-package.js.map +1 -1
  18. package/lib/cjs/internal/tile/RealityTileLoader.d.ts +1 -1
  19. package/lib/cjs/internal/tile/RealityTileLoader.d.ts.map +1 -1
  20. package/lib/cjs/internal/tile/RealityTileLoader.js +5 -3
  21. package/lib/cjs/internal/tile/RealityTileLoader.js.map +1 -1
  22. package/lib/cjs/internal/tile/map/ArcGisUtilities.d.ts +15 -2
  23. package/lib/cjs/internal/tile/map/ArcGisUtilities.d.ts.map +1 -1
  24. package/lib/cjs/internal/tile/map/ArcGisUtilities.js +54 -29
  25. package/lib/cjs/internal/tile/map/ArcGisUtilities.js.map +1 -1
  26. package/lib/cjs/internal/tile/map/ImageryProviders/ArcGISImageryProvider.d.ts +14 -0
  27. package/lib/cjs/internal/tile/map/ImageryProviders/ArcGISImageryProvider.d.ts.map +1 -1
  28. package/lib/cjs/internal/tile/map/ImageryProviders/ArcGISImageryProvider.js +91 -45
  29. package/lib/cjs/internal/tile/map/ImageryProviders/ArcGISImageryProvider.js.map +1 -1
  30. package/lib/cjs/internal/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.d.ts.map +1 -1
  31. package/lib/cjs/internal/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js +5 -4
  32. package/lib/cjs/internal/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js.map +1 -1
  33. package/lib/cjs/internal/tile/map/ImageryProviders/WmsMapLayerImageryProvider.d.ts.map +1 -1
  34. package/lib/cjs/internal/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js +8 -2
  35. package/lib/cjs/internal/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js.map +1 -1
  36. package/lib/cjs/internal/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.d.ts.map +1 -1
  37. package/lib/cjs/internal/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.js +8 -2
  38. package/lib/cjs/internal/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.js.map +1 -1
  39. package/lib/cjs/internal/tile/map/MapLayerFetch.d.ts +57 -0
  40. package/lib/cjs/internal/tile/map/MapLayerFetch.d.ts.map +1 -0
  41. package/lib/cjs/internal/tile/map/MapLayerFetch.js +95 -0
  42. package/lib/cjs/internal/tile/map/MapLayerFetch.js.map +1 -0
  43. package/lib/cjs/internal/tile/map/UrlUtils.js +1 -1
  44. package/lib/cjs/internal/tile/map/UrlUtils.js.map +1 -1
  45. package/lib/cjs/internal/tile/map/WmsCapabilities.d.ts +2 -5
  46. package/lib/cjs/internal/tile/map/WmsCapabilities.d.ts.map +1 -1
  47. package/lib/cjs/internal/tile/map/WmsCapabilities.js +16 -9
  48. package/lib/cjs/internal/tile/map/WmsCapabilities.js.map +1 -1
  49. package/lib/cjs/internal/tile/map/WmsUtilities.d.ts +29 -1
  50. package/lib/cjs/internal/tile/map/WmsUtilities.d.ts.map +1 -1
  51. package/lib/cjs/internal/tile/map/WmsUtilities.js +43 -11
  52. package/lib/cjs/internal/tile/map/WmsUtilities.js.map +1 -1
  53. package/lib/cjs/internal/tile/map/WmtsCapabilities.d.ts +2 -5
  54. package/lib/cjs/internal/tile/map/WmtsCapabilities.d.ts.map +1 -1
  55. package/lib/cjs/internal/tile/map/WmtsCapabilities.js +16 -9
  56. package/lib/cjs/internal/tile/map/WmtsCapabilities.js.map +1 -1
  57. package/lib/cjs/tile/GltfReader.d.ts.map +1 -1
  58. package/lib/cjs/tile/GltfReader.js +3 -1
  59. package/lib/cjs/tile/GltfReader.js.map +1 -1
  60. package/lib/cjs/tile/internal.d.ts +2 -0
  61. package/lib/cjs/tile/internal.d.ts.map +1 -1
  62. package/lib/cjs/tile/internal.js +2 -0
  63. package/lib/cjs/tile/internal.js.map +1 -1
  64. package/lib/cjs/tile/map/MapLayerFetchHandler.d.ts +94 -0
  65. package/lib/cjs/tile/map/MapLayerFetchHandler.d.ts.map +1 -0
  66. package/lib/cjs/tile/map/MapLayerFetchHandler.js +10 -0
  67. package/lib/cjs/tile/map/MapLayerFetchHandler.js.map +1 -0
  68. package/lib/cjs/tile/map/MapLayerFormatRegistry.d.ts +27 -1
  69. package/lib/cjs/tile/map/MapLayerFormatRegistry.d.ts.map +1 -1
  70. package/lib/cjs/tile/map/MapLayerFormatRegistry.js +42 -1
  71. package/lib/cjs/tile/map/MapLayerFormatRegistry.js.map +1 -1
  72. package/lib/cjs/tile/map/MapLayerImageryFormats.d.ts.map +1 -1
  73. package/lib/cjs/tile/map/MapLayerImageryFormats.js +20 -4
  74. package/lib/cjs/tile/map/MapLayerImageryFormats.js.map +1 -1
  75. package/lib/cjs/tile/map/MapLayerImageryProvider.d.ts +28 -16
  76. package/lib/cjs/tile/map/MapLayerImageryProvider.d.ts.map +1 -1
  77. package/lib/cjs/tile/map/MapLayerImageryProvider.js +134 -66
  78. package/lib/cjs/tile/map/MapLayerImageryProvider.js.map +1 -1
  79. package/lib/cjs/tile/map/MapLayerSources.d.ts +19 -4
  80. package/lib/cjs/tile/map/MapLayerSources.d.ts.map +1 -1
  81. package/lib/cjs/tile/map/MapLayerSources.js +28 -11
  82. package/lib/cjs/tile/map/MapLayerSources.js.map +1 -1
  83. package/lib/cjs/tools/ToolAdmin.d.ts +11 -4
  84. package/lib/cjs/tools/ToolAdmin.d.ts.map +1 -1
  85. package/lib/cjs/tools/ToolAdmin.js +28 -3
  86. package/lib/cjs/tools/ToolAdmin.js.map +1 -1
  87. package/lib/esm/RealityDataSourceTilesetUrlImpl.d.ts +5 -2
  88. package/lib/esm/RealityDataSourceTilesetUrlImpl.d.ts.map +1 -1
  89. package/lib/esm/RealityDataSourceTilesetUrlImpl.js +6 -0
  90. package/lib/esm/RealityDataSourceTilesetUrlImpl.js.map +1 -1
  91. package/lib/esm/core-frontend.d.ts +1 -1
  92. package/lib/esm/core-frontend.d.ts.map +1 -1
  93. package/lib/esm/core-frontend.js +1 -1
  94. package/lib/esm/core-frontend.js.map +1 -1
  95. package/lib/esm/internal/RealityDataSourceGoogle3dTilesImpl.d.ts +2 -0
  96. package/lib/esm/internal/RealityDataSourceGoogle3dTilesImpl.d.ts.map +1 -1
  97. package/lib/esm/internal/RealityDataSourceGoogle3dTilesImpl.js +13 -4
  98. package/lib/esm/internal/RealityDataSourceGoogle3dTilesImpl.js.map +1 -1
  99. package/lib/esm/internal/cross-package.d.ts +1 -1
  100. package/lib/esm/internal/cross-package.d.ts.map +1 -1
  101. package/lib/esm/internal/cross-package.js +1 -1
  102. package/lib/esm/internal/cross-package.js.map +1 -1
  103. package/lib/esm/internal/tile/RealityTileLoader.d.ts +1 -1
  104. package/lib/esm/internal/tile/RealityTileLoader.d.ts.map +1 -1
  105. package/lib/esm/internal/tile/RealityTileLoader.js +5 -3
  106. package/lib/esm/internal/tile/RealityTileLoader.js.map +1 -1
  107. package/lib/esm/internal/tile/map/ArcGisUtilities.d.ts +15 -2
  108. package/lib/esm/internal/tile/map/ArcGisUtilities.d.ts.map +1 -1
  109. package/lib/esm/internal/tile/map/ArcGisUtilities.js +55 -30
  110. package/lib/esm/internal/tile/map/ArcGisUtilities.js.map +1 -1
  111. package/lib/esm/internal/tile/map/ImageryProviders/ArcGISImageryProvider.d.ts +14 -0
  112. package/lib/esm/internal/tile/map/ImageryProviders/ArcGISImageryProvider.d.ts.map +1 -1
  113. package/lib/esm/internal/tile/map/ImageryProviders/ArcGISImageryProvider.js +92 -46
  114. package/lib/esm/internal/tile/map/ImageryProviders/ArcGISImageryProvider.js.map +1 -1
  115. package/lib/esm/internal/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.d.ts.map +1 -1
  116. package/lib/esm/internal/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js +5 -4
  117. package/lib/esm/internal/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js.map +1 -1
  118. package/lib/esm/internal/tile/map/ImageryProviders/WmsMapLayerImageryProvider.d.ts.map +1 -1
  119. package/lib/esm/internal/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js +9 -3
  120. package/lib/esm/internal/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js.map +1 -1
  121. package/lib/esm/internal/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.d.ts.map +1 -1
  122. package/lib/esm/internal/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.js +9 -3
  123. package/lib/esm/internal/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.js.map +1 -1
  124. package/lib/esm/internal/tile/map/MapLayerFetch.d.ts +57 -0
  125. package/lib/esm/internal/tile/map/MapLayerFetch.d.ts.map +1 -0
  126. package/lib/esm/internal/tile/map/MapLayerFetch.js +91 -0
  127. package/lib/esm/internal/tile/map/MapLayerFetch.js.map +1 -0
  128. package/lib/esm/internal/tile/map/UrlUtils.js +1 -1
  129. package/lib/esm/internal/tile/map/UrlUtils.js.map +1 -1
  130. package/lib/esm/internal/tile/map/WmsCapabilities.d.ts +2 -5
  131. package/lib/esm/internal/tile/map/WmsCapabilities.d.ts.map +1 -1
  132. package/lib/esm/internal/tile/map/WmsCapabilities.js +16 -9
  133. package/lib/esm/internal/tile/map/WmsCapabilities.js.map +1 -1
  134. package/lib/esm/internal/tile/map/WmsUtilities.d.ts +29 -1
  135. package/lib/esm/internal/tile/map/WmsUtilities.d.ts.map +1 -1
  136. package/lib/esm/internal/tile/map/WmsUtilities.js +44 -12
  137. package/lib/esm/internal/tile/map/WmsUtilities.js.map +1 -1
  138. package/lib/esm/internal/tile/map/WmtsCapabilities.d.ts +2 -5
  139. package/lib/esm/internal/tile/map/WmtsCapabilities.d.ts.map +1 -1
  140. package/lib/esm/internal/tile/map/WmtsCapabilities.js +16 -9
  141. package/lib/esm/internal/tile/map/WmtsCapabilities.js.map +1 -1
  142. package/lib/esm/tile/GltfReader.d.ts.map +1 -1
  143. package/lib/esm/tile/GltfReader.js +3 -1
  144. package/lib/esm/tile/GltfReader.js.map +1 -1
  145. package/lib/esm/tile/internal.d.ts +2 -0
  146. package/lib/esm/tile/internal.d.ts.map +1 -1
  147. package/lib/esm/tile/internal.js +2 -0
  148. package/lib/esm/tile/internal.js.map +1 -1
  149. package/lib/esm/tile/map/MapLayerFetchHandler.d.ts +94 -0
  150. package/lib/esm/tile/map/MapLayerFetchHandler.d.ts.map +1 -0
  151. package/lib/esm/tile/map/MapLayerFetchHandler.js +9 -0
  152. package/lib/esm/tile/map/MapLayerFetchHandler.js.map +1 -0
  153. package/lib/esm/tile/map/MapLayerFormatRegistry.d.ts +27 -1
  154. package/lib/esm/tile/map/MapLayerFormatRegistry.d.ts.map +1 -1
  155. package/lib/esm/tile/map/MapLayerFormatRegistry.js +40 -0
  156. package/lib/esm/tile/map/MapLayerFormatRegistry.js.map +1 -1
  157. package/lib/esm/tile/map/MapLayerImageryFormats.d.ts.map +1 -1
  158. package/lib/esm/tile/map/MapLayerImageryFormats.js +21 -5
  159. package/lib/esm/tile/map/MapLayerImageryFormats.js.map +1 -1
  160. package/lib/esm/tile/map/MapLayerImageryProvider.d.ts +28 -16
  161. package/lib/esm/tile/map/MapLayerImageryProvider.d.ts.map +1 -1
  162. package/lib/esm/tile/map/MapLayerImageryProvider.js +136 -68
  163. package/lib/esm/tile/map/MapLayerImageryProvider.js.map +1 -1
  164. package/lib/esm/tile/map/MapLayerSources.d.ts +19 -4
  165. package/lib/esm/tile/map/MapLayerSources.d.ts.map +1 -1
  166. package/lib/esm/tile/map/MapLayerSources.js +28 -11
  167. package/lib/esm/tile/map/MapLayerSources.js.map +1 -1
  168. package/lib/esm/tools/ToolAdmin.d.ts +11 -4
  169. package/lib/esm/tools/ToolAdmin.d.ts.map +1 -1
  170. package/lib/esm/tools/ToolAdmin.js +30 -5
  171. package/lib/esm/tools/ToolAdmin.js.map +1 -1
  172. package/package.json +21 -21
@@ -1 +1 @@
1
- {"version":3,"file":"MapLayerImageryFormats.js","sourceRoot":"","sources":["../../../../src/tile/map/MapLayerImageryFormats.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module MapLayers\r\n */\r\nimport { ImageMapLayerSettings, MapSubLayerProps } from \"@itwin/core-common\";\r\nimport { IModelConnection } from \"../../IModelConnection\";\r\nimport {\r\n ArcGISMapLayerImageryProvider,\r\n ArcGisUtilities,\r\n BingMapsImageryLayerProvider,\r\n ImageryMapLayerTreeReference,\r\n MapBoxLayerImageryProvider,\r\n MapLayerFormat,\r\n MapLayerImageryProvider,\r\n MapLayerSource,\r\n MapLayerSourceStatus,\r\n MapLayerSourceValidation,\r\n MapLayerTileTreeReference,\r\n MapLayerUntrustedOriginError,\r\n TileUrlImageryProvider,\r\n ValidateSourceArgs,\r\n WmsCapabilities,\r\n WmsMapLayerImageryProvider,\r\n WmtsCapabilities,\r\n WmtsCapability,\r\n WmtsMapLayerImageryProvider,\r\n} from \"../internal\";\r\n\r\n/** Base class imagery map layer formats.\r\n * Subclasses should override formatId and [[MapLayerFormat.createImageryProvider]].\r\n * @see [[MapLayerFormat]]\r\n * @beta\r\n */\r\nexport class ImageryMapLayerFormat extends MapLayerFormat {\r\n /** @internal */\r\n public static override createMapLayerTree(layerSettings: ImageMapLayerSettings, layerIndex: number, iModel: IModelConnection): MapLayerTileTreeReference | undefined {\r\n return new ImageryMapLayerTreeReference({ layerSettings, layerIndex, iModel });\r\n }\r\n}\r\n\r\nclass WmsMapLayerFormat extends ImageryMapLayerFormat {\r\n public static override formatId = \"WMS\";\r\n\r\n public static override createImageryProvider(settings: ImageMapLayerSettings): MapLayerImageryProvider | undefined {\r\n return new WmsMapLayerImageryProvider(settings);\r\n }\r\n public static override async validateSource(url: string, userName?: string, password?: string, ignoreCache?: boolean): Promise<MapLayerSourceValidation> {\r\n const source = MapLayerSource.fromJSON({name: \"\", formatId: WmsMapLayerFormat.formatId, url});\r\n if (source === undefined)\r\n return { status: MapLayerSourceStatus.InvalidFormat };\r\n source.userName = userName;\r\n source.password = password;\r\n return WmsMapLayerFormat.validate({source, ignoreCache});\r\n }\r\n\r\n public static override async validate(args: ValidateSourceArgs): Promise<MapLayerSourceValidation> {\r\n const {source, ignoreCache} = args;\r\n const { url, userName, password } = source;\r\n\r\n try {\r\n let subLayers: MapSubLayerProps[] | undefined;\r\n const maxVisibleSubLayers = 50;\r\n const capabilities = await WmsCapabilities.create(url, (userName && password ? {user: userName, password} : undefined), ignoreCache, source.collectQueryParams());\r\n if (capabilities !== undefined) {\r\n subLayers = capabilities.getSubLayers(false);\r\n const rootsSubLayer = subLayers?.find((sublayer) => sublayer.parent === undefined);\r\n const hasTooManyLayers = subLayers && subLayers.length > maxVisibleSubLayers;\r\n\r\n if (!Array.isArray(subLayers))\r\n return { status: MapLayerSourceStatus.Valid, subLayers };\r\n\r\n for (const subLayer of subLayers) {\r\n // In general for WMS, we prefer to have the children of root node visible, but not the root itself.\r\n // Thats simply to give more flexibility in the UI.\r\n // Two exceptions to this rule: If there are too many layers or the root node is not named.\r\n if (subLayer.id && subLayer.id === rootsSubLayer?.id\r\n && (!(subLayer.name && subLayer.name.length > 0) || hasTooManyLayers)) {\r\n subLayer.visible = true;\r\n break; // if root node is visible, don't bother turning ON any other layers\r\n }\r\n\r\n // Make children of the root node visible.\r\n if (subLayer.parent && subLayer.parent === rootsSubLayer?.id && !hasTooManyLayers) {\r\n const isUnnamedGroup = (layer: MapSubLayerProps) => {\r\n return layer.children && layer.children.length > 0 && (!layer.name || layer.name.length === 0);\r\n };\r\n\r\n const makeChildrenVisible = (layers: MapSubLayerProps[] | undefined, layer: MapSubLayerProps) => {\r\n layer?.children?.forEach((childId) => {\r\n const childSubLayer = subLayers?.find((child) => child?.id === childId);\r\n if (childSubLayer) {\r\n childSubLayer.visible = true;\r\n if (isUnnamedGroup(childSubLayer))\r\n makeChildrenVisible(layers, childSubLayer);\r\n }\r\n });\r\n };\r\n\r\n subLayer.visible = true;\r\n\r\n // If we got a unnamed group, make children visible recursively until we have a leaf or named group\r\n if (isUnnamedGroup(subLayer))\r\n makeChildrenVisible(subLayers, subLayer);\r\n }\r\n }\r\n }\r\n\r\n return { status: MapLayerSourceStatus.Valid, subLayers };\r\n } catch (err: any) {\r\n if (err instanceof MapLayerUntrustedOriginError) {\r\n let blockedOrigin: string | undefined;\r\n try { blockedOrigin = new URL(err.url).origin; } catch { /* non-hierarchical URL */ }\r\n return { status: MapLayerSourceStatus.UntrustedOrigin, blockedOrigin };\r\n }\r\n let status = MapLayerSourceStatus.InvalidUrl;\r\n if (err?.status === 401) {\r\n status = ((userName && password) ? MapLayerSourceStatus.InvalidCredentials : MapLayerSourceStatus.RequireAuth);\r\n }\r\n return { status};\r\n }\r\n }\r\n\r\n}\r\n\r\nclass WmtsMapLayerFormat extends ImageryMapLayerFormat {\r\n public static override formatId = \"WMTS\";\r\n\r\n public static override createImageryProvider(settings: ImageMapLayerSettings): MapLayerImageryProvider | undefined {\r\n return new WmtsMapLayerImageryProvider(settings);\r\n }\r\n\r\n public static override async validateSource(url: string, userName?: string, password?: string, ignoreCache?: boolean): Promise<MapLayerSourceValidation> {\r\n const source = MapLayerSource.fromJSON({name: \"\", formatId: WmtsMapLayerFormat.formatId, url});\r\n if (source === undefined)\r\n return { status: MapLayerSourceStatus.InvalidFormat };\r\n source.userName = userName;\r\n source.password = password;\r\n return WmtsMapLayerFormat.validate({source, ignoreCache});\r\n }\r\n\r\n public static override async validate(args: ValidateSourceArgs): Promise<MapLayerSourceValidation> {\r\n const {source, ignoreCache} = args;\r\n const { url, userName, password } = source;\r\n try {\r\n const subLayers: MapSubLayerProps[] = [];\r\n const capabilities = await WmtsCapabilities.create(url, (userName && password ? {user: userName, password} : undefined), ignoreCache, source.collectQueryParams());\r\n if (!capabilities)\r\n return { status: MapLayerSourceStatus.InvalidUrl };\r\n\r\n // Only returns layer that can be published in the Google maps or WGS84 aligned tile trees.\r\n let supportedTms: WmtsCapability.TileMatrixSet[] = [];\r\n const googleMapsTms = capabilities?.contents?.getGoogleMapsCompatibleTileMatrixSet();\r\n if (googleMapsTms) {\r\n supportedTms = googleMapsTms;\r\n }\r\n const wsg84Tms = capabilities?.contents?.getEpsg4326CompatibleTileMatrixSet();\r\n if (wsg84Tms) {\r\n supportedTms = supportedTms.concat(wsg84Tms);\r\n }\r\n\r\n if (supportedTms.length === 0) {\r\n // This WMTS server doesn't support either GoogleMaps or WSG84\r\n return { status: MapLayerSourceStatus.InvalidCoordinateSystem };\r\n }\r\n\r\n let subLayerId = 0;\r\n capabilities?.contents?.layers.forEach((layer) => {\r\n const hasSupportedTms = supportedTms?.some((tms) => {\r\n return layer.tileMatrixSetLinks.some((tmls) => tmls.tileMatrixSet === tms.identifier);\r\n });\r\n if (hasSupportedTms) {\r\n subLayers.push({\r\n name: layer.identifier,\r\n title: layer.title ?? layer.identifier,\r\n visible: (subLayers.length === 0), // Make the first layer visible.\r\n parent: undefined,\r\n children: undefined,\r\n id: subLayerId++,\r\n });\r\n }\r\n });\r\n\r\n // Return error if we could find a single compatible layer.\r\n if (subLayers.length === 0)\r\n return { status: MapLayerSourceStatus.InvalidTileTree };\r\n\r\n return { status: MapLayerSourceStatus.Valid, subLayers };\r\n } catch (err: any) {\r\n if (err instanceof MapLayerUntrustedOriginError) {\r\n let blockedOrigin: string | undefined;\r\n try { blockedOrigin = new URL(err.url).origin; } catch { /* non-hierarchical URL */ }\r\n return { status: MapLayerSourceStatus.UntrustedOrigin, blockedOrigin };\r\n }\r\n let status = MapLayerSourceStatus.InvalidUrl;\r\n if (err?.status === 401) {\r\n status = ((userName && password) ? MapLayerSourceStatus.InvalidCredentials : MapLayerSourceStatus.RequireAuth);\r\n }\r\n return { status};\r\n }\r\n }\r\n\r\n}\r\n\r\nclass ArcGISMapLayerFormat extends ImageryMapLayerFormat {\r\n public static override formatId = \"ArcGIS\";\r\n public static override async validateSource(url: string, userName?: string, password?: string, ignoreCache?: boolean): Promise<MapLayerSourceValidation> {\r\n const source = MapLayerSource.fromJSON({name: \"\", formatId: WmtsMapLayerFormat.formatId, url});\r\n if (source === undefined)\r\n return { status: MapLayerSourceStatus.InvalidFormat };\r\n source.userName = userName;\r\n source.password = password;\r\n return WmtsMapLayerFormat.validate({source, ignoreCache});\r\n }\r\n\r\n public static override async validate(args: ValidateSourceArgs): Promise<MapLayerSourceValidation> {\r\n const urlValidation = ArcGisUtilities.validateUrl(args.source.url, \"MapServer\");\r\n if (urlValidation !== MapLayerSourceStatus.Valid)\r\n return {status: urlValidation};\r\n\r\n // Some Map service supporting only tiles don't include the 'Map' capabilities, thus we can't make it mandatory.\r\n return ArcGisUtilities.validateSource({...args, capabilitiesFilter: []});\r\n }\r\n\r\n public static override createImageryProvider(settings: ImageMapLayerSettings): MapLayerImageryProvider | undefined {\r\n return new ArcGISMapLayerImageryProvider(settings);\r\n }\r\n}\r\n\r\n/** @deprecated in 5.11.0 - will not be removed until after 2027-07-03. Bing Maps imagery is deprecated. For basemap imagery providers, see `@itwin/map-layers-formats`. */\r\nclass BingMapsMapLayerFormat extends ImageryMapLayerFormat {\r\n public static override formatId = \"BingMaps\";\r\n public static override createImageryProvider(settings: ImageMapLayerSettings): MapLayerImageryProvider | undefined {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n return new BingMapsImageryLayerProvider(settings);\r\n }\r\n}\r\n\r\nclass MapBoxImageryMapLayerFormat extends ImageryMapLayerFormat {\r\n public static override formatId = \"MapboxImagery\";\r\n public static override createImageryProvider(settings: ImageMapLayerSettings): MapLayerImageryProvider | undefined {\r\n return new MapBoxLayerImageryProvider(settings);\r\n }\r\n}\r\nclass TileUrlMapLayerFormat extends ImageryMapLayerFormat {\r\n public static override formatId = \"TileURL\";\r\n public static override createImageryProvider(settings: ImageMapLayerSettings): MapLayerImageryProvider | undefined { return new TileUrlImageryProvider(settings); }\r\n}\r\n\r\n/** @internal */\r\n// eslint-disable-next-line @typescript-eslint/no-deprecated -- BingMapsMapLayerFormat is deprecated but must remain registered for legacy persisted styles.\r\nexport const internalMapLayerImageryFormats = [WmsMapLayerFormat, WmtsMapLayerFormat, ArcGISMapLayerFormat, BingMapsMapLayerFormat, MapBoxImageryMapLayerFormat, TileUrlMapLayerFormat];\r\n"]}
1
+ {"version":3,"file":"MapLayerImageryFormats.js","sourceRoot":"","sources":["../../../../src/tile/map/MapLayerImageryFormats.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module MapLayers\r\n */\r\nimport { ImageMapLayerSettings, MapSubLayerProps } from \"@itwin/core-common\";\r\nimport { IModelConnection } from \"../../IModelConnection\";\r\nimport {\r\n ArcGISMapLayerImageryProvider,\r\n ArcGisUtilities,\r\n BingMapsImageryLayerProvider,\r\n ImageryMapLayerTreeReference,\r\n MapBoxLayerImageryProvider,\r\n MapLayerAuthenticationFailedError,\r\n MapLayerFormat,\r\n MapLayerImageryProvider,\r\n MapLayerSource,\r\n MapLayerSourceStatus,\r\n MapLayerSourceValidation,\r\n MapLayerTileTreeReference,\r\n MapLayerUntrustedOriginError,\r\n TileUrlImageryProvider,\r\n ValidateSourceArgs,\r\n WmsCapabilities,\r\n WmsMapLayerImageryProvider,\r\n WmtsCapabilities,\r\n WmtsCapability,\r\n WmtsMapLayerImageryProvider,\r\n} from \"../internal\";\r\n\r\n/** Base class imagery map layer formats.\r\n * Subclasses should override formatId and [[MapLayerFormat.createImageryProvider]].\r\n * @see [[MapLayerFormat]]\r\n * @beta\r\n */\r\nexport class ImageryMapLayerFormat extends MapLayerFormat {\r\n /** @internal */\r\n public static override createMapLayerTree(layerSettings: ImageMapLayerSettings, layerIndex: number, iModel: IModelConnection): MapLayerTileTreeReference | undefined {\r\n return new ImageryMapLayerTreeReference({ layerSettings, layerIndex, iModel });\r\n }\r\n}\r\n\r\nclass WmsMapLayerFormat extends ImageryMapLayerFormat {\r\n public static override formatId = \"WMS\";\r\n\r\n public static override createImageryProvider(settings: ImageMapLayerSettings): MapLayerImageryProvider | undefined {\r\n return new WmsMapLayerImageryProvider(settings);\r\n }\r\n public static override async validateSource(url: string, userName?: string, password?: string, ignoreCache?: boolean): Promise<MapLayerSourceValidation> {\r\n const source = MapLayerSource.fromJSON({name: \"\", formatId: WmsMapLayerFormat.formatId, url});\r\n if (source === undefined)\r\n return { status: MapLayerSourceStatus.InvalidFormat };\r\n source.userName = userName;\r\n source.password = password;\r\n return WmsMapLayerFormat.validate({source, ignoreCache});\r\n }\r\n\r\n public static override async validate(args: ValidateSourceArgs): Promise<MapLayerSourceValidation> {\r\n const {source, ignoreCache} = args;\r\n const { url, userName, password } = source;\r\n\r\n try {\r\n let subLayers: MapSubLayerProps[] | undefined;\r\n const maxVisibleSubLayers = 50;\r\n const capabilities = await WmsCapabilities.create(url, {\r\n credentials: (userName && password ? {user: userName, password} : undefined),\r\n ignoreCache,\r\n queryParams: source.collectQueryParams(),\r\n formatId: source.formatId,\r\n });\r\n if (capabilities !== undefined) {\r\n subLayers = capabilities.getSubLayers(false);\r\n const rootsSubLayer = subLayers?.find((sublayer) => sublayer.parent === undefined);\r\n const hasTooManyLayers = subLayers && subLayers.length > maxVisibleSubLayers;\r\n\r\n if (!Array.isArray(subLayers))\r\n return { status: MapLayerSourceStatus.Valid, subLayers };\r\n\r\n for (const subLayer of subLayers) {\r\n // In general for WMS, we prefer to have the children of root node visible, but not the root itself.\r\n // Thats simply to give more flexibility in the UI.\r\n // Two exceptions to this rule: If there are too many layers or the root node is not named.\r\n if (subLayer.id && subLayer.id === rootsSubLayer?.id\r\n && (!(subLayer.name && subLayer.name.length > 0) || hasTooManyLayers)) {\r\n subLayer.visible = true;\r\n break; // if root node is visible, don't bother turning ON any other layers\r\n }\r\n\r\n // Make children of the root node visible.\r\n if (subLayer.parent && subLayer.parent === rootsSubLayer?.id && !hasTooManyLayers) {\r\n const isUnnamedGroup = (layer: MapSubLayerProps) => {\r\n return layer.children && layer.children.length > 0 && (!layer.name || layer.name.length === 0);\r\n };\r\n\r\n const makeChildrenVisible = (layers: MapSubLayerProps[] | undefined, layer: MapSubLayerProps) => {\r\n layer?.children?.forEach((childId) => {\r\n const childSubLayer = subLayers?.find((child) => child?.id === childId);\r\n if (childSubLayer) {\r\n childSubLayer.visible = true;\r\n if (isUnnamedGroup(childSubLayer))\r\n makeChildrenVisible(layers, childSubLayer);\r\n }\r\n });\r\n };\r\n\r\n subLayer.visible = true;\r\n\r\n // If we got a unnamed group, make children visible recursively until we have a leaf or named group\r\n if (isUnnamedGroup(subLayer))\r\n makeChildrenVisible(subLayers, subLayer);\r\n }\r\n }\r\n }\r\n\r\n return { status: MapLayerSourceStatus.Valid, subLayers };\r\n } catch (err: any) {\r\n if (err instanceof MapLayerUntrustedOriginError) {\r\n let blockedOrigin: string | undefined;\r\n try { blockedOrigin = new URL(err.url).origin; } catch { /* non-hierarchical URL */ }\r\n return { status: MapLayerSourceStatus.UntrustedOrigin, blockedOrigin };\r\n }\r\n let status = MapLayerSourceStatus.InvalidUrl;\r\n if (err instanceof MapLayerAuthenticationFailedError) {\r\n status = MapLayerSourceStatus.RequireAuth;\r\n } else if (err?.status === 401) {\r\n status = ((userName && password) ? MapLayerSourceStatus.InvalidCredentials : MapLayerSourceStatus.RequireAuth);\r\n }\r\n return { status};\r\n }\r\n }\r\n\r\n}\r\n\r\nclass WmtsMapLayerFormat extends ImageryMapLayerFormat {\r\n public static override formatId = \"WMTS\";\r\n\r\n public static override createImageryProvider(settings: ImageMapLayerSettings): MapLayerImageryProvider | undefined {\r\n return new WmtsMapLayerImageryProvider(settings);\r\n }\r\n\r\n public static override async validateSource(url: string, userName?: string, password?: string, ignoreCache?: boolean): Promise<MapLayerSourceValidation> {\r\n const source = MapLayerSource.fromJSON({name: \"\", formatId: WmtsMapLayerFormat.formatId, url});\r\n if (source === undefined)\r\n return { status: MapLayerSourceStatus.InvalidFormat };\r\n source.userName = userName;\r\n source.password = password;\r\n return WmtsMapLayerFormat.validate({source, ignoreCache});\r\n }\r\n\r\n public static override async validate(args: ValidateSourceArgs): Promise<MapLayerSourceValidation> {\r\n const {source, ignoreCache} = args;\r\n const { url, userName, password } = source;\r\n try {\r\n const subLayers: MapSubLayerProps[] = [];\r\n const capabilities = await WmtsCapabilities.create(url, {\r\n credentials: (userName && password ? {user: userName, password} : undefined),\r\n ignoreCache,\r\n queryParams: source.collectQueryParams(),\r\n formatId: source.formatId,\r\n });\r\n if (!capabilities)\r\n return { status: MapLayerSourceStatus.InvalidUrl };\r\n\r\n // Only returns layer that can be published in the Google maps or WGS84 aligned tile trees.\r\n let supportedTms: WmtsCapability.TileMatrixSet[] = [];\r\n const googleMapsTms = capabilities?.contents?.getGoogleMapsCompatibleTileMatrixSet();\r\n if (googleMapsTms) {\r\n supportedTms = googleMapsTms;\r\n }\r\n const wsg84Tms = capabilities?.contents?.getEpsg4326CompatibleTileMatrixSet();\r\n if (wsg84Tms) {\r\n supportedTms = supportedTms.concat(wsg84Tms);\r\n }\r\n\r\n if (supportedTms.length === 0) {\r\n // This WMTS server doesn't support either GoogleMaps or WSG84\r\n return { status: MapLayerSourceStatus.InvalidCoordinateSystem };\r\n }\r\n\r\n let subLayerId = 0;\r\n capabilities?.contents?.layers.forEach((layer) => {\r\n const hasSupportedTms = supportedTms?.some((tms) => {\r\n return layer.tileMatrixSetLinks.some((tmls) => tmls.tileMatrixSet === tms.identifier);\r\n });\r\n if (hasSupportedTms) {\r\n subLayers.push({\r\n name: layer.identifier,\r\n title: layer.title ?? layer.identifier,\r\n visible: (subLayers.length === 0), // Make the first layer visible.\r\n parent: undefined,\r\n children: undefined,\r\n id: subLayerId++,\r\n });\r\n }\r\n });\r\n\r\n // Return error if we could find a single compatible layer.\r\n if (subLayers.length === 0)\r\n return { status: MapLayerSourceStatus.InvalidTileTree };\r\n\r\n return { status: MapLayerSourceStatus.Valid, subLayers };\r\n } catch (err: any) {\r\n if (err instanceof MapLayerUntrustedOriginError) {\r\n let blockedOrigin: string | undefined;\r\n try { blockedOrigin = new URL(err.url).origin; } catch { /* non-hierarchical URL */ }\r\n return { status: MapLayerSourceStatus.UntrustedOrigin, blockedOrigin };\r\n }\r\n let status = MapLayerSourceStatus.InvalidUrl;\r\n if (err instanceof MapLayerAuthenticationFailedError) {\r\n status = MapLayerSourceStatus.RequireAuth;\r\n } else if (err?.status === 401) {\r\n status = ((userName && password) ? MapLayerSourceStatus.InvalidCredentials : MapLayerSourceStatus.RequireAuth);\r\n }\r\n return { status};\r\n }\r\n }\r\n\r\n}\r\n\r\nclass ArcGISMapLayerFormat extends ImageryMapLayerFormat {\r\n public static override formatId = \"ArcGIS\";\r\n public static override async validateSource(url: string, userName?: string, password?: string, ignoreCache?: boolean): Promise<MapLayerSourceValidation> {\r\n const source = MapLayerSource.fromJSON({name: \"\", formatId: WmtsMapLayerFormat.formatId, url});\r\n if (source === undefined)\r\n return { status: MapLayerSourceStatus.InvalidFormat };\r\n source.userName = userName;\r\n source.password = password;\r\n return WmtsMapLayerFormat.validate({source, ignoreCache});\r\n }\r\n\r\n public static override async validate(args: ValidateSourceArgs): Promise<MapLayerSourceValidation> {\r\n const urlValidation = ArcGisUtilities.validateUrl(args.source.url, \"MapServer\");\r\n if (urlValidation !== MapLayerSourceStatus.Valid)\r\n return {status: urlValidation};\r\n\r\n // Some Map service supporting only tiles don't include the 'Map' capabilities, thus we can't make it mandatory.\r\n return ArcGisUtilities.validateSource({...args, capabilitiesFilter: []});\r\n }\r\n\r\n public static override createImageryProvider(settings: ImageMapLayerSettings): MapLayerImageryProvider | undefined {\r\n return new ArcGISMapLayerImageryProvider(settings);\r\n }\r\n}\r\n\r\n/** @deprecated in 5.11.0 - will not be removed until after 2027-07-03. Bing Maps imagery is deprecated. For basemap imagery providers, see `@itwin/map-layers-formats`. */\r\nclass BingMapsMapLayerFormat extends ImageryMapLayerFormat {\r\n public static override formatId = \"BingMaps\";\r\n public static override createImageryProvider(settings: ImageMapLayerSettings): MapLayerImageryProvider | undefined {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n return new BingMapsImageryLayerProvider(settings);\r\n }\r\n}\r\n\r\nclass MapBoxImageryMapLayerFormat extends ImageryMapLayerFormat {\r\n public static override formatId = \"MapboxImagery\";\r\n public static override createImageryProvider(settings: ImageMapLayerSettings): MapLayerImageryProvider | undefined {\r\n return new MapBoxLayerImageryProvider(settings);\r\n }\r\n}\r\nclass TileUrlMapLayerFormat extends ImageryMapLayerFormat {\r\n public static override formatId = \"TileURL\";\r\n public static override createImageryProvider(settings: ImageMapLayerSettings): MapLayerImageryProvider | undefined { return new TileUrlImageryProvider(settings); }\r\n}\r\n\r\n/** @internal */\r\n// eslint-disable-next-line @typescript-eslint/no-deprecated -- BingMapsMapLayerFormat is deprecated but must remain registered for legacy persisted styles.\r\nexport const internalMapLayerImageryFormats = [WmsMapLayerFormat, WmtsMapLayerFormat, ArcGISMapLayerFormat, BingMapsMapLayerFormat, MapBoxImageryMapLayerFormat, TileUrlMapLayerFormat];\r\n"]}
@@ -4,7 +4,7 @@
4
4
  import { BeEvent } from "@itwin/core-bentley";
5
5
  import { Cartographic, ImageMapLayerSettings, ImageSource } from "@itwin/core-common";
6
6
  import { ScreenViewport } from "../../Viewport";
7
- import { ImageryMapTile, ImageryMapTileTree, MapCartoRectangle, MapFeatureInfoOptions, MapLayerFeatureInfo, MapTilingScheme, QuadId } from "../internal";
7
+ import { ImageryMapTile, ImageryMapTileTree, MapCartoRectangle, MapFeatureInfoOptions, MapLayerAccessClient, MapLayerFeatureInfo, MapTilingScheme, QuadId } from "../internal";
8
8
  import { HitDetail } from "../../HitDetail";
9
9
  import { DecorateContext } from "../../ViewContext";
10
10
  /** Escapes HTML metacharacters so the text renders literally when assigned to `innerHTML`.
@@ -207,8 +207,22 @@ export declare abstract class MapLayerImageryProvider {
207
207
  * @internal
208
208
  */
209
209
  protected onStatusUpdated(_newStatus: MapLayerImageryProviderStatus): void;
210
+ /** Transitions to [[MapLayerImageryProviderStatus.RequireAuth]] after a [[MapLayerFetchHandler]] reported an
211
+ * unrecoverable authentication failure. The user is notified once per transition, and only if tiles had
212
+ * loaded before: an initialization failure was already reported through source validation.
213
+ * @internal
214
+ */
215
+ protected reportAuthenticationFailure(): void;
210
216
  /** @internal */
211
217
  protected setRequestAuthorization(headers: Headers): void;
218
+ /** The access client registered for this layer's format, if any.
219
+ * @internal
220
+ */
221
+ protected get accessClient(): MapLayerAccessClient | undefined;
222
+ /** True while at least one [[MapLayerFetchHandler]] is registered via [[MapLayerFormatRegistry.addMapLayerFetchHandler]].
223
+ * @internal
224
+ */
225
+ protected get hasFetchHandler(): boolean;
212
226
  /** Returns true if the given URL has the same origin as this layer's settings URL.
213
227
  * Used to avoid leaking credentials to third-party hosts.
214
228
  * @internal
@@ -244,34 +258,32 @@ export declare abstract class MapLayerImageryProvider {
244
258
  * @internal
245
259
  */
246
260
  protected logUntrustedOriginUse(url: string): void;
247
- /** The redirect policy to apply to a request that carries browser credentials (see [[includeUserCredentials]]).
248
- *
249
- * When [[MapLayerFormatRegistry.restrictCredentialsToTrustedOrigins]] is enabled, redirects are refused
250
- * outright (`"error"`). `fetch` cannot be asked to follow only same-origin redirects, and by the time a
251
- * followed redirect can be inspected the credentials have already been delivered to the destination — so
252
- * refusing is the only way to honour the guarantee that credentials reach none but the origins listed in
253
- * [[MapLayerFormatRegistry.trustedCredentialsOrigins]]. Legitimate same-origin redirects fail as a result;
254
- * that is the cost of the opt-in restriction.
255
- *
256
- * When the restriction is disabled (the default), redirects are followed as before and
257
- * [[checkCredentialedRedirect]] reports the destination after the fact.
258
- * @internal
259
- */
260
- protected get credentialedRedirect(): RequestRedirect | undefined;
261
261
  /** Detects that a request carrying browser credentials (see [[includeUserCredentials]]) was transparently
262
262
  * redirected to a different origin, and reports or logs that origin.
263
263
  *
264
264
  * This is a **best-effort, after-the-fact** signal used only while
265
265
  * [[MapLayerFormatRegistry.restrictCredentialsToTrustedOrigins]] is disabled, where credentialed requests
266
- * still follow redirects (see [[credentialedRedirect]]). It cannot prevent the exposure — the credentials
266
+ * still follow redirects (see [[credentialedFetchRedirect]]). It cannot prevent the exposure — the credentials
267
267
  * have already been sent — and it does not fire at all when the destination denies CORS, because `fetch`
268
268
  * then rejects instead of returning a `Response`. The destination origin is never latched as SSO-succeeded,
269
269
  * so credentials do not keep flowing to it.
270
270
  * @internal
271
271
  */
272
272
  protected checkCredentialedRedirect(requestedUrl: string, response: Response): void;
273
+ /** The default send for [[makeRequest]]: legacy redirect policy, NTLM/SSO handling and origin-trust
274
+ * checks for one request. The SSO retry never applies to sends a fetch handler modified.
275
+ */
276
+ private sendDefaultRequest;
273
277
  /** @internal */
274
278
  makeRequest(url: string, timeoutMs?: number, authorization?: string): Promise<Response>;
279
+ /** Responses of [[makeRequest]] managed by a fetch handler (see [[MapLayerFetchResult.managedByHandler]]). */
280
+ private readonly _handlerManagedResponses;
281
+ /** Returns true if a fetch handler returned this [[makeRequest]] response as its own, in which case the
282
+ * provider applies none of its default response handling (status-code or protocol-error classification):
283
+ * the handler reports authentication failures by throwing [[MapLayerAuthenticationFailedError]] instead.
284
+ * @internal
285
+ */
286
+ protected isManagedByHandler(response: Response): boolean;
275
287
  /** Returns a map layer tile at the specified settings. */
276
288
  loadTile(row: number, column: number, zoomLevel: number): Promise<ImageSource | undefined>;
277
289
  /** @internal */
@@ -1 +1 @@
1
- {"version":3,"file":"MapLayerImageryProvider.d.ts","sourceRoot":"","sources":["../../../../src/tile/map/MapLayerImageryProvider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MapLayerImageryProvider.d.ts","sourceRoot":"","sources":["../../../../src/tile/map/MapLayerImageryProvider.ts"],"names":[],"mappings":"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"}
@@ -5,17 +5,18 @@
5
5
  /** @packageDocumentation
6
6
  * @module MapLayers
7
7
  */
8
- import { assert, BeEvent } from "@itwin/core-bentley";
8
+ import { assert, BeEvent, BentleyError, Logger } from "@itwin/core-bentley";
9
9
  import { ImageSource, ImageSourceFormat } from "@itwin/core-common";
10
10
  import { Angle } from "@itwin/core-geometry";
11
11
  import { IModelApp } from "../../IModelApp";
12
12
  import { NotifyMessageDetails, OutputMessagePriority } from "../../NotificationManager";
13
- import { appendQueryParams, GeographicTilingScheme, WebMercatorTilingScheme } from "../internal";
13
+ import { appendQueryParams, credentialedFetchRedirect, fetchMapLayerRequest, GeographicTilingScheme, MapLayerAuthenticationFailedError, WebMercatorTilingScheme } from "../internal";
14
14
  import { headersIncludeAuthMethod, setBasicAuthorization, setRequestTimeout } from "../../request/utils";
15
15
  /** @internal */
16
16
  const tileImageSize = 256, untiledImageSize = 256;
17
17
  const earthRadius = 6378137;
18
18
  const doDebugToolTips = false;
19
+ const loggerCategory = "MapLayerImageryProvider";
19
20
  /** Escapes HTML metacharacters so the text renders literally when assigned to `innerHTML`.
20
21
  * Use for any server- or user-supplied string that ends up in the map tooltip, which is rendered
21
22
  * as HTML by [[MapLayerTileTreeReference.getToolTip]].
@@ -302,12 +303,37 @@ export class MapLayerImageryProvider {
302
303
  * @internal
303
304
  */
304
305
  onStatusUpdated(_newStatus) { }
306
+ /** Transitions to [[MapLayerImageryProviderStatus.RequireAuth]] after a [[MapLayerFetchHandler]] reported an
307
+ * unrecoverable authentication failure. The user is notified once per transition, and only if tiles had
308
+ * loaded before: an initialization failure was already reported through source validation.
309
+ * @internal
310
+ */
311
+ reportAuthenticationFailure() {
312
+ const alreadyReported = this._status === MapLayerImageryProviderStatus.RequireAuth;
313
+ this.setStatus(MapLayerImageryProviderStatus.RequireAuth);
314
+ if (alreadyReported || !this._hasSuccessfullyFetchedTile)
315
+ return;
316
+ const msg = IModelApp.localization.getLocalizedString("iModelJs:MapLayers.Messages.LoadTileTokenError", { layerName: this._settings.name });
317
+ IModelApp.notifications.outputMessage(new NotifyMessageDetails(OutputMessagePriority.Warning, msg));
318
+ }
305
319
  /** @internal */
306
320
  setRequestAuthorization(headers) {
307
321
  if (this._settings.userName && this._settings.password) {
308
322
  setBasicAuthorization(headers, this._settings.userName, this._settings.password);
309
323
  }
310
324
  }
325
+ /** The access client registered for this layer's format, if any.
326
+ * @internal
327
+ */
328
+ get accessClient() {
329
+ return IModelApp.mapLayerFormatRegistry?.getAccessClient(this._settings.formatId);
330
+ }
331
+ /** True while at least one [[MapLayerFetchHandler]] is registered via [[MapLayerFormatRegistry.addMapLayerFetchHandler]].
332
+ * @internal
333
+ */
334
+ get hasFetchHandler() {
335
+ return (IModelApp.mapLayerFormatRegistry?.mapLayerFetchHandlers.length ?? 0) > 0;
336
+ }
311
337
  /** Returns true if the given URL has the same origin as this layer's settings URL.
312
338
  * Used to avoid leaking credentials to third-party hosts.
313
339
  * @internal
@@ -377,28 +403,12 @@ export class MapLayerImageryProvider {
377
403
  logUntrustedOriginUse(url) {
378
404
  IModelApp.mapLayerFormatRegistry.logUntrustedOriginUse(url);
379
405
  }
380
- /** The redirect policy to apply to a request that carries browser credentials (see [[includeUserCredentials]]).
381
- *
382
- * When [[MapLayerFormatRegistry.restrictCredentialsToTrustedOrigins]] is enabled, redirects are refused
383
- * outright (`"error"`). `fetch` cannot be asked to follow only same-origin redirects, and by the time a
384
- * followed redirect can be inspected the credentials have already been delivered to the destination — so
385
- * refusing is the only way to honour the guarantee that credentials reach none but the origins listed in
386
- * [[MapLayerFormatRegistry.trustedCredentialsOrigins]]. Legitimate same-origin redirects fail as a result;
387
- * that is the cost of the opt-in restriction.
388
- *
389
- * When the restriction is disabled (the default), redirects are followed as before and
390
- * [[checkCredentialedRedirect]] reports the destination after the fact.
391
- * @internal
392
- */
393
- get credentialedRedirect() {
394
- return IModelApp.mapLayerFormatRegistry.restrictCredentialsToTrustedOrigins ? "error" : undefined;
395
- }
396
406
  /** Detects that a request carrying browser credentials (see [[includeUserCredentials]]) was transparently
397
407
  * redirected to a different origin, and reports or logs that origin.
398
408
  *
399
409
  * This is a **best-effort, after-the-fact** signal used only while
400
410
  * [[MapLayerFormatRegistry.restrictCredentialsToTrustedOrigins]] is disabled, where credentialed requests
401
- * still follow redirects (see [[credentialedRedirect]]). It cannot prevent the exposure — the credentials
411
+ * still follow redirects (see [[credentialedFetchRedirect]]). It cannot prevent the exposure — the credentials
402
412
  * have already been sent — and it does not fire at all when the destination denies CORS, because `fetch`
403
413
  * then rejects instead of returning a `Response`. The destination origin is never latched as SSO-succeeded,
404
414
  * so credentials do not keep flowing to it.
@@ -413,46 +423,32 @@ export class MapLayerImageryProvider {
413
423
  else
414
424
  this.logUntrustedOriginUse(response.url); // no-op when the restriction is enabled
415
425
  }
416
- /** @internal */
417
- async makeRequest(url, timeoutMs, authorization) {
418
- let response;
419
- let headers;
420
- let hasCreds = false;
421
- // Whether this request had basic-auth credentials of its own to offer. Requests carrying a caller-supplied
422
- // `authorization` are excluded: those bypass the origin policy entirely.
423
- const hasSettingsCreds = !authorization && !!this._settings.userName && !!this._settings.password;
424
- if (authorization) {
425
- headers = new Headers();
426
- headers.set("Authorization", authorization);
427
- }
428
- else if (hasSettingsCreds) {
429
- if (this.isCredentialsSharingAllowed(url)) {
430
- hasCreds = true;
431
- headers = new Headers();
432
- this.setRequestAuthorization(headers);
433
- if (!this.matchesSettingsUrlOrigin(url))
434
- this.logUntrustedOriginUse(url);
435
- }
436
- }
437
- const includeCredentials = this.includeUserCredentials(url);
426
+ /** The default send for [[makeRequest]]: legacy redirect policy, NTLM/SSO handling and origin-trust
427
+ * checks for one request. The SSO retry never applies to sends a fetch handler modified.
428
+ */
429
+ async sendDefaultRequest(request, credentialed, hasCreds, hasSettingsCreds, timeoutMs) {
430
+ const requestUrl = request.url;
431
+ const includeCredentials = this.includeUserCredentials(requestUrl);
438
432
  const opts = {
439
433
  method: "GET",
440
- headers,
434
+ headers: request.headers,
441
435
  credentials: includeCredentials ? "include" : undefined,
442
- redirect: includeCredentials ? this.credentialedRedirect : undefined,
436
+ // Sends the handler modified may carry injected secrets: same redirect policy as credentialed ones.
437
+ redirect: (includeCredentials || credentialed) ? credentialedFetchRedirect() : undefined,
443
438
  };
444
439
  if (timeoutMs !== undefined)
445
440
  setRequestTimeout(opts, timeoutMs);
446
- response = await fetch(url, opts);
447
- if (includeCredentials)
448
- this.checkCredentialedRedirect(url, response);
441
+ let rsp = await fetch(requestUrl, opts);
442
+ if (includeCredentials || credentialed)
443
+ this.checkCredentialedRedirect(requestUrl, rsp);
449
444
  // fetch follows redirects transparently, so all trust decisions below target the final
450
445
  // (post-redirect) URL reported by the response, not the URL we asked for.
451
- const challengedUrl = response.url || url;
452
- if (response.status === 401
453
- && headersIncludeAuthMethod(response.headers, ["ntlm", "negotiate"])
446
+ const challengedUrl = rsp.url || requestUrl;
447
+ if (rsp.status === 401
448
+ && headersIncludeAuthMethod(rsp.headers, ["ntlm", "negotiate"])
454
449
  && !includeCredentials
455
- && !hasCreds) {
450
+ && !hasCreds
451
+ && !credentialed) {
456
452
  if (this.isSsoAllowed(challengedUrl)) {
457
453
  // Removed the previous headers and make sure "include" credentials is set
458
454
  opts.headers = undefined;
@@ -462,8 +458,8 @@ export class MapLayerImageryProvider {
462
458
  opts.redirect = IModelApp.mapLayerFormatRegistry.restrictCredentialsToTrustedOrigins ? "error" : undefined;
463
459
  this.logUntrustedOriginUse(challengedUrl);
464
460
  // We got a http 401 challenge, lets try again with SSO enabled (i.e. Windows Authentication)
465
- response = await fetch(challengedUrl, opts);
466
- if (response.status === 200) {
461
+ rsp = await fetch(challengedUrl, opts);
462
+ if (rsp.status === 200) {
467
463
  this.recordSsoSucceeded(challengedUrl); // avoid going through 401 challenges over and over for this origin
468
464
  }
469
465
  }
@@ -471,16 +467,69 @@ export class MapLayerImageryProvider {
471
467
  this.reportBlockedOrigin(challengedUrl);
472
468
  }
473
469
  }
474
- else if ((response.status === 401 || response.status === 403) && hasSettingsCreds && !this.isCredentialsSharingAllowed(challengedUrl)) {
470
+ else if ((rsp.status === 401 || rsp.status === 403) && hasSettingsCreds && !credentialed && !this.isCredentialsSharingAllowed(challengedUrl)) {
475
471
  // Some servers answer an unauthenticated request with 403 (Forbidden) rather than a 401 challenge;
476
472
  // since this request could not present its credentials to the challenging origin, either status most
477
- // likely results from that. The permission is recomputed for the challenged URL rather than reusing the
473
+ // likely results from that (never on a send the handler modified: the handler classifies those).
474
+ // The permission is recomputed for the challenged URL rather than reusing the
478
475
  // decision made for the requested one: `fetch` strips the Authorization header when it follows a
479
476
  // cross-origin redirect, so a trusted request can still arrive unauthenticated at an untrusted origin,
480
477
  // and conversely a request that started out untrusted may end up at an origin that is trusted.
481
478
  this.reportBlockedOrigin(challengedUrl);
482
479
  }
483
- return response;
480
+ return rsp;
481
+ }
482
+ /** @internal */
483
+ async makeRequest(url, timeoutMs, authorization) {
484
+ let headers;
485
+ let hasCreds = false;
486
+ // Whether this request had basic-auth credentials of its own to offer. Requests carrying a caller-supplied
487
+ // `authorization` are excluded: those bypass the origin policy entirely.
488
+ const hasSettingsCreds = !authorization && !!this._settings.userName && !!this._settings.password;
489
+ if (authorization) {
490
+ headers = new Headers();
491
+ headers.set("Authorization", authorization);
492
+ }
493
+ else if (hasSettingsCreds) {
494
+ if (this.isCredentialsSharingAllowed(url)) {
495
+ hasCreds = true;
496
+ headers = new Headers();
497
+ this.setRequestAuthorization(headers);
498
+ if (!this.matchesSettingsUrlOrigin(url))
499
+ this.logUntrustedOriginUse(url);
500
+ }
501
+ }
502
+ // Route the request through the registered fetch handler (if any), which has full control: it may
503
+ // send a copy with other query parameters and headers, retry, or short-circuit. Handler failures propagate: the
504
+ // request must never silently degrade to an unauthenticated one.
505
+ try {
506
+ const { response, managedByHandler } = await fetchMapLayerRequest({
507
+ url,
508
+ formatId: this._settings.formatId,
509
+ layerUrl: this._settings.url,
510
+ layerProperties: this._settings.properties,
511
+ headers,
512
+ send: async (request, credentialed) => this.sendDefaultRequest(request, credentialed, hasCreds, hasSettingsCreds, timeoutMs),
513
+ });
514
+ if (managedByHandler)
515
+ this._handlerManagedResponses.add(response);
516
+ return response;
517
+ }
518
+ catch (error) {
519
+ if (error instanceof MapLayerAuthenticationFailedError)
520
+ this.reportAuthenticationFailure();
521
+ throw error;
522
+ }
523
+ }
524
+ /** Responses of [[makeRequest]] managed by a fetch handler (see [[MapLayerFetchResult.managedByHandler]]). */
525
+ _handlerManagedResponses = new WeakSet();
526
+ /** Returns true if a fetch handler returned this [[makeRequest]] response as its own, in which case the
527
+ * provider applies none of its default response handling (status-code or protocol-error classification):
528
+ * the handler reports authentication failures by throwing [[MapLayerAuthenticationFailedError]] instead.
529
+ * @internal
530
+ */
531
+ isManagedByHandler(response) {
532
+ return this._handlerManagedResponses.has(response);
484
533
  }
485
534
  /** Returns a map layer tile at the specified settings. */
486
535
  async loadTile(row, column, zoomLevel) {
@@ -515,16 +564,39 @@ export class MapLayerImageryProvider {
515
564
  headers = new Headers();
516
565
  this.setRequestAuthorization(headers);
517
566
  }
567
+ let response;
518
568
  try {
519
- const includeCredentials = this.includeUserCredentials(url);
520
- const response = await fetch(url, {
521
- method: "GET",
569
+ ({ response } = await fetchMapLayerRequest({
570
+ url,
571
+ formatId: this._settings.formatId,
572
+ layerUrl: this._settings.url,
573
+ layerProperties: this._settings.properties,
522
574
  headers,
523
- credentials: includeCredentials ? "include" : undefined,
524
- redirect: includeCredentials ? this.credentialedRedirect : undefined,
525
- });
526
- if (includeCredentials)
527
- this.checkCredentialedRedirect(url, response);
575
+ send: async (request, credentialed) => {
576
+ const requestUrl = request.url;
577
+ const includeCredentials = this.includeUserCredentials(requestUrl);
578
+ const rsp = await fetch(requestUrl, {
579
+ method: "GET",
580
+ headers: request.headers,
581
+ credentials: includeCredentials ? "include" : undefined,
582
+ redirect: (includeCredentials || credentialed) ? credentialedFetchRedirect() : undefined,
583
+ });
584
+ if (includeCredentials || credentialed)
585
+ this.checkCredentialedRedirect(requestUrl, rsp);
586
+ return rsp;
587
+ },
588
+ }));
589
+ }
590
+ catch (error) {
591
+ // Never degrade to an unauthenticated request or reject (getToolTip callers do not catch); skip the tooltip.
592
+ // The status transition the handler asked for still applies.
593
+ if (error instanceof MapLayerAuthenticationFailedError)
594
+ this.reportAuthenticationFailure();
595
+ if (this.hasFetchHandler)
596
+ Logger.logWarning(loggerCategory, `Map-layer fetch handler failed for tooltip request: ${BentleyError.getErrorMessage(error)}`);
597
+ return;
598
+ }
599
+ try {
528
600
  let text = await response.text();
529
601
  if (text) {
530
602
  // Tooltip content (e.g. WMS GetFeatureInfo responses) is rendered as HTML downstream and may
@@ -646,11 +718,7 @@ export class MapLayerImageryProvider {
646
718
  * @internal
647
719
  */
648
720
  appendCustomParams(url) {
649
- if (!this._settings.savedQueryParams && !this._settings.unsavedQueryParams)
650
- return url;
651
- let tmpUrl = appendQueryParams(url, this._settings.savedQueryParams);
652
- tmpUrl = appendQueryParams(tmpUrl, this._settings.unsavedQueryParams);
653
- return tmpUrl;
721
+ return appendQueryParams(url, this._settings.collectQueryParams());
654
722
  }
655
723
  }
656
724
  //# sourceMappingURL=MapLayerImageryProvider.js.map