@itwin/core-backend 5.9.0-dev.1 → 5.9.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 (752) hide show
  1. package/CHANGELOG.md +30 -1
  2. package/lib/cjs/BackendHubAccess.d.ts +38 -0
  3. package/lib/cjs/BackendHubAccess.d.ts.map +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 +3 -3
  9. package/lib/cjs/BriefcaseManager.js.map +1 -1
  10. package/lib/cjs/CatalogDb.js.map +1 -1
  11. package/lib/cjs/Category.d.ts +37 -7
  12. package/lib/cjs/Category.d.ts.map +1 -1
  13. package/lib/cjs/Category.js +33 -42
  14. package/lib/cjs/Category.js.map +1 -1
  15. package/lib/cjs/ChangeSummaryManager.js +2 -2
  16. package/lib/cjs/ChangeSummaryManager.js.map +1 -1
  17. package/lib/cjs/ChangedElementsDb.js.map +1 -1
  18. package/lib/cjs/ChangesetECAdaptor.d.ts.map +1 -1
  19. package/lib/cjs/ChangesetECAdaptor.js +253 -250
  20. package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
  21. package/lib/cjs/ChannelControl.d.ts +29 -0
  22. package/lib/cjs/ChannelControl.d.ts.map +1 -1
  23. package/lib/cjs/ChannelControl.js.map +1 -1
  24. package/lib/cjs/CheckpointManager.js +1 -1
  25. package/lib/cjs/CheckpointManager.js.map +1 -1
  26. package/lib/cjs/ClassRegistry.js +5 -5
  27. package/lib/cjs/ClassRegistry.js.map +1 -1
  28. package/lib/cjs/CloudSqlite.d.ts +1 -1
  29. package/lib/cjs/CloudSqlite.d.ts.map +1 -1
  30. package/lib/cjs/CloudSqlite.js +68 -13
  31. package/lib/cjs/CloudSqlite.js.map +1 -1
  32. package/lib/cjs/CodeService.js.map +1 -1
  33. package/lib/cjs/CodeSpecs.d.ts +32 -3
  34. package/lib/cjs/CodeSpecs.d.ts.map +1 -1
  35. package/lib/cjs/CodeSpecs.js +48 -20
  36. package/lib/cjs/CodeSpecs.js.map +1 -1
  37. package/lib/cjs/ConcurrentQuery.js.map +1 -1
  38. package/lib/cjs/CustomViewState3dCreator.js.map +1 -1
  39. package/lib/cjs/DevTools.js.map +1 -1
  40. package/lib/cjs/DisplayStyle.d.ts +18 -3
  41. package/lib/cjs/DisplayStyle.d.ts.map +1 -1
  42. package/lib/cjs/DisplayStyle.js +10 -21
  43. package/lib/cjs/DisplayStyle.js.map +1 -1
  44. package/lib/cjs/ECDb.js.map +1 -1
  45. package/lib/cjs/ECSchemaXmlContext.js.map +1 -1
  46. package/lib/cjs/ECSqlRowExecutor.js.map +1 -1
  47. package/lib/cjs/ECSqlStatement.js.map +1 -1
  48. package/lib/cjs/ECSqlSyncReader.js.map +1 -1
  49. package/lib/cjs/EditTxn.d.ts +262 -0
  50. package/lib/cjs/EditTxn.d.ts.map +1 -0
  51. package/lib/cjs/EditTxn.js +548 -0
  52. package/lib/cjs/EditTxn.js.map +1 -0
  53. package/lib/cjs/Element.d.ts +74 -5
  54. package/lib/cjs/Element.d.ts.map +1 -1
  55. package/lib/cjs/Element.js +63 -75
  56. package/lib/cjs/Element.js.map +1 -1
  57. package/lib/cjs/ElementAspect.d.ts +10 -0
  58. package/lib/cjs/ElementAspect.d.ts.map +1 -1
  59. package/lib/cjs/ElementAspect.js +21 -12
  60. package/lib/cjs/ElementAspect.js.map +1 -1
  61. package/lib/cjs/ElementGraphics.js.map +1 -1
  62. package/lib/cjs/ElementTreeWalker.d.ts +56 -3
  63. package/lib/cjs/ElementTreeWalker.d.ts.map +1 -1
  64. package/lib/cjs/ElementTreeWalker.js +53 -40
  65. package/lib/cjs/ElementTreeWalker.js.map +1 -1
  66. package/lib/cjs/Entity.js.map +1 -1
  67. package/lib/cjs/EntityReferences.js.map +1 -1
  68. package/lib/cjs/ExportGraphics.js.map +1 -1
  69. package/lib/cjs/ExternalSource.d.ts +11 -2
  70. package/lib/cjs/ExternalSource.d.ts.map +1 -1
  71. package/lib/cjs/ExternalSource.js +10 -8
  72. package/lib/cjs/ExternalSource.js.map +1 -1
  73. package/lib/cjs/FontFile.js.map +1 -1
  74. package/lib/cjs/GeoCoordConfig.js.map +1 -1
  75. package/lib/cjs/GeographicCRSServices.js.map +1 -1
  76. package/lib/cjs/GeometrySummary.js +47 -47
  77. package/lib/cjs/GeometrySummary.js.map +1 -1
  78. package/lib/cjs/IModelDb.d.ts +74 -23
  79. package/lib/cjs/IModelDb.d.ts.map +1 -1
  80. package/lib/cjs/IModelDb.js +193 -297
  81. package/lib/cjs/IModelDb.js.map +1 -1
  82. package/lib/cjs/IModelDbFonts.js.map +1 -1
  83. package/lib/cjs/IModelElementCloneContext.js.map +1 -1
  84. package/lib/cjs/IModelHost.d.ts +58 -1
  85. package/lib/cjs/IModelHost.d.ts.map +1 -1
  86. package/lib/cjs/IModelHost.js +89 -0
  87. package/lib/cjs/IModelHost.js.map +1 -1
  88. package/lib/cjs/IModelIncrementalSchemaLocater.js.map +1 -1
  89. package/lib/cjs/IModelJsFs.js.map +1 -1
  90. package/lib/cjs/ImageSourceConversion.js.map +1 -1
  91. package/lib/cjs/IpcHost.d.ts.map +1 -1
  92. package/lib/cjs/IpcHost.js +35 -15
  93. package/lib/cjs/IpcHost.js.map +1 -1
  94. package/lib/cjs/LineStyle.d.ts +47 -7
  95. package/lib/cjs/LineStyle.d.ts.map +1 -1
  96. package/lib/cjs/LineStyle.js +38 -33
  97. package/lib/cjs/LineStyle.js.map +1 -1
  98. package/lib/cjs/LocalHub.js +1 -1
  99. package/lib/cjs/LocalHub.js.map +1 -1
  100. package/lib/cjs/LocalhostIpcHost.js.map +1 -1
  101. package/lib/cjs/LockControl.d.ts +85 -1
  102. package/lib/cjs/LockControl.d.ts.map +1 -1
  103. package/lib/cjs/LockControl.js.map +1 -1
  104. package/lib/cjs/Material.d.ts +8 -1
  105. package/lib/cjs/Material.d.ts.map +1 -1
  106. package/lib/cjs/Material.js +6 -12
  107. package/lib/cjs/Material.js.map +1 -1
  108. package/lib/cjs/Model.d.ts +59 -20
  109. package/lib/cjs/Model.d.ts.map +1 -1
  110. package/lib/cjs/Model.js +38 -80
  111. package/lib/cjs/Model.js.map +1 -1
  112. package/lib/cjs/NativeAppStorage.js.map +1 -1
  113. package/lib/cjs/NativeHost.js.map +1 -1
  114. package/lib/cjs/NavigationRelationship.js.map +1 -1
  115. package/lib/cjs/PromiseMemoizer.js.map +1 -1
  116. package/lib/cjs/PropertyStore.js.map +1 -1
  117. package/lib/cjs/Relationship.d.ts +72 -7
  118. package/lib/cjs/Relationship.d.ts.map +1 -1
  119. package/lib/cjs/Relationship.js +39 -21
  120. package/lib/cjs/Relationship.js.map +1 -1
  121. package/lib/cjs/RpcBackend.js.map +1 -1
  122. package/lib/cjs/SQLiteDb.js.map +1 -1
  123. package/lib/cjs/Schema.js.map +1 -1
  124. package/lib/cjs/SchemaSync.js +4 -4
  125. package/lib/cjs/SchemaSync.js.map +1 -1
  126. package/lib/cjs/SchemaUtils.js.map +1 -1
  127. package/lib/cjs/SheetIndex.d.ts +9 -0
  128. package/lib/cjs/SheetIndex.d.ts.map +1 -1
  129. package/lib/cjs/SheetIndex.js +38 -35
  130. package/lib/cjs/SheetIndex.js.map +1 -1
  131. package/lib/cjs/SqliteChangesetReader.js.map +1 -1
  132. package/lib/cjs/SqliteStatement.js.map +1 -1
  133. package/lib/cjs/StashManager.js +1 -1
  134. package/lib/cjs/StashManager.js.map +1 -1
  135. package/lib/cjs/Texture.d.ts +6 -0
  136. package/lib/cjs/Texture.d.ts.map +1 -1
  137. package/lib/cjs/Texture.js +6 -14
  138. package/lib/cjs/Texture.js.map +1 -1
  139. package/lib/cjs/TileStorage.js.map +1 -1
  140. package/lib/cjs/TxnManager.d.ts +105 -9
  141. package/lib/cjs/TxnManager.d.ts.map +1 -1
  142. package/lib/cjs/TxnManager.js +194 -15
  143. package/lib/cjs/TxnManager.js.map +1 -1
  144. package/lib/cjs/ViewDefinition.d.ts +21 -1
  145. package/lib/cjs/ViewDefinition.d.ts.map +1 -1
  146. package/lib/cjs/ViewDefinition.js +27 -66
  147. package/lib/cjs/ViewDefinition.js.map +1 -1
  148. package/lib/cjs/ViewStateHydrator.js.map +1 -1
  149. package/lib/cjs/ViewStore.js.map +1 -1
  150. package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts +14 -6
  151. package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
  152. package/lib/cjs/annotations/ElementDrivesTextAnnotation.js +33 -27
  153. package/lib/cjs/annotations/ElementDrivesTextAnnotation.js.map +1 -1
  154. package/lib/cjs/annotations/FrameGeometry.js.map +1 -1
  155. package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
  156. package/lib/cjs/annotations/TextAnnotationElement.d.ts.map +1 -1
  157. package/lib/cjs/annotations/TextAnnotationElement.js +6 -5
  158. package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
  159. package/lib/cjs/annotations/TextAnnotationGeometry.js.map +1 -1
  160. package/lib/cjs/annotations/TextBlockGeometry.js.map +1 -1
  161. package/lib/cjs/annotations/TextBlockLayout.js.map +1 -1
  162. package/lib/cjs/assets/IModelChange.02.00.00.ecschema.xml +90 -90
  163. package/lib/cjs/assets/Settings/Schemas/Base.Schema.json +32 -32
  164. package/lib/cjs/assets/Settings/Schemas/Gcs.schema.json +27 -27
  165. package/lib/cjs/assets/Settings/Schemas/Workspace.Schema.json +94 -94
  166. package/lib/cjs/assets/Settings/backend.setting.json5 +21 -21
  167. package/lib/cjs/core-backend.d.ts +1 -0
  168. package/lib/cjs/core-backend.d.ts.map +1 -1
  169. package/lib/cjs/core-backend.js +1 -0
  170. package/lib/cjs/core-backend.js.map +1 -1
  171. package/lib/cjs/domains/FunctionalElements.d.ts +6 -2
  172. package/lib/cjs/domains/FunctionalElements.d.ts.map +1 -1
  173. package/lib/cjs/domains/FunctionalElements.js +8 -13
  174. package/lib/cjs/domains/FunctionalElements.js.map +1 -1
  175. package/lib/cjs/domains/FunctionalSchema.js.map +1 -1
  176. package/lib/cjs/domains/GenericElements.d.ts +11 -4
  177. package/lib/cjs/domains/GenericElements.d.ts.map +1 -1
  178. package/lib/cjs/domains/GenericElements.js +13 -24
  179. package/lib/cjs/domains/GenericElements.js.map +1 -1
  180. package/lib/cjs/domains/GenericSchema.js.map +1 -1
  181. package/lib/cjs/internal/ChangesetConflictArgs.js.map +1 -1
  182. package/lib/cjs/internal/ChannelAdmin.d.ts +15 -0
  183. package/lib/cjs/internal/ChannelAdmin.d.ts.map +1 -1
  184. package/lib/cjs/internal/ChannelAdmin.js +5 -3
  185. package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
  186. package/lib/cjs/internal/ElementLRUCache.js.map +1 -1
  187. package/lib/cjs/internal/FontFileImpl.js.map +1 -1
  188. package/lib/cjs/internal/HubMock.d.ts +2 -0
  189. package/lib/cjs/internal/HubMock.d.ts.map +1 -1
  190. package/lib/cjs/internal/HubMock.js +7 -0
  191. package/lib/cjs/internal/HubMock.js.map +1 -1
  192. package/lib/cjs/internal/IModelDbFontsImpl.js.map +1 -1
  193. package/lib/cjs/internal/IntegrityCheck.js.map +1 -1
  194. package/lib/cjs/internal/NativePlatform.js.map +1 -1
  195. package/lib/cjs/internal/NoLocks.d.ts.map +1 -1
  196. package/lib/cjs/internal/NoLocks.js +6 -0
  197. package/lib/cjs/internal/NoLocks.js.map +1 -1
  198. package/lib/cjs/internal/OnlineStatus.js.map +1 -1
  199. package/lib/cjs/internal/ServerBasedLocks.d.ts +12 -0
  200. package/lib/cjs/internal/ServerBasedLocks.d.ts.map +1 -1
  201. package/lib/cjs/internal/ServerBasedLocks.js +285 -4
  202. package/lib/cjs/internal/ServerBasedLocks.js.map +1 -1
  203. package/lib/cjs/internal/Symbols.d.ts +4 -0
  204. package/lib/cjs/internal/Symbols.d.ts.map +1 -1
  205. package/lib/cjs/internal/Symbols.js +5 -1
  206. package/lib/cjs/internal/Symbols.js.map +1 -1
  207. package/lib/cjs/internal/annotations/fields.d.ts +3 -2
  208. package/lib/cjs/internal/annotations/fields.d.ts.map +1 -1
  209. package/lib/cjs/internal/annotations/fields.js +7 -6
  210. package/lib/cjs/internal/annotations/fields.js.map +1 -1
  211. package/lib/cjs/internal/cross-package.js.map +1 -1
  212. package/lib/cjs/internal/workspace/SettingsEditorImpl.d.ts +18 -3
  213. package/lib/cjs/internal/workspace/SettingsEditorImpl.d.ts.map +1 -1
  214. package/lib/cjs/internal/workspace/SettingsEditorImpl.js +49 -242
  215. package/lib/cjs/internal/workspace/SettingsEditorImpl.js.map +1 -1
  216. package/lib/cjs/internal/workspace/SettingsImpl.d.ts.map +1 -1
  217. package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
  218. package/lib/cjs/internal/workspace/SettingsSchemasImpl.js.map +1 -1
  219. package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts +0 -1
  220. package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
  221. package/lib/cjs/internal/workspace/WorkspaceImpl.js +70 -41
  222. package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
  223. package/lib/cjs/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
  224. package/lib/cjs/rpc/multipart.js.map +1 -1
  225. package/lib/cjs/rpc/tracing.js.map +1 -1
  226. package/lib/cjs/rpc/web/logging.js.map +1 -1
  227. package/lib/cjs/rpc/web/request.js.map +1 -1
  228. package/lib/cjs/rpc/web/response.js.map +1 -1
  229. package/lib/cjs/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  230. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  231. package/lib/cjs/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  232. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.d.ts.map +1 -1
  233. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  234. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  235. package/lib/cjs/workspace/Settings.d.ts +11 -5
  236. package/lib/cjs/workspace/Settings.d.ts.map +1 -1
  237. package/lib/cjs/workspace/Settings.js.map +1 -1
  238. package/lib/cjs/workspace/SettingsDb.d.ts +20 -99
  239. package/lib/cjs/workspace/SettingsDb.d.ts.map +1 -1
  240. package/lib/cjs/workspace/SettingsDb.js +23 -7
  241. package/lib/cjs/workspace/SettingsDb.js.map +1 -1
  242. package/lib/cjs/workspace/SettingsEditor.d.ts +40 -226
  243. package/lib/cjs/workspace/SettingsEditor.d.ts.map +1 -1
  244. package/lib/cjs/workspace/SettingsEditor.js +86 -25
  245. package/lib/cjs/workspace/SettingsEditor.js.map +1 -1
  246. package/lib/cjs/workspace/SettingsSchemas.js.map +1 -1
  247. package/lib/cjs/workspace/Workspace.d.ts +7 -11
  248. package/lib/cjs/workspace/Workspace.d.ts.map +1 -1
  249. package/lib/cjs/workspace/Workspace.js.map +1 -1
  250. package/lib/cjs/workspace/WorkspaceEditor.d.ts +14 -0
  251. package/lib/cjs/workspace/WorkspaceEditor.d.ts.map +1 -1
  252. package/lib/cjs/workspace/WorkspaceEditor.js +1 -1
  253. package/lib/cjs/workspace/WorkspaceEditor.js.map +1 -1
  254. package/lib/esm/BackendHubAccess.d.ts +38 -0
  255. package/lib/esm/BackendHubAccess.d.ts.map +1 -1
  256. package/lib/esm/BackendHubAccess.js.map +1 -1
  257. package/lib/esm/BackendLoggerCategory.js.map +1 -1
  258. package/lib/esm/BisCoreSchema.js.map +1 -1
  259. package/lib/esm/BlobContainerService.js.map +1 -1
  260. package/lib/esm/BriefcaseManager.js +3 -3
  261. package/lib/esm/BriefcaseManager.js.map +1 -1
  262. package/lib/esm/CatalogDb.js.map +1 -1
  263. package/lib/esm/Category.d.ts +37 -7
  264. package/lib/esm/Category.d.ts.map +1 -1
  265. package/lib/esm/Category.js +33 -42
  266. package/lib/esm/Category.js.map +1 -1
  267. package/lib/esm/ChangeSummaryManager.js +2 -2
  268. package/lib/esm/ChangeSummaryManager.js.map +1 -1
  269. package/lib/esm/ChangedElementsDb.js.map +1 -1
  270. package/lib/esm/ChangesetECAdaptor.d.ts.map +1 -1
  271. package/lib/esm/ChangesetECAdaptor.js +253 -250
  272. package/lib/esm/ChangesetECAdaptor.js.map +1 -1
  273. package/lib/esm/ChannelControl.d.ts +29 -0
  274. package/lib/esm/ChannelControl.d.ts.map +1 -1
  275. package/lib/esm/ChannelControl.js.map +1 -1
  276. package/lib/esm/CheckpointManager.js +1 -1
  277. package/lib/esm/CheckpointManager.js.map +1 -1
  278. package/lib/esm/ClassRegistry.js +5 -5
  279. package/lib/esm/ClassRegistry.js.map +1 -1
  280. package/lib/esm/CloudSqlite.d.ts +1 -1
  281. package/lib/esm/CloudSqlite.d.ts.map +1 -1
  282. package/lib/esm/CloudSqlite.js +69 -14
  283. package/lib/esm/CloudSqlite.js.map +1 -1
  284. package/lib/esm/CodeService.js.map +1 -1
  285. package/lib/esm/CodeSpecs.d.ts +32 -3
  286. package/lib/esm/CodeSpecs.d.ts.map +1 -1
  287. package/lib/esm/CodeSpecs.js +49 -21
  288. package/lib/esm/CodeSpecs.js.map +1 -1
  289. package/lib/esm/ConcurrentQuery.js.map +1 -1
  290. package/lib/esm/CustomViewState3dCreator.js.map +1 -1
  291. package/lib/esm/DevTools.js.map +1 -1
  292. package/lib/esm/DisplayStyle.d.ts +18 -3
  293. package/lib/esm/DisplayStyle.d.ts.map +1 -1
  294. package/lib/esm/DisplayStyle.js +10 -21
  295. package/lib/esm/DisplayStyle.js.map +1 -1
  296. package/lib/esm/ECDb.js.map +1 -1
  297. package/lib/esm/ECSchemaXmlContext.js.map +1 -1
  298. package/lib/esm/ECSqlRowExecutor.js.map +1 -1
  299. package/lib/esm/ECSqlStatement.js.map +1 -1
  300. package/lib/esm/ECSqlSyncReader.js.map +1 -1
  301. package/lib/esm/EditTxn.d.ts +262 -0
  302. package/lib/esm/EditTxn.d.ts.map +1 -0
  303. package/lib/esm/EditTxn.js +543 -0
  304. package/lib/esm/EditTxn.js.map +1 -0
  305. package/lib/esm/Element.d.ts +74 -5
  306. package/lib/esm/Element.d.ts.map +1 -1
  307. package/lib/esm/Element.js +64 -76
  308. package/lib/esm/Element.js.map +1 -1
  309. package/lib/esm/ElementAspect.d.ts +10 -0
  310. package/lib/esm/ElementAspect.d.ts.map +1 -1
  311. package/lib/esm/ElementAspect.js +22 -13
  312. package/lib/esm/ElementAspect.js.map +1 -1
  313. package/lib/esm/ElementGraphics.js.map +1 -1
  314. package/lib/esm/ElementTreeWalker.d.ts +56 -3
  315. package/lib/esm/ElementTreeWalker.d.ts.map +1 -1
  316. package/lib/esm/ElementTreeWalker.js +53 -40
  317. package/lib/esm/ElementTreeWalker.js.map +1 -1
  318. package/lib/esm/Entity.js.map +1 -1
  319. package/lib/esm/EntityReferences.js.map +1 -1
  320. package/lib/esm/ExportGraphics.js.map +1 -1
  321. package/lib/esm/ExternalSource.d.ts +11 -2
  322. package/lib/esm/ExternalSource.d.ts.map +1 -1
  323. package/lib/esm/ExternalSource.js +10 -8
  324. package/lib/esm/ExternalSource.js.map +1 -1
  325. package/lib/esm/FontFile.js.map +1 -1
  326. package/lib/esm/GeoCoordConfig.js.map +1 -1
  327. package/lib/esm/GeographicCRSServices.js.map +1 -1
  328. package/lib/esm/GeometrySummary.js +47 -47
  329. package/lib/esm/GeometrySummary.js.map +1 -1
  330. package/lib/esm/IModelDb.d.ts +74 -23
  331. package/lib/esm/IModelDb.d.ts.map +1 -1
  332. package/lib/esm/IModelDb.js +195 -299
  333. package/lib/esm/IModelDb.js.map +1 -1
  334. package/lib/esm/IModelDbFonts.js.map +1 -1
  335. package/lib/esm/IModelElementCloneContext.js.map +1 -1
  336. package/lib/esm/IModelHost.d.ts +58 -1
  337. package/lib/esm/IModelHost.d.ts.map +1 -1
  338. package/lib/esm/IModelHost.js +91 -2
  339. package/lib/esm/IModelHost.js.map +1 -1
  340. package/lib/esm/IModelIncrementalSchemaLocater.js.map +1 -1
  341. package/lib/esm/IModelJsFs.js.map +1 -1
  342. package/lib/esm/ImageSourceConversion.js.map +1 -1
  343. package/lib/esm/IpcHost.d.ts.map +1 -1
  344. package/lib/esm/IpcHost.js +36 -16
  345. package/lib/esm/IpcHost.js.map +1 -1
  346. package/lib/esm/LineStyle.d.ts +47 -7
  347. package/lib/esm/LineStyle.d.ts.map +1 -1
  348. package/lib/esm/LineStyle.js +38 -33
  349. package/lib/esm/LineStyle.js.map +1 -1
  350. package/lib/esm/LocalHub.js +1 -1
  351. package/lib/esm/LocalHub.js.map +1 -1
  352. package/lib/esm/LocalhostIpcHost.js.map +1 -1
  353. package/lib/esm/LockControl.d.ts +85 -1
  354. package/lib/esm/LockControl.d.ts.map +1 -1
  355. package/lib/esm/LockControl.js.map +1 -1
  356. package/lib/esm/Material.d.ts +8 -1
  357. package/lib/esm/Material.d.ts.map +1 -1
  358. package/lib/esm/Material.js +6 -12
  359. package/lib/esm/Material.js.map +1 -1
  360. package/lib/esm/Model.d.ts +59 -20
  361. package/lib/esm/Model.d.ts.map +1 -1
  362. package/lib/esm/Model.js +39 -81
  363. package/lib/esm/Model.js.map +1 -1
  364. package/lib/esm/NativeAppStorage.js.map +1 -1
  365. package/lib/esm/NativeHost.js.map +1 -1
  366. package/lib/esm/NavigationRelationship.js.map +1 -1
  367. package/lib/esm/PromiseMemoizer.js.map +1 -1
  368. package/lib/esm/PropertyStore.js.map +1 -1
  369. package/lib/esm/Relationship.d.ts +72 -7
  370. package/lib/esm/Relationship.d.ts.map +1 -1
  371. package/lib/esm/Relationship.js +40 -22
  372. package/lib/esm/Relationship.js.map +1 -1
  373. package/lib/esm/RpcBackend.js.map +1 -1
  374. package/lib/esm/SQLiteDb.js.map +1 -1
  375. package/lib/esm/Schema.js.map +1 -1
  376. package/lib/esm/SchemaSync.js +5 -5
  377. package/lib/esm/SchemaSync.js.map +1 -1
  378. package/lib/esm/SchemaUtils.js.map +1 -1
  379. package/lib/esm/SheetIndex.d.ts +9 -0
  380. package/lib/esm/SheetIndex.d.ts.map +1 -1
  381. package/lib/esm/SheetIndex.js +38 -35
  382. package/lib/esm/SheetIndex.js.map +1 -1
  383. package/lib/esm/SqliteChangesetReader.js.map +1 -1
  384. package/lib/esm/SqliteStatement.js.map +1 -1
  385. package/lib/esm/StashManager.js +1 -1
  386. package/lib/esm/StashManager.js.map +1 -1
  387. package/lib/esm/Texture.d.ts +6 -0
  388. package/lib/esm/Texture.d.ts.map +1 -1
  389. package/lib/esm/Texture.js +6 -14
  390. package/lib/esm/Texture.js.map +1 -1
  391. package/lib/esm/TileStorage.js.map +1 -1
  392. package/lib/esm/TxnManager.d.ts +105 -9
  393. package/lib/esm/TxnManager.d.ts.map +1 -1
  394. package/lib/esm/TxnManager.js +194 -15
  395. package/lib/esm/TxnManager.js.map +1 -1
  396. package/lib/esm/ViewDefinition.d.ts +21 -1
  397. package/lib/esm/ViewDefinition.d.ts.map +1 -1
  398. package/lib/esm/ViewDefinition.js +27 -66
  399. package/lib/esm/ViewDefinition.js.map +1 -1
  400. package/lib/esm/ViewStateHydrator.js.map +1 -1
  401. package/lib/esm/ViewStore.js.map +1 -1
  402. package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts +14 -6
  403. package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
  404. package/lib/esm/annotations/ElementDrivesTextAnnotation.js +33 -27
  405. package/lib/esm/annotations/ElementDrivesTextAnnotation.js.map +1 -1
  406. package/lib/esm/annotations/FrameGeometry.js.map +1 -1
  407. package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
  408. package/lib/esm/annotations/TextAnnotationElement.d.ts.map +1 -1
  409. package/lib/esm/annotations/TextAnnotationElement.js +6 -5
  410. package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
  411. package/lib/esm/annotations/TextAnnotationGeometry.js.map +1 -1
  412. package/lib/esm/annotations/TextBlockGeometry.js.map +1 -1
  413. package/lib/esm/annotations/TextBlockLayout.js.map +1 -1
  414. package/lib/esm/core-backend.d.ts +1 -0
  415. package/lib/esm/core-backend.d.ts.map +1 -1
  416. package/lib/esm/core-backend.js +1 -0
  417. package/lib/esm/core-backend.js.map +1 -1
  418. package/lib/esm/domains/FunctionalElements.d.ts +6 -2
  419. package/lib/esm/domains/FunctionalElements.d.ts.map +1 -1
  420. package/lib/esm/domains/FunctionalElements.js +8 -13
  421. package/lib/esm/domains/FunctionalElements.js.map +1 -1
  422. package/lib/esm/domains/FunctionalSchema.js.map +1 -1
  423. package/lib/esm/domains/GenericElements.d.ts +11 -4
  424. package/lib/esm/domains/GenericElements.d.ts.map +1 -1
  425. package/lib/esm/domains/GenericElements.js +13 -24
  426. package/lib/esm/domains/GenericElements.js.map +1 -1
  427. package/lib/esm/domains/GenericSchema.js.map +1 -1
  428. package/lib/esm/internal/ChangesetConflictArgs.js.map +1 -1
  429. package/lib/esm/internal/ChannelAdmin.d.ts +15 -0
  430. package/lib/esm/internal/ChannelAdmin.d.ts.map +1 -1
  431. package/lib/esm/internal/ChannelAdmin.js +6 -4
  432. package/lib/esm/internal/ChannelAdmin.js.map +1 -1
  433. package/lib/esm/internal/ElementLRUCache.js.map +1 -1
  434. package/lib/esm/internal/FontFileImpl.js.map +1 -1
  435. package/lib/esm/internal/HubMock.d.ts +2 -0
  436. package/lib/esm/internal/HubMock.d.ts.map +1 -1
  437. package/lib/esm/internal/HubMock.js +7 -0
  438. package/lib/esm/internal/HubMock.js.map +1 -1
  439. package/lib/esm/internal/IModelDbFontsImpl.js.map +1 -1
  440. package/lib/esm/internal/IntegrityCheck.js.map +1 -1
  441. package/lib/esm/internal/NativePlatform.js.map +1 -1
  442. package/lib/esm/internal/NoLocks.d.ts.map +1 -1
  443. package/lib/esm/internal/NoLocks.js +6 -0
  444. package/lib/esm/internal/NoLocks.js.map +1 -1
  445. package/lib/esm/internal/OnlineStatus.js.map +1 -1
  446. package/lib/esm/internal/ServerBasedLocks.d.ts +12 -0
  447. package/lib/esm/internal/ServerBasedLocks.d.ts.map +1 -1
  448. package/lib/esm/internal/ServerBasedLocks.js +286 -5
  449. package/lib/esm/internal/ServerBasedLocks.js.map +1 -1
  450. package/lib/esm/internal/Symbols.d.ts +4 -0
  451. package/lib/esm/internal/Symbols.d.ts.map +1 -1
  452. package/lib/esm/internal/Symbols.js +4 -0
  453. package/lib/esm/internal/Symbols.js.map +1 -1
  454. package/lib/esm/internal/annotations/fields.d.ts +3 -2
  455. package/lib/esm/internal/annotations/fields.d.ts.map +1 -1
  456. package/lib/esm/internal/annotations/fields.js +7 -6
  457. package/lib/esm/internal/annotations/fields.js.map +1 -1
  458. package/lib/esm/internal/cross-package.js.map +1 -1
  459. package/lib/esm/internal/workspace/SettingsEditorImpl.d.ts +18 -3
  460. package/lib/esm/internal/workspace/SettingsEditorImpl.d.ts.map +1 -1
  461. package/lib/esm/internal/workspace/SettingsEditorImpl.js +52 -246
  462. package/lib/esm/internal/workspace/SettingsEditorImpl.js.map +1 -1
  463. package/lib/esm/internal/workspace/SettingsImpl.d.ts.map +1 -1
  464. package/lib/esm/internal/workspace/SettingsImpl.js.map +1 -1
  465. package/lib/esm/internal/workspace/SettingsSchemasImpl.js.map +1 -1
  466. package/lib/esm/internal/workspace/WorkspaceImpl.d.ts +0 -1
  467. package/lib/esm/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
  468. package/lib/esm/internal/workspace/WorkspaceImpl.js +71 -41
  469. package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
  470. package/lib/esm/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
  471. package/lib/esm/rpc/multipart.js.map +1 -1
  472. package/lib/esm/rpc/tracing.js.map +1 -1
  473. package/lib/esm/rpc/web/logging.js.map +1 -1
  474. package/lib/esm/rpc/web/request.js.map +1 -1
  475. package/lib/esm/rpc/web/response.js.map +1 -1
  476. package/lib/esm/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  477. package/lib/esm/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  478. package/lib/esm/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  479. package/lib/esm/rpc-impl/RpcBriefcaseUtility.d.ts.map +1 -1
  480. package/lib/esm/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  481. package/lib/esm/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  482. package/lib/esm/test/AdvancedEqual.js.map +1 -1
  483. package/lib/esm/test/AnnotationTestUtils.js.map +1 -1
  484. package/lib/esm/test/AttachDb.test.js +11 -11
  485. package/lib/esm/test/AttachDb.test.js.map +1 -1
  486. package/lib/esm/test/ElementDrivesElement.test.d.ts +20 -19
  487. package/lib/esm/test/ElementDrivesElement.test.d.ts.map +1 -1
  488. package/lib/esm/test/ElementDrivesElement.test.js +134 -119
  489. package/lib/esm/test/ElementDrivesElement.test.js.map +1 -1
  490. package/lib/esm/test/ElementLRUCache.test.js.map +1 -1
  491. package/lib/esm/test/GeometryTestUtil.js.map +1 -1
  492. package/lib/esm/test/IModelHost.test.js +56 -2
  493. package/lib/esm/test/IModelHost.test.js.map +1 -1
  494. package/lib/esm/test/IModelTestUtils.d.ts +23 -23
  495. package/lib/esm/test/IModelTestUtils.d.ts.map +1 -1
  496. package/lib/esm/test/IModelTestUtils.js +466 -449
  497. package/lib/esm/test/IModelTestUtils.js.map +1 -1
  498. package/lib/esm/test/ImageSourceConversion.test.js.map +1 -1
  499. package/lib/esm/test/IpcHost.test.js +112 -0
  500. package/lib/esm/test/IpcHost.test.js.map +1 -1
  501. package/lib/esm/test/KnownTestLocations.js.map +1 -1
  502. package/lib/esm/test/PrintElementTree.js.map +1 -1
  503. package/lib/esm/test/PropertyDb.test.js +2 -2
  504. package/lib/esm/test/PropertyDb.test.js.map +1 -1
  505. package/lib/esm/test/RevisionUtility.js.map +1 -1
  506. package/lib/esm/test/SchemaUtils.test.js +25 -25
  507. package/lib/esm/test/SchemaUtils.test.js.map +1 -1
  508. package/lib/esm/test/SequentialLogMatcher.js.map +1 -1
  509. package/lib/esm/test/SquashSchemaAndDataChanges.test.js +156 -147
  510. package/lib/esm/test/SquashSchemaAndDataChanges.test.js.map +1 -1
  511. package/lib/esm/test/TestChangeSetUtility.d.ts.map +1 -1
  512. package/lib/esm/test/TestChangeSetUtility.js +11 -7
  513. package/lib/esm/test/TestChangeSetUtility.js.map +1 -1
  514. package/lib/esm/test/TestEditTxn.d.ts +8 -0
  515. package/lib/esm/test/TestEditTxn.d.ts.map +1 -0
  516. package/lib/esm/test/TestEditTxn.js +34 -0
  517. package/lib/esm/test/TestEditTxn.js.map +1 -0
  518. package/lib/esm/test/TestUtils.d.ts +1 -0
  519. package/lib/esm/test/TestUtils.d.ts.map +1 -1
  520. package/lib/esm/test/TestUtils.js +8 -1
  521. package/lib/esm/test/TestUtils.js.map +1 -1
  522. package/lib/esm/test/annotations/Fields.test.js +135 -143
  523. package/lib/esm/test/annotations/Fields.test.js.map +1 -1
  524. package/lib/esm/test/annotations/FrameGeometry.test.js.map +1 -1
  525. package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
  526. package/lib/esm/test/annotations/TextAnnotation.test.js +156 -99
  527. package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
  528. package/lib/esm/test/annotations/TextBlock.test.js +5 -3
  529. package/lib/esm/test/annotations/TextBlock.test.js.map +1 -1
  530. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/old.config.js.map +1 -1
  531. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.js.map +1 -1
  532. package/lib/esm/test/categories/Category.test.js +63 -3
  533. package/lib/esm/test/categories/Category.test.js.map +1 -1
  534. package/lib/esm/test/codespec/CodeSpec.test.js +88 -5
  535. package/lib/esm/test/codespec/CodeSpec.test.js.map +1 -1
  536. package/lib/esm/test/ecdb/CTE.test.js +88 -88
  537. package/lib/esm/test/ecdb/CTE.test.js.map +1 -1
  538. package/lib/esm/test/ecdb/ConcurrentQuery.test.js +19 -19
  539. package/lib/esm/test/ecdb/ConcurrentQuery.test.js.map +1 -1
  540. package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js +15 -15
  541. package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js.map +1 -1
  542. package/lib/esm/test/ecdb/ECDb.test.js +72 -72
  543. package/lib/esm/test/ecdb/ECDb.test.js.map +1 -1
  544. package/lib/esm/test/ecdb/ECDbTestHelper.js.map +1 -1
  545. package/lib/esm/test/ecdb/ECSchemaXmlContext.test.js.map +1 -1
  546. package/lib/esm/test/ecdb/ECSqlAst.test.js +68 -67
  547. package/lib/esm/test/ecdb/ECSqlAst.test.js.map +1 -1
  548. package/lib/esm/test/ecdb/ECSqlQuery.test.js +6 -6
  549. package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
  550. package/lib/esm/test/ecdb/ECSqlStatement.test.js +332 -333
  551. package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
  552. package/lib/esm/test/ecdb/ECSqlSyncReader.test.js.map +1 -1
  553. package/lib/esm/test/ecdb/QueryReaders.test.js +47 -44
  554. package/lib/esm/test/ecdb/QueryReaders.test.js.map +1 -1
  555. package/lib/esm/test/ecdb/SqliteStatement.test.js +2 -2
  556. package/lib/esm/test/ecdb/SqliteStatement.test.js.map +1 -1
  557. package/lib/esm/test/ecsql/dataset/ECSqlDatasets.d.ts.map +1 -1
  558. package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js +30 -28
  559. package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js.map +1 -1
  560. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js +21 -21
  561. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js.map +1 -1
  562. package/lib/esm/test/ecsql/src/ECSqlTestParser.js.map +1 -1
  563. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
  564. package/lib/esm/test/element/DeleteDefinitionElements.test.js +159 -143
  565. package/lib/esm/test/element/DeleteDefinitionElements.test.js.map +1 -1
  566. package/lib/esm/test/element/ElementAspect.test.js +90 -82
  567. package/lib/esm/test/element/ElementAspect.test.js.map +1 -1
  568. package/lib/esm/test/element/ElementDependencyGraph.test.d.ts.map +1 -1
  569. package/lib/esm/test/element/ElementDependencyGraph.test.js +51 -43
  570. package/lib/esm/test/element/ElementDependencyGraph.test.js.map +1 -1
  571. package/lib/esm/test/element/ElementRoundTrip.test.js +176 -177
  572. package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
  573. package/lib/esm/test/element/ExcludedElements.test.js +2 -2
  574. package/lib/esm/test/element/ExcludedElements.test.js.map +1 -1
  575. package/lib/esm/test/element/ExternalSource.test.js +40 -38
  576. package/lib/esm/test/element/ExternalSource.test.js.map +1 -1
  577. package/lib/esm/test/element/NullStructArray.test.js +23 -22
  578. package/lib/esm/test/element/NullStructArray.test.js.map +1 -1
  579. package/lib/esm/test/element/ProjectInformationRecord.test.js +5 -2
  580. package/lib/esm/test/element/ProjectInformationRecord.test.js.map +1 -1
  581. package/lib/esm/test/element/SheetInformationAspect.test.js +43 -11
  582. package/lib/esm/test/element/SheetInformationAspect.test.js.map +1 -1
  583. package/lib/esm/test/element/UrlLink.test.js +2 -2
  584. package/lib/esm/test/element/UrlLink.test.js.map +1 -1
  585. package/lib/esm/test/font/FontFile.test.js.map +1 -1
  586. package/lib/esm/test/font/IModelDbFonts.test.js +87 -73
  587. package/lib/esm/test/font/IModelDbFonts.test.js.map +1 -1
  588. package/lib/esm/test/hubaccess/ApplyChangeset.test.js +194 -155
  589. package/lib/esm/test/hubaccess/ApplyChangeset.test.js.map +1 -1
  590. package/lib/esm/test/hubaccess/BriefcaseManager.test.js +2 -4
  591. package/lib/esm/test/hubaccess/BriefcaseManager.test.js.map +1 -1
  592. package/lib/esm/test/hubaccess/CheckpointManager.test.js.map +1 -1
  593. package/lib/esm/test/hubaccess/Rebase.test.js +369 -303
  594. package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -1
  595. package/lib/esm/test/hubaccess/SemanticRebase.test.js +467 -392
  596. package/lib/esm/test/hubaccess/SemanticRebase.test.js.map +1 -1
  597. package/lib/esm/test/imageData.js.map +1 -1
  598. package/lib/esm/test/imodel/Code.test.js +31 -31
  599. package/lib/esm/test/imodel/Code.test.js.map +1 -1
  600. package/lib/esm/test/imodel/ElementTreeWalker.test.js +57 -48
  601. package/lib/esm/test/imodel/ElementTreeWalker.test.js.map +1 -1
  602. package/lib/esm/test/imodel/GetTextureImage.test.js.map +1 -1
  603. package/lib/esm/test/imodel/IModel.test.js +463 -388
  604. package/lib/esm/test/imodel/IModel.test.js.map +1 -1
  605. package/lib/esm/test/imodel/ProjectExtents.test.js +2 -2
  606. package/lib/esm/test/imodel/ProjectExtents.test.js.map +1 -1
  607. package/lib/esm/test/imodel/SchemaXmlImport.test.js +77 -13
  608. package/lib/esm/test/imodel/SchemaXmlImport.test.js.map +1 -1
  609. package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js.map +1 -1
  610. package/lib/esm/test/incrementalSchemaLocater/IncrementalLoading.test.js.map +1 -1
  611. package/lib/esm/test/incrementalSchemaLocater/TestContext.d.ts.map +1 -1
  612. package/lib/esm/test/incrementalSchemaLocater/TestContext.js +2 -2
  613. package/lib/esm/test/incrementalSchemaLocater/TestContext.js.map +1 -1
  614. package/lib/esm/test/index.d.ts +1 -0
  615. package/lib/esm/test/index.d.ts.map +1 -1
  616. package/lib/esm/test/index.js +1 -0
  617. package/lib/esm/test/index.js.map +1 -1
  618. package/lib/esm/test/misc/DevTools.test.js.map +1 -1
  619. package/lib/esm/test/misc/EntitySubClasses.test.js.map +1 -1
  620. package/lib/esm/test/misc/GeoServices.test.js.map +1 -1
  621. package/lib/esm/test/misc/PromiseMemoizer.test.js.map +1 -1
  622. package/lib/esm/test/native/DgnDbWorker.test.js.map +1 -1
  623. package/lib/esm/test/rpc/response.test.js.map +1 -1
  624. package/lib/esm/test/schema/ClassRegistry.test.js +122 -121
  625. package/lib/esm/test/schema/ClassRegistry.test.js.map +1 -1
  626. package/lib/esm/test/schema/FunctionalDomain.test.js +36 -34
  627. package/lib/esm/test/schema/FunctionalDomain.test.js.map +1 -1
  628. package/lib/esm/test/schema/GenericDomain.test.js +114 -94
  629. package/lib/esm/test/schema/GenericDomain.test.js.map +1 -1
  630. package/lib/esm/test/schema/IModelSchemaContext.test.js +11 -10
  631. package/lib/esm/test/schema/IModelSchemaContext.test.js.map +1 -1
  632. package/lib/esm/test/schema/SchemaImportCallbacks.test.js +226 -211
  633. package/lib/esm/test/schema/SchemaImportCallbacks.test.js.map +1 -1
  634. package/lib/esm/test/sheetindex/SheetIndex.test.d.ts +1 -3
  635. package/lib/esm/test/sheetindex/SheetIndex.test.d.ts.map +1 -1
  636. package/lib/esm/test/sheetindex/SheetIndex.test.js +312 -247
  637. package/lib/esm/test/sheetindex/SheetIndex.test.js.map +1 -1
  638. package/lib/esm/test/standalone/ChangeMerge.test.js +101 -82
  639. package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
  640. package/lib/esm/test/standalone/ChangesetReader.test.js +242 -213
  641. package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
  642. package/lib/esm/test/standalone/CustomViewState3dCreator.test.js.map +1 -1
  643. package/lib/esm/test/standalone/DisplayStyle.test.js +43 -40
  644. package/lib/esm/test/standalone/DisplayStyle.test.js.map +1 -1
  645. package/lib/esm/test/standalone/Drawing.test.js +4 -3
  646. package/lib/esm/test/standalone/Drawing.test.js.map +1 -1
  647. package/lib/esm/test/standalone/EditTxn.test.d.ts +2 -0
  648. package/lib/esm/test/standalone/EditTxn.test.d.ts.map +1 -0
  649. package/lib/esm/test/standalone/EditTxn.test.js +219 -0
  650. package/lib/esm/test/standalone/EditTxn.test.js.map +1 -0
  651. package/lib/esm/test/standalone/ElementGraphics.test.js.map +1 -1
  652. package/lib/esm/test/standalone/ElementMesh.test.js +16 -13
  653. package/lib/esm/test/standalone/ElementMesh.test.js.map +1 -1
  654. package/lib/esm/test/standalone/ExportGraphics.test.js +40 -34
  655. package/lib/esm/test/standalone/ExportGraphics.test.js.map +1 -1
  656. package/lib/esm/test/standalone/GeometryChangeEvents.test.js +11 -15
  657. package/lib/esm/test/standalone/GeometryChangeEvents.test.js.map +1 -1
  658. package/lib/esm/test/standalone/GeometryStream.test.js +212 -165
  659. package/lib/esm/test/standalone/GeometryStream.test.js.map +1 -1
  660. package/lib/esm/test/standalone/HubMock.test.js +31 -25
  661. package/lib/esm/test/standalone/HubMock.test.js.map +1 -1
  662. package/lib/esm/test/standalone/IModelLimits.test.js +11 -8
  663. package/lib/esm/test/standalone/IModelLimits.test.js.map +1 -1
  664. package/lib/esm/test/standalone/IModelWrite.test.d.ts +2 -2
  665. package/lib/esm/test/standalone/IModelWrite.test.d.ts.map +1 -1
  666. package/lib/esm/test/standalone/IModelWrite.test.js +211 -169
  667. package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
  668. package/lib/esm/test/standalone/ITwinWorkspace.test.d.ts +2 -0
  669. package/lib/esm/test/standalone/ITwinWorkspace.test.d.ts.map +1 -0
  670. package/lib/esm/test/standalone/ITwinWorkspace.test.js +236 -0
  671. package/lib/esm/test/standalone/ITwinWorkspace.test.js.map +1 -0
  672. package/lib/esm/test/standalone/InlineGeometryPartReferences.test.js +25 -22
  673. package/lib/esm/test/standalone/InlineGeometryPartReferences.test.js.map +1 -1
  674. package/lib/esm/test/standalone/IntegrityCheck.test.js +20 -18
  675. package/lib/esm/test/standalone/IntegrityCheck.test.js.map +1 -1
  676. package/lib/esm/test/standalone/MergeConflict.test.d.ts +2 -2
  677. package/lib/esm/test/standalone/MergeConflict.test.d.ts.map +1 -1
  678. package/lib/esm/test/standalone/MergeConflict.test.js +49 -33
  679. package/lib/esm/test/standalone/MergeConflict.test.js.map +1 -1
  680. package/lib/esm/test/standalone/NativeAppStorage.test.js.map +1 -1
  681. package/lib/esm/test/standalone/RenderMaterialElement.test.js +5 -5
  682. package/lib/esm/test/standalone/RenderMaterialElement.test.js.map +1 -1
  683. package/lib/esm/test/standalone/RenderTimeline.test.js +3 -2
  684. package/lib/esm/test/standalone/RenderTimeline.test.js.map +1 -1
  685. package/lib/esm/test/standalone/SQLiteDb.test.js.map +1 -1
  686. package/lib/esm/test/standalone/SchemaUtils.test.js.map +1 -1
  687. package/lib/esm/test/standalone/SectionDrawing.test.js +7 -7
  688. package/lib/esm/test/standalone/SectionDrawing.test.js.map +1 -1
  689. package/lib/esm/test/standalone/ServerBasedLocks.test.js +928 -22
  690. package/lib/esm/test/standalone/ServerBasedLocks.test.js.map +1 -1
  691. package/lib/esm/test/standalone/Setting.test.js.map +1 -1
  692. package/lib/esm/test/standalone/Settings.test.js +26 -4
  693. package/lib/esm/test/standalone/Settings.test.js.map +1 -1
  694. package/lib/esm/test/standalone/SettingsSchemas.test.js +2 -1
  695. package/lib/esm/test/standalone/SettingsSchemas.test.js.map +1 -1
  696. package/lib/esm/test/standalone/SnapshotDb.test.js +3 -1
  697. package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
  698. package/lib/esm/test/standalone/StandaloneDb.test.js +27 -26
  699. package/lib/esm/test/standalone/StandaloneDb.test.js.map +1 -1
  700. package/lib/esm/test/standalone/Texture.test.js +5 -4
  701. package/lib/esm/test/standalone/Texture.test.js.map +1 -1
  702. package/lib/esm/test/standalone/TileCache.test.d.ts.map +1 -1
  703. package/lib/esm/test/standalone/TileCache.test.js +5 -3
  704. package/lib/esm/test/standalone/TileCache.test.js.map +1 -1
  705. package/lib/esm/test/standalone/TileTree.test.js +35 -31
  706. package/lib/esm/test/standalone/TileTree.test.js.map +1 -1
  707. package/lib/esm/test/standalone/TxnManager.test.js +700 -653
  708. package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
  709. package/lib/esm/test/standalone/ViewDefinition.test.js +295 -229
  710. package/lib/esm/test/standalone/ViewDefinition.test.js.map +1 -1
  711. package/lib/esm/test/standalone/ViewStoreDb.test.js.map +1 -1
  712. package/lib/esm/test/standalone/Workspace.test.js +72 -22
  713. package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
  714. package/lib/esm/test/standalone/iModelDb.test.js.map +1 -1
  715. package/lib/esm/test/workspace/SettingsDb.test.js +28 -456
  716. package/lib/esm/test/workspace/SettingsDb.test.js.map +1 -1
  717. package/lib/esm/workspace/Settings.d.ts +11 -5
  718. package/lib/esm/workspace/Settings.d.ts.map +1 -1
  719. package/lib/esm/workspace/Settings.js.map +1 -1
  720. package/lib/esm/workspace/SettingsDb.d.ts +20 -99
  721. package/lib/esm/workspace/SettingsDb.d.ts.map +1 -1
  722. package/lib/esm/workspace/SettingsDb.js +20 -6
  723. package/lib/esm/workspace/SettingsDb.js.map +1 -1
  724. package/lib/esm/workspace/SettingsEditor.d.ts +40 -226
  725. package/lib/esm/workspace/SettingsEditor.d.ts.map +1 -1
  726. package/lib/esm/workspace/SettingsEditor.js +85 -24
  727. package/lib/esm/workspace/SettingsEditor.js.map +1 -1
  728. package/lib/esm/workspace/SettingsSchemas.js.map +1 -1
  729. package/lib/esm/workspace/Workspace.d.ts +7 -11
  730. package/lib/esm/workspace/Workspace.d.ts.map +1 -1
  731. package/lib/esm/workspace/Workspace.js.map +1 -1
  732. package/lib/esm/workspace/WorkspaceEditor.d.ts +14 -0
  733. package/lib/esm/workspace/WorkspaceEditor.d.ts.map +1 -1
  734. package/lib/esm/workspace/WorkspaceEditor.js +1 -1
  735. package/lib/esm/workspace/WorkspaceEditor.js.map +1 -1
  736. package/package.json +14 -14
  737. package/lib/cjs/internal/workspace/SettingsDbImpl.d.ts +0 -38
  738. package/lib/cjs/internal/workspace/SettingsDbImpl.d.ts.map +0 -1
  739. package/lib/cjs/internal/workspace/SettingsDbImpl.js +0 -108
  740. package/lib/cjs/internal/workspace/SettingsDbImpl.js.map +0 -1
  741. package/lib/cjs/internal/workspace/SettingsSqliteDb.d.ts +0 -14
  742. package/lib/cjs/internal/workspace/SettingsSqliteDb.d.ts.map +0 -1
  743. package/lib/cjs/internal/workspace/SettingsSqliteDb.js +0 -40
  744. package/lib/cjs/internal/workspace/SettingsSqliteDb.js.map +0 -1
  745. package/lib/esm/internal/workspace/SettingsDbImpl.d.ts +0 -38
  746. package/lib/esm/internal/workspace/SettingsDbImpl.d.ts.map +0 -1
  747. package/lib/esm/internal/workspace/SettingsDbImpl.js +0 -104
  748. package/lib/esm/internal/workspace/SettingsDbImpl.js.map +0 -1
  749. package/lib/esm/internal/workspace/SettingsSqliteDb.d.ts +0 -14
  750. package/lib/esm/internal/workspace/SettingsSqliteDb.d.ts.map +0 -1
  751. package/lib/esm/internal/workspace/SettingsSqliteDb.js +0 -36
  752. package/lib/esm/internal/workspace/SettingsSqliteDb.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ServerBasedLocks.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/ServerBasedLocks.test.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,cAAc,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,GAAG,IAAI,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,EAAe,IAAI,EAAc,IAAI,EAAW,MAAM,qBAAqB,CAAC;AACnF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAuB,SAAS,EAAkD,MAAM,oBAAoB,CAAC;AAC/I,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAE/D,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAExE,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAEtE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;AAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;AAC3B,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AAEzB,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,MAAM,cAAc,GAAG,KAAK,IAAI,EAAE;QAChC,MAAM,MAAM,GAAG,eAAe,CAAC,iBAAiB,CAAC,kBAAkB,EAAE,sBAAsB,CAAC,CAAC;QAC7F,MAAM,QAAQ,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAC;QAC/F,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC7C,MAAM,qBAAqB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,qBAAqB,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACjD,QAAQ,CAAC,WAAW,EAAE,CAAC;QACvB,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IAEF,IAAI,QAAoB,CAAC;IACzB,IAAI,YAAyB,CAAC;IAC9B,IAAI,YAAyB,CAAC;IAC9B,IAAI,eAAoC,CAAC;IACzC,IAAI,eAAoC,CAAC;IAEzC,SAAS,CAAC,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC;IAChC,MAAM,CAAC,KAAK,IAAI,EAAE;QAChB,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAElE,MAAM,WAAW,GAAG;YAClB,UAAU,EAAE,mBAAmB;YAC/B,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,QAAQ,EAAE,MAAM,cAAc,EAAE;SACjC,CAAC;QAEF,QAAQ,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QACtD,MAAM,IAAI,GAA6B,EAAE,OAAO,EAAE,WAAW,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC;QAClF,eAAe,GAAG,MAAM,gBAAgB,CAAC,iBAAiB,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;QACnG,eAAe,GAAG,MAAM,gBAAgB,CAAC,iBAAiB,CAAC,EAAE,WAAW,EAAE,aAAa,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IACtG,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,GAAG,EAAE;QACT,OAAO,CAAC,QAAQ,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,MAAM,iBAAiB,GAAG,CAAC,KAAuB,EAAE,GAAY,EAAE,EAAE;QAClE,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YACjC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC;IACF,MAAM,oBAAoB,GAAG,CAAC,KAAuB,EAAE,GAAY,EAAE,EAAE;QACrE,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC9B,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YACjC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC;IACF,MAAM,gBAAgB,GAAG,CAAC,KAAuB,EAAE,MAAc,EAAE,SAAiB,EAAE,EAAE;QACtF,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;QAC3D,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;IACnE,CAAC,CAAC;IAEF,EAAE,CAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE;QAC/B,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,cAAc,CAAC,CAAC;QACjE,IAAI,GAAG,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC;QACzE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACvC,GAAG,CAAC,QAAQ,CAAC,iBAAiB,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;QACjE,IAAI,GAAG,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC;QACzE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAEvC,IAAI,QAAQ,GAAG,GAAG,CAAC,KAAyB,CAAC;QAC7C,IAAI,QAAQ,GAAG,GAAG,CAAC,KAAyB,CAAC;QAC7C,MAAM,MAAM,GAAG,eAAe,CAAC,gBAAgB,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;QACtE,MAAM,MAAM,GAAG,eAAe,CAAC,gBAAgB,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;QACtE,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAkB,MAAM,CAAC,CAAC;QACjE,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAO,CAAC,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC;QAC9B,MAAM,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QACzD,MAAM,SAAS,GAAG,UAAU,CAAC,MAAO,CAAC,EAAE,CAAC;QAExC,MAAM,eAAe,GAAG,qBAAqB,CAAC;QAC9C,MAAM,kBAAkB,GAAG,sBAAsB,CAAC;QAElD,MAAM,GAAG,CAAC,iBAAiB,EAAE,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACnC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACjC,oBAAoB,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,4FAA4F;QAErK,MAAM,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,+GAA+G;QACnK,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAEnC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACpC,MAAM,MAAM,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC,CAAC,YAAY,CAAC,WAAW,EAAE,kBAAkB,EAAE,0BAA0B,CAAC,CAAC;QAChH,MAAM,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QAE7G,MAAM,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACnC,MAAM,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QACvE,gBAAgB,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACjC,iBAAiB,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;QAC7D,oBAAoB,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,iFAAiF;QAE7I,MAAM,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACnC,MAAM,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;QACpD,gBAAgB,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACjC,iBAAiB,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;QAC7D,oBAAoB,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,+EAA+E;QAEpJ,MAAM,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,YAAY,EAAE,CAAC;QACvB,MAAM,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACjD,iBAAiB,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;QAC1F,gBAAgB,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACjC,MAAM,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,wCAAwC;QAC5F,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACnC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAEjC,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,wDAAwD;QAE5F,MAAM,MAAM,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC,CAAC,YAAY,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QACjF,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACnC,MAAM,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QACxG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACnC,MAAM,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAClD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACnC,iBAAiB,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;QAC9D,MAAM,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;QAC7D,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACnC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;QAEjD,gBAAgB,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACjC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAEjC,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QACrC,wFAAwF;QACxF,GAAG,CAAC,KAAK,EAAE,CAAC;QACZ,GAAG,CAAC,KAAK,EAAE,CAAC;QAEZ,GAAG,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrE,GAAG,CAAC,QAAQ,CAAC,iBAAiB,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;QACjE,GAAG,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrE,GAAG,CAAC,QAAQ,CAAC,iBAAiB,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;QAEjE,QAAQ,GAAG,GAAG,CAAC,KAAyB,CAAC;QACzC,QAAQ,GAAG,GAAG,CAAC,KAAyB,CAAC;QAEzC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACjC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAEjC,iBAAiB,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;QAC7E,iBAAiB,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;QACnF,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACvC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;QAEpD,MAAM,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,oEAAoE;QACxG,gBAAgB,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAEjC,MAAM,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QAC/H,gBAAgB,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,oFAAoF;QACtH,MAAM,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,qCAAqC;QACtG,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,mBAAmB;QACxE,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,4DAA4D;QAC/G,gBAAgB,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAEjC,MAAM,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACnC,MAAM,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,YAAY,EAAE,CAAC;QAEvB,MAAM,aAAa,GAAyB;YAC1C,aAAa,EAAE,cAAc,CAAC,aAAa;YAC3C,KAAK,EAAE,OAAO;YACd,MAAM,EAAE,IAAI,wBAAwB,CAAC,QAAQ,CAAC;YAC9C,QAAQ,EAAE,WAAW,CAAC,QAAQ;YAC9B,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE;SACzB,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,aAAa,CAAC,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC,uCAAuC;QACnI,MAAM,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,qCAAqC;QACxF,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;QAC1D,oBAAoB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAExC,WAAW,CAAC,SAAS,GAAG,gBAAgB,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,gBAAgB,CAAC,CAAC;QAC/E,MAAM,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QACnD,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QACxC,GAAG,CAAC,WAAW,EAAE,CAAC;QAElB,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,6BAA6B;QACjE,GAAG,CAAC,cAAc,EAAE,CAAC;QAErB,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAEnE,MAAM,GAAG,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC;QAEhF,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAEpE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,gDAAgD;QAC3H,MAAM,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC,CAAC,kDAAkD;QAE5J,MAAM,GAAG,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC;QACrD,MAAM,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACnE,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAkB,MAAM,CAAC,CAAC;QAElE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;QACxD,MAAM,GAAG,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;QAClC,MAAM,GAAG,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;QAClC,GAAG,CAAC,KAAK,EAAE,CAAC;QACZ,GAAG,CAAC,KAAK,EAAE,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,IAAI,EAAe,CAAC;QACpB,IAAI,KAAuB,CAAC;QAC5B,IAAI,MAAc,CAAC;QAEnB,UAAU,CAAC,KAAK,IAAI,EAAE;YACpB,EAAE,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC;YACpE,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;YAC1C,KAAK,GAAG,EAAE,CAAC,KAAyB,CAAC;YACrC,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;YAChE,MAAM,GAAG,eAAe,CAAC,gBAAgB,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;YAC/D,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;QAE5B,SAAS,YAAY;YACnB,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzD,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3D,CAAC;QAED,SAAS,cAAc;YACrB,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5D,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3D,CAAC;QAED,SAAS,KAAK;YACZ,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAC5C,IAAI,CAAC,cAAc,CAAC,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAClD,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,CAAC;QAED,KAAK,UAAU,IAAI,CAAC,WAAkB;YACpC,OAAO,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;QACvF,CAAC;QAED,EAAE,CAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;YAClC,cAAc,EAAE,CAAC;YACjB,MAAM,EAAE,CAAC,iBAAiB,EAAE,CAAC;YAC7B,YAAY,EAAE,CAAC;YACf,MAAM,KAAK,CAAC,eAAe,EAAE,CAAC;YAC9B,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;YAC1E,MAAM,EAAE,CAAC,iBAAiB,EAAE,CAAC;YAC7B,YAAY,EAAE,CAAC;YACf,MAAM,IAAI,EAAE,CAAC;YACb,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAC9C,MAAM,EAAE,CAAC,iBAAiB,EAAE,CAAC;YAC7B,YAAY,EAAE,CAAC;YACf,KAAK,EAAE,CAAC;YACR,EAAE,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,EAAE,CAAC;YACb,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4FAA4F,EAAE,KAAK,IAAI,EAAE;YAC1G,MAAM,EAAE,CAAC,iBAAiB,EAAE,CAAC;YAC7B,YAAY,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,YAAY,EAAE,CAAC;YACf,MAAM,KAAK,CAAC,eAAe,EAAE,CAAC;YAC9B,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;YAC9E,MAAM,EAAE,CAAC,iBAAiB,EAAE,CAAC;YAC7B,YAAY,EAAE,CAAC;YACf,KAAK,EAAE,CAAC;YACR,EAAE,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,YAAY,EAAE,CAAC;YACf,MAAM,KAAK,CAAC,eAAe,EAAE,CAAC;YAC9B,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,cAAc,EAAE,CAAC;YACjB,MAAM,EAAE,CAAC,iBAAiB,EAAE,CAAC;YAC7B,YAAY,EAAE,CAAC;YACf,KAAK,EAAE,CAAC;YACR,EAAE,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;YACrF,MAAM,IAAI,EAAE,CAAC;YACb,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;YACvD,cAAc,EAAE,CAAC;YACjB,MAAM,EAAE,CAAC,iBAAiB,EAAE,CAAC;YAC7B,KAAK,EAAE,CAAC;YACR,MAAM,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;YACrF,YAAY,EAAE,CAAC;YACf,EAAE,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,KAAK,CAAC,eAAe,EAAE,CAAC;YAC9B,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","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 chai from \"chai\";\nimport * as chaiAsPromised from \"chai-as-promised\";\nimport { restore as sinonRestore, spy as sinonSpy } from \"sinon\";\nimport { AccessToken, Guid, GuidString, Id64, Id64Arg } from \"@itwin/core-bentley\";\nimport { Code, IModel, IModelError, LocalBriefcaseProps, LockState, PhysicalElementProps, RequestNewBriefcaseProps } from \"@itwin/core-common\";\nimport { BriefcaseManager } from \"../../BriefcaseManager\";\nimport { PhysicalObject } from \"../../domains/GenericElements\";\nimport { PhysicalElement } from \"../../Element\";\nimport { BriefcaseDb, SnapshotDb } from \"../../IModelDb\";\nimport { IModelHost } from \"../../IModelHost\";\nimport { ElementOwnsChildElements } from \"../../NavigationRelationship\";\nimport { ServerBasedLocks } from \"../../internal/ServerBasedLocks\";\nimport { HubMock } from \"../../internal/HubMock\";\nimport { ExtensiveTestScenario, IModelTestUtils } from \"../IModelTestUtils\";\nimport { KnownTestLocations } from \"../KnownTestLocations\";\nimport { ChannelControl } from \"../../core-backend\";\nimport { _hubAccess, _releaseAllLocks } from \"../../internal/Symbols\";\n\nconst expect = chai.expect;\nconst assert = chai.assert;\nchai.use(chaiAsPromised);\n\ndescribe(\"Server-based locks\", () => {\n const createVersion0 = async () => {\n const dbName = IModelTestUtils.prepareOutputFile(\"ServerBasedLocks\", \"ServerBasedLocks.bim\");\n const sourceDb = SnapshotDb.createEmpty(dbName, { rootSubject: { name: \"server lock test\" } });\n assert.isFalse(sourceDb.locks.isServerBased);\n await ExtensiveTestScenario.prepareDb(sourceDb);\n await ExtensiveTestScenario.populateDb(sourceDb);\n sourceDb.saveChanges();\n sourceDb.close();\n return dbName;\n };\n\n let iModelId: GuidString;\n let accessToken1: AccessToken;\n let accessToken2: AccessToken;\n let briefcase1Props: LocalBriefcaseProps;\n let briefcase2Props: LocalBriefcaseProps;\n\n afterEach(() => sinonRestore());\n before(async () => {\n HubMock.startup(\"ServerBasedLocks\", KnownTestLocations.outputDir);\n\n const iModelProps = {\n iModelName: \"server locks test\",\n iTwinId: HubMock.iTwinId,\n version0: await createVersion0(),\n };\n\n iModelId = await HubMock.createNewIModel(iModelProps);\n const args: RequestNewBriefcaseProps = { iTwinId: iModelProps.iTwinId, iModelId };\n briefcase1Props = await BriefcaseManager.downloadBriefcase({ accessToken: \"test token\", ...args });\n briefcase2Props = await BriefcaseManager.downloadBriefcase({ accessToken: \"test token2\", ...args });\n });\n after(() => {\n HubMock.shutdown();\n });\n\n const assertSharedLocks = (locks: ServerBasedLocks, ids: Id64Arg) => {\n for (const id of Id64.iterable(ids))\n assert.isTrue(locks.holdsSharedLock(id));\n };\n const assertExclusiveLocks = (locks: ServerBasedLocks, ids: Id64Arg) => {\n assertSharedLocks(locks, ids);\n for (const id of Id64.iterable(ids))\n assert.isTrue(locks.holdsSharedLock(id));\n };\n const assertLockCounts = (locks: ServerBasedLocks, shared: number, exclusive: number) => {\n assert.equal(locks.getLockCount(LockState.Shared), shared);\n assert.equal(locks.getLockCount(LockState.Exclusive), exclusive);\n };\n\n it(\"Acquiring locks\", async () => {\n const lockSpy = sinonSpy(IModelHost[_hubAccess], \"acquireLocks\");\n let bc1 = await BriefcaseDb.open({ fileName: briefcase1Props.fileName });\n assert.isTrue(bc1.locks.isServerBased);\n bc1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n let bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });\n assert.isTrue(bc2.locks.isServerBased);\n\n let bc1Locks = bc1.locks as ServerBasedLocks;\n let bc2Locks = bc2.locks as ServerBasedLocks;\n const child1 = IModelTestUtils.queryByUserLabel(bc1, \"ChildObject1A\");\n const child2 = IModelTestUtils.queryByUserLabel(bc1, \"ChildObject1B\");\n const childEl = bc1.elements.getElement<PhysicalElement>(child1);\n const parentId = childEl.parent!.id;\n const modelId = childEl.model;\n const modelProps = bc1.elements.getElementProps(modelId);\n const subjectId = modelProps.parent!.id;\n\n const sharedLockError = \"shared lock is held\";\n const exclusiveLockError = \"lock is already held\";\n\n await bc1.acquireSchemaLock();\n assert.equal(lockSpy.callCount, 1);\n assert.isTrue(bc1.holdsSchemaLock);\n assertLockCounts(bc1Locks, 0, 1);\n assertExclusiveLocks(bc1Locks, [IModel.dictionaryId, child1, parentId]); // even though we only hold 1 lock (the \"schema\" lock), every element should say it's locked\n\n await bc1Locks.acquireLocks({ exclusive: child1 }); // attempting to acquire exclusive lock on any element when schema lock is held shouldn't need a server request\n assert.equal(lockSpy.callCount, 1);\n\n assert.isFalse(bc2.holdsSchemaLock);\n await expect(bc2.acquireSchemaLock()).rejectedWith(IModelError, exclusiveLockError, \"acquire schema exclusive\");\n await expect(bc2Locks.acquireLocks({ shared: childEl.model })).rejectedWith(IModelError, exclusiveLockError);\n\n await bc1Locks[_releaseAllLocks]();\n await bc1Locks.acquireLocks({ exclusive: parentId, shared: parentId });\n assertLockCounts(bc1Locks, 3, 1);\n assertSharedLocks(bc1Locks, [modelId, IModel.rootSubjectId]);\n assertExclusiveLocks(bc1Locks, [parentId, child1, child2]); // acquiring exclusive lock on parent implicitly holds exclusive lock on children\n\n await bc1Locks[_releaseAllLocks]();\n await bc1Locks.acquireLocks({ exclusive: modelId });\n assertLockCounts(bc1Locks, 2, 1);\n assertSharedLocks(bc1Locks, [modelId, IModel.rootSubjectId]);\n assertExclusiveLocks(bc1Locks, [modelId, parentId, child1, child2]); // acquiring exclusive lock on model implicitly holds exclusive lock on members\n\n await bc1Locks[_releaseAllLocks]();\n lockSpy.resetHistory();\n await bc1Locks.acquireLocks({ shared: child1 });\n assert.equal(lockSpy.callCount, 1);\n assert.equal(lockSpy.getCall(0).args[1].size, 5);\n assertSharedLocks(bc1Locks, [child1, parentId, modelId, subjectId, IModel.rootSubjectId]);\n assertLockCounts(bc1Locks, 5, 0);\n await bc1Locks.acquireLocks({ exclusive: child1 }); // upgrade lock from shared to exclusive\n assert.equal(lockSpy.callCount, 2);\n assertLockCounts(bc1Locks, 4, 1);\n\n assertExclusiveLocks(bc1Locks, child1);\n assert.equal(lockSpy.callCount, 2); // should not need to call server on a lock already held\n\n await expect(bc2.acquireSchemaLock()).rejectedWith(IModelError, sharedLockError);\n assert.equal(lockSpy.callCount, 3);\n await expect(bc2Locks.acquireLocks({ exclusive: parentId })).rejectedWith(IModelError, sharedLockError);\n assert.equal(lockSpy.callCount, 4);\n await bc2Locks.acquireLocks({ shared: parentId });\n assert.equal(lockSpy.callCount, 5);\n assertSharedLocks(bc2Locks, [parentId, IModel.rootSubjectId]);\n await bc2Locks.acquireLocks({ shared: IModel.dictionaryId });\n assert.equal(lockSpy.callCount, 6);\n assertSharedLocks(bc2Locks, IModel.dictionaryId);\n\n assertLockCounts(bc1Locks, 4, 1);\n assertLockCounts(bc2Locks, 5, 0);\n\n const childElJson = childEl.toJSON();\n // if we close and reopen the briefcase, the local locks database should still be intact\n bc1.close();\n bc2.close();\n\n bc1 = await BriefcaseDb.open({ fileName: briefcase1Props.fileName });\n bc1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });\n bc2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n\n bc1Locks = bc1.locks as ServerBasedLocks;\n bc2Locks = bc2.locks as ServerBasedLocks;\n\n assertLockCounts(bc1Locks, 4, 1);\n assertLockCounts(bc2Locks, 5, 0);\n\n assertSharedLocks(bc1Locks, [parentId, childEl.model, IModel.rootSubjectId]);\n assertSharedLocks(bc2Locks, [parentId, IModel.rootSubjectId, IModel.dictionaryId]);\n assertExclusiveLocks(bc1Locks, child1);\n assert.isFalse(bc2Locks.holdsExclusiveLock(child1));\n\n await bc2Locks[_releaseAllLocks](); // release all locks from bc2 so we can test expected failures below\n assertLockCounts(bc2Locks, 0, 0);\n\n await expect(bc2Locks.acquireLocks({ exclusive: [IModel.dictionaryId, parentId] })).rejectedWith(IModelError, sharedLockError);\n assertLockCounts(bc2Locks, 0, 0); // exclusive lock is available on dictionary, but not on parent - should get neither\n await bc2Locks.acquireLocks({ exclusive: IModel.dictionaryId }); // now attempt to get only dictionary\n assertExclusiveLocks(bc2Locks, IModel.dictionaryId); // that should work\n assertSharedLocks(bc2Locks, IModel.rootSubjectId); // it should also acquire the shared lock on the rootSubject\n assertLockCounts(bc2Locks, 1, 1);\n\n await bc1Locks[_releaseAllLocks]();\n await bc2Locks[_releaseAllLocks]();\n lockSpy.resetHistory();\n\n const physicalProps: PhysicalElementProps = {\n classFullName: PhysicalObject.classFullName,\n model: modelId,\n parent: new ElementOwnsChildElements(parentId),\n category: childElJson.category,\n code: Code.createEmpty(),\n };\n assert.throws(() => bc1.elements.insertElement(physicalProps), IModelError, \"shared lock\"); // insert requires shared lock on model\n await bc1Locks.acquireLocks({ shared: parentId }); // also acquires shared lock on model\n const newElId = bc1.elements.insertElement(physicalProps);\n assertExclusiveLocks(bc1Locks, newElId);\n\n childElJson.userLabel = \"new user label\";\n assert.throws(() => bc1.elements.updateElement(childElJson), \"exclusive lock\");\n await bc1Locks.acquireLocks({ exclusive: child1 });\n bc1.elements.updateElement(childElJson);\n bc1.saveChanges();\n\n bc1.elements.deleteElement(child1); // make sure delete now works\n bc1.abandonChanges();\n\n assert.isTrue(bc1.locks.holdsSharedLock(IModel.repositoryModelId));\n\n await bc1.pushChanges({ accessToken: accessToken1, description: \"my changes\" });\n\n assert.isFalse(bc1.locks.holdsSharedLock(IModel.repositoryModelId));\n\n assert.throws(() => bc2.elements.deleteElement(child1), \"exclusive lock\"); // bc2 can't delete because it doesn't hold lock\n await expect(bc2Locks.acquireLocks({ exclusive: child1 })).rejectedWith(IModelError, \"pull is required\"); // can't get lock since other briefcase changed it\n\n await bc2.pullChanges({ accessToken: accessToken2 });\n await bc2Locks.acquireLocks({ exclusive: child1, shared: child1 });\n const child2El = bc2.elements.getElement<PhysicalElement>(child1);\n\n assert.equal(child2El.userLabel, childElJson.userLabel);\n await bc1.locks.releaseAllLocks();\n await bc2.locks.releaseAllLocks();\n bc1.close();\n bc2.close();\n });\n\n describe(\"releaseAllLocks\", () => {\n let bc: BriefcaseDb;\n let locks: ServerBasedLocks;\n let elemId: string;\n\n beforeEach(async () => {\n bc = await BriefcaseDb.open({ fileName: briefcase1Props.fileName });\n expect(bc.locks.isServerBased).to.be.true;\n locks = bc.locks as ServerBasedLocks;\n bc.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n elemId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\n expect(elemId).not.to.equal(\"0\");\n });\n\n afterEach(() => bc.close());\n\n function expectLocked(): void {\n expect(locks.getLockCount(LockState.Exclusive)).least(1);\n expect(locks.getLockCount(LockState.Shared)).to.equal(0);\n }\n\n function expectUnlocked(): void {\n expect(locks.getLockCount(LockState.Exclusive)).to.equal(0);\n expect(locks.getLockCount(LockState.Shared)).to.equal(0);\n }\n\n function write(): void {\n const elem = bc.elements.getElement(elemId);\n elem.jsonProperties.testProp = Guid.createValue();\n elem.update();\n }\n\n async function push(retainLocks?: true): Promise<void> {\n return bc.pushChanges({ retainLocks, accessToken: \"token\", description: \"changes\" });\n }\n\n it(\"releases all locks\", async () => {\n expectUnlocked();\n await bc.acquireSchemaLock();\n expectLocked();\n await locks.releaseAllLocks();\n expectUnlocked();\n });\n\n it(\"is called when pushChanges is called with no local changes\", async () => {\n await bc.acquireSchemaLock();\n expectLocked();\n await push();\n expectUnlocked();\n });\n\n it(\"is called when pushing changes\", async () => {\n await bc.acquireSchemaLock();\n expectLocked();\n write();\n bc.saveChanges();\n await push();\n expectUnlocked();\n });\n\n it(\"is not called when pushChanges is called with no local changes if retainLocks is specified\", async () => {\n await bc.acquireSchemaLock();\n expectLocked();\n await push(true);\n expectLocked();\n await locks.releaseAllLocks();\n expectUnlocked();\n });\n\n it(\"is not called when pushing changes if retainLocks is specified\", async () => {\n await bc.acquireSchemaLock();\n expectLocked();\n write();\n bc.saveChanges();\n await push(true);\n expectLocked();\n await locks.releaseAllLocks();\n expectUnlocked();\n });\n\n it(\"throws if briefcase has unpushed changes\", async () => {\n expectUnlocked();\n await bc.acquireSchemaLock();\n expectLocked();\n write();\n bc.saveChanges();\n await expect(locks.releaseAllLocks()).to.eventually.be.rejectedWith(\"local changes\");\n await push();\n expectUnlocked();\n });\n\n it(\"throws if briefcase has unsaved changes\", async () => {\n expectUnlocked();\n await bc.acquireSchemaLock();\n write();\n await expect(locks.releaseAllLocks()).to.eventually.be.rejectedWith(\"local changes\");\n expectLocked();\n bc.abandonChanges();\n await locks.releaseAllLocks();\n expectUnlocked();\n });\n });\n});\n"]}
