@itwin/core-backend 5.12.0-dev.1 → 5.12.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 (566) hide show
  1. package/CHANGELOG.md +33 -1
  2. package/lib/cjs/BackendHubAccess.d.ts +1 -1
  3. package/lib/cjs/BackendHubAccess.js +1 -1
  4. package/lib/cjs/BackendHubAccess.js.map +1 -1
  5. package/lib/cjs/BackendLoggerCategory.js.map +1 -1
  6. package/lib/cjs/BisCoreSchema.js.map +1 -1
  7. package/lib/cjs/BlobContainerService.js.map +1 -1
  8. package/lib/cjs/BriefcaseManager.js.map +1 -1
  9. package/lib/cjs/CatalogDb.js.map +1 -1
  10. package/lib/cjs/Category.js.map +1 -1
  11. package/lib/cjs/ChangeSummaryManager.d.ts.map +1 -1
  12. package/lib/cjs/ChangeSummaryManager.js +34 -38
  13. package/lib/cjs/ChangeSummaryManager.js.map +1 -1
  14. package/lib/cjs/ChangedElementsDb.js.map +1 -1
  15. package/lib/cjs/ChangesetECAdaptor.d.ts.map +1 -1
  16. package/lib/cjs/ChangesetECAdaptor.js +252 -255
  17. package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
  18. package/lib/cjs/ChangesetReader.d.ts +65 -23
  19. package/lib/cjs/ChangesetReader.d.ts.map +1 -1
  20. package/lib/cjs/ChangesetReader.js +165 -105
  21. package/lib/cjs/ChangesetReader.js.map +1 -1
  22. package/lib/cjs/ChangesetReaderTypes.js.map +1 -1
  23. package/lib/cjs/ChannelControl.js.map +1 -1
  24. package/lib/cjs/CheckpointManager.js.map +1 -1
  25. package/lib/cjs/ClassRegistry.d.ts +1 -1
  26. package/lib/cjs/ClassRegistry.js +6 -6
  27. package/lib/cjs/ClassRegistry.js.map +1 -1
  28. package/lib/cjs/CloudSqlite.js.map +1 -1
  29. package/lib/cjs/CodeService.js.map +1 -1
  30. package/lib/cjs/CodeSpecs.js.map +1 -1
  31. package/lib/cjs/ConcurrentQuery.js.map +1 -1
  32. package/lib/cjs/CustomViewState3dCreator.js.map +1 -1
  33. package/lib/cjs/DevTools.js.map +1 -1
  34. package/lib/cjs/DisplayStyle.js.map +1 -1
  35. package/lib/cjs/ECDb.d.ts +4 -4
  36. package/lib/cjs/ECDb.d.ts.map +1 -1
  37. package/lib/cjs/ECDb.js +6 -6
  38. package/lib/cjs/ECDb.js.map +1 -1
  39. package/lib/cjs/ECSchemaXmlContext.js.map +1 -1
  40. package/lib/cjs/ECSqlRowExecutor.js.map +1 -1
  41. package/lib/cjs/ECSqlStatement.d.ts +6 -6
  42. package/lib/cjs/ECSqlStatement.d.ts.map +1 -1
  43. package/lib/cjs/ECSqlStatement.js +4 -4
  44. package/lib/cjs/ECSqlStatement.js.map +1 -1
  45. package/lib/cjs/ECSqlSyncReader.js.map +1 -1
  46. package/lib/cjs/EditTxn.js.map +1 -1
  47. package/lib/cjs/Element.d.ts +1 -1
  48. package/lib/cjs/Element.js +1 -1
  49. package/lib/cjs/Element.js.map +1 -1
  50. package/lib/cjs/ElementAspect.d.ts +1 -1
  51. package/lib/cjs/ElementAspect.d.ts.map +1 -1
  52. package/lib/cjs/ElementAspect.js +7 -11
  53. package/lib/cjs/ElementAspect.js.map +1 -1
  54. package/lib/cjs/ElementGraphics.js.map +1 -1
  55. package/lib/cjs/ElementTreeWalker.d.ts.map +1 -1
  56. package/lib/cjs/ElementTreeWalker.js +16 -24
  57. package/lib/cjs/ElementTreeWalker.js.map +1 -1
  58. package/lib/cjs/Entity.d.ts +1 -1
  59. package/lib/cjs/Entity.js +1 -1
  60. package/lib/cjs/Entity.js.map +1 -1
  61. package/lib/cjs/EntityReferences.js.map +1 -1
  62. package/lib/cjs/ExportGraphics.js.map +1 -1
  63. package/lib/cjs/ExternalSource.js.map +1 -1
  64. package/lib/cjs/FontFile.js.map +1 -1
  65. package/lib/cjs/GeoCoordConfig.js.map +1 -1
  66. package/lib/cjs/GeographicCRSServices.js.map +1 -1
  67. package/lib/cjs/GeometrySummary.js +47 -47
  68. package/lib/cjs/GeometrySummary.js.map +1 -1
  69. package/lib/cjs/IModelDb.d.ts +14 -14
  70. package/lib/cjs/IModelDb.d.ts.map +1 -1
  71. package/lib/cjs/IModelDb.js +89 -103
  72. package/lib/cjs/IModelDb.js.map +1 -1
  73. package/lib/cjs/IModelDbFonts.js.map +1 -1
  74. package/lib/cjs/IModelElementCloneContext.d.ts +1 -1
  75. package/lib/cjs/IModelElementCloneContext.d.ts.map +1 -1
  76. package/lib/cjs/IModelElementCloneContext.js +1 -1
  77. package/lib/cjs/IModelElementCloneContext.js.map +1 -1
  78. package/lib/cjs/IModelHost.d.ts +2 -2
  79. package/lib/cjs/IModelHost.js +2 -2
  80. package/lib/cjs/IModelHost.js.map +1 -1
  81. package/lib/cjs/IModelIncrementalSchemaLocater.js.map +1 -1
  82. package/lib/cjs/IModelJsFs.js.map +1 -1
  83. package/lib/cjs/ImageSourceConversion.js.map +1 -1
  84. package/lib/cjs/IpcHost.js.map +1 -1
  85. package/lib/cjs/LineStyle.js.map +1 -1
  86. package/lib/cjs/LocalHub.js +1 -1
  87. package/lib/cjs/LocalHub.js.map +1 -1
  88. package/lib/cjs/LocalhostIpcHost.js.map +1 -1
  89. package/lib/cjs/LockControl.js.map +1 -1
  90. package/lib/cjs/Material.js.map +1 -1
  91. package/lib/cjs/Model.js.map +1 -1
  92. package/lib/cjs/NativeAppStorage.js.map +1 -1
  93. package/lib/cjs/NativeHost.js.map +1 -1
  94. package/lib/cjs/NavigationRelationship.js.map +1 -1
  95. package/lib/cjs/PartialChangeUnifier.js +7 -7
  96. package/lib/cjs/PartialChangeUnifier.js.map +1 -1
  97. package/lib/cjs/PromiseMemoizer.js.map +1 -1
  98. package/lib/cjs/PropertyStore.js.map +1 -1
  99. package/lib/cjs/Relationship.d.ts.map +1 -1
  100. package/lib/cjs/Relationship.js +15 -12
  101. package/lib/cjs/Relationship.js.map +1 -1
  102. package/lib/cjs/RpcBackend.js.map +1 -1
  103. package/lib/cjs/SQLiteDb.d.ts +1 -1
  104. package/lib/cjs/SQLiteDb.js +1 -1
  105. package/lib/cjs/SQLiteDb.js.map +1 -1
  106. package/lib/cjs/Schema.js.map +1 -1
  107. package/lib/cjs/SchemaSync.js.map +1 -1
  108. package/lib/cjs/SchemaUtils.js.map +1 -1
  109. package/lib/cjs/SheetIndex.js.map +1 -1
  110. package/lib/cjs/SqliteChangesetReader.js.map +1 -1
  111. package/lib/cjs/SqliteStatement.d.ts +1 -1
  112. package/lib/cjs/SqliteStatement.d.ts.map +1 -1
  113. package/lib/cjs/SqliteStatement.js +1 -1
  114. package/lib/cjs/SqliteStatement.js.map +1 -1
  115. package/lib/cjs/StashManager.js.map +1 -1
  116. package/lib/cjs/Texture.js.map +1 -1
  117. package/lib/cjs/TileStorage.js.map +1 -1
  118. package/lib/cjs/TxnManager.js.map +1 -1
  119. package/lib/cjs/ViewDefinition.d.ts.map +1 -1
  120. package/lib/cjs/ViewDefinition.js +8 -12
  121. package/lib/cjs/ViewDefinition.js.map +1 -1
  122. package/lib/cjs/ViewStateHydrator.js.map +1 -1
  123. package/lib/cjs/ViewStore.d.ts.map +1 -1
  124. package/lib/cjs/ViewStore.js +6 -8
  125. package/lib/cjs/ViewStore.js.map +1 -1
  126. package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
  127. package/lib/cjs/annotations/ElementDrivesTextAnnotation.js +8 -11
  128. package/lib/cjs/annotations/ElementDrivesTextAnnotation.js.map +1 -1
  129. package/lib/cjs/annotations/FrameGeometry.js.map +1 -1
  130. package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
  131. package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
  132. package/lib/cjs/annotations/TextAnnotationGeometry.js.map +1 -1
  133. package/lib/cjs/annotations/TextBlockGeometry.js.map +1 -1
  134. package/lib/cjs/annotations/TextBlockLayout.js.map +1 -1
  135. package/lib/cjs/assets/IModelChange.02.00.00.ecschema.xml +90 -90
  136. package/lib/cjs/assets/Settings/Schemas/Base.Schema.json +36 -36
  137. package/lib/cjs/assets/Settings/Schemas/Gcs.schema.json +28 -28
  138. package/lib/cjs/assets/Settings/Schemas/Workspace.Schema.json +94 -94
  139. package/lib/cjs/assets/Settings/backend.setting.json5 +21 -21
  140. package/lib/cjs/core-backend.js.map +1 -1
  141. package/lib/cjs/domains/FunctionalElements.js.map +1 -1
  142. package/lib/cjs/domains/FunctionalSchema.js.map +1 -1
  143. package/lib/cjs/domains/GenericElements.js.map +1 -1
  144. package/lib/cjs/domains/GenericSchema.js.map +1 -1
  145. package/lib/cjs/internal/ChangesetConflictArgs.js.map +1 -1
  146. package/lib/cjs/internal/ChannelAdmin.d.ts.map +1 -1
  147. package/lib/cjs/internal/ChannelAdmin.js +6 -10
  148. package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
  149. package/lib/cjs/internal/ECSqlInstanceReshaper.d.ts +23 -0
  150. package/lib/cjs/internal/ECSqlInstanceReshaper.d.ts.map +1 -0
  151. package/lib/cjs/internal/ECSqlInstanceReshaper.js +125 -0
  152. package/lib/cjs/internal/ECSqlInstanceReshaper.js.map +1 -0
  153. package/lib/cjs/internal/ElementLRUCache.js.map +1 -1
  154. package/lib/cjs/internal/FontFileImpl.js.map +1 -1
  155. package/lib/cjs/internal/HubMock.js.map +1 -1
  156. package/lib/cjs/internal/IModelDbFontsImpl.js.map +1 -1
  157. package/lib/cjs/internal/IntegrityCheck.js.map +1 -1
  158. package/lib/cjs/internal/NativePlatform.js.map +1 -1
  159. package/lib/cjs/internal/NoLocks.js.map +1 -1
  160. package/lib/cjs/internal/OnlineStatus.js.map +1 -1
  161. package/lib/cjs/internal/ServerBasedLocks.js +33 -33
  162. package/lib/cjs/internal/ServerBasedLocks.js.map +1 -1
  163. package/lib/cjs/internal/Symbols.js.map +1 -1
  164. package/lib/cjs/internal/annotations/fields.d.ts.map +1 -1
  165. package/lib/cjs/internal/annotations/fields.js +24 -43
  166. package/lib/cjs/internal/annotations/fields.js.map +1 -1
  167. package/lib/cjs/internal/cross-package.js.map +1 -1
  168. package/lib/cjs/internal/workspace/SettingsEditorImpl.js.map +1 -1
  169. package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
  170. package/lib/cjs/internal/workspace/SettingsSchemasImpl.d.ts.map +1 -1
  171. package/lib/cjs/internal/workspace/SettingsSchemasImpl.js +8 -7
  172. package/lib/cjs/internal/workspace/SettingsSchemasImpl.js.map +1 -1
  173. package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
  174. package/lib/cjs/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
  175. package/lib/cjs/rpc/multipart.js.map +1 -1
  176. package/lib/cjs/rpc/tracing.js.map +1 -1
  177. package/lib/cjs/rpc/web/logging.js.map +1 -1
  178. package/lib/cjs/rpc/web/request.js.map +1 -1
  179. package/lib/cjs/rpc/web/response.js.map +1 -1
  180. package/lib/cjs/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  181. package/lib/cjs/rpc-impl/IModelReadRpcImpl.d.ts.map +1 -1
  182. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js +2 -3
  183. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  184. package/lib/cjs/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  185. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.d.ts +2 -2
  186. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  187. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.d.ts +1 -1
  188. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js +1 -1
  189. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  190. package/lib/cjs/workspace/Settings.js.map +1 -1
  191. package/lib/cjs/workspace/SettingsDb.js.map +1 -1
  192. package/lib/cjs/workspace/SettingsEditor.js.map +1 -1
  193. package/lib/cjs/workspace/SettingsSchemas.d.ts +28 -2
  194. package/lib/cjs/workspace/SettingsSchemas.d.ts.map +1 -1
  195. package/lib/cjs/workspace/SettingsSchemas.js.map +1 -1
  196. package/lib/cjs/workspace/Workspace.js.map +1 -1
  197. package/lib/cjs/workspace/WorkspaceEditor.js.map +1 -1
  198. package/lib/esm/BackendHubAccess.d.ts +1 -1
  199. package/lib/esm/BackendHubAccess.js +1 -1
  200. package/lib/esm/BackendHubAccess.js.map +1 -1
  201. package/lib/esm/BackendLoggerCategory.js.map +1 -1
  202. package/lib/esm/BisCoreSchema.js.map +1 -1
  203. package/lib/esm/BlobContainerService.js.map +1 -1
  204. package/lib/esm/BriefcaseManager.js.map +1 -1
  205. package/lib/esm/CatalogDb.js.map +1 -1
  206. package/lib/esm/Category.js.map +1 -1
  207. package/lib/esm/ChangeSummaryManager.d.ts.map +1 -1
  208. package/lib/esm/ChangeSummaryManager.js +35 -39
  209. package/lib/esm/ChangeSummaryManager.js.map +1 -1
  210. package/lib/esm/ChangedElementsDb.js.map +1 -1
  211. package/lib/esm/ChangesetECAdaptor.d.ts.map +1 -1
  212. package/lib/esm/ChangesetECAdaptor.js +253 -256
  213. package/lib/esm/ChangesetECAdaptor.js.map +1 -1
  214. package/lib/esm/ChangesetReader.d.ts +65 -23
  215. package/lib/esm/ChangesetReader.d.ts.map +1 -1
  216. package/lib/esm/ChangesetReader.js +166 -106
  217. package/lib/esm/ChangesetReader.js.map +1 -1
  218. package/lib/esm/ChangesetReaderTypes.js.map +1 -1
  219. package/lib/esm/ChannelControl.js.map +1 -1
  220. package/lib/esm/CheckpointManager.js.map +1 -1
  221. package/lib/esm/ClassRegistry.d.ts +1 -1
  222. package/lib/esm/ClassRegistry.js +6 -6
  223. package/lib/esm/ClassRegistry.js.map +1 -1
  224. package/lib/esm/CloudSqlite.js.map +1 -1
  225. package/lib/esm/CodeService.js.map +1 -1
  226. package/lib/esm/CodeSpecs.js.map +1 -1
  227. package/lib/esm/ConcurrentQuery.js.map +1 -1
  228. package/lib/esm/CustomViewState3dCreator.js.map +1 -1
  229. package/lib/esm/DevTools.js.map +1 -1
  230. package/lib/esm/DisplayStyle.js.map +1 -1
  231. package/lib/esm/ECDb.d.ts +4 -4
  232. package/lib/esm/ECDb.d.ts.map +1 -1
  233. package/lib/esm/ECDb.js +6 -6
  234. package/lib/esm/ECDb.js.map +1 -1
  235. package/lib/esm/ECSchemaXmlContext.js.map +1 -1
  236. package/lib/esm/ECSqlRowExecutor.js.map +1 -1
  237. package/lib/esm/ECSqlStatement.d.ts +6 -6
  238. package/lib/esm/ECSqlStatement.d.ts.map +1 -1
  239. package/lib/esm/ECSqlStatement.js +4 -4
  240. package/lib/esm/ECSqlStatement.js.map +1 -1
  241. package/lib/esm/ECSqlSyncReader.js.map +1 -1
  242. package/lib/esm/EditTxn.js.map +1 -1
  243. package/lib/esm/Element.d.ts +1 -1
  244. package/lib/esm/Element.js +1 -1
  245. package/lib/esm/Element.js.map +1 -1
  246. package/lib/esm/ElementAspect.d.ts +1 -1
  247. package/lib/esm/ElementAspect.d.ts.map +1 -1
  248. package/lib/esm/ElementAspect.js +9 -13
  249. package/lib/esm/ElementAspect.js.map +1 -1
  250. package/lib/esm/ElementGraphics.js.map +1 -1
  251. package/lib/esm/ElementTreeWalker.d.ts.map +1 -1
  252. package/lib/esm/ElementTreeWalker.js +18 -26
  253. package/lib/esm/ElementTreeWalker.js.map +1 -1
  254. package/lib/esm/Entity.d.ts +1 -1
  255. package/lib/esm/Entity.js +1 -1
  256. package/lib/esm/Entity.js.map +1 -1
  257. package/lib/esm/EntityReferences.js.map +1 -1
  258. package/lib/esm/ExportGraphics.js.map +1 -1
  259. package/lib/esm/ExternalSource.js.map +1 -1
  260. package/lib/esm/FontFile.js.map +1 -1
  261. package/lib/esm/GeoCoordConfig.js.map +1 -1
  262. package/lib/esm/GeographicCRSServices.js.map +1 -1
  263. package/lib/esm/GeometrySummary.js +47 -47
  264. package/lib/esm/GeometrySummary.js.map +1 -1
  265. package/lib/esm/IModelDb.d.ts +14 -14
  266. package/lib/esm/IModelDb.d.ts.map +1 -1
  267. package/lib/esm/IModelDb.js +90 -104
  268. package/lib/esm/IModelDb.js.map +1 -1
  269. package/lib/esm/IModelDbFonts.js.map +1 -1
  270. package/lib/esm/IModelElementCloneContext.d.ts +1 -1
  271. package/lib/esm/IModelElementCloneContext.d.ts.map +1 -1
  272. package/lib/esm/IModelElementCloneContext.js +1 -1
  273. package/lib/esm/IModelElementCloneContext.js.map +1 -1
  274. package/lib/esm/IModelHost.d.ts +2 -2
  275. package/lib/esm/IModelHost.js +2 -2
  276. package/lib/esm/IModelHost.js.map +1 -1
  277. package/lib/esm/IModelIncrementalSchemaLocater.js.map +1 -1
  278. package/lib/esm/IModelJsFs.js.map +1 -1
  279. package/lib/esm/ImageSourceConversion.js.map +1 -1
  280. package/lib/esm/IpcHost.js.map +1 -1
  281. package/lib/esm/LineStyle.js.map +1 -1
  282. package/lib/esm/LocalHub.js +1 -1
  283. package/lib/esm/LocalHub.js.map +1 -1
  284. package/lib/esm/LocalhostIpcHost.js.map +1 -1
  285. package/lib/esm/LockControl.js.map +1 -1
  286. package/lib/esm/Material.js.map +1 -1
  287. package/lib/esm/Model.js.map +1 -1
  288. package/lib/esm/NativeAppStorage.js.map +1 -1
  289. package/lib/esm/NativeHost.js.map +1 -1
  290. package/lib/esm/NavigationRelationship.js.map +1 -1
  291. package/lib/esm/PartialChangeUnifier.js +7 -7
  292. package/lib/esm/PartialChangeUnifier.js.map +1 -1
  293. package/lib/esm/PromiseMemoizer.js.map +1 -1
  294. package/lib/esm/PropertyStore.js.map +1 -1
  295. package/lib/esm/Relationship.d.ts.map +1 -1
  296. package/lib/esm/Relationship.js +16 -13
  297. package/lib/esm/Relationship.js.map +1 -1
  298. package/lib/esm/RpcBackend.js.map +1 -1
  299. package/lib/esm/SQLiteDb.d.ts +1 -1
  300. package/lib/esm/SQLiteDb.js +1 -1
  301. package/lib/esm/SQLiteDb.js.map +1 -1
  302. package/lib/esm/Schema.js.map +1 -1
  303. package/lib/esm/SchemaSync.js.map +1 -1
  304. package/lib/esm/SchemaUtils.js.map +1 -1
  305. package/lib/esm/SheetIndex.js.map +1 -1
  306. package/lib/esm/SqliteChangesetReader.js.map +1 -1
  307. package/lib/esm/SqliteStatement.d.ts +1 -1
  308. package/lib/esm/SqliteStatement.d.ts.map +1 -1
  309. package/lib/esm/SqliteStatement.js +1 -1
  310. package/lib/esm/SqliteStatement.js.map +1 -1
  311. package/lib/esm/StashManager.js.map +1 -1
  312. package/lib/esm/Texture.js.map +1 -1
  313. package/lib/esm/TileStorage.js.map +1 -1
  314. package/lib/esm/TxnManager.js.map +1 -1
  315. package/lib/esm/ViewDefinition.d.ts.map +1 -1
  316. package/lib/esm/ViewDefinition.js +10 -14
  317. package/lib/esm/ViewDefinition.js.map +1 -1
  318. package/lib/esm/ViewStateHydrator.js.map +1 -1
  319. package/lib/esm/ViewStore.d.ts.map +1 -1
  320. package/lib/esm/ViewStore.js +7 -9
  321. package/lib/esm/ViewStore.js.map +1 -1
  322. package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
  323. package/lib/esm/annotations/ElementDrivesTextAnnotation.js +10 -13
  324. package/lib/esm/annotations/ElementDrivesTextAnnotation.js.map +1 -1
  325. package/lib/esm/annotations/FrameGeometry.js.map +1 -1
  326. package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
  327. package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
  328. package/lib/esm/annotations/TextAnnotationGeometry.js.map +1 -1
  329. package/lib/esm/annotations/TextBlockGeometry.js.map +1 -1
  330. package/lib/esm/annotations/TextBlockLayout.js.map +1 -1
  331. package/lib/esm/core-backend.js.map +1 -1
  332. package/lib/esm/domains/FunctionalElements.js.map +1 -1
  333. package/lib/esm/domains/FunctionalSchema.js.map +1 -1
  334. package/lib/esm/domains/GenericElements.js.map +1 -1
  335. package/lib/esm/domains/GenericSchema.js.map +1 -1
  336. package/lib/esm/internal/ChangesetConflictArgs.js.map +1 -1
  337. package/lib/esm/internal/ChannelAdmin.d.ts.map +1 -1
  338. package/lib/esm/internal/ChannelAdmin.js +7 -11
  339. package/lib/esm/internal/ChannelAdmin.js.map +1 -1
  340. package/lib/esm/internal/ECSqlInstanceReshaper.d.ts +23 -0
  341. package/lib/esm/internal/ECSqlInstanceReshaper.d.ts.map +1 -0
  342. package/lib/esm/internal/ECSqlInstanceReshaper.js +120 -0
  343. package/lib/esm/internal/ECSqlInstanceReshaper.js.map +1 -0
  344. package/lib/esm/internal/ElementLRUCache.js.map +1 -1
  345. package/lib/esm/internal/FontFileImpl.js.map +1 -1
  346. package/lib/esm/internal/HubMock.js.map +1 -1
  347. package/lib/esm/internal/IModelDbFontsImpl.js.map +1 -1
  348. package/lib/esm/internal/IntegrityCheck.js.map +1 -1
  349. package/lib/esm/internal/NativePlatform.js.map +1 -1
  350. package/lib/esm/internal/NoLocks.js.map +1 -1
  351. package/lib/esm/internal/OnlineStatus.js.map +1 -1
  352. package/lib/esm/internal/ServerBasedLocks.js +33 -33
  353. package/lib/esm/internal/ServerBasedLocks.js.map +1 -1
  354. package/lib/esm/internal/Symbols.js.map +1 -1
  355. package/lib/esm/internal/annotations/fields.d.ts.map +1 -1
  356. package/lib/esm/internal/annotations/fields.js +26 -45
  357. package/lib/esm/internal/annotations/fields.js.map +1 -1
  358. package/lib/esm/internal/cross-package.js.map +1 -1
  359. package/lib/esm/internal/workspace/SettingsEditorImpl.js.map +1 -1
  360. package/lib/esm/internal/workspace/SettingsImpl.js.map +1 -1
  361. package/lib/esm/internal/workspace/SettingsSchemasImpl.d.ts.map +1 -1
  362. package/lib/esm/internal/workspace/SettingsSchemasImpl.js +8 -7
  363. package/lib/esm/internal/workspace/SettingsSchemasImpl.js.map +1 -1
  364. package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
  365. package/lib/esm/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
  366. package/lib/esm/rpc/multipart.js.map +1 -1
  367. package/lib/esm/rpc/tracing.js.map +1 -1
  368. package/lib/esm/rpc/web/logging.js.map +1 -1
  369. package/lib/esm/rpc/web/request.js.map +1 -1
  370. package/lib/esm/rpc/web/response.js.map +1 -1
  371. package/lib/esm/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  372. package/lib/esm/rpc-impl/IModelReadRpcImpl.d.ts.map +1 -1
  373. package/lib/esm/rpc-impl/IModelReadRpcImpl.js +2 -3
  374. package/lib/esm/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  375. package/lib/esm/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  376. package/lib/esm/rpc-impl/RpcBriefcaseUtility.d.ts +2 -2
  377. package/lib/esm/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  378. package/lib/esm/rpc-impl/SnapshotIModelRpcImpl.d.ts +1 -1
  379. package/lib/esm/rpc-impl/SnapshotIModelRpcImpl.js +1 -1
  380. package/lib/esm/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  381. package/lib/esm/test/AdvancedEqual.js.map +1 -1
  382. package/lib/esm/test/AnnotationTestUtils.js.map +1 -1
  383. package/lib/esm/test/AttachDb.test.js +11 -11
  384. package/lib/esm/test/AttachDb.test.js.map +1 -1
  385. package/lib/esm/test/ElementDrivesElement.test.js +23 -23
  386. package/lib/esm/test/ElementDrivesElement.test.js.map +1 -1
  387. package/lib/esm/test/ElementLRUCache.test.js.map +1 -1
  388. package/lib/esm/test/GeometryTestUtil.js.map +1 -1
  389. package/lib/esm/test/IModelHost.test.js.map +1 -1
  390. package/lib/esm/test/IModelTestUtils.js.map +1 -1
  391. package/lib/esm/test/ImageSourceConversion.test.js.map +1 -1
  392. package/lib/esm/test/IpcHost.test.js.map +1 -1
  393. package/lib/esm/test/KnownTestLocations.js.map +1 -1
  394. package/lib/esm/test/PrintElementTree.js.map +1 -1
  395. package/lib/esm/test/PropertyDb.test.js.map +1 -1
  396. package/lib/esm/test/RevisionUtility.js.map +1 -1
  397. package/lib/esm/test/SchemaChangesetCanBeReversed.test.js +51 -51
  398. package/lib/esm/test/SchemaChangesetCanBeReversed.test.js.map +1 -1
  399. package/lib/esm/test/SchemaUtils.test.js +25 -25
  400. package/lib/esm/test/SchemaUtils.test.js.map +1 -1
  401. package/lib/esm/test/SequentialLogMatcher.js.map +1 -1
  402. package/lib/esm/test/SquashSchemaAndDataChanges.test.js +129 -129
  403. package/lib/esm/test/SquashSchemaAndDataChanges.test.js.map +1 -1
  404. package/lib/esm/test/TestChangeSetUtility.js.map +1 -1
  405. package/lib/esm/test/TestEditTxn.js.map +1 -1
  406. package/lib/esm/test/TestUtils.d.ts +1 -1
  407. package/lib/esm/test/TestUtils.d.ts.map +1 -1
  408. package/lib/esm/test/TestUtils.js +1 -1
  409. package/lib/esm/test/TestUtils.js.map +1 -1
  410. package/lib/esm/test/annotations/Fields.test.js +53 -53
  411. package/lib/esm/test/annotations/Fields.test.js.map +1 -1
  412. package/lib/esm/test/annotations/FrameGeometry.test.js.map +1 -1
  413. package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
  414. package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
  415. package/lib/esm/test/annotations/TextBlock.test.js.map +1 -1
  416. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/old.config.js.map +1 -1
  417. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.js.map +1 -1
  418. package/lib/esm/test/categories/Category.test.js.map +1 -1
  419. package/lib/esm/test/codespec/CodeSpec.test.js.map +1 -1
  420. package/lib/esm/test/ecdb/CTE.test.js +88 -88
  421. package/lib/esm/test/ecdb/CTE.test.js.map +1 -1
  422. package/lib/esm/test/ecdb/ConcurrentQuery.test.js +19 -19
  423. package/lib/esm/test/ecdb/ConcurrentQuery.test.js.map +1 -1
  424. package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js +15 -15
  425. package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js.map +1 -1
  426. package/lib/esm/test/ecdb/ECDb.test.js +72 -72
  427. package/lib/esm/test/ecdb/ECDb.test.js.map +1 -1
  428. package/lib/esm/test/ecdb/ECDbTestHelper.js.map +1 -1
  429. package/lib/esm/test/ecdb/ECSchemaXmlContext.test.js.map +1 -1
  430. package/lib/esm/test/ecdb/ECSqlAst.test.js +65 -65
  431. package/lib/esm/test/ecdb/ECSqlAst.test.js.map +1 -1
  432. package/lib/esm/test/ecdb/ECSqlQuery.test.js +4 -4
  433. package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
  434. package/lib/esm/test/ecdb/ECSqlStatement.test.js +332 -332
  435. package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
  436. package/lib/esm/test/ecdb/ECSqlSyncReader.test.js.map +1 -1
  437. package/lib/esm/test/ecdb/QueryReaders.test.js +31 -31
  438. package/lib/esm/test/ecdb/QueryReaders.test.js.map +1 -1
  439. package/lib/esm/test/ecdb/SqliteStatement.test.js.map +1 -1
  440. package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js.map +1 -1
  441. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js +21 -21
  442. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js.map +1 -1
  443. package/lib/esm/test/ecsql/src/ECSqlTestParser.js.map +1 -1
  444. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
  445. package/lib/esm/test/element/DeleteDefinitionElements.test.js.map +1 -1
  446. package/lib/esm/test/element/ElementAspect.test.js +22 -22
  447. package/lib/esm/test/element/ElementAspect.test.js.map +1 -1
  448. package/lib/esm/test/element/ElementDependencyGraph.test.js.map +1 -1
  449. package/lib/esm/test/element/ElementRoundTrip.test.js +139 -139
  450. package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
  451. package/lib/esm/test/element/ExcludedElements.test.js.map +1 -1
  452. package/lib/esm/test/element/ExternalSource.test.js.map +1 -1
  453. package/lib/esm/test/element/NullStructArray.test.js +13 -13
  454. package/lib/esm/test/element/NullStructArray.test.js.map +1 -1
  455. package/lib/esm/test/element/ProjectInformationRecord.test.js.map +1 -1
  456. package/lib/esm/test/element/SheetInformationAspect.test.js.map +1 -1
  457. package/lib/esm/test/element/UrlLink.test.js.map +1 -1
  458. package/lib/esm/test/font/FontFile.test.js.map +1 -1
  459. package/lib/esm/test/font/IModelDbFonts.test.js.map +1 -1
  460. package/lib/esm/test/hubaccess/ApplyChangeset.test.js +32 -32
  461. package/lib/esm/test/hubaccess/ApplyChangeset.test.js.map +1 -1
  462. package/lib/esm/test/hubaccess/BriefcaseManager.test.js +1 -1
  463. package/lib/esm/test/hubaccess/BriefcaseManager.test.js.map +1 -1
  464. package/lib/esm/test/hubaccess/CheckpointManager.test.js.map +1 -1
  465. package/lib/esm/test/hubaccess/CodeSwap.test.js.map +1 -1
  466. package/lib/esm/test/hubaccess/Rebase.test.js +56 -56
  467. package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -1
  468. package/lib/esm/test/hubaccess/SemanticRebase.test.js +345 -345
  469. package/lib/esm/test/hubaccess/SemanticRebase.test.js.map +1 -1
  470. package/lib/esm/test/imageData.js.map +1 -1
  471. package/lib/esm/test/imodel/Code.test.js.map +1 -1
  472. package/lib/esm/test/imodel/ElementTreeWalker.test.js.map +1 -1
  473. package/lib/esm/test/imodel/GetTextureImage.test.js.map +1 -1
  474. package/lib/esm/test/imodel/IModel.test.js +53 -47
  475. package/lib/esm/test/imodel/IModel.test.js.map +1 -1
  476. package/lib/esm/test/imodel/ProjectExtents.test.js.map +1 -1
  477. package/lib/esm/test/imodel/SchemaXmlImport.test.js +21 -21
  478. package/lib/esm/test/imodel/SchemaXmlImport.test.js.map +1 -1
  479. package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js.map +1 -1
  480. package/lib/esm/test/incrementalSchemaLocater/IncrementalLoading.test.js.map +1 -1
  481. package/lib/esm/test/incrementalSchemaLocater/TestContext.js.map +1 -1
  482. package/lib/esm/test/index.js.map +1 -1
  483. package/lib/esm/test/internal/ECSqlInstanceReshaper.test.d.ts +2 -0
  484. package/lib/esm/test/internal/ECSqlInstanceReshaper.test.d.ts.map +1 -0
  485. package/lib/esm/test/internal/ECSqlInstanceReshaper.test.js +289 -0
  486. package/lib/esm/test/internal/ECSqlInstanceReshaper.test.js.map +1 -0
  487. package/lib/esm/test/misc/DevTools.test.js.map +1 -1
  488. package/lib/esm/test/misc/EntitySubClasses.test.js.map +1 -1
  489. package/lib/esm/test/misc/PromiseMemoizer.test.js.map +1 -1
  490. package/lib/esm/test/native/DgnDbWorker.test.js.map +1 -1
  491. package/lib/esm/test/rpc/response.test.js.map +1 -1
  492. package/lib/esm/test/schema/ClassRegistry.test.js +99 -99
  493. package/lib/esm/test/schema/ClassRegistry.test.js.map +1 -1
  494. package/lib/esm/test/schema/FunctionalDomain.test.js.map +1 -1
  495. package/lib/esm/test/schema/GenericDomain.test.js.map +1 -1
  496. package/lib/esm/test/schema/IModelSchemaContext.test.js +9 -9
  497. package/lib/esm/test/schema/IModelSchemaContext.test.js.map +1 -1
  498. package/lib/esm/test/schema/SchemaImportCallbacks.test.js +19 -19
  499. package/lib/esm/test/schema/SchemaImportCallbacks.test.js.map +1 -1
  500. package/lib/esm/test/schema/SchemaViewHidden.test.js +109 -109
  501. package/lib/esm/test/schema/SchemaViewHidden.test.js.map +1 -1
  502. package/lib/esm/test/schema/SchemaViewKoQ.test.js +13 -13
  503. package/lib/esm/test/schema/SchemaViewKoQ.test.js.map +1 -1
  504. package/lib/esm/test/schema/SchemaViewLifecycle.test.js +15 -15
  505. package/lib/esm/test/schema/SchemaViewLifecycle.test.js.map +1 -1
  506. package/lib/esm/test/schema/SchemaViewValidation.test.js +8 -8
  507. package/lib/esm/test/schema/SchemaViewValidation.test.js.map +1 -1
  508. package/lib/esm/test/sheetindex/SheetIndex.test.js.map +1 -1
  509. package/lib/esm/test/standalone/ChangeElementParentModel.test.js.map +1 -1
  510. package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
  511. package/lib/esm/test/standalone/ChangesetReader.test.js +1021 -406
  512. package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
  513. package/lib/esm/test/standalone/CloudSqlite.test.js.map +1 -1
  514. package/lib/esm/test/standalone/CustomViewState3dCreator.test.js.map +1 -1
  515. package/lib/esm/test/standalone/DeleteElements.test.js.map +1 -1
  516. package/lib/esm/test/standalone/DisplayStyle.test.js.map +1 -1
  517. package/lib/esm/test/standalone/Drawing.test.js.map +1 -1
  518. package/lib/esm/test/standalone/EditTxn.test.js.map +1 -1
  519. package/lib/esm/test/standalone/ElementGraphics.test.js.map +1 -1
  520. package/lib/esm/test/standalone/ElementMesh.test.js.map +1 -1
  521. package/lib/esm/test/standalone/ExportGraphics.test.js +14 -14
  522. package/lib/esm/test/standalone/ExportGraphics.test.js.map +1 -1
  523. package/lib/esm/test/standalone/GeometryChangeEvents.test.js.map +1 -1
  524. package/lib/esm/test/standalone/GeometryStream.test.js.map +1 -1
  525. package/lib/esm/test/standalone/HubMock.test.js.map +1 -1
  526. package/lib/esm/test/standalone/IModelLimits.test.js.map +1 -1
  527. package/lib/esm/test/standalone/IModelWrite.test.js +27 -27
  528. package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
  529. package/lib/esm/test/standalone/ITwinWorkspace.test.js.map +1 -1
  530. package/lib/esm/test/standalone/InlineGeometryPartReferences.test.js.map +1 -1
  531. package/lib/esm/test/standalone/IntegrityCheck.test.js.map +1 -1
  532. package/lib/esm/test/standalone/MergeConflict.test.js.map +1 -1
  533. package/lib/esm/test/standalone/NativeAppStorage.test.js.map +1 -1
  534. package/lib/esm/test/standalone/RenderMaterialElement.test.js.map +1 -1
  535. package/lib/esm/test/standalone/RenderTimeline.test.js.map +1 -1
  536. package/lib/esm/test/standalone/SQLiteDb.test.js.map +1 -1
  537. package/lib/esm/test/standalone/SQliteChangesetReaderAndChangesetECAdaptor.test.js +135 -135
  538. package/lib/esm/test/standalone/SQliteChangesetReaderAndChangesetECAdaptor.test.js.map +1 -1
  539. package/lib/esm/test/standalone/SchemaUtils.test.js.map +1 -1
  540. package/lib/esm/test/standalone/SectionDrawing.test.js.map +1 -1
  541. package/lib/esm/test/standalone/ServerBasedLocks.test.js.map +1 -1
  542. package/lib/esm/test/standalone/Setting.test.js.map +1 -1
  543. package/lib/esm/test/standalone/Settings.test.js.map +1 -1
  544. package/lib/esm/test/standalone/SettingsSchemas.test.js +6 -0
  545. package/lib/esm/test/standalone/SettingsSchemas.test.js.map +1 -1
  546. package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
  547. package/lib/esm/test/standalone/StandaloneDb.test.js +20 -20
  548. package/lib/esm/test/standalone/StandaloneDb.test.js.map +1 -1
  549. package/lib/esm/test/standalone/Texture.test.js.map +1 -1
  550. package/lib/esm/test/standalone/TileCache.test.js.map +1 -1
  551. package/lib/esm/test/standalone/TileTree.test.js.map +1 -1
  552. package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
  553. package/lib/esm/test/standalone/ViewDefinition.test.js.map +1 -1
  554. package/lib/esm/test/standalone/ViewStoreDb.test.js.map +1 -1
  555. package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
  556. package/lib/esm/test/standalone/iModelDb.test.js.map +1 -1
  557. package/lib/esm/test/workspace/SettingsDb.test.js.map +1 -1
  558. package/lib/esm/workspace/Settings.js.map +1 -1
  559. package/lib/esm/workspace/SettingsDb.js.map +1 -1
  560. package/lib/esm/workspace/SettingsEditor.js.map +1 -1
  561. package/lib/esm/workspace/SettingsSchemas.d.ts +28 -2
  562. package/lib/esm/workspace/SettingsSchemas.d.ts.map +1 -1
  563. package/lib/esm/workspace/SettingsSchemas.js.map +1 -1
  564. package/lib/esm/workspace/Workspace.js.map +1 -1
  565. package/lib/esm/workspace/WorkspaceEditor.js.map +1 -1
  566. package/package.json +13 -13
