@itwin/core-backend 5.10.0-dev.8 → 5.11.0-dev.1
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 +18 -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.d.ts +8 -1
- package/lib/cjs/BriefcaseManager.d.ts.map +1 -1
- package/lib/cjs/BriefcaseManager.js.map +1 -1
- package/lib/cjs/CatalogDb.js.map +1 -1
- package/lib/cjs/Category.d.ts +4 -4
- 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 +6 -6
- package/lib/cjs/ChangesetECAdaptor.js +252 -252
- package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
- package/lib/cjs/ChangesetReader.d.ts +84 -1
- package/lib/cjs/ChangesetReader.d.ts.map +1 -1
- package/lib/cjs/ChangesetReader.js +108 -12
- package/lib/cjs/ChangesetReader.js.map +1 -1
- package/lib/cjs/ChangesetReaderTypes.js.map +1 -1
- package/lib/cjs/ChannelControl.js.map +1 -1
- package/lib/cjs/CheckpointManager.js.map +1 -1
- package/lib/cjs/ClassRegistry.d.ts +3 -3
- package/lib/cjs/ClassRegistry.js +8 -8
- package/lib/cjs/ClassRegistry.js.map +1 -1
- package/lib/cjs/CloudSqlite.js.map +1 -1
- package/lib/cjs/CodeService.js.map +1 -1
- package/lib/cjs/CodeSpecs.d.ts +3 -3
- 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 +2 -2
- 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.d.ts.map +1 -1
- package/lib/cjs/ECSqlStatement.js +4 -0
- package/lib/cjs/ECSqlStatement.js.map +1 -1
- package/lib/cjs/ECSqlSyncReader.d.ts.map +1 -1
- package/lib/cjs/ECSqlSyncReader.js +1 -0
- package/lib/cjs/ECSqlSyncReader.js.map +1 -1
- package/lib/cjs/EditTxn.js.map +1 -1
- package/lib/cjs/Element.d.ts +16 -13
- package/lib/cjs/Element.d.ts.map +1 -1
- package/lib/cjs/Element.js +8 -5
- package/lib/cjs/Element.js.map +1 -1
- package/lib/cjs/ElementAspect.d.ts +1 -1
- package/lib/cjs/ElementAspect.js.map +1 -1
- package/lib/cjs/ElementGraphics.js.map +1 -1
- package/lib/cjs/ElementTreeWalker.d.ts +5 -5
- package/lib/cjs/ElementTreeWalker.js.map +1 -1
- package/lib/cjs/Entity.d.ts +13 -5
- package/lib/cjs/Entity.d.ts.map +1 -1
- package/lib/cjs/Entity.js +13 -5
- 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 +2 -2
- 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 +112 -40
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +223 -50
- 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.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.js.map +1 -1
- package/lib/cjs/LineStyle.d.ts +6 -6
- package/lib/cjs/LineStyle.js.map +1 -1
- package/lib/cjs/LocalHub.d.ts +6 -0
- package/lib/cjs/LocalHub.d.ts.map +1 -1
- package/lib/cjs/LocalHub.js +24 -1
- package/lib/cjs/LocalHub.js.map +1 -1
- package/lib/cjs/LocalhostIpcHost.js.map +1 -1
- package/lib/cjs/LockControl.js.map +1 -1
- package/lib/cjs/Material.d.ts +1 -1
- package/lib/cjs/Material.js.map +1 -1
- package/lib/cjs/Model.d.ts +6 -6
- 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/PartialChangeUnifier.js +7 -7
- package/lib/cjs/PartialChangeUnifier.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 +13 -11
- package/lib/cjs/Relationship.d.ts.map +1 -1
- package/lib/cjs/Relationship.js +9 -7
- 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.map +1 -1
- package/lib/cjs/SchemaUtils.js.map +1 -1
- package/lib/cjs/SheetIndex.d.ts +4 -4
- 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.map +1 -1
- package/lib/cjs/Texture.d.ts +1 -1
- package/lib/cjs/Texture.js.map +1 -1
- package/lib/cjs/TileStorage.js.map +1 -1
- package/lib/cjs/TxnManager.d.ts.map +1 -1
- package/lib/cjs/TxnManager.js +7 -0
- package/lib/cjs/TxnManager.js.map +1 -1
- package/lib/cjs/ViewDefinition.d.ts +6 -6
- 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 +1 -1
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.js.map +1 -1
- package/lib/cjs/annotations/FrameGeometry.d.ts.map +1 -1
- package/lib/cjs/annotations/FrameGeometry.js +2 -3
- package/lib/cjs/annotations/FrameGeometry.js.map +1 -1
- package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
- 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 +36 -32
- package/lib/cjs/assets/Settings/Schemas/Gcs.schema.json +28 -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.js.map +1 -1
- package/lib/cjs/domains/FunctionalElements.d.ts +1 -1
- 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 +2 -2
- 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 +2 -2
- package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
- package/lib/cjs/internal/ElementLRUCache.d.ts.map +1 -1
- package/lib/cjs/internal/ElementLRUCache.js +23 -4
- 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 +24 -1
- package/lib/cjs/internal/HubMock.d.ts.map +1 -1
- package/lib/cjs/internal/HubMock.js +60 -39
- 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.js.map +1 -1
- package/lib/cjs/internal/OnlineStatus.js.map +1 -1
- package/lib/cjs/internal/ServerBasedLocks.d.ts +19 -1
- package/lib/cjs/internal/ServerBasedLocks.d.ts.map +1 -1
- package/lib/cjs/internal/ServerBasedLocks.js +88 -34
- package/lib/cjs/internal/ServerBasedLocks.js.map +1 -1
- package/lib/cjs/internal/Symbols.js.map +1 -1
- package/lib/cjs/internal/annotations/fields.js.map +1 -1
- package/lib/cjs/internal/cross-package.d.ts +1 -1
- package/lib/cjs/internal/cross-package.d.ts.map +1 -1
- package/lib/cjs/internal/cross-package.js +1 -2
- package/lib/cjs/internal/cross-package.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsEditorImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsSchemasImpl.d.ts.map +1 -1
- package/lib/cjs/internal/workspace/SettingsSchemasImpl.js +55 -9
- package/lib/cjs/internal/workspace/SettingsSchemasImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceImpl.js +7 -11
- 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.js.map +1 -1
- package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
- package/lib/cjs/workspace/Settings.js.map +1 -1
- package/lib/cjs/workspace/SettingsDb.js.map +1 -1
- package/lib/cjs/workspace/SettingsEditor.js.map +1 -1
- package/lib/cjs/workspace/SettingsSchemas.d.ts +20 -3
- package/lib/cjs/workspace/SettingsSchemas.d.ts.map +1 -1
- package/lib/cjs/workspace/SettingsSchemas.js.map +1 -1
- package/lib/cjs/workspace/Workspace.d.ts +13 -1
- package/lib/cjs/workspace/Workspace.d.ts.map +1 -1
- package/lib/cjs/workspace/Workspace.js.map +1 -1
- package/lib/cjs/workspace/WorkspaceEditor.js.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.d.ts +8 -1
- package/lib/esm/BriefcaseManager.d.ts.map +1 -1
- package/lib/esm/BriefcaseManager.js.map +1 -1
- package/lib/esm/CatalogDb.js.map +1 -1
- package/lib/esm/Category.d.ts +4 -4
- 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 +6 -6
- package/lib/esm/ChangesetECAdaptor.js +252 -252
- package/lib/esm/ChangesetECAdaptor.js.map +1 -1
- package/lib/esm/ChangesetReader.d.ts +84 -1
- package/lib/esm/ChangesetReader.d.ts.map +1 -1
- package/lib/esm/ChangesetReader.js +108 -12
- package/lib/esm/ChangesetReader.js.map +1 -1
- package/lib/esm/ChangesetReaderTypes.js.map +1 -1
- package/lib/esm/ChannelControl.js.map +1 -1
- package/lib/esm/CheckpointManager.js.map +1 -1
- package/lib/esm/ClassRegistry.d.ts +3 -3
- package/lib/esm/ClassRegistry.js +8 -8
- package/lib/esm/ClassRegistry.js.map +1 -1
- package/lib/esm/CloudSqlite.js.map +1 -1
- package/lib/esm/CodeService.js.map +1 -1
- package/lib/esm/CodeSpecs.d.ts +3 -3
- 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 +2 -2
- 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.d.ts.map +1 -1
- package/lib/esm/ECSqlStatement.js +4 -0
- package/lib/esm/ECSqlStatement.js.map +1 -1
- package/lib/esm/ECSqlSyncReader.d.ts.map +1 -1
- package/lib/esm/ECSqlSyncReader.js +1 -0
- package/lib/esm/ECSqlSyncReader.js.map +1 -1
- package/lib/esm/EditTxn.js.map +1 -1
- package/lib/esm/Element.d.ts +16 -13
- package/lib/esm/Element.d.ts.map +1 -1
- package/lib/esm/Element.js +8 -5
- package/lib/esm/Element.js.map +1 -1
- package/lib/esm/ElementAspect.d.ts +1 -1
- package/lib/esm/ElementAspect.js.map +1 -1
- package/lib/esm/ElementGraphics.js.map +1 -1
- package/lib/esm/ElementTreeWalker.d.ts +5 -5
- package/lib/esm/ElementTreeWalker.js.map +1 -1
- package/lib/esm/Entity.d.ts +13 -5
- package/lib/esm/Entity.d.ts.map +1 -1
- package/lib/esm/Entity.js +13 -5
- 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 +2 -2
- 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 +112 -40
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +224 -51
- 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.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.js.map +1 -1
- package/lib/esm/LineStyle.d.ts +6 -6
- package/lib/esm/LineStyle.js.map +1 -1
- package/lib/esm/LocalHub.d.ts +6 -0
- package/lib/esm/LocalHub.d.ts.map +1 -1
- package/lib/esm/LocalHub.js +24 -1
- package/lib/esm/LocalHub.js.map +1 -1
- package/lib/esm/LocalhostIpcHost.js.map +1 -1
- package/lib/esm/LockControl.js.map +1 -1
- package/lib/esm/Material.d.ts +1 -1
- package/lib/esm/Material.js.map +1 -1
- package/lib/esm/Model.d.ts +6 -6
- 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/PartialChangeUnifier.js +7 -7
- package/lib/esm/PartialChangeUnifier.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 +13 -11
- package/lib/esm/Relationship.d.ts.map +1 -1
- package/lib/esm/Relationship.js +9 -7
- 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.map +1 -1
- package/lib/esm/SchemaUtils.js.map +1 -1
- package/lib/esm/SheetIndex.d.ts +4 -4
- 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.map +1 -1
- package/lib/esm/Texture.d.ts +1 -1
- package/lib/esm/Texture.js.map +1 -1
- package/lib/esm/TileStorage.js.map +1 -1
- package/lib/esm/TxnManager.d.ts.map +1 -1
- package/lib/esm/TxnManager.js +7 -0
- package/lib/esm/TxnManager.js.map +1 -1
- package/lib/esm/ViewDefinition.d.ts +6 -6
- 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 +1 -1
- package/lib/esm/annotations/ElementDrivesTextAnnotation.js.map +1 -1
- package/lib/esm/annotations/FrameGeometry.d.ts.map +1 -1
- package/lib/esm/annotations/FrameGeometry.js +2 -3
- package/lib/esm/annotations/FrameGeometry.js.map +1 -1
- package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
- 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.js.map +1 -1
- package/lib/esm/domains/FunctionalElements.d.ts +1 -1
- 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 +2 -2
- 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 +2 -2
- package/lib/esm/internal/ChannelAdmin.js.map +1 -1
- package/lib/esm/internal/ElementLRUCache.d.ts.map +1 -1
- package/lib/esm/internal/ElementLRUCache.js +23 -4
- 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 +24 -1
- package/lib/esm/internal/HubMock.d.ts.map +1 -1
- package/lib/esm/internal/HubMock.js +61 -40
- 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.js.map +1 -1
- package/lib/esm/internal/OnlineStatus.js.map +1 -1
- package/lib/esm/internal/ServerBasedLocks.d.ts +19 -1
- package/lib/esm/internal/ServerBasedLocks.d.ts.map +1 -1
- package/lib/esm/internal/ServerBasedLocks.js +88 -34
- package/lib/esm/internal/ServerBasedLocks.js.map +1 -1
- package/lib/esm/internal/Symbols.js.map +1 -1
- package/lib/esm/internal/annotations/fields.js.map +1 -1
- package/lib/esm/internal/cross-package.d.ts +1 -1
- package/lib/esm/internal/cross-package.d.ts.map +1 -1
- package/lib/esm/internal/cross-package.js +1 -1
- package/lib/esm/internal/cross-package.js.map +1 -1
- package/lib/esm/internal/workspace/SettingsEditorImpl.js.map +1 -1
- package/lib/esm/internal/workspace/SettingsImpl.js.map +1 -1
- package/lib/esm/internal/workspace/SettingsSchemasImpl.d.ts.map +1 -1
- package/lib/esm/internal/workspace/SettingsSchemasImpl.js +55 -9
- package/lib/esm/internal/workspace/SettingsSchemasImpl.js.map +1 -1
- package/lib/esm/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
- package/lib/esm/internal/workspace/WorkspaceImpl.js +7 -11
- 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.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.js +23 -23
- package/lib/esm/test/ElementDrivesElement.test.js.map +1 -1
- package/lib/esm/test/ElementLRUCache.test.js +60 -0
- 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.map +1 -1
- 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.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.map +1 -1
- package/lib/esm/test/RevisionUtility.js.map +1 -1
- package/lib/esm/test/SchemaChangesetCanBeReversed.test.d.ts +2 -0
- package/lib/esm/test/SchemaChangesetCanBeReversed.test.d.ts.map +1 -0
- package/lib/esm/test/SchemaChangesetCanBeReversed.test.js +239 -0
- package/lib/esm/test/SchemaChangesetCanBeReversed.test.js.map +1 -0
- 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 +129 -129
- package/lib/esm/test/SquashSchemaAndDataChanges.test.js.map +1 -1
- package/lib/esm/test/TestChangeSetUtility.js.map +1 -1
- package/lib/esm/test/TestEditTxn.js.map +1 -1
- package/lib/esm/test/TestUtils.js.map +1 -1
- package/lib/esm/test/annotations/Fields.test.js +53 -53
- package/lib/esm/test/annotations/Fields.test.js.map +1 -1
- package/lib/esm/test/annotations/FrameGeometry.test.js +2 -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.map +1 -1
- 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.map +1 -1
- package/lib/esm/test/codespec/CodeSpec.test.js.map +1 -1
- package/lib/esm/test/ecdb/CTE.test.js +89 -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 +65 -65
- package/lib/esm/test/ecdb/ECSqlAst.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlQuery.test.js +14 -6
- package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlStatement.test.js +342 -332
- package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlSyncReader.test.js +1 -0
- package/lib/esm/test/ecdb/ECSqlSyncReader.test.js.map +1 -1
- package/lib/esm/test/ecdb/QueryReaders.test.js +44 -31
- package/lib/esm/test/ecdb/QueryReaders.test.js.map +1 -1
- package/lib/esm/test/ecdb/SqliteStatement.test.js.map +1 -1
- 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 +1 -0
- package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
- package/lib/esm/test/element/DeleteDefinitionElements.test.js +6 -2
- package/lib/esm/test/element/DeleteDefinitionElements.test.js.map +1 -1
- package/lib/esm/test/element/ElementAspect.test.js +22 -22
- package/lib/esm/test/element/ElementAspect.test.js.map +1 -1
- package/lib/esm/test/element/ElementDependencyGraph.test.js.map +1 -1
- package/lib/esm/test/element/ElementRoundTrip.test.js +144 -139
- package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
- package/lib/esm/test/element/ExcludedElements.test.js +1 -0
- package/lib/esm/test/element/ExcludedElements.test.js.map +1 -1
- package/lib/esm/test/element/ExternalSource.test.js.map +1 -1
- package/lib/esm/test/element/NullStructArray.test.js +13 -13
- package/lib/esm/test/element/NullStructArray.test.js.map +1 -1
- package/lib/esm/test/element/ProjectInformationRecord.test.js.map +1 -1
- package/lib/esm/test/element/SheetInformationAspect.test.js.map +1 -1
- 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.map +1 -1
- package/lib/esm/test/hubaccess/ApplyChangeset.test.js +42 -32
- package/lib/esm/test/hubaccess/ApplyChangeset.test.js.map +1 -1
- 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 +56 -56
- package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -1
- package/lib/esm/test/hubaccess/SemanticRebase.test.js +346 -345
- 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.map +1 -1
- 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 +75 -44
- package/lib/esm/test/imodel/IModel.test.js.map +1 -1
- package/lib/esm/test/imodel/ProjectExtents.test.js.map +1 -1
- package/lib/esm/test/imodel/SchemaXmlImport.test.js +21 -21
- 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.js.map +1 -1
- 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 +102 -99
- package/lib/esm/test/schema/ClassRegistry.test.js.map +1 -1
- package/lib/esm/test/schema/FunctionalDomain.test.js.map +1 -1
- package/lib/esm/test/schema/GenericDomain.test.js.map +1 -1
- package/lib/esm/test/schema/IModelSchemaContext.test.js +11 -9
- package/lib/esm/test/schema/IModelSchemaContext.test.js.map +1 -1
- package/lib/esm/test/schema/SchemaImportCallbacks.test.js +19 -19
- package/lib/esm/test/schema/SchemaImportCallbacks.test.js.map +1 -1
- package/lib/esm/test/schema/SchemaViewHidden.test.d.ts +2 -0
- package/lib/esm/test/schema/SchemaViewHidden.test.d.ts.map +1 -0
- package/lib/esm/test/schema/SchemaViewHidden.test.js +275 -0
- package/lib/esm/test/schema/SchemaViewHidden.test.js.map +1 -0
- package/lib/esm/test/schema/SchemaViewKoQ.test.d.ts +2 -0
- package/lib/esm/test/schema/SchemaViewKoQ.test.d.ts.map +1 -0
- package/lib/esm/test/schema/SchemaViewKoQ.test.js +184 -0
- package/lib/esm/test/schema/SchemaViewKoQ.test.js.map +1 -0
- package/lib/esm/test/schema/SchemaViewLifecycle.test.d.ts +2 -0
- package/lib/esm/test/schema/SchemaViewLifecycle.test.d.ts.map +1 -0
- package/lib/esm/test/schema/SchemaViewLifecycle.test.js +141 -0
- package/lib/esm/test/schema/SchemaViewLifecycle.test.js.map +1 -0
- package/lib/esm/test/schema/SchemaViewValidation.test.d.ts +2 -0
- package/lib/esm/test/schema/SchemaViewValidation.test.d.ts.map +1 -0
- package/lib/esm/test/schema/SchemaViewValidation.test.js +475 -0
- package/lib/esm/test/schema/SchemaViewValidation.test.js.map +1 -0
- package/lib/esm/test/sheetindex/SheetIndex.test.js.map +1 -1
- package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
- package/lib/esm/test/standalone/ChangesetReader.test.js +1191 -583
- 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/DeleteElements.test.js +45 -0
- package/lib/esm/test/standalone/DeleteElements.test.js.map +1 -1
- package/lib/esm/test/standalone/DisplayStyle.test.js.map +1 -1
- package/lib/esm/test/standalone/Drawing.test.js.map +1 -1
- package/lib/esm/test/standalone/EditTxn.test.js.map +1 -1
- package/lib/esm/test/standalone/ElementGraphics.test.js.map +1 -1
- package/lib/esm/test/standalone/ElementMesh.test.js.map +1 -1
- package/lib/esm/test/standalone/ExportGraphics.test.js +14 -14
- package/lib/esm/test/standalone/ExportGraphics.test.js.map +1 -1
- package/lib/esm/test/standalone/GeometryChangeEvents.test.js.map +1 -1
- package/lib/esm/test/standalone/GeometryStream.test.js.map +1 -1
- package/lib/esm/test/standalone/HubMock.test.js.map +1 -1
- package/lib/esm/test/standalone/IModelLimits.test.js.map +1 -1
- package/lib/esm/test/standalone/IModelWrite.test.js +33 -27
- package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
- package/lib/esm/test/standalone/ITwinWorkspace.test.js.map +1 -1
- package/lib/esm/test/standalone/InlineGeometryPartReferences.test.js.map +1 -1
- package/lib/esm/test/standalone/IntegrityCheck.test.js.map +1 -1
- 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.map +1 -1
- 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/SQliteChangesetReaderAndChangesetECAdaptor.test.js +135 -135
- package/lib/esm/test/standalone/SQliteChangesetReaderAndChangesetECAdaptor.test.js.map +1 -1
- package/lib/esm/test/standalone/SchemaUtils.test.js.map +1 -1
- package/lib/esm/test/standalone/SectionDrawing.test.js.map +1 -1
- package/lib/esm/test/standalone/ServerBasedLocks.test.js +62 -0
- 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 +2 -0
- package/lib/esm/test/standalone/Settings.test.js.map +1 -1
- package/lib/esm/test/standalone/SettingsSchemas.test.js +397 -0
- package/lib/esm/test/standalone/SettingsSchemas.test.js.map +1 -1
- package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
- package/lib/esm/test/standalone/StandaloneDb.test.js +20 -20
- package/lib/esm/test/standalone/StandaloneDb.test.js.map +1 -1
- package/lib/esm/test/standalone/Texture.test.js.map +1 -1
- package/lib/esm/test/standalone/TileCache.test.js.map +1 -1
- package/lib/esm/test/standalone/TileTree.test.js.map +1 -1
- package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
- 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 +23 -0
- 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.map +1 -1
- package/lib/esm/workspace/Settings.js.map +1 -1
- package/lib/esm/workspace/SettingsDb.js.map +1 -1
- package/lib/esm/workspace/SettingsEditor.js.map +1 -1
- package/lib/esm/workspace/SettingsSchemas.d.ts +20 -3
- package/lib/esm/workspace/SettingsSchemas.d.ts.map +1 -1
- package/lib/esm/workspace/SettingsSchemas.js.map +1 -1
- package/lib/esm/workspace/Workspace.d.ts +13 -1
- package/lib/esm/workspace/Workspace.d.ts.map +1 -1
- package/lib/esm/workspace/Workspace.js.map +1 -1
- package/lib/esm/workspace/WorkspaceEditor.js.map +1 -1
- package/package.json +15 -15
|
@@ -23,7 +23,7 @@ declare class ChannelAdmin implements ChannelControl {
|
|
|
23
23
|
channelKey: ChannelKey;
|
|
24
24
|
txn: EditTxn;
|
|
25
25
|
}): void;
|
|
26
|
-
/** @deprecated in 5.
|
|
26
|
+
/** @deprecated in 5.9.0 - will not be removed until after 2027-05-04. Use makeChannelRoot and supply `txn`. */
|
|
27
27
|
makeChannelRoot(args: {
|
|
28
28
|
elementId: Id64String;
|
|
29
29
|
channelKey: ChannelKey;
|
|
@@ -35,7 +35,7 @@ declare class ChannelAdmin implements ChannelControl {
|
|
|
35
35
|
description?: string;
|
|
36
36
|
txn: EditTxn;
|
|
37
37
|
}): Id64String;
|
|
38
|
-
/** @deprecated in 5.
|
|
38
|
+
/** @deprecated in 5.9.0 - will not be removed until after 2027-05-04. Use insertChannelSubject and supply `txn`. */
|
|
39
39
|
insertChannelSubject(args: {
|
|
40
40
|
subjectName: string;
|
|
41
41
|
channelKey: ChannelKey;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChannelAdmin.js","sourceRoot":"","sources":["../../../src/internal/ChannelAdmin.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Elements\n */\n\nimport { DbResult, Id64String, IModelStatus } from \"@itwin/core-bentley\";\nimport { ChannelControlError, ChannelRootAspectProps, IModel, IModelError } from \"@itwin/core-common\";\nimport { ChannelControl, ChannelKey, ChannelUpgradeContext, ChannelUpgradeOptions } from \"../ChannelControl\";\nimport { Subject } from \"../Element\";\nimport { IModelDb } from \"../IModelDb\";\nimport { IModelHost } from \"../IModelHost\";\nimport { ElementOwnsChannelRootAspect } from \"../NavigationRelationship\";\nimport { EditTxn } from \"../EditTxn\";\nimport { _implementationProhibited, _implicitTxn, _nativeDb, _verifyChannel } from \"./Symbols\";\nimport * as semver from \"semver\";\n\nclass ChannelAdmin implements ChannelControl {\n public static readonly channelClassName = \"bis:ChannelRootAspect\";\n\n public readonly [_implementationProhibited] = undefined;\n private _allowedChannels = new Set<ChannelKey>();\n private _allowedModels = new Set<Id64String>();\n private _deniedModels = new Map<Id64String, ChannelKey>();\n\n public constructor(private _iModel: IModelDb) {\n // for backwards compatibility, allow the shared channel unless explicitly turned off in IModelHostOptions.\n if (IModelHost.configuration?.allowSharedChannel !== false)\n this._allowedChannels.add(ChannelControl.sharedChannelName);\n }\n\n public addAllowedChannel(channelKey: ChannelKey) {\n this._allowedChannels.add(channelKey);\n this._deniedModels.clear();\n }\n\n public removeAllowedChannel(channelKey: ChannelKey) {\n this._allowedChannels.delete(channelKey);\n this._allowedModels.clear();\n }\n\n public getChannelKey(elementId: Id64String): ChannelKey {\n if (elementId === IModel.rootSubjectId)\n return ChannelControl.sharedChannelName;\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n const channel = this._iModel.withPreparedStatement(`SELECT Owner FROM ${ChannelAdmin.channelClassName} WHERE Element.Id=?`, (stmt) => {\n stmt.bindId(1, elementId);\n return DbResult.BE_SQLITE_ROW === stmt.step() ? stmt.getValue(0).getString() : undefined;\n });\n\n if (channel !== undefined)\n return channel;\n } catch {\n // Exception happens if the iModel is too old: ChannelRootAspect class not present in the BisCore schema (older than v1.0.10).\n // In that case all data in such iModel is assumed to be in the shared channel.\n return ChannelControl.sharedChannelName;\n }\n\n const parentId = this._iModel.withPreparedSqliteStatement(\"SELECT ParentId,ModelId FROM bis_Element WHERE id=?\", (stmt) => {\n stmt.bindId(1, elementId);\n if (DbResult.BE_SQLITE_ROW !== stmt.step())\n throw new IModelError(IModelStatus.NotFound, \"Element does not exist\");\n return stmt.getValueId(0) ?? stmt.getValueId(1); // if parent is undefined, use modelId\n });\n\n return this.getChannelKey(parentId);\n }\n\n public [_verifyChannel](modelId: Id64String): void {\n // Note: indirect changes are permitted to change any channel\n if (this._allowedModels.has(modelId) || this._iModel[_nativeDb].getTxnMode() === \"indirect\")\n return;\n\n const deniedChannel = this._deniedModels.get(modelId);\n if (undefined !== deniedChannel)\n ChannelControlError.throwError(\"not-allowed\", `Channel ${deniedChannel} is not allowed`, deniedChannel);\n\n const channel = this.getChannelKey(modelId);\n if (this._allowedChannels.has(channel)) {\n this._allowedModels.add(modelId);\n return;\n }\n\n this._deniedModels.set(modelId, channel);\n return this[_verifyChannel](modelId);\n }\n\n public makeChannelRoot(args: { elementId: Id64String, channelKey: ChannelKey, txn: EditTxn }): void;\n /** @deprecated in 5.1.9 - will not be removed until after 2027-05-04. Use makeChannelRoot and supply `txn`. */\n public makeChannelRoot(args: { elementId: Id64String, channelKey: ChannelKey }): void;\n public makeChannelRoot(args: { elementId: Id64String, channelKey: ChannelKey, txn?: EditTxn }): void {\n const txn = args.txn ?? this._iModel[_implicitTxn];\n const channelKey = this.getChannelKey(args.elementId);\n if (ChannelControl.sharedChannelName !== channelKey)\n ChannelControlError.throwError(\"may-not-nest\", `Channel ${channelKey} may not nest`, channelKey);\n\n if (this.queryChannelRoot(args.channelKey) !== undefined)\n ChannelControlError.throwError(\"root-exists\", `Channel ${args.channelKey} root already exist`, channelKey);\n\n const props: ChannelRootAspectProps = {\n classFullName: ChannelAdmin.channelClassName,\n element: {\n id: args.elementId,\n relClassName: ElementOwnsChannelRootAspect.classFullName,\n },\n owner: args.channelKey,\n };\n txn.insertAspect(props);\n }\n\n public insertChannelSubject(args: { subjectName: string, channelKey: ChannelKey, parentSubjectId?: Id64String, description?: string, txn: EditTxn }): Id64String;\n /** @deprecated in 5.1.9 - will not be removed until after 2027-05-04. Use insertChannelSubject and supply `txn`. */\n public insertChannelSubject(args: { subjectName: string, channelKey: ChannelKey, parentSubjectId?: Id64String, description?: string }): Id64String;\n public insertChannelSubject(args: { subjectName: string, channelKey: ChannelKey, parentSubjectId?: Id64String, description?: string, txn?: EditTxn }): Id64String {\n const txn = args.txn ?? this._iModel[_implicitTxn];\n // Check if channelKey already exists before inserting Subject.\n // makeChannelRoot will check that again, but at that point the new Subject is already inserted.\n // Prefer to check twice instead of deleting the Subject in the latter option.\n if (this.queryChannelRoot(args.channelKey) !== undefined)\n ChannelControlError.throwError(\"root-exists\", `Channel ${args.channelKey} root already exist`, args.channelKey);\n\n const elementId = Subject.insert(txn, args.parentSubjectId ?? IModel.rootSubjectId, args.subjectName, args.description);\n this.makeChannelRoot({ elementId, channelKey: args.channelKey, txn });\n return elementId;\n }\n\n public queryChannelRoot(channelKey: ChannelKey): Id64String | undefined {\n if (channelKey === ChannelControl.sharedChannelName)\n // RootSubject acts as the ChannelRoot element of the shared channel\n return IModel.rootSubjectId;\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n const channelRoot = this._iModel.withPreparedStatement(`SELECT Element.Id FROM ${ChannelAdmin.channelClassName} WHERE Owner=?`, (stmt) => {\n stmt.bindString(1, channelKey);\n return DbResult.BE_SQLITE_ROW === stmt.step() ? stmt.getValue(0).getId() : undefined;\n });\n\n return channelRoot;\n } catch {\n // Exception happens if the iModel is too old: ChannelRootAspect class not present in the BisCore schema (older than v1.0.10).\n // In that case all data in such iModel is assumed to be in the shared channel.\n return undefined;\n }\n\n }\n\n public async upgradeChannel(options: ChannelUpgradeOptions, iModel: IModelDb, data?: any): Promise<void> {\n // Validations\n if (!this._allowedChannels.has(options.channelKey))\n ChannelControlError.throwError(\"not-allowed\", `Channel ${options.channelKey} is not allowed`, options.channelKey);\n\n if (semver.gte(options.fromVersion, options.toVersion))\n ChannelControlError.throwError(\"not-allowed\", `Upgrading channel ${options.channelKey} from ${options.fromVersion} to ${options.toVersion} is not allowed`, options.channelKey);\n\n if (!this.queryChannelRoot(options.channelKey) && options.channelKey !== ChannelControl.sharedChannelName)\n ChannelControlError.throwError(\"not-allowed\", `Channel ${options.channelKey} not found`, options.channelKey);\n\n const context: ChannelUpgradeContext = {\n iModel,\n channelKey: options.channelKey,\n fromVersion: options.fromVersion,\n toVersion: options.toVersion,\n data,\n };\n\n try {\n await options.callback(context);\n } catch (error: any) {\n ChannelControlError.throwError(error, \"channel-upgrade-failed\", `Channel ${options.channelKey} upgrade failed: ${error.message}`);\n }\n }\n}\n\nexport function createChannelControl(iModel: IModelDb): ChannelAdmin {\n return new ChannelAdmin(iModel);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ChannelAdmin.js","sourceRoot":"","sources":["../../../src/internal/ChannelAdmin.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Elements\r\n */\r\n\r\nimport { DbResult, Id64String, IModelStatus } from \"@itwin/core-bentley\";\r\nimport { ChannelControlError, ChannelRootAspectProps, IModel, IModelError } from \"@itwin/core-common\";\r\nimport { ChannelControl, ChannelKey, ChannelUpgradeContext, ChannelUpgradeOptions } from \"../ChannelControl\";\r\nimport { Subject } from \"../Element\";\r\nimport { IModelDb } from \"../IModelDb\";\r\nimport { IModelHost } from \"../IModelHost\";\r\nimport { ElementOwnsChannelRootAspect } from \"../NavigationRelationship\";\r\nimport { EditTxn } from \"../EditTxn\";\r\nimport { _implementationProhibited, _implicitTxn, _nativeDb, _verifyChannel } from \"./Symbols\";\r\nimport * as semver from \"semver\";\r\n\r\nclass ChannelAdmin implements ChannelControl {\r\n public static readonly channelClassName = \"bis:ChannelRootAspect\";\r\n\r\n public readonly [_implementationProhibited] = undefined;\r\n private _allowedChannels = new Set<ChannelKey>();\r\n private _allowedModels = new Set<Id64String>();\r\n private _deniedModels = new Map<Id64String, ChannelKey>();\r\n\r\n public constructor(private _iModel: IModelDb) {\r\n // for backwards compatibility, allow the shared channel unless explicitly turned off in IModelHostOptions.\r\n if (IModelHost.configuration?.allowSharedChannel !== false)\r\n this._allowedChannels.add(ChannelControl.sharedChannelName);\r\n }\r\n\r\n public addAllowedChannel(channelKey: ChannelKey) {\r\n this._allowedChannels.add(channelKey);\r\n this._deniedModels.clear();\r\n }\r\n\r\n public removeAllowedChannel(channelKey: ChannelKey) {\r\n this._allowedChannels.delete(channelKey);\r\n this._allowedModels.clear();\r\n }\r\n\r\n public getChannelKey(elementId: Id64String): ChannelKey {\r\n if (elementId === IModel.rootSubjectId)\r\n return ChannelControl.sharedChannelName;\r\n\r\n try {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n const channel = this._iModel.withPreparedStatement(`SELECT Owner FROM ${ChannelAdmin.channelClassName} WHERE Element.Id=?`, (stmt) => {\r\n stmt.bindId(1, elementId);\r\n return DbResult.BE_SQLITE_ROW === stmt.step() ? stmt.getValue(0).getString() : undefined;\r\n });\r\n\r\n if (channel !== undefined)\r\n return channel;\r\n } catch {\r\n // Exception happens if the iModel is too old: ChannelRootAspect class not present in the BisCore schema (older than v1.0.10).\r\n // In that case all data in such iModel is assumed to be in the shared channel.\r\n return ChannelControl.sharedChannelName;\r\n }\r\n\r\n const parentId = this._iModel.withPreparedSqliteStatement(\"SELECT ParentId,ModelId FROM bis_Element WHERE id=?\", (stmt) => {\r\n stmt.bindId(1, elementId);\r\n if (DbResult.BE_SQLITE_ROW !== stmt.step())\r\n throw new IModelError(IModelStatus.NotFound, \"Element does not exist\");\r\n return stmt.getValueId(0) ?? stmt.getValueId(1); // if parent is undefined, use modelId\r\n });\r\n\r\n return this.getChannelKey(parentId);\r\n }\r\n\r\n public [_verifyChannel](modelId: Id64String): void {\r\n // Note: indirect changes are permitted to change any channel\r\n if (this._allowedModels.has(modelId) || this._iModel[_nativeDb].getTxnMode() === \"indirect\")\r\n return;\r\n\r\n const deniedChannel = this._deniedModels.get(modelId);\r\n if (undefined !== deniedChannel)\r\n ChannelControlError.throwError(\"not-allowed\", `Channel ${deniedChannel} is not allowed`, deniedChannel);\r\n\r\n const channel = this.getChannelKey(modelId);\r\n if (this._allowedChannels.has(channel)) {\r\n this._allowedModels.add(modelId);\r\n return;\r\n }\r\n\r\n this._deniedModels.set(modelId, channel);\r\n return this[_verifyChannel](modelId);\r\n }\r\n\r\n public makeChannelRoot(args: { elementId: Id64String, channelKey: ChannelKey, txn: EditTxn }): void;\r\n /** @deprecated in 5.9.0 - will not be removed until after 2027-05-04. Use makeChannelRoot and supply `txn`. */\r\n public makeChannelRoot(args: { elementId: Id64String, channelKey: ChannelKey }): void;\r\n public makeChannelRoot(args: { elementId: Id64String, channelKey: ChannelKey, txn?: EditTxn }): void {\r\n const txn = args.txn ?? this._iModel[_implicitTxn];\r\n const channelKey = this.getChannelKey(args.elementId);\r\n if (ChannelControl.sharedChannelName !== channelKey)\r\n ChannelControlError.throwError(\"may-not-nest\", `Channel ${channelKey} may not nest`, channelKey);\r\n\r\n if (this.queryChannelRoot(args.channelKey) !== undefined)\r\n ChannelControlError.throwError(\"root-exists\", `Channel ${args.channelKey} root already exist`, channelKey);\r\n\r\n const props: ChannelRootAspectProps = {\r\n classFullName: ChannelAdmin.channelClassName,\r\n element: {\r\n id: args.elementId,\r\n relClassName: ElementOwnsChannelRootAspect.classFullName,\r\n },\r\n owner: args.channelKey,\r\n };\r\n txn.insertAspect(props);\r\n }\r\n\r\n public insertChannelSubject(args: { subjectName: string, channelKey: ChannelKey, parentSubjectId?: Id64String, description?: string, txn: EditTxn }): Id64String;\r\n /** @deprecated in 5.9.0 - will not be removed until after 2027-05-04. Use insertChannelSubject and supply `txn`. */\r\n public insertChannelSubject(args: { subjectName: string, channelKey: ChannelKey, parentSubjectId?: Id64String, description?: string }): Id64String;\r\n public insertChannelSubject(args: { subjectName: string, channelKey: ChannelKey, parentSubjectId?: Id64String, description?: string, txn?: EditTxn }): Id64String {\r\n const txn = args.txn ?? this._iModel[_implicitTxn];\r\n // Check if channelKey already exists before inserting Subject.\r\n // makeChannelRoot will check that again, but at that point the new Subject is already inserted.\r\n // Prefer to check twice instead of deleting the Subject in the latter option.\r\n if (this.queryChannelRoot(args.channelKey) !== undefined)\r\n ChannelControlError.throwError(\"root-exists\", `Channel ${args.channelKey} root already exist`, args.channelKey);\r\n\r\n const elementId = Subject.insert(txn, args.parentSubjectId ?? IModel.rootSubjectId, args.subjectName, args.description);\r\n this.makeChannelRoot({ elementId, channelKey: args.channelKey, txn });\r\n return elementId;\r\n }\r\n\r\n public queryChannelRoot(channelKey: ChannelKey): Id64String | undefined {\r\n if (channelKey === ChannelControl.sharedChannelName)\r\n // RootSubject acts as the ChannelRoot element of the shared channel\r\n return IModel.rootSubjectId;\r\n\r\n try {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n const channelRoot = this._iModel.withPreparedStatement(`SELECT Element.Id FROM ${ChannelAdmin.channelClassName} WHERE Owner=?`, (stmt) => {\r\n stmt.bindString(1, channelKey);\r\n return DbResult.BE_SQLITE_ROW === stmt.step() ? stmt.getValue(0).getId() : undefined;\r\n });\r\n\r\n return channelRoot;\r\n } catch {\r\n // Exception happens if the iModel is too old: ChannelRootAspect class not present in the BisCore schema (older than v1.0.10).\r\n // In that case all data in such iModel is assumed to be in the shared channel.\r\n return undefined;\r\n }\r\n\r\n }\r\n\r\n public async upgradeChannel(options: ChannelUpgradeOptions, iModel: IModelDb, data?: any): Promise<void> {\r\n // Validations\r\n if (!this._allowedChannels.has(options.channelKey))\r\n ChannelControlError.throwError(\"not-allowed\", `Channel ${options.channelKey} is not allowed`, options.channelKey);\r\n\r\n if (semver.gte(options.fromVersion, options.toVersion))\r\n ChannelControlError.throwError(\"not-allowed\", `Upgrading channel ${options.channelKey} from ${options.fromVersion} to ${options.toVersion} is not allowed`, options.channelKey);\r\n\r\n if (!this.queryChannelRoot(options.channelKey) && options.channelKey !== ChannelControl.sharedChannelName)\r\n ChannelControlError.throwError(\"not-allowed\", `Channel ${options.channelKey} not found`, options.channelKey);\r\n\r\n const context: ChannelUpgradeContext = {\r\n iModel,\r\n channelKey: options.channelKey,\r\n fromVersion: options.fromVersion,\r\n toVersion: options.toVersion,\r\n data,\r\n };\r\n\r\n try {\r\n await options.callback(context);\r\n } catch (error: any) {\r\n ChannelControlError.throwError(error, \"channel-upgrade-failed\", `Channel ${options.channelKey} upgrade failed: ${error.message}`);\r\n }\r\n }\r\n}\r\n\r\nexport function createChannelControl(iModel: IModelDb): ChannelAdmin {\r\n return new ChannelAdmin(iModel);\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ElementLRUCache.d.ts","sourceRoot":"","sources":["../../../src/internal/ElementLRUCache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAQ,UAAU,EAAc,MAAM,qBAAqB,CAAC;AACnE,OAAO,
|
|
1
|
+
{"version":3,"file":"ElementLRUCache.d.ts","sourceRoot":"","sources":["../../../src/internal/ElementLRUCache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAQ,UAAU,EAAc,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAmB,kBAAkB,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGzG,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,kBAAkB,CAAA;IAC/B,OAAO,EAAE,YAAY,CAAC;CACvB;AAED;;;GAGG;AACH,qBAAa,eAAe;aAgCS,QAAQ;IA/B3C,gBAAuB,gBAAgB,QAAQ;IAC/C,OAAO,CAAC,aAAa,CAAwC;IAC7D,OAAO,CAAC,YAAY,CAAqC;IACzD,OAAO,CAAC,sBAAsB,CAAiC;IAE/D,OAAO,CAAC,MAAM,CAAC,WAAW;IAS1B,OAAO,CAAC,WAAW;gBAiBgB,QAAQ,SAAmC;IACvE,KAAK,IAAI,IAAI;IAKpB,IAAW,IAAI,IAAI,MAAM,CAExB;IACM,eAAe,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IAM1C,MAAM,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO;IActC,GAAG,CAAC,GAAG,EAAE,gBAAgB,GAAG,aAAa,GAAG,SAAS;IAoBrD,GAAG,CAAC,EAAE,EAAE,aAAa,GAAG,IAAI;IA+BnC,IAAW,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,MAAM,CAExC;CACF;AAwED;;;GAGG;AACH,qBAAa,mBAAmB;aAKK,QAAQ;IAJ3C,gBAAuB,gBAAgB,QAAQ;IAC/C,OAAO,CAAC,kBAAkB,CAA8B;IACxD,OAAO,CAAC,kBAAkB,CAAqC;gBAE5B,QAAQ,SAAmC;IAEvE,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC,sBAAsB,EAAE,MAAM,EAAE,cAAc,CAAC,wBAAwB,GAAG,IAAI;IA2BtG,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC,sBAAsB,GAAG,cAAc,CAAC,wBAAwB,GAAG,SAAS;IAepG,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAS/B,MAAM,CAAC,GAAG,EAAE,cAAc,CAAC,sBAAsB,GAAG,OAAO;IAMlE,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,MAAM,CAAC,cAAc;IAe7B,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAUhC,OAAO,CAAC,MAAM,CAAC,WAAW;IAUnB,KAAK,IAAI,IAAI;IAIpB,IAAW,IAAI,IAAI,MAAM,CAExB;IACD,IAAW,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,MAAM,CAExC;CACF"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.InstanceKeyLRUCache = exports.ElementLRUCache = void 0;
|
|
4
4
|
const core_bentley_1 = require("@itwin/core-bentley");
|
|
5
|
+
const core_common_1 = require("@itwin/core-common");
|
|
5
6
|
/**
|
|
6
7
|
* A LRU cache for entities. Cache contains the ElementProps and the load options used to load it.
|
|
7
8
|
* Cache can be searched by id, code or federationGuid.
|
|
@@ -13,6 +14,8 @@ class ElementLRUCache {
|
|
|
13
14
|
_cacheByCode = new Map();
|
|
14
15
|
_cacheByFederationGuid = new Map();
|
|
15
16
|
static makeCodeKey(code) {
|
|
17
|
+
if (core_common_1.Code.isEmpty(code))
|
|
18
|
+
return undefined;
|
|
16
19
|
const keys = [code.scope, code.spec];
|
|
17
20
|
if (code.value !== undefined) {
|
|
18
21
|
keys.push(code.value);
|
|
@@ -29,7 +32,8 @@ class ElementLRUCache {
|
|
|
29
32
|
return this._elementCache.get(id);
|
|
30
33
|
}
|
|
31
34
|
else if (key.code) {
|
|
32
|
-
const
|
|
35
|
+
const codeKey = ElementLRUCache.makeCodeKey(key.code);
|
|
36
|
+
const id = codeKey !== undefined ? this._cacheByCode.get(codeKey) : undefined;
|
|
33
37
|
if (id)
|
|
34
38
|
return this._elementCache.get(id);
|
|
35
39
|
}
|
|
@@ -60,7 +64,9 @@ class ElementLRUCache {
|
|
|
60
64
|
if (cachedElement) {
|
|
61
65
|
if (cachedElement.elProps.id)
|
|
62
66
|
this._elementCache.delete(cachedElement.elProps.id);
|
|
63
|
-
|
|
67
|
+
const codeKeyToDelete = ElementLRUCache.makeCodeKey(cachedElement.elProps.code);
|
|
68
|
+
if (codeKeyToDelete !== undefined)
|
|
69
|
+
this._cacheByCode.delete(codeKeyToDelete);
|
|
64
70
|
if (cachedElement.elProps.federationGuid)
|
|
65
71
|
this._cacheByFederationGuid.delete(cachedElement.elProps.federationGuid);
|
|
66
72
|
return true;
|
|
@@ -104,7 +110,9 @@ class ElementLRUCache {
|
|
|
104
110
|
if (el.elProps.federationGuid) {
|
|
105
111
|
this._cacheByFederationGuid.set(el.elProps.federationGuid, el.elProps.id);
|
|
106
112
|
}
|
|
107
|
-
|
|
113
|
+
const codeKey = ElementLRUCache.makeCodeKey(el.elProps.code);
|
|
114
|
+
if (codeKey !== undefined)
|
|
115
|
+
this._cacheByCode.set(codeKey, el.elProps.id);
|
|
108
116
|
if (this._elementCache.size > this.capacity) {
|
|
109
117
|
const oldestKey = this._elementCache.keys().next().value;
|
|
110
118
|
const oldestElement = this._elementCache.get(oldestKey);
|
|
@@ -190,6 +198,8 @@ class InstanceKeyLRUCache {
|
|
|
190
198
|
if (!result.id || !core_bentley_1.Id64.isValidId64(result.id))
|
|
191
199
|
core_bentley_1.ITwinError.throwError({ message: "Invalid InstanceKey result", iTwinErrorId: { scope: "imodel-cache", key: "invalid-arguments" } });
|
|
192
200
|
const cacheArgs = InstanceKeyLRUCache.makeCachedArgs(key);
|
|
201
|
+
if (!cacheArgs)
|
|
202
|
+
return this;
|
|
193
203
|
cacheArgs.id = cacheArgs.id ? cacheArgs.id : result.id;
|
|
194
204
|
const existingArgs = this._resultToArgsCache.get(result.id);
|
|
195
205
|
if (existingArgs) {
|
|
@@ -212,6 +222,8 @@ class InstanceKeyLRUCache {
|
|
|
212
222
|
}
|
|
213
223
|
get(key) {
|
|
214
224
|
const args = InstanceKeyLRUCache.makeCachedArgs(key);
|
|
225
|
+
if (!args)
|
|
226
|
+
return undefined;
|
|
215
227
|
const cachedResult = this._argsToResultCache.get(args);
|
|
216
228
|
if (cachedResult) {
|
|
217
229
|
// Pop the cached result to the end of the cache to mark it as recently used
|
|
@@ -233,6 +245,8 @@ class InstanceKeyLRUCache {
|
|
|
233
245
|
}
|
|
234
246
|
delete(key) {
|
|
235
247
|
const cacheArgs = InstanceKeyLRUCache.makeCachedArgs(key);
|
|
248
|
+
if (!cacheArgs)
|
|
249
|
+
return false;
|
|
236
250
|
return this.deleteCachedArgs(cacheArgs);
|
|
237
251
|
}
|
|
238
252
|
deleteCachedArgs(key) {
|
|
@@ -248,11 +262,14 @@ class InstanceKeyLRUCache {
|
|
|
248
262
|
static makeCachedArgs(args) {
|
|
249
263
|
if (!args.partialKey && !args.code && !args.federationGuid)
|
|
250
264
|
core_bentley_1.ITwinError.throwError({ message: "ResolveInstanceKeyArgs must have a partialKey, code, or federationGuid", iTwinErrorId: { scope: "imodel-cache", key: "invalid-arguments" } });
|
|
251
|
-
|
|
265
|
+
const cacheArgs = {
|
|
252
266
|
id: args.partialKey?.id,
|
|
253
267
|
code: args.code ? InstanceKeyLRUCache.makeCodeKey(args.code) : undefined,
|
|
254
268
|
federationGuid: args.federationGuid,
|
|
255
269
|
};
|
|
270
|
+
if (!cacheArgs.id && !cacheArgs.code && !cacheArgs.federationGuid)
|
|
271
|
+
return undefined;
|
|
272
|
+
return cacheArgs;
|
|
256
273
|
}
|
|
257
274
|
static combineCachedArgs(originalArgs, newArgs) {
|
|
258
275
|
if (!originalArgs.id && !originalArgs.code && !originalArgs.federationGuid && !newArgs.id && !newArgs.code && !newArgs.federationGuid)
|
|
@@ -264,6 +281,8 @@ class InstanceKeyLRUCache {
|
|
|
264
281
|
};
|
|
265
282
|
}
|
|
266
283
|
static makeCodeKey(code) {
|
|
284
|
+
if (core_common_1.Code.isEmpty(code))
|
|
285
|
+
return undefined;
|
|
267
286
|
const keys = [code.scope, code.spec];
|
|
268
287
|
if (code.value !== undefined) {
|
|
269
288
|
keys.push(code.value);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ElementLRUCache.js","sourceRoot":"","sources":["../../../src/internal/ElementLRUCache.ts"],"names":[],"mappings":"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","sourcesContent":["import { IModelJsNative } from \"@bentley/imodeljs-native\";\nimport { Id64, Id64String, ITwinError } from \"@itwin/core-bentley\";\nimport { CodeProps, ElementLoadOptions, ElementLoadProps, ElementProps } from \"@itwin/core-common\";\n\n/* @internal */\nexport interface CachedElement {\n loadOptions: ElementLoadOptions\n elProps: ElementProps;\n}\n\n/**\n * A LRU cache for entities. Cache contains the ElementProps and the load options used to load it.\n * Cache can be searched by id, code or federationGuid.\n */\nexport class ElementLRUCache {\n public static readonly DEFAULT_CAPACITY = 2000;\n private _elementCache = new Map<Id64String, CachedElement>();\n private _cacheByCode = new Map<Id64String, Id64String>();\n private _cacheByFederationGuid = new Map<string, Id64String>();\n\n private static makeCodeKey(code: CodeProps): string {\n const keys = [code.scope, code.spec];\n if (code.value !== undefined) {\n keys.push(code.value);\n }\n return JSON.stringify(keys);\n }\n private findElement(key: ElementLoadProps): CachedElement | undefined {\n if (key.id) {\n return this._elementCache.get(key.id);\n } else if (key.federationGuid) {\n const id = this._cacheByFederationGuid.get(key.federationGuid);\n if (id)\n return this._elementCache.get(id);\n } else if (key.code) {\n const id = this._cacheByCode.get(ElementLRUCache.makeCodeKey(key.code));\n if (id)\n return this._elementCache.get(id);\n } else {\n ITwinError.throwError<ITwinError>({ message: \"No key provided\", iTwinErrorId: { scope: \"imodel-cache\", key: \"invalid-arguments\" } });\n }\n return undefined;\n }\n public constructor(public readonly capacity = ElementLRUCache.DEFAULT_CAPACITY) { }\n public clear(): void {\n this._elementCache.clear();\n this._cacheByCode.clear();\n this._cacheByFederationGuid.clear();\n }\n public get size(): number {\n return this._elementCache.size;\n }\n public deleteWithModel(modelId: Id64String): void {\n this._elementCache.forEach((cachedVal, elementId) => {\n if (cachedVal.elProps.model === modelId)\n this.delete({ id: elementId });\n });\n }\n public delete(key: ElementLoadProps): boolean {\n const cachedElement = this.findElement(key);\n if (cachedElement) {\n if (cachedElement.elProps.id)\n this._elementCache.delete(cachedElement.elProps.id);\n this._cacheByCode.delete(ElementLRUCache.makeCodeKey(cachedElement.elProps.code));\n if (cachedElement.elProps.federationGuid)\n this._cacheByFederationGuid.delete(cachedElement.elProps.federationGuid);\n return true;\n }\n return false;\n }\n public get(key: ElementLoadProps): CachedElement | undefined {\n const cachedElement = this.findElement(key);\n if (cachedElement) {\n if (cachedElement.elProps.id) {\n this._elementCache.delete(cachedElement.elProps.id);\n this._elementCache.set(cachedElement.elProps.id, cachedElement);\n }\n }\n\n if (cachedElement) {\n if (key.displayStyle !== cachedElement.loadOptions.displayStyle ||\n key.onlyBaseProperties !== cachedElement.loadOptions.onlyBaseProperties ||\n key.renderTimeline !== cachedElement.loadOptions.renderTimeline ||\n key.wantBRepData !== cachedElement.loadOptions.wantBRepData ||\n key.wantGeometry !== cachedElement.loadOptions.wantGeometry) {\n return undefined\n }\n }\n return cachedElement;\n }\n public set(el: CachedElement): this {\n if (!el.elProps.id)\n ITwinError.throwError<ITwinError>({ message: \"Element must have an id\", iTwinErrorId: { scope: \"imodel-cache\", key: \"invalid-arguments\" } });\n\n // do not cache this element as geom need to be rerender into geom props if any part changes\n // TODO: find a way to handle caching geometry\n if (el.loadOptions.wantGeometry) {\n return this;\n }\n\n if (this._elementCache.has(el.elProps.id)) {\n this._elementCache.delete(el.elProps.id);\n this._elementCache.set(el.elProps.id, el);\n } else {\n this._elementCache.set(el.elProps.id, el);\n }\n\n if (el.elProps.federationGuid) {\n this._cacheByFederationGuid.set(el.elProps.federationGuid, el.elProps.id);\n }\n\n this._cacheByCode.set(ElementLRUCache.makeCodeKey(el.elProps.code), el.elProps.id);\n if (this._elementCache.size > this.capacity) {\n const oldestKey = this._elementCache.keys().next().value as Id64String;\n const oldestElement = this._elementCache.get(oldestKey);\n this.delete({ id: oldestKey, federationGuid: oldestElement?.elProps.federationGuid, code: oldestElement?.elProps.code });\n }\n return this;\n }\n public get [Symbol.toStringTag](): string {\n return `EntityCache(this.size=${this.size}, capacity=${this.capacity})`;\n }\n};\n\n/* @internal */\ninterface CachedArgs {\n id?: Id64String;\n code?: string;\n federationGuid?: Id64String;\n}\n\n/**\n * A map to store instance keys based on different optional arguments like id, code, or federationGuid.\n * This allows the cache to be searched by any combination of arguments.\n */\nclass ArgumentsToResultMap {\n private _idToResult = new Map<Id64String, IModelJsNative.ResolveInstanceKeyResult>();\n private _codeToResult = new Map<string, IModelJsNative.ResolveInstanceKeyResult>();\n private _federationGuidToResult = new Map<Id64String, IModelJsNative.ResolveInstanceKeyResult>();\n\n public constructor() { }\n\n public set(args: CachedArgs, result: IModelJsNative.ResolveInstanceKeyResult): void {\n if (!args.id && !args.code && !args.federationGuid)\n ITwinError.throwError<ITwinError>({ message: \"At least one id, code, or federationGuid must be provided\", iTwinErrorId: { scope: \"imodel-cache\", key: \"invalid-arguments\" } });\n\n if (args.id)\n this._idToResult.set(args.id, result);\n else\n this._idToResult.set(result.id, result);\n\n if (args.code)\n this._codeToResult.set(args.code, result);\n if (args.federationGuid)\n this._federationGuidToResult.set(args.federationGuid, result);\n }\n public get(args: CachedArgs): IModelJsNative.ResolveInstanceKeyResult | undefined {\n if (!args.id && !args.code && !args.federationGuid)\n ITwinError.throwError<ITwinError>({ message: \"At least one id, code, or federationGuid must be provided\", iTwinErrorId: { scope: \"imodel-cache\", key: \"invalid-arguments\" } });\n\n if (args.id)\n return this._idToResult.get(args.id);\n else if (args.code)\n return this._codeToResult.get(args.code);\n else if (args.federationGuid)\n return this._federationGuidToResult.get(args.federationGuid);\n return undefined;\n }\n public delete(args: CachedArgs): boolean {\n if (!args.id && !args.code && !args.federationGuid)\n ITwinError.throwError<ITwinError>({ message: \"At least one id, code, or federationGuid must be provided\", iTwinErrorId: { scope: \"imodel-cache\", key: \"invalid-arguments\" } });\n\n let deleted = false;\n if (args.id)\n deleted = this._idToResult.delete(args.id) ? true : deleted;\n if (args.code)\n deleted = this._codeToResult.delete(args.code) ? true : deleted;\n if (args.federationGuid)\n deleted = this._federationGuidToResult.delete(args.federationGuid) ? true : deleted;\n return deleted;\n }\n public clear(): void {\n this._idToResult.clear();\n this._codeToResult.clear();\n this._federationGuidToResult.clear();\n }\n public get size(): number {\n return this._idToResult.size; // Id to key will always be stored even if code or federationGuid are not provided.\n }\n public get [Symbol.toStringTag](): string {\n return `idCacheSize=${this._idToResult.size}, codeCacheSize=${this._codeToResult.size}, federationGuidCacheSize=${this._federationGuidToResult.size}`;\n }\n}\n\n/**\n * A LRU cache for entities. Cache contains the ElementProps and the load options used to load it.\n * Cache can be searched by id, code or federationGuid.\n */\nexport class InstanceKeyLRUCache {\n public static readonly DEFAULT_CAPACITY = 2000;\n private _argsToResultCache = new ArgumentsToResultMap();\n private _resultToArgsCache = new Map<Id64String, CachedArgs>();\n\n public constructor(public readonly capacity = ElementLRUCache.DEFAULT_CAPACITY) { }\n\n public set(key: IModelJsNative.ResolveInstanceKeyArgs, result: IModelJsNative.ResolveInstanceKeyResult): this {\n if (!result.id || !Id64.isValidId64(result.id))\n ITwinError.throwError<ITwinError>({ message: \"Invalid InstanceKey result\", iTwinErrorId: { scope: \"imodel-cache\", key: \"invalid-arguments\" } });\n\n const cacheArgs: CachedArgs = InstanceKeyLRUCache.makeCachedArgs(key);\n cacheArgs.id = cacheArgs.id ? cacheArgs.id : result.id;\n const existingArgs = this._resultToArgsCache.get(result.id);\n if (existingArgs) {\n // Combine existing args with new args for more complete key\n this._argsToResultCache.delete(existingArgs);\n const combinedArgs: CachedArgs = InstanceKeyLRUCache.combineCachedArgs(existingArgs, cacheArgs);\n this._argsToResultCache.set(combinedArgs, result);\n this._resultToArgsCache.set(result.id, combinedArgs);\n } else {\n this._argsToResultCache.set(cacheArgs, result);\n this._resultToArgsCache.set(result.id, cacheArgs);\n }\n\n if (this._resultToArgsCache.size > this.capacity) {\n const oldestKey = this._resultToArgsCache.keys().next().value as Id64String;\n const oldestArgs = this._resultToArgsCache.get(oldestKey);\n this.deleteCachedArgs({id: oldestArgs?.id,code: oldestArgs?.code, federationGuid: oldestArgs?.federationGuid});\n }\n return this;\n }\n public get(key: IModelJsNative.ResolveInstanceKeyArgs): IModelJsNative.ResolveInstanceKeyResult | undefined {\n const args = InstanceKeyLRUCache.makeCachedArgs(key);\n const cachedResult = this._argsToResultCache.get(args);\n if (cachedResult) {\n // Pop the cached result to the end of the cache to mark it as recently used\n const cachedArgs = this._resultToArgsCache.get(cachedResult.id);\n if (cachedArgs) {\n this._resultToArgsCache.delete(cachedResult.id);\n this._resultToArgsCache.set(cachedResult.id, cachedArgs);\n }\n }\n return cachedResult;\n }\n public deleteById(id: string): boolean {\n if (!Id64.isValidId64(id))\n ITwinError.throwError<ITwinError>({ message: \"Invalid id provided\", iTwinErrorId: { scope: \"imodel-cache\", key: \"invalid-arguments\" } });\n\n const cacheArgs = {\n id: Id64.fromString(id),\n }\n return this.deleteCachedArgs(cacheArgs);\n }\n public delete(key: IModelJsNative.ResolveInstanceKeyArgs): boolean {\n const cacheArgs = InstanceKeyLRUCache.makeCachedArgs(key);\n return this.deleteCachedArgs(cacheArgs);\n }\n private deleteCachedArgs(key: CachedArgs): boolean {\n const result = this._argsToResultCache.get(key);\n if (result) {\n const argsToDelete = this._resultToArgsCache.get(result.id);\n this._argsToResultCache.delete({id: argsToDelete?.id, code: argsToDelete?.code, federationGuid: argsToDelete?.federationGuid});\n this._resultToArgsCache.delete(result.id);\n return true;\n }\n return false;\n }\n private static makeCachedArgs(args: IModelJsNative.ResolveInstanceKeyArgs): CachedArgs {\n if (!args.partialKey && !args.code && !args.federationGuid)\n ITwinError.throwError<ITwinError>({ message: \"ResolveInstanceKeyArgs must have a partialKey, code, or federationGuid\", iTwinErrorId: { scope: \"imodel-cache\", key: \"invalid-arguments\" } });\n\n return {\n id: args.partialKey?.id,\n code: args.code ? InstanceKeyLRUCache.makeCodeKey(args.code) : undefined,\n federationGuid: args.federationGuid,\n };\n }\n private static combineCachedArgs(originalArgs: CachedArgs, newArgs: CachedArgs): CachedArgs {\n if (!originalArgs.id && !originalArgs.code && !originalArgs.federationGuid && !newArgs.id && !newArgs.code && !newArgs.federationGuid)\n ITwinError.throwError<ITwinError>({ message: \"ResolveInstanceKeyArgs must have a partialKey, code, or federationGuid\", iTwinErrorId: { scope: \"imodel-cache\", key: \"invalid-arguments\" } });\n\n return {\n id: newArgs.id ? newArgs.id : originalArgs.id,\n code: newArgs.code ? newArgs.code : originalArgs.code,\n federationGuid: newArgs.federationGuid ? newArgs.federationGuid : originalArgs.federationGuid,\n };\n }\n private static makeCodeKey(code: CodeProps): string {\n const keys = [code.scope, code.spec];\n if (code.value !== undefined) {\n keys.push(code.value);\n }\n return JSON.stringify(keys);\n }\n public clear(): void {\n this._argsToResultCache.clear();\n this._resultToArgsCache.clear();\n }\n public get size(): number {\n return this._resultToArgsCache.size;\n }\n public get [Symbol.toStringTag](): string {\n return `InstanceKeyCache(size=${this.size}, capacity=${this.capacity})`;\n }\n};"]}
|
|
1
|
+
{"version":3,"file":"ElementLRUCache.js","sourceRoot":"","sources":["../../../src/internal/ElementLRUCache.ts"],"names":[],"mappings":"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","sourcesContent":["import { IModelJsNative } from \"@bentley/imodeljs-native\";\r\nimport { Id64, Id64String, ITwinError } from \"@itwin/core-bentley\";\r\nimport { Code, CodeProps, ElementLoadOptions, ElementLoadProps, ElementProps } from \"@itwin/core-common\";\r\n\r\n/* @internal */\r\nexport interface CachedElement {\r\n loadOptions: ElementLoadOptions\r\n elProps: ElementProps;\r\n}\r\n\r\n/**\r\n * A LRU cache for entities. Cache contains the ElementProps and the load options used to load it.\r\n * Cache can be searched by id, code or federationGuid.\r\n */\r\nexport class ElementLRUCache {\r\n public static readonly DEFAULT_CAPACITY = 2000;\r\n private _elementCache = new Map<Id64String, CachedElement>();\r\n private _cacheByCode = new Map<Id64String, Id64String>();\r\n private _cacheByFederationGuid = new Map<string, Id64String>();\r\n\r\n private static makeCodeKey(code: CodeProps): string | undefined {\r\n if (Code.isEmpty(code))\r\n return undefined;\r\n const keys = [code.scope, code.spec];\r\n if (code.value !== undefined) {\r\n keys.push(code.value);\r\n }\r\n return JSON.stringify(keys);\r\n }\r\n private findElement(key: ElementLoadProps): CachedElement | undefined {\r\n if (key.id) {\r\n return this._elementCache.get(key.id);\r\n } else if (key.federationGuid) {\r\n const id = this._cacheByFederationGuid.get(key.federationGuid);\r\n if (id)\r\n return this._elementCache.get(id);\r\n } else if (key.code) {\r\n const codeKey = ElementLRUCache.makeCodeKey(key.code);\r\n const id = codeKey !== undefined ? this._cacheByCode.get(codeKey) : undefined;\r\n if (id)\r\n return this._elementCache.get(id);\r\n } else {\r\n ITwinError.throwError<ITwinError>({ message: \"No key provided\", iTwinErrorId: { scope: \"imodel-cache\", key: \"invalid-arguments\" } });\r\n }\r\n return undefined;\r\n }\r\n public constructor(public readonly capacity = ElementLRUCache.DEFAULT_CAPACITY) { }\r\n public clear(): void {\r\n this._elementCache.clear();\r\n this._cacheByCode.clear();\r\n this._cacheByFederationGuid.clear();\r\n }\r\n public get size(): number {\r\n return this._elementCache.size;\r\n }\r\n public deleteWithModel(modelId: Id64String): void {\r\n this._elementCache.forEach((cachedVal, elementId) => {\r\n if (cachedVal.elProps.model === modelId)\r\n this.delete({ id: elementId });\r\n });\r\n }\r\n public delete(key: ElementLoadProps): boolean {\r\n const cachedElement = this.findElement(key);\r\n if (cachedElement) {\r\n if (cachedElement.elProps.id)\r\n this._elementCache.delete(cachedElement.elProps.id);\r\n const codeKeyToDelete = ElementLRUCache.makeCodeKey(cachedElement.elProps.code);\r\n if (codeKeyToDelete !== undefined)\r\n this._cacheByCode.delete(codeKeyToDelete);\r\n if (cachedElement.elProps.federationGuid)\r\n this._cacheByFederationGuid.delete(cachedElement.elProps.federationGuid);\r\n return true;\r\n }\r\n return false;\r\n }\r\n public get(key: ElementLoadProps): CachedElement | undefined {\r\n const cachedElement = this.findElement(key);\r\n if (cachedElement) {\r\n if (cachedElement.elProps.id) {\r\n this._elementCache.delete(cachedElement.elProps.id);\r\n this._elementCache.set(cachedElement.elProps.id, cachedElement);\r\n }\r\n }\r\n\r\n if (cachedElement) {\r\n if (key.displayStyle !== cachedElement.loadOptions.displayStyle ||\r\n key.onlyBaseProperties !== cachedElement.loadOptions.onlyBaseProperties ||\r\n key.renderTimeline !== cachedElement.loadOptions.renderTimeline ||\r\n key.wantBRepData !== cachedElement.loadOptions.wantBRepData ||\r\n key.wantGeometry !== cachedElement.loadOptions.wantGeometry) {\r\n return undefined\r\n }\r\n }\r\n return cachedElement;\r\n }\r\n public set(el: CachedElement): this {\r\n if (!el.elProps.id)\r\n ITwinError.throwError<ITwinError>({ message: \"Element must have an id\", iTwinErrorId: { scope: \"imodel-cache\", key: \"invalid-arguments\" } });\r\n\r\n // do not cache this element as geom need to be rerender into geom props if any part changes\r\n // TODO: find a way to handle caching geometry\r\n if (el.loadOptions.wantGeometry) {\r\n return this;\r\n }\r\n\r\n if (this._elementCache.has(el.elProps.id)) {\r\n this._elementCache.delete(el.elProps.id);\r\n this._elementCache.set(el.elProps.id, el);\r\n } else {\r\n this._elementCache.set(el.elProps.id, el);\r\n }\r\n\r\n if (el.elProps.federationGuid) {\r\n this._cacheByFederationGuid.set(el.elProps.federationGuid, el.elProps.id);\r\n }\r\n\r\n const codeKey = ElementLRUCache.makeCodeKey(el.elProps.code);\r\n if (codeKey !== undefined)\r\n this._cacheByCode.set(codeKey, el.elProps.id);\r\n if (this._elementCache.size > this.capacity) {\r\n const oldestKey = this._elementCache.keys().next().value as Id64String;\r\n const oldestElement = this._elementCache.get(oldestKey);\r\n this.delete({ id: oldestKey, federationGuid: oldestElement?.elProps.federationGuid, code: oldestElement?.elProps.code });\r\n }\r\n return this;\r\n }\r\n public get [Symbol.toStringTag](): string {\r\n return `EntityCache(this.size=${this.size}, capacity=${this.capacity})`;\r\n }\r\n};\r\n\r\n/* @internal */\r\ninterface CachedArgs {\r\n id?: Id64String;\r\n code?: string;\r\n federationGuid?: Id64String;\r\n}\r\n\r\n/**\r\n * A map to store instance keys based on different optional arguments like id, code, or federationGuid.\r\n * This allows the cache to be searched by any combination of arguments.\r\n */\r\nclass ArgumentsToResultMap {\r\n private _idToResult = new Map<Id64String, IModelJsNative.ResolveInstanceKeyResult>();\r\n private _codeToResult = new Map<string, IModelJsNative.ResolveInstanceKeyResult>();\r\n private _federationGuidToResult = new Map<Id64String, IModelJsNative.ResolveInstanceKeyResult>();\r\n\r\n public constructor() { }\r\n\r\n public set(args: CachedArgs, result: IModelJsNative.ResolveInstanceKeyResult): void {\r\n if (!args.id && !args.code && !args.federationGuid)\r\n ITwinError.throwError<ITwinError>({ message: \"At least one id, code, or federationGuid must be provided\", iTwinErrorId: { scope: \"imodel-cache\", key: \"invalid-arguments\" } });\r\n\r\n if (args.id)\r\n this._idToResult.set(args.id, result);\r\n else\r\n this._idToResult.set(result.id, result);\r\n\r\n if (args.code)\r\n this._codeToResult.set(args.code, result);\r\n if (args.federationGuid)\r\n this._federationGuidToResult.set(args.federationGuid, result);\r\n }\r\n public get(args: CachedArgs): IModelJsNative.ResolveInstanceKeyResult | undefined {\r\n if (!args.id && !args.code && !args.federationGuid)\r\n ITwinError.throwError<ITwinError>({ message: \"At least one id, code, or federationGuid must be provided\", iTwinErrorId: { scope: \"imodel-cache\", key: \"invalid-arguments\" } });\r\n\r\n if (args.id)\r\n return this._idToResult.get(args.id);\r\n else if (args.code)\r\n return this._codeToResult.get(args.code);\r\n else if (args.federationGuid)\r\n return this._federationGuidToResult.get(args.federationGuid);\r\n return undefined;\r\n }\r\n public delete(args: CachedArgs): boolean {\r\n if (!args.id && !args.code && !args.federationGuid)\r\n ITwinError.throwError<ITwinError>({ message: \"At least one id, code, or federationGuid must be provided\", iTwinErrorId: { scope: \"imodel-cache\", key: \"invalid-arguments\" } });\r\n\r\n let deleted = false;\r\n if (args.id)\r\n deleted = this._idToResult.delete(args.id) ? true : deleted;\r\n if (args.code)\r\n deleted = this._codeToResult.delete(args.code) ? true : deleted;\r\n if (args.federationGuid)\r\n deleted = this._federationGuidToResult.delete(args.federationGuid) ? true : deleted;\r\n return deleted;\r\n }\r\n public clear(): void {\r\n this._idToResult.clear();\r\n this._codeToResult.clear();\r\n this._federationGuidToResult.clear();\r\n }\r\n public get size(): number {\r\n return this._idToResult.size; // Id to key will always be stored even if code or federationGuid are not provided.\r\n }\r\n public get [Symbol.toStringTag](): string {\r\n return `idCacheSize=${this._idToResult.size}, codeCacheSize=${this._codeToResult.size}, federationGuidCacheSize=${this._federationGuidToResult.size}`;\r\n }\r\n}\r\n\r\n/**\r\n * A LRU cache for entities. Cache contains the ElementProps and the load options used to load it.\r\n * Cache can be searched by id, code or federationGuid.\r\n */\r\nexport class InstanceKeyLRUCache {\r\n public static readonly DEFAULT_CAPACITY = 2000;\r\n private _argsToResultCache = new ArgumentsToResultMap();\r\n private _resultToArgsCache = new Map<Id64String, CachedArgs>();\r\n\r\n public constructor(public readonly capacity = ElementLRUCache.DEFAULT_CAPACITY) { }\r\n\r\n public set(key: IModelJsNative.ResolveInstanceKeyArgs, result: IModelJsNative.ResolveInstanceKeyResult): this {\r\n if (!result.id || !Id64.isValidId64(result.id))\r\n ITwinError.throwError<ITwinError>({ message: \"Invalid InstanceKey result\", iTwinErrorId: { scope: \"imodel-cache\", key: \"invalid-arguments\" } });\r\n\r\n const cacheArgs = InstanceKeyLRUCache.makeCachedArgs(key);\r\n if (!cacheArgs)\r\n return this;\r\n cacheArgs.id = cacheArgs.id ? cacheArgs.id : result.id;\r\n const existingArgs = this._resultToArgsCache.get(result.id);\r\n if (existingArgs) {\r\n // Combine existing args with new args for more complete key\r\n this._argsToResultCache.delete(existingArgs);\r\n const combinedArgs: CachedArgs = InstanceKeyLRUCache.combineCachedArgs(existingArgs, cacheArgs);\r\n this._argsToResultCache.set(combinedArgs, result);\r\n this._resultToArgsCache.set(result.id, combinedArgs);\r\n } else {\r\n this._argsToResultCache.set(cacheArgs, result);\r\n this._resultToArgsCache.set(result.id, cacheArgs);\r\n }\r\n\r\n if (this._resultToArgsCache.size > this.capacity) {\r\n const oldestKey = this._resultToArgsCache.keys().next().value as Id64String;\r\n const oldestArgs = this._resultToArgsCache.get(oldestKey);\r\n this.deleteCachedArgs({ id: oldestArgs?.id, code: oldestArgs?.code, federationGuid: oldestArgs?.federationGuid });\r\n }\r\n return this;\r\n }\r\n public get(key: IModelJsNative.ResolveInstanceKeyArgs): IModelJsNative.ResolveInstanceKeyResult | undefined {\r\n const args = InstanceKeyLRUCache.makeCachedArgs(key);\r\n if (!args)\r\n return undefined;\r\n const cachedResult = this._argsToResultCache.get(args);\r\n if (cachedResult) {\r\n // Pop the cached result to the end of the cache to mark it as recently used\r\n const cachedArgs = this._resultToArgsCache.get(cachedResult.id);\r\n if (cachedArgs) {\r\n this._resultToArgsCache.delete(cachedResult.id);\r\n this._resultToArgsCache.set(cachedResult.id, cachedArgs);\r\n }\r\n }\r\n return cachedResult;\r\n }\r\n public deleteById(id: string): boolean {\r\n if (!Id64.isValidId64(id))\r\n ITwinError.throwError<ITwinError>({ message: \"Invalid id provided\", iTwinErrorId: { scope: \"imodel-cache\", key: \"invalid-arguments\" } });\r\n\r\n const cacheArgs = {\r\n id: Id64.fromString(id),\r\n }\r\n return this.deleteCachedArgs(cacheArgs);\r\n }\r\n public delete(key: IModelJsNative.ResolveInstanceKeyArgs): boolean {\r\n const cacheArgs = InstanceKeyLRUCache.makeCachedArgs(key);\r\n if (!cacheArgs)\r\n return false;\r\n return this.deleteCachedArgs(cacheArgs);\r\n }\r\n private deleteCachedArgs(key: CachedArgs): boolean {\r\n const result = this._argsToResultCache.get(key);\r\n if (result) {\r\n const argsToDelete = this._resultToArgsCache.get(result.id);\r\n this._argsToResultCache.delete({ id: argsToDelete?.id, code: argsToDelete?.code, federationGuid: argsToDelete?.federationGuid });\r\n this._resultToArgsCache.delete(result.id);\r\n return true;\r\n }\r\n return false;\r\n }\r\n private static makeCachedArgs(args: IModelJsNative.ResolveInstanceKeyArgs): CachedArgs | undefined {\r\n if (!args.partialKey && !args.code && !args.federationGuid)\r\n ITwinError.throwError<ITwinError>({ message: \"ResolveInstanceKeyArgs must have a partialKey, code, or federationGuid\", iTwinErrorId: { scope: \"imodel-cache\", key: \"invalid-arguments\" } });\r\n\r\n const cacheArgs: CachedArgs = {\r\n id: args.partialKey?.id,\r\n code: args.code ? InstanceKeyLRUCache.makeCodeKey(args.code) : undefined,\r\n federationGuid: args.federationGuid,\r\n };\r\n\r\n if (!cacheArgs.id && !cacheArgs.code && !cacheArgs.federationGuid)\r\n return undefined;\r\n\r\n return cacheArgs;\r\n }\r\n private static combineCachedArgs(originalArgs: CachedArgs, newArgs: CachedArgs): CachedArgs {\r\n if (!originalArgs.id && !originalArgs.code && !originalArgs.federationGuid && !newArgs.id && !newArgs.code && !newArgs.federationGuid)\r\n ITwinError.throwError<ITwinError>({ message: \"ResolveInstanceKeyArgs must have a partialKey, code, or federationGuid\", iTwinErrorId: { scope: \"imodel-cache\", key: \"invalid-arguments\" } });\r\n\r\n return {\r\n id: newArgs.id ? newArgs.id : originalArgs.id,\r\n code: newArgs.code ? newArgs.code : originalArgs.code,\r\n federationGuid: newArgs.federationGuid ? newArgs.federationGuid : originalArgs.federationGuid,\r\n };\r\n }\r\n private static makeCodeKey(code: CodeProps): string | undefined {\r\n if (Code.isEmpty(code))\r\n return undefined;\r\n\r\n const keys = [code.scope, code.spec];\r\n if (code.value !== undefined) {\r\n keys.push(code.value);\r\n }\r\n return JSON.stringify(keys);\r\n }\r\n public clear(): void {\r\n this._argsToResultCache.clear();\r\n this._resultToArgsCache.clear();\r\n }\r\n public get size(): number {\r\n return this._resultToArgsCache.size;\r\n }\r\n public get [Symbol.toStringTag](): string {\r\n return `InstanceKeyCache(size=${this.size}, capacity=${this.capacity})`;\r\n }\r\n};"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FontFileImpl.js","sourceRoot":"","sources":["../../../src/internal/FontFileImpl.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport * as fs from \"fs\";\nimport { FontFace, FontType, LocalFileName } from \"@itwin/core-common\";\nimport type { IModelJsNative } from \"@bentley/imodeljs-native\";\nimport { CreateFontFileFromRscBlobArgs, CreateFontFileFromShxBlobArgs, FontFile } from \"../FontFile\";\nimport { _faceProps, _getData, _implementationProhibited, _key } from \"./Symbols\";\nimport { compareNumbersOrUndefined } from \"@itwin/core-bentley\";\nimport { IModelNative } from \"./NativePlatform\"; \nimport { IModelDb } from \"../IModelDb\";\n\nabstract class FontFileImpl implements FontFile {\n public readonly [_implementationProhibited] = undefined;\n\n public readonly faces: ReadonlyArray<Readonly<FontFace>>;\n public abstract get type(): FontType;\n public get isEmbeddable(): boolean { return true; }\n\n public readonly [_key]: string;\n public readonly [_faceProps]: IModelJsNative.FontFaceProps[];\n\n protected constructor(faces: IModelJsNative.FontFaceProps[]) {\n this.faces = faces.map((face) => {\n return {\n familyName: face.familyName,\n isBold: face.faceName.startsWith(\"bold\"),\n isItalic: face.faceName.endsWith(\"italic\"),\n };\n });\n\n this[_faceProps] = faces;\n\n // Sort the face props in canonical order so we can compare FontFiles for equivalent contents.\n this[_faceProps].sort((a, b) =>\n a.familyName.localeCompare(b.familyName) || a.faceName.localeCompare(b.faceName) || compareNumbersOrUndefined(a.subId, b.subId)\n );\n\n // Stringify the face props so that the key properties (and no other properties) appear in a canonical order. for trivial comparisons.\n this[_key] = JSON.stringify(this[_faceProps], [\"familyName\", \"faceName\", \"type\", \"subId\"]);\n }\n\n public abstract [_getData](): Uint8Array;\n}\n\n/** Points to an OpenType font file on disk. */\nclass TrueTypeFontFile extends FontFileImpl {\n readonly #fileName: LocalFileName;\n readonly #embeddable: boolean;\n \n public constructor(fileName: LocalFileName, embeddable: boolean, faces: IModelJsNative.FontFaceProps[]) {\n super(faces);\n this.#fileName = fileName;\n this.#embeddable = embeddable;\n }\n\n public override get type(): FontType { return FontType.TrueType; }\n public override get isEmbeddable(): boolean { return this.#embeddable; }\n\n public override [_getData](): Uint8Array {\n return fs.readFileSync(this.#fileName);\n }\n}\n\n/** Holds the binary representation of a SHX or RSC font in memory. */\nexport class CadFontFile extends FontFileImpl {\n readonly #data: Uint8Array;\n readonly #type: FontType.Shx | FontType.Rsc;\n\n public constructor(data: Uint8Array, type: FontType.Shx | FontType.Rsc, faces: IModelJsNative.FontFaceProps[]) {\n super(faces);\n this.#data = data;\n this.#type = type;\n }\n\n public override get type(): FontType { return this.#type; }\n\n public override [_getData](): Uint8Array { return this.#data; }\n}\n\n/** Points to a font file in any format embedded in an iModel. */\nexport class EmbeddedFontFile extends FontFileImpl {\n // The value of the Id column for the row in the be_Prop table that embeds this font's data.\n readonly #db: IModelDb;\n readonly #id: number;\n readonly #type: FontType;\n\n public constructor(db: IModelDb, id: number, type: FontType, faces: IModelJsNative.FontFaceProps[]) {\n super(faces);\n this.#db = db;\n this.#id = id;\n this.#type = type;\n }\n\n public override get type(): FontType { return this.#type; }\n\n public override [_getData](): Uint8Array {\n const data = this.#db.queryFilePropertyBlob({\n namespace: \"dgn_Font\",\n name: \"EmbeddedFaceData\",\n id: this.#id,\n });\n\n if (!data) {\n throw new Error(\"Embedded font not found\");\n }\n\n return data;\n }\n}\n\nexport function shxFontFileFromBlob(args: CreateFontFileFromShxBlobArgs): FontFile {\n if (args.familyName.length === 0) {\n throw new Error(\"Font family name cannot be empty\");\n }\n\n// An SHX file with fewer than 40 bytes isn't valid.\n const minShxSize = 40;\n\n const shxHeaders = [\n \"AutoCAD-86 unifont 1.0\",\n \"AutoCAD-86 shapes 1.0\",\n \"AutoCAD-86 shapes 1.1\",\n ].map((shxHeader) => Array.from(shxHeader))\n .map((chars) => new Uint8Array(chars.map((ch) => ch.charCodeAt(0))));\n\n // See https://github.com/iTwin/imodel-native/blob/91f509c2175dc49ce1efcf5a906c9a9aa193451d/iModelCore/iModelPlatform/DgnCore/ShxFont.cpp#L44\n function validateShx(blob: Uint8Array): void {\n if (blob.length >= minShxSize) {\n for (const header of shxHeaders) {\n if (header.every((char, index) => char === blob[index])) {\n return;\n }\n }\n }\n\n throw new Error(\"Failed to read font file\");\n }\n\n validateShx(args.blob);\n\n return new CadFontFile(args.blob, FontType.Shx, [{\n faceName: \"regular\",\n familyName: args.familyName,\n type: FontType.Shx,\n }]);\n}\n\nexport function rscFontFileFromBlob(args: CreateFontFileFromRscBlobArgs): FontFile {\n if (args.familyName.length === 0) {\n throw new Error(\"Font family name cannot be empty\");\n }\n\n if (!IModelNative.platform.isRscFontData(args.blob)) {\n throw new Error(\"Failed to read font file\");\n }\n\n return new CadFontFile(args.blob, FontType.Rsc, [{\n faceName: \"regular\",\n familyName: args.familyName,\n type: FontType.Rsc,\n encoding: args.encoding,\n }]);\n}\n\nexport function trueTypeFontFileFromFileName(fileName: LocalFileName): FontFile {\n const metadata = IModelNative.platform.getTrueTypeFontMetadata(fileName);\n if (metadata.faces.length === 0) {\n // The input was almost certainly not a TrueType font file.\n throw new Error(\"Failed to read font file\");\n }\n\n return new TrueTypeFontFile(fileName, metadata.embeddable, metadata.faces);\n}\n\n"]}
|
|
1
|
+
{"version":3,"file":"FontFileImpl.js","sourceRoot":"","sources":["../../../src/internal/FontFileImpl.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport * as fs from \"fs\";\r\nimport { FontFace, FontType, LocalFileName } from \"@itwin/core-common\";\r\nimport type { IModelJsNative } from \"@bentley/imodeljs-native\";\r\nimport { CreateFontFileFromRscBlobArgs, CreateFontFileFromShxBlobArgs, FontFile } from \"../FontFile\";\r\nimport { _faceProps, _getData, _implementationProhibited, _key } from \"./Symbols\";\r\nimport { compareNumbersOrUndefined } from \"@itwin/core-bentley\";\r\nimport { IModelNative } from \"./NativePlatform\"; \r\nimport { IModelDb } from \"../IModelDb\";\r\n\r\nabstract class FontFileImpl implements FontFile {\r\n public readonly [_implementationProhibited] = undefined;\r\n\r\n public readonly faces: ReadonlyArray<Readonly<FontFace>>;\r\n public abstract get type(): FontType;\r\n public get isEmbeddable(): boolean { return true; }\r\n\r\n public readonly [_key]: string;\r\n public readonly [_faceProps]: IModelJsNative.FontFaceProps[];\r\n\r\n protected constructor(faces: IModelJsNative.FontFaceProps[]) {\r\n this.faces = faces.map((face) => {\r\n return {\r\n familyName: face.familyName,\r\n isBold: face.faceName.startsWith(\"bold\"),\r\n isItalic: face.faceName.endsWith(\"italic\"),\r\n };\r\n });\r\n\r\n this[_faceProps] = faces;\r\n\r\n // Sort the face props in canonical order so we can compare FontFiles for equivalent contents.\r\n this[_faceProps].sort((a, b) =>\r\n a.familyName.localeCompare(b.familyName) || a.faceName.localeCompare(b.faceName) || compareNumbersOrUndefined(a.subId, b.subId)\r\n );\r\n\r\n // Stringify the face props so that the key properties (and no other properties) appear in a canonical order. for trivial comparisons.\r\n this[_key] = JSON.stringify(this[_faceProps], [\"familyName\", \"faceName\", \"type\", \"subId\"]);\r\n }\r\n\r\n public abstract [_getData](): Uint8Array;\r\n}\r\n\r\n/** Points to an OpenType font file on disk. */\r\nclass TrueTypeFontFile extends FontFileImpl {\r\n readonly #fileName: LocalFileName;\r\n readonly #embeddable: boolean;\r\n \r\n public constructor(fileName: LocalFileName, embeddable: boolean, faces: IModelJsNative.FontFaceProps[]) {\r\n super(faces);\r\n this.#fileName = fileName;\r\n this.#embeddable = embeddable;\r\n }\r\n\r\n public override get type(): FontType { return FontType.TrueType; }\r\n public override get isEmbeddable(): boolean { return this.#embeddable; }\r\n\r\n public override [_getData](): Uint8Array {\r\n return fs.readFileSync(this.#fileName);\r\n }\r\n}\r\n\r\n/** Holds the binary representation of a SHX or RSC font in memory. */\r\nexport class CadFontFile extends FontFileImpl {\r\n readonly #data: Uint8Array;\r\n readonly #type: FontType.Shx | FontType.Rsc;\r\n\r\n public constructor(data: Uint8Array, type: FontType.Shx | FontType.Rsc, faces: IModelJsNative.FontFaceProps[]) {\r\n super(faces);\r\n this.#data = data;\r\n this.#type = type;\r\n }\r\n\r\n public override get type(): FontType { return this.#type; }\r\n\r\n public override [_getData](): Uint8Array { return this.#data; }\r\n}\r\n\r\n/** Points to a font file in any format embedded in an iModel. */\r\nexport class EmbeddedFontFile extends FontFileImpl {\r\n // The value of the Id column for the row in the be_Prop table that embeds this font's data.\r\n readonly #db: IModelDb;\r\n readonly #id: number;\r\n readonly #type: FontType;\r\n\r\n public constructor(db: IModelDb, id: number, type: FontType, faces: IModelJsNative.FontFaceProps[]) {\r\n super(faces);\r\n this.#db = db;\r\n this.#id = id;\r\n this.#type = type;\r\n }\r\n\r\n public override get type(): FontType { return this.#type; }\r\n\r\n public override [_getData](): Uint8Array {\r\n const data = this.#db.queryFilePropertyBlob({\r\n namespace: \"dgn_Font\",\r\n name: \"EmbeddedFaceData\",\r\n id: this.#id,\r\n });\r\n\r\n if (!data) {\r\n throw new Error(\"Embedded font not found\");\r\n }\r\n\r\n return data;\r\n }\r\n}\r\n\r\nexport function shxFontFileFromBlob(args: CreateFontFileFromShxBlobArgs): FontFile {\r\n if (args.familyName.length === 0) {\r\n throw new Error(\"Font family name cannot be empty\");\r\n }\r\n\r\n// An SHX file with fewer than 40 bytes isn't valid.\r\n const minShxSize = 40;\r\n\r\n const shxHeaders = [\r\n \"AutoCAD-86 unifont 1.0\",\r\n \"AutoCAD-86 shapes 1.0\",\r\n \"AutoCAD-86 shapes 1.1\",\r\n ].map((shxHeader) => Array.from(shxHeader))\r\n .map((chars) => new Uint8Array(chars.map((ch) => ch.charCodeAt(0))));\r\n\r\n // See https://github.com/iTwin/imodel-native/blob/91f509c2175dc49ce1efcf5a906c9a9aa193451d/iModelCore/iModelPlatform/DgnCore/ShxFont.cpp#L44\r\n function validateShx(blob: Uint8Array): void {\r\n if (blob.length >= minShxSize) {\r\n for (const header of shxHeaders) {\r\n if (header.every((char, index) => char === blob[index])) {\r\n return;\r\n }\r\n }\r\n }\r\n\r\n throw new Error(\"Failed to read font file\");\r\n }\r\n\r\n validateShx(args.blob);\r\n\r\n return new CadFontFile(args.blob, FontType.Shx, [{\r\n faceName: \"regular\",\r\n familyName: args.familyName,\r\n type: FontType.Shx,\r\n }]);\r\n}\r\n\r\nexport function rscFontFileFromBlob(args: CreateFontFileFromRscBlobArgs): FontFile {\r\n if (args.familyName.length === 0) {\r\n throw new Error(\"Font family name cannot be empty\");\r\n }\r\n\r\n if (!IModelNative.platform.isRscFontData(args.blob)) {\r\n throw new Error(\"Failed to read font file\");\r\n }\r\n\r\n return new CadFontFile(args.blob, FontType.Rsc, [{\r\n faceName: \"regular\",\r\n familyName: args.familyName,\r\n type: FontType.Rsc,\r\n encoding: args.encoding,\r\n }]);\r\n}\r\n\r\nexport function trueTypeFontFileFromFileName(fileName: LocalFileName): FontFile {\r\n const metadata = IModelNative.platform.getTrueTypeFontMetadata(fileName);\r\n if (metadata.faces.length === 0) {\r\n // The input was almost certainly not a TrueType font file.\r\n throw new Error(\"Failed to read font file\");\r\n }\r\n\r\n return new TrueTypeFontFile(fileName, metadata.embeddable, metadata.faces);\r\n}\r\n\r\n"]}
|
|
@@ -35,11 +35,21 @@ import { LocalHub } from "../LocalHub";
|
|
|
35
35
|
*
|
|
36
36
|
* @internal
|
|
37
37
|
*/
|
|
38
|
+
/** Options for [[HubMock.startup]]. @internal */
|
|
39
|
+
export interface HubMockStartupOptions {
|
|
40
|
+
/**
|
|
41
|
+
* When `true`, every successful [[HubMock.pushChangeset]] call automatically uploads a V1 checkpoint
|
|
42
|
+
* (the current briefcase `.bim` file) for the tip changeset index into [[LocalHub]].
|
|
43
|
+
* This lets tests download a tip checkpoint and reverse changesets from it.
|
|
44
|
+
*/
|
|
45
|
+
createTipCheckpointOnPush?: boolean;
|
|
46
|
+
}
|
|
38
47
|
export declare class HubMock {
|
|
39
48
|
private static mockRoot;
|
|
40
49
|
private static hubs;
|
|
41
50
|
private static _saveHubAccess;
|
|
42
51
|
private static _iTwinId;
|
|
52
|
+
private static _createTipCheckpointOnPush;
|
|
43
53
|
/** Determine whether a test us currently being run under HubMock */
|
|
44
54
|
static get isValid(): boolean;
|
|
45
55
|
static get iTwinId(): string;
|
|
@@ -48,7 +58,7 @@ export declare class HubMock {
|
|
|
48
58
|
* @param mockName a unique name (e.g. "MyTest") for this HubMock to disambiguate tests when more than one is simultaneously active.
|
|
49
59
|
* It is used to create a private directory used by the HubMock for a test. That directory is removed when [[shutdown]] is called.
|
|
50
60
|
*/
|
|
51
|
-
static startup(mockName: LocalDirName, outputDir: string): void;
|
|
61
|
+
static startup(mockName: LocalDirName, outputDir: string, options?: HubMockStartupOptions): void;
|
|
52
62
|
/** Stop a HubMock that was previously started with [[startup]]
|
|
53
63
|
* @note this function throws an exception if any of the iModels used during the tests are left open.
|
|
54
64
|
*/
|
|
@@ -81,6 +91,19 @@ export declare class HubMock {
|
|
|
81
91
|
static pushChangeset(arg: IModelIdArg & {
|
|
82
92
|
changesetProps: ChangesetFileProps;
|
|
83
93
|
}): Promise<ChangesetIndex>;
|
|
94
|
+
/**
|
|
95
|
+
* Build and upload a V1 checkpoint at the current tip changeset of the given iModel.
|
|
96
|
+
*
|
|
97
|
+
* The checkpoint is constructed by copying the nearest prior checkpoint from [[LocalHub]] as a
|
|
98
|
+
* starting base, then applying all subsequent changesets forward to the latest index via
|
|
99
|
+
* [[BriefcaseManager.pullAndApplyChangesets]]. The result is registered in [[LocalHub]] so that
|
|
100
|
+
* [[V2CheckpointManager]] (mock path) can serve it to consumers.
|
|
101
|
+
*
|
|
102
|
+
* When [[HubMockStartupOptions.createTipCheckpointOnPush]] is `true` this is called automatically
|
|
103
|
+
* after every successful [[pushChangeset]]. Tests can also call it explicitly to create a single
|
|
104
|
+
* checkpoint at the tip after all changesets have been pushed.
|
|
105
|
+
*/
|
|
106
|
+
static createTipCheckpoint(iModelId: GuidString): Promise<void>;
|
|
84
107
|
static queryV2Checkpoint(arg: CheckpointProps): Promise<V2CheckpointAccessProps | undefined>;
|
|
85
108
|
static releaseAllLocks(arg: BriefcaseDbArg): Promise<void>;
|
|
86
109
|
static abandonAllLocks(arg: BriefcaseIdArg): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HubMock.d.ts","sourceRoot":"","sources":["../../../src/internal/HubMock.ts"],"names":[],"mappings":"AAMA,OAAO,EAAQ,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EACL,kBAAkB,EAAE,cAAc,EAAsB,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EACpH,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,wBAAwB,EACN,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,WAAW,EAAE,aAAa,EACjK,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAC5C,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,eAAe,EAA0F,MAAM,sBAAsB,CAAC;AAG/I,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"HubMock.d.ts","sourceRoot":"","sources":["../../../src/internal/HubMock.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,63 +11,43 @@ const CheckpointManager_1 = require("../CheckpointManager");
|
|
|
11
11
|
const IModelHost_1 = require("../IModelHost");
|
|
12
12
|
const IModelJsFs_1 = require("../IModelJsFs");
|
|
13
13
|
const LocalHub_1 = require("../LocalHub");
|
|
14
|
+
const IModelDb_1 = require("../IModelDb");
|
|
14
15
|
const Symbols_1 = require("./Symbols");
|
|
15
16
|
const BriefcaseManager_1 = require("../BriefcaseManager");
|
|
16
|
-
const path = require("path");
|
|
17
17
|
function wasStarted(val) {
|
|
18
18
|
if (undefined === val)
|
|
19
19
|
throw new Error("Call HubMock.startup first");
|
|
20
20
|
}
|
|
21
|
-
|
|
21
|
+
// Used by mockAttach: copies the nearest *prior* checkpoint (never newer) so the
|
|
22
|
+
// returned file is already at or before the requested version.
|
|
23
|
+
function doDownloadPrior(args) {
|
|
22
24
|
HubMock.findLocalHub(args.iModelId).downloadCheckpoint(args);
|
|
23
25
|
}
|
|
26
|
+
// Used by mockDownload: copies the *nearest* checkpoint (forward or backward).
|
|
27
|
+
// When the nearest is newer than the requested version, CheckpointManager.updateToRequestedVersion
|
|
28
|
+
// will reverse it to the requested version via BriefcaseManager.pullAndApplyChangesets.
|
|
29
|
+
function doDownloadNearest(args) {
|
|
30
|
+
const hub = HubMock.findLocalHub(args.iModelId);
|
|
31
|
+
const requestedIndex = hub.getIndexFromChangeset(args.changeset);
|
|
32
|
+
const nearest = hub.queryNearestCheckpoint(requestedIndex);
|
|
33
|
+
IModelJsFs_1.IModelJsFs.copySync((0, path_1.join)(hub.checkpointDir, hub.checkpointNameFromIndex(nearest)), args.targetFile);
|
|
34
|
+
}
|
|
24
35
|
const mockCheckpoint = {
|
|
25
36
|
mockAttach: (checkpoint) => {
|
|
26
|
-
const targetFile =
|
|
27
|
-
|
|
37
|
+
const targetFile = (0, path_1.join)(BriefcaseManager_1.BriefcaseManager.getBriefcaseBasePath(checkpoint.iModelId), `${checkpoint.changeset.index}.bim`);
|
|
38
|
+
doDownloadPrior({ ...checkpoint, targetFile });
|
|
28
39
|
return targetFile;
|
|
29
40
|
},
|
|
30
41
|
mockDownload: (request) => {
|
|
31
|
-
|
|
42
|
+
doDownloadNearest({ ...request.checkpoint, targetFile: request.localFile });
|
|
32
43
|
}
|
|
33
44
|
};
|
|
34
|
-
/**
|
|
35
|
-
* Mocks iModelHub for testing creating Briefcases, downloading checkpoints, and simulating multiple users pushing and pulling changesets, etc.
|
|
36
|
-
*
|
|
37
|
-
* Generally, tests for apis that *create or modify* iModels can and should be mocked. Otherwise they:
|
|
38
|
-
* - create tremendous load on the test servers when they run on programmer's desktops and in CI jobs
|
|
39
|
-
* - waste network and data center resources (i.e. $$$s),
|
|
40
|
-
* - interfere with other tests running on the same or other systems, and
|
|
41
|
-
* - (far worse) are the source of test flakiness outside of the api being tested.
|
|
42
|
-
*
|
|
43
|
-
* This class can be used to create tests that do not require authentication, are synchronous,
|
|
44
|
-
* are guaranteed to be self-contained (i.e. do not interfere with other tests running at the same time or later), and do not fail for reasons outside
|
|
45
|
-
* of the control of the test itself. As a bonus, in addition to making tests more reliable, mocking IModelHub generally makes tests run *much* faster.
|
|
46
|
-
*
|
|
47
|
-
* On the other hand, tests that expect to find an existing iModels, checkpoints, changesets, etc. in IModelHub cannot be mocked. In that case, those tests
|
|
48
|
-
* should be careful to NOT modify the data, since doing so causes interference with other tests running simultaneously. These tests should be limited to
|
|
49
|
-
* low level testing of the core apis only.
|
|
50
|
-
*
|
|
51
|
-
* To initialize HubMock, call [[startup]] at the beginning of your test, usually in `describe.before`. Thereafter, all access to iModelHub for an iModel will be
|
|
52
|
-
* directed to a [[LocalHub]] - your test code does not change. After the test(s) complete, call [[shutdown]] (usually in `describe.after`) to stop mocking IModelHub and clean
|
|
53
|
-
* up any resources used by the test(s). If you want to mock a single test, call [[startup]] as the first line and [[shutdown]] as the last. If you wish to run the
|
|
54
|
-
* test against a "real" IModelHub, you can simply comment off the call [[startup]], though in that case you should make sure the name of your
|
|
55
|
-
* iModel is unique so your test won't collide with other tests (iModel name uniqueness is not necessary for mocked tests.)
|
|
56
|
-
*
|
|
57
|
-
* Mocked tests must always start by creating a new iModel via [[IModelHost[_hubAccess].createNewIModel]] with a `version0` iModel.
|
|
58
|
-
* They use mock (aka "bogus") credentials for `AccessTokens`, which is fine since [[HubMock]] never accesses resources outside the current
|
|
59
|
-
* computer.
|
|
60
|
-
*
|
|
61
|
-
* @note Only one HubMock at a time, *running in a single process*, may be active. The comments above about multiple simultaneous tests refer to tests
|
|
62
|
-
* running on different computers, or on a single computer in multiple processes. All of those scenarios are problematic without mocking.
|
|
63
|
-
*
|
|
64
|
-
* @internal
|
|
65
|
-
*/
|
|
66
45
|
class HubMock {
|
|
67
46
|
static mockRoot;
|
|
68
47
|
static hubs = new Map();
|
|
69
48
|
static _saveHubAccess;
|
|
70
49
|
static _iTwinId;
|
|
50
|
+
static _createTipCheckpointOnPush = false;
|
|
71
51
|
/** Determine whether a test us currently being run under HubMock */
|
|
72
52
|
static get isValid() { return undefined !== this.mockRoot; }
|
|
73
53
|
static get iTwinId() {
|
|
@@ -79,7 +59,7 @@ class HubMock {
|
|
|
79
59
|
* @param mockName a unique name (e.g. "MyTest") for this HubMock to disambiguate tests when more than one is simultaneously active.
|
|
80
60
|
* It is used to create a private directory used by the HubMock for a test. That directory is removed when [[shutdown]] is called.
|
|
81
61
|
*/
|
|
82
|
-
static startup(mockName, outputDir) {
|
|
62
|
+
static startup(mockName, outputDir, options) {
|
|
83
63
|
if (this.isValid)
|
|
84
64
|
throw new Error("Either a previous test did not call HubMock.shutdown() properly, or more than one test is simultaneously attempting to use HubMock, which is not allowed");
|
|
85
65
|
this.hubs.clear();
|
|
@@ -89,6 +69,7 @@ class HubMock {
|
|
|
89
69
|
this._saveHubAccess = IModelHost_1.IModelHost[Symbols_1._getHubAccess]();
|
|
90
70
|
IModelHost_1.IModelHost[Symbols_1._setHubAccess](this);
|
|
91
71
|
HubMock._iTwinId = core_bentley_1.Guid.createValue(); // all iModels for this test get the same "iTwinId"
|
|
72
|
+
this._createTipCheckpointOnPush = options?.createTipCheckpointOnPush ?? false;
|
|
92
73
|
CheckpointManager_1.V2CheckpointManager[Symbols_1._mockCheckpoint] = mockCheckpoint;
|
|
93
74
|
}
|
|
94
75
|
/** Stop a HubMock that was previously started with [[startup]]
|
|
@@ -98,6 +79,7 @@ class HubMock {
|
|
|
98
79
|
if (this.mockRoot === undefined)
|
|
99
80
|
return;
|
|
100
81
|
CheckpointManager_1.V2CheckpointManager[Symbols_1._mockCheckpoint] = undefined;
|
|
82
|
+
this._createTipCheckpointOnPush = false;
|
|
101
83
|
HubMock._iTwinId = undefined;
|
|
102
84
|
for (const hub of this.hubs)
|
|
103
85
|
hub[1].cleanup();
|
|
@@ -188,7 +170,46 @@ class HubMock {
|
|
|
188
170
|
return this.findLocalHub(arg.iModelId).queryChangesets(arg.range);
|
|
189
171
|
}
|
|
190
172
|
static async pushChangeset(arg) {
|
|
191
|
-
|
|
173
|
+
const csIndex = this.findLocalHub(arg.iModelId).addChangeset(arg.changesetProps);
|
|
174
|
+
if (this._createTipCheckpointOnPush)
|
|
175
|
+
await this.createTipCheckpoint(arg.iModelId);
|
|
176
|
+
return csIndex;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Build and upload a V1 checkpoint at the current tip changeset of the given iModel.
|
|
180
|
+
*
|
|
181
|
+
* The checkpoint is constructed by copying the nearest prior checkpoint from [[LocalHub]] as a
|
|
182
|
+
* starting base, then applying all subsequent changesets forward to the latest index via
|
|
183
|
+
* [[BriefcaseManager.pullAndApplyChangesets]]. The result is registered in [[LocalHub]] so that
|
|
184
|
+
* [[V2CheckpointManager]] (mock path) can serve it to consumers.
|
|
185
|
+
*
|
|
186
|
+
* When [[HubMockStartupOptions.createTipCheckpointOnPush]] is `true` this is called automatically
|
|
187
|
+
* after every successful [[pushChangeset]]. Tests can also call it explicitly to create a single
|
|
188
|
+
* checkpoint at the tip after all changesets have been pushed.
|
|
189
|
+
*/
|
|
190
|
+
static async createTipCheckpoint(iModelId) {
|
|
191
|
+
const hub = this.findLocalHub(iModelId);
|
|
192
|
+
const csIndex = hub.latestChangesetIndex;
|
|
193
|
+
// Find the nearest checkpoint that precedes the new tip and use it as the base.
|
|
194
|
+
const prevIndex = hub.queryPreviousCheckpoint(csIndex);
|
|
195
|
+
const prevCheckpointFile = (0, path_1.join)(hub.checkpointDir, hub.checkpointNameFromIndex(prevIndex));
|
|
196
|
+
const tempFile = (0, path_1.join)(hub.rootDir, `checkpoint-building-${csIndex}.bim`);
|
|
197
|
+
IModelJsFs_1.IModelJsFs.copySync(prevCheckpointFile, tempFile);
|
|
198
|
+
try {
|
|
199
|
+
const db = IModelDb_1.SnapshotDb.openForApplyChangesets(tempFile);
|
|
200
|
+
try {
|
|
201
|
+
await BriefcaseManager_1.BriefcaseManager.pullAndApplyChangesets(db, { accessToken: "", toIndex: csIndex });
|
|
202
|
+
db[Symbols_1._nativeDb].saveChanges();
|
|
203
|
+
}
|
|
204
|
+
finally {
|
|
205
|
+
db.close();
|
|
206
|
+
}
|
|
207
|
+
hub.uploadCheckpoint({ changesetIndex: csIndex, localFile: tempFile });
|
|
208
|
+
}
|
|
209
|
+
finally {
|
|
210
|
+
if (IModelJsFs_1.IModelJsFs.existsSync(tempFile))
|
|
211
|
+
IModelJsFs_1.IModelJsFs.removeSync(tempFile);
|
|
212
|
+
}
|
|
192
213
|
}
|
|
193
214
|
static async queryV2Checkpoint(arg) {
|
|
194
215
|
return {
|