@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.
- package/CHANGELOG.md +30 -1
- package/lib/cjs/BackendHubAccess.d.ts +38 -0
- package/lib/cjs/BackendHubAccess.d.ts.map +1 -1
- package/lib/cjs/BackendHubAccess.js.map +1 -1
- package/lib/cjs/BackendLoggerCategory.js.map +1 -1
- package/lib/cjs/BisCoreSchema.js.map +1 -1
- package/lib/cjs/BlobContainerService.js.map +1 -1
- package/lib/cjs/BriefcaseManager.js +3 -3
- package/lib/cjs/BriefcaseManager.js.map +1 -1
- package/lib/cjs/CatalogDb.js.map +1 -1
- package/lib/cjs/Category.d.ts +37 -7
- package/lib/cjs/Category.d.ts.map +1 -1
- package/lib/cjs/Category.js +33 -42
- package/lib/cjs/Category.js.map +1 -1
- package/lib/cjs/ChangeSummaryManager.js +2 -2
- package/lib/cjs/ChangeSummaryManager.js.map +1 -1
- package/lib/cjs/ChangedElementsDb.js.map +1 -1
- package/lib/cjs/ChangesetECAdaptor.d.ts.map +1 -1
- package/lib/cjs/ChangesetECAdaptor.js +253 -250
- package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
- package/lib/cjs/ChannelControl.d.ts +29 -0
- package/lib/cjs/ChannelControl.d.ts.map +1 -1
- package/lib/cjs/ChannelControl.js.map +1 -1
- package/lib/cjs/CheckpointManager.js +1 -1
- package/lib/cjs/CheckpointManager.js.map +1 -1
- package/lib/cjs/ClassRegistry.js +5 -5
- package/lib/cjs/ClassRegistry.js.map +1 -1
- package/lib/cjs/CloudSqlite.d.ts +1 -1
- package/lib/cjs/CloudSqlite.d.ts.map +1 -1
- package/lib/cjs/CloudSqlite.js +68 -13
- package/lib/cjs/CloudSqlite.js.map +1 -1
- package/lib/cjs/CodeService.js.map +1 -1
- package/lib/cjs/CodeSpecs.d.ts +32 -3
- package/lib/cjs/CodeSpecs.d.ts.map +1 -1
- package/lib/cjs/CodeSpecs.js +48 -20
- package/lib/cjs/CodeSpecs.js.map +1 -1
- package/lib/cjs/ConcurrentQuery.js.map +1 -1
- package/lib/cjs/CustomViewState3dCreator.js.map +1 -1
- package/lib/cjs/DevTools.js.map +1 -1
- package/lib/cjs/DisplayStyle.d.ts +18 -3
- package/lib/cjs/DisplayStyle.d.ts.map +1 -1
- package/lib/cjs/DisplayStyle.js +10 -21
- package/lib/cjs/DisplayStyle.js.map +1 -1
- package/lib/cjs/ECDb.js.map +1 -1
- package/lib/cjs/ECSchemaXmlContext.js.map +1 -1
- package/lib/cjs/ECSqlRowExecutor.js.map +1 -1
- package/lib/cjs/ECSqlStatement.js.map +1 -1
- package/lib/cjs/ECSqlSyncReader.js.map +1 -1
- package/lib/cjs/EditTxn.d.ts +262 -0
- package/lib/cjs/EditTxn.d.ts.map +1 -0
- package/lib/cjs/EditTxn.js +548 -0
- package/lib/cjs/EditTxn.js.map +1 -0
- package/lib/cjs/Element.d.ts +74 -5
- package/lib/cjs/Element.d.ts.map +1 -1
- package/lib/cjs/Element.js +63 -75
- package/lib/cjs/Element.js.map +1 -1
- package/lib/cjs/ElementAspect.d.ts +10 -0
- package/lib/cjs/ElementAspect.d.ts.map +1 -1
- package/lib/cjs/ElementAspect.js +21 -12
- package/lib/cjs/ElementAspect.js.map +1 -1
- package/lib/cjs/ElementGraphics.js.map +1 -1
- package/lib/cjs/ElementTreeWalker.d.ts +56 -3
- package/lib/cjs/ElementTreeWalker.d.ts.map +1 -1
- package/lib/cjs/ElementTreeWalker.js +53 -40
- package/lib/cjs/ElementTreeWalker.js.map +1 -1
- package/lib/cjs/Entity.js.map +1 -1
- package/lib/cjs/EntityReferences.js.map +1 -1
- package/lib/cjs/ExportGraphics.js.map +1 -1
- package/lib/cjs/ExternalSource.d.ts +11 -2
- package/lib/cjs/ExternalSource.d.ts.map +1 -1
- package/lib/cjs/ExternalSource.js +10 -8
- package/lib/cjs/ExternalSource.js.map +1 -1
- package/lib/cjs/FontFile.js.map +1 -1
- package/lib/cjs/GeoCoordConfig.js.map +1 -1
- package/lib/cjs/GeographicCRSServices.js.map +1 -1
- package/lib/cjs/GeometrySummary.js +47 -47
- package/lib/cjs/GeometrySummary.js.map +1 -1
- package/lib/cjs/IModelDb.d.ts +74 -23
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +193 -297
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/IModelDbFonts.js.map +1 -1
- package/lib/cjs/IModelElementCloneContext.js.map +1 -1
- package/lib/cjs/IModelHost.d.ts +58 -1
- package/lib/cjs/IModelHost.d.ts.map +1 -1
- package/lib/cjs/IModelHost.js +89 -0
- package/lib/cjs/IModelHost.js.map +1 -1
- package/lib/cjs/IModelIncrementalSchemaLocater.js.map +1 -1
- package/lib/cjs/IModelJsFs.js.map +1 -1
- package/lib/cjs/ImageSourceConversion.js.map +1 -1
- package/lib/cjs/IpcHost.d.ts.map +1 -1
- package/lib/cjs/IpcHost.js +35 -15
- package/lib/cjs/IpcHost.js.map +1 -1
- package/lib/cjs/LineStyle.d.ts +47 -7
- package/lib/cjs/LineStyle.d.ts.map +1 -1
- package/lib/cjs/LineStyle.js +38 -33
- package/lib/cjs/LineStyle.js.map +1 -1
- package/lib/cjs/LocalHub.js +1 -1
- package/lib/cjs/LocalHub.js.map +1 -1
- package/lib/cjs/LocalhostIpcHost.js.map +1 -1
- package/lib/cjs/LockControl.d.ts +85 -1
- package/lib/cjs/LockControl.d.ts.map +1 -1
- package/lib/cjs/LockControl.js.map +1 -1
- package/lib/cjs/Material.d.ts +8 -1
- package/lib/cjs/Material.d.ts.map +1 -1
- package/lib/cjs/Material.js +6 -12
- package/lib/cjs/Material.js.map +1 -1
- package/lib/cjs/Model.d.ts +59 -20
- package/lib/cjs/Model.d.ts.map +1 -1
- package/lib/cjs/Model.js +38 -80
- package/lib/cjs/Model.js.map +1 -1
- package/lib/cjs/NativeAppStorage.js.map +1 -1
- package/lib/cjs/NativeHost.js.map +1 -1
- package/lib/cjs/NavigationRelationship.js.map +1 -1
- package/lib/cjs/PromiseMemoizer.js.map +1 -1
- package/lib/cjs/PropertyStore.js.map +1 -1
- package/lib/cjs/Relationship.d.ts +72 -7
- package/lib/cjs/Relationship.d.ts.map +1 -1
- package/lib/cjs/Relationship.js +39 -21
- package/lib/cjs/Relationship.js.map +1 -1
- package/lib/cjs/RpcBackend.js.map +1 -1
- package/lib/cjs/SQLiteDb.js.map +1 -1
- package/lib/cjs/Schema.js.map +1 -1
- package/lib/cjs/SchemaSync.js +4 -4
- package/lib/cjs/SchemaSync.js.map +1 -1
- package/lib/cjs/SchemaUtils.js.map +1 -1
- package/lib/cjs/SheetIndex.d.ts +9 -0
- package/lib/cjs/SheetIndex.d.ts.map +1 -1
- package/lib/cjs/SheetIndex.js +38 -35
- package/lib/cjs/SheetIndex.js.map +1 -1
- package/lib/cjs/SqliteChangesetReader.js.map +1 -1
- package/lib/cjs/SqliteStatement.js.map +1 -1
- package/lib/cjs/StashManager.js +1 -1
- package/lib/cjs/StashManager.js.map +1 -1
- package/lib/cjs/Texture.d.ts +6 -0
- package/lib/cjs/Texture.d.ts.map +1 -1
- package/lib/cjs/Texture.js +6 -14
- package/lib/cjs/Texture.js.map +1 -1
- package/lib/cjs/TileStorage.js.map +1 -1
- package/lib/cjs/TxnManager.d.ts +105 -9
- package/lib/cjs/TxnManager.d.ts.map +1 -1
- package/lib/cjs/TxnManager.js +194 -15
- package/lib/cjs/TxnManager.js.map +1 -1
- package/lib/cjs/ViewDefinition.d.ts +21 -1
- package/lib/cjs/ViewDefinition.d.ts.map +1 -1
- package/lib/cjs/ViewDefinition.js +27 -66
- package/lib/cjs/ViewDefinition.js.map +1 -1
- package/lib/cjs/ViewStateHydrator.js.map +1 -1
- package/lib/cjs/ViewStore.js.map +1 -1
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts +14 -6
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.js +33 -27
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.js.map +1 -1
- package/lib/cjs/annotations/FrameGeometry.js.map +1 -1
- package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
- package/lib/cjs/annotations/TextAnnotationElement.d.ts.map +1 -1
- package/lib/cjs/annotations/TextAnnotationElement.js +6 -5
- package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
- package/lib/cjs/annotations/TextAnnotationGeometry.js.map +1 -1
- package/lib/cjs/annotations/TextBlockGeometry.js.map +1 -1
- package/lib/cjs/annotations/TextBlockLayout.js.map +1 -1
- package/lib/cjs/assets/IModelChange.02.00.00.ecschema.xml +90 -90
- package/lib/cjs/assets/Settings/Schemas/Base.Schema.json +32 -32
- package/lib/cjs/assets/Settings/Schemas/Gcs.schema.json +27 -27
- package/lib/cjs/assets/Settings/Schemas/Workspace.Schema.json +94 -94
- package/lib/cjs/assets/Settings/backend.setting.json5 +21 -21
- package/lib/cjs/core-backend.d.ts +1 -0
- package/lib/cjs/core-backend.d.ts.map +1 -1
- package/lib/cjs/core-backend.js +1 -0
- package/lib/cjs/core-backend.js.map +1 -1
- package/lib/cjs/domains/FunctionalElements.d.ts +6 -2
- package/lib/cjs/domains/FunctionalElements.d.ts.map +1 -1
- package/lib/cjs/domains/FunctionalElements.js +8 -13
- package/lib/cjs/domains/FunctionalElements.js.map +1 -1
- package/lib/cjs/domains/FunctionalSchema.js.map +1 -1
- package/lib/cjs/domains/GenericElements.d.ts +11 -4
- package/lib/cjs/domains/GenericElements.d.ts.map +1 -1
- package/lib/cjs/domains/GenericElements.js +13 -24
- package/lib/cjs/domains/GenericElements.js.map +1 -1
- package/lib/cjs/domains/GenericSchema.js.map +1 -1
- package/lib/cjs/internal/ChangesetConflictArgs.js.map +1 -1
- package/lib/cjs/internal/ChannelAdmin.d.ts +15 -0
- package/lib/cjs/internal/ChannelAdmin.d.ts.map +1 -1
- package/lib/cjs/internal/ChannelAdmin.js +5 -3
- package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
- package/lib/cjs/internal/ElementLRUCache.js.map +1 -1
- package/lib/cjs/internal/FontFileImpl.js.map +1 -1
- package/lib/cjs/internal/HubMock.d.ts +2 -0
- package/lib/cjs/internal/HubMock.d.ts.map +1 -1
- package/lib/cjs/internal/HubMock.js +7 -0
- package/lib/cjs/internal/HubMock.js.map +1 -1
- package/lib/cjs/internal/IModelDbFontsImpl.js.map +1 -1
- package/lib/cjs/internal/IntegrityCheck.js.map +1 -1
- package/lib/cjs/internal/NativePlatform.js.map +1 -1
- package/lib/cjs/internal/NoLocks.d.ts.map +1 -1
- package/lib/cjs/internal/NoLocks.js +6 -0
- package/lib/cjs/internal/NoLocks.js.map +1 -1
- package/lib/cjs/internal/OnlineStatus.js.map +1 -1
- package/lib/cjs/internal/ServerBasedLocks.d.ts +12 -0
- package/lib/cjs/internal/ServerBasedLocks.d.ts.map +1 -1
- package/lib/cjs/internal/ServerBasedLocks.js +285 -4
- package/lib/cjs/internal/ServerBasedLocks.js.map +1 -1
- package/lib/cjs/internal/Symbols.d.ts +4 -0
- package/lib/cjs/internal/Symbols.d.ts.map +1 -1
- package/lib/cjs/internal/Symbols.js +5 -1
- package/lib/cjs/internal/Symbols.js.map +1 -1
- package/lib/cjs/internal/annotations/fields.d.ts +3 -2
- package/lib/cjs/internal/annotations/fields.d.ts.map +1 -1
- package/lib/cjs/internal/annotations/fields.js +7 -6
- package/lib/cjs/internal/annotations/fields.js.map +1 -1
- package/lib/cjs/internal/cross-package.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsEditorImpl.d.ts +18 -3
- package/lib/cjs/internal/workspace/SettingsEditorImpl.d.ts.map +1 -1
- package/lib/cjs/internal/workspace/SettingsEditorImpl.js +49 -242
- package/lib/cjs/internal/workspace/SettingsEditorImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsImpl.d.ts.map +1 -1
- package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsSchemasImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts +0 -1
- package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceImpl.js +70 -41
- package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
- package/lib/cjs/rpc/multipart.js.map +1 -1
- package/lib/cjs/rpc/tracing.js.map +1 -1
- package/lib/cjs/rpc/web/logging.js.map +1 -1
- package/lib/cjs/rpc/web/request.js.map +1 -1
- package/lib/cjs/rpc/web/response.js.map +1 -1
- package/lib/cjs/rpc-impl/DevToolsRpcImpl.js.map +1 -1
- package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
- package/lib/cjs/rpc-impl/IModelTileRpcImpl.js.map +1 -1
- package/lib/cjs/rpc-impl/RpcBriefcaseUtility.d.ts.map +1 -1
- package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
- package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
- package/lib/cjs/workspace/Settings.d.ts +11 -5
- package/lib/cjs/workspace/Settings.d.ts.map +1 -1
- package/lib/cjs/workspace/Settings.js.map +1 -1
- package/lib/cjs/workspace/SettingsDb.d.ts +20 -99
- package/lib/cjs/workspace/SettingsDb.d.ts.map +1 -1
- package/lib/cjs/workspace/SettingsDb.js +23 -7
- package/lib/cjs/workspace/SettingsDb.js.map +1 -1
- package/lib/cjs/workspace/SettingsEditor.d.ts +40 -226
- package/lib/cjs/workspace/SettingsEditor.d.ts.map +1 -1
- package/lib/cjs/workspace/SettingsEditor.js +86 -25
- package/lib/cjs/workspace/SettingsEditor.js.map +1 -1
- package/lib/cjs/workspace/SettingsSchemas.js.map +1 -1
- package/lib/cjs/workspace/Workspace.d.ts +7 -11
- package/lib/cjs/workspace/Workspace.d.ts.map +1 -1
- package/lib/cjs/workspace/Workspace.js.map +1 -1
- package/lib/cjs/workspace/WorkspaceEditor.d.ts +14 -0
- package/lib/cjs/workspace/WorkspaceEditor.d.ts.map +1 -1
- package/lib/cjs/workspace/WorkspaceEditor.js +1 -1
- package/lib/cjs/workspace/WorkspaceEditor.js.map +1 -1
- package/lib/esm/BackendHubAccess.d.ts +38 -0
- package/lib/esm/BackendHubAccess.d.ts.map +1 -1
- package/lib/esm/BackendHubAccess.js.map +1 -1
- package/lib/esm/BackendLoggerCategory.js.map +1 -1
- package/lib/esm/BisCoreSchema.js.map +1 -1
- package/lib/esm/BlobContainerService.js.map +1 -1
- package/lib/esm/BriefcaseManager.js +3 -3
- package/lib/esm/BriefcaseManager.js.map +1 -1
- package/lib/esm/CatalogDb.js.map +1 -1
- package/lib/esm/Category.d.ts +37 -7
- package/lib/esm/Category.d.ts.map +1 -1
- package/lib/esm/Category.js +33 -42
- package/lib/esm/Category.js.map +1 -1
- package/lib/esm/ChangeSummaryManager.js +2 -2
- package/lib/esm/ChangeSummaryManager.js.map +1 -1
- package/lib/esm/ChangedElementsDb.js.map +1 -1
- package/lib/esm/ChangesetECAdaptor.d.ts.map +1 -1
- package/lib/esm/ChangesetECAdaptor.js +253 -250
- package/lib/esm/ChangesetECAdaptor.js.map +1 -1
- package/lib/esm/ChannelControl.d.ts +29 -0
- package/lib/esm/ChannelControl.d.ts.map +1 -1
- package/lib/esm/ChannelControl.js.map +1 -1
- package/lib/esm/CheckpointManager.js +1 -1
- package/lib/esm/CheckpointManager.js.map +1 -1
- package/lib/esm/ClassRegistry.js +5 -5
- package/lib/esm/ClassRegistry.js.map +1 -1
- package/lib/esm/CloudSqlite.d.ts +1 -1
- package/lib/esm/CloudSqlite.d.ts.map +1 -1
- package/lib/esm/CloudSqlite.js +69 -14
- package/lib/esm/CloudSqlite.js.map +1 -1
- package/lib/esm/CodeService.js.map +1 -1
- package/lib/esm/CodeSpecs.d.ts +32 -3
- package/lib/esm/CodeSpecs.d.ts.map +1 -1
- package/lib/esm/CodeSpecs.js +49 -21
- package/lib/esm/CodeSpecs.js.map +1 -1
- package/lib/esm/ConcurrentQuery.js.map +1 -1
- package/lib/esm/CustomViewState3dCreator.js.map +1 -1
- package/lib/esm/DevTools.js.map +1 -1
- package/lib/esm/DisplayStyle.d.ts +18 -3
- package/lib/esm/DisplayStyle.d.ts.map +1 -1
- package/lib/esm/DisplayStyle.js +10 -21
- package/lib/esm/DisplayStyle.js.map +1 -1
- package/lib/esm/ECDb.js.map +1 -1
- package/lib/esm/ECSchemaXmlContext.js.map +1 -1
- package/lib/esm/ECSqlRowExecutor.js.map +1 -1
- package/lib/esm/ECSqlStatement.js.map +1 -1
- package/lib/esm/ECSqlSyncReader.js.map +1 -1
- package/lib/esm/EditTxn.d.ts +262 -0
- package/lib/esm/EditTxn.d.ts.map +1 -0
- package/lib/esm/EditTxn.js +543 -0
- package/lib/esm/EditTxn.js.map +1 -0
- package/lib/esm/Element.d.ts +74 -5
- package/lib/esm/Element.d.ts.map +1 -1
- package/lib/esm/Element.js +64 -76
- package/lib/esm/Element.js.map +1 -1
- package/lib/esm/ElementAspect.d.ts +10 -0
- package/lib/esm/ElementAspect.d.ts.map +1 -1
- package/lib/esm/ElementAspect.js +22 -13
- package/lib/esm/ElementAspect.js.map +1 -1
- package/lib/esm/ElementGraphics.js.map +1 -1
- package/lib/esm/ElementTreeWalker.d.ts +56 -3
- package/lib/esm/ElementTreeWalker.d.ts.map +1 -1
- package/lib/esm/ElementTreeWalker.js +53 -40
- package/lib/esm/ElementTreeWalker.js.map +1 -1
- package/lib/esm/Entity.js.map +1 -1
- package/lib/esm/EntityReferences.js.map +1 -1
- package/lib/esm/ExportGraphics.js.map +1 -1
- package/lib/esm/ExternalSource.d.ts +11 -2
- package/lib/esm/ExternalSource.d.ts.map +1 -1
- package/lib/esm/ExternalSource.js +10 -8
- package/lib/esm/ExternalSource.js.map +1 -1
- package/lib/esm/FontFile.js.map +1 -1
- package/lib/esm/GeoCoordConfig.js.map +1 -1
- package/lib/esm/GeographicCRSServices.js.map +1 -1
- package/lib/esm/GeometrySummary.js +47 -47
- package/lib/esm/GeometrySummary.js.map +1 -1
- package/lib/esm/IModelDb.d.ts +74 -23
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +195 -299
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/IModelDbFonts.js.map +1 -1
- package/lib/esm/IModelElementCloneContext.js.map +1 -1
- package/lib/esm/IModelHost.d.ts +58 -1
- package/lib/esm/IModelHost.d.ts.map +1 -1
- package/lib/esm/IModelHost.js +91 -2
- package/lib/esm/IModelHost.js.map +1 -1
- package/lib/esm/IModelIncrementalSchemaLocater.js.map +1 -1
- package/lib/esm/IModelJsFs.js.map +1 -1
- package/lib/esm/ImageSourceConversion.js.map +1 -1
- package/lib/esm/IpcHost.d.ts.map +1 -1
- package/lib/esm/IpcHost.js +36 -16
- package/lib/esm/IpcHost.js.map +1 -1
- package/lib/esm/LineStyle.d.ts +47 -7
- package/lib/esm/LineStyle.d.ts.map +1 -1
- package/lib/esm/LineStyle.js +38 -33
- package/lib/esm/LineStyle.js.map +1 -1
- package/lib/esm/LocalHub.js +1 -1
- package/lib/esm/LocalHub.js.map +1 -1
- package/lib/esm/LocalhostIpcHost.js.map +1 -1
- package/lib/esm/LockControl.d.ts +85 -1
- package/lib/esm/LockControl.d.ts.map +1 -1
- package/lib/esm/LockControl.js.map +1 -1
- package/lib/esm/Material.d.ts +8 -1
- package/lib/esm/Material.d.ts.map +1 -1
- package/lib/esm/Material.js +6 -12
- package/lib/esm/Material.js.map +1 -1
- package/lib/esm/Model.d.ts +59 -20
- package/lib/esm/Model.d.ts.map +1 -1
- package/lib/esm/Model.js +39 -81
- package/lib/esm/Model.js.map +1 -1
- package/lib/esm/NativeAppStorage.js.map +1 -1
- package/lib/esm/NativeHost.js.map +1 -1
- package/lib/esm/NavigationRelationship.js.map +1 -1
- package/lib/esm/PromiseMemoizer.js.map +1 -1
- package/lib/esm/PropertyStore.js.map +1 -1
- package/lib/esm/Relationship.d.ts +72 -7
- package/lib/esm/Relationship.d.ts.map +1 -1
- package/lib/esm/Relationship.js +40 -22
- package/lib/esm/Relationship.js.map +1 -1
- package/lib/esm/RpcBackend.js.map +1 -1
- package/lib/esm/SQLiteDb.js.map +1 -1
- package/lib/esm/Schema.js.map +1 -1
- package/lib/esm/SchemaSync.js +5 -5
- package/lib/esm/SchemaSync.js.map +1 -1
- package/lib/esm/SchemaUtils.js.map +1 -1
- package/lib/esm/SheetIndex.d.ts +9 -0
- package/lib/esm/SheetIndex.d.ts.map +1 -1
- package/lib/esm/SheetIndex.js +38 -35
- package/lib/esm/SheetIndex.js.map +1 -1
- package/lib/esm/SqliteChangesetReader.js.map +1 -1
- package/lib/esm/SqliteStatement.js.map +1 -1
- package/lib/esm/StashManager.js +1 -1
- package/lib/esm/StashManager.js.map +1 -1
- package/lib/esm/Texture.d.ts +6 -0
- package/lib/esm/Texture.d.ts.map +1 -1
- package/lib/esm/Texture.js +6 -14
- package/lib/esm/Texture.js.map +1 -1
- package/lib/esm/TileStorage.js.map +1 -1
- package/lib/esm/TxnManager.d.ts +105 -9
- package/lib/esm/TxnManager.d.ts.map +1 -1
- package/lib/esm/TxnManager.js +194 -15
- package/lib/esm/TxnManager.js.map +1 -1
- package/lib/esm/ViewDefinition.d.ts +21 -1
- package/lib/esm/ViewDefinition.d.ts.map +1 -1
- package/lib/esm/ViewDefinition.js +27 -66
- package/lib/esm/ViewDefinition.js.map +1 -1
- package/lib/esm/ViewStateHydrator.js.map +1 -1
- package/lib/esm/ViewStore.js.map +1 -1
- package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts +14 -6
- package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
- package/lib/esm/annotations/ElementDrivesTextAnnotation.js +33 -27
- package/lib/esm/annotations/ElementDrivesTextAnnotation.js.map +1 -1
- package/lib/esm/annotations/FrameGeometry.js.map +1 -1
- package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
- package/lib/esm/annotations/TextAnnotationElement.d.ts.map +1 -1
- package/lib/esm/annotations/TextAnnotationElement.js +6 -5
- package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
- package/lib/esm/annotations/TextAnnotationGeometry.js.map +1 -1
- package/lib/esm/annotations/TextBlockGeometry.js.map +1 -1
- package/lib/esm/annotations/TextBlockLayout.js.map +1 -1
- package/lib/esm/core-backend.d.ts +1 -0
- package/lib/esm/core-backend.d.ts.map +1 -1
- package/lib/esm/core-backend.js +1 -0
- package/lib/esm/core-backend.js.map +1 -1
- package/lib/esm/domains/FunctionalElements.d.ts +6 -2
- package/lib/esm/domains/FunctionalElements.d.ts.map +1 -1
- package/lib/esm/domains/FunctionalElements.js +8 -13
- package/lib/esm/domains/FunctionalElements.js.map +1 -1
- package/lib/esm/domains/FunctionalSchema.js.map +1 -1
- package/lib/esm/domains/GenericElements.d.ts +11 -4
- package/lib/esm/domains/GenericElements.d.ts.map +1 -1
- package/lib/esm/domains/GenericElements.js +13 -24
- package/lib/esm/domains/GenericElements.js.map +1 -1
- package/lib/esm/domains/GenericSchema.js.map +1 -1
- package/lib/esm/internal/ChangesetConflictArgs.js.map +1 -1
- package/lib/esm/internal/ChannelAdmin.d.ts +15 -0
- package/lib/esm/internal/ChannelAdmin.d.ts.map +1 -1
- package/lib/esm/internal/ChannelAdmin.js +6 -4
- package/lib/esm/internal/ChannelAdmin.js.map +1 -1
- package/lib/esm/internal/ElementLRUCache.js.map +1 -1
- package/lib/esm/internal/FontFileImpl.js.map +1 -1
- package/lib/esm/internal/HubMock.d.ts +2 -0
- package/lib/esm/internal/HubMock.d.ts.map +1 -1
- package/lib/esm/internal/HubMock.js +7 -0
- package/lib/esm/internal/HubMock.js.map +1 -1
- package/lib/esm/internal/IModelDbFontsImpl.js.map +1 -1
- package/lib/esm/internal/IntegrityCheck.js.map +1 -1
- package/lib/esm/internal/NativePlatform.js.map +1 -1
- package/lib/esm/internal/NoLocks.d.ts.map +1 -1
- package/lib/esm/internal/NoLocks.js +6 -0
- package/lib/esm/internal/NoLocks.js.map +1 -1
- package/lib/esm/internal/OnlineStatus.js.map +1 -1
- package/lib/esm/internal/ServerBasedLocks.d.ts +12 -0
- package/lib/esm/internal/ServerBasedLocks.d.ts.map +1 -1
- package/lib/esm/internal/ServerBasedLocks.js +286 -5
- package/lib/esm/internal/ServerBasedLocks.js.map +1 -1
- package/lib/esm/internal/Symbols.d.ts +4 -0
- package/lib/esm/internal/Symbols.d.ts.map +1 -1
- package/lib/esm/internal/Symbols.js +4 -0
- package/lib/esm/internal/Symbols.js.map +1 -1
- package/lib/esm/internal/annotations/fields.d.ts +3 -2
- package/lib/esm/internal/annotations/fields.d.ts.map +1 -1
- package/lib/esm/internal/annotations/fields.js +7 -6
- package/lib/esm/internal/annotations/fields.js.map +1 -1
- package/lib/esm/internal/cross-package.js.map +1 -1
- package/lib/esm/internal/workspace/SettingsEditorImpl.d.ts +18 -3
- package/lib/esm/internal/workspace/SettingsEditorImpl.d.ts.map +1 -1
- package/lib/esm/internal/workspace/SettingsEditorImpl.js +52 -246
- package/lib/esm/internal/workspace/SettingsEditorImpl.js.map +1 -1
- package/lib/esm/internal/workspace/SettingsImpl.d.ts.map +1 -1
- package/lib/esm/internal/workspace/SettingsImpl.js.map +1 -1
- package/lib/esm/internal/workspace/SettingsSchemasImpl.js.map +1 -1
- package/lib/esm/internal/workspace/WorkspaceImpl.d.ts +0 -1
- package/lib/esm/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
- package/lib/esm/internal/workspace/WorkspaceImpl.js +71 -41
- package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/esm/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
- package/lib/esm/rpc/multipart.js.map +1 -1
- package/lib/esm/rpc/tracing.js.map +1 -1
- package/lib/esm/rpc/web/logging.js.map +1 -1
- package/lib/esm/rpc/web/request.js.map +1 -1
- package/lib/esm/rpc/web/response.js.map +1 -1
- package/lib/esm/rpc-impl/DevToolsRpcImpl.js.map +1 -1
- package/lib/esm/rpc-impl/IModelReadRpcImpl.js.map +1 -1
- package/lib/esm/rpc-impl/IModelTileRpcImpl.js.map +1 -1
- package/lib/esm/rpc-impl/RpcBriefcaseUtility.d.ts.map +1 -1
- package/lib/esm/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
- package/lib/esm/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
- package/lib/esm/test/AdvancedEqual.js.map +1 -1
- package/lib/esm/test/AnnotationTestUtils.js.map +1 -1
- package/lib/esm/test/AttachDb.test.js +11 -11
- package/lib/esm/test/AttachDb.test.js.map +1 -1
- package/lib/esm/test/ElementDrivesElement.test.d.ts +20 -19
- package/lib/esm/test/ElementDrivesElement.test.d.ts.map +1 -1
- package/lib/esm/test/ElementDrivesElement.test.js +134 -119
- package/lib/esm/test/ElementDrivesElement.test.js.map +1 -1
- package/lib/esm/test/ElementLRUCache.test.js.map +1 -1
- package/lib/esm/test/GeometryTestUtil.js.map +1 -1
- package/lib/esm/test/IModelHost.test.js +56 -2
- package/lib/esm/test/IModelHost.test.js.map +1 -1
- package/lib/esm/test/IModelTestUtils.d.ts +23 -23
- package/lib/esm/test/IModelTestUtils.d.ts.map +1 -1
- package/lib/esm/test/IModelTestUtils.js +466 -449
- package/lib/esm/test/IModelTestUtils.js.map +1 -1
- package/lib/esm/test/ImageSourceConversion.test.js.map +1 -1
- package/lib/esm/test/IpcHost.test.js +112 -0
- package/lib/esm/test/IpcHost.test.js.map +1 -1
- package/lib/esm/test/KnownTestLocations.js.map +1 -1
- package/lib/esm/test/PrintElementTree.js.map +1 -1
- package/lib/esm/test/PropertyDb.test.js +2 -2
- package/lib/esm/test/PropertyDb.test.js.map +1 -1
- package/lib/esm/test/RevisionUtility.js.map +1 -1
- package/lib/esm/test/SchemaUtils.test.js +25 -25
- package/lib/esm/test/SchemaUtils.test.js.map +1 -1
- package/lib/esm/test/SequentialLogMatcher.js.map +1 -1
- package/lib/esm/test/SquashSchemaAndDataChanges.test.js +156 -147
- package/lib/esm/test/SquashSchemaAndDataChanges.test.js.map +1 -1
- package/lib/esm/test/TestChangeSetUtility.d.ts.map +1 -1
- package/lib/esm/test/TestChangeSetUtility.js +11 -7
- package/lib/esm/test/TestChangeSetUtility.js.map +1 -1
- package/lib/esm/test/TestEditTxn.d.ts +8 -0
- package/lib/esm/test/TestEditTxn.d.ts.map +1 -0
- package/lib/esm/test/TestEditTxn.js +34 -0
- package/lib/esm/test/TestEditTxn.js.map +1 -0
- package/lib/esm/test/TestUtils.d.ts +1 -0
- package/lib/esm/test/TestUtils.d.ts.map +1 -1
- package/lib/esm/test/TestUtils.js +8 -1
- package/lib/esm/test/TestUtils.js.map +1 -1
- package/lib/esm/test/annotations/Fields.test.js +135 -143
- package/lib/esm/test/annotations/Fields.test.js.map +1 -1
- package/lib/esm/test/annotations/FrameGeometry.test.js.map +1 -1
- package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
- package/lib/esm/test/annotations/TextAnnotation.test.js +156 -99
- package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
- package/lib/esm/test/annotations/TextBlock.test.js +5 -3
- package/lib/esm/test/annotations/TextBlock.test.js.map +1 -1
- package/lib/esm/test/assets/IncrementalSchemaLocater/configs/old.config.js.map +1 -1
- package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.js.map +1 -1
- package/lib/esm/test/categories/Category.test.js +63 -3
- package/lib/esm/test/categories/Category.test.js.map +1 -1
- package/lib/esm/test/codespec/CodeSpec.test.js +88 -5
- package/lib/esm/test/codespec/CodeSpec.test.js.map +1 -1
- package/lib/esm/test/ecdb/CTE.test.js +88 -88
- package/lib/esm/test/ecdb/CTE.test.js.map +1 -1
- package/lib/esm/test/ecdb/ConcurrentQuery.test.js +19 -19
- package/lib/esm/test/ecdb/ConcurrentQuery.test.js.map +1 -1
- package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js +15 -15
- package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECDb.test.js +72 -72
- package/lib/esm/test/ecdb/ECDb.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECDbTestHelper.js.map +1 -1
- package/lib/esm/test/ecdb/ECSchemaXmlContext.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlAst.test.js +68 -67
- package/lib/esm/test/ecdb/ECSqlAst.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlQuery.test.js +6 -6
- package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlStatement.test.js +332 -333
- package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlSyncReader.test.js.map +1 -1
- package/lib/esm/test/ecdb/QueryReaders.test.js +47 -44
- package/lib/esm/test/ecdb/QueryReaders.test.js.map +1 -1
- package/lib/esm/test/ecdb/SqliteStatement.test.js +2 -2
- package/lib/esm/test/ecdb/SqliteStatement.test.js.map +1 -1
- package/lib/esm/test/ecsql/dataset/ECSqlDatasets.d.ts.map +1 -1
- package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js +30 -28
- package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js +21 -21
- package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestParser.js.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
- package/lib/esm/test/element/DeleteDefinitionElements.test.js +159 -143
- package/lib/esm/test/element/DeleteDefinitionElements.test.js.map +1 -1
- package/lib/esm/test/element/ElementAspect.test.js +90 -82
- package/lib/esm/test/element/ElementAspect.test.js.map +1 -1
- package/lib/esm/test/element/ElementDependencyGraph.test.d.ts.map +1 -1
- package/lib/esm/test/element/ElementDependencyGraph.test.js +51 -43
- package/lib/esm/test/element/ElementDependencyGraph.test.js.map +1 -1
- package/lib/esm/test/element/ElementRoundTrip.test.js +176 -177
- package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
- package/lib/esm/test/element/ExcludedElements.test.js +2 -2
- package/lib/esm/test/element/ExcludedElements.test.js.map +1 -1
- package/lib/esm/test/element/ExternalSource.test.js +40 -38
- package/lib/esm/test/element/ExternalSource.test.js.map +1 -1
- package/lib/esm/test/element/NullStructArray.test.js +23 -22
- package/lib/esm/test/element/NullStructArray.test.js.map +1 -1
- package/lib/esm/test/element/ProjectInformationRecord.test.js +5 -2
- package/lib/esm/test/element/ProjectInformationRecord.test.js.map +1 -1
- package/lib/esm/test/element/SheetInformationAspect.test.js +43 -11
- package/lib/esm/test/element/SheetInformationAspect.test.js.map +1 -1
- package/lib/esm/test/element/UrlLink.test.js +2 -2
- package/lib/esm/test/element/UrlLink.test.js.map +1 -1
- package/lib/esm/test/font/FontFile.test.js.map +1 -1
- package/lib/esm/test/font/IModelDbFonts.test.js +87 -73
- package/lib/esm/test/font/IModelDbFonts.test.js.map +1 -1
- package/lib/esm/test/hubaccess/ApplyChangeset.test.js +194 -155
- package/lib/esm/test/hubaccess/ApplyChangeset.test.js.map +1 -1
- package/lib/esm/test/hubaccess/BriefcaseManager.test.js +2 -4
- package/lib/esm/test/hubaccess/BriefcaseManager.test.js.map +1 -1
- package/lib/esm/test/hubaccess/CheckpointManager.test.js.map +1 -1
- package/lib/esm/test/hubaccess/Rebase.test.js +369 -303
- package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -1
- package/lib/esm/test/hubaccess/SemanticRebase.test.js +467 -392
- package/lib/esm/test/hubaccess/SemanticRebase.test.js.map +1 -1
- package/lib/esm/test/imageData.js.map +1 -1
- package/lib/esm/test/imodel/Code.test.js +31 -31
- package/lib/esm/test/imodel/Code.test.js.map +1 -1
- package/lib/esm/test/imodel/ElementTreeWalker.test.js +57 -48
- package/lib/esm/test/imodel/ElementTreeWalker.test.js.map +1 -1
- package/lib/esm/test/imodel/GetTextureImage.test.js.map +1 -1
- package/lib/esm/test/imodel/IModel.test.js +463 -388
- package/lib/esm/test/imodel/IModel.test.js.map +1 -1
- package/lib/esm/test/imodel/ProjectExtents.test.js +2 -2
- package/lib/esm/test/imodel/ProjectExtents.test.js.map +1 -1
- package/lib/esm/test/imodel/SchemaXmlImport.test.js +77 -13
- package/lib/esm/test/imodel/SchemaXmlImport.test.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/IncrementalLoading.test.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/TestContext.d.ts.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/TestContext.js +2 -2
- package/lib/esm/test/incrementalSchemaLocater/TestContext.js.map +1 -1
- package/lib/esm/test/index.d.ts +1 -0
- package/lib/esm/test/index.d.ts.map +1 -1
- package/lib/esm/test/index.js +1 -0
- package/lib/esm/test/index.js.map +1 -1
- package/lib/esm/test/misc/DevTools.test.js.map +1 -1
- package/lib/esm/test/misc/EntitySubClasses.test.js.map +1 -1
- package/lib/esm/test/misc/GeoServices.test.js.map +1 -1
- package/lib/esm/test/misc/PromiseMemoizer.test.js.map +1 -1
- package/lib/esm/test/native/DgnDbWorker.test.js.map +1 -1
- package/lib/esm/test/rpc/response.test.js.map +1 -1
- package/lib/esm/test/schema/ClassRegistry.test.js +122 -121
- package/lib/esm/test/schema/ClassRegistry.test.js.map +1 -1
- package/lib/esm/test/schema/FunctionalDomain.test.js +36 -34
- package/lib/esm/test/schema/FunctionalDomain.test.js.map +1 -1
- package/lib/esm/test/schema/GenericDomain.test.js +114 -94
- package/lib/esm/test/schema/GenericDomain.test.js.map +1 -1
- package/lib/esm/test/schema/IModelSchemaContext.test.js +11 -10
- package/lib/esm/test/schema/IModelSchemaContext.test.js.map +1 -1
- package/lib/esm/test/schema/SchemaImportCallbacks.test.js +226 -211
- package/lib/esm/test/schema/SchemaImportCallbacks.test.js.map +1 -1
- package/lib/esm/test/sheetindex/SheetIndex.test.d.ts +1 -3
- package/lib/esm/test/sheetindex/SheetIndex.test.d.ts.map +1 -1
- package/lib/esm/test/sheetindex/SheetIndex.test.js +312 -247
- package/lib/esm/test/sheetindex/SheetIndex.test.js.map +1 -1
- package/lib/esm/test/standalone/ChangeMerge.test.js +101 -82
- package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
- package/lib/esm/test/standalone/ChangesetReader.test.js +242 -213
- package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
- package/lib/esm/test/standalone/CustomViewState3dCreator.test.js.map +1 -1
- package/lib/esm/test/standalone/DisplayStyle.test.js +43 -40
- package/lib/esm/test/standalone/DisplayStyle.test.js.map +1 -1
- package/lib/esm/test/standalone/Drawing.test.js +4 -3
- package/lib/esm/test/standalone/Drawing.test.js.map +1 -1
- package/lib/esm/test/standalone/EditTxn.test.d.ts +2 -0
- package/lib/esm/test/standalone/EditTxn.test.d.ts.map +1 -0
- package/lib/esm/test/standalone/EditTxn.test.js +219 -0
- package/lib/esm/test/standalone/EditTxn.test.js.map +1 -0
- package/lib/esm/test/standalone/ElementGraphics.test.js.map +1 -1
- package/lib/esm/test/standalone/ElementMesh.test.js +16 -13
- package/lib/esm/test/standalone/ElementMesh.test.js.map +1 -1
- package/lib/esm/test/standalone/ExportGraphics.test.js +40 -34
- package/lib/esm/test/standalone/ExportGraphics.test.js.map +1 -1
- package/lib/esm/test/standalone/GeometryChangeEvents.test.js +11 -15
- package/lib/esm/test/standalone/GeometryChangeEvents.test.js.map +1 -1
- package/lib/esm/test/standalone/GeometryStream.test.js +212 -165
- package/lib/esm/test/standalone/GeometryStream.test.js.map +1 -1
- package/lib/esm/test/standalone/HubMock.test.js +31 -25
- package/lib/esm/test/standalone/HubMock.test.js.map +1 -1
- package/lib/esm/test/standalone/IModelLimits.test.js +11 -8
- package/lib/esm/test/standalone/IModelLimits.test.js.map +1 -1
- package/lib/esm/test/standalone/IModelWrite.test.d.ts +2 -2
- package/lib/esm/test/standalone/IModelWrite.test.d.ts.map +1 -1
- package/lib/esm/test/standalone/IModelWrite.test.js +211 -169
- package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
- package/lib/esm/test/standalone/ITwinWorkspace.test.d.ts +2 -0
- package/lib/esm/test/standalone/ITwinWorkspace.test.d.ts.map +1 -0
- package/lib/esm/test/standalone/ITwinWorkspace.test.js +236 -0
- package/lib/esm/test/standalone/ITwinWorkspace.test.js.map +1 -0
- package/lib/esm/test/standalone/InlineGeometryPartReferences.test.js +25 -22
- package/lib/esm/test/standalone/InlineGeometryPartReferences.test.js.map +1 -1
- package/lib/esm/test/standalone/IntegrityCheck.test.js +20 -18
- package/lib/esm/test/standalone/IntegrityCheck.test.js.map +1 -1
- package/lib/esm/test/standalone/MergeConflict.test.d.ts +2 -2
- package/lib/esm/test/standalone/MergeConflict.test.d.ts.map +1 -1
- package/lib/esm/test/standalone/MergeConflict.test.js +49 -33
- package/lib/esm/test/standalone/MergeConflict.test.js.map +1 -1
- package/lib/esm/test/standalone/NativeAppStorage.test.js.map +1 -1
- package/lib/esm/test/standalone/RenderMaterialElement.test.js +5 -5
- package/lib/esm/test/standalone/RenderMaterialElement.test.js.map +1 -1
- package/lib/esm/test/standalone/RenderTimeline.test.js +3 -2
- package/lib/esm/test/standalone/RenderTimeline.test.js.map +1 -1
- package/lib/esm/test/standalone/SQLiteDb.test.js.map +1 -1
- package/lib/esm/test/standalone/SchemaUtils.test.js.map +1 -1
- package/lib/esm/test/standalone/SectionDrawing.test.js +7 -7
- package/lib/esm/test/standalone/SectionDrawing.test.js.map +1 -1
- package/lib/esm/test/standalone/ServerBasedLocks.test.js +928 -22
- package/lib/esm/test/standalone/ServerBasedLocks.test.js.map +1 -1
- package/lib/esm/test/standalone/Setting.test.js.map +1 -1
- package/lib/esm/test/standalone/Settings.test.js +26 -4
- package/lib/esm/test/standalone/Settings.test.js.map +1 -1
- package/lib/esm/test/standalone/SettingsSchemas.test.js +2 -1
- package/lib/esm/test/standalone/SettingsSchemas.test.js.map +1 -1
- package/lib/esm/test/standalone/SnapshotDb.test.js +3 -1
- package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
- package/lib/esm/test/standalone/StandaloneDb.test.js +27 -26
- package/lib/esm/test/standalone/StandaloneDb.test.js.map +1 -1
- package/lib/esm/test/standalone/Texture.test.js +5 -4
- package/lib/esm/test/standalone/Texture.test.js.map +1 -1
- package/lib/esm/test/standalone/TileCache.test.d.ts.map +1 -1
- package/lib/esm/test/standalone/TileCache.test.js +5 -3
- package/lib/esm/test/standalone/TileCache.test.js.map +1 -1
- package/lib/esm/test/standalone/TileTree.test.js +35 -31
- package/lib/esm/test/standalone/TileTree.test.js.map +1 -1
- package/lib/esm/test/standalone/TxnManager.test.js +700 -653
- package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
- package/lib/esm/test/standalone/ViewDefinition.test.js +295 -229
- package/lib/esm/test/standalone/ViewDefinition.test.js.map +1 -1
- package/lib/esm/test/standalone/ViewStoreDb.test.js.map +1 -1
- package/lib/esm/test/standalone/Workspace.test.js +72 -22
- package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
- package/lib/esm/test/standalone/iModelDb.test.js.map +1 -1
- package/lib/esm/test/workspace/SettingsDb.test.js +28 -456
- package/lib/esm/test/workspace/SettingsDb.test.js.map +1 -1
- package/lib/esm/workspace/Settings.d.ts +11 -5
- package/lib/esm/workspace/Settings.d.ts.map +1 -1
- package/lib/esm/workspace/Settings.js.map +1 -1
- package/lib/esm/workspace/SettingsDb.d.ts +20 -99
- package/lib/esm/workspace/SettingsDb.d.ts.map +1 -1
- package/lib/esm/workspace/SettingsDb.js +20 -6
- package/lib/esm/workspace/SettingsDb.js.map +1 -1
- package/lib/esm/workspace/SettingsEditor.d.ts +40 -226
- package/lib/esm/workspace/SettingsEditor.d.ts.map +1 -1
- package/lib/esm/workspace/SettingsEditor.js +85 -24
- package/lib/esm/workspace/SettingsEditor.js.map +1 -1
- package/lib/esm/workspace/SettingsSchemas.js.map +1 -1
- package/lib/esm/workspace/Workspace.d.ts +7 -11
- package/lib/esm/workspace/Workspace.d.ts.map +1 -1
- package/lib/esm/workspace/Workspace.js.map +1 -1
- package/lib/esm/workspace/WorkspaceEditor.d.ts +14 -0
- package/lib/esm/workspace/WorkspaceEditor.d.ts.map +1 -1
- package/lib/esm/workspace/WorkspaceEditor.js +1 -1
- package/lib/esm/workspace/WorkspaceEditor.js.map +1 -1
- package/package.json +14 -14
- package/lib/cjs/internal/workspace/SettingsDbImpl.d.ts +0 -38
- package/lib/cjs/internal/workspace/SettingsDbImpl.d.ts.map +0 -1
- package/lib/cjs/internal/workspace/SettingsDbImpl.js +0 -108
- package/lib/cjs/internal/workspace/SettingsDbImpl.js.map +0 -1
- package/lib/cjs/internal/workspace/SettingsSqliteDb.d.ts +0 -14
- package/lib/cjs/internal/workspace/SettingsSqliteDb.d.ts.map +0 -1
- package/lib/cjs/internal/workspace/SettingsSqliteDb.js +0 -40
- package/lib/cjs/internal/workspace/SettingsSqliteDb.js.map +0 -1
- package/lib/esm/internal/workspace/SettingsDbImpl.d.ts +0 -38
- package/lib/esm/internal/workspace/SettingsDbImpl.d.ts.map +0 -1
- package/lib/esm/internal/workspace/SettingsDbImpl.js +0 -104
- package/lib/esm/internal/workspace/SettingsDbImpl.js.map +0 -1
- package/lib/esm/internal/workspace/SettingsSqliteDb.d.ts +0 -14
- package/lib/esm/internal/workspace/SettingsSqliteDb.d.ts.map +0 -1
- package/lib/esm/internal/workspace/SettingsSqliteDb.js +0 -36
- 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":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport * as 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
|
|
265
|
-
|
|
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
|