@@ -1 +1 @@
1
- {"version":3,"file":"ChannelAdmin.js","sourceRoot":"","sources":["../../../src/internal/ChannelAdmin.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;AA4KH,oDAEC;AA5KD,sDAAyE;AACzE,oDAAsG;AACtG,sDAA6G;AAC7G,wCAAqC;AAErC,8CAA2C;AAC3C,sEAAyE;AAEzE,uCAA+F;AAC/F,iCAAiC;AAEjC,MAAM,YAAY;IAQW;IAPpB,MAAM,CAAU,gBAAgB,GAAG,uBAAuB,CAAC;IAElD,CAAC,mCAAyB,CAAC,GAAG,SAAS,CAAC;IAChD,gBAAgB,GAAG,IAAI,GAAG,EAAc,CAAC;IACzC,cAAc,GAAG,IAAI,GAAG,EAAc,CAAC;IACvC,aAAa,GAAG,IAAI,GAAG,EAA0B,CAAC;IAE1D,YAA2B,OAAiB;QAAjB,YAAO,GAAP,OAAO,CAAU;QAC1C,2GAA2G;QAC3G,IAAI,uBAAU,CAAC,aAAa,EAAE,kBAAkB,KAAK,KAAK;YACxD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,+BAAc,CAAC,iBAAiB,CAAC,CAAC;IAChE,CAAC;IAEM,iBAAiB,CAAC,UAAsB;QAC7C,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACtC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IAEM,oBAAoB,CAAC,UAAsB;QAChD,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACzC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC;IAEM,aAAa,CAAC,SAAqB;QACxC,IAAI,SAAS,KAAK,oBAAM,CAAC,aAAa;YACpC,OAAO,+BAAc,CAAC,iBAAiB,CAAC;QAE1C,IAAI,CAAC;YACH,4DAA4D;YAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,qBAAqB,YAAY,CAAC,gBAAgB,qBAAqB,EAAE,CAAC,IAAI,EAAE,EAAE;gBACnI,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;gBAC1B,OAAO,uBAAQ,CAAC,aAAa,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YAC3F,CAAC,CAAC,CAAC;YAEH,IAAI,OAAO,KAAK,SAAS;gBACvB,OAAO,OAAO,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC;YACP,8HAA8H;YAC9H,+EAA+E;YAC/E,OAAO,+BAAc,CAAC,iBAAiB,CAAC;QAC1C,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,2BAA2B,CAAC,qDAAqD,EAAE,CAAC,IAAI,EAAE,EAAE;YACxH,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YAC1B,IAAI,uBAAQ,CAAC,aAAa,KAAK,IAAI,CAAC,IAAI,EAAE;gBACxC,MAAM,IAAI,yBAAW,CAAC,2BAAY,CAAC,QAAQ,EAAE,wBAAwB,CAAC,CAAC;YACzE,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,sCAAsC;QACzF,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAEM,CAAC,wBAAc,CAAC,CAAC,OAAmB;QACzC,6DAA6D;QAC7D,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,mBAAS,CAAC,CAAC,UAAU,EAAE,KAAK,UAAU;YACzF,OAAO;QAET,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACtD,IAAI,SAAS,KAAK,aAAa;YAC7B,iCAAmB,CAAC,UAAU,CAAC,aAAa,EAAE,WAAW,aAAa,iBAAiB,EAAE,aAAa,CAAC,CAAC;QAE1G,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACvC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACjC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC,wBAAc,CAAC,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAKM,eAAe,CAAC,IAAsE;QAC3F,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,sBAAY,CAAC,CAAC;QACnD,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtD,IAAI,+BAAc,CAAC,iBAAiB,KAAK,UAAU;YACjD,iCAAmB,CAAC,UAAU,CAAC,cAAc,EAAE,WAAW,UAAU,eAAe,EAAE,UAAU,CAAC,CAAC;QAEnG,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,SAAS;YACtD,iCAAmB,CAAC,UAAU,CAAC,aAAa,EAAE,WAAW,IAAI,CAAC,UAAU,qBAAqB,EAAE,UAAU,CAAC,CAAC;QAE7G,MAAM,KAAK,GAA2B;YACpC,aAAa,EAAE,YAAY,CAAC,gBAAgB;YAC5C,OAAO,EAAE;gBACP,EAAE,EAAE,IAAI,CAAC,SAAS;gBAClB,YAAY,EAAE,qDAA4B,CAAC,aAAa;aACzD;YACD,KAAK,EAAE,IAAI,CAAC,UAAU;SACvB,CAAC;QACF,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAKM,oBAAoB,CAAC,IAAwH;QAClJ,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,sBAAY,CAAC,CAAC;QACnD,+DAA+D;QAC/D,gGAAgG;QAChG,8EAA8E;QAC9E,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,SAAS;YACtD,iCAAmB,CAAC,UAAU,CAAC,aAAa,EAAE,WAAW,IAAI,CAAC,UAAU,qBAAqB,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAElH,MAAM,SAAS,GAAG,iBAAO,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,IAAI,oBAAM,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACxH,IAAI,CAAC,eAAe,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QACtE,OAAO,SAAS,CAAC;IACnB,CAAC;IAEM,gBAAgB,CAAC,UAAsB;QAC5C,IAAI,UAAU,KAAK,+BAAc,CAAC,iBAAiB;YACjD,oEAAoE;YACpE,OAAO,oBAAM,CAAC,aAAa,CAAC;QAE9B,IAAI,CAAC;YACH,4DAA4D;YAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,0BAA0B,YAAY,CAAC,gBAAgB,gBAAgB,EAAE,CAAC,IAAI,EAAE,EAAE;gBACvI,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;gBAC/B,OAAO,uBAAQ,CAAC,aAAa,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YACvF,CAAC,CAAC,CAAC;YAEH,OAAO,WAAW,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,8HAA8H;YAC9H,+EAA+E;YAC/E,OAAO,SAAS,CAAC;QACnB,CAAC;IAEH,CAAC;IAEM,KAAK,CAAC,cAAc,CAAC,OAA8B,EAAE,MAAgB,EAAE,IAAU;QACtF,cAAc;QACd,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC;YAChD,iCAAmB,CAAC,UAAU,CAAC,aAAa,EAAE,WAAW,OAAO,CAAC,UAAU,iBAAiB,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QAEpH,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC;YACpD,iCAAmB,CAAC,UAAU,CAAC,aAAa,EAAE,qBAAqB,OAAO,CAAC,UAAU,SAAS,OAAO,CAAC,WAAW,OAAO,OAAO,CAAC,SAAS,iBAAiB,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QAElL,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,UAAU,KAAK,+BAAc,CAAC,iBAAiB;YACvG,iCAAmB,CAAC,UAAU,CAAC,aAAa,EAAE,WAAW,OAAO,CAAC,UAAU,YAAY,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QAE/G,MAAM,OAAO,GAA0B;YACrC,MAAM;YACN,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,IAAI;SACL,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,iCAAmB,CAAC,UAAU,CAAC,KAAK,EAAE,wBAAwB,EAAE,WAAW,OAAO,CAAC,UAAU,oBAAoB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACpI,CAAC;IACH,CAAC;;AAGH,SAAgB,oBAAoB,CAAC,MAAgB;IACnD,OAAO,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC","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 Elements\r\n */\r\n\r\nimport { DbResult, Id64String, IModelStatus } from \"@itwin/core-bentley\";\r\nimport { ChannelControlError, ChannelRootAspectProps, IModel, IModelError } from \"@itwin/core-common\";\r\nimport { ChannelControl, ChannelKey, ChannelUpgradeContext, ChannelUpgradeOptions } from \"../ChannelControl\";\r\nimport { Subject } from \"../Element\";\r\nimport { IModelDb } from \"../IModelDb\";\r\nimport { IModelHost } from \"../IModelHost\";\r\nimport { ElementOwnsChannelRootAspect } from \"../NavigationRelationship\";\r\nimport { EditTxn } from \"../EditTxn\";\r\nimport { _implementationProhibited, _implicitTxn, _nativeDb, _verifyChannel } from \"./Symbols\";\r\nimport * as semver from \"semver\";\r\n\r\nclass ChannelAdmin implements ChannelControl {\r\n public static readonly channelClassName = \"bis:ChannelRootAspect\";\r\n\r\n public readonly [_implementationProhibited] = undefined;\r\n private _allowedChannels = new Set<ChannelKey>();\r\n private _allowedModels = new Set<Id64String>();\r\n private _deniedModels = new Map<Id64String, ChannelKey>();\r\n\r\n public constructor(private _iModel: IModelDb) {\r\n // for backwards compatibility, allow the shared channel unless explicitly turned off in IModelHostOptions.\r\n if (IModelHost.configuration?.allowSharedChannel !== false)\r\n this._allowedChannels.add(ChannelControl.sharedChannelName);\r\n }\r\n\r\n public addAllowedChannel(channelKey: ChannelKey) {\r\n this._allowedChannels.add(channelKey);\r\n this._deniedModels.clear();\r\n }\r\n\r\n public removeAllowedChannel(channelKey: ChannelKey) {\r\n this._allowedChannels.delete(channelKey);\r\n this._allowedModels.clear();\r\n }\r\n\r\n public getChannelKey(elementId: Id64String): ChannelKey {\r\n if (elementId === IModel.rootSubjectId)\r\n return ChannelControl.sharedChannelName;\r\n\r\n try {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n const channel = this._iModel.withPreparedStatement(`SELECT Owner FROM ${ChannelAdmin.channelClassName} WHERE Element.Id=?`, (stmt) => {\r\n stmt.bindId(1, elementId);\r\n return DbResult.BE_SQLITE_ROW === stmt.step() ? stmt.getValue(0).getString() : undefined;\r\n });\r\n\r\n if (channel !== undefined)\r\n return channel;\r\n } catch {\r\n // Exception happens if the iModel is too old: ChannelRootAspect class not present in the BisCore schema (older than v1.0.10).\r\n // In that case all data in such iModel is assumed to be in the shared channel.\r\n return ChannelControl.sharedChannelName;\r\n }\r\n\r\n const parentId = this._iModel.withPreparedSqliteStatement(\"SELECT ParentId,ModelId FROM bis_Element WHERE id=?\", (stmt) => {\r\n stmt.bindId(1, elementId);\r\n if (DbResult.BE_SQLITE_ROW !== stmt.step())\r\n throw new IModelError(IModelStatus.NotFound, \"Element does not exist\");\r\n return stmt.getValueId(0) ?? stmt.getValueId(1); // if parent is undefined, use modelId\r\n });\r\n\r\n return this.getChannelKey(parentId);\r\n }\r\n\r\n public [_verifyChannel](modelId: Id64String): void {\r\n // Note: indirect changes are permitted to change any channel\r\n if (this._allowedModels.has(modelId) || this._iModel[_nativeDb].getTxnMode() === \"indirect\")\r\n return;\r\n\r\n const deniedChannel = this._deniedModels.get(modelId);\r\n if (undefined !== deniedChannel)\r\n ChannelControlError.throwError(\"not-allowed\", `Channel ${deniedChannel} is not allowed`, deniedChannel);\r\n\r\n const channel = this.getChannelKey(modelId);\r\n if (this._allowedChannels.has(channel)) {\r\n this._allowedModels.add(modelId);\r\n return;\r\n }\r\n\r\n this._deniedModels.set(modelId, channel);\r\n return this[_verifyChannel](modelId);\r\n }\r\n\r\n public makeChannelRoot(args: { elementId: Id64String, channelKey: ChannelKey, txn: EditTxn }): void;\r\n /** @deprecated in 5.9.0 - will not be removed until after 2027-05-04. Use makeChannelRoot and supply `txn`. */\r\n public makeChannelRoot(args: { elementId: Id64String, channelKey: ChannelKey }): void;\r\n public makeChannelRoot(args: { elementId: Id64String, channelKey: ChannelKey, txn?: EditTxn }): void {\r\n const txn = args.txn ?? this._iModel[_implicitTxn];\r\n const channelKey = this.getChannelKey(args.elementId);\r\n if (ChannelControl.sharedChannelName !== channelKey)\r\n ChannelControlError.throwError(\"may-not-nest\", `Channel ${channelKey} may not nest`, channelKey);\r\n\r\n if (this.queryChannelRoot(args.channelKey) !== undefined)\r\n ChannelControlError.throwError(\"root-exists\", `Channel ${args.channelKey} root already exist`, channelKey);\r\n\r\n const props: ChannelRootAspectProps = {\r\n classFullName: ChannelAdmin.channelClassName,\r\n element: {\r\n id: args.elementId,\r\n relClassName: ElementOwnsChannelRootAspect.classFullName,\r\n },\r\n owner: args.channelKey,\r\n };\r\n txn.insertAspect(props);\r\n }\r\n\r\n public insertChannelSubject(args: { subjectName: string, channelKey: ChannelKey, parentSubjectId?: Id64String, description?: string, txn: EditTxn }): Id64String;\r\n /** @deprecated in 5.9.0 - will not be removed until after 2027-05-04. Use insertChannelSubject and supply `txn`. */\r\n public insertChannelSubject(args: { subjectName: string, channelKey: ChannelKey, parentSubjectId?: Id64String, description?: string }): Id64String;\r\n public insertChannelSubject(args: { subjectName: string, channelKey: ChannelKey, parentSubjectId?: Id64String, description?: string, txn?: EditTxn }): Id64String {\r\n const txn = args.txn ?? this._iModel[_implicitTxn];\r\n // Check if channelKey already exists before inserting Subject.\r\n // makeChannelRoot will check that again, but at that point the new Subject is already inserted.\r\n // Prefer to check twice instead of deleting the Subject in the latter option.\r\n if (this.queryChannelRoot(args.channelKey) !== undefined)\r\n ChannelControlError.throwError(\"root-exists\", `Channel ${args.channelKey} root already exist`, args.channelKey);\r\n\r\n const elementId = Subject.insert(txn, args.parentSubjectId ?? IModel.rootSubjectId, args.subjectName, args.description);\r\n this.makeChannelRoot({ elementId, channelKey: args.channelKey, txn });\r\n return elementId;\r\n }\r\n\r\n public queryChannelRoot(channelKey: ChannelKey): Id64String | undefined {\r\n if (channelKey === ChannelControl.sharedChannelName)\r\n // RootSubject acts as the ChannelRoot element of the shared channel\r\n return IModel.rootSubjectId;\r\n\r\n try {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n const channelRoot = this._iModel.withPreparedStatement(`SELECT Element.Id FROM ${ChannelAdmin.channelClassName} WHERE Owner=?`, (stmt) => {\r\n stmt.bindString(1, channelKey);\r\n return DbResult.BE_SQLITE_ROW === stmt.step() ? stmt.getValue(0).getId() : undefined;\r\n });\r\n\r\n return channelRoot;\r\n } catch {\r\n // Exception happens if the iModel is too old: ChannelRootAspect class not present in the BisCore schema (older than v1.0.10).\r\n // In that case all data in such iModel is assumed to be in the shared channel.\r\n return undefined;\r\n }\r\n\r\n }\r\n\r\n public async upgradeChannel(options: ChannelUpgradeOptions, iModel: IModelDb, data?: any): Promise<void> {\r\n // Validations\r\n if (!this._allowedChannels.has(options.channelKey))\r\n ChannelControlError.throwError(\"not-allowed\", `Channel ${options.channelKey} is not allowed`, options.channelKey);\r\n\r\n if (semver.gte(options.fromVersion, options.toVersion))\r\n ChannelControlError.throwError(\"not-allowed\", `Upgrading channel ${options.channelKey} from ${options.fromVersion} to ${options.toVersion} is not allowed`, options.channelKey);\r\n\r\n if (!this.queryChannelRoot(options.channelKey) && options.channelKey !== ChannelControl.sharedChannelName)\r\n ChannelControlError.throwError(\"not-allowed\", `Channel ${options.channelKey} not found`, options.channelKey);\r\n\r\n const context: ChannelUpgradeContext = {\r\n iModel,\r\n channelKey: options.channelKey,\r\n fromVersion: options.fromVersion,\r\n toVersion: options.toVersion,\r\n data,\r\n };\r\n\r\n try {\r\n await options.callback(context);\r\n } catch (error: any) {\r\n ChannelControlError.throwError(error, \"channel-upgrade-failed\", `Channel ${options.channelKey} upgrade failed: ${error.message}`);\r\n }\r\n }\r\n}\r\n\r\nexport function createChannelControl(iModel: IModelDb): ChannelAdmin {\r\n return new ChannelAdmin(iModel);\r\n}\r\n"]}
1
+ {"version":3,"file":"ChannelAdmin.js","sourceRoot":"","sources":["../../../src/internal/ChannelAdmin.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Elements\n */\n\nimport { DbResult, Id64String, IModelStatus } from \"@itwin/core-bentley\";\nimport { ChannelControlError, ChannelRootAspectProps, IModel, IModelError, QueryBinder } from \"@itwin/core-common\";\nimport { ChannelControl, ChannelKey, ChannelUpgradeContext, ChannelUpgradeOptions } from \"../ChannelControl\";\nimport { Subject } from \"../Element\";\nimport { IModelDb } from \"../IModelDb\";\nimport { IModelHost } from \"../IModelHost\";\nimport { ElementOwnsChannelRootAspect } from \"../NavigationRelationship\";\nimport { EditTxn } from \"../EditTxn\";\nimport { _implementationProhibited, _implicitTxn, _nativeDb, _verifyChannel } from \"./Symbols\";\nimport * as semver from \"semver\";\n\nclass ChannelAdmin implements ChannelControl {\n public static readonly channelClassName = \"bis:ChannelRootAspect\";\n\n public readonly [_implementationProhibited] = undefined;\n private _allowedChannels = new Set<ChannelKey>();\n private _allowedModels = new Set<Id64String>();\n private _deniedModels = new Map<Id64String, ChannelKey>();\n\n public constructor(private _iModel: IModelDb) {\n // for backwards compatibility, allow the shared channel unless explicitly turned off in IModelHostOptions.\n if (IModelHost.configuration?.allowSharedChannel !== false)\n this._allowedChannels.add(ChannelControl.sharedChannelName);\n }\n\n public addAllowedChannel(channelKey: ChannelKey) {\n this._allowedChannels.add(channelKey);\n this._deniedModels.clear();\n }\n\n public removeAllowedChannel(channelKey: ChannelKey) {\n this._allowedChannels.delete(channelKey);\n this._allowedModels.clear();\n }\n\n public getChannelKey(elementId: Id64String): ChannelKey {\n if (elementId === IModel.rootSubjectId)\n return ChannelControl.sharedChannelName;\n\n try {\n const channel = this._iModel.withQueryReader(`SELECT Owner FROM ${ChannelAdmin.channelClassName} WHERE Element.Id=?`, (reader) => {\n return reader.step() ? reader.current[0] : undefined;\n }, new QueryBinder().bindId(1, elementId));\n\n if (channel !== undefined)\n return channel;\n } catch {\n // Exception happens if the iModel is too old: ChannelRootAspect class not present in the BisCore schema (older than v1.0.10).\n // In that case all data in such iModel is assumed to be in the shared channel.\n return ChannelControl.sharedChannelName;\n }\n\n const parentId = this._iModel.withPreparedSqliteStatement(\"SELECT ParentId,ModelId FROM bis_Element WHERE id=?\", (stmt) => {\n stmt.bindId(1, elementId);\n if (DbResult.BE_SQLITE_ROW !== stmt.step())\n throw new IModelError(IModelStatus.NotFound, \"Element does not exist\");\n return stmt.getValueId(0) ?? stmt.getValueId(1); // if parent is undefined, use modelId\n });\n\n return this.getChannelKey(parentId);\n }\n\n public [_verifyChannel](modelId: Id64String): void {\n // Note: indirect changes are permitted to change any channel\n if (this._allowedModels.has(modelId) || this._iModel[_nativeDb].getTxnMode() === \"indirect\")\n return;\n\n const deniedChannel = this._deniedModels.get(modelId);\n if (undefined !== deniedChannel)\n ChannelControlError.throwError(\"not-allowed\", `Channel ${deniedChannel} is not allowed`, deniedChannel);\n\n const channel = this.getChannelKey(modelId);\n if (this._allowedChannels.has(channel)) {\n this._allowedModels.add(modelId);\n return;\n }\n\n this._deniedModels.set(modelId, channel);\n return this[_verifyChannel](modelId);\n }\n\n public makeChannelRoot(args: { elementId: Id64String, channelKey: ChannelKey, txn: EditTxn }): void;\n /** @deprecated in 5.9.0 - will not be removed until after 2027-05-04. Use makeChannelRoot and supply `txn`. */\n public makeChannelRoot(args: { elementId: Id64String, channelKey: ChannelKey }): void;\n public makeChannelRoot(args: { elementId: Id64String, channelKey: ChannelKey, txn?: EditTxn }): void {\n const txn = args.txn ?? this._iModel[_implicitTxn];\n const channelKey = this.getChannelKey(args.elementId);\n if (ChannelControl.sharedChannelName !== channelKey)\n ChannelControlError.throwError(\"may-not-nest\", `Channel ${channelKey} may not nest`, channelKey);\n\n if (this.queryChannelRoot(args.channelKey) !== undefined)\n ChannelControlError.throwError(\"root-exists\", `Channel ${args.channelKey} root already exist`, channelKey);\n\n const props: ChannelRootAspectProps = {\n classFullName: ChannelAdmin.channelClassName,\n element: {\n id: args.elementId,\n relClassName: ElementOwnsChannelRootAspect.classFullName,\n },\n owner: args.channelKey,\n };\n txn.insertAspect(props);\n }\n\n public insertChannelSubject(args: { subjectName: string, channelKey: ChannelKey, parentSubjectId?: Id64String, description?: string, txn: EditTxn }): Id64String;\n /** @deprecated in 5.9.0 - will not be removed until after 2027-05-04. Use insertChannelSubject and supply `txn`. */\n public insertChannelSubject(args: { subjectName: string, channelKey: ChannelKey, parentSubjectId?: Id64String, description?: string }): Id64String;\n public insertChannelSubject(args: { subjectName: string, channelKey: ChannelKey, parentSubjectId?: Id64String, description?: string, txn?: EditTxn }): Id64String {\n const txn = args.txn ?? this._iModel[_implicitTxn];\n // Check if channelKey already exists before inserting Subject.\n // makeChannelRoot will check that again, but at that point the new Subject is already inserted.\n // Prefer to check twice instead of deleting the Subject in the latter option.\n if (this.queryChannelRoot(args.channelKey) !== undefined)\n ChannelControlError.throwError(\"root-exists\", `Channel ${args.channelKey} root already exist`, args.channelKey);\n\n const elementId = Subject.insert(txn, args.parentSubjectId ?? IModel.rootSubjectId, args.subjectName, args.description);\n this.makeChannelRoot({ elementId, channelKey: args.channelKey, txn });\n return elementId;\n }\n\n public queryChannelRoot(channelKey: ChannelKey): Id64String | undefined {\n if (channelKey === ChannelControl.sharedChannelName)\n // RootSubject acts as the ChannelRoot element of the shared channel\n return IModel.rootSubjectId;\n\n try {\n const channelRoot = this._iModel.withQueryReader(`SELECT Element.Id FROM ${ChannelAdmin.channelClassName} WHERE Owner=?`, (reader) => {\n return reader.step() ? reader.current[0] : undefined;\n }, new QueryBinder().bindString(1, channelKey));\n\n return channelRoot;\n } catch {\n // Exception happens if the iModel is too old: ChannelRootAspect class not present in the BisCore schema (older than v1.0.10).\n // In that case all data in such iModel is assumed to be in the shared channel.\n return undefined;\n }\n\n }\n\n public async upgradeChannel(options: ChannelUpgradeOptions, iModel: IModelDb, data?: any): Promise<void> {\n // Validations\n if (!this._allowedChannels.has(options.channelKey))\n ChannelControlError.throwError(\"not-allowed\", `Channel ${options.channelKey} is not allowed`, options.channelKey);\n\n if (semver.gte(options.fromVersion, options.toVersion))\n ChannelControlError.throwError(\"not-allowed\", `Upgrading channel ${options.channelKey} from ${options.fromVersion} to ${options.toVersion} is not allowed`, options.channelKey);\n\n if (!this.queryChannelRoot(options.channelKey) && options.channelKey !== ChannelControl.sharedChannelName)\n ChannelControlError.throwError(\"not-allowed\", `Channel ${options.channelKey} not found`, options.channelKey);\n\n const context: ChannelUpgradeContext = {\n iModel,\n channelKey: options.channelKey,\n fromVersion: options.fromVersion,\n toVersion: options.toVersion,\n data,\n };\n\n try {\n await options.callback(context);\n } catch (error: any) {\n ChannelControlError.throwError(error, \"channel-upgrade-failed\", `Channel ${options.channelKey} upgrade failed: ${error.message}`);\n }\n }\n}\n\nexport function createChannelControl(iModel: IModelDb): ChannelAdmin {\n return new ChannelAdmin(iModel);\n}\n"]}
@@ -0,0 +1,23 @@
1
+ import { AnyClass, Property } from "@itwin/ecschema-metadata";
2
+ import { IModelDb } from "../IModelDb";
3
+ /** Reshape a single value from `UseECSqlPropertyNames` to `UseJsPropertyNames`, dispatching on `prop`'s
4
+ * declared type (struct/array/point/navigation) instead of guessing from the value's shape.
5
+ * @internal
6
+ */
7
+ export declare function reshapePropertyValue(value: any, prop: Property, iModel: IModelDb): any;
8
+ /**
9
+ * Reshapes a `SELECT *` row queried with `UseECSqlPropertyNames` into the legacy `UseJsPropertyNames`
10
+ * shape, for a class only known at runtime. Walks `ecClass`'s metadata to rename each property, since a
11
+ * row's runtime shape alone can't tell a struct/point/navigation value apart from a plain object.
12
+ * @internal
13
+ */
14
+ export declare function reshapeInstanceRow(row: {
15
+ [propName: string]: any;
16
+ }, ecClass: AnyClass, iModel: IModelDb): {
17
+ [propName: string]: any;
18
+ };
19
+ /** Resolves the runtime [[AnyClass]] metadata for a "Schema:Class" or "Schema.Class" name.
20
+ * @internal
21
+ */
22
+ export declare function getRuntimeClass(iModel: IModelDb, fullClassName: string): AnyClass;
23
+ //# sourceMappingURL=ECSqlInstanceReshaper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ECSqlInstanceReshaper.d.ts","sourceRoot":"","sources":["../../../src/internal/ECSqlInstanceReshaper.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,QAAQ,EAA0B,QAAQ,EAAe,MAAM,0BAA0B,CAAC;AACnG,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAyDvC;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAG,GAAG,CA2BtF;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE;IAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAG;IAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,CAkBrI;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,GAAG,QAAQ,CAMjF"}
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.reshapePropertyValue = reshapePropertyValue;
4
+ exports.reshapeInstanceRow = reshapeInstanceRow;
5
+ exports.getRuntimeClass = getRuntimeClass;
6
+ /*---------------------------------------------------------------------------------------------
7
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
8
+ * See LICENSE.md in the project root for license terms and full copyright notice.
9
+ *--------------------------------------------------------------------------------------------*/
10
+ // Reimplements `UseJsPropertyNames` value shaping so `@public`/`@beta` output stays the same after it's
11
+ // deprecated. not permanent - see https://github.com/iTwin/itwinjs-core/issues/9489.
12
+ const ecschema_metadata_1 = require("@itwin/ecschema-metadata");
13
+ /** Maps `SELECT *` system properties/pseudo-columns to their legacy JS property name. `*ClassId` columns
14
+ * also resolve their raw class Id to a dot-separated class name (e.g. "BisCore.PhysicalElement").
15
+ */
16
+ const systemPropertyJsNames = new Map([
17
+ ["ECInstanceId", { jsName: "id" }],
18
+ ["ECClassId", { jsName: "className", isClassId: true }],
19
+ ["SourceECInstanceId", { jsName: "sourceId" }],
20
+ ["SourceECClassId", { jsName: "sourceClassName", isClassId: true }],
21
+ ["TargetECInstanceId", { jsName: "targetId" }],
22
+ ["TargetECClassId", { jsName: "targetClassName", isClassId: true }],
23
+ ]);
24
+ function lowerFirstChar(name) {
25
+ return name.length === 0 ? name : `${name[0].toLowerCase()}${name.substring(1)}`;
26
+ }
27
+ function classIdToDotClassName(iModel, classId) {
28
+ try {
29
+ return iModel.getClassNameFromId(classId).replace(":", ".");
30
+ }
31
+ catch {
32
+ // fall back to raw classId instead of throwing if it can't be resolved
33
+ return classId;
34
+ }
35
+ }
36
+ /** Reshape a struct value's members from `UseECSqlPropertyNames` to `UseJsPropertyNames`, recursively. */
37
+ function reshapeStruct(value, structClass, iModel) {
38
+ const result = {};
39
+ for (const key of Object.keys(value)) {
40
+ const memberValue = value[key];
41
+ if (undefined === memberValue || null === memberValue) {
42
+ continue;
43
+ }
44
+ const memberProp = structClass.getPropertySync(key);
45
+ result[lowerFirstChar(key)] = memberProp ? reshapePropertyValue(memberValue, memberProp, iModel) : memberValue;
46
+ }
47
+ return result;
48
+ }
49
+ /** Reshape a scalar (non-struct, non-array, non-navigation) value. Only Point2d/Point3d change shape
50
+ * (X/Y/Z -> x/y/z); other primitives/enumerations pass through unchanged.
51
+ */
52
+ function reshapeScalar(value, prop) {
53
+ if (prop.isPrimitive()) {
54
+ if (prop.primitiveType === ecschema_metadata_1.PrimitiveType.Point2d) {
55
+ return { x: value.X, y: value.Y };
56
+ }
57
+ if (prop.primitiveType === ecschema_metadata_1.PrimitiveType.Point3d) {
58
+ return { x: value.X, y: value.Y, z: value.Z };
59
+ }
60
+ }
61
+ return value;
62
+ }
63
+ /** Reshape a single value from `UseECSqlPropertyNames` to `UseJsPropertyNames`, dispatching on `prop`'s
64
+ * declared type (struct/array/point/navigation) instead of guessing from the value's shape.
65
+ * @internal
66
+ */
67
+ function reshapePropertyValue(value, prop, iModel) {
68
+ // struct classes can't declare navigation properties, so this only applies at the top level
69
+ if (prop.isNavigation()) {
70
+ const result = { id: value.Id };
71
+ // omit relClassName entirely if the relationship class Id is unset, rather than set to undefined
72
+ if (undefined !== value.RelECClassId && null !== value.RelECClassId) {
73
+ result.relClassName = classIdToDotClassName(iModel, value.RelECClassId);
74
+ }
75
+ return result;
76
+ }
77
+ if (prop.isArray()) {
78
+ if (!Array.isArray(value)) {
79
+ return value;
80
+ }
81
+ // null/undefined elements are dropped from primitive arrays, but kept as an empty object placeholder
82
+ // in struct arrays, to preserve array length/index
83
+ return prop.isStruct()
84
+ ? value.map((element) => (undefined === element || null === element) ? {} : reshapeStruct(element, prop.structClass, iModel))
85
+ : value.filter((element) => undefined !== element && null !== element).map((element) => reshapeScalar(element, prop));
86
+ }
87
+ if (prop.isStruct()) {
88
+ return reshapeStruct(value, prop.structClass, iModel);
89
+ }
90
+ return reshapeScalar(value, prop);
91
+ }
92
+ /**
93
+ * Reshapes a `SELECT *` row queried with `UseECSqlPropertyNames` into the legacy `UseJsPropertyNames`
94
+ * shape, for a class only known at runtime. Walks `ecClass`'s metadata to rename each property, since a
95
+ * row's runtime shape alone can't tell a struct/point/navigation value apart from a plain object.
96
+ * @internal
97
+ */
98
+ function reshapeInstanceRow(row, ecClass, iModel) {
99
+ const result = {};
100
+ for (const key of Object.keys(row)) {
101
+ const value = row[key];
102
+ if (undefined === value || null === value) {
103
+ continue;
104
+ }
105
+ const systemProperty = systemPropertyJsNames.get(key);
106
+ if (systemProperty) {
107
+ result[systemProperty.jsName] = systemProperty.isClassId ? classIdToDotClassName(iModel, value) : value;
108
+ continue;
109
+ }
110
+ const prop = ecClass.getPropertySync(key);
111
+ result[lowerFirstChar(key)] = prop ? reshapePropertyValue(value, prop, iModel) : value;
112
+ }
113
+ return result;
114
+ }
115
+ /** Resolves the runtime [[AnyClass]] metadata for a "Schema:Class" or "Schema.Class" name.
116
+ * @internal
117
+ */
118
+ function getRuntimeClass(iModel, fullClassName) {
119
+ const schemaItem = iModel.schemaContext.getSchemaItemSync(fullClassName);
120
+ if (undefined === schemaItem || !ecschema_metadata_1.ECClass.isECClass(schemaItem)) {
121
+ throw new Error(`Class not found: ${fullClassName}`);
122
+ }
123
+ return schemaItem;
124
+ }
125
+ //# sourceMappingURL=ECSqlInstanceReshaper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ECSqlInstanceReshaper.js","sourceRoot":"","sources":["../../../src/internal/ECSqlInstanceReshaper.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n// Reimplements `UseJsPropertyNames` value shaping so `@public`/`@beta` output stays the same after it's\n// deprecated. not permanent - see https://github.com/iTwin/itwinjs-core/issues/9489.\nimport { AnyClass, ECClass, PrimitiveType, Property, StructClass } from \"@itwin/ecschema-metadata\";\nimport { IModelDb } from \"../IModelDb\";\n\n/** Maps `SELECT *` system properties/pseudo-columns to their legacy JS property name. `*ClassId` columns\n * also resolve their raw class Id to a dot-separated class name (e.g. \"BisCore.PhysicalElement\").\n */\nconst systemPropertyJsNames = new Map<string, { jsName: string, isClassId?: boolean }>([\n [\"ECInstanceId\", { jsName: \"id\" }],\n [\"ECClassId\", { jsName: \"className\", isClassId: true }],\n [\"SourceECInstanceId\", { jsName: \"sourceId\" }],\n [\"SourceECClassId\", { jsName: \"sourceClassName\", isClassId: true }],\n [\"TargetECInstanceId\", { jsName: \"targetId\" }],\n [\"TargetECClassId\", { jsName: \"targetClassName\", isClassId: true }],\n]);\n\nfunction lowerFirstChar(name: string): string {\n return name.length === 0 ? name : `${name[0].toLowerCase()}${name.substring(1)}`;\n}\n\nfunction classIdToDotClassName(iModel: IModelDb, classId: string): string {\n try {\n return iModel.getClassNameFromId(classId).replace(\":\", \".\");\n } catch {\n // fall back to raw classId instead of throwing if it can't be resolved\n return classId;\n }\n}\n\n/** Reshape a struct value's members from `UseECSqlPropertyNames` to `UseJsPropertyNames`, recursively. */\nfunction reshapeStruct(value: { [propName: string]: any }, structClass: StructClass, iModel: IModelDb): { [propName: string]: any } {\n const result: { [propName: string]: any } = {};\n for (const key of Object.keys(value)) {\n const memberValue = value[key];\n if (undefined === memberValue || null === memberValue) {\n continue;\n }\n\n const memberProp = structClass.getPropertySync(key);\n result[lowerFirstChar(key)] = memberProp ? reshapePropertyValue(memberValue, memberProp, iModel) : memberValue;\n }\n return result;\n}\n\n/** Reshape a scalar (non-struct, non-array, non-navigation) value. Only Point2d/Point3d change shape\n * (X/Y/Z -> x/y/z); other primitives/enumerations pass through unchanged.\n */\nfunction reshapeScalar(value: any, prop: Property): any {\n if (prop.isPrimitive()) {\n if (prop.primitiveType === PrimitiveType.Point2d) {\n return { x: value.X, y: value.Y };\n }\n if (prop.primitiveType === PrimitiveType.Point3d) {\n return { x: value.X, y: value.Y, z: value.Z };\n }\n }\n return value;\n}\n\n/** Reshape a single value from `UseECSqlPropertyNames` to `UseJsPropertyNames`, dispatching on `prop`'s\n * declared type (struct/array/point/navigation) instead of guessing from the value's shape.\n * @internal\n */\nexport function reshapePropertyValue(value: any, prop: Property, iModel: IModelDb): any {\n // struct classes can't declare navigation properties, so this only applies at the top level\n if (prop.isNavigation()) {\n const result: { id: any, relClassName?: string } = { id: value.Id };\n // omit relClassName entirely if the relationship class Id is unset, rather than set to undefined\n if (undefined !== value.RelECClassId && null !== value.RelECClassId) {\n result.relClassName = classIdToDotClassName(iModel, value.RelECClassId);\n }\n return result;\n }\n\n if (prop.isArray()) {\n if (!Array.isArray(value)) {\n return value;\n }\n // null/undefined elements are dropped from primitive arrays, but kept as an empty object placeholder\n // in struct arrays, to preserve array length/index\n return prop.isStruct()\n ? value.map((element) => (undefined === element || null === element) ? {} : reshapeStruct(element, prop.structClass, iModel))\n : value.filter((element) => undefined !== element && null !== element).map((element) => reshapeScalar(element, prop));\n }\n\n if (prop.isStruct()) {\n return reshapeStruct(value, prop.structClass, iModel);\n }\n\n return reshapeScalar(value, prop);\n}\n\n/**\n * Reshapes a `SELECT *` row queried with `UseECSqlPropertyNames` into the legacy `UseJsPropertyNames`\n * shape, for a class only known at runtime. Walks `ecClass`'s metadata to rename each property, since a\n * row's runtime shape alone can't tell a struct/point/navigation value apart from a plain object.\n * @internal\n */\nexport function reshapeInstanceRow(row: { [propName: string]: any }, ecClass: AnyClass, iModel: IModelDb): { [propName: string]: any } {\n const result: { [propName: string]: any } = {};\n for (const key of Object.keys(row)) {\n const value = row[key];\n if (undefined === value || null === value) {\n continue;\n }\n\n const systemProperty = systemPropertyJsNames.get(key);\n if (systemProperty) {\n result[systemProperty.jsName] = systemProperty.isClassId ? classIdToDotClassName(iModel, value) : value;\n continue;\n }\n\n const prop = ecClass.getPropertySync(key);\n result[lowerFirstChar(key)] = prop ? reshapePropertyValue(value, prop, iModel) : value;\n }\n return result;\n}\n\n/** Resolves the runtime [[AnyClass]] metadata for a \"Schema:Class\" or \"Schema.Class\" name.\n * @internal\n */\nexport function getRuntimeClass(iModel: IModelDb, fullClassName: string): AnyClass {\n const schemaItem = iModel.schemaContext.getSchemaItemSync(fullClassName);\n if (undefined === schemaItem || !ECClass.isECClass(schemaItem)) {\n throw new Error(`Class not found: ${fullClassName}`);\n }\n return schemaItem;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ElementLRUCache.js","sourceRoot":"","sources":["../../../src/internal/ElementLRUCache.ts"],"names":[],"mappings":";;;AACA,sDAAmE;AACnE,oDAAyG;AAQzG;;;GAGG;AACH,MAAa,eAAe;IAgCS;IA/B5B,MAAM,CAAU,gBAAgB,GAAG,IAAI,CAAC;IACvC,aAAa,GAAG,IAAI,GAAG,EAA6B,CAAC;IACrD,YAAY,GAAG,IAAI,GAAG,EAA0B,CAAC;IACjD,sBAAsB,GAAG,IAAI,GAAG,EAAsB,CAAC;IAEvD,MAAM,CAAC,WAAW,CAAC,IAAe;QACxC,IAAI,kBAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YACpB,OAAO,SAAS,CAAC;QACnB,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC7B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IACO,WAAW,CAAC,GAAqB;QACvC,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACxC,CAAC;aAAM,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC;YAC9B,MAAM,EAAE,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAC/D,IAAI,EAAE;gBACJ,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtC,CAAC;aAAM,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,eAAe,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACtD,MAAM,EAAE,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC9E,IAAI,EAAE;gBACJ,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,yBAAU,CAAC,UAAU,CAAa,EAAE,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAC;QACvI,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,YAAmC,WAAW,eAAe,CAAC,gBAAgB;QAA3C,aAAQ,GAAR,QAAQ,CAAmC;IAAI,CAAC;IAC5E,KAAK;QACV,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,CAAC;IACtC,CAAC;IACD,IAAW,IAAI;QACb,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;IACjC,CAAC;IACM,eAAe,CAAC,OAAmB;QACxC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE;YAClD,IAAI,SAAS,CAAC,OAAO,CAAC,KAAK,KAAK,OAAO;gBACrC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC;IACM,MAAM,CAAC,GAAqB;QACjC,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC5C,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,aAAa,CAAC,OAAO,CAAC,EAAE;gBAC1B,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtD,MAAM,eAAe,GAAG,eAAe,CAAC,WAAW,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAChF,IAAI,eAAe,KAAK,SAAS;gBAC/B,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;YAC5C,IAAI,aAAa,CAAC,OAAO,CAAC,cAAc;gBACtC,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YAC3E,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACM,GAAG,CAAC,GAAqB;QAC9B,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC5C,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,aAAa,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;gBAC7B,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBACpD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;QAED,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,GAAG,CAAC,YAAY,KAAK,aAAa,CAAC,WAAW,CAAC,YAAY;gBAC7D,GAAG,CAAC,kBAAkB,KAAK,aAAa,CAAC,WAAW,CAAC,kBAAkB;gBACvE,GAAG,CAAC,cAAc,KAAK,aAAa,CAAC,WAAW,CAAC,cAAc;gBAC/D,GAAG,CAAC,YAAY,KAAK,aAAa,CAAC,WAAW,CAAC,YAAY;gBAC3D,GAAG,CAAC,YAAY,KAAK,aAAa,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC;gBAC9D,OAAO,SAAS,CAAA;YAClB,CAAC;QACH,CAAC;QACD,OAAO,aAAa,CAAC;IACvB,CAAC;IACM,GAAG,CAAC,EAAiB;QAC1B,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE;YAChB,yBAAU,CAAC,UAAU,CAAa,EAAE,OAAO,EAAE,yBAAyB,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAC;QAE/I,4FAA4F;QAC5F,8CAA8C;QAC9C,IAAI,EAAE,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACzC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5C,CAAC;QAED,IAAI,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;YAC9B,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,OAAO,GAAG,eAAe,CAAC,WAAW,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7D,IAAI,OAAO,KAAK,SAAS;YACvB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAChD,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAmB,CAAC;YACvE,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACxD,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,aAAa,EAAE,OAAO,CAAC,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3H,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAW,CAAC,MAAM,CAAC,WAAW,CAAC;QAC7B,OAAO,yBAAyB,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,QAAQ,GAAG,CAAC;IAC1E,CAAC;;AAlHH,0CAmHC;AAAA,CAAC;AASF;;;GAGG;AACH,MAAM,oBAAoB;IAChB,WAAW,GAAG,IAAI,GAAG,EAAuD,CAAC;IAC7E,aAAa,GAAG,IAAI,GAAG,EAAmD,CAAC;IAC3E,uBAAuB,GAAG,IAAI,GAAG,EAAuD,CAAC;IAEjG,gBAAuB,CAAC;IAEjB,GAAG,CAAC,IAAgB,EAAE,MAA+C;QAC1E,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc;YAChD,yBAAU,CAAC,UAAU,CAAa,EAAE,OAAO,EAAE,2DAA2D,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAC;QAEjL,IAAI,IAAI,CAAC,EAAE;YACT,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;;YAEtC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAE1C,IAAI,IAAI,CAAC,IAAI;YACX,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC5C,IAAI,IAAI,CAAC,cAAc;YACrB,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IAClE,CAAC;IACM,GAAG,CAAC,IAAgB;QACzB,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc;YAChD,yBAAU,CAAC,UAAU,CAAa,EAAE,OAAO,EAAE,2DAA2D,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAC;QAEjL,IAAI,IAAI,CAAC,EAAE;YACT,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;aAClC,IAAI,IAAI,CAAC,IAAI;YAChB,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aACtC,IAAI,IAAI,CAAC,cAAc;YAC1B,OAAO,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC/D,OAAO,SAAS,CAAC;IACnB,CAAC;IACM,MAAM,CAAC,IAAgB;QAC5B,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc;YAChD,yBAAU,CAAC,UAAU,CAAa,EAAE,OAAO,EAAE,2DAA2D,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAC;QAEjL,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,IAAI,CAAC,EAAE;YACT,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;QAC9D,IAAI,IAAI,CAAC,IAAI;YACX,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;QAClE,IAAI,IAAI,CAAC,cAAc;YACrB,OAAO,GAAG,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;QACtF,OAAO,OAAO,CAAC;IACjB,CAAC;IACM,KAAK;QACV,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC;IACvC,CAAC;IACD,IAAW,IAAI;QACb,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,mFAAmF;IACnH,CAAC;IACD,IAAW,CAAC,MAAM,CAAC,WAAW,CAAC;QAC7B,OAAO,eAAe,IAAI,CAAC,WAAW,CAAC,IAAI,mBAAmB,IAAI,CAAC,aAAa,CAAC,IAAI,6BAA6B,IAAI,CAAC,uBAAuB,CAAC,IAAI,EAAE,CAAC;IACxJ,CAAC;CACF;AAED;;;GAGG;AACH,MAAa,mBAAmB;IAKK;IAJ5B,MAAM,CAAU,gBAAgB,GAAG,IAAI,CAAC;IACvC,kBAAkB,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAChD,kBAAkB,GAAG,IAAI,GAAG,EAA0B,CAAC;IAE/D,YAAmC,WAAW,eAAe,CAAC,gBAAgB;QAA3C,aAAQ,GAAR,QAAQ,CAAmC;IAAI,CAAC;IAE5E,GAAG,CAAC,GAA0C,EAAE,MAA+C;QACpG,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,mBAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5C,yBAAU,CAAC,UAAU,CAAa,EAAE,OAAO,EAAE,4BAA4B,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAC;QAElJ,MAAM,SAAS,GAAG,mBAAmB,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QAC1D,IAAI,CAAC,SAAS;YACZ,OAAO,IAAI,CAAC;QACd,SAAS,CAAC,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACvD,MAAM,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC5D,IAAI,YAAY,EAAE,CAAC;YACjB,4DAA4D;YAC5D,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAC7C,MAAM,YAAY,GAAe,mBAAmB,CAAC,iBAAiB,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;YAChG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;YAClD,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;QACvD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAC/C,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YACjD,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAmB,CAAC;YAC5E,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC1D,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC,CAAC;QACpH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACM,GAAG,CAAC,GAA0C;QACnD,MAAM,IAAI,GAAG,mBAAmB,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QACrD,IAAI,CAAC,IAAI;YACP,OAAO,SAAS,CAAC;QACnB,MAAM,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvD,IAAI,YAAY,EAAE,CAAC;YACjB,4EAA4E;YAC5E,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YAChE,IAAI,UAAU,EAAE,CAAC;gBACf,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;gBAChD,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QACD,OAAO,YAAY,CAAC;IACtB,CAAC;IACM,UAAU,CAAC,EAAU;QAC1B,IAAI,CAAC,mBAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACvB,yBAAU,CAAC,UAAU,CAAa,EAAE,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAC;QAE3I,MAAM,SAAS,GAAG;YAChB,EAAE,EAAE,mBAAI,CAAC,UAAU,CAAC,EAAE,CAAC;SACxB,CAAA;QACD,OAAO,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC1C,CAAC;IACM,MAAM,CAAC,GAA0C;QACtD,MAAM,SAAS,GAAG,mBAAmB,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QAC1D,IAAI,CAAC,SAAS;YACZ,OAAO,KAAK,CAAC;QACf,OAAO,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC1C,CAAC;IACO,gBAAgB,CAAC,GAAe;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChD,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC5D,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC,CAAC;YACjI,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACO,MAAM,CAAC,cAAc,CAAC,IAA2C;QACvE,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc;YACxD,yBAAU,CAAC,UAAU,CAAa,EAAE,OAAO,EAAE,wEAAwE,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAC;QAE9L,MAAM,SAAS,GAAe;YAC5B,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;YACxE,cAAc,EAAE,IAAI,CAAC,cAAc;SACpC,CAAC;QAEF,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,cAAc;YAC/D,OAAO,SAAS,CAAC;QAEnB,OAAO,SAAS,CAAC;IACnB,CAAC;IACO,MAAM,CAAC,iBAAiB,CAAC,YAAwB,EAAE,OAAmB;QAC5E,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,cAAc,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc;YACnI,yBAAU,CAAC,UAAU,CAAa,EAAE,OAAO,EAAE,wEAAwE,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAC;QAE9L,OAAO;YACL,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE;YAC7C,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI;YACrD,cAAc,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,YAAY,CAAC,cAAc;SAC9F,CAAC;IACJ,CAAC;IACO,MAAM,CAAC,WAAW,CAAC,IAAe;QACxC,IAAI,kBAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YACpB,OAAO,SAAS,CAAC;QAEnB,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC7B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IACM,KAAK;QACV,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;IAClC,CAAC;IACD,IAAW,IAAI;QACb,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;IACtC,CAAC;IACD,IAAW,CAAC,MAAM,CAAC,WAAW,CAAC;QAC7B,OAAO,yBAAyB,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,QAAQ,GAAG,CAAC;IAC1E,CAAC;;AAtHH,kDAuHC;AAAA,CAAC","sourcesContent":["import { IModelJsNative } from \"@bentley/imodeljs-native\";\r\nimport { Id64, Id64String, ITwinError } from \"@itwin/core-bentley\";\r\nimport { Code, CodeProps, ElementLoadOptions, ElementLoadProps, ElementProps } from \"@itwin/core-common\";\r\n\r\n/* @internal */\r\nexport interface CachedElement {\r\n loadOptions: ElementLoadOptions\r\n elProps: ElementProps;\r\n}\r\n\r\n/**\r\n * A LRU cache for entities. Cache contains the ElementProps and the load options used to load it.\r\n * Cache can be searched by id, code or federationGuid.\r\n */\r\nexport class ElementLRUCache {\r\n public static readonly DEFAULT_CAPACITY = 2000;\r\n private _elementCache = new Map<Id64String, CachedElement>();\r\n private _cacheByCode = new Map<Id64String, Id64String>();\r\n private _cacheByFederationGuid = new Map<string, Id64String>();\r\n\r\n private static makeCodeKey(code: CodeProps): string | undefined {\r\n if (Code.isEmpty(code))\r\n return undefined;\r\n const keys = [code.scope, code.spec];\r\n if (code.value !== undefined) {\r\n keys.push(code.value);\r\n }\r\n return JSON.stringify(keys);\r\n }\r\n private findElement(key: ElementLoadProps): CachedElement | undefined {\r\n if (key.id) {\r\n return this._elementCache.get(key.id);\r\n } else if (key.federationGuid) {\r\n const id = this._cacheByFederationGuid.get(key.federationGuid);\r\n if (id)\r\n return this._elementCache.get(id);\r\n } else if (key.code) {\r\n const codeKey = ElementLRUCache.makeCodeKey(key.code);\r\n const id = codeKey !== undefined ? this._cacheByCode.get(codeKey) : undefined;\r\n if (id)\r\n return this._elementCache.get(id);\r\n } else {\r\n ITwinError.throwError<ITwinError>({ message: \"No key provided\", iTwinErrorId: { scope: \"imodel-cache\", key: \"invalid-arguments\" } });\r\n }\r\n return undefined;\r\n }\r\n public constructor(public readonly capacity = ElementLRUCache.DEFAULT_CAPACITY) { }\r\n public clear(): void {\r\n this._elementCache.clear();\r\n this._cacheByCode.clear();\r\n this._cacheByFederationGuid.clear();\r\n }\r\n public get size(): number {\r\n return this._elementCache.size;\r\n }\r\n public deleteWithModel(modelId: Id64String): void {\r\n this._elementCache.forEach((cachedVal, elementId) => {\r\n if (cachedVal.elProps.model === modelId)\r\n this.delete({ id: elementId });\r\n });\r\n }\r\n public delete(key: ElementLoadProps): boolean {\r\n const cachedElement = this.findElement(key);\r\n if (cachedElement) {\r\n if (cachedElement.elProps.id)\r\n this._elementCache.delete(cachedElement.elProps.id);\r\n const codeKeyToDelete = ElementLRUCache.makeCodeKey(cachedElement.elProps.code);\r\n if (codeKeyToDelete !== undefined)\r\n this._cacheByCode.delete(codeKeyToDelete);\r\n if (cachedElement.elProps.federationGuid)\r\n this._cacheByFederationGuid.delete(cachedElement.elProps.federationGuid);\r\n return true;\r\n }\r\n return false;\r\n }\r\n public get(key: ElementLoadProps): CachedElement | undefined {\r\n const cachedElement = this.findElement(key);\r\n if (cachedElement) {\r\n if (cachedElement.elProps.id) {\r\n this._elementCache.delete(cachedElement.elProps.id);\r\n this._elementCache.set(cachedElement.elProps.id, cachedElement);\r\n }\r\n }\r\n\r\n if (cachedElement) {\r\n if (key.displayStyle !== cachedElement.loadOptions.displayStyle ||\r\n key.onlyBaseProperties !== cachedElement.loadOptions.onlyBaseProperties ||\r\n key.renderTimeline !== cachedElement.loadOptions.renderTimeline ||\r\n key.wantBRepData !== cachedElement.loadOptions.wantBRepData ||\r\n key.wantGeometry !== cachedElement.loadOptions.wantGeometry) {\r\n return undefined\r\n }\r\n }\r\n return cachedElement;\r\n }\r\n public set(el: CachedElement): this {\r\n if (!el.elProps.id)\r\n ITwinError.throwError<ITwinError>({ message: \"Element must have an id\", iTwinErrorId: { scope: \"imodel-cache\", key: \"invalid-arguments\" } });\r\n\r\n // do not cache this element as geom need to be rerender into geom props if any part changes\r\n // TODO: find a way to handle caching geometry\r\n if (el.loadOptions.wantGeometry) {\r\n return this;\r\n }\r\n\r\n if (this._elementCache.has(el.elProps.id)) {\r\n this._elementCache.delete(el.elProps.id);\r\n this._elementCache.set(el.elProps.id, el);\r\n } else {\r\n this._elementCache.set(el.elProps.id, el);\r\n }\r\n\r\n if (el.elProps.federationGuid) {\r\n this._cacheByFederationGuid.set(el.elProps.federationGuid, el.elProps.id);\r\n }\r\n\r\n const codeKey = ElementLRUCache.makeCodeKey(el.elProps.code);\r\n if (codeKey !== undefined)\r\n this._cacheByCode.set(codeKey, el.elProps.id);\r\n if (this._elementCache.size > this.capacity) {\r\n const oldestKey = this._elementCache.keys().next().value as Id64String;\r\n const oldestElement = this._elementCache.get(oldestKey);\r\n this.delete({ id: oldestKey, federationGuid: oldestElement?.elProps.federationGuid, code: oldestElement?.elProps.code });\r\n }\r\n return this;\r\n }\r\n public get [Symbol.toStringTag](): string {\r\n return `EntityCache(this.size=${this.size}, capacity=${this.capacity})`;\r\n }\r\n};\r\n\r\n/* @internal */\r\ninterface CachedArgs {\r\n id?: Id64String;\r\n code?: string;\r\n federationGuid?: Id64String;\r\n}\r\n\r\n/**\r\n * A map to store instance keys based on different optional arguments like id, code, or federationGuid.\r\n * This allows the cache to be searched by any combination of arguments.\r\n */\r\nclass ArgumentsToResultMap {\r\n private _idToResult = new Map<Id64String, IModelJsNative.ResolveInstanceKeyResult>();\r\n private _codeToResult = new Map<string, IModelJsNative.ResolveInstanceKeyResult>();\r\n private _federationGuidToResult = new Map<Id64String, IModelJsNative.ResolveInstanceKeyResult>();\r\n\r\n public constructor() { }\r\n\r\n public set(args: CachedArgs, result: IModelJsNative.ResolveInstanceKeyResult): void {\r\n if (!args.id && !args.code && !args.federationGuid)\r\n ITwinError.throwError<ITwinError>({ message: \"At least one id, code, or federationGuid must be provided\", iTwinErrorId: { scope: \"imodel-cache\", key: \"invalid-arguments\" } });\r\n\r\n if (args.id)\r\n this._idToResult.set(args.id, result);\r\n else\r\n this._idToResult.set(result.id, result);\r\n\r\n if (args.code)\r\n this._codeToResult.set(args.code, result);\r\n if (args.federationGuid)\r\n this._federationGuidToResult.set(args.federationGuid, result);\r\n }\r\n public get(args: CachedArgs): IModelJsNative.ResolveInstanceKeyResult | undefined {\r\n if (!args.id && !args.code && !args.federationGuid)\r\n ITwinError.throwError<ITwinError>({ message: \"At least one id, code, or federationGuid must be provided\", iTwinErrorId: { scope: \"imodel-cache\", key: \"invalid-arguments\" } });\r\n\r\n if (args.id)\r\n return this._idToResult.get(args.id);\r\n else if (args.code)\r\n return this._codeToResult.get(args.code);\r\n else if (args.federationGuid)\r\n return this._federationGuidToResult.get(args.federationGuid);\r\n return undefined;\r\n }\r\n public delete(args: CachedArgs): boolean {\r\n if (!args.id && !args.code && !args.federationGuid)\r\n ITwinError.throwError<ITwinError>({ message: \"At least one id, code, or federationGuid must be provided\", iTwinErrorId: { scope: \"imodel-cache\", key: \"invalid-arguments\" } });\r\n\r\n let deleted = false;\r\n if (args.id)\r\n deleted = this._idToResult.delete(args.id) ? true : deleted;\r\n if (args.code)\r\n deleted = this._codeToResult.delete(args.code) ? true : deleted;\r\n if (args.federationGuid)\r\n deleted = this._federationGuidToResult.delete(args.federationGuid) ? true : deleted;\r\n return deleted;\r\n }\r\n public clear(): void {\r\n this._idToResult.clear();\r\n this._codeToResult.clear();\r\n this._federationGuidToResult.clear();\r\n }\r\n public get size(): number {\r\n return this._idToResult.size; // Id to key will always be stored even if code or federationGuid are not provided.\r\n }\r\n public get [Symbol.toStringTag](): string {\r\n return `idCacheSize=${this._idToResult.size}, codeCacheSize=${this._codeToResult.size}, federationGuidCacheSize=${this._federationGuidToResult.size}`;\r\n }\r\n}\r\n\r\n/**\r\n * A LRU cache for entities. Cache contains the ElementProps and the load options used to load it.\r\n * Cache can be searched by id, code or federationGuid.\r\n */\r\nexport class InstanceKeyLRUCache {\r\n public static readonly DEFAULT_CAPACITY = 2000;\r\n private _argsToResultCache = new ArgumentsToResultMap();\r\n private _resultToArgsCache = new Map<Id64String, CachedArgs>();\r\n\r\n public constructor(public readonly capacity = ElementLRUCache.DEFAULT_CAPACITY) { }\r\n\r\n public set(key: IModelJsNative.ResolveInstanceKeyArgs, result: IModelJsNative.ResolveInstanceKeyResult): this {\r\n if (!result.id || !Id64.isValidId64(result.id))\r\n ITwinError.throwError<ITwinError>({ message: \"Invalid InstanceKey result\", iTwinErrorId: { scope: \"imodel-cache\", key: \"invalid-arguments\" } });\r\n\r\n const cacheArgs = InstanceKeyLRUCache.makeCachedArgs(key);\r\n if (!cacheArgs)\r\n return this;\r\n cacheArgs.id = cacheArgs.id ? cacheArgs.id : result.id;\r\n const existingArgs = this._resultToArgsCache.get(result.id);\r\n if (existingArgs) {\r\n // Combine existing args with new args for more complete key\r\n this._argsToResultCache.delete(existingArgs);\r\n const combinedArgs: CachedArgs = InstanceKeyLRUCache.combineCachedArgs(existingArgs, cacheArgs);\r\n this._argsToResultCache.set(combinedArgs, result);\r\n this._resultToArgsCache.set(result.id, combinedArgs);\r\n } else {\r\n this._argsToResultCache.set(cacheArgs, result);\r\n this._resultToArgsCache.set(result.id, cacheArgs);\r\n }\r\n\r\n if (this._resultToArgsCache.size > this.capacity) {\r\n const oldestKey = this._resultToArgsCache.keys().next().value as Id64String;\r\n const oldestArgs = this._resultToArgsCache.get(oldestKey);\r\n this.deleteCachedArgs({ id: oldestArgs?.id, code: oldestArgs?.code, federationGuid: oldestArgs?.federationGuid });\r\n }\r\n return this;\r\n }\r\n public get(key: IModelJsNative.ResolveInstanceKeyArgs): IModelJsNative.ResolveInstanceKeyResult | undefined {\r\n const args = InstanceKeyLRUCache.makeCachedArgs(key);\r\n if (!args)\r\n return undefined;\r\n const cachedResult = this._argsToResultCache.get(args);\r\n if (cachedResult) {\r\n // Pop the cached result to the end of the cache to mark it as recently used\r\n const cachedArgs = this._resultToArgsCache.get(cachedResult.id);\r\n if (cachedArgs) {\r\n this._resultToArgsCache.delete(cachedResult.id);\r\n this._resultToArgsCache.set(cachedResult.id, cachedArgs);\r\n }\r\n }\r\n return cachedResult;\r\n }\r\n public deleteById(id: string): boolean {\r\n if (!Id64.isValidId64(id))\r\n ITwinError.throwError<ITwinError>({ message: \"Invalid id provided\", iTwinErrorId: { scope: \"imodel-cache\", key: \"invalid-arguments\" } });\r\n\r\n const cacheArgs = {\r\n id: Id64.fromString(id),\r\n }\r\n return this.deleteCachedArgs(cacheArgs);\r\n }\r\n public delete(key: IModelJsNative.ResolveInstanceKeyArgs): boolean {\r\n const cacheArgs = InstanceKeyLRUCache.makeCachedArgs(key);\r\n if (!cacheArgs)\r\n return false;\r\n return this.deleteCachedArgs(cacheArgs);\r\n }\r\n private deleteCachedArgs(key: CachedArgs): boolean {\r\n const result = this._argsToResultCache.get(key);\r\n if (result) {\r\n const argsToDelete = this._resultToArgsCache.get(result.id);\r\n this._argsToResultCache.delete({ id: argsToDelete?.id, code: argsToDelete?.code, federationGuid: argsToDelete?.federationGuid });\r\n this._resultToArgsCache.delete(result.id);\r\n return true;\r\n }\r\n return false;\r\n }\r\n private static makeCachedArgs(args: IModelJsNative.ResolveInstanceKeyArgs): CachedArgs | undefined {\r\n if (!args.partialKey && !args.code && !args.federationGuid)\r\n ITwinError.throwError<ITwinError>({ message: \"ResolveInstanceKeyArgs must have a partialKey, code, or federationGuid\", iTwinErrorId: { scope: \"imodel-cache\", key: \"invalid-arguments\" } });\r\n\r\n const cacheArgs: CachedArgs = {\r\n id: args.partialKey?.id,\r\n code: args.code ? InstanceKeyLRUCache.makeCodeKey(args.code) : undefined,\r\n federationGuid: args.federationGuid,\r\n };\r\n\r\n if (!cacheArgs.id && !cacheArgs.code && !cacheArgs.federationGuid)\r\n return undefined;\r\n\r\n return cacheArgs;\r\n }\r\n private static combineCachedArgs(originalArgs: CachedArgs, newArgs: CachedArgs): CachedArgs {\r\n if (!originalArgs.id && !originalArgs.code && !originalArgs.federationGuid && !newArgs.id && !newArgs.code && !newArgs.federationGuid)\r\n ITwinError.throwError<ITwinError>({ message: \"ResolveInstanceKeyArgs must have a partialKey, code, or federationGuid\", iTwinErrorId: { scope: \"imodel-cache\", key: \"invalid-arguments\" } });\r\n\r\n return {\r\n id: newArgs.id ? newArgs.id : originalArgs.id,\r\n code: newArgs.code ? newArgs.code : originalArgs.code,\r\n federationGuid: newArgs.federationGuid ? newArgs.federationGuid : originalArgs.federationGuid,\r\n };\r\n }\r\n private static makeCodeKey(code: CodeProps): string | undefined {\r\n if (Code.isEmpty(code))\r\n return undefined;\r\n\r\n const keys = [code.scope, code.spec];\r\n if (code.value !== undefined) {\r\n keys.push(code.value);\r\n }\r\n return JSON.stringify(keys);\r\n }\r\n public clear(): void {\r\n this._argsToResultCache.clear();\r\n this._resultToArgsCache.clear();\r\n }\r\n public get size(): number {\r\n return this._resultToArgsCache.size;\r\n }\r\n public get [Symbol.toStringTag](): string {\r\n return `InstanceKeyCache(size=${this.size}, capacity=${this.capacity})`;\r\n }\r\n};"]}
1
+ {"version":3,"file":"ElementLRUCache.js","sourceRoot":"","sources":["../../../src/internal/ElementLRUCache.ts"],"names":[],"mappings":"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","sourcesContent":["import { IModelJsNative } from \"@bentley/imodeljs-native\";\nimport { Id64, Id64String, ITwinError } from \"@itwin/core-bentley\";\nimport { Code, CodeProps, ElementLoadOptions, ElementLoadProps, ElementProps } from \"@itwin/core-common\";\n\n/* @internal */\nexport interface CachedElement {\n loadOptions: ElementLoadOptions\n elProps: ElementProps;\n}\n\n/**\n * A LRU cache for entities. Cache contains the ElementProps and the load options used to load it.\n * Cache can be searched by id, code or federationGuid.\n */\nexport class ElementLRUCache {\n public static readonly DEFAULT_CAPACITY = 2000;\n private _elementCache = new Map<Id64String, CachedElement>();\n private _cacheByCode = new Map<Id64String, Id64String>();\n private _cacheByFederationGuid = new Map<string, Id64String>();\n\n private static makeCodeKey(code: CodeProps): string | undefined {\n if (Code.isEmpty(code))\n return undefined;\n const keys = [code.scope, code.spec];\n if (code.value !== undefined) {\n keys.push(code.value);\n }\n return JSON.stringify(keys);\n }\n private findElement(key: ElementLoadProps): CachedElement | undefined {\n if (key.id) {\n return this._elementCache.get(key.id);\n } else if (key.federationGuid) {\n const id = this._cacheByFederationGuid.get(key.federationGuid);\n if (id)\n return this._elementCache.get(id);\n } else if (key.code) {\n const codeKey = ElementLRUCache.makeCodeKey(key.code);\n const id = codeKey !== undefined ? this._cacheByCode.get(codeKey) : undefined;\n if (id)\n return this._elementCache.get(id);\n } else {\n ITwinError.throwError<ITwinError>({ message: \"No key provided\", iTwinErrorId: { scope: \"imodel-cache\", key: \"invalid-arguments\" } });\n }\n return undefined;\n }\n public constructor(public readonly capacity = ElementLRUCache.DEFAULT_CAPACITY) { }\n public clear(): void {\n this._elementCache.clear();\n this._cacheByCode.clear();\n this._cacheByFederationGuid.clear();\n }\n public get size(): number {\n return this._elementCache.size;\n }\n public deleteWithModel(modelId: Id64String): void {\n this._elementCache.forEach((cachedVal, elementId) => {\n if (cachedVal.elProps.model === modelId)\n this.delete({ id: elementId });\n });\n }\n public delete(key: ElementLoadProps): boolean {\n const cachedElement = this.findElement(key);\n if (cachedElement) {\n if (cachedElement.elProps.id)\n this._elementCache.delete(cachedElement.elProps.id);\n const codeKeyToDelete = ElementLRUCache.makeCodeKey(cachedElement.elProps.code);\n if (codeKeyToDelete !== undefined)\n this._cacheByCode.delete(codeKeyToDelete);\n if (cachedElement.elProps.federationGuid)\n this._cacheByFederationGuid.delete(cachedElement.elProps.federationGuid);\n return true;\n }\n return false;\n }\n public get(key: ElementLoadProps): CachedElement | undefined {\n const cachedElement = this.findElement(key);\n if (cachedElement) {\n if (cachedElement.elProps.id) {\n this._elementCache.delete(cachedElement.elProps.id);\n this._elementCache.set(cachedElement.elProps.id, cachedElement);\n }\n }\n\n if (cachedElement) {\n if (key.displayStyle !== cachedElement.loadOptions.displayStyle ||\n key.onlyBaseProperties !== cachedElement.loadOptions.onlyBaseProperties ||\n key.renderTimeline !== cachedElement.loadOptions.renderTimeline ||\n key.wantBRepData !== cachedElement.loadOptions.wantBRepData ||\n key.wantGeometry !== cachedElement.loadOptions.wantGeometry) {\n return undefined\n }\n }\n return cachedElement;\n }\n public set(el: CachedElement): this {\n if (!el.elProps.id)\n ITwinError.throwError<ITwinError>({ message: \"Element must have an id\", iTwinErrorId: { scope: \"imodel-cache\", key: \"invalid-arguments\" } });\n\n // do not cache this element as geom need to be rerender into geom props if any part changes\n // TODO: find a way to handle caching geometry\n if (el.loadOptions.wantGeometry) {\n return this;\n }\n\n if (this._elementCache.has(el.elProps.id)) {\n this._elementCache.delete(el.elProps.id);\n this._elementCache.set(el.elProps.id, el);\n } else {\n this._elementCache.set(el.elProps.id, el);\n }\n\n if (el.elProps.federationGuid) {\n this._cacheByFederationGuid.set(el.elProps.federationGuid, el.elProps.id);\n }\n\n const codeKey = ElementLRUCache.makeCodeKey(el.elProps.code);\n if (codeKey !== undefined)\n this._cacheByCode.set(codeKey, el.elProps.id);\n if (this._elementCache.size > this.capacity) {\n const oldestKey = this._elementCache.keys().next().value as Id64String;\n const oldestElement = this._elementCache.get(oldestKey);\n this.delete({ id: oldestKey, federationGuid: oldestElement?.elProps.federationGuid, code: oldestElement?.elProps.code });\n }\n return this;\n }\n public get [Symbol.toStringTag](): string {\n return `EntityCache(this.size=${this.size}, capacity=${this.capacity})`;\n }\n};\n\n/* @internal */\ninterface CachedArgs {\n id?: Id64String;\n code?: string;\n federationGuid?: Id64String;\n}\n\n/**\n * A map to store instance keys based on different optional arguments like id, code, or federationGuid.\n * This allows the cache to be searched by any combination of arguments.\n */\nclass ArgumentsToResultMap {\n private _idToResult = new Map<Id64String, IModelJsNative.ResolveInstanceKeyResult>();\n private _codeToResult = new Map<string, IModelJsNative.ResolveInstanceKeyResult>();\n private _federationGuidToResult = new Map<Id64String, IModelJsNative.ResolveInstanceKeyResult>();\n\n public constructor() { }\n\n public set(args: CachedArgs, result: IModelJsNative.ResolveInstanceKeyResult): void {\n if (!args.id && !args.code && !args.federationGuid)\n ITwinError.throwError<ITwinError>({ message: \"At least one id, code, or federationGuid must be provided\", iTwinErrorId: { scope: \"imodel-cache\", key: \"invalid-arguments\" } });\n\n if (args.id)\n this._idToResult.set(args.id, result);\n else\n this._idToResult.set(result.id, result);\n\n if (args.code)\n this._codeToResult.set(args.code, result);\n if (args.federationGuid)\n this._federationGuidToResult.set(args.federationGuid, result);\n }\n public get(args: CachedArgs): IModelJsNative.ResolveInstanceKeyResult | undefined {\n if (!args.id && !args.code && !args.federationGuid)\n ITwinError.throwError<ITwinError>({ message: \"At least one id, code, or federationGuid must be provided\", iTwinErrorId: { scope: \"imodel-cache\", key: \"invalid-arguments\" } });\n\n if (args.id)\n return this._idToResult.get(args.id);\n else if (args.code)\n return this._codeToResult.get(args.code);\n else if (args.federationGuid)\n return this._federationGuidToResult.get(args.federationGuid);\n return undefined;\n }\n public delete(args: CachedArgs): boolean {\n if (!args.id && !args.code && !args.federationGuid)\n ITwinError.throwError<ITwinError>({ message: \"At least one id, code, or federationGuid must be provided\", iTwinErrorId: { scope: \"imodel-cache\", key: \"invalid-arguments\" } });\n\n let deleted = false;\n if (args.id)\n deleted = this._idToResult.delete(args.id) ? true : deleted;\n if (args.code)\n deleted = this._codeToResult.delete(args.code) ? true : deleted;\n if (args.federationGuid)\n deleted = this._federationGuidToResult.delete(args.federationGuid) ? true : deleted;\n return deleted;\n }\n public clear(): void {\n this._idToResult.clear();\n this._codeToResult.clear();\n this._federationGuidToResult.clear();\n }\n public get size(): number {\n return this._idToResult.size; // Id to key will always be stored even if code or federationGuid are not provided.\n }\n public get [Symbol.toStringTag](): string {\n return `idCacheSize=${this._idToResult.size}, codeCacheSize=${this._codeToResult.size}, federationGuidCacheSize=${this._federationGuidToResult.size}`;\n }\n}\n\n/**\n * A LRU cache for entities. Cache contains the ElementProps and the load options used to load it.\n * Cache can be searched by id, code or federationGuid.\n */\nexport class InstanceKeyLRUCache {\n public static readonly DEFAULT_CAPACITY = 2000;\n private _argsToResultCache = new ArgumentsToResultMap();\n private _resultToArgsCache = new Map<Id64String, CachedArgs>();\n\n public constructor(public readonly capacity = ElementLRUCache.DEFAULT_CAPACITY) { }\n\n public set(key: IModelJsNative.ResolveInstanceKeyArgs, result: IModelJsNative.ResolveInstanceKeyResult): this {\n if (!result.id || !Id64.isValidId64(result.id))\n ITwinError.throwError<ITwinError>({ message: \"Invalid InstanceKey result\", iTwinErrorId: { scope: \"imodel-cache\", key: \"invalid-arguments\" } });\n\n const cacheArgs = InstanceKeyLRUCache.makeCachedArgs(key);\n if (!cacheArgs)\n return this;\n cacheArgs.id = cacheArgs.id ? cacheArgs.id : result.id;\n const existingArgs = this._resultToArgsCache.get(result.id);\n if (existingArgs) {\n // Combine existing args with new args for more complete key\n this._argsToResultCache.delete(existingArgs);\n const combinedArgs: CachedArgs = InstanceKeyLRUCache.combineCachedArgs(existingArgs, cacheArgs);\n this._argsToResultCache.set(combinedArgs, result);\n this._resultToArgsCache.set(result.id, combinedArgs);\n } else {\n this._argsToResultCache.set(cacheArgs, result);\n this._resultToArgsCache.set(result.id, cacheArgs);\n }\n\n if (this._resultToArgsCache.size > this.capacity) {\n const oldestKey = this._resultToArgsCache.keys().next().value as Id64String;\n const oldestArgs = this._resultToArgsCache.get(oldestKey);\n this.deleteCachedArgs({ id: oldestArgs?.id, code: oldestArgs?.code, federationGuid: oldestArgs?.federationGuid });\n }\n return this;\n }\n public get(key: IModelJsNative.ResolveInstanceKeyArgs): IModelJsNative.ResolveInstanceKeyResult | undefined {\n const args = InstanceKeyLRUCache.makeCachedArgs(key);\n if (!args)\n return undefined;\n const cachedResult = this._argsToResultCache.get(args);\n if (cachedResult) {\n // Pop the cached result to the end of the cache to mark it as recently used\n const cachedArgs = this._resultToArgsCache.get(cachedResult.id);\n if (cachedArgs) {\n this._resultToArgsCache.delete(cachedResult.id);\n this._resultToArgsCache.set(cachedResult.id, cachedArgs);\n }\n }\n return cachedResult;\n }\n public deleteById(id: string): boolean {\n if (!Id64.isValidId64(id))\n ITwinError.throwError<ITwinError>({ message: \"Invalid id provided\", iTwinErrorId: { scope: \"imodel-cache\", key: \"invalid-arguments\" } });\n\n const cacheArgs = {\n id: Id64.fromString(id),\n }\n return this.deleteCachedArgs(cacheArgs);\n }\n public delete(key: IModelJsNative.ResolveInstanceKeyArgs): boolean {\n const cacheArgs = InstanceKeyLRUCache.makeCachedArgs(key);\n if (!cacheArgs)\n return false;\n return this.deleteCachedArgs(cacheArgs);\n }\n private deleteCachedArgs(key: CachedArgs): boolean {\n const result = this._argsToResultCache.get(key);\n if (result) {\n const argsToDelete = this._resultToArgsCache.get(result.id);\n this._argsToResultCache.delete({ id: argsToDelete?.id, code: argsToDelete?.code, federationGuid: argsToDelete?.federationGuid });\n this._resultToArgsCache.delete(result.id);\n return true;\n }\n return false;\n }\n private static makeCachedArgs(args: IModelJsNative.ResolveInstanceKeyArgs): CachedArgs | undefined {\n if (!args.partialKey && !args.code && !args.federationGuid)\n ITwinError.throwError<ITwinError>({ message: \"ResolveInstanceKeyArgs must have a partialKey, code, or federationGuid\", iTwinErrorId: { scope: \"imodel-cache\", key: \"invalid-arguments\" } });\n\n const cacheArgs: CachedArgs = {\n id: args.partialKey?.id,\n code: args.code ? InstanceKeyLRUCache.makeCodeKey(args.code) : undefined,\n federationGuid: args.federationGuid,\n };\n\n if (!cacheArgs.id && !cacheArgs.code && !cacheArgs.federationGuid)\n return undefined;\n\n return cacheArgs;\n }\n private static combineCachedArgs(originalArgs: CachedArgs, newArgs: CachedArgs): CachedArgs {\n if (!originalArgs.id && !originalArgs.code && !originalArgs.federationGuid && !newArgs.id && !newArgs.code && !newArgs.federationGuid)\n ITwinError.throwError<ITwinError>({ message: \"ResolveInstanceKeyArgs must have a partialKey, code, or federationGuid\", iTwinErrorId: { scope: \"imodel-cache\", key: \"invalid-arguments\" } });\n\n return {\n id: newArgs.id ? newArgs.id : originalArgs.id,\n code: newArgs.code ? newArgs.code : originalArgs.code,\n federationGuid: newArgs.federationGuid ? newArgs.federationGuid : originalArgs.federationGuid,\n };\n }\n private static makeCodeKey(code: CodeProps): string | undefined {\n if (Code.isEmpty(code))\n return undefined;\n\n const keys = [code.scope, code.spec];\n if (code.value !== undefined) {\n keys.push(code.value);\n }\n return JSON.stringify(keys);\n }\n public clear(): void {\n this._argsToResultCache.clear();\n this._resultToArgsCache.clear();\n }\n public get size(): number {\n return this._resultToArgsCache.size;\n }\n public get [Symbol.toStringTag](): string {\n return `InstanceKeyCache(size=${this.size}, capacity=${this.capacity})`;\n }\n};"]}
@@ -1 +1 @@
1
- {"version":3,"file":"FontFileImpl.js","sourceRoot":"","sources":["../../../src/internal/FontFileImpl.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\r\nimport * as fs from \"fs\";\r\nimport { FontFace, FontType, LocalFileName } from \"@itwin/core-common\";\r\nimport type { IModelJsNative } from \"@bentley/imodeljs-native\";\r\nimport { CreateFontFileFromRscBlobArgs, CreateFontFileFromShxBlobArgs, FontFile } from \"../FontFile\";\r\nimport { _faceProps, _getData, _implementationProhibited, _key } from \"./Symbols\";\r\nimport { compareNumbersOrUndefined } from \"@itwin/core-bentley\";\r\nimport { IModelNative } from \"./NativePlatform\"; \r\nimport { IModelDb } from \"../IModelDb\";\r\n\r\nabstract class FontFileImpl implements FontFile {\r\n public readonly [_implementationProhibited] = undefined;\r\n\r\n public readonly faces: ReadonlyArray<Readonly<FontFace>>;\r\n public abstract get type(): FontType;\r\n public get isEmbeddable(): boolean { return true; }\r\n\r\n public readonly [_key]: string;\r\n public readonly [_faceProps]: IModelJsNative.FontFaceProps[];\r\n\r\n protected constructor(faces: IModelJsNative.FontFaceProps[]) {\r\n this.faces = faces.map((face) => {\r\n return {\r\n familyName: face.familyName,\r\n isBold: face.faceName.startsWith(\"bold\"),\r\n isItalic: face.faceName.endsWith(\"italic\"),\r\n };\r\n });\r\n\r\n this[_faceProps] = faces;\r\n\r\n // Sort the face props in canonical order so we can compare FontFiles for equivalent contents.\r\n this[_faceProps].sort((a, b) =>\r\n a.familyName.localeCompare(b.familyName) || a.faceName.localeCompare(b.faceName) || compareNumbersOrUndefined(a.subId, b.subId)\r\n );\r\n\r\n // Stringify the face props so that the key properties (and no other properties) appear in a canonical order. for trivial comparisons.\r\n this[_key] = JSON.stringify(this[_faceProps], [\"familyName\", \"faceName\", \"type\", \"subId\"]);\r\n }\r\n\r\n public abstract [_getData](): Uint8Array;\r\n}\r\n\r\n/** Points to an OpenType font file on disk. */\r\nclass TrueTypeFontFile extends FontFileImpl {\r\n readonly #fileName: LocalFileName;\r\n readonly #embeddable: boolean;\r\n \r\n public constructor(fileName: LocalFileName, embeddable: boolean, faces: IModelJsNative.FontFaceProps[]) {\r\n super(faces);\r\n this.#fileName = fileName;\r\n this.#embeddable = embeddable;\r\n }\r\n\r\n public override get type(): FontType { return FontType.TrueType; }\r\n public override get isEmbeddable(): boolean { return this.#embeddable; }\r\n\r\n public override [_getData](): Uint8Array {\r\n return fs.readFileSync(this.#fileName);\r\n }\r\n}\r\n\r\n/** Holds the binary representation of a SHX or RSC font in memory. */\r\nexport class CadFontFile extends FontFileImpl {\r\n readonly #data: Uint8Array;\r\n readonly #type: FontType.Shx | FontType.Rsc;\r\n\r\n public constructor(data: Uint8Array, type: FontType.Shx | FontType.Rsc, faces: IModelJsNative.FontFaceProps[]) {\r\n super(faces);\r\n this.#data = data;\r\n this.#type = type;\r\n }\r\n\r\n public override get type(): FontType { return this.#type; }\r\n\r\n public override [_getData](): Uint8Array { return this.#data; }\r\n}\r\n\r\n/** Points to a font file in any format embedded in an iModel. */\r\nexport class EmbeddedFontFile extends FontFileImpl {\r\n // The value of the Id column for the row in the be_Prop table that embeds this font's data.\r\n readonly #db: IModelDb;\r\n readonly #id: number;\r\n readonly #type: FontType;\r\n\r\n public constructor(db: IModelDb, id: number, type: FontType, faces: IModelJsNative.FontFaceProps[]) {\r\n super(faces);\r\n this.#db = db;\r\n this.#id = id;\r\n this.#type = type;\r\n }\r\n\r\n public override get type(): FontType { return this.#type; }\r\n\r\n public override [_getData](): Uint8Array {\r\n const data = this.#db.queryFilePropertyBlob({\r\n namespace: \"dgn_Font\",\r\n name: \"EmbeddedFaceData\",\r\n id: this.#id,\r\n });\r\n\r\n if (!data) {\r\n throw new Error(\"Embedded font not found\");\r\n }\r\n\r\n return data;\r\n }\r\n}\r\n\r\nexport function shxFontFileFromBlob(args: CreateFontFileFromShxBlobArgs): FontFile {\r\n if (args.familyName.length === 0) {\r\n throw new Error(\"Font family name cannot be empty\");\r\n }\r\n\r\n// An SHX file with fewer than 40 bytes isn't valid.\r\n const minShxSize = 40;\r\n\r\n const shxHeaders = [\r\n \"AutoCAD-86 unifont 1.0\",\r\n \"AutoCAD-86 shapes 1.0\",\r\n \"AutoCAD-86 shapes 1.1\",\r\n ].map((shxHeader) => Array.from(shxHeader))\r\n .map((chars) => new Uint8Array(chars.map((ch) => ch.charCodeAt(0))));\r\n\r\n // See https://github.com/iTwin/imodel-native/blob/91f509c2175dc49ce1efcf5a906c9a9aa193451d/iModelCore/iModelPlatform/DgnCore/ShxFont.cpp#L44\r\n function validateShx(blob: Uint8Array): void {\r\n if (blob.length >= minShxSize) {\r\n for (const header of shxHeaders) {\r\n if (header.every((char, index) => char === blob[index])) {\r\n return;\r\n }\r\n }\r\n }\r\n\r\n throw new Error(\"Failed to read font file\");\r\n }\r\n\r\n validateShx(args.blob);\r\n\r\n return new CadFontFile(args.blob, FontType.Shx, [{\r\n faceName: \"regular\",\r\n familyName: args.familyName,\r\n type: FontType.Shx,\r\n }]);\r\n}\r\n\r\nexport function rscFontFileFromBlob(args: CreateFontFileFromRscBlobArgs): FontFile {\r\n if (args.familyName.length === 0) {\r\n throw new Error(\"Font family name cannot be empty\");\r\n }\r\n\r\n if (!IModelNative.platform.isRscFontData(args.blob)) {\r\n throw new Error(\"Failed to read font file\");\r\n }\r\n\r\n return new CadFontFile(args.blob, FontType.Rsc, [{\r\n faceName: \"regular\",\r\n familyName: args.familyName,\r\n type: FontType.Rsc,\r\n encoding: args.encoding,\r\n }]);\r\n}\r\n\r\nexport function trueTypeFontFileFromFileName(fileName: LocalFileName): FontFile {\r\n const metadata = IModelNative.platform.getTrueTypeFontMetadata(fileName);\r\n if (metadata.faces.length === 0) {\r\n // The input was almost certainly not a TrueType font file.\r\n throw new Error(\"Failed to read font file\");\r\n }\r\n\r\n return new TrueTypeFontFile(fileName, metadata.embeddable, metadata.faces);\r\n}\r\n\r\n"]}
1
+ {"version":3,"file":"FontFileImpl.js","sourceRoot":"","sources":["../../../src/internal/FontFileImpl.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport * as fs from \"fs\";\nimport { FontFace, FontType, LocalFileName } from \"@itwin/core-common\";\nimport type { IModelJsNative } from \"@bentley/imodeljs-native\";\nimport { CreateFontFileFromRscBlobArgs, CreateFontFileFromShxBlobArgs, FontFile } from \"../FontFile\";\nimport { _faceProps, _getData, _implementationProhibited, _key } from \"./Symbols\";\nimport { compareNumbersOrUndefined } from \"@itwin/core-bentley\";\nimport { IModelNative } from \"./NativePlatform\"; \nimport { IModelDb } from \"../IModelDb\";\n\nabstract class FontFileImpl implements FontFile {\n public readonly [_implementationProhibited] = undefined;\n\n public readonly faces: ReadonlyArray<Readonly<FontFace>>;\n public abstract get type(): FontType;\n public get isEmbeddable(): boolean { return true; }\n\n public readonly [_key]: string;\n public readonly [_faceProps]: IModelJsNative.FontFaceProps[];\n\n protected constructor(faces: IModelJsNative.FontFaceProps[]) {\n this.faces = faces.map((face) => {\n return {\n familyName: face.familyName,\n isBold: face.faceName.startsWith(\"bold\"),\n isItalic: face.faceName.endsWith(\"italic\"),\n };\n });\n\n this[_faceProps] = faces;\n\n // Sort the face props in canonical order so we can compare FontFiles for equivalent contents.\n this[_faceProps].sort((a, b) =>\n a.familyName.localeCompare(b.familyName) || a.faceName.localeCompare(b.faceName) || compareNumbersOrUndefined(a.subId, b.subId)\n );\n\n // Stringify the face props so that the key properties (and no other properties) appear in a canonical order. for trivial comparisons.\n this[_key] = JSON.stringify(this[_faceProps], [\"familyName\", \"faceName\", \"type\", \"subId\"]);\n }\n\n public abstract [_getData](): Uint8Array;\n}\n\n/** Points to an OpenType font file on disk. */\nclass TrueTypeFontFile extends FontFileImpl {\n readonly #fileName: LocalFileName;\n readonly #embeddable: boolean;\n \n public constructor(fileName: LocalFileName, embeddable: boolean, faces: IModelJsNative.FontFaceProps[]) {\n super(faces);\n this.#fileName = fileName;\n this.#embeddable = embeddable;\n }\n\n public override get type(): FontType { return FontType.TrueType; }\n public override get isEmbeddable(): boolean { return this.#embeddable; }\n\n public override [_getData](): Uint8Array {\n return fs.readFileSync(this.#fileName);\n }\n}\n\n/** Holds the binary representation of a SHX or RSC font in memory. */\nexport class CadFontFile extends FontFileImpl {\n readonly #data: Uint8Array;\n readonly #type: FontType.Shx | FontType.Rsc;\n\n public constructor(data: Uint8Array, type: FontType.Shx | FontType.Rsc, faces: IModelJsNative.FontFaceProps[]) {\n super(faces);\n this.#data = data;\n this.#type = type;\n }\n\n public override get type(): FontType { return this.#type; }\n\n public override [_getData](): Uint8Array { return this.#data; }\n}\n\n/** Points to a font file in any format embedded in an iModel. */\nexport class EmbeddedFontFile extends FontFileImpl {\n // The value of the Id column for the row in the be_Prop table that embeds this font's data.\n readonly #db: IModelDb;\n readonly #id: number;\n readonly #type: FontType;\n\n public constructor(db: IModelDb, id: number, type: FontType, faces: IModelJsNative.FontFaceProps[]) {\n super(faces);\n this.#db = db;\n this.#id = id;\n this.#type = type;\n }\n\n public override get type(): FontType { return this.#type; }\n\n public override [_getData](): Uint8Array {\n const data = this.#db.queryFilePropertyBlob({\n namespace: \"dgn_Font\",\n name: \"EmbeddedFaceData\",\n id: this.#id,\n });\n\n if (!data) {\n throw new Error(\"Embedded font not found\");\n }\n\n return data;\n }\n}\n\nexport function shxFontFileFromBlob(args: CreateFontFileFromShxBlobArgs): FontFile {\n if (args.familyName.length === 0) {\n throw new Error(\"Font family name cannot be empty\");\n }\n\n// An SHX file with fewer than 40 bytes isn't valid.\n const minShxSize = 40;\n\n const shxHeaders = [\n \"AutoCAD-86 unifont 1.0\",\n \"AutoCAD-86 shapes 1.0\",\n \"AutoCAD-86 shapes 1.1\",\n ].map((shxHeader) => Array.from(shxHeader))\n .map((chars) => new Uint8Array(chars.map((ch) => ch.charCodeAt(0))));\n\n // See https://github.com/iTwin/imodel-native/blob/91f509c2175dc49ce1efcf5a906c9a9aa193451d/iModelCore/iModelPlatform/DgnCore/ShxFont.cpp#L44\n function validateShx(blob: Uint8Array): void {\n if (blob.length >= minShxSize) {\n for (const header of shxHeaders) {\n if (header.every((char, index) => char === blob[index])) {\n return;\n }\n }\n }\n\n throw new Error(\"Failed to read font file\");\n }\n\n validateShx(args.blob);\n\n return new CadFontFile(args.blob, FontType.Shx, [{\n faceName: \"regular\",\n familyName: args.familyName,\n type: FontType.Shx,\n }]);\n}\n\nexport function rscFontFileFromBlob(args: CreateFontFileFromRscBlobArgs): FontFile {\n if (args.familyName.length === 0) {\n throw new Error(\"Font family name cannot be empty\");\n }\n\n if (!IModelNative.platform.isRscFontData(args.blob)) {\n throw new Error(\"Failed to read font file\");\n }\n\n return new CadFontFile(args.blob, FontType.Rsc, [{\n faceName: \"regular\",\n familyName: args.familyName,\n type: FontType.Rsc,\n encoding: args.encoding,\n }]);\n}\n\nexport function trueTypeFontFileFromFileName(fileName: LocalFileName): FontFile {\n const metadata = IModelNative.platform.getTrueTypeFontMetadata(fileName);\n if (metadata.faces.length === 0) {\n // The input was almost certainly not a TrueType font file.\n throw new Error(\"Failed to read font file\");\n }\n\n return new TrueTypeFontFile(fileName, metadata.embeddable, metadata.faces);\n}\n\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"HubMock.js","sourceRoot":"","sources":["../../../src/internal/HubMock.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F,+BAA4B;AAC5B,sDAAuD;AASvD,4DAA+I;AAC/I,8CAA2C;AAC3C,8CAA2C;AAC3C,0CAAuC;AACvC,0CAAmD;AACnD,uCAAqF;AACrF,0DAAuD;AAEvD,SAAS,UAAU,CAAC,GAAuB;IACzC,IAAI,SAAS,KAAK,GAAG;QACnB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;AAClD,CAAC;AAED,iFAAiF;AACjF,+DAA+D;AAC/D,SAAS,eAAe,CAAC,IAA6E;IACpG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;AAC/D,CAAC;AAED,+EAA+E;AAC/E,mGAAmG;AACnG,wFAAwF;AACxF,SAAS,iBAAiB,CAAC,IAA6E;IACtG,MAAM,GAAG,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,cAAc,GAAG,GAAG,CAAC,qBAAqB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACjE,MAAM,OAAO,GAAG,GAAG,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAAC;IAC3D,uBAAU,CAAC,QAAQ,CAAC,IAAA,WAAI,EAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;AACtG,CAAC;AAED,MAAM,cAAc,GAAmB;IACrC,UAAU,EAAE,CAAC,UAA2B,EAAE,EAAE;QAC1C,MAAM,UAAU,GAAG,IAAA,WAAI,EAAC,mCAAgB,CAAC,oBAAoB,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,GAAG,UAAU,CAAC,SAAS,CAAC,KAAK,MAAM,CAAC,CAAC;QACzH,eAAe,CAAC,EAAE,GAAG,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC;QAC/C,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,YAAY,EAAE,CAAC,OAAwB,EAAE,EAAE;QACzC,iBAAiB,CAAC,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAC9E,CAAC;CACF,CAAC;AA4CF,MAAa,OAAO;IACV,MAAM,CAAC,QAAQ,CAA2B;IAC1C,MAAM,CAAC,IAAI,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC1C,MAAM,CAAC,cAAc,CAA+B;IACpD,MAAM,CAAC,QAAQ,CAAyB;IACxC,MAAM,CAAC,0BAA0B,GAAG,KAAK,CAAC;IAElD,oEAAoE;IAC7D,MAAM,KAAK,OAAO,KAAK,OAAO,SAAS,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC5D,MAAM,KAAK,OAAO;QACvB,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,OAAO,CAAC,QAAsB,EAAE,SAAiB,EAAE,OAA+B;QAC9F,IAAI,IAAI,CAAC,OAAO;YACd,MAAM,IAAI,KAAK,CAAC,0JAA0J,CAAC,CAAC;QAE9K,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAClB,IAAI,CAAC,QAAQ,GAAG,IAAA,WAAI,EAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QACrD,uBAAU,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7C,uBAAU,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,CAAC,cAAc,GAAG,uBAAU,CAAC,uBAAa,CAAC,EAAE,CAAC;QAElD,uBAAU,CAAC,uBAAa,CAAC,CAAC,IAAI,CAAC,CAAC;QAChC,OAAO,CAAC,QAAQ,GAAG,mBAAI,CAAC,WAAW,EAAE,CAAC,CAAC,mDAAmD;QAC1F,IAAI,CAAC,0BAA0B,GAAG,OAAO,EAAE,yBAAyB,IAAI,KAAK,CAAC;QAE9E,uCAAmB,CAAC,yBAAe,CAAC,GAAG,cAAc,CAAC;IACxD,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,QAAQ;QACpB,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;YAC7B,OAAO;QAET,uCAAmB,CAAC,yBAAe,CAAC,GAAG,SAAS,CAAC;QACjD,IAAI,CAAC,0BAA0B,GAAG,KAAK,CAAC;QAExC,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC7B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI;YACzB,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QAEnB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAClB,uBAAU,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvC,uBAAU,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrC,uBAAU,CAAC,uBAAa,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC/C,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;IAC5B,CAAC;IAEM,MAAM,CAAC,YAAY,CAAC,QAAoB;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG;YACN,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,cAAc,CAAC,CAAC;QAClE,OAAO,GAAG,CAAC;IACb,CAAC;IAED,4CAA4C;IACrC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,GAAyB;QAC3D,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1B,MAAM,KAAK,GAAG,EAAE,GAAG,GAAG,EAAE,QAAQ,EAAE,mBAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACvD,MAAM,IAAI,GAAG,IAAI,mBAAQ,CAAC,IAAA,WAAI,EAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;QACtE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACpC,OAAO,KAAK,CAAC,QAAQ,CAAC;IACxB,CAAC;IAED,4CAA4C;IACrC,MAAM,CAAC,OAAO,CAAC,QAAoB;QACxC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;IAED,wEAAwE;IAEjE,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,GAA0C;QACzF,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC3E,CAAC;IAEO,MAAM,CAAC,qBAAqB,CAAC,GAAiB;QACpD,OAAO,CAAC,SAAS,KAAK,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACzI,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,GAA6C;QACvF,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QAC5B,IAAI,OAAO,CAAC,OAAO;YACjB,OAAO,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;QAEpC,MAAM,IAAI,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;QACxC,IAAI,IAAI;YACN,OAAO,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAEpC,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;QACtC,IAAI,WAAW;YACb,OAAO,GAAG,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;QAE3C,OAAO,GAAG,CAAC,kBAAkB,EAAE,CAAC;IAClC,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,GAAgB;QACrD,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,kBAAkB,EAAE,CAAC;IAC9D,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,GAAa;QAC/C,OAAO,GAAG,CAAC,WAAW,IAAI,MAAM,uBAAU,CAAC,cAAc,EAAE,CAAC;IAC9D,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,GAAgB;QACpD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;IACtE,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,GAA6B;QACrE,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,WAAW,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IAChG,CAAC;IAED,gHAAgH;IACzG,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAmB;QACtD,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC7E,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,GAAyB;QAC7D,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;QAE/I,IAAI,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACzB,MAAM,SAAS,GAAG,uBAAU,CAAC,SAAS,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC;YACtE,IAAI,SAAS;gBACX,MAAM,OAAO,CAAC,qBAAqB,CAAC,GAAG,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;QACzE,CAAC;QAED,OAAO,cAAc,CAAC;IACxB,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,GAA8B;QACnE,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;QAE1H,IAAI,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACzB,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,uBAAU,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACpH,MAAM,OAAO,CAAC,qBAAqB,CAAC,GAAG,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;QACvE,CAAC;QAED,OAAO,cAAc,CAAC;IACxB,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,GAAiB;QAClD,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9F,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,GAA6C;QAC/E,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACpE,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,GAAyD;QACzF,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACjF,IAAI,IAAI,CAAC,0BAA0B;YACjC,MAAM,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/C,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;;;;;;;;OAWG;IACI,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,QAAoB;QAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,GAAG,CAAC,oBAAoB,CAAC;QACzC,gFAAgF;QAChF,MAAM,SAAS,GAAG,GAAG,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;QACvD,MAAM,kBAAkB,GAAG,IAAA,WAAI,EAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC,CAAC;QAC3F,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,GAAG,CAAC,OAAO,EAAE,uBAAuB,OAAO,MAAM,CAAC,CAAC;QACzE,uBAAU,CAAC,QAAQ,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,qBAAU,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;YACvD,IAAI,CAAC;gBACH,MAAM,mCAAgB,CAAC,sBAAsB,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;gBACzF,EAAE,CAAC,mBAAS,CAAC,CAAC,WAAW,EAAE,CAAC;YAC9B,CAAC;oBAAS,CAAC;gBACT,EAAE,CAAC,KAAK,EAAE,CAAC;YACb,CAAC;YAED,GAAG,CAAC,gBAAgB,CAAC,EAAE,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;QACzE,CAAC;gBAAS,CAAC;YACT,IAAI,uBAAU,CAAC,UAAU,CAAC,QAAQ,CAAC;gBACjC,uBAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;IACD,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,GAAoB;QACxD,OAAO;YACL,WAAW,EAAE,MAAM;YACnB,QAAQ,EAAE,MAAM;YAChB,WAAW,EAAE,mBAAI,CAAC,WAAW,EAAE;YAC/B,MAAM,EAAE,GAAG,GAAG,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,MAAM;YACzC,WAAW,EAAE,MAAM;YACnB,MAAM,EAAE,IAAI;YACZ,UAAU,EAAE,GAAG;SACW,CAAC;IAC/B,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,GAAmB;QACrD,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5C,GAAG,CAAC,eAAe,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,cAAc,EAAE,GAAG,CAAC,qBAAqB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAClH,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,GAAmB;QACrD,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5C,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,IAAoB;QACpD,OAAO,EAAE,CAAC;IACZ,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,GAAmB,EAAE,KAAc;QAClE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC3D,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,GAAmB,EAAE,KAAc;QAClE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC3D,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,GAAkB;QACtD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YACxB,IAAI,QAAQ,CAAC,OAAO,KAAK,GAAG,CAAC,OAAO,IAAI,QAAQ,CAAC,UAAU,KAAK,GAAG,CAAC,UAAU;gBAC5E,OAAO,QAAQ,CAAC,QAAQ,CAAC;QAC7B,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,GAA0C;QACzE,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,gBAAkC,EAAE,SAAiB;QAC9F,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACpC,IAAI,QAAQ,GAAG,KAAK,CAAC;YAErB,MAAM,YAAY,GAAG,CAAC,KAAa,EAAE,EAAE;gBACrC,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC5D,IAAI,CAAC,QAAQ,IAAI,gBAAgB,CAAC,eAAe,EAAE,SAAS,CAAC,KAAK,kCAAc,CAAC,KAAK,EAAE,CAAC;oBACvF,QAAQ,GAAG,IAAI,CAAC;oBAChB,MAAM,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;gBAClC,CAAC;YACH,CAAC,CAAC;YAEF,YAAY,CAAC,CAAC,CAAC,CAAC;YAChB,UAAU,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtC,UAAU,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACvC,UAAU,CAAC,GAAG,EAAE;gBACd,YAAY,CAAC,CAAC,CAAC,CAAC;gBAChB,OAAO,CAAC,SAAS,CAAC,CAAC;YACrB,CAAC,EAAE,GAAG,CAAC,CAAC;QACV,CAAC,CAAC,CAAC;IACL,CAAC;;AA9QH,0BA+QC","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\r\nimport { join } from \"path\";\r\nimport { Guid, GuidString } from \"@itwin/core-bentley\";\r\nimport {\r\n ChangesetFileProps, ChangesetIndex, ChangesetIndexOrId, ChangesetProps, ChangesetRange, IModelVersion, LocalDirName,\r\n} from \"@itwin/core-common\";\r\nimport {\r\n AcquireNewBriefcaseIdArg,\r\n BackendHubAccess, BriefcaseDbArg, BriefcaseIdArg, ChangesetArg, CreateNewIModelProps, DownloadChangesetArg, DownloadChangesetRangeArg, IModelIdArg, IModelNameArg,\r\n LockMap, LockProps, V2CheckpointAccessProps,\r\n} from \"../BackendHubAccess\";\r\nimport { CheckpointProps, DownloadRequest, MockCheckpoint, ProgressFunction, ProgressStatus, V2CheckpointManager } from \"../CheckpointManager\";\r\nimport { IModelHost } from \"../IModelHost\";\r\nimport { IModelJsFs } from \"../IModelJsFs\";\r\nimport { LocalHub } from \"../LocalHub\";\r\nimport { SnapshotDb, TokenArg } from \"../IModelDb\";\r\nimport { _getHubAccess, _mockCheckpoint, _nativeDb, _setHubAccess } from \"./Symbols\";\r\nimport { BriefcaseManager } from \"../BriefcaseManager\";\r\n\r\nfunction wasStarted(val: string | undefined): asserts val is string {\r\n if (undefined === val)\r\n throw new Error(\"Call HubMock.startup first\");\r\n}\r\n\r\n// Used by mockAttach: copies the nearest *prior* checkpoint (never newer) so the\r\n// returned file is already at or before the requested version.\r\nfunction doDownloadPrior(args: { iModelId: string, changeset: ChangesetIndexOrId, targetFile: string }) {\r\n HubMock.findLocalHub(args.iModelId).downloadCheckpoint(args);\r\n}\r\n\r\n// Used by mockDownload: copies the *nearest* checkpoint (forward or backward).\r\n// When the nearest is newer than the requested version, CheckpointManager.updateToRequestedVersion\r\n// will reverse it to the requested version via BriefcaseManager.pullAndApplyChangesets.\r\nfunction doDownloadNearest(args: { iModelId: string, changeset: ChangesetIndexOrId, targetFile: string }) {\r\n const hub = HubMock.findLocalHub(args.iModelId);\r\n const requestedIndex = hub.getIndexFromChangeset(args.changeset);\r\n const nearest = hub.queryNearestCheckpoint(requestedIndex);\r\n IModelJsFs.copySync(join(hub.checkpointDir, hub.checkpointNameFromIndex(nearest)), args.targetFile);\r\n}\r\n\r\nconst mockCheckpoint: MockCheckpoint = {\r\n mockAttach: (checkpoint: CheckpointProps) => {\r\n const targetFile = join(BriefcaseManager.getBriefcaseBasePath(checkpoint.iModelId), `${checkpoint.changeset.index}.bim`);\r\n doDownloadPrior({ ...checkpoint, targetFile });\r\n return targetFile;\r\n },\r\n\r\n mockDownload: (request: DownloadRequest) => {\r\n doDownloadNearest({ ...request.checkpoint, targetFile: request.localFile });\r\n }\r\n};\r\n\r\n/**\r\n * Mocks iModelHub for testing creating Briefcases, downloading checkpoints, and simulating multiple users pushing and pulling changesets, etc.\r\n *\r\n * Generally, tests for apis that *create or modify* iModels can and should be mocked. Otherwise they:\r\n * - create tremendous load on the test servers when they run on programmer's desktops and in CI jobs\r\n * - waste network and data center resources (i.e. $$$s),\r\n * - interfere with other tests running on the same or other systems, and\r\n * - (far worse) are the source of test flakiness outside of the api being tested.\r\n *\r\n * This class can be used to create tests that do not require authentication, are synchronous,\r\n * are guaranteed to be self-contained (i.e. do not interfere with other tests running at the same time or later), and do not fail for reasons outside\r\n * of the control of the test itself. As a bonus, in addition to making tests more reliable, mocking IModelHub generally makes tests run *much* faster.\r\n *\r\n * On the other hand, tests that expect to find an existing iModels, checkpoints, changesets, etc. in IModelHub cannot be mocked. In that case, those tests\r\n * should be careful to NOT modify the data, since doing so causes interference with other tests running simultaneously. These tests should be limited to\r\n * low level testing of the core apis only.\r\n *\r\n * To initialize HubMock, call [[startup]] at the beginning of your test, usually in `describe.before`. Thereafter, all access to iModelHub for an iModel will be\r\n * directed to a [[LocalHub]] - your test code does not change. After the test(s) complete, call [[shutdown]] (usually in `describe.after`) to stop mocking IModelHub and clean\r\n * up any resources used by the test(s). If you want to mock a single test, call [[startup]] as the first line and [[shutdown]] as the last. If you wish to run the\r\n * test against a \"real\" IModelHub, you can simply comment off the call [[startup]], though in that case you should make sure the name of your\r\n * iModel is unique so your test won't collide with other tests (iModel name uniqueness is not necessary for mocked tests.)\r\n *\r\n * Mocked tests must always start by creating a new iModel via [[IModelHost[_hubAccess].createNewIModel]] with a `version0` iModel.\r\n * They use mock (aka \"bogus\") credentials for `AccessTokens`, which is fine since [[HubMock]] never accesses resources outside the current\r\n * computer.\r\n *\r\n * @note Only one HubMock at a time, *running in a single process*, may be active. The comments above about multiple simultaneous tests refer to tests\r\n * running on different computers, or on a single computer in multiple processes. All of those scenarios are problematic without mocking.\r\n *\r\n * @internal\r\n */\r\n/** Options for [[HubMock.startup]]. @internal */\r\nexport interface HubMockStartupOptions {\r\n /**\r\n * When `true`, every successful [[HubMock.pushChangeset]] call automatically uploads a V1 checkpoint\r\n * (the current briefcase `.bim` file) for the tip changeset index into [[LocalHub]].\r\n * This lets tests download a tip checkpoint and reverse changesets from it.\r\n */\r\n createTipCheckpointOnPush?: boolean;\r\n}\r\n\r\nexport class HubMock {\r\n private static mockRoot: LocalDirName | undefined;\r\n private static hubs = new Map<string, LocalHub>();\r\n private static _saveHubAccess: BackendHubAccess | undefined;\r\n private static _iTwinId: GuidString | undefined;\r\n private static _createTipCheckpointOnPush = false;\r\n\r\n /** Determine whether a test us currently being run under HubMock */\r\n public static get isValid() { return undefined !== this.mockRoot; }\r\n public static get iTwinId() {\r\n wasStarted(this._iTwinId);\r\n return this._iTwinId;\r\n }\r\n\r\n /**\r\n * Begin mocking IModelHub access. After this call, all access to IModelHub will be directed to a [[LocalHub]].\r\n * @param mockName a unique name (e.g. \"MyTest\") for this HubMock to disambiguate tests when more than one is simultaneously active.\r\n * It is used to create a private directory used by the HubMock for a test. That directory is removed when [[shutdown]] is called.\r\n */\r\n public static startup(mockName: LocalDirName, outputDir: string, options?: HubMockStartupOptions) {\r\n if (this.isValid)\r\n throw new Error(\"Either a previous test did not call HubMock.shutdown() properly, or more than one test is simultaneously attempting to use HubMock, which is not allowed\");\r\n\r\n this.hubs.clear();\r\n this.mockRoot = join(outputDir, \"HubMock\", mockName);\r\n IModelJsFs.recursiveMkDirSync(this.mockRoot);\r\n IModelJsFs.purgeDirSync(this.mockRoot);\r\n this._saveHubAccess = IModelHost[_getHubAccess]();\r\n\r\n IModelHost[_setHubAccess](this);\r\n HubMock._iTwinId = Guid.createValue(); // all iModels for this test get the same \"iTwinId\"\r\n this._createTipCheckpointOnPush = options?.createTipCheckpointOnPush ?? false;\r\n\r\n V2CheckpointManager[_mockCheckpoint] = mockCheckpoint;\r\n }\r\n\r\n /** Stop a HubMock that was previously started with [[startup]]\r\n * @note this function throws an exception if any of the iModels used during the tests are left open.\r\n */\r\n public static shutdown() {\r\n if (this.mockRoot === undefined)\r\n return;\r\n\r\n V2CheckpointManager[_mockCheckpoint] = undefined;\r\n this._createTipCheckpointOnPush = false;\r\n\r\n HubMock._iTwinId = undefined;\r\n for (const hub of this.hubs)\r\n hub[1].cleanup();\r\n\r\n this.hubs.clear();\r\n IModelJsFs.purgeDirSync(this.mockRoot);\r\n IModelJsFs.removeSync(this.mockRoot);\r\n IModelHost[_setHubAccess](this._saveHubAccess);\r\n this.mockRoot = undefined;\r\n }\r\n\r\n public static findLocalHub(iModelId: GuidString): LocalHub {\r\n const hub = this.hubs.get(iModelId);\r\n if (!hub)\r\n throw new Error(`local hub for iModel ${iModelId} not created`);\r\n return hub;\r\n }\r\n\r\n /** create a [[LocalHub]] for an iModel. */\r\n public static async createNewIModel(arg: CreateNewIModelProps): Promise<GuidString> {\r\n wasStarted(this.mockRoot);\r\n const props = { ...arg, iModelId: Guid.createValue() };\r\n const mock = new LocalHub(join(this.mockRoot, props.iModelId), props);\r\n this.hubs.set(props.iModelId, mock);\r\n return props.iModelId;\r\n }\r\n\r\n /** remove the [[LocalHub]] for an iModel */\r\n public static destroy(iModelId: GuidString) {\r\n this.findLocalHub(iModelId).cleanup();\r\n this.hubs.delete(iModelId);\r\n }\r\n\r\n /** All methods below are mocks of the [[BackendHubAccess]] interface */\r\n\r\n public static async getChangesetFromNamedVersion(arg: IModelIdArg & { versionName: string }): Promise<ChangesetProps> {\r\n return this.findLocalHub(arg.iModelId).findNamedVersion(arg.versionName);\r\n }\r\n\r\n private static changesetIndexFromArg(arg: ChangesetArg) {\r\n return (undefined !== arg.changeset.index) ? arg.changeset.index : this.findLocalHub(arg.iModelId).getChangesetIndex(arg.changeset.id);\r\n }\r\n\r\n public static async getChangesetFromVersion(arg: IModelIdArg & { version: IModelVersion }): Promise<ChangesetProps> {\r\n const hub = this.findLocalHub(arg.iModelId);\r\n const version = arg.version;\r\n if (version.isFirst)\r\n return hub.getChangesetByIndex(0);\r\n\r\n const asOf = version.getAsOfChangeSet();\r\n if (asOf)\r\n return hub.getChangesetById(asOf);\r\n\r\n const versionName = version.getName();\r\n if (versionName)\r\n return hub.findNamedVersion(versionName);\r\n\r\n return hub.getLatestChangeset();\r\n }\r\n\r\n public static async getLatestChangeset(arg: IModelIdArg): Promise<ChangesetProps> {\r\n return this.findLocalHub(arg.iModelId).getLatestChangeset();\r\n }\r\n\r\n private static async getAccessToken(arg: TokenArg) {\r\n return arg.accessToken ?? await IModelHost.getAccessToken();\r\n }\r\n\r\n public static async getMyBriefcaseIds(arg: IModelIdArg): Promise<number[]> {\r\n const accessToken = await this.getAccessToken(arg);\r\n return this.findLocalHub(arg.iModelId).getBriefcaseIds(accessToken);\r\n }\r\n\r\n public static async acquireNewBriefcaseId(arg: AcquireNewBriefcaseIdArg): Promise<number> {\r\n const accessToken = await this.getAccessToken(arg);\r\n return this.findLocalHub(arg.iModelId).acquireNewBriefcaseId(accessToken, arg.briefcaseAlias);\r\n }\r\n\r\n /** Release a briefcaseId. After this call it is illegal to generate changesets for the released briefcaseId. */\r\n public static async releaseBriefcase(arg: BriefcaseIdArg): Promise<void> {\r\n return this.findLocalHub(arg.iModelId).releaseBriefcaseId(arg.briefcaseId);\r\n }\r\n\r\n public static async downloadChangeset(arg: DownloadChangesetArg): Promise<ChangesetFileProps> {\r\n const changesetProps = this.findLocalHub(arg.iModelId).downloadChangeset({ index: this.changesetIndexFromArg(arg), targetDir: arg.targetDir });\r\n\r\n if (arg.progressCallback) {\r\n const totalSize = IModelJsFs.lstatSync(changesetProps.pathname)?.size;\r\n if (totalSize)\r\n await HubMock.mockProgressReporting(arg.progressCallback, totalSize);\r\n }\r\n\r\n return changesetProps;\r\n }\r\n\r\n public static async downloadChangesets(arg: DownloadChangesetRangeArg): Promise<ChangesetFileProps[]> {\r\n const changesetProps = this.findLocalHub(arg.iModelId).downloadChangesets({ range: arg.range, targetDir: arg.targetDir });\r\n\r\n if (arg.progressCallback) {\r\n const totalSize = changesetProps.reduce((sum, props) => sum + (IModelJsFs.lstatSync(props.pathname)?.size ?? 0), 0);\r\n await HubMock.mockProgressReporting(arg.progressCallback, totalSize);\r\n }\r\n\r\n return changesetProps;\r\n }\r\n\r\n public static async queryChangeset(arg: ChangesetArg): Promise<ChangesetProps> {\r\n return this.findLocalHub(arg.iModelId).getChangesetByIndex(this.changesetIndexFromArg(arg));\r\n }\r\n\r\n public static async queryChangesets(arg: IModelIdArg & { range?: ChangesetRange }): Promise<ChangesetProps[]> {\r\n return this.findLocalHub(arg.iModelId).queryChangesets(arg.range);\r\n }\r\n\r\n public static async pushChangeset(arg: IModelIdArg & { changesetProps: ChangesetFileProps }): Promise<ChangesetIndex> {\r\n const csIndex = this.findLocalHub(arg.iModelId).addChangeset(arg.changesetProps);\r\n if (this._createTipCheckpointOnPush)\r\n await this.createTipCheckpoint(arg.iModelId);\r\n return csIndex;\r\n }\r\n\r\n /**\r\n * Build and upload a V1 checkpoint at the current tip changeset of the given iModel.\r\n *\r\n * The checkpoint is constructed by copying the nearest prior checkpoint from [[LocalHub]] as a\r\n * starting base, then applying all subsequent changesets forward to the latest index via\r\n * [[BriefcaseManager.pullAndApplyChangesets]]. The result is registered in [[LocalHub]] so that\r\n * [[V2CheckpointManager]] (mock path) can serve it to consumers.\r\n *\r\n * When [[HubMockStartupOptions.createTipCheckpointOnPush]] is `true` this is called automatically\r\n * after every successful [[pushChangeset]]. Tests can also call it explicitly to create a single\r\n * checkpoint at the tip after all changesets have been pushed.\r\n */\r\n public static async createTipCheckpoint(iModelId: GuidString): Promise<void> {\r\n const hub = this.findLocalHub(iModelId);\r\n const csIndex = hub.latestChangesetIndex;\r\n // Find the nearest checkpoint that precedes the new tip and use it as the base.\r\n const prevIndex = hub.queryPreviousCheckpoint(csIndex);\r\n const prevCheckpointFile = join(hub.checkpointDir, hub.checkpointNameFromIndex(prevIndex));\r\n const tempFile = join(hub.rootDir, `checkpoint-building-${csIndex}.bim`);\r\n IModelJsFs.copySync(prevCheckpointFile, tempFile);\r\n try {\r\n const db = SnapshotDb.openForApplyChangesets(tempFile);\r\n try {\r\n await BriefcaseManager.pullAndApplyChangesets(db, { accessToken: \"\", toIndex: csIndex });\r\n db[_nativeDb].saveChanges();\r\n } finally {\r\n db.close();\r\n }\r\n\r\n hub.uploadCheckpoint({ changesetIndex: csIndex, localFile: tempFile });\r\n } finally {\r\n if (IModelJsFs.existsSync(tempFile))\r\n IModelJsFs.removeSync(tempFile);\r\n }\r\n }\r\n\r\n public static async queryV2Checkpoint(arg: CheckpointProps): Promise<V2CheckpointAccessProps | undefined> {\r\n return {\r\n accountName: \"none\",\r\n sasToken: \"none\",\r\n containerId: Guid.createValue(),\r\n dbName: `${arg.changeset.index ?? 0}.bim`,\r\n storageType: \"mock\",\r\n isMock: true,\r\n checkpoint: arg,\r\n } as V2CheckpointAccessProps;\r\n }\r\n\r\n public static async releaseAllLocks(arg: BriefcaseDbArg) {\r\n const hub = this.findLocalHub(arg.iModelId);\r\n hub.releaseAllLocks({ briefcaseId: arg.briefcaseId, changesetIndex: hub.getIndexFromChangeset(arg.changeset) });\r\n }\r\n\r\n public static async abandonAllLocks(arg: BriefcaseIdArg): Promise<void> {\r\n const hub = this.findLocalHub(arg.iModelId);\r\n hub.abandonAllLocks(arg);\r\n }\r\n\r\n public static async queryAllLocks(_arg: BriefcaseDbArg): Promise<LockProps[]> {\r\n return [];\r\n }\r\n\r\n public static async acquireLocks(arg: BriefcaseDbArg, locks: LockMap): Promise<void> {\r\n this.findLocalHub(arg.iModelId).acquireLocks(locks, arg);\r\n }\r\n\r\n public static async abandonLocks(arg: BriefcaseIdArg, locks: LockMap): Promise<void> {\r\n this.findLocalHub(arg.iModelId).abandonLocks(locks, arg);\r\n }\r\n\r\n public static async queryIModelByName(arg: IModelNameArg): Promise<GuidString | undefined> {\r\n for (const hub of this.hubs) {\r\n const localHub = hub[1];\r\n if (localHub.iTwinId === arg.iTwinId && localHub.iModelName === arg.iModelName)\r\n return localHub.iModelId;\r\n }\r\n return undefined;\r\n }\r\n\r\n public static async deleteIModel(arg: IModelIdArg & { iTwinId: GuidString }): Promise<void> {\r\n return this.destroy(arg.iModelId);\r\n }\r\n\r\n private static async mockProgressReporting(progressCallback: ProgressFunction, totalSize: number): Promise<void> {\r\n await new Promise((resolve, reject) => {\r\n let rejected = false;\r\n\r\n const mockProgress = (index: number) => {\r\n const bytesDownloaded = Math.floor(totalSize * (index / 4));\r\n if (!rejected && progressCallback(bytesDownloaded, totalSize) === ProgressStatus.Abort) {\r\n rejected = true;\r\n reject(new Error(\"AbortError\"));\r\n }\r\n };\r\n\r\n mockProgress(1);\r\n setTimeout(() => mockProgress(2), 50);\r\n setTimeout(() => mockProgress(3), 100);\r\n setTimeout(() => {\r\n mockProgress(4);\r\n resolve(undefined);\r\n }, 150);\r\n });\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"HubMock.js","sourceRoot":"","sources":["../../../src/internal/HubMock.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { join } from \"path\";\nimport { Guid, GuidString } from \"@itwin/core-bentley\";\nimport {\n ChangesetFileProps, ChangesetIndex, ChangesetIndexOrId, ChangesetProps, ChangesetRange, IModelVersion, LocalDirName,\n} from \"@itwin/core-common\";\nimport {\n AcquireNewBriefcaseIdArg,\n BackendHubAccess, BriefcaseDbArg, BriefcaseIdArg, ChangesetArg, CreateNewIModelProps, DownloadChangesetArg, DownloadChangesetRangeArg, IModelIdArg, IModelNameArg,\n LockMap, LockProps, V2CheckpointAccessProps,\n} from \"../BackendHubAccess\";\nimport { CheckpointProps, DownloadRequest, MockCheckpoint, ProgressFunction, ProgressStatus, V2CheckpointManager } from \"../CheckpointManager\";\nimport { IModelHost } from \"../IModelHost\";\nimport { IModelJsFs } from \"../IModelJsFs\";\nimport { LocalHub } from \"../LocalHub\";\nimport { SnapshotDb, TokenArg } from \"../IModelDb\";\nimport { _getHubAccess, _mockCheckpoint, _nativeDb, _setHubAccess } from \"./Symbols\";\nimport { BriefcaseManager } from \"../BriefcaseManager\";\n\nfunction wasStarted(val: string | undefined): asserts val is string {\n if (undefined === val)\n throw new Error(\"Call HubMock.startup first\");\n}\n\n// Used by mockAttach: copies the nearest *prior* checkpoint (never newer) so the\n// returned file is already at or before the requested version.\nfunction doDownloadPrior(args: { iModelId: string, changeset: ChangesetIndexOrId, targetFile: string }) {\n HubMock.findLocalHub(args.iModelId).downloadCheckpoint(args);\n}\n\n// Used by mockDownload: copies the *nearest* checkpoint (forward or backward).\n// When the nearest is newer than the requested version, CheckpointManager.updateToRequestedVersion\n// will reverse it to the requested version via BriefcaseManager.pullAndApplyChangesets.\nfunction doDownloadNearest(args: { iModelId: string, changeset: ChangesetIndexOrId, targetFile: string }) {\n const hub = HubMock.findLocalHub(args.iModelId);\n const requestedIndex = hub.getIndexFromChangeset(args.changeset);\n const nearest = hub.queryNearestCheckpoint(requestedIndex);\n IModelJsFs.copySync(join(hub.checkpointDir, hub.checkpointNameFromIndex(nearest)), args.targetFile);\n}\n\nconst mockCheckpoint: MockCheckpoint = {\n mockAttach: (checkpoint: CheckpointProps) => {\n const targetFile = join(BriefcaseManager.getBriefcaseBasePath(checkpoint.iModelId), `${checkpoint.changeset.index}.bim`);\n doDownloadPrior({ ...checkpoint, targetFile });\n return targetFile;\n },\n\n mockDownload: (request: DownloadRequest) => {\n doDownloadNearest({ ...request.checkpoint, targetFile: request.localFile });\n }\n};\n\n/**\n * Mocks iModelHub for testing creating Briefcases, downloading checkpoints, and simulating multiple users pushing and pulling changesets, etc.\n *\n * Generally, tests for apis that *create or modify* iModels can and should be mocked. Otherwise they:\n * - create tremendous load on the test servers when they run on programmer's desktops and in CI jobs\n * - waste network and data center resources (i.e. $$$s),\n * - interfere with other tests running on the same or other systems, and\n * - (far worse) are the source of test flakiness outside of the api being tested.\n *\n * This class can be used to create tests that do not require authentication, are synchronous,\n * are guaranteed to be self-contained (i.e. do not interfere with other tests running at the same time or later), and do not fail for reasons outside\n * of the control of the test itself. As a bonus, in addition to making tests more reliable, mocking IModelHub generally makes tests run *much* faster.\n *\n * On the other hand, tests that expect to find an existing iModels, checkpoints, changesets, etc. in IModelHub cannot be mocked. In that case, those tests\n * should be careful to NOT modify the data, since doing so causes interference with other tests running simultaneously. These tests should be limited to\n * low level testing of the core apis only.\n *\n * To initialize HubMock, call [[startup]] at the beginning of your test, usually in `describe.before`. Thereafter, all access to iModelHub for an iModel will be\n * directed to a [[LocalHub]] - your test code does not change. After the test(s) complete, call [[shutdown]] (usually in `describe.after`) to stop mocking IModelHub and clean\n * up any resources used by the test(s). If you want to mock a single test, call [[startup]] as the first line and [[shutdown]] as the last. If you wish to run the\n * test against a \"real\" IModelHub, you can simply comment off the call [[startup]], though in that case you should make sure the name of your\n * iModel is unique so your test won't collide with other tests (iModel name uniqueness is not necessary for mocked tests.)\n *\n * Mocked tests must always start by creating a new iModel via [[IModelHost[_hubAccess].createNewIModel]] with a `version0` iModel.\n * They use mock (aka \"bogus\") credentials for `AccessTokens`, which is fine since [[HubMock]] never accesses resources outside the current\n * computer.\n *\n * @note Only one HubMock at a time, *running in a single process*, may be active. The comments above about multiple simultaneous tests refer to tests\n * running on different computers, or on a single computer in multiple processes. All of those scenarios are problematic without mocking.\n *\n * @internal\n */\n/** Options for [[HubMock.startup]]. @internal */\nexport interface HubMockStartupOptions {\n /**\n * When `true`, every successful [[HubMock.pushChangeset]] call automatically uploads a V1 checkpoint\n * (the current briefcase `.bim` file) for the tip changeset index into [[LocalHub]].\n * This lets tests download a tip checkpoint and reverse changesets from it.\n */\n createTipCheckpointOnPush?: boolean;\n}\n\nexport class HubMock {\n private static mockRoot: LocalDirName | undefined;\n private static hubs = new Map<string, LocalHub>();\n private static _saveHubAccess: BackendHubAccess | undefined;\n private static _iTwinId: GuidString | undefined;\n private static _createTipCheckpointOnPush = false;\n\n /** Determine whether a test us currently being run under HubMock */\n public static get isValid() { return undefined !== this.mockRoot; }\n public static get iTwinId() {\n wasStarted(this._iTwinId);\n return this._iTwinId;\n }\n\n /**\n * Begin mocking IModelHub access. After this call, all access to IModelHub will be directed to a [[LocalHub]].\n * @param mockName a unique name (e.g. \"MyTest\") for this HubMock to disambiguate tests when more than one is simultaneously active.\n * It is used to create a private directory used by the HubMock for a test. That directory is removed when [[shutdown]] is called.\n */\n public static startup(mockName: LocalDirName, outputDir: string, options?: HubMockStartupOptions) {\n if (this.isValid)\n throw new Error(\"Either a previous test did not call HubMock.shutdown() properly, or more than one test is simultaneously attempting to use HubMock, which is not allowed\");\n\n this.hubs.clear();\n this.mockRoot = join(outputDir, \"HubMock\", mockName);\n IModelJsFs.recursiveMkDirSync(this.mockRoot);\n IModelJsFs.purgeDirSync(this.mockRoot);\n this._saveHubAccess = IModelHost[_getHubAccess]();\n\n IModelHost[_setHubAccess](this);\n HubMock._iTwinId = Guid.createValue(); // all iModels for this test get the same \"iTwinId\"\n this._createTipCheckpointOnPush = options?.createTipCheckpointOnPush ?? false;\n\n V2CheckpointManager[_mockCheckpoint] = mockCheckpoint;\n }\n\n /** Stop a HubMock that was previously started with [[startup]]\n * @note this function throws an exception if any of the iModels used during the tests are left open.\n */\n public static shutdown() {\n if (this.mockRoot === undefined)\n return;\n\n V2CheckpointManager[_mockCheckpoint] = undefined;\n this._createTipCheckpointOnPush = false;\n\n HubMock._iTwinId = undefined;\n for (const hub of this.hubs)\n hub[1].cleanup();\n\n this.hubs.clear();\n IModelJsFs.purgeDirSync(this.mockRoot);\n IModelJsFs.removeSync(this.mockRoot);\n IModelHost[_setHubAccess](this._saveHubAccess);\n this.mockRoot = undefined;\n }\n\n public static findLocalHub(iModelId: GuidString): LocalHub {\n const hub = this.hubs.get(iModelId);\n if (!hub)\n throw new Error(`local hub for iModel ${iModelId} not created`);\n return hub;\n }\n\n /** create a [[LocalHub]] for an iModel. */\n public static async createNewIModel(arg: CreateNewIModelProps): Promise<GuidString> {\n wasStarted(this.mockRoot);\n const props = { ...arg, iModelId: Guid.createValue() };\n const mock = new LocalHub(join(this.mockRoot, props.iModelId), props);\n this.hubs.set(props.iModelId, mock);\n return props.iModelId;\n }\n\n /** remove the [[LocalHub]] for an iModel */\n public static destroy(iModelId: GuidString) {\n this.findLocalHub(iModelId).cleanup();\n this.hubs.delete(iModelId);\n }\n\n /** All methods below are mocks of the [[BackendHubAccess]] interface */\n\n public static async getChangesetFromNamedVersion(arg: IModelIdArg & { versionName: string }): Promise<ChangesetProps> {\n return this.findLocalHub(arg.iModelId).findNamedVersion(arg.versionName);\n }\n\n private static changesetIndexFromArg(arg: ChangesetArg) {\n return (undefined !== arg.changeset.index) ? arg.changeset.index : this.findLocalHub(arg.iModelId).getChangesetIndex(arg.changeset.id);\n }\n\n public static async getChangesetFromVersion(arg: IModelIdArg & { version: IModelVersion }): Promise<ChangesetProps> {\n const hub = this.findLocalHub(arg.iModelId);\n const version = arg.version;\n if (version.isFirst)\n return hub.getChangesetByIndex(0);\n\n const asOf = version.getAsOfChangeSet();\n if (asOf)\n return hub.getChangesetById(asOf);\n\n const versionName = version.getName();\n if (versionName)\n return hub.findNamedVersion(versionName);\n\n return hub.getLatestChangeset();\n }\n\n public static async getLatestChangeset(arg: IModelIdArg): Promise<ChangesetProps> {\n return this.findLocalHub(arg.iModelId).getLatestChangeset();\n }\n\n private static async getAccessToken(arg: TokenArg) {\n return arg.accessToken ?? await IModelHost.getAccessToken();\n }\n\n public static async getMyBriefcaseIds(arg: IModelIdArg): Promise<number[]> {\n const accessToken = await this.getAccessToken(arg);\n return this.findLocalHub(arg.iModelId).getBriefcaseIds(accessToken);\n }\n\n public static async acquireNewBriefcaseId(arg: AcquireNewBriefcaseIdArg): Promise<number> {\n const accessToken = await this.getAccessToken(arg);\n return this.findLocalHub(arg.iModelId).acquireNewBriefcaseId(accessToken, arg.briefcaseAlias);\n }\n\n /** Release a briefcaseId. After this call it is illegal to generate changesets for the released briefcaseId. */\n public static async releaseBriefcase(arg: BriefcaseIdArg): Promise<void> {\n return this.findLocalHub(arg.iModelId).releaseBriefcaseId(arg.briefcaseId);\n }\n\n public static async downloadChangeset(arg: DownloadChangesetArg): Promise<ChangesetFileProps> {\n const changesetProps = this.findLocalHub(arg.iModelId).downloadChangeset({ index: this.changesetIndexFromArg(arg), targetDir: arg.targetDir });\n\n if (arg.progressCallback) {\n const totalSize = IModelJsFs.lstatSync(changesetProps.pathname)?.size;\n if (totalSize)\n await HubMock.mockProgressReporting(arg.progressCallback, totalSize);\n }\n\n return changesetProps;\n }\n\n public static async downloadChangesets(arg: DownloadChangesetRangeArg): Promise<ChangesetFileProps[]> {\n const changesetProps = this.findLocalHub(arg.iModelId).downloadChangesets({ range: arg.range, targetDir: arg.targetDir });\n\n if (arg.progressCallback) {\n const totalSize = changesetProps.reduce((sum, props) => sum + (IModelJsFs.lstatSync(props.pathname)?.size ?? 0), 0);\n await HubMock.mockProgressReporting(arg.progressCallback, totalSize);\n }\n\n return changesetProps;\n }\n\n public static async queryChangeset(arg: ChangesetArg): Promise<ChangesetProps> {\n return this.findLocalHub(arg.iModelId).getChangesetByIndex(this.changesetIndexFromArg(arg));\n }\n\n public static async queryChangesets(arg: IModelIdArg & { range?: ChangesetRange }): Promise<ChangesetProps[]> {\n return this.findLocalHub(arg.iModelId).queryChangesets(arg.range);\n }\n\n public static async pushChangeset(arg: IModelIdArg & { changesetProps: ChangesetFileProps }): Promise<ChangesetIndex> {\n const csIndex = this.findLocalHub(arg.iModelId).addChangeset(arg.changesetProps);\n if (this._createTipCheckpointOnPush)\n await this.createTipCheckpoint(arg.iModelId);\n return csIndex;\n }\n\n /**\n * Build and upload a V1 checkpoint at the current tip changeset of the given iModel.\n *\n * The checkpoint is constructed by copying the nearest prior checkpoint from [[LocalHub]] as a\n * starting base, then applying all subsequent changesets forward to the latest index via\n * [[BriefcaseManager.pullAndApplyChangesets]]. The result is registered in [[LocalHub]] so that\n * [[V2CheckpointManager]] (mock path) can serve it to consumers.\n *\n * When [[HubMockStartupOptions.createTipCheckpointOnPush]] is `true` this is called automatically\n * after every successful [[pushChangeset]]. Tests can also call it explicitly to create a single\n * checkpoint at the tip after all changesets have been pushed.\n */\n public static async createTipCheckpoint(iModelId: GuidString): Promise<void> {\n const hub = this.findLocalHub(iModelId);\n const csIndex = hub.latestChangesetIndex;\n // Find the nearest checkpoint that precedes the new tip and use it as the base.\n const prevIndex = hub.queryPreviousCheckpoint(csIndex);\n const prevCheckpointFile = join(hub.checkpointDir, hub.checkpointNameFromIndex(prevIndex));\n const tempFile = join(hub.rootDir, `checkpoint-building-${csIndex}.bim`);\n IModelJsFs.copySync(prevCheckpointFile, tempFile);\n try {\n const db = SnapshotDb.openForApplyChangesets(tempFile);\n try {\n await BriefcaseManager.pullAndApplyChangesets(db, { accessToken: \"\", toIndex: csIndex });\n db[_nativeDb].saveChanges();\n } finally {\n db.close();\n }\n\n hub.uploadCheckpoint({ changesetIndex: csIndex, localFile: tempFile });\n } finally {\n if (IModelJsFs.existsSync(tempFile))\n IModelJsFs.removeSync(tempFile);\n }\n }\n\n public static async queryV2Checkpoint(arg: CheckpointProps): Promise<V2CheckpointAccessProps | undefined> {\n return {\n accountName: \"none\",\n sasToken: \"none\",\n containerId: Guid.createValue(),\n dbName: `${arg.changeset.index ?? 0}.bim`,\n storageType: \"mock\",\n isMock: true,\n checkpoint: arg,\n } as V2CheckpointAccessProps;\n }\n\n public static async releaseAllLocks(arg: BriefcaseDbArg) {\n const hub = this.findLocalHub(arg.iModelId);\n hub.releaseAllLocks({ briefcaseId: arg.briefcaseId, changesetIndex: hub.getIndexFromChangeset(arg.changeset) });\n }\n\n public static async abandonAllLocks(arg: BriefcaseIdArg): Promise<void> {\n const hub = this.findLocalHub(arg.iModelId);\n hub.abandonAllLocks(arg);\n }\n\n public static async queryAllLocks(_arg: BriefcaseDbArg): Promise<LockProps[]> {\n return [];\n }\n\n public static async acquireLocks(arg: BriefcaseDbArg, locks: LockMap): Promise<void> {\n this.findLocalHub(arg.iModelId).acquireLocks(locks, arg);\n }\n\n public static async abandonLocks(arg: BriefcaseIdArg, locks: LockMap): Promise<void> {\n this.findLocalHub(arg.iModelId).abandonLocks(locks, arg);\n }\n\n public static async queryIModelByName(arg: IModelNameArg): Promise<GuidString | undefined> {\n for (const hub of this.hubs) {\n const localHub = hub[1];\n if (localHub.iTwinId === arg.iTwinId && localHub.iModelName === arg.iModelName)\n return localHub.iModelId;\n }\n return undefined;\n }\n\n public static async deleteIModel(arg: IModelIdArg & { iTwinId: GuidString }): Promise<void> {\n return this.destroy(arg.iModelId);\n }\n\n private static async mockProgressReporting(progressCallback: ProgressFunction, totalSize: number): Promise<void> {\n await new Promise((resolve, reject) => {\n let rejected = false;\n\n const mockProgress = (index: number) => {\n const bytesDownloaded = Math.floor(totalSize * (index / 4));\n if (!rejected && progressCallback(bytesDownloaded, totalSize) === ProgressStatus.Abort) {\n rejected = true;\n reject(new Error(\"AbortError\"));\n }\n };\n\n mockProgress(1);\n setTimeout(() => mockProgress(2), 50);\n setTimeout(() => mockProgress(3), 100);\n setTimeout(() => {\n mockProgress(4);\n resolve(undefined);\n }, 150);\n });\n }\n}\n"]}