1.0.0 Change Notes

Changes to SelectionSet events and HiliteSet

HilitedSet has been renamed to HiliteSet and marked alpha. It now supports hiliting models and subcategories in addition to elements. By default it continues to be synchronized with the SelectionSet, but this can be overridden (Grigas' presentation viewport component does so, enabling him to control the hilite set independently from the selection set).

SelectEventType enum has been renamed to SelectionSetEventType.

The argument to SelectionSet.onChanged has changed to SelectionSetEvent. You can switch on the type field to access the sets of added and/or removed Ids; or access the current contents directly via the set field.

SelectionSet methods accepting an optional sendEvent argument have been marked private - it is not appropriate for external callers to suppress event dispatch.

Refinements to snapshot iModel API

The IModelDb.createSnapshotFromSeed static method has been replaced by the IModelDb.createSnapshot instance method. The reason is to make sure that the program/user had permission to open the iModel before making the snapshot copy. A related change is that IModelDb.openSnapshot will no longer open briefcases. Either IModelDb.open should be called to open the iModel or IModelDb.createSnapshot should have been called to make the snapshot ahead of time.

Here is an example of how to adjust your source code:

  const seedDb: IModelDb = IModelDb.openSnapshot(seedFileName); // or IModelDb.open
  const snapshotDb: IModelDb = seedDb.createSnapshot(snapshotFileName);
  seedDb.closeSnapshot(); // or IModelDb.close
  return snapshotDb;

Changes to IModelDb.open API

Removed the following parameters to IModelDb.open to simplify the implementation:

  • OpenParams.pullOnly(): Use OpenParams.fixedVersion() or OpenParams.pullAndPush()
  • AccessMode: Using OpenParams.fixedVersion() always causes the briefcase to be shared, and using OpenParams.pullAndPush() always causes the briefcase to be exclusive.

Changes to OidcAgentClient

OidcAgentClient now follows the typical OIDC client credentials authorization workflow. This implies the caller need not supply "serviceUserEmail" and "serviceUserPassword" as part of the configuration. For example:

const agentConfiguration:  = {
      clientId: "some-client-id-obtained-through-registration",
      clientSecret: "some-client-secret-obtained-through-registration",
      scope: "context-registry-service imodelhub",

const agentClient = new OidcAgentClient(agentConfiguration);

Note that what was OidcAgentClientV2 has now become OidcAgentClient - i.e., the older OidcAgentClient has been entirely replaced.

Most importantly, it's required that agent applications re-register and obtain a new configuration - clientId and clientSecret - the older registrations will NOT work anymore.

Changes to tile features

Removed or modified some properties used to feature-gate various tile-related features.


  • Removed TileAdmin.requestTilesWithoutEdges. Tiles are now always requested without edges if edges are not required.
  • Removed TileAdmin.elideEmptyChildContentRequests. Such requests are now always elided.
  • TileAdmin.enableInstancing now defaults to true instead of false.
  • Previously, if TileAdmin.retryInterval was undefined, requests for tile content and tile tree JSON would not be memoized. Now, they are always memoized, and the interval defaults to 1000ms if not explicitly defined.
  • Previously, requests for tile content would by default use POST method and responses would not be cacheable. Now by default they use GET and responses are cacheable.


  • Removed IModelHostConfiguration.useTileContentThreadPool. The thread pool is now always used.

Changes to RPC type marshaling system

The iModel.js RPC system now permits only primitive values, "interface" objects that contain only data values, and binary data over the wire. Therefore, all RPC interface methods can only accept and return these types now.

It is no longer possible to send class instances, maps, sets, or objects with function members between the frontend and backend using the RPC system.

Binary data transfer is still supported via Uint8Array.

These new type restrictions are enforced via the require-basic-rpc-values tslint rule. With these new restrictions in place, the RPC system is now compatible with aggressive webpacking policies that mangle class names at build time.

Changes to ECSql Query API

This change breaks RPC interface IModelReadRpcInterface. Both frontend and backend developer must update there packages.


  • Renamed IModelDb.queryPage to IModelDb.queryRows. This method is also marked internal and user should not call it directly. Instead user should always use IModelDb.query. This method now also throw exception if query prepare fails.
  • Changed method signature for IModelDb.query. But first two parameters are same.



  • Renamed IModelConnection.queryPage to IModelConnection.queryRows. This method is also marked internal and user should not call it directly. Instead user should always use IModelConnection.query. This method now also throw exception if query prepare fails.
  • Changed method signature for IModelConnection.query. But first two parameters are same.

How can you update code

const rows = await imodel.queryPage("SELECT ECInstanceId FROM bis.Element LIMIT 1");

can be be changed to following.

const rows = [];
for await (const row of imodel.query("SELECT ECInstanceId FROM bis.Element LIMIT 1")) {

Last Updated: 12 February, 2024