1
+ {"version":3,"file":"ServerBasedLocks.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/ServerBasedLocks.test.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 chai from \"chai\";\r\nimport * as chaiAsPromised from \"chai-as-promised\";\r\nimport { match as sinonMatch, restore as sinonRestore, spy as sinonSpy, stub as sinonStub } from \"sinon\";\r\nimport { AccessToken, Guid, GuidString, Id64, Id64Arg, IModelStatus } from \"@itwin/core-bentley\";\r\nimport { Code, IModel, IModelError, LocalBriefcaseProps, LockState, PhysicalElementProps, RequestNewBriefcaseProps } from \"@itwin/core-common\";\r\nimport { BriefcaseManager } from \"../../BriefcaseManager\";\r\nimport { PhysicalObject } from \"../../domains/GenericElements\";\r\nimport { PhysicalElement } from \"../../Element\";\r\nimport { BriefcaseDb, SnapshotDb } from \"../../IModelDb\";\r\nimport { IModelHost } from \"../../IModelHost\";\r\nimport { ElementOwnsChildElements } from \"../../NavigationRelationship\";\r\nimport { ServerBasedLocks } from \"../../internal/ServerBasedLocks\";\r\nimport { HubMock } from \"../../internal/HubMock\";\r\nimport { ExtensiveTestScenario, IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { KnownTestLocations } from \"../KnownTestLocations\";\r\nimport { ChannelControl, LockConflict, LockMap } from \"../../core-backend\";\r\nimport { _hubAccess, _releaseAllLocks } from \"../../internal/Symbols\";\r\nimport { EditTxn, withEditTxn } from \"../../EditTxn\";\r\n\r\nconst expect = chai.expect;\r\nconst assert = chai.assert;\r\nchai.use(chaiAsPromised);\r\n\r\ndescribe(\"Server-based locks\", () => {\r\n const createVersion0 = async () => {\r\n const dbName = IModelTestUtils.prepareOutputFile(\"ServerBasedLocks\", \"ServerBasedLocks.bim\");\r\n const sourceDb = SnapshotDb.createEmpty(dbName, { rootSubject: { name: \"server lock test\" } });\r\n assert.isFalse(sourceDb.locks.isServerBased);\r\n await ExtensiveTestScenario.prepareDb(sourceDb);\r\n await ExtensiveTestScenario.populateDb(sourceDb);\r\n sourceDb.close();\r\n return dbName;\r\n };\r\n\r\n let iModelId: GuidString;\r\n let accessToken1: AccessToken;\r\n let accessToken2: AccessToken;\r\n let briefcase1Props: LocalBriefcaseProps;\r\n let briefcase2Props: LocalBriefcaseProps;\r\n\r\n afterEach(() => sinonRestore());\r\n before(async () => {\r\n HubMock.startup(\"ServerBasedLocks\", KnownTestLocations.outputDir);\r\n\r\n const iModelProps = {\r\n iModelName: \"server locks test\",\r\n iTwinId: HubMock.iTwinId,\r\n version0: await createVersion0(),\r\n };\r\n\r\n iModelId = await HubMock.createNewIModel(iModelProps);\r\n const args: RequestNewBriefcaseProps = { iTwinId: iModelProps.iTwinId, iModelId };\r\n briefcase1Props = await BriefcaseManager.downloadBriefcase({ accessToken: \"test token\", ...args });\r\n briefcase2Props = await BriefcaseManager.downloadBriefcase({ accessToken: \"test token2\", ...args });\r\n });\r\n after(() => {\r\n HubMock.shutdown();\r\n });\r\n\r\n const assertSharedLocks = (locks: ServerBasedLocks, ids: Id64Arg) => {\r\n for (const id of Id64.iterable(ids))\r\n assert.isTrue(locks.holdsSharedLock(id));\r\n };\r\n const assertExclusiveLocks = (locks: ServerBasedLocks, ids: Id64Arg) => {\r\n assertSharedLocks(locks, ids);\r\n for (const id of Id64.iterable(ids))\r\n assert.isTrue(locks.holdsSharedLock(id));\r\n };\r\n const assertLockCounts = (locks: ServerBasedLocks, shared: number, exclusive: number) => {\r\n assert.equal(locks.getLockCount(LockState.Shared), shared);\r\n assert.equal(locks.getLockCount(LockState.Exclusive), exclusive);\r\n };\r\n\r\n it(\"Acquiring locks\", async () => {\r\n const lockSpy = sinonSpy(IModelHost[_hubAccess], \"acquireLocks\");\r\n let bc1 = await BriefcaseDb.open({ fileName: briefcase1Props.fileName });\r\n assert.isTrue(bc1.locks.isServerBased);\r\n bc1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n let bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });\r\n assert.isTrue(bc2.locks.isServerBased);\r\n\r\n let bc1Locks = bc1.locks as ServerBasedLocks;\r\n let bc2Locks = bc2.locks as ServerBasedLocks;\r\n const child1 = IModelTestUtils.queryByUserLabel(bc1, \"ChildObject1A\");\r\n const child2 = IModelTestUtils.queryByUserLabel(bc1, \"ChildObject1B\");\r\n const childEl = bc1.elements.getElement<PhysicalElement>(child1);\r\n const parentId = childEl.parent!.id;\r\n const modelId = childEl.model;\r\n const modelProps = bc1.elements.getElementProps(modelId);\r\n const subjectId = modelProps.parent!.id;\r\n\r\n const sharedLockError = \"shared lock is held\";\r\n const exclusiveLockError = \"lock is already held\";\r\n\r\n await bc1.acquireSchemaLock();\r\n assert.equal(lockSpy.callCount, 1);\r\n assert.isTrue(bc1.holdsSchemaLock);\r\n assertLockCounts(bc1Locks, 0, 1);\r\n assertExclusiveLocks(bc1Locks, [IModel.dictionaryId, child1, parentId]); // even though we only hold 1 lock (the \"schema\" lock), every element should say it's locked\r\n\r\n await bc1Locks.acquireLocks({ exclusive: child1 }); // attempting to acquire exclusive lock on any element when schema lock is held shouldn't need a server request\r\n assert.equal(lockSpy.callCount, 1);\r\n\r\n assert.isFalse(bc2.holdsSchemaLock);\r\n await expect(bc2.acquireSchemaLock()).rejectedWith(IModelError, exclusiveLockError, \"acquire schema exclusive\");\r\n await expect(bc2Locks.acquireLocks({ shared: childEl.model })).rejectedWith(IModelError, exclusiveLockError);\r\n\r\n await bc1Locks[_releaseAllLocks]();\r\n await bc1Locks.acquireLocks({ exclusive: parentId, shared: parentId });\r\n assertLockCounts(bc1Locks, 3, 1);\r\n assertSharedLocks(bc1Locks, [modelId, IModel.rootSubjectId]);\r\n assertExclusiveLocks(bc1Locks, [parentId, child1, child2]); // acquiring exclusive lock on parent implicitly holds exclusive lock on children\r\n\r\n await bc1Locks[_releaseAllLocks]();\r\n await bc1Locks.acquireLocks({ exclusive: modelId });\r\n assertLockCounts(bc1Locks, 2, 1);\r\n assertSharedLocks(bc1Locks, [modelId, IModel.rootSubjectId]);\r\n assertExclusiveLocks(bc1Locks, [modelId, parentId, child1, child2]); // acquiring exclusive lock on model implicitly holds exclusive lock on members\r\n\r\n await bc1Locks[_releaseAllLocks]();\r\n lockSpy.resetHistory();\r\n await bc1Locks.acquireLocks({ shared: child1 });\r\n assert.equal(lockSpy.callCount, 1);\r\n assert.equal(lockSpy.getCall(0).args[1].size, 5);\r\n assertSharedLocks(bc1Locks, [child1, parentId, modelId, subjectId, IModel.rootSubjectId]);\r\n assertLockCounts(bc1Locks, 5, 0);\r\n await bc1Locks.acquireLocks({ exclusive: child1 }); // upgrade lock from shared to exclusive\r\n assert.equal(lockSpy.callCount, 2);\r\n assertLockCounts(bc1Locks, 4, 1);\r\n\r\n assertExclusiveLocks(bc1Locks, child1);\r\n assert.equal(lockSpy.callCount, 2); // should not need to call server on a lock already held\r\n\r\n await expect(bc2.acquireSchemaLock()).rejectedWith(IModelError, sharedLockError);\r\n assert.equal(lockSpy.callCount, 3);\r\n await expect(bc2Locks.acquireLocks({ exclusive: parentId })).rejectedWith(IModelError, sharedLockError);\r\n assert.equal(lockSpy.callCount, 4);\r\n await bc2Locks.acquireLocks({ shared: parentId });\r\n assert.equal(lockSpy.callCount, 5);\r\n assertSharedLocks(bc2Locks, [parentId, IModel.rootSubjectId]);\r\n await bc2Locks.acquireLocks({ shared: IModel.dictionaryId });\r\n assert.equal(lockSpy.callCount, 6);\r\n assertSharedLocks(bc2Locks, IModel.dictionaryId);\r\n\r\n assertLockCounts(bc1Locks, 4, 1);\r\n assertLockCounts(bc2Locks, 5, 0);\r\n\r\n const childElJson = childEl.toJSON();\r\n // if we close and reopen the briefcase, the local locks database should still be intact\r\n bc1.close();\r\n bc2.close();\r\n\r\n bc1 = await BriefcaseDb.open({ fileName: briefcase1Props.fileName });\r\n bc1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });\r\n bc2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n bc1Locks = bc1.locks as ServerBasedLocks;\r\n bc2Locks = bc2.locks as ServerBasedLocks;\r\n\r\n assertLockCounts(bc1Locks, 4, 1);\r\n assertLockCounts(bc2Locks, 5, 0);\r\n\r\n assertSharedLocks(bc1Locks, [parentId, childEl.model, IModel.rootSubjectId]);\r\n assertSharedLocks(bc2Locks, [parentId, IModel.rootSubjectId, IModel.dictionaryId]);\r\n assertExclusiveLocks(bc1Locks, child1);\r\n assert.isFalse(bc2Locks.holdsExclusiveLock(child1));\r\n\r\n await bc2Locks[_releaseAllLocks](); // release all locks from bc2 so we can test expected failures below\r\n assertLockCounts(bc2Locks, 0, 0);\r\n\r\n await expect(bc2Locks.acquireLocks({ exclusive: [IModel.dictionaryId, parentId] })).rejectedWith(IModelError, sharedLockError);\r\n assertLockCounts(bc2Locks, 0, 0); // exclusive lock is available on dictionary, but not on parent - should get neither\r\n await bc2Locks.acquireLocks({ exclusive: IModel.dictionaryId }); // now attempt to get only dictionary\r\n assertExclusiveLocks(bc2Locks, IModel.dictionaryId); // that should work\r\n assertSharedLocks(bc2Locks, IModel.rootSubjectId); // it should also acquire the shared lock on the rootSubject\r\n assertLockCounts(bc2Locks, 1, 1);\r\n\r\n await bc1Locks[_releaseAllLocks]();\r\n await bc2Locks[_releaseAllLocks]();\r\n lockSpy.resetHistory();\r\n\r\n const physicalProps: PhysicalElementProps = {\r\n classFullName: PhysicalObject.classFullName,\r\n model: modelId,\r\n parent: new ElementOwnsChildElements(parentId),\r\n category: childElJson.category,\r\n code: Code.createEmpty(),\r\n };\r\n assert.throws(() => withEditTxn(bc1, (txn) => txn.insertElement(physicalProps)), IModelError, \"shared lock\"); // insert requires shared lock on model\r\n await bc1Locks.acquireLocks({ shared: parentId }); // also acquires shared lock on model\r\n const newElId = withEditTxn(bc1, (txn) => txn.insertElement(physicalProps));\r\n assertExclusiveLocks(bc1Locks, newElId);\r\n\r\n childElJson.userLabel = \"new user label\";\r\n assert.throws(() => withEditTxn(bc1, (txn) => txn.updateElement(childElJson)), \"exclusive lock\");\r\n await bc1Locks.acquireLocks({ exclusive: child1 });\r\n withEditTxn(bc1, (txn) => txn.updateElement(childElJson));\r\n\r\n {\r\n const txn = new EditTxn(bc1, \"verify delete lock behavior\");\r\n txn.start();\r\n txn.deleteElement(child1); // make sure delete now works\r\n txn.end(\"abandon\");\r\n }\r\n\r\n assert.isTrue(bc1.locks.holdsSharedLock(IModel.repositoryModelId));\r\n\r\n await bc1.pushChanges({ accessToken: accessToken1, description: \"my changes\" });\r\n\r\n assert.isFalse(bc1.locks.holdsSharedLock(IModel.repositoryModelId));\r\n\r\n assert.throws(() => withEditTxn(bc2, (txn) => txn.deleteElement(child1)), \"exclusive lock\"); // bc2 can't delete because it doesn't hold lock\r\n await expect(bc2Locks.acquireLocks({ exclusive: child1 })).rejectedWith(IModelError, \"pull is required\"); // can't get lock since other briefcase changed it\r\n\r\n await bc2.pullChanges({ accessToken: accessToken2 });\r\n await bc2Locks.acquireLocks({ exclusive: child1, shared: child1 });\r\n const child2El = bc2.elements.getElement<PhysicalElement>(child1);\r\n\r\n assert.equal(child2El.userLabel, childElJson.userLabel);\r\n await bc1.locks.releaseAllLocks();\r\n await bc2.locks.releaseAllLocks();\r\n bc1.close();\r\n bc2.close();\r\n });\r\n\r\n describe(\"releaseAllLocks\", () => {\r\n let bc: BriefcaseDb;\r\n let locks: ServerBasedLocks;\r\n let elemId: string;\r\n\r\n beforeEach(async () => {\r\n bc = await BriefcaseDb.open({ fileName: briefcase1Props.fileName });\r\n expect(bc.locks.isServerBased).to.be.true;\r\n locks = bc.locks as ServerBasedLocks;\r\n bc.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n elemId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n expect(elemId).not.to.equal(\"0\");\r\n });\r\n\r\n afterEach(() => bc.close());\r\n\r\n function expectLocked(): void {\r\n expect(locks.getLockCount(LockState.Exclusive)).least(1);\r\n expect(locks.getLockCount(LockState.Shared)).to.equal(0);\r\n }\r\n\r\n function expectUnlocked(): void {\r\n expect(locks.getLockCount(LockState.Exclusive)).to.equal(0);\r\n expect(locks.getLockCount(LockState.Shared)).to.equal(0);\r\n }\r\n\r\n function write(txn: EditTxn): void {\r\n const elem = bc.elements.getElement(elemId);\r\n elem.jsonProperties.testProp = Guid.createValue();\r\n elem.update(txn);\r\n }\r\n\r\n async function push(retainLocks?: true): Promise<void> {\r\n return bc.pushChanges({ retainLocks, accessToken: \"token\", description: \"changes\" });\r\n }\r\n\r\n it(\"releases all locks\", async () => {\r\n expectUnlocked();\r\n await bc.acquireSchemaLock();\r\n expectLocked();\r\n await locks.releaseAllLocks();\r\n expectUnlocked();\r\n });\r\n\r\n it(\"is called when pushChanges is called with no local changes\", async () => {\r\n await bc.acquireSchemaLock();\r\n expectLocked();\r\n await push();\r\n expectUnlocked();\r\n });\r\n\r\n it(\"is called when pushing changes\", async () => {\r\n await bc.acquireSchemaLock();\r\n expectLocked();\r\n withEditTxn(bc, (txn) => write(txn));\r\n await push();\r\n expectUnlocked();\r\n });\r\n\r\n it(\"is not called when pushChanges is called with no local changes if retainLocks is specified\", async () => {\r\n await bc.acquireSchemaLock();\r\n expectLocked();\r\n await push(true);\r\n expectLocked();\r\n await locks.releaseAllLocks();\r\n expectUnlocked();\r\n });\r\n\r\n it(\"is not called when pushing changes if retainLocks is specified\", async () => {\r\n await bc.acquireSchemaLock();\r\n expectLocked();\r\n withEditTxn(bc, (txn) => write(txn));\r\n await push(true);\r\n expectLocked();\r\n await locks.releaseAllLocks();\r\n expectUnlocked();\r\n });\r\n\r\n it(\"throws if briefcase has unpushed changes\", async () => {\r\n expectUnlocked();\r\n await bc.acquireSchemaLock();\r\n expectLocked();\r\n withEditTxn(bc, (txn) => write(txn));\r\n await expect(locks.releaseAllLocks()).to.eventually.be.rejectedWith(\"local changes\");\r\n await push();\r\n expectUnlocked();\r\n });\r\n\r\n it(\"throws if briefcase has unsaved changes\", async () => {\r\n expectUnlocked();\r\n await bc.acquireSchemaLock();\r\n const txn = new EditTxn(bc, \"releaseAllLocks unsaved changes\");\r\n txn.start();\r\n write(txn);\r\n await expect(locks.releaseAllLocks()).to.eventually.be.rejectedWith(\"local changes\");\r\n expectLocked();\r\n txn.end(\"abandon\");\r\n await locks.releaseAllLocks();\r\n expectUnlocked();\r\n });\r\n });\r\n\r\n describe(\"abandonLocksForReversedTxn\", () => {\r\n let bc: BriefcaseDb;\r\n let bc2: BriefcaseDb | undefined;\r\n let locks: ServerBasedLocks;\r\n\r\n beforeEach(async () => {\r\n bc = await BriefcaseDb.open({ fileName: briefcase1Props.fileName });\r\n expect(bc.locks.isServerBased).to.be.true;\r\n locks = bc.locks as ServerBasedLocks;\r\n bc.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n });\r\n\r\n afterEach(async () => {\r\n sinonRestore();\r\n\r\n await locks[_releaseAllLocks]();\r\n bc.close();\r\n\r\n if (bc2 !== undefined) {\r\n await bc2.locks.releaseAllLocks();\r\n bc2.close();\r\n bc2 = undefined;\r\n }\r\n });\r\n\r\n it(\"abandons locks acquired in the current, unsaved txn\", async () => {\r\n const lockSpy = sinonSpy(IModelHost[_hubAccess], \"abandonLocks\");\r\n\r\n const childId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n const txnId = bc.txns.getCurrentTxnId();\r\n\r\n await locks.acquireLocks({ exclusive: childId });\r\n expect(locks.holdsExclusiveLock(childId)).to.be.true;\r\n expect(locks.getLockCount(LockState.Exclusive)).to.equal(1);\r\n expect(locks.getLockCount(LockState.Shared)).to.be.greaterThan(0);\r\n\r\n expect(await locks.abandonLocksForReversedTxn(txnId)).to.be.true;\r\n\r\n expect(lockSpy.callCount).to.equal(1);\r\n const releasedLocks = lockSpy.getCall(0).args[1] as Map<string, LockState>;\r\n expect(releasedLocks.size).to.be.greaterThan(0);\r\n for (const state of releasedLocks.values())\r\n expect(state).to.equal(LockState.None);\r\n\r\n expect(locks.holdsExclusiveLock(childId)).to.be.false;\r\n expect(locks.getLockCount(LockState.Exclusive)).to.equal(0);\r\n expect(locks.getLockCount(LockState.Shared)).to.equal(0);\r\n });\r\n\r\n it(\"abandons locks acquired in the most recent saved txn\", async () => {\r\n const lockSpy = sinonSpy(IModelHost[_hubAccess], \"abandonLocks\");\r\n\r\n const childId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n const txnId = bc.txns.getCurrentTxnId();\r\n\r\n await withEditTxn(bc, async txn => {\r\n await locks.acquireLocks({ exclusive: childId });\r\n const element = bc.elements.getElement<PhysicalElement>(childId);\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update(txn);\r\n });\r\n\r\n expect(locks.holdsExclusiveLock(childId)).to.be.true;\r\n expect(locks.getLockCount(LockState.Exclusive)).to.equal(1);\r\n expect(locks.getLockCount(LockState.Shared)).to.be.greaterThan(0);\r\n\r\n bc.txns.reverseSingleTxn();\r\n expect(await locks.abandonLocksForReversedTxn(txnId)).to.be.true;\r\n\r\n expect(lockSpy.callCount).to.equal(1);\r\n const releasedLocks = lockSpy.getCall(0).args[1] as Map<string, LockState>;\r\n expect(releasedLocks.size).to.be.greaterThan(0);\r\n for (const state of releasedLocks.values())\r\n expect(state).to.equal(LockState.None);\r\n\r\n expect(locks.holdsExclusiveLock(childId)).to.be.false;\r\n expect(locks.getLockCount(LockState.Exclusive)).to.equal(0);\r\n expect(locks.getLockCount(LockState.Shared)).to.equal(0);\r\n });\r\n\r\n it(\"does not release locks acquired by a different txn\", async () => {\r\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\r\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n const txn1 = bc.txns.getCurrentTxnId();\r\n await locks.acquireLocks({ exclusive: elementId1 });\r\n\r\n await withEditTxn(bc, async txn => {\r\n const element = bc.elements.getElement<PhysicalElement>(elementId1);\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update(txn);\r\n });\r\n\r\n const txn2 = bc.txns.getCurrentTxnId();\r\n expect(txn2).not.to.equal(txn1);\r\n\r\n await withEditTxn(bc, async txn => {\r\n await locks.acquireLocks({ exclusive: elementId2 });\r\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\r\n element2.setUserProperties(\"bar\", Guid.createValue());\r\n element2.update(txn);\r\n });\r\n\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\r\n\r\n bc.txns.reverseTxns(1);\r\n expect(await locks.abandonLocksForReversedTxn(txn2)).to.be.true;\r\n\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\r\n });\r\n\r\n it(\"invalidates discovered locks\", async () => {\r\n const elementId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n const ownerModeltId = bc.elements.getElementProps(elementId).model;\r\n const ownersOwnerModelId = bc.elements.getElementProps(ownerModeltId).model;\r\n\r\n await locks.acquireLocks({ exclusive: ownersOwnerModelId });\r\n expect(locks.holdsExclusiveLock(ownerModeltId)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.true;\r\n\r\n const txnId = bc.txns.getCurrentTxnId();\r\n bc.txns.reverseTxns(1);\r\n expect(await locks.abandonLocksForReversedTxn(txnId)).to.be.true;\r\n\r\n expect(locks.holdsExclusiveLock(ownerModeltId)).to.be.false;\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.false;\r\n });\r\n\r\n it(\"restores lock to its previous state if it was upgraded by the reversed txn\", async () => {\r\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\r\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n const firstTxnId = bc.txns.getCurrentTxnId();\r\n await locks.acquireLocks({ exclusive: elementId1, shared: elementId2 });\r\n expect(locks.holdsSharedLock(elementId2)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\r\n\r\n // We must actually edit something in order to start a new Txn.\r\n await withEditTxn(bc, async txn => {\r\n const element = bc.elements.getElement<PhysicalElement>(elementId1);\r\n element.setUserProperties(\"foo\", { test: true });\r\n element.update(txn);\r\n });\r\n\r\n const secondTxnId = bc.txns.getCurrentTxnId();\r\n expect(firstTxnId).not.to.equal(secondTxnId);\r\n\r\n await locks.acquireLocks({ exclusive: elementId2 }); // upgrade lock from shared to exclusive\r\n expect(locks.holdsSharedLock(elementId2)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\r\n\r\n expect(await locks.abandonLocksForReversedTxn(secondTxnId)).to.be.true;\r\n\r\n expect(locks.holdsSharedLock(elementId2)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\r\n });\r\n\r\n it(\"does not update changesetid when releasing locks\", async () => {\r\n bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });\r\n expect(bc2.locks.isServerBased).to.be.true;\r\n bc2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n // Make sure both briefcase initially have all changes.\r\n await bc.pullChanges({ accessToken: \"token\" });\r\n await bc2.pullChanges({ accessToken: \"token\" });\r\n\r\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\r\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n // Edit an element in the first briefcase and push the change. This will\r\n // create a new changeset.\r\n await locks.acquireLocks({ exclusive: elementId1 });\r\n\r\n await withEditTxn(bc, async txn => {\r\n const element = bc.elements.getElement<PhysicalElement>(elementId1);\r\n element.setUserProperties(\"foo\", { test: true });\r\n element.update(txn);\r\n });\r\n\r\n await bc.pushChanges({ accessToken: \"token\", description: \"changes\" });\r\n\r\n const secondTxnId = bc.txns.getCurrentTxnId();\r\n\r\n // In that same briefcase, lock and edit a different element, but then reverse\r\n // the change and release the lock.\r\n await bc.locks.acquireLocks({ exclusive: elementId2 });\r\n await withEditTxn(bc, async txn => {\r\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\r\n element2.setUserProperties(\"bar\", { test: true });\r\n element2.update(txn);\r\n });\r\n\r\n bc.txns.reverseTxns(1);\r\n expect(await locks.abandonLocksForReversedTxn(secondTxnId)).to.be.true;\r\n\r\n // Now, in a separate briefcase, which has not yet pulled the changes pushed by the first,\r\n // attempt to lock the same element whose lock was just released. This should work because\r\n // the lock release by releaseLocksForReversedTxn should not have updated the changeset\r\n // associated with that lock.\r\n await bc2.locks.acquireLocks({ exclusive: elementId2 });\r\n });\r\n\r\n it(\"does not release on the server an implicit lock held for a new element\", async () => {\r\n const childId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n const childElement = bc.elements.getElement<PhysicalElement>(childId);\r\n const parentId = childElement.parent!.id;\r\n const modelId = childElement.model;\r\n\r\n const physicalProps: PhysicalElementProps = {\r\n classFullName: PhysicalObject.classFullName,\r\n model: modelId,\r\n parent: new ElementOwnsChildElements(parentId),\r\n category: childElement.category,\r\n code: Code.createEmpty(),\r\n };\r\n\r\n const txnId = bc.txns.getCurrentTxnId();\r\n\r\n await locks.acquireLocks({ shared: [modelId, parentId] });\r\n const newElementId = await withEditTxn(bc, async txn => {\r\n return txn.insertElement(physicalProps);\r\n });\r\n\r\n expect(locks.holdsExclusiveLock(newElementId)).to.be.true;\r\n\r\n const lockSpy = sinonSpy(IModelHost[_hubAccess], \"acquireLocks\");\r\n\r\n bc.txns.reverseTxns(1);\r\n expect(await locks.abandonLocksForReversedTxn(txnId)).to.be.true;\r\n\r\n expect(lockSpy.calledWithMatch(sinonMatch.any, sinonMatch((lockMap: LockMap) => lockMap.has(newElementId)))).to.be.false;\r\n });\r\n\r\n it(\"releases locks for later txns, too\", async () => {\r\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\r\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n const txn1 = bc.txns.getCurrentTxnId();\r\n await locks.acquireLocks({ exclusive: elementId1 });\r\n\r\n const element1 = bc.elements.getElement<PhysicalElement>(elementId1);\r\n\r\n await withEditTxn(bc, async txn => {\r\n element1.setUserProperties(\"foo\", Guid.createValue());\r\n element1.update(txn);\r\n });\r\n\r\n const txn2 = bc.txns.getCurrentTxnId();\r\n expect(txn2).not.to.equal(txn1);\r\n\r\n await locks.acquireLocks({ exclusive: elementId2 });\r\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\r\n await withEditTxn(bc, async txn => {\r\n element2.setUserProperties(\"bar\", Guid.createValue());\r\n element2.update(txn);\r\n });\r\n\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\r\n\r\n // Reverse both txns, then abandon locks starting from the earlier one.\r\n // This will release locks for the later one, too.\r\n bc.txns.reverseTxns(2);\r\n expect(await locks.abandonLocksForReversedTxn(txn1)).to.be.true;\r\n\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.false;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\r\n });\r\n\r\n it(\"throws if asked to abandon locks for a txn that has not been reversed\", async () => {\r\n const elementId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n const txnId = bc.txns.getCurrentTxnId();\r\n await locks.acquireLocks({ exclusive: elementId });\r\n\r\n const element = bc.elements.getElement<PhysicalElement>(elementId);\r\n await withEditTxn(bc, async txn => {\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update(txn);\r\n });\r\n\r\n // The txn has not been reversed, so abandonLocksForReversedTxn should throw.\r\n await expect(locks.abandonLocksForReversedTxn(txnId)).to.eventually.be.rejectedWith(\"has not been reversed\");\r\n\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.true;\r\n });\r\n\r\n it(\"throws if asked to abandon locks for the current txn and there are unsaved changes\", async () => {\r\n const elementId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n await locks.acquireLocks({ exclusive: elementId });\r\n\r\n const element = bc.elements.getElement<PhysicalElement>(elementId);\r\n await withEditTxn(bc, async txn => {\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update(txn);\r\n\r\n // The current txn has unsaved changes, so abandonLocksForReversedTxn should throw.\r\n const txnId = bc.txns.getCurrentTxnId();\r\n await expect(locks.abandonLocksForReversedTxn(txnId)).to.eventually.be.rejectedWith(\"unsaved changes\");\r\n\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.true;\r\n });\r\n });\r\n\r\n it(\"throws if asked to abandon locks for a nonexistent txn\", async () => {\r\n const elementId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n await locks.acquireLocks({ exclusive: elementId });\r\n\r\n const element = bc.elements.getElement<PhysicalElement>(elementId);\r\n await withEditTxn(bc, async txn => {\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update(txn);\r\n });\r\n\r\n bc.txns.reverseSingleTxn();\r\n\r\n // Use an ID that is not a valid txn.\r\n await expect(locks.abandonLocksForReversedTxn(\"0xffffffffffff\")).to.eventually.be.rejectedWith(\"does not exist\");\r\n\r\n // The lock should still be held.\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.true;\r\n });\r\n\r\n it(\"returns false when called a second time for an already-abandoned txn\", async () => {\r\n const elementId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n const txnId = bc.txns.getCurrentTxnId();\r\n\r\n await locks.acquireLocks({ exclusive: elementId });\r\n\r\n const element = bc.elements.getElement<PhysicalElement>(elementId);\r\n await withEditTxn(bc, async txn => {\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update(txn);\r\n });\r\n\r\n bc.txns.reverseSingleTxn();\r\n expect(await locks.abandonLocksForReversedTxn(txnId)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.false;\r\n\r\n // Calling again should be a no-op and return false because the locks are already abandoned.\r\n expect(await locks.abandonLocksForReversedTxn(txnId)).to.be.false;\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.false;\r\n });\r\n });\r\n\r\n describe(\"acquireLocksForReinstatingTxn\", () => {\r\n let bc: BriefcaseDb;\r\n let bc2: BriefcaseDb | undefined;\r\n let locks: ServerBasedLocks;\r\n\r\n beforeEach(async () => {\r\n bc = await BriefcaseDb.open({ fileName: briefcase1Props.fileName });\r\n expect(bc.locks.isServerBased).to.be.true;\r\n locks = bc.locks as ServerBasedLocks;\r\n bc.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n });\r\n\r\n afterEach(async () => {\r\n await locks[_releaseAllLocks]();\r\n bc.close();\r\n\r\n if (bc2 !== undefined) {\r\n await (bc2.locks as ServerBasedLocks)[_releaseAllLocks]();\r\n bc2.close();\r\n bc2 = undefined;\r\n }\r\n });\r\n\r\n it(\"reacquires locks for reinstating a txn\", async () => {\r\n const childId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n const txnId = bc.txns.getCurrentTxnId();\r\n\r\n await locks.acquireLocks({ exclusive: childId });\r\n expect(locks.holdsExclusiveLock(childId)).to.be.true;\r\n\r\n // We must actually edit something in order to start a new Txn.\r\n const element = bc.elements.getElement<PhysicalElement>(childId);\r\n await withEditTxn(bc, async txn => {\r\n element.setUserProperties(\"foo\", { test: true });\r\n element.update(txn);\r\n });\r\n\r\n bc.txns.reverseTxns(1);\r\n await locks.abandonLocksForReversedTxn(txnId);\r\n expect(locks.holdsExclusiveLock(childId)).to.be.false;\r\n\r\n expect(await locks.acquireLocksForReinstatingTxn(txnId)).to.be.true;\r\n bc.txns.reinstateTxn();\r\n expect(locks.holdsExclusiveLock(childId)).to.be.true;\r\n });\r\n\r\n it(\"reupgrades a shared lock to exclusive\", async () => {\r\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\r\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n const firstTxnId = bc.txns.getCurrentTxnId();\r\n await locks.acquireLocks({ exclusive: elementId1, shared: elementId2 });\r\n expect(locks.holdsSharedLock(elementId2)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\r\n\r\n // We must actually edit something in order to start a new Txn.\r\n const element = bc.elements.getElement<PhysicalElement>(elementId1);\r\n await withEditTxn(bc, async txn => {\r\n element.setUserProperties(\"foo\", { test: true });\r\n element.update(txn);\r\n });\r\n\r\n const secondTxnId = bc.txns.getCurrentTxnId();\r\n expect(firstTxnId).not.to.equal(secondTxnId);\r\n\r\n await locks.acquireLocks({ exclusive: elementId2 }); // upgrade lock from shared to exclusive\r\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\r\n await withEditTxn(bc, async txn => {\r\n element2.setUserProperties(\"bar\", { test: true });\r\n element2.update(txn);\r\n });\r\n\r\n expect(locks.holdsSharedLock(elementId2)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\r\n\r\n bc.txns.reverseSingleTxn();\r\n await locks.abandonLocksForReversedTxn(secondTxnId);\r\n\r\n expect(locks.holdsSharedLock(elementId2)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\r\n\r\n expect(await locks.acquireLocksForReinstatingTxn(secondTxnId)).to.be.true;\r\n bc.txns.reinstateTxn();\r\n\r\n expect(locks.holdsSharedLock(elementId2)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\r\n });\r\n\r\n it(\"does not acquire on the server an implicit lock originally held for a new element\", async () => {\r\n const childId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n const childElement = bc.elements.getElement<PhysicalElement>(childId);\r\n const parentId = childElement.parent!.id;\r\n const modelId = childElement.model;\r\n\r\n const physicalProps: PhysicalElementProps = {\r\n classFullName: PhysicalObject.classFullName,\r\n model: modelId,\r\n parent: new ElementOwnsChildElements(parentId),\r\n category: childElement.category,\r\n code: Code.createEmpty(),\r\n };\r\n\r\n await locks.acquireLocks({ shared: [modelId, parentId] });\r\n const txnId = bc.txns.getCurrentTxnId();\r\n const newElementId = await withEditTxn(bc, async txn => {\r\n return txn.insertElement(physicalProps);\r\n });\r\n\r\n bc.txns.reverseTxns(1);\r\n expect(await locks.abandonLocksForReversedTxn(txnId)).to.be.true;\r\n\r\n expect(await locks.acquireLocksForReinstatingTxn(txnId)).to.be.true;\r\n bc.txns.reinstateTxn();\r\n expect(locks.holdsExclusiveLock(newElementId)).to.be.true;\r\n });\r\n\r\n it(\"acquires locks for earlier txns, too\", async () => {\r\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\r\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n const txn1 = bc.txns.getCurrentTxnId();\r\n await locks.acquireLocks({ exclusive: elementId1 });\r\n\r\n const element1 = bc.elements.getElement<PhysicalElement>(elementId1);\r\n await withEditTxn(bc, async txn => {\r\n element1.setUserProperties(\"foo\", Guid.createValue());\r\n element1.update(txn);\r\n });\r\n\r\n const txn2 = bc.txns.getCurrentTxnId();\r\n expect(txn2).not.to.equal(txn1);\r\n\r\n await locks.acquireLocks({ exclusive: elementId2 });\r\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\r\n await withEditTxn(bc, async txn => {\r\n element2.setUserProperties(\"bar\", Guid.createValue());\r\n element2.update(txn);\r\n });\r\n\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\r\n\r\n // Reverse both txns and abandon locks starting from the earlier one.\r\n bc.txns.reverseTxns(2);\r\n expect(await locks.abandonLocksForReversedTxn(txn1)).to.be.true;\r\n\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.false;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\r\n\r\n // Acquire locks for the later txn. This should also acquire locks for the earlier one.\r\n expect(await locks.acquireLocksForReinstatingTxn(txn2)).to.be.true;\r\n\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\r\n });\r\n\r\n it(\"cannot acquire locks for a reversed txn after new changes are made\", async () => {\r\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\r\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n const txn1 = bc.txns.getCurrentTxnId();\r\n await locks.acquireLocks({ exclusive: elementId1 });\r\n\r\n const element1 = bc.elements.getElement<PhysicalElement>(elementId1);\r\n await withEditTxn(bc, async txn => {\r\n element1.setUserProperties(\"foo\", Guid.createValue());\r\n element1.update(txn);\r\n });\r\n\r\n bc.txns.reverseTxns(1);\r\n expect(await locks.abandonLocksForReversedTxn(txn1)).to.be.true;\r\n\r\n // Make other changes, making the reversed txn inaccessible.\r\n const txn2 = bc.txns.getCurrentTxnId();\r\n expect(txn1).to.equal(txn2);\r\n await locks.acquireLocks({ exclusive: elementId2 });\r\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\r\n await withEditTxn(bc, async txn => {\r\n element2.setUserProperties(\"bar\", Guid.createValue());\r\n element2.update(txn);\r\n });\r\n\r\n // Attempting to reinstate the txn should not acquire any locks.\r\n expect(await locks.acquireLocksForReinstatingTxn(txn1)).to.be.false;\r\n\r\n // We should still not have a lock on elementId1, because txn1 is now a different txn after the original\r\n // was reversed and we started making further changes under the reused txn id.\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.false;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\r\n });\r\n\r\n it(\"throws if another briefcase holds a conflicting lock\", async () => {\r\n const elementId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n const txnId = bc.txns.getCurrentTxnId();\r\n\r\n await locks.acquireLocks({ exclusive: elementId });\r\n\r\n const element = bc.elements.getElement<PhysicalElement>(elementId);\r\n await withEditTxn(bc, async txn => {\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update(txn);\r\n });\r\n\r\n // Reverse and abandon the lock so it's released on the server.\r\n bc.txns.reverseSingleTxn();\r\n expect(await locks.abandonLocksForReversedTxn(txnId)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.false;\r\n\r\n // Have a second briefcase acquire the same lock.\r\n bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });\r\n bc2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n await bc2.pullChanges();\r\n await bc2.locks.acquireLocks({ exclusive: elementId });\r\n\r\n // Attempting to reacquire the lock for reinstatement should fail because bc2 holds it.\r\n await expect(locks.acquireLocksForReinstatingTxn(txnId)).to.eventually.be.rejectedWith(\"lock is already held\");\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.false;\r\n });\r\n\r\n it(\"is a no-op when locks were never abandoned\", async () => {\r\n const childId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n const txnId = bc.txns.getCurrentTxnId();\r\n\r\n await locks.acquireLocks({ exclusive: childId });\r\n\r\n const element = bc.elements.getElement<PhysicalElement>(childId);\r\n await withEditTxn(bc, async txn => {\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update(txn);\r\n });\r\n\r\n // Reverse the txn but do NOT abandon locks.\r\n bc.txns.reverseSingleTxn();\r\n expect(locks.holdsExclusiveLock(childId)).to.be.true;\r\n\r\n // acquireLocksForReinstatingTxn should be a harmless no-op since locks were never abandoned.\r\n expect(await locks.acquireLocksForReinstatingTxn(txnId)).to.be.false;\r\n expect(locks.holdsExclusiveLock(childId)).to.be.true;\r\n });\r\n\r\n it(\"throws for an invalid txnId\", async () => {\r\n await expect(locks.acquireLocksForReinstatingTxn(\"0xffffffffffff\")).to.eventually.be.rejectedWith(\"does not exist\");\r\n });\r\n });\r\n\r\n describe(\"TxnManager integration\", () => {\r\n let bc: BriefcaseDb;\r\n let locks: ServerBasedLocks;\r\n\r\n beforeEach(async () => {\r\n bc = await BriefcaseDb.open({ fileName: briefcase1Props.fileName });\r\n expect(bc.locks.isServerBased).to.be.true;\r\n locks = bc.locks as ServerBasedLocks;\r\n bc.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n });\r\n\r\n afterEach(async () => {\r\n await locks[_releaseAllLocks]();\r\n bc.close();\r\n });\r\n\r\n describe(\"reverseTxnsAsync\", () => {\r\n it(\"reverses a single txn and abandons its locks\", async () => {\r\n const elementId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n await locks.acquireLocks({ exclusive: elementId });\r\n\r\n const element = bc.elements.getElement<PhysicalElement>(elementId);\r\n const originalProps = element.getUserProperties(\"foo\");\r\n await withEditTxn(bc, async txn => {\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update(txn);\r\n });\r\n\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.true;\r\n\r\n await bc.txns.reverseTxnsAsync(1);\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.false;\r\n\r\n // Verify the element change was actually reversed.\r\n const revertedElement = bc.elements.getElement<PhysicalElement>(elementId);\r\n expect(revertedElement.getUserProperties(\"foo\")).to.deep.equal(originalProps);\r\n });\r\n\r\n it(\"reverses multiple txns and abandons all their locks\", async () => {\r\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\r\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n const orig1 = bc.elements.getElement<PhysicalElement>(elementId1).getUserProperties(\"foo\");\r\n const orig2 = bc.elements.getElement<PhysicalElement>(elementId2).getUserProperties(\"bar\");\r\n\r\n await locks.acquireLocks({ exclusive: elementId1 });\r\n const element1 = bc.elements.getElement<PhysicalElement>(elementId1);\r\n await withEditTxn(bc, async txn => {\r\n element1.setUserProperties(\"foo\", Guid.createValue());\r\n element1.update(txn);\r\n });\r\n\r\n await locks.acquireLocks({ exclusive: elementId2 });\r\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\r\n await withEditTxn(bc, async txn => {\r\n element2.setUserProperties(\"bar\", Guid.createValue());\r\n element2.update(txn);\r\n });\r\n\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\r\n\r\n await bc.txns.reverseTxnsAsync(2);\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.false;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\r\n\r\n // Verify the element changes were actually reversed.\r\n expect(bc.elements.getElement<PhysicalElement>(elementId1).getUserProperties(\"foo\")).to.deep.equal(orig1);\r\n expect(bc.elements.getElement<PhysicalElement>(elementId2).getUserProperties(\"bar\")).to.deep.equal(orig2);\r\n });\r\n\r\n it(\"when an earlier txn is reversed using reverseTxns, and a later one with reverseTxnsAsync, the latter call abandons the earlier locks, too\", async () => {\r\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\r\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n await locks.acquireLocks({ exclusive: elementId1 });\r\n const element1 = bc.elements.getElement<PhysicalElement>(elementId1);\r\n await withEditTxn(bc, async txn => {\r\n element1.setUserProperties(\"foo\", Guid.createValue());\r\n element1.update(txn);\r\n });\r\n\r\n await locks.acquireLocks({ exclusive: elementId2 });\r\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\r\n await withEditTxn(bc, async txn => {\r\n element2.setUserProperties(\"bar\", Guid.createValue());\r\n element2.update(txn);\r\n });\r\n\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\r\n\r\n // Reverse the later txn using reverseTxns (no lock abandonment).\r\n bc.txns.reverseTxns(1);\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\r\n\r\n // Reverse the earlier txn using reverseTxnsAsync.\r\n // This should also abandon locks for the already-reversed later txn.\r\n await bc.txns.reverseTxnsAsync(1);\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.false;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\r\n });\r\n });\r\n\r\n describe(\"reverseSingleTxnAsync\", () => {\r\n it(\"reverses a single txn and abandons its locks\", async () => {\r\n const elementId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n await locks.acquireLocks({ exclusive: elementId });\r\n\r\n const element = bc.elements.getElement<PhysicalElement>(elementId);\r\n const originalProps = element.getUserProperties(\"foo\");\r\n await withEditTxn(bc, async txn => {\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update(txn);\r\n });\r\n\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.true;\r\n\r\n await bc.txns.reverseSingleTxnAsync();\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.false;\r\n\r\n // Verify the element change was actually reversed.\r\n const revertedElement = bc.elements.getElement<PhysicalElement>(elementId);\r\n expect(revertedElement.getUserProperties(\"foo\")).to.deep.equal(originalProps);\r\n });\r\n });\r\n\r\n describe(\"reverseAllTxnsAsync\", () => {\r\n it(\"reverses all txns and abandons all their locks\", async () => {\r\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\r\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n const orig1 = bc.elements.getElement<PhysicalElement>(elementId1).getUserProperties(\"foo\");\r\n const orig2 = bc.elements.getElement<PhysicalElement>(elementId2).getUserProperties(\"bar\");\r\n\r\n await locks.acquireLocks({ exclusive: elementId1 });\r\n const element1 = bc.elements.getElement<PhysicalElement>(elementId1);\r\n await withEditTxn(bc, async txn => {\r\n element1.setUserProperties(\"foo\", Guid.createValue());\r\n element1.update(txn);\r\n });\r\n\r\n await locks.acquireLocks({ exclusive: elementId2 });\r\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\r\n await withEditTxn(bc, async txn => {\r\n element2.setUserProperties(\"bar\", Guid.createValue());\r\n element2.update(txn);\r\n });\r\n\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\r\n\r\n await bc.txns.reverseAllTxnsAsync();\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.false;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\r\n\r\n // Verify the element changes were actually reversed.\r\n expect(bc.elements.getElement<PhysicalElement>(elementId1).getUserProperties(\"foo\")).to.deep.equal(orig1);\r\n expect(bc.elements.getElement<PhysicalElement>(elementId2).getUserProperties(\"bar\")).to.deep.equal(orig2);\r\n });\r\n });\r\n\r\n describe(\"reverseToTxnAsync\", () => {\r\n it(\"reverses to a specific txn and abandons locks for all reversed txns\", async () => {\r\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\r\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n const origProps2 = bc.elements.getElement<PhysicalElement>(elementId2).getUserProperties(\"bar\");\r\n\r\n await locks.acquireLocks({ exclusive: elementId1 });\r\n const element1 = bc.elements.getElement<PhysicalElement>(elementId1);\r\n await withEditTxn(bc, async txn => {\r\n element1.setUserProperties(\"foo\", Guid.createValue());\r\n element1.update(txn);\r\n });\r\n\r\n const txnAfterFirst = bc.txns.getCurrentTxnId();\r\n\r\n await locks.acquireLocks({ exclusive: elementId2 });\r\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\r\n await withEditTxn(bc, async txn => {\r\n element2.setUserProperties(\"bar\", Guid.createValue());\r\n element2.update(txn);\r\n });\r\n\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\r\n\r\n await bc.txns.reverseToTxnAsync(txnAfterFirst);\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\r\n\r\n // Verify only the second element's changes were reversed.\r\n expect(bc.elements.getElement<PhysicalElement>(elementId2).getUserProperties(\"bar\")).to.deep.equal(origProps2);\r\n });\r\n });\r\n\r\n describe(\"cancelToTxnAsync\", () => {\r\n it(\"cancels to a specific txn and abandons locks for all cancelled txns\", async () => {\r\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\r\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n const origProps2 = bc.elements.getElement<PhysicalElement>(elementId2).getUserProperties(\"bar\");\r\n\r\n await locks.acquireLocks({ exclusive: elementId1 });\r\n const element1 = bc.elements.getElement<PhysicalElement>(elementId1);\r\n await withEditTxn(bc, async txn => {\r\n element1.setUserProperties(\"foo\", Guid.createValue());\r\n element1.update(txn);\r\n });\r\n\r\n const txnAfterFirst = bc.txns.getCurrentTxnId();\r\n\r\n await locks.acquireLocks({ exclusive: elementId2 });\r\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\r\n await withEditTxn(bc, async txn => {\r\n element2.setUserProperties(\"bar\", Guid.createValue());\r\n element2.update(txn);\r\n });\r\n\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\r\n\r\n await bc.txns.cancelToTxnAsync(txnAfterFirst);\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\r\n\r\n // Verify the second element's changes were cancelled.\r\n expect(bc.elements.getElement<PhysicalElement>(elementId2).getUserProperties(\"bar\")).to.deep.equal(origProps2);\r\n\r\n // cancelTo should not allow redo\r\n expect(bc.txns.isRedoPossible).to.be.false;\r\n });\r\n\r\n it(\"after regular cancelTo, locks can be abandoned, but not re-acquired\", async () => {\r\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\r\n\r\n const txnId = bc.txns.getCurrentTxnId();\r\n\r\n await locks.acquireLocks({ exclusive: elementId1 });\r\n const element1 = bc.elements.getElement<PhysicalElement>(elementId1);\r\n await withEditTxn(bc, async txn => {\r\n element1.setUserProperties(\"foo\", Guid.createValue());\r\n element1.update(txn);\r\n });\r\n\r\n // Use the regular cancelTo which does not abandon locks.\r\n bc.txns.cancelTo(txnId);\r\n\r\n // Now try to abandon the locks, which should work.\r\n expect(await locks.abandonLocksForReversedTxn(txnId)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.false;\r\n\r\n // However, it doesn't make sense to reacquire these locks because the Txn no longer exists.\r\n await expect(locks.acquireLocksForReinstatingTxn(txnId)).to.eventually.be.rejectedWith(\"does not exist\");\r\n });\r\n\r\n it(\"canceling a txn prevents subsequent reacquisition of that txn's locks\", async () => {\r\n const elementId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n const txnBefore = bc.txns.getCurrentTxnId();\r\n\r\n await locks.acquireLocks({ exclusive: elementId });\r\n const element = bc.elements.getElement<PhysicalElement>(elementId);\r\n await withEditTxn(bc, async txn => {\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update(txn);\r\n });\r\n\r\n await bc.txns.cancelToTxnAsync(txnBefore);\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.false;\r\n\r\n // Attempting to acquire locks for the cancelled transaction should fail\r\n // because the transaction itself no longer exists and its lock records have been cleared.\r\n await expect(locks.acquireLocksForReinstatingTxn(txnBefore)).to.eventually.be.rejectedWith(\"does not exist\");\r\n });\r\n\r\n it(\"reverses but does not cancel if lock abandonment fails\", async () => {\r\n const elementId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n const txnBefore = bc.txns.getCurrentTxnId();\r\n\r\n await locks.acquireLocks({ exclusive: elementId });\r\n const element = bc.elements.getElement<PhysicalElement>(elementId);\r\n await withEditTxn(bc, async txn => {\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update(txn);\r\n });\r\n\r\n const error = new IModelError(IModelStatus.BadRequest, \"Lock abandonment failed\");\r\n sinonStub(locks, \"abandonLocksForReversedTxn\").rejects(error);\r\n\r\n await expect(bc.txns.cancelToTxnAsync(txnBefore)).to.eventually.be.rejectedWith(IModelError, \"Lock abandonment failed\");\r\n\r\n // The txn was reversed but not canceled, so we can reinstate. Locks are still held.\r\n expect(bc.txns.isRedoPossible).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.true;\r\n\r\n // And now we can try releasing the locks again.\r\n sinonRestore();\r\n await bc.locks.abandonLocksForReversedTxn(txnBefore);\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.false;\r\n\r\n // And cancel the already-reversed txn.\r\n expect(bc.txns.cancelTo(txnBefore)).to.equal(IModelStatus.NothingToUndo);\r\n expect(bc.txns.isRedoPossible).to.be.false;\r\n });\r\n });\r\n\r\n describe(\"reinstateTxnAndAcquireLocks\", () => {\r\n it(\"reinstates a reversed txn and reacquires its locks\", async () => {\r\n const elementId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n await locks.acquireLocks({ exclusive: elementId });\r\n\r\n const element = bc.elements.getElement<PhysicalElement>(elementId);\r\n const originalProps = element.getUserProperties(\"foo\");\r\n const newValue = Guid.createValue();\r\n await withEditTxn(bc, async txn => {\r\n element.setUserProperties(\"foo\", newValue);\r\n element.update(txn);\r\n });\r\n\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.true;\r\n\r\n await bc.txns.reverseTxnsAsync(1);\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.false;\r\n\r\n // Verify the element change was reversed.\r\n expect(bc.elements.getElement<PhysicalElement>(elementId).getUserProperties(\"foo\")).to.deep.equal(originalProps);\r\n\r\n await bc.txns.reinstateTxnAsync();\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.true;\r\n\r\n // Verify the element change was reinstated.\r\n expect(bc.elements.getElement<PhysicalElement>(elementId).getUserProperties(\"foo\")).to.equal(newValue);\r\n });\r\n\r\n it(\"multiple txns reversed together are reinstated as one\", async () => {\r\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\r\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n const orig1 = bc.elements.getElement<PhysicalElement>(elementId1).getUserProperties(\"foo\");\r\n const orig2 = bc.elements.getElement<PhysicalElement>(elementId2).getUserProperties(\"bar\");\r\n\r\n await locks.acquireLocks({ exclusive: elementId1 });\r\n const element1 = bc.elements.getElement<PhysicalElement>(elementId1);\r\n const newValue1 = Guid.createValue();\r\n await withEditTxn(bc, async txn => {\r\n element1.setUserProperties(\"foo\", newValue1);\r\n element1.update(txn);\r\n });\r\n\r\n await locks.acquireLocks({ exclusive: elementId2 });\r\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\r\n const newValue2 = Guid.createValue();\r\n await withEditTxn(bc, async txn => {\r\n element2.setUserProperties(\"bar\", newValue2);\r\n element2.update(txn);\r\n });\r\n\r\n await bc.txns.reverseTxnsAsync(2);\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.false;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\r\n\r\n // Verify both element changes were reversed.\r\n expect(bc.elements.getElement<PhysicalElement>(elementId1).getUserProperties(\"foo\")).to.deep.equal(orig1);\r\n expect(bc.elements.getElement<PhysicalElement>(elementId2).getUserProperties(\"bar\")).to.deep.equal(orig2);\r\n\r\n // A single reinstate should bring back both txns and reacquire all locks.\r\n await bc.txns.reinstateTxnAsync();\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\r\n\r\n // Verify both element changes are reinstated.\r\n expect(bc.elements.getElement<PhysicalElement>(elementId1).getUserProperties(\"foo\")).to.equal(newValue1);\r\n expect(bc.elements.getElement<PhysicalElement>(elementId2).getUserProperties(\"bar\")).to.equal(newValue2);\r\n });\r\n\r\n it(\"abandons unsaved changes before reinstatement\", async () => {\r\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\r\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n // Make a change, save it, and reverse it.\r\n await locks.acquireLocks({ exclusive: elementId1 });\r\n const element1 = bc.elements.getElement<PhysicalElement>(elementId1);\r\n const originalProps1 = element1.getUserProperties(\"foo\");\r\n const newValue1 = Guid.createValue();\r\n await withEditTxn(bc, async txn => {\r\n element1.setUserProperties(\"foo\", newValue1);\r\n element1.update(txn);\r\n });\r\n\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\r\n\r\n await bc.txns.reverseTxnsAsync(1);\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.false;\r\n\r\n // Verify the element change was reversed.\r\n expect(bc.elements.getElement<PhysicalElement>(elementId1).getUserProperties(\"foo\")).to.deep.equal(originalProps1);\r\n\r\n // Now make an unsaved change to a different element.\r\n await locks.acquireLocks({ exclusive: elementId2 });\r\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\r\n const originalProps2 = element2.getUserProperties(\"bar\");\r\n const newValue2 = Guid.createValue();\r\n\r\n await withEditTxn(bc, async txn => {\r\n element2.setUserProperties(\"bar\", newValue2);\r\n element2.update(txn);\r\n\r\n // Verify the unsaved change is present and lock is held.\r\n expect(bc.txns.hasUnsavedChanges).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\r\n expect(bc.elements.getElement<PhysicalElement>(elementId2).getUserProperties(\"bar\")).to.equal(newValue2);\r\n\r\n // Reinstate the first txn. This should:\r\n // 1. Abandon the unsaved change to element2\r\n // 2. Abandon the lock on element2\r\n // 3. Reinstate the change to element1\r\n // 4. Reacquire the lock on element1\r\n await bc.txns.reinstateTxnAsync();\r\n\r\n // Verify the unsaved change was abandoned.\r\n expect(bc.txns.hasUnsavedChanges).to.be.false;\r\n expect(bc.elements.getElement<PhysicalElement>(elementId2).getUserProperties(\"bar\")).to.deep.equal(originalProps2);\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\r\n\r\n // Verify the first change was reinstated and its lock reacquired.\r\n expect(bc.elements.getElement<PhysicalElement>(elementId1).getUserProperties(\"foo\")).to.equal(newValue1);\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\r\n });\r\n });\r\n\r\n describe(\"throws and leaves locks acquired if reinstateTxn fails\", async () => {\r\n let elementId: string | undefined;\r\n let fooValue: string | undefined;\r\n\r\n beforeEach(async () => {\r\n elementId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n await locks.acquireLocks({ exclusive: elementId });\r\n const element = bc.elements.getElement<PhysicalElement>(elementId);\r\n fooValue = Guid.createValue();\r\n await withEditTxn(bc, async txn => {\r\n element.setUserProperties(\"foo\", fooValue);\r\n element.update(txn);\r\n });\r\n\r\n await bc.txns.reverseTxnsAsync(1);\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.false;\r\n\r\n sinonStub(bc.txns, \"reinstateTxn\").returns(IModelStatus.BadRequest);\r\n\r\n await expect(bc.txns.reinstateTxnAsync()).to.eventually.be.rejectedWith(IModelError, \"Bad Request\");\r\n\r\n // Even though it failed to reinstate, it obtained the lock and did not release it.\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.true;\r\n });\r\n\r\n it(\"and we can try reinstating again, without any problems caused by the locks already being acquired\", async () => {\r\n sinonRestore();\r\n await bc.txns.reinstateTxnAsync();\r\n expect(locks.holdsExclusiveLock(elementId!)).to.be.true;\r\n expect(bc.elements.getElement<PhysicalElement>(elementId!).getUserProperties(\"foo\")).to.equal(fooValue);\r\n });\r\n\r\n it(\"and we can then release the locks\", async () => {\r\n await locks.abandonLocksForReversedTxn(bc.txns.getCurrentTxnId());\r\n expect(locks.holdsExclusiveLock(elementId!)).to.be.false;\r\n });\r\n });\r\n\r\n it(\"throws and does not reinstate if acquireLocksForReinstatingTxn fails\", async () => {\r\n const elementId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n await locks.acquireLocks({ exclusive: elementId });\r\n const element = bc.elements.getElement<PhysicalElement>(elementId);\r\n const originalProps = element.getUserProperties(\"foo\");\r\n const newValue = Guid.createValue();\r\n await withEditTxn(bc, async txn => {\r\n element.setUserProperties(\"foo\", newValue);\r\n element.update(txn);\r\n });\r\n\r\n await bc.txns.reverseTxnsAsync(1);\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.false;\r\n\r\n // Verify the element change was reversed.\r\n expect(bc.elements.getElement<PhysicalElement>(elementId).getUserProperties(\"foo\")).to.deep.equal(originalProps);\r\n\r\n // Simulate acquireLocksForReinstatingTxn failing (e.g. because another briefcase holds the lock)\r\n const error = new LockConflict(0x12345, \"other briefcase alias\", \"exclusive lock is already held\");\r\n sinonStub(locks, \"acquireLocksForReinstatingTxn\").rejects(error);\r\n\r\n await expect(bc.txns.reinstateTxnAsync()).to.eventually.be.rejectedWith(\"exclusive lock is already held\");\r\n\r\n // Verify it was NOT reinstated\r\n expect(bc.elements.getElement<PhysicalElement>(elementId).getUserProperties(\"foo\")).to.deep.equal(originalProps);\r\n });\r\n\r\n it(\"new changes after reversal truncate the redo stack and clear reversible lock records\", async () => {\r\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\r\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n // 1. Make a change to element 1 and save it.\r\n await locks.acquireLocks({ exclusive: elementId1 });\r\n const element1 = bc.elements.getElement<PhysicalElement>(elementId1);\r\n await withEditTxn(bc, async txn => {\r\n element1.setUserProperties(\"foo\", Guid.createValue());\r\n element1.update(txn);\r\n });\r\n\r\n const txn1Id = bc.txns.getCurrentTxnId();\r\n\r\n // 2. Reverse the txn and abandon locks.\r\n await bc.txns.reverseTxnsAsync(1);\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.false;\r\n expect(bc.txns.isRedoPossible).to.be.true;\r\n\r\n // 3. Make a change to element 2 and save it. This truncates the redo stack.\r\n await locks.acquireLocks({ exclusive: elementId2 });\r\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\r\n await withEditTxn(bc, async txn => {\r\n element2.setUserProperties(\"bar\", Guid.createValue());\r\n element2.update(txn);\r\n });\r\n\r\n // The redo stack should now be truncated.\r\n expect(bc.txns.isRedoPossible).to.be.false;\r\n\r\n // 4. Try to reacquire locks for the truncated transaction.\r\n await expect(locks.acquireLocksForReinstatingTxn(txn1Id)).to.eventually.be.rejectedWith(\"does not exist\");\r\n });\r\n\r\n it(\"abandoned changes after reversal do not prevent reinstatement\", async () => {\r\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\r\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n // 1. Make a change to element 1 and save it.\r\n await locks.acquireLocks({ exclusive: elementId1 });\r\n const element1 = bc.elements.getElement<PhysicalElement>(elementId1);\r\n const newValue1 = Guid.createValue();\r\n await withEditTxn(bc, async txn => {\r\n element1.setUserProperties(\"foo\", newValue1);\r\n element1.update(txn);\r\n });\r\n\r\n // 2. Reverse the txn and abandon locks.\r\n await bc.txns.reverseTxnsAsync(1);\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.false;\r\n expect(bc.txns.isRedoPossible).to.be.true;\r\n\r\n // 3. Make a change to element 2 and abandon it.\r\n await locks.acquireLocks({ exclusive: elementId2 });\r\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\r\n await withEditTxn(bc, async txn => {\r\n element2.setUserProperties(\"bar\", Guid.createValue());\r\n element2.update(txn);\r\n txn.abandonChanges();\r\n });\r\n\r\n expect(bc.txns.isRedoPossible).to.be.true;\r\n\r\n // 4. Reinstate should still work.\r\n await bc.txns.reinstateTxnAsync();\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\r\n expect(bc.elements.getElement<PhysicalElement>(elementId1).getUserProperties(\"foo\")).to.equal(newValue1);\r\n });\r\n });\r\n });\r\n});\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"Setting.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/Setting.test.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 { expect } from \"chai\";\nimport { Setting } from \"../../workspace/Settings\";\n\ndescribe(\"Setting\", () => {\n describe(\"areEqual\", () => {\n it(\"should return true for two identical primitive values\", () => {\n expect(Setting.areEqual(5, 5)).to.be.true;\n expect(Setting.areEqual(\"test\", \"test\")).to.be.true;\n expect(Setting.areEqual(undefined, undefined)).to.be.true;\n });\n\n it(\"should return false for two different primitive values\", () => {\n expect(Setting.areEqual(5, 6)).to.be.false;\n expect(Setting.areEqual(\"test\", \"test1\")).to.be.false;\n expect(Setting.areEqual(undefined, \"undefined\")).to.be.false;\n });\n\n it(\"should return true for two identical arrays\", () => {\n expect(Setting.areEqual([1, 2, 3], [1, 2, 3])).to.be.true;\n });\n\n it(\"should return false for two different arrays\", () => {\n expect(Setting.areEqual([1, 2, 3], [1, 2, 4])).to.be.false;\n expect(Setting.areEqual([1, 2, 3], [1, 2, 3, 4])).to.be.false;\n });\n\n it(\"should return true for two identical objects\", () => {\n const obj1: Setting = { key: \"test\", value: \"value\" };\n const obj2: Setting = { key: \"test\", value: \"value\" };\n expect(Setting.areEqual(obj1, obj2)).to.be.true;\n });\n\n it(\"should return false for two different objects\", () => {\n const obj1: Setting = { key: \"test\", value: \"value\" };\n const obj2: Setting = { key: \"test1\", value: \"value\" };\n const obj3: Setting = { key: \"test\", value: \"value1\" };\n expect(Setting.areEqual(obj1, obj2)).to.be.false;\n expect(Setting.areEqual(obj1, obj3)).to.be.false;\n });\n\n it(\"should return true for two identical nested objects\", () => {\n const obj1: Setting = { key: \"test\", value: { subKey: \"subValue\" } };\n const obj2: Setting = { key: \"test\", value: { subKey: \"subValue\" } };\n expect(Setting.areEqual(obj1, obj2)).to.be.true;\n });\n\n it(\"should return false for two different nested objects\", () => {\n const obj1: Setting = { key: \"test\", value: { subKey: \"subValue\" } };\n const obj2: Setting = { key: \"test\", value: { subKey: \"subValue1\" } };\n expect(Setting.areEqual(obj1, obj2)).to.be.false;\n });\n\n it(\"should return true for two identical nested arrays\", () => {\n expect(Setting.areEqual([[1, 2], [3, 4]], [[1, 2], [3, 4]])).to.be.true;\n });\n\n it(\"should return false for two different nested arrays\", () => {\n expect(Setting.areEqual([[1, 2], [3, 4]], [[1, 2], [3, 5]])).to.be.false;\n });\n\n it(\"should return false for different types\", () => {\n expect(Setting.areEqual(\"1\", 1)).to.be.false;\n expect(Setting.areEqual([], { })).to.be.false;\n expect(Setting.areEqual(false, undefined)).to.be.false;\n expect(Setting.areEqual(\"\", false)).to.be.false;\n expect(Setting.areEqual([8, 9], { 0: 8, 1: 9 })).to.be.false;\n });\n\n it(\"should return true if objects have the same properties in different orders\", () => {\n const a: Setting = { x: 5, y: 10 };\n const b: Setting = { y: 10, x: 5 };\n expect(JSON.stringify(a)).not.to.equal(JSON.stringify(b));\n expect(Setting.areEqual(a, b)).to.be.true;\n expect(Setting.areEqual(b, a)).to.be.true;\n });\n\n it(\"should return false for objects with different numbers of properties\", () => {\n const a: Setting = { x: 5, y: 10 };\n const b: Setting = { x: 5, y: 10, z: 0 };\n expect(Setting.areEqual(a, b)).to.be.false;\n expect(Setting.areEqual(b, a)).to.be.false;\n });\n });\n});\n"]}
1
+ {"version":3,"file":"Setting.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/Setting.test.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 { expect } from \"chai\";\r\nimport { Setting } from \"../../workspace/Settings\";\r\n\r\ndescribe(\"Setting\", () => {\r\n describe(\"areEqual\", () => {\r\n it(\"should return true for two identical primitive values\", () => {\r\n expect(Setting.areEqual(5, 5)).to.be.true;\r\n expect(Setting.areEqual(\"test\", \"test\")).to.be.true;\r\n expect(Setting.areEqual(undefined, undefined)).to.be.true;\r\n });\r\n\r\n it(\"should return false for two different primitive values\", () => {\r\n expect(Setting.areEqual(5, 6)).to.be.false;\r\n expect(Setting.areEqual(\"test\", \"test1\")).to.be.false;\r\n expect(Setting.areEqual(undefined, \"undefined\")).to.be.false;\r\n });\r\n\r\n it(\"should return true for two identical arrays\", () => {\r\n expect(Setting.areEqual([1, 2, 3], [1, 2, 3])).to.be.true;\r\n });\r\n\r\n it(\"should return false for two different arrays\", () => {\r\n expect(Setting.areEqual([1, 2, 3], [1, 2, 4])).to.be.false;\r\n expect(Setting.areEqual([1, 2, 3], [1, 2, 3, 4])).to.be.false;\r\n });\r\n\r\n it(\"should return true for two identical objects\", () => {\r\n const obj1: Setting = { key: \"test\", value: \"value\" };\r\n const obj2: Setting = { key: \"test\", value: \"value\" };\r\n expect(Setting.areEqual(obj1, obj2)).to.be.true;\r\n });\r\n\r\n it(\"should return false for two different objects\", () => {\r\n const obj1: Setting = { key: \"test\", value: \"value\" };\r\n const obj2: Setting = { key: \"test1\", value: \"value\" };\r\n const obj3: Setting = { key: \"test\", value: \"value1\" };\r\n expect(Setting.areEqual(obj1, obj2)).to.be.false;\r\n expect(Setting.areEqual(obj1, obj3)).to.be.false;\r\n });\r\n\r\n it(\"should return true for two identical nested objects\", () => {\r\n const obj1: Setting = { key: \"test\", value: { subKey: \"subValue\" } };\r\n const obj2: Setting = { key: \"test\", value: { subKey: \"subValue\" } };\r\n expect(Setting.areEqual(obj1, obj2)).to.be.true;\r\n });\r\n\r\n it(\"should return false for two different nested objects\", () => {\r\n const obj1: Setting = { key: \"test\", value: { subKey: \"subValue\" } };\r\n const obj2: Setting = { key: \"test\", value: { subKey: \"subValue1\" } };\r\n expect(Setting.areEqual(obj1, obj2)).to.be.false;\r\n });\r\n\r\n it(\"should return true for two identical nested arrays\", () => {\r\n expect(Setting.areEqual([[1, 2], [3, 4]], [[1, 2], [3, 4]])).to.be.true;\r\n });\r\n\r\n it(\"should return false for two different nested arrays\", () => {\r\n expect(Setting.areEqual([[1, 2], [3, 4]], [[1, 2], [3, 5]])).to.be.false;\r\n });\r\n\r\n it(\"should return false for different types\", () => {\r\n expect(Setting.areEqual(\"1\", 1)).to.be.false;\r\n expect(Setting.areEqual([], { })).to.be.false;\r\n expect(Setting.areEqual(false, undefined)).to.be.false;\r\n expect(Setting.areEqual(\"\", false)).to.be.false;\r\n expect(Setting.areEqual([8, 9], { 0: 8, 1: 9 })).to.be.false;\r\n });\r\n\r\n it(\"should return true if objects have the same properties in different orders\", () => {\r\n const a: Setting = { x: 5, y: 10 };\r\n const b: Setting = { y: 10, x: 5 };\r\n expect(JSON.stringify(a)).not.to.equal(JSON.stringify(b));\r\n expect(Setting.areEqual(a, b)).to.be.true;\r\n expect(Setting.areEqual(b, a)).to.be.true;\r\n });\r\n\r\n it(\"should return false for objects with different numbers of properties\", () => {\r\n const a: Setting = { x: 5, y: 10 };\r\n const b: Setting = { x: 5, y: 10, z: 0 };\r\n expect(Setting.areEqual(a, b)).to.be.false;\r\n expect(Setting.areEqual(b, a)).to.be.false;\r\n });\r\n });\r\n});\r\n"]}
@@ -6,6 +6,7 @@ import { expect } from "chai";
6
6
  import { assert, OpenMode } from "@itwin/core-bentley";
