Skip to content

[WIP] - Aquire locks during onElement and onModel api's - #284

Draft
DanRod1999 wants to merge 140 commits into
mainfrom
dan/make-async-to-aquire-locks
Draft

[WIP] - Aquire locks during onElement and onModel api's#284
DanRod1999 wants to merge 140 commits into
mainfrom
dan/make-async-to-aquire-locks

Conversation

@DanRod1999

@DanRod1999 DanRod1999 commented Mar 6, 2026

Copy link
Copy Markdown
Contributor

Trying to resolve: #263

Make onElement...() and onModel...() apis async. Add transformer option to acquire locks when these functions are called. If the transformation fails abandon changes and release locks acquired during transformation process, but only do so if the option flag for acquiring locks is set.

aruniverse and others added 30 commits February 10, 2025 12:22
iTwin/itwinjs-core#7512 makes the internal APIs
`IModelDb.nativeDb` and `IModelHost.platform` inaccessible outside of
the core-backend package.

---------

Co-authored-by: nick.tessier <22119573+nick4598@users.noreply.github.com>
Co-authored-by: Daniel Rodriguez <DanRod1999@users.noreply.github.com>
Co-authored-by: Arun George <11051042+aruniverse@users.noreply.github.com>
Co-authored-by: Arun George <aruniverse@users.noreply.github.com>
@DanRod1999 DanRod1999 changed the title [WIP] - Make onElement and onModel api's async [WIP] - Aquire locks during onElement and onModel api's Apr 15, 2026
@DanRod1999
DanRod1999 requested a review from Copilot April 15, 2026 15:51

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 12 out of 13 changed files in this pull request and generated 4 comments.

Files not reviewed (1)
  • pnpm-lock.yaml: Language not supported

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread packages/transformer/src/IModelTransformer.ts Outdated
Comment thread packages/transformer/src/IModelTransformer.ts
Comment thread packages/transformer/src/IModelTransformer.ts
Comment thread packages/transformer/src/IModelImporter.ts
@mindaugasdirg

Copy link
Copy Markdown
Contributor

If option is enabled, we should also acquire schema lock in processSchemas() call too.

@DanRod1999

Copy link
Copy Markdown
Contributor Author

If option is enabled, we should also acquire schema lock in processSchemas() call too.

If the schema lock is needed that means we would be locking the entire imodel anyway right? Does that change anything? It slightly defeats the purpose of only locking what you need, but I guess in cases where they need to processSchema() there's no way to avoid it anyway

DanRod1999 and others added 7 commits April 21, 2026 15:04
Resolves [issue](#272)

## APIs Changed to Async

### IModelExporter
| Method | Before | After |
|--------|--------|-------|
| `shouldExportElement(element)` | `boolean` | `Promise<boolean>` |

### IModelExportHandler
| Method | Before | After |
|--------|--------|-------|
| `onDeleteElement(_elementId)` | `void` | `Promise<void>` |
| `onDeleteRelationship(_relInstanceId)` | `void` | `Promise<void>` |
| `onExportCodeSpec(_codeSpec, _isUpdate)` | `void` | `Promise<void>` |
| `onExportFont(_font, _isUpdate)` | `void` | `Promise<void>` |
| `onExportModel(_model, _isUpdate)` | `void` | `Promise<void>` |
| `onSkipElement(_elementId)` | `void` | `Promise<void>` |
| `shouldExportCodeSpec(_codeSpec)` | `boolean` | `Promise<boolean>` |
| `shouldExportElement(_element)` | `boolean` | `Promise<boolean>` |
| `shouldExportElementAspect(_aspect)` | `boolean` | `Promise<boolean>`
|
| `shouldExportRelationship(_relationship)` | `boolean` |
`Promise<boolean>` |
| `shouldExportSchema(_schemaKey)` | `boolean` | `Promise<boolean>` |

### IModelImporter
| Method | Before | After |
|--------|--------|-------|
| `deleteElement(elementId)` | `void` | `Promise<void>` |
| `deleteRelationship(relationshipProps)` | `void` | `Promise<void>` |
| `importElement(elementProps)` | `Id64String` | `Promise<Id64String>` |
| `importElementMultiAspects(...)` | `Id64String[]` |
`Promise<Id64String[]>` |
| `importElementUniqueAspect(aspectProps)` | `Id64String` |
`Promise<Id64String>` |
| `importModel(modelProps)` | `void` | `Promise<void>` |
| `importRelationship(relationshipProps)` | `Id64String` |
`Promise<Id64String>` |
| `onDeleteElement(elementId)` | `void` | `Promise<void>` |
| `onDeleteElementAspect(targetElementAspect)` | `void` |
`Promise<void>` |
| `onDeleteRelationship(relationshipProps)` | `void` | `Promise<void>` |
| `onInsertElement(elementProps)` | `Id64String` | `Promise<Id64String>`
|
| `onInsertElementAspect(aspectProps)` | `Id64String` |
`Promise<Id64String>` |
| `onInsertModel(modelProps)` | `Id64String` | `Promise<Id64String>` |
| `onInsertRelationship(relationshipProps)` | `Id64String` |
`Promise<Id64String>` |
| `onProgress()` | `void` | `Promise<void>` |
| `onUpdateElement(elementProps)` | `void` | `Promise<void>` |
| `onUpdateElementAspect(aspectProps)` | `void` | `Promise<void>` |
| `onUpdateModel(modelProps)` | `void` | `Promise<void>` |
| `onUpdateRelationship(relationshipProps)` | `void` | `Promise<void>` |

### IModelTransformer
| Method | Before | After |
|--------|--------|-------|
| `onDeleteElement(sourceElementId)` | `void` | `Promise<void>` |
| `onExportCodeSpec(sourceCodeSpec)` | `void` | `Promise<void>` |
| `onExportFont(font, _isUpdate)` | `void` | `Promise<void>` |
| `onExportModel(sourceModel)` | `void` | `Promise<void>` |
| `shouldDetectDeletes()` | `boolean` | `Promise<boolean>` |
| `shouldExportCodeSpec(_sourceCodeSpec)` | `boolean` |
`Promise<boolean>` |
| `shouldExportElement(_sourceElement)` | `boolean` | `Promise<boolean>`
|
| `shouldExportElementAspect(aspect)` | `boolean` | `Promise<boolean>` |
| `shouldExportRelationship(_sourceRelationship)` | `boolean` |
`Promise<boolean>` |
| `shouldExportSchema(schemaKey)` | `boolean` | `Promise<boolean>` |

---------

Co-authored-by: Daniel Rodriguez <DanRod1999@users.noreply.github.com>
Base automatically changed from itwinjs-v5 to main June 17, 2026 16:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Acquire locks when importing elements