7
7
  import { StandaloneDb } from "../../IModelDb";
8
8
  import { IModelHost } from "../../IModelHost";
9
+ import { withEditTxn } from "../../EditTxn";
9
10
  import { SettingsPriority } from "../../workspace/Settings";
10
11
  import { IModelTestUtils } from "../IModelTestUtils";
11
12
  import { GeoCoordConfig } from "../../GeoCoordConfig";
@@ -261,18 +262,20 @@ describe("Settings", () => {
261
262
  const gcsDbDict = {
262
263
  "gcs/databases": ["gcs/Usa", "gcs/Canada"],
263
264
  };
264
- iModel2.saveSettingDictionary("gcs-dbs", gcsDbDict);
265
- iModel2.saveSettingDictionary("test1", setting1);
265
+ withEditTxn(iModel2, (txn) => {
266
+ txn.saveSettingDictionary("gcs-dbs", gcsDbDict);
267
+ txn.saveSettingDictionary("test1", setting1);
268
+ });
266
269
  iModel2.close();
267
270
  let iModel3 = StandaloneDb.openFile(iModelName, OpenMode.ReadWrite);
268
271
  expect(iModel3.workspace.settings.getObject("gcs/databases")).to.deep.equal(gcsDbDict["gcs/databases"]);
269
272
  expect(iModel3.workspace.settings.getString("imodel/setting1")).equal(setting1["imodel/setting1"]);
270
- iModel3.saveSettingDictionary("test1", setting1changed);
273
+ withEditTxn(iModel3, (txn) => txn.saveSettingDictionary("test1", setting1changed));
271
274
  iModel3.close();
272
275
  iModel3 = StandaloneDb.openFile(iModelName);
273
276
  expect(iModel3.workspace.settings.getObject("gcs/databases")).to.deep.equal(gcsDbDict["gcs/databases"]);
274
277
  expect(iModel3.workspace.settings.getString("imodel/setting1")).equal(setting1changed["imodel/setting1"]);
275
- iModel3.deleteSettingDictionary("test1");
278
+ withEditTxn(iModel3, (txn) => txn.deleteSettingDictionary("test1"));
276
279
  iModel3.close();
277
280
  iModel3 = StandaloneDb.openFile(iModelName);
278
281
  expect(iModel3.workspace.settings.getObject("gcs/databases")).to.deep.equal(gcsDbDict["gcs/databases"]);
@@ -363,5 +366,24 @@ describe("Settings", () => {
363
366
  expect(dict.getSetting("test/string")).to.equal("hello");
364
367
  settings.dropDictionary({ name: "toJsonTest" });
365
368
  });
369
+ it("dictionaries with same name but different workspaceDb are independent", () => {
370
+ const settings = iModel.workspace.settings;
371
+ const fakeWorkspaceDb1 = { name: "fakeDb1" };
372
+ const fakeWorkspaceDb2 = { name: "fakeDb2" };
373
+ settings.addDictionary({ name: "shared-name", priority: SettingsPriority.iTwin, workspaceDb: fakeWorkspaceDb1 }, { "test/value": "from-db1" });
374
+ settings.addDictionary({ name: "shared-name", priority: SettingsPriority.iTwin, workspaceDb: fakeWorkspaceDb2 }, { "test/value": "from-db2" });
375
+ // Both dictionaries should exist since they have different workspaceDb
376
+ const dict1 = settings.getDictionary({ name: "shared-name", workspaceDb: fakeWorkspaceDb1 });
377
+ const dict2 = settings.getDictionary({ name: "shared-name", workspaceDb: fakeWorkspaceDb2 });
378
+ expect(dict1).to.not.be.undefined;
379
+ expect(dict2).to.not.be.undefined;
380
+ expect(dict1.getSetting("test/value")).to.equal("from-db1");
381
+ expect(dict2.getSetting("test/value")).to.equal("from-db2");
382
+ // Drop only one — the other should remain
383
+ settings.dropDictionary({ name: "shared-name", workspaceDb: fakeWorkspaceDb1 });
384
+ expect(settings.getDictionary({ name: "shared-name", workspaceDb: fakeWorkspaceDb1 })).to.be.undefined;
385
+ expect(settings.getDictionary({ name: "shared-name", workspaceDb: fakeWorkspaceDb2 })).to.not.be.undefined;
386
+ settings.dropDictionary({ name: "shared-name", workspaceDb: fakeWorkspaceDb2 });
387
+ });
366
388
  });
367
389
  //# sourceMappingURL=Settings.test.js.map