@itwin/core-backend 3.5.0-dev.27 → 3.5.0-dev.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/lib/cjs/AliCloudStorageService.d.ts +23 -23
  2. package/lib/cjs/AliCloudStorageService.js +71 -71
  3. package/lib/cjs/AliCloudStorageService.js.map +1 -1
  4. package/lib/cjs/BackendHubAccess.d.ts +224 -224
  5. package/lib/cjs/BackendHubAccess.js +41 -41
  6. package/lib/cjs/BackendHubAccess.js.map +1 -1
  7. package/lib/cjs/BackendLoggerCategory.d.ts +91 -91
  8. package/lib/cjs/BackendLoggerCategory.js +99 -99
  9. package/lib/cjs/BackendLoggerCategory.js.map +1 -1
  10. package/lib/cjs/BisCoreSchema.d.ts +21 -21
  11. package/lib/cjs/BisCoreSchema.js +60 -60
  12. package/lib/cjs/BisCoreSchema.js.map +1 -1
  13. package/lib/cjs/BriefcaseManager.d.ts +170 -165
  14. package/lib/cjs/BriefcaseManager.d.ts.map +1 -1
  15. package/lib/cjs/BriefcaseManager.js +413 -405
  16. package/lib/cjs/BriefcaseManager.js.map +1 -1
  17. package/lib/cjs/Category.d.ts +153 -153
  18. package/lib/cjs/Category.js +243 -243
  19. package/lib/cjs/Category.js.map +1 -1
  20. package/lib/cjs/ChangeSummaryManager.d.ts +187 -187
  21. package/lib/cjs/ChangeSummaryManager.js +445 -445
  22. package/lib/cjs/ChangeSummaryManager.js.map +1 -1
  23. package/lib/cjs/ChangedElementsDb.d.ts +99 -99
  24. package/lib/cjs/ChangedElementsDb.js +165 -165
  25. package/lib/cjs/ChangedElementsDb.js.map +1 -1
  26. package/lib/cjs/ChangedElementsManager.d.ts +39 -39
  27. package/lib/cjs/ChangedElementsManager.js +88 -88
  28. package/lib/cjs/ChangedElementsManager.js.map +1 -1
  29. package/lib/cjs/CheckpointManager.d.ts +120 -120
  30. package/lib/cjs/CheckpointManager.js +343 -343
  31. package/lib/cjs/CheckpointManager.js.map +1 -1
  32. package/lib/cjs/ClassRegistry.d.ts +72 -72
  33. package/lib/cjs/ClassRegistry.js +243 -243
  34. package/lib/cjs/ClassRegistry.js.map +1 -1
  35. package/lib/cjs/CloudSqlite.d.ts +350 -350
  36. package/lib/cjs/CloudSqlite.js +152 -152
  37. package/lib/cjs/CloudSqlite.js.map +1 -1
  38. package/lib/cjs/CloudStorageBackend.d.ts +58 -58
  39. package/lib/cjs/CloudStorageBackend.js +173 -173
  40. package/lib/cjs/CloudStorageBackend.js.map +1 -1
  41. package/lib/cjs/CodeService.d.ts +396 -396
  42. package/lib/cjs/CodeService.js +63 -63
  43. package/lib/cjs/CodeService.js.map +1 -1
  44. package/lib/cjs/CodeSpecs.d.ts +50 -50
  45. package/lib/cjs/CodeSpecs.js +112 -112
  46. package/lib/cjs/CodeSpecs.js.map +1 -1
  47. package/lib/cjs/ConcurrentQuery.d.ts +11 -11
  48. package/lib/cjs/ConcurrentQuery.js +30 -30
  49. package/lib/cjs/ConcurrentQuery.js.map +1 -1
  50. package/lib/cjs/CustomViewState3dCreator.d.ts +21 -21
  51. package/lib/cjs/CustomViewState3dCreator.js +81 -81
  52. package/lib/cjs/CustomViewState3dCreator.js.map +1 -1
  53. package/lib/cjs/DevTools.d.ts +71 -71
  54. package/lib/cjs/DevTools.js +154 -154
  55. package/lib/cjs/DevTools.js.map +1 -1
  56. package/lib/cjs/DisplayStyle.d.ts +106 -106
  57. package/lib/cjs/DisplayStyle.js +256 -256
  58. package/lib/cjs/DisplayStyle.js.map +1 -1
  59. package/lib/cjs/ECDb.d.ts +191 -191
  60. package/lib/cjs/ECDb.js +350 -350
  61. package/lib/cjs/ECDb.js.map +1 -1
  62. package/lib/cjs/ECSchemaXmlContext.d.ts +18 -18
  63. package/lib/cjs/ECSchemaXmlContext.js +41 -41
  64. package/lib/cjs/ECSchemaXmlContext.js.map +1 -1
  65. package/lib/cjs/ECSqlStatement.d.ts +466 -466
  66. package/lib/cjs/ECSqlStatement.js +791 -791
  67. package/lib/cjs/ECSqlStatement.js.map +1 -1
  68. package/lib/cjs/Element.d.ts +1102 -1102
  69. package/lib/cjs/Element.js +1416 -1416
  70. package/lib/cjs/Element.js.map +1 -1
  71. package/lib/cjs/ElementAspect.d.ts +158 -158
  72. package/lib/cjs/ElementAspect.js +186 -186
  73. package/lib/cjs/ElementAspect.js.map +1 -1
  74. package/lib/cjs/ElementGraphics.d.ts +9 -9
  75. package/lib/cjs/ElementGraphics.js +41 -41
  76. package/lib/cjs/ElementGraphics.js.map +1 -1
  77. package/lib/cjs/ElementTreeWalker.d.ts +162 -162
  78. package/lib/cjs/ElementTreeWalker.js +409 -409
  79. package/lib/cjs/ElementTreeWalker.js.map +1 -1
  80. package/lib/cjs/Entity.d.ts +106 -106
  81. package/lib/cjs/Entity.js +134 -134
  82. package/lib/cjs/Entity.js.map +1 -1
  83. package/lib/cjs/EntityReferences.d.ts +49 -49
  84. package/lib/cjs/EntityReferences.js +95 -95
  85. package/lib/cjs/EntityReferences.js.map +1 -1
  86. package/lib/cjs/ExportGraphics.d.ts +317 -317
  87. package/lib/cjs/ExportGraphics.js +208 -208
  88. package/lib/cjs/ExportGraphics.js.map +1 -1
  89. package/lib/cjs/ExternalSource.d.ts +96 -96
  90. package/lib/cjs/ExternalSource.js +131 -131
  91. package/lib/cjs/ExternalSource.js.map +1 -1
  92. package/lib/cjs/GeoCoordConfig.d.ts +19 -19
  93. package/lib/cjs/GeoCoordConfig.js +82 -82
  94. package/lib/cjs/GeoCoordConfig.js.map +1 -1
  95. package/lib/cjs/GeometrySummary.d.ts +4 -4
  96. package/lib/cjs/GeometrySummary.js +380 -380
  97. package/lib/cjs/GeometrySummary.js.map +1 -1
  98. package/lib/cjs/HubMock.d.ts +94 -93
  99. package/lib/cjs/HubMock.d.ts.map +1 -1
  100. package/lib/cjs/HubMock.js +222 -190
  101. package/lib/cjs/HubMock.js.map +1 -1
  102. package/lib/cjs/IModelCloneContext.d.ts +8 -8
  103. package/lib/cjs/IModelCloneContext.js +15 -15
  104. package/lib/cjs/IModelCloneContext.js.map +1 -1
  105. package/lib/cjs/IModelDb.d.ts +1183 -1183
  106. package/lib/cjs/IModelDb.js +2374 -2374
  107. package/lib/cjs/IModelDb.js.map +1 -1
  108. package/lib/cjs/IModelElementCloneContext.d.ts +89 -89
  109. package/lib/cjs/IModelElementCloneContext.js +159 -159
  110. package/lib/cjs/IModelElementCloneContext.js.map +1 -1
  111. package/lib/cjs/IModelHost.d.ts +369 -369
  112. package/lib/cjs/IModelHost.js +492 -492
  113. package/lib/cjs/IModelHost.js.map +1 -1
  114. package/lib/cjs/IModelJsFs.d.ts +62 -62
  115. package/lib/cjs/IModelJsFs.js +140 -140
  116. package/lib/cjs/IModelJsFs.js.map +1 -1
  117. package/lib/cjs/IpcHost.d.ts +104 -98
  118. package/lib/cjs/IpcHost.d.ts.map +1 -1
  119. package/lib/cjs/IpcHost.js +278 -234
  120. package/lib/cjs/IpcHost.js.map +1 -1
  121. package/lib/cjs/LineStyle.d.ts +311 -311
  122. package/lib/cjs/LineStyle.js +295 -295
  123. package/lib/cjs/LineStyle.js.map +1 -1
  124. package/lib/cjs/LocalHub.d.ts +162 -162
  125. package/lib/cjs/LocalHub.js +587 -587
  126. package/lib/cjs/LocalHub.js.map +1 -1
  127. package/lib/cjs/LocalhostIpcHost.d.ts +20 -20
  128. package/lib/cjs/LocalhostIpcHost.js +81 -81
  129. package/lib/cjs/LocalhostIpcHost.js.map +1 -1
  130. package/lib/cjs/Material.d.ts +103 -103
  131. package/lib/cjs/Material.js +147 -147
  132. package/lib/cjs/Material.js.map +1 -1
  133. package/lib/cjs/Model.d.ts +392 -392
  134. package/lib/cjs/Model.js +485 -485
  135. package/lib/cjs/Model.js.map +1 -1
  136. package/lib/cjs/NativeAppStorage.d.ts +51 -51
  137. package/lib/cjs/NativeAppStorage.js +202 -202
  138. package/lib/cjs/NativeAppStorage.js.map +1 -1
  139. package/lib/cjs/NativeHost.d.ts +52 -52
  140. package/lib/cjs/NativeHost.d.ts.map +1 -1
  141. package/lib/cjs/NativeHost.js +163 -168
  142. package/lib/cjs/NativeHost.js.map +1 -1
  143. package/lib/cjs/NavigationRelationship.d.ts +156 -156
  144. package/lib/cjs/NavigationRelationship.js +225 -225
  145. package/lib/cjs/NavigationRelationship.js.map +1 -1
  146. package/lib/cjs/PromiseMemoizer.d.ts +51 -51
  147. package/lib/cjs/PromiseMemoizer.js +101 -101
  148. package/lib/cjs/PromiseMemoizer.js.map +1 -1
  149. package/lib/cjs/PropertyStore.d.ts +132 -132
  150. package/lib/cjs/PropertyStore.js +11 -11
  151. package/lib/cjs/PropertyStore.js.map +1 -1
  152. package/lib/cjs/Relationship.d.ts +416 -416
  153. package/lib/cjs/Relationship.js +494 -494
  154. package/lib/cjs/Relationship.js.map +1 -1
  155. package/lib/cjs/RpcBackend.d.ts +28 -28
  156. package/lib/cjs/RpcBackend.js +126 -126
  157. package/lib/cjs/RpcBackend.js.map +1 -1
  158. package/lib/cjs/SQLiteDb.d.ts +219 -219
  159. package/lib/cjs/SQLiteDb.js +214 -214
  160. package/lib/cjs/SQLiteDb.js.map +1 -1
  161. package/lib/cjs/Schema.d.ts +55 -55
  162. package/lib/cjs/Schema.js +83 -83
  163. package/lib/cjs/Schema.js.map +1 -1
  164. package/lib/cjs/ServerBasedLocks.d.ts +57 -57
  165. package/lib/cjs/ServerBasedLocks.js +168 -168
  166. package/lib/cjs/ServerBasedLocks.js.map +1 -1
  167. package/lib/cjs/SqliteStatement.d.ts +360 -360
  168. package/lib/cjs/SqliteStatement.js +586 -586
  169. package/lib/cjs/SqliteStatement.js.map +1 -1
  170. package/lib/cjs/Texture.d.ts +58 -58
  171. package/lib/cjs/Texture.js +82 -82
  172. package/lib/cjs/Texture.js.map +1 -1
  173. package/lib/cjs/TileStorage.d.ts +18 -18
  174. package/lib/cjs/TileStorage.js +90 -90
  175. package/lib/cjs/TileStorage.js.map +1 -1
  176. package/lib/cjs/TxnManager.d.ts +202 -202
  177. package/lib/cjs/TxnManager.js +356 -356
  178. package/lib/cjs/TxnManager.js.map +1 -1
  179. package/lib/cjs/ViewDefinition.d.ts +439 -439
  180. package/lib/cjs/ViewDefinition.js +646 -646
  181. package/lib/cjs/ViewDefinition.js.map +1 -1
  182. package/lib/cjs/ViewStateHydrator.d.ts +13 -13
  183. package/lib/cjs/ViewStateHydrator.js +103 -103
  184. package/lib/cjs/ViewStateHydrator.js.map +1 -1
  185. package/lib/cjs/assets/IModelChange.02.00.00.ecschema.xml +90 -90
  186. package/lib/cjs/assets/Settings/Schemas/Cloud.Schema.json +67 -67
  187. package/lib/cjs/assets/Settings/Schemas/Gcs.schema.json +31 -31
  188. package/lib/cjs/assets/Settings/Schemas/Workspace.Schema.json +52 -52
  189. package/lib/cjs/assets/Settings/backend.setting.json5 +138 -138
  190. package/lib/cjs/core-backend.d.ts +184 -184
  191. package/lib/cjs/core-backend.js +204 -204
  192. package/lib/cjs/core-backend.js.map +1 -1
  193. package/lib/cjs/domains/FunctionalElements.d.ts +101 -101
  194. package/lib/cjs/domains/FunctionalElements.js +145 -145
  195. package/lib/cjs/domains/FunctionalElements.js.map +1 -1
  196. package/lib/cjs/domains/FunctionalSchema.d.ts +13 -13
  197. package/lib/cjs/domains/FunctionalSchema.js +40 -40
  198. package/lib/cjs/domains/FunctionalSchema.js.map +1 -1
  199. package/lib/cjs/domains/GenericElements.d.ts +177 -177
  200. package/lib/cjs/domains/GenericElements.js +263 -263
  201. package/lib/cjs/domains/GenericElements.js.map +1 -1
  202. package/lib/cjs/domains/GenericSchema.d.ts +10 -10
  203. package/lib/cjs/domains/GenericSchema.js +28 -28
  204. package/lib/cjs/domains/GenericSchema.js.map +1 -1
  205. package/lib/cjs/rpc-impl/DevToolsRpcImpl.d.ts +15 -15
  206. package/lib/cjs/rpc-impl/DevToolsRpcImpl.js +32 -32
  207. package/lib/cjs/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  208. package/lib/cjs/rpc-impl/IModelReadRpcImpl.d.ts +46 -46
  209. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js +287 -287
  210. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  211. package/lib/cjs/rpc-impl/IModelTileRpcImpl.d.ts +22 -22
  212. package/lib/cjs/rpc-impl/IModelTileRpcImpl.js +202 -202
  213. package/lib/cjs/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  214. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.d.ts +36 -36
  215. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js +168 -168
  216. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  217. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.d.ts +16 -16
  218. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js +43 -43
  219. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  220. package/lib/cjs/rpc-impl/WipRpcImpl.d.ts +15 -15
  221. package/lib/cjs/rpc-impl/WipRpcImpl.js +37 -37
  222. package/lib/cjs/rpc-impl/WipRpcImpl.js.map +1 -1
  223. package/lib/cjs/workspace/Settings.d.ts +186 -186
  224. package/lib/cjs/workspace/Settings.js +155 -155
  225. package/lib/cjs/workspace/Settings.js.map +1 -1
  226. package/lib/cjs/workspace/SettingsSchemas.d.ts +75 -75
  227. package/lib/cjs/workspace/SettingsSchemas.js +191 -191
  228. package/lib/cjs/workspace/SettingsSchemas.js.map +1 -1
  229. package/lib/cjs/workspace/Workspace.d.ts +414 -414
  230. package/lib/cjs/workspace/Workspace.js +543 -543
  231. package/lib/cjs/workspace/Workspace.js.map +1 -1
  232. package/package.json +12 -12
@@ -1 +1 @@
1
- {"version":3,"file":"IModelTileRpcImpl.js","sourceRoot":"","sources":["../../../src/rpc-impl/IModelTileRpcImpl.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 RpcInterface\n */\n\nimport type { TransferConfig } from \"@itwin/object-storage-core\";\nimport { AccessToken, assert, BeDuration, Id64Array, Logger } from \"@itwin/core-bentley\";\nimport {\n CloudStorageContainerDescriptor, CloudStorageContainerUrl, CloudStorageTileCache, ElementGraphicsRequestProps, IModelRpcProps,\n IModelTileRpcInterface, IModelTileTreeProps, RpcInterface, RpcInvocation, RpcManager, RpcPendingResponse, TileContentIdentifier,\n TileContentSource, TileTreeContentIds, TileVersionInfo,\n} from \"@itwin/core-common\";\nimport { BackendLoggerCategory } from \"../BackendLoggerCategory\";\nimport { IModelDb } from \"../IModelDb\";\nimport { IModelHost } from \"../IModelHost\";\nimport { PromiseMemoizer, QueryablePromise } from \"../PromiseMemoizer\";\nimport { RpcTrace } from \"../RpcBackend\";\nimport { RpcBriefcaseUtility } from \"./RpcBriefcaseUtility\";\n\ninterface TileRequestProps {\n accessToken?: AccessToken;\n tokenProps: IModelRpcProps;\n treeId: string;\n}\n\nfunction generateTileRequestKey(props: TileRequestProps): string {\n const token = props.tokenProps;\n return `${JSON.stringify({\n key: token.key,\n iTwinId: token.iTwinId,\n iModelId: token.iModelId,\n changesetId: token.changeset?.id,\n })}:${props.treeId}`;\n}\n\nabstract class TileRequestMemoizer<Result, Props extends TileRequestProps> extends PromiseMemoizer<Result> {\n private readonly _loggerCategory = BackendLoggerCategory.IModelTileRequestRpc;\n protected abstract get _operationName(): string;\n protected abstract addMetadata(metadata: any, props: Props): void;\n protected abstract stringify(props: Props): string;\n protected abstract get _timeoutMilliseconds(): number;\n\n private makeMetadata(props: Props): any {\n const meta = { ...props.tokenProps };\n this.addMetadata(meta, props);\n return meta;\n }\n\n protected constructor(memoizeFn: (props: Props) => Promise<Result>, generateKeyFn: (props: Props) => string) {\n super(memoizeFn, generateKeyFn);\n }\n\n public override memoize(props: Props): QueryablePromise<Result> {\n return super.memoize(props);\n }\n\n public override deleteMemoized(props: Props) {\n super.deleteMemoized(props);\n }\n\n private log(status: string, props: Props): void {\n const descr = `${this._operationName}(${this.stringify(props)})`;\n Logger.logTrace(this._loggerCategory, `Backend ${status} ${descr}`, () => this.makeMetadata(props));\n }\n\n protected async perform(props: Props): Promise<Result> {\n this.log(\"received\", props);\n\n const tileQP = this.memoize(props);\n\n await BeDuration.race(this._timeoutMilliseconds, tileQP.promise).catch(() => { });\n // Note: Rejections must be caught so that the memoization entry can be deleted\n\n if (tileQP.isPending) {\n this.log(\"issuing pending status for\", props);\n throw new RpcPendingResponse();\n }\n\n this.deleteMemoized(props);\n\n if (tileQP.isFulfilled) {\n this.log(\"completed\", props);\n assert(undefined !== tileQP.result);\n return tileQP.result;\n }\n\n assert(tileQP.isRejected);\n this.log(\"rejected\", props);\n throw tileQP.error; // eslint-disable-line no-throw-literal\n }\n}\n\nasync function getTileTreeProps(props: TileRequestProps): Promise<IModelTileTreeProps> {\n assert(undefined !== props.accessToken);\n const db = await RpcBriefcaseUtility.findOpenIModel(props.accessToken, props.tokenProps);\n return db.tiles.requestTileTreeProps(props.treeId);\n}\n\nclass RequestTileTreePropsMemoizer extends TileRequestMemoizer<IModelTileTreeProps, TileRequestProps> {\n protected get _timeoutMilliseconds() { return IModelHost.tileTreeRequestTimeout; }\n protected get _operationName() { return \"requestTileTreeProps\"; }\n protected stringify(props: TileRequestProps): string { return props.treeId; }\n protected addMetadata(meta: any, props: TileRequestProps): void {\n meta.treeId = props.treeId;\n }\n\n private static _instance?: RequestTileTreePropsMemoizer;\n\n private constructor() {\n super(getTileTreeProps, generateTileRequestKey);\n IModelHost.onBeforeShutdown.addOnce(() => {\n this.dispose();\n RequestTileTreePropsMemoizer._instance = undefined;\n });\n }\n\n public static async perform(props: TileRequestProps): Promise<IModelTileTreeProps> {\n if (undefined === this._instance)\n this._instance = new RequestTileTreePropsMemoizer();\n\n return this._instance.perform(props);\n }\n}\n\ninterface TileContentRequestProps extends TileRequestProps {\n contentId: string;\n guid?: string;\n}\n\nasync function getTileContent(props: TileContentRequestProps): Promise<TileContentSource> {\n assert(undefined !== props.accessToken);\n const db = await RpcBriefcaseUtility.findOpenIModel(props.accessToken, props.tokenProps);\n const tile = await db.tiles.requestTileContent(props.treeId, props.contentId);\n\n // ###TODO: Verify the guid supplied by the front-end matches the guid stored in the model?\n if (IModelHost.usingExternalTileCache) {\n await IModelHost.tileStorage?.uploadTile(db.iModelId, db.changeset.id, props.treeId, props.contentId, tile.content, props.guid, {\n backendName: IModelHost.applicationId,\n tileGenerationTime: tile.elapsedSeconds.toString(),\n tileSize: tile.content.byteLength.toString(),\n });\n\n return TileContentSource.ExternalCache;\n }\n\n return TileContentSource.Backend;\n}\n\nfunction generateTileContentKey(props: TileContentRequestProps): string {\n return `${generateTileRequestKey(props)}:${props.contentId}`;\n}\n\nclass RequestTileContentMemoizer extends TileRequestMemoizer<TileContentSource, TileContentRequestProps> {\n protected get _timeoutMilliseconds() { return IModelHost.tileContentRequestTimeout; }\n protected get _operationName() { return \"requestTileContent\"; }\n protected stringify(props: TileContentRequestProps): string { return `${props.treeId}:${props.contentId}`; }\n protected addMetadata(meta: any, props: TileContentRequestProps): void {\n meta.treeId = props.treeId;\n meta.contentId = props.contentId;\n }\n\n private static _instance?: RequestTileContentMemoizer;\n\n private constructor() {\n super(getTileContent, generateTileContentKey);\n IModelHost.onBeforeShutdown.addOnce(() => {\n this.dispose();\n RequestTileContentMemoizer._instance = undefined;\n });\n }\n\n public static get instance() {\n if (undefined === this._instance)\n this._instance = new RequestTileContentMemoizer();\n\n return this._instance;\n }\n\n public static async perform(props: TileContentRequestProps): Promise<TileContentSource> {\n return this.instance.perform(props);\n }\n}\n\n/** @internal */\nexport class IModelTileRpcImpl extends RpcInterface implements IModelTileRpcInterface {\n public static register() { RpcManager.registerImpl(IModelTileRpcInterface, IModelTileRpcImpl); }\n\n public async requestTileTreeProps(tokenProps: IModelRpcProps, treeId: string): Promise<IModelTileTreeProps> {\n return RequestTileTreePropsMemoizer.perform({ accessToken: RpcTrace.expectCurrentActivity.accessToken, tokenProps, treeId });\n }\n\n public async purgeTileTrees(tokenProps: IModelRpcProps, modelIds: Id64Array | undefined): Promise<void> {\n // `undefined` gets forwarded as `null`...\n if (null === modelIds)\n modelIds = undefined;\n\n const db = await RpcBriefcaseUtility.findOpenIModel(RpcTrace.expectCurrentActivity.accessToken, tokenProps);\n return db.nativeDb.purgeTileTrees(modelIds);\n }\n\n public async generateTileContent(tokenProps: IModelRpcProps, treeId: string, contentId: string, guid: string | undefined): Promise<TileContentSource> {\n return RequestTileContentMemoizer.perform({ accessToken: RpcTrace.expectCurrentActivity.accessToken, tokenProps, treeId, contentId, guid });\n }\n\n public async retrieveTileContent(tokenProps: IModelRpcProps, key: TileContentIdentifier): Promise<Uint8Array> {\n const db = await RpcBriefcaseUtility.findOpenIModel(RpcTrace.expectCurrentActivity.accessToken, tokenProps);\n return db.tiles.getTileContent(key.treeId, key.contentId);\n }\n\n public async getTileCacheConfig(tokenProps: IModelRpcProps): Promise<TransferConfig | undefined> {\n if (IModelHost.tileStorage === undefined)\n return undefined;\n const iModelId = tokenProps.iModelId ?? (await RpcBriefcaseUtility.findOpenIModel(RpcTrace.expectCurrentActivity.accessToken, tokenProps)).iModelId;\n return IModelHost.tileStorage.getDownloadConfig(iModelId);\n }\n\n /* eslint-disable deprecation/deprecation */\n public async getTileCacheContainerUrl(_tokenProps: IModelRpcProps, id: CloudStorageContainerDescriptor): Promise<CloudStorageContainerUrl> {\n const invocation = RpcInvocation.current(this);\n\n if (!IModelHost.usingExternalTileCache) {\n return CloudStorageContainerUrl.empty();\n }\n\n const expiry = CloudStorageTileCache.getCache().supplyExpiryForContainerUrl(id);\n const clientIp = (IModelHost.restrictTileUrlsByClientIp && invocation.request.ip) ? invocation.request.ip : undefined;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return IModelHost.tileCacheService!.obtainContainerUrl(id, expiry, clientIp);\n }\n\n public async isUsingExternalTileCache(): Promise<boolean> { // eslint-disable-line @itwin/prefer-get\n return IModelHost.tileCacheService !== undefined;\n }\n /* eslint-enable deprecation/deprecation */\n\n public async queryVersionInfo(): Promise<TileVersionInfo> {\n return IModelHost.platform.getTileVersionInfo();\n }\n\n /** @internal */\n public async requestElementGraphics(rpcProps: IModelRpcProps, request: ElementGraphicsRequestProps): Promise<Uint8Array | undefined> {\n const iModel = await RpcBriefcaseUtility.findOpenIModel(RpcTrace.expectCurrentActivity.accessToken, rpcProps);\n return iModel.generateElementGraphics(request);\n }\n}\n\n/** @internal */\nexport async function cancelTileContentRequests(tokenProps: IModelRpcProps, contentIds: TileTreeContentIds[]): Promise<void> {\n const iModel = IModelDb.findByKey(tokenProps.key);\n const props: TileContentRequestProps = { tokenProps, treeId: \"\", contentId: \"\" };\n\n for (const entry of contentIds) {\n props.treeId = entry.treeId;\n for (const contentId of entry.contentIds) {\n props.contentId = contentId;\n RequestTileContentMemoizer.instance.deleteMemoized(props);\n }\n\n iModel.nativeDb.cancelTileContentRequests(entry.treeId, entry.contentIds);\n }\n}\n"]}
1
+ {"version":3,"file":"IModelTileRpcImpl.js","sourceRoot":"","sources":["../../../src/rpc-impl/IModelTileRpcImpl.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 RpcInterface\r\n */\r\n\r\nimport type { TransferConfig } from \"@itwin/object-storage-core\";\r\nimport { AccessToken, assert, BeDuration, Id64Array, Logger } from \"@itwin/core-bentley\";\r\nimport {\r\n CloudStorageContainerDescriptor, CloudStorageContainerUrl, CloudStorageTileCache, ElementGraphicsRequestProps, IModelRpcProps,\r\n IModelTileRpcInterface, IModelTileTreeProps, RpcInterface, RpcInvocation, RpcManager, RpcPendingResponse, TileContentIdentifier,\r\n TileContentSource, TileTreeContentIds, TileVersionInfo,\r\n} from \"@itwin/core-common\";\r\nimport { BackendLoggerCategory } from \"../BackendLoggerCategory\";\r\nimport { IModelDb } from \"../IModelDb\";\r\nimport { IModelHost } from \"../IModelHost\";\r\nimport { PromiseMemoizer, QueryablePromise } from \"../PromiseMemoizer\";\r\nimport { RpcTrace } from \"../RpcBackend\";\r\nimport { RpcBriefcaseUtility } from \"./RpcBriefcaseUtility\";\r\n\r\ninterface TileRequestProps {\r\n accessToken?: AccessToken;\r\n tokenProps: IModelRpcProps;\r\n treeId: string;\r\n}\r\n\r\nfunction generateTileRequestKey(props: TileRequestProps): string {\r\n const token = props.tokenProps;\r\n return `${JSON.stringify({\r\n key: token.key,\r\n iTwinId: token.iTwinId,\r\n iModelId: token.iModelId,\r\n changesetId: token.changeset?.id,\r\n })}:${props.treeId}`;\r\n}\r\n\r\nabstract class TileRequestMemoizer<Result, Props extends TileRequestProps> extends PromiseMemoizer<Result> {\r\n private readonly _loggerCategory = BackendLoggerCategory.IModelTileRequestRpc;\r\n protected abstract get _operationName(): string;\r\n protected abstract addMetadata(metadata: any, props: Props): void;\r\n protected abstract stringify(props: Props): string;\r\n protected abstract get _timeoutMilliseconds(): number;\r\n\r\n private makeMetadata(props: Props): any {\r\n const meta = { ...props.tokenProps };\r\n this.addMetadata(meta, props);\r\n return meta;\r\n }\r\n\r\n protected constructor(memoizeFn: (props: Props) => Promise<Result>, generateKeyFn: (props: Props) => string) {\r\n super(memoizeFn, generateKeyFn);\r\n }\r\n\r\n public override memoize(props: Props): QueryablePromise<Result> {\r\n return super.memoize(props);\r\n }\r\n\r\n public override deleteMemoized(props: Props) {\r\n super.deleteMemoized(props);\r\n }\r\n\r\n private log(status: string, props: Props): void {\r\n const descr = `${this._operationName}(${this.stringify(props)})`;\r\n Logger.logTrace(this._loggerCategory, `Backend ${status} ${descr}`, () => this.makeMetadata(props));\r\n }\r\n\r\n protected async perform(props: Props): Promise<Result> {\r\n this.log(\"received\", props);\r\n\r\n const tileQP = this.memoize(props);\r\n\r\n await BeDuration.race(this._timeoutMilliseconds, tileQP.promise).catch(() => { });\r\n // Note: Rejections must be caught so that the memoization entry can be deleted\r\n\r\n if (tileQP.isPending) {\r\n this.log(\"issuing pending status for\", props);\r\n throw new RpcPendingResponse();\r\n }\r\n\r\n this.deleteMemoized(props);\r\n\r\n if (tileQP.isFulfilled) {\r\n this.log(\"completed\", props);\r\n assert(undefined !== tileQP.result);\r\n return tileQP.result;\r\n }\r\n\r\n assert(tileQP.isRejected);\r\n this.log(\"rejected\", props);\r\n throw tileQP.error; // eslint-disable-line no-throw-literal\r\n }\r\n}\r\n\r\nasync function getTileTreeProps(props: TileRequestProps): Promise<IModelTileTreeProps> {\r\n assert(undefined !== props.accessToken);\r\n const db = await RpcBriefcaseUtility.findOpenIModel(props.accessToken, props.tokenProps);\r\n return db.tiles.requestTileTreeProps(props.treeId);\r\n}\r\n\r\nclass RequestTileTreePropsMemoizer extends TileRequestMemoizer<IModelTileTreeProps, TileRequestProps> {\r\n protected get _timeoutMilliseconds() { return IModelHost.tileTreeRequestTimeout; }\r\n protected get _operationName() { return \"requestTileTreeProps\"; }\r\n protected stringify(props: TileRequestProps): string { return props.treeId; }\r\n protected addMetadata(meta: any, props: TileRequestProps): void {\r\n meta.treeId = props.treeId;\r\n }\r\n\r\n private static _instance?: RequestTileTreePropsMemoizer;\r\n\r\n private constructor() {\r\n super(getTileTreeProps, generateTileRequestKey);\r\n IModelHost.onBeforeShutdown.addOnce(() => {\r\n this.dispose();\r\n RequestTileTreePropsMemoizer._instance = undefined;\r\n });\r\n }\r\n\r\n public static async perform(props: TileRequestProps): Promise<IModelTileTreeProps> {\r\n if (undefined === this._instance)\r\n this._instance = new RequestTileTreePropsMemoizer();\r\n\r\n return this._instance.perform(props);\r\n }\r\n}\r\n\r\ninterface TileContentRequestProps extends TileRequestProps {\r\n contentId: string;\r\n guid?: string;\r\n}\r\n\r\nasync function getTileContent(props: TileContentRequestProps): Promise<TileContentSource> {\r\n assert(undefined !== props.accessToken);\r\n const db = await RpcBriefcaseUtility.findOpenIModel(props.accessToken, props.tokenProps);\r\n const tile = await db.tiles.requestTileContent(props.treeId, props.contentId);\r\n\r\n // ###TODO: Verify the guid supplied by the front-end matches the guid stored in the model?\r\n if (IModelHost.usingExternalTileCache) {\r\n await IModelHost.tileStorage?.uploadTile(db.iModelId, db.changeset.id, props.treeId, props.contentId, tile.content, props.guid, {\r\n backendName: IModelHost.applicationId,\r\n tileGenerationTime: tile.elapsedSeconds.toString(),\r\n tileSize: tile.content.byteLength.toString(),\r\n });\r\n\r\n return TileContentSource.ExternalCache;\r\n }\r\n\r\n return TileContentSource.Backend;\r\n}\r\n\r\nfunction generateTileContentKey(props: TileContentRequestProps): string {\r\n return `${generateTileRequestKey(props)}:${props.contentId}`;\r\n}\r\n\r\nclass RequestTileContentMemoizer extends TileRequestMemoizer<TileContentSource, TileContentRequestProps> {\r\n protected get _timeoutMilliseconds() { return IModelHost.tileContentRequestTimeout; }\r\n protected get _operationName() { return \"requestTileContent\"; }\r\n protected stringify(props: TileContentRequestProps): string { return `${props.treeId}:${props.contentId}`; }\r\n protected addMetadata(meta: any, props: TileContentRequestProps): void {\r\n meta.treeId = props.treeId;\r\n meta.contentId = props.contentId;\r\n }\r\n\r\n private static _instance?: RequestTileContentMemoizer;\r\n\r\n private constructor() {\r\n super(getTileContent, generateTileContentKey);\r\n IModelHost.onBeforeShutdown.addOnce(() => {\r\n this.dispose();\r\n RequestTileContentMemoizer._instance = undefined;\r\n });\r\n }\r\n\r\n public static get instance() {\r\n if (undefined === this._instance)\r\n this._instance = new RequestTileContentMemoizer();\r\n\r\n return this._instance;\r\n }\r\n\r\n public static async perform(props: TileContentRequestProps): Promise<TileContentSource> {\r\n return this.instance.perform(props);\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class IModelTileRpcImpl extends RpcInterface implements IModelTileRpcInterface {\r\n public static register() { RpcManager.registerImpl(IModelTileRpcInterface, IModelTileRpcImpl); }\r\n\r\n public async requestTileTreeProps(tokenProps: IModelRpcProps, treeId: string): Promise<IModelTileTreeProps> {\r\n return RequestTileTreePropsMemoizer.perform({ accessToken: RpcTrace.expectCurrentActivity.accessToken, tokenProps, treeId });\r\n }\r\n\r\n public async purgeTileTrees(tokenProps: IModelRpcProps, modelIds: Id64Array | undefined): Promise<void> {\r\n // `undefined` gets forwarded as `null`...\r\n if (null === modelIds)\r\n modelIds = undefined;\r\n\r\n const db = await RpcBriefcaseUtility.findOpenIModel(RpcTrace.expectCurrentActivity.accessToken, tokenProps);\r\n return db.nativeDb.purgeTileTrees(modelIds);\r\n }\r\n\r\n public async generateTileContent(tokenProps: IModelRpcProps, treeId: string, contentId: string, guid: string | undefined): Promise<TileContentSource> {\r\n return RequestTileContentMemoizer.perform({ accessToken: RpcTrace.expectCurrentActivity.accessToken, tokenProps, treeId, contentId, guid });\r\n }\r\n\r\n public async retrieveTileContent(tokenProps: IModelRpcProps, key: TileContentIdentifier): Promise<Uint8Array> {\r\n const db = await RpcBriefcaseUtility.findOpenIModel(RpcTrace.expectCurrentActivity.accessToken, tokenProps);\r\n return db.tiles.getTileContent(key.treeId, key.contentId);\r\n }\r\n\r\n public async getTileCacheConfig(tokenProps: IModelRpcProps): Promise<TransferConfig | undefined> {\r\n if (IModelHost.tileStorage === undefined)\r\n return undefined;\r\n const iModelId = tokenProps.iModelId ?? (await RpcBriefcaseUtility.findOpenIModel(RpcTrace.expectCurrentActivity.accessToken, tokenProps)).iModelId;\r\n return IModelHost.tileStorage.getDownloadConfig(iModelId);\r\n }\r\n\r\n /* eslint-disable deprecation/deprecation */\r\n public async getTileCacheContainerUrl(_tokenProps: IModelRpcProps, id: CloudStorageContainerDescriptor): Promise<CloudStorageContainerUrl> {\r\n const invocation = RpcInvocation.current(this);\r\n\r\n if (!IModelHost.usingExternalTileCache) {\r\n return CloudStorageContainerUrl.empty();\r\n }\r\n\r\n const expiry = CloudStorageTileCache.getCache().supplyExpiryForContainerUrl(id);\r\n const clientIp = (IModelHost.restrictTileUrlsByClientIp && invocation.request.ip) ? invocation.request.ip : undefined;\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n return IModelHost.tileCacheService!.obtainContainerUrl(id, expiry, clientIp);\r\n }\r\n\r\n public async isUsingExternalTileCache(): Promise<boolean> { // eslint-disable-line @itwin/prefer-get\r\n return IModelHost.tileCacheService !== undefined;\r\n }\r\n /* eslint-enable deprecation/deprecation */\r\n\r\n public async queryVersionInfo(): Promise<TileVersionInfo> {\r\n return IModelHost.platform.getTileVersionInfo();\r\n }\r\n\r\n /** @internal */\r\n public async requestElementGraphics(rpcProps: IModelRpcProps, request: ElementGraphicsRequestProps): Promise<Uint8Array | undefined> {\r\n const iModel = await RpcBriefcaseUtility.findOpenIModel(RpcTrace.expectCurrentActivity.accessToken, rpcProps);\r\n return iModel.generateElementGraphics(request);\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport async function cancelTileContentRequests(tokenProps: IModelRpcProps, contentIds: TileTreeContentIds[]): Promise<void> {\r\n const iModel = IModelDb.findByKey(tokenProps.key);\r\n const props: TileContentRequestProps = { tokenProps, treeId: \"\", contentId: \"\" };\r\n\r\n for (const entry of contentIds) {\r\n props.treeId = entry.treeId;\r\n for (const contentId of entry.contentIds) {\r\n props.contentId = contentId;\r\n RequestTileContentMemoizer.instance.deleteMemoized(props);\r\n }\r\n\r\n iModel.nativeDb.cancelTileContentRequests(entry.treeId, entry.contentIds);\r\n }\r\n}\r\n"]}
@@ -1,37 +1,37 @@
1
- /** @packageDocumentation
2
- * @module RpcInterface
3
- */
4
- import { AccessToken } from "@itwin/core-bentley";
5
- import { BriefcaseProps, IModelConnectionProps, IModelRpcOpenProps, IModelRpcProps, RpcActivity, SyncMode } from "@itwin/core-common";
6
- import { IModelDb } from "../IModelDb";
7
- /** @internal */
8
- export interface DownloadAndOpenArgs {
9
- activity: RpcActivity;
10
- tokenProps: IModelRpcOpenProps;
11
- syncMode: SyncMode;
12
- fileNameResolvers?: ((arg: BriefcaseProps) => string)[];
13
- timeout?: number;
14
- forceDownload?: boolean;
15
- }
16
- /**
17
- * Utility to open the iModel for RPC interfaces
18
- * @internal
19
- */
20
- export declare class RpcBriefcaseUtility {
21
- private static downloadAndOpen;
22
- private static _briefcasePromise;
23
- private static openBriefcase;
24
- /** find a previously opened iModel for RPC.
25
- * @param accessToken necessary (only) for V2 checkpoints to refresh access token in daemon if it has expired. We use the accessToken of the current RPC request
26
- * to refresh the daemon, even though it will be used for all authorized users.
27
- * @param the IModelRpcProps to locate the opened iModel.
28
- */
29
- static findOpenIModel(accessToken: AccessToken, iModel: IModelRpcProps): Promise<IModelDb>;
30
- /**
31
- * Download and open a checkpoint or briefcase, ensuring the operation completes within a default timeout. If the time to open exceeds the timeout period,
32
- * a RpcPendingResponse exception is thrown
33
- */
34
- static open(args: DownloadAndOpenArgs): Promise<IModelDb>;
35
- static openWithTimeout(activity: RpcActivity, tokenProps: IModelRpcOpenProps, syncMode: SyncMode, timeout?: number): Promise<IModelConnectionProps>;
36
- }
1
+ /** @packageDocumentation
2
+ * @module RpcInterface
3
+ */
4
+ import { AccessToken } from "@itwin/core-bentley";
5
+ import { BriefcaseProps, IModelConnectionProps, IModelRpcOpenProps, IModelRpcProps, RpcActivity, SyncMode } from "@itwin/core-common";
6
+ import { IModelDb } from "../IModelDb";
7
+ /** @internal */
8
+ export interface DownloadAndOpenArgs {
9
+ activity: RpcActivity;
10
+ tokenProps: IModelRpcOpenProps;
11
+ syncMode: SyncMode;
12
+ fileNameResolvers?: ((arg: BriefcaseProps) => string)[];
13
+ timeout?: number;
14
+ forceDownload?: boolean;
15
+ }
16
+ /**
17
+ * Utility to open the iModel for RPC interfaces
18
+ * @internal
19
+ */
20
+ export declare class RpcBriefcaseUtility {
21
+ private static downloadAndOpen;
22
+ private static _briefcasePromise;
23
+ private static openBriefcase;
24
+ /** find a previously opened iModel for RPC.
25
+ * @param accessToken necessary (only) for V2 checkpoints to refresh access token in daemon if it has expired. We use the accessToken of the current RPC request
26
+ * to refresh the daemon, even though it will be used for all authorized users.
27
+ * @param the IModelRpcProps to locate the opened iModel.
28
+ */
29
+ static findOpenIModel(accessToken: AccessToken, iModel: IModelRpcProps): Promise<IModelDb>;
30
+ /**
31
+ * Download and open a checkpoint or briefcase, ensuring the operation completes within a default timeout. If the time to open exceeds the timeout period,
32
+ * a RpcPendingResponse exception is thrown
33
+ */
34
+ static open(args: DownloadAndOpenArgs): Promise<IModelDb>;
35
+ static openWithTimeout(activity: RpcActivity, tokenProps: IModelRpcOpenProps, syncMode: SyncMode, timeout?: number): Promise<IModelConnectionProps>;
36
+ }
37
37
  //# sourceMappingURL=RpcBriefcaseUtility.d.ts.map
@@ -1,169 +1,169 @@
1
- "use strict";
2
- /*---------------------------------------------------------------------------------------------
3
- * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
- * See LICENSE.md in the project root for license terms and full copyright notice.
5
- *--------------------------------------------------------------------------------------------*/
6
- /** @packageDocumentation
7
- * @module RpcInterface
8
- */
9
- Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.RpcBriefcaseUtility = void 0;
11
- const core_bentley_1 = require("@itwin/core-bentley");
12
- const core_common_1 = require("@itwin/core-common");
13
- const BackendLoggerCategory_1 = require("../BackendLoggerCategory");
14
- const BriefcaseManager_1 = require("../BriefcaseManager");
15
- const CheckpointManager_1 = require("../CheckpointManager");
16
- const IModelDb_1 = require("../IModelDb");
17
- const IModelHost_1 = require("../IModelHost");
18
- const IModelJsFs_1 = require("../IModelJsFs");
19
- const loggerCategory = BackendLoggerCategory_1.BackendLoggerCategory.IModelDb;
20
- /**
21
- * Utility to open the iModel for RPC interfaces
22
- * @internal
23
- */
24
- class RpcBriefcaseUtility {
25
- static async downloadAndOpen(args) {
26
- var _a, _b, _c, _d;
27
- const { activity, tokenProps } = args;
28
- const accessToken = activity.accessToken;
29
- (0, core_bentley_1.assert)(undefined !== tokenProps.iModelId);
30
- const iModelId = tokenProps.iModelId;
31
- let myBriefcaseIds;
32
- if (args.syncMode === core_common_1.SyncMode.PullOnly) {
33
- myBriefcaseIds = [0]; // PullOnly means briefcaseId 0
34
- }
35
- else {
36
- // check with iModelHub and see if we already have acquired any briefcaseIds
37
- myBriefcaseIds = await IModelHost_1.IModelHost.hubAccess.getMyBriefcaseIds({ accessToken, iModelId });
38
- }
39
- const resolvers = (_a = args.fileNameResolvers) !== null && _a !== void 0 ? _a : [(arg) => BriefcaseManager_1.BriefcaseManager.getFileName(arg)];
40
- // see if we can open any of the briefcaseIds we already acquired from iModelHub
41
- if (resolvers) {
42
- for (const resolver of resolvers) {
43
- for (const briefcaseId of myBriefcaseIds) {
44
- const fileName = resolver({ briefcaseId, iModelId });
45
- if (IModelJsFs_1.IModelJsFs.existsSync(fileName)) {
46
- const briefcaseDb = IModelDb_1.BriefcaseDb.findByFilename(fileName);
47
- if (briefcaseDb !== undefined)
48
- return briefcaseDb;
49
- try {
50
- if (args.forceDownload)
51
- throw new Error(); // causes delete below
52
- const db = await IModelDb_1.BriefcaseDb.open({ fileName });
53
- if (db.changeset.id !== ((_b = tokenProps.changeset) === null || _b === void 0 ? void 0 : _b.id)) {
54
- (0, core_bentley_1.assert)(undefined !== tokenProps.changeset);
55
- const toIndex = (_d = (_c = tokenProps.changeset) === null || _c === void 0 ? void 0 : _c.index) !== null && _d !== void 0 ? _d : (await IModelHost_1.IModelHost.hubAccess.getChangesetFromVersion({ accessToken, iModelId, version: core_common_1.IModelVersion.asOfChangeSet(tokenProps.changeset.id) })).index;
56
- await BriefcaseManager_1.BriefcaseManager.pullAndApplyChangesets(db, { accessToken, toIndex });
57
- }
58
- return db;
59
- }
60
- catch (error) {
61
- if (!(error.errorNumber === core_bentley_1.IModelStatus.AlreadyOpen))
62
- // somehow we have this briefcaseId and the file exists, but we can't open it. Delete it.
63
- await BriefcaseManager_1.BriefcaseManager.deleteBriefcaseFiles(fileName, accessToken);
64
- }
65
- }
66
- }
67
- }
68
- }
69
- // no local briefcase available. Download one and open it.
70
- (0, core_bentley_1.assert)(undefined !== tokenProps.iTwinId);
71
- const request = {
72
- accessToken,
73
- iTwinId: tokenProps.iTwinId,
74
- iModelId,
75
- briefcaseId: args.syncMode === core_common_1.SyncMode.PullOnly ? 0 : undefined, // if briefcaseId is undefined, we'll acquire a new one.
76
- };
77
- const props = await BriefcaseManager_1.BriefcaseManager.downloadBriefcase(request);
78
- return IModelDb_1.BriefcaseDb.open(props);
79
- }
80
- static async openBriefcase(args) {
81
- if (this._briefcasePromise)
82
- return this._briefcasePromise;
83
- try {
84
- this._briefcasePromise = this.downloadAndOpen(args); // save the fact that we're working on downloading so if we timeout, we'll reuse this request.
85
- return await this._briefcasePromise;
86
- }
87
- finally {
88
- this._briefcasePromise = undefined; // the download and open is now done
89
- }
90
- }
91
- /** find a previously opened iModel for RPC.
92
- * @param accessToken necessary (only) for V2 checkpoints to refresh access token in daemon if it has expired. We use the accessToken of the current RPC request
93
- * to refresh the daemon, even though it will be used for all authorized users.
94
- * @param the IModelRpcProps to locate the opened iModel.
95
- */
96
- static async findOpenIModel(accessToken, iModel) {
97
- const iModelDb = IModelDb_1.IModelDb.findByKey(iModel.key);
98
- // call refreshContainerSas, just in case this is a V2 checkpoint whose sasToken is about to expire.
99
- await iModelDb.refreshContainerSas(accessToken);
100
- return iModelDb;
101
- }
102
- /**
103
- * Download and open a checkpoint or briefcase, ensuring the operation completes within a default timeout. If the time to open exceeds the timeout period,
104
- * a RpcPendingResponse exception is thrown
105
- */
106
- static async open(args) {
107
- var _a;
108
- const { activity, tokenProps, syncMode } = args;
109
- core_bentley_1.Logger.logTrace(loggerCategory, "RpcBriefcaseUtility.open", () => ({ ...tokenProps }));
110
- const timeout = (_a = args.timeout) !== null && _a !== void 0 ? _a : 1000;
111
- if (syncMode === core_common_1.SyncMode.PullOnly || syncMode === core_common_1.SyncMode.PullAndPush) {
112
- const briefcaseDb = await core_bentley_1.BeDuration.race(timeout, this.openBriefcase(args));
113
- if (briefcaseDb === undefined) {
114
- core_bentley_1.Logger.logTrace(loggerCategory, "Open briefcase - pending", () => ({ ...tokenProps }));
115
- throw new core_common_1.RpcPendingResponse();
116
- }
117
- // note: usage is logged in the function BriefcaseManager.downloadNewBriefcaseAndOpen
118
- return briefcaseDb;
119
- }
120
- (0, core_bentley_1.assert)(undefined !== tokenProps.iModelId);
121
- (0, core_bentley_1.assert)(undefined !== tokenProps.iTwinId);
122
- (0, core_bentley_1.assert)(undefined !== tokenProps.changeset);
123
- const checkpoint = {
124
- iModelId: tokenProps.iModelId,
125
- iTwinId: tokenProps.iTwinId,
126
- changeset: tokenProps.changeset,
127
- accessToken: activity.accessToken,
128
- };
129
- // opening a checkpoint, readonly.
130
- let db;
131
- // first check if it's already open
132
- db = IModelDb_1.SnapshotDb.tryFindByKey(CheckpointManager_1.CheckpointManager.getKey(checkpoint));
133
- if (db) {
134
- core_bentley_1.Logger.logTrace(loggerCategory, "Checkpoint was already open", () => ({ ...tokenProps }));
135
- BriefcaseManager_1.BriefcaseManager.logUsage(db);
136
- return db;
137
- }
138
- try {
139
- // now try V2 checkpoint
140
- db = await IModelDb_1.SnapshotDb.openCheckpointV2(checkpoint);
141
- core_bentley_1.Logger.logTrace(loggerCategory, "using V2 checkpoint briefcase", () => ({ ...tokenProps }));
142
- }
143
- catch (e) {
144
- core_bentley_1.Logger.logTrace(loggerCategory, "unable to open V2 checkpoint - falling back to V1 checkpoint", () => ({ error: core_bentley_1.BentleyError.getErrorProps(e), ...tokenProps }));
145
- // this isn't a v2 checkpoint. Set up a race between the specified timeout period and the open. Throw an RpcPendingResponse exception if the timeout happens first.
146
- const request = {
147
- checkpoint,
148
- localFile: CheckpointManager_1.V1CheckpointManager.getFileName(checkpoint),
149
- aliasFiles: [],
150
- };
151
- db = await core_bentley_1.BeDuration.race(timeout, CheckpointManager_1.V1CheckpointManager.getCheckpointDb(request));
152
- if (db === undefined) {
153
- core_bentley_1.Logger.logTrace(loggerCategory, "Open V1 checkpoint - pending", () => ({ ...tokenProps }));
154
- throw new core_common_1.RpcPendingResponse();
155
- }
156
- core_bentley_1.Logger.logTrace(loggerCategory, "Opened V1 checkpoint", () => ({ ...tokenProps }));
157
- }
158
- BriefcaseManager_1.BriefcaseManager.logUsage(db, activity);
159
- return db;
160
- }
161
- static async openWithTimeout(activity, tokenProps, syncMode, timeout = 1000) {
162
- var _a;
163
- if (tokenProps.iModelId)
164
- await ((_a = IModelHost_1.IModelHost.tileStorage) === null || _a === void 0 ? void 0 : _a.initialize(tokenProps.iModelId));
165
- return (await this.open({ activity, tokenProps, syncMode, timeout })).toJSON();
166
- }
167
- }
168
- exports.RpcBriefcaseUtility = RpcBriefcaseUtility;
1
+ "use strict";
2
+ /*---------------------------------------------------------------------------------------------
3
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
+ * See LICENSE.md in the project root for license terms and full copyright notice.
5
+ *--------------------------------------------------------------------------------------------*/
6
+ /** @packageDocumentation
7
+ * @module RpcInterface
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.RpcBriefcaseUtility = void 0;
11
+ const core_bentley_1 = require("@itwin/core-bentley");
12
+ const core_common_1 = require("@itwin/core-common");
13
+ const BackendLoggerCategory_1 = require("../BackendLoggerCategory");
14
+ const BriefcaseManager_1 = require("../BriefcaseManager");
15
+ const CheckpointManager_1 = require("../CheckpointManager");
16
+ const IModelDb_1 = require("../IModelDb");
17
+ const IModelHost_1 = require("../IModelHost");
18
+ const IModelJsFs_1 = require("../IModelJsFs");
19
+ const loggerCategory = BackendLoggerCategory_1.BackendLoggerCategory.IModelDb;
20
+ /**
21
+ * Utility to open the iModel for RPC interfaces
22
+ * @internal
23
+ */
24
+ class RpcBriefcaseUtility {
25
+ static async downloadAndOpen(args) {
26
+ var _a, _b, _c, _d;
27
+ const { activity, tokenProps } = args;
28
+ const accessToken = activity.accessToken;
29
+ (0, core_bentley_1.assert)(undefined !== tokenProps.iModelId);
30
+ const iModelId = tokenProps.iModelId;
31
+ let myBriefcaseIds;
32
+ if (args.syncMode === core_common_1.SyncMode.PullOnly) {
33
+ myBriefcaseIds = [0]; // PullOnly means briefcaseId 0
34
+ }
35
+ else {
36
+ // check with iModelHub and see if we already have acquired any briefcaseIds
37
+ myBriefcaseIds = await IModelHost_1.IModelHost.hubAccess.getMyBriefcaseIds({ accessToken, iModelId });
38
+ }
39
+ const resolvers = (_a = args.fileNameResolvers) !== null && _a !== void 0 ? _a : [(arg) => BriefcaseManager_1.BriefcaseManager.getFileName(arg)];
40
+ // see if we can open any of the briefcaseIds we already acquired from iModelHub
41
+ if (resolvers) {
42
+ for (const resolver of resolvers) {
43
+ for (const briefcaseId of myBriefcaseIds) {
44
+ const fileName = resolver({ briefcaseId, iModelId });
45
+ if (IModelJsFs_1.IModelJsFs.existsSync(fileName)) {
46
+ const briefcaseDb = IModelDb_1.BriefcaseDb.findByFilename(fileName);
47
+ if (briefcaseDb !== undefined)
48
+ return briefcaseDb;
49
+ try {
50
+ if (args.forceDownload)
51
+ throw new Error(); // causes delete below
52
+ const db = await IModelDb_1.BriefcaseDb.open({ fileName });
53
+ if (db.changeset.id !== ((_b = tokenProps.changeset) === null || _b === void 0 ? void 0 : _b.id)) {
54
+ (0, core_bentley_1.assert)(undefined !== tokenProps.changeset);
55
+ const toIndex = (_d = (_c = tokenProps.changeset) === null || _c === void 0 ? void 0 : _c.index) !== null && _d !== void 0 ? _d : (await IModelHost_1.IModelHost.hubAccess.getChangesetFromVersion({ accessToken, iModelId, version: core_common_1.IModelVersion.asOfChangeSet(tokenProps.changeset.id) })).index;
56
+ await BriefcaseManager_1.BriefcaseManager.pullAndApplyChangesets(db, { accessToken, toIndex });
57
+ }
58
+ return db;
59
+ }
60
+ catch (error) {
61
+ if (!(error.errorNumber === core_bentley_1.IModelStatus.AlreadyOpen))
62
+ // somehow we have this briefcaseId and the file exists, but we can't open it. Delete it.
63
+ await BriefcaseManager_1.BriefcaseManager.deleteBriefcaseFiles(fileName, accessToken);
64
+ }
65
+ }
66
+ }
67
+ }
68
+ }
69
+ // no local briefcase available. Download one and open it.
70
+ (0, core_bentley_1.assert)(undefined !== tokenProps.iTwinId);
71
+ const request = {
72
+ accessToken,
73
+ iTwinId: tokenProps.iTwinId,
74
+ iModelId,
75
+ briefcaseId: args.syncMode === core_common_1.SyncMode.PullOnly ? 0 : undefined, // if briefcaseId is undefined, we'll acquire a new one.
76
+ };
77
+ const props = await BriefcaseManager_1.BriefcaseManager.downloadBriefcase(request);
78
+ return IModelDb_1.BriefcaseDb.open(props);
79
+ }
80
+ static async openBriefcase(args) {
81
+ if (this._briefcasePromise)
82
+ return this._briefcasePromise;
83
+ try {
84
+ this._briefcasePromise = this.downloadAndOpen(args); // save the fact that we're working on downloading so if we timeout, we'll reuse this request.
85
+ return await this._briefcasePromise;
86
+ }
87
+ finally {
88
+ this._briefcasePromise = undefined; // the download and open is now done
89
+ }
90
+ }
91
+ /** find a previously opened iModel for RPC.
92
+ * @param accessToken necessary (only) for V2 checkpoints to refresh access token in daemon if it has expired. We use the accessToken of the current RPC request
93
+ * to refresh the daemon, even though it will be used for all authorized users.
94
+ * @param the IModelRpcProps to locate the opened iModel.
95
+ */
96
+ static async findOpenIModel(accessToken, iModel) {
97
+ const iModelDb = IModelDb_1.IModelDb.findByKey(iModel.key);
98
+ // call refreshContainerSas, just in case this is a V2 checkpoint whose sasToken is about to expire.
99
+ await iModelDb.refreshContainerSas(accessToken);
100
+ return iModelDb;
101
+ }
102
+ /**
103
+ * Download and open a checkpoint or briefcase, ensuring the operation completes within a default timeout. If the time to open exceeds the timeout period,
104
+ * a RpcPendingResponse exception is thrown
105
+ */
106
+ static async open(args) {
107
+ var _a;
108
+ const { activity, tokenProps, syncMode } = args;
109
+ core_bentley_1.Logger.logTrace(loggerCategory, "RpcBriefcaseUtility.open", () => ({ ...tokenProps }));
110
+ const timeout = (_a = args.timeout) !== null && _a !== void 0 ? _a : 1000;
111
+ if (syncMode === core_common_1.SyncMode.PullOnly || syncMode === core_common_1.SyncMode.PullAndPush) {
112
+ const briefcaseDb = await core_bentley_1.BeDuration.race(timeout, this.openBriefcase(args));
113
+ if (briefcaseDb === undefined) {
114
+ core_bentley_1.Logger.logTrace(loggerCategory, "Open briefcase - pending", () => ({ ...tokenProps }));
115
+ throw new core_common_1.RpcPendingResponse();
116
+ }
117
+ // note: usage is logged in the function BriefcaseManager.downloadNewBriefcaseAndOpen
118
+ return briefcaseDb;
119
+ }
120
+ (0, core_bentley_1.assert)(undefined !== tokenProps.iModelId);
121
+ (0, core_bentley_1.assert)(undefined !== tokenProps.iTwinId);
122
+ (0, core_bentley_1.assert)(undefined !== tokenProps.changeset);
123
+ const checkpoint = {
124
+ iModelId: tokenProps.iModelId,
125
+ iTwinId: tokenProps.iTwinId,
126
+ changeset: tokenProps.changeset,
127
+ accessToken: activity.accessToken,
128
+ };
129
+ // opening a checkpoint, readonly.
130
+ let db;
131
+ // first check if it's already open
132
+ db = IModelDb_1.SnapshotDb.tryFindByKey(CheckpointManager_1.CheckpointManager.getKey(checkpoint));
133
+ if (db) {
134
+ core_bentley_1.Logger.logTrace(loggerCategory, "Checkpoint was already open", () => ({ ...tokenProps }));
135
+ BriefcaseManager_1.BriefcaseManager.logUsage(db);
136
+ return db;
137
+ }
138
+ try {
139
+ // now try V2 checkpoint
140
+ db = await IModelDb_1.SnapshotDb.openCheckpointV2(checkpoint);
141
+ core_bentley_1.Logger.logTrace(loggerCategory, "using V2 checkpoint briefcase", () => ({ ...tokenProps }));
142
+ }
143
+ catch (e) {
144
+ core_bentley_1.Logger.logTrace(loggerCategory, "unable to open V2 checkpoint - falling back to V1 checkpoint", () => ({ error: core_bentley_1.BentleyError.getErrorProps(e), ...tokenProps }));
145
+ // this isn't a v2 checkpoint. Set up a race between the specified timeout period and the open. Throw an RpcPendingResponse exception if the timeout happens first.
146
+ const request = {
147
+ checkpoint,
148
+ localFile: CheckpointManager_1.V1CheckpointManager.getFileName(checkpoint),
149
+ aliasFiles: [],
150
+ };
151
+ db = await core_bentley_1.BeDuration.race(timeout, CheckpointManager_1.V1CheckpointManager.getCheckpointDb(request));
152
+ if (db === undefined) {
153
+ core_bentley_1.Logger.logTrace(loggerCategory, "Open V1 checkpoint - pending", () => ({ ...tokenProps }));
154
+ throw new core_common_1.RpcPendingResponse();
155
+ }
156
+ core_bentley_1.Logger.logTrace(loggerCategory, "Opened V1 checkpoint", () => ({ ...tokenProps }));
157
+ }
158
+ BriefcaseManager_1.BriefcaseManager.logUsage(db, activity);
159
+ return db;
160
+ }
161
+ static async openWithTimeout(activity, tokenProps, syncMode, timeout = 1000) {
162
+ var _a;
163
+ if (tokenProps.iModelId)
164
+ await ((_a = IModelHost_1.IModelHost.tileStorage) === null || _a === void 0 ? void 0 : _a.initialize(tokenProps.iModelId));
165
+ return (await this.open({ activity, tokenProps, syncMode, timeout })).toJSON();
166
+ }
167
+ }
168
+ exports.RpcBriefcaseUtility = RpcBriefcaseUtility;
169
169
  //# sourceMappingURL=RpcBriefcaseUtility.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RpcBriefcaseUtility.js","sourceRoot":"","sources":["../../../src/rpc-impl/RpcBriefcaseUtility.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 RpcInterface\n */\n\nimport { AccessToken, assert, BeDuration, BentleyError, IModelStatus, Logger } from \"@itwin/core-bentley\";\nimport {\n BriefcaseProps, IModelConnectionProps, IModelRpcOpenProps, IModelRpcProps, IModelVersion, RpcActivity, RpcPendingResponse, SyncMode,\n} from \"@itwin/core-common\";\nimport { BackendLoggerCategory } from \"../BackendLoggerCategory\";\nimport { BriefcaseManager, RequestNewBriefcaseArg } from \"../BriefcaseManager\";\nimport { CheckpointManager, CheckpointProps, V1CheckpointManager } from \"../CheckpointManager\";\nimport { BriefcaseDb, IModelDb, SnapshotDb } from \"../IModelDb\";\nimport { IModelHost } from \"../IModelHost\";\nimport { IModelJsFs } from \"../IModelJsFs\";\n\nconst loggerCategory: string = BackendLoggerCategory.IModelDb;\n\n/** @internal */\nexport interface DownloadAndOpenArgs {\n activity: RpcActivity;\n tokenProps: IModelRpcOpenProps;\n syncMode: SyncMode;\n fileNameResolvers?: ((arg: BriefcaseProps) => string)[];\n timeout?: number;\n forceDownload?: boolean;\n}\n/**\n * Utility to open the iModel for RPC interfaces\n * @internal\n */\nexport class RpcBriefcaseUtility {\n\n private static async downloadAndOpen(args: DownloadAndOpenArgs): Promise<BriefcaseDb> {\n const { activity, tokenProps } = args;\n const accessToken = activity.accessToken;\n assert(undefined !== tokenProps.iModelId);\n\n const iModelId = tokenProps.iModelId;\n let myBriefcaseIds: number[];\n if (args.syncMode === SyncMode.PullOnly) {\n myBriefcaseIds = [0]; // PullOnly means briefcaseId 0\n } else {\n // check with iModelHub and see if we already have acquired any briefcaseIds\n myBriefcaseIds = await IModelHost.hubAccess.getMyBriefcaseIds({ accessToken, iModelId });\n }\n\n const resolvers = args.fileNameResolvers ?? [(arg) => BriefcaseManager.getFileName(arg)];\n\n // see if we can open any of the briefcaseIds we already acquired from iModelHub\n if (resolvers) {\n for (const resolver of resolvers) {\n for (const briefcaseId of myBriefcaseIds) {\n const fileName = resolver({ briefcaseId, iModelId });\n if (IModelJsFs.existsSync(fileName)) {\n const briefcaseDb = BriefcaseDb.findByFilename(fileName);\n if (briefcaseDb !== undefined)\n return briefcaseDb as BriefcaseDb;\n try {\n if (args.forceDownload)\n throw new Error(); // causes delete below\n const db = await BriefcaseDb.open({ fileName });\n if (db.changeset.id !== tokenProps.changeset?.id) {\n assert(undefined !== tokenProps.changeset);\n const toIndex = tokenProps.changeset?.index ??\n (await IModelHost.hubAccess.getChangesetFromVersion({ accessToken, iModelId, version: IModelVersion.asOfChangeSet(tokenProps.changeset.id) })).index;\n await BriefcaseManager.pullAndApplyChangesets(db, { accessToken, toIndex });\n }\n return db;\n } catch (error: any) {\n if (!(error.errorNumber === IModelStatus.AlreadyOpen))\n // somehow we have this briefcaseId and the file exists, but we can't open it. Delete it.\n await BriefcaseManager.deleteBriefcaseFiles(fileName, accessToken);\n }\n }\n }\n }\n }\n\n // no local briefcase available. Download one and open it.\n assert(undefined !== tokenProps.iTwinId);\n const request: RequestNewBriefcaseArg = {\n accessToken,\n iTwinId: tokenProps.iTwinId,\n iModelId,\n briefcaseId: args.syncMode === SyncMode.PullOnly ? 0 : undefined, // if briefcaseId is undefined, we'll acquire a new one.\n };\n\n const props = await BriefcaseManager.downloadBriefcase(request);\n return BriefcaseDb.open(props);\n }\n\n private static _briefcasePromise: Promise<BriefcaseDb> | undefined;\n private static async openBriefcase(args: DownloadAndOpenArgs): Promise<BriefcaseDb> {\n if (this._briefcasePromise)\n return this._briefcasePromise;\n\n try {\n this._briefcasePromise = this.downloadAndOpen(args); // save the fact that we're working on downloading so if we timeout, we'll reuse this request.\n return await this._briefcasePromise;\n } finally {\n this._briefcasePromise = undefined; // the download and open is now done\n }\n }\n\n /** find a previously opened iModel for RPC.\n * @param accessToken necessary (only) for V2 checkpoints to refresh access token in daemon if it has expired. We use the accessToken of the current RPC request\n * to refresh the daemon, even though it will be used for all authorized users.\n * @param the IModelRpcProps to locate the opened iModel.\n */\n public static async findOpenIModel(accessToken: AccessToken, iModel: IModelRpcProps) {\n const iModelDb = IModelDb.findByKey(iModel.key);\n\n // call refreshContainerSas, just in case this is a V2 checkpoint whose sasToken is about to expire.\n await iModelDb.refreshContainerSas(accessToken);\n return iModelDb;\n }\n\n /**\n * Download and open a checkpoint or briefcase, ensuring the operation completes within a default timeout. If the time to open exceeds the timeout period,\n * a RpcPendingResponse exception is thrown\n */\n public static async open(args: DownloadAndOpenArgs): Promise<IModelDb> {\n const { activity, tokenProps, syncMode } = args;\n Logger.logTrace(loggerCategory, \"RpcBriefcaseUtility.open\", () => ({ ...tokenProps }));\n\n const timeout = args.timeout ?? 1000;\n if (syncMode === SyncMode.PullOnly || syncMode === SyncMode.PullAndPush) {\n const briefcaseDb = await BeDuration.race(timeout, this.openBriefcase(args));\n\n if (briefcaseDb === undefined) {\n Logger.logTrace(loggerCategory, \"Open briefcase - pending\", () => ({ ...tokenProps }));\n throw new RpcPendingResponse();\n }\n // note: usage is logged in the function BriefcaseManager.downloadNewBriefcaseAndOpen\n return briefcaseDb;\n }\n\n assert(undefined !== tokenProps.iModelId);\n assert(undefined !== tokenProps.iTwinId);\n assert(undefined !== tokenProps.changeset);\n\n const checkpoint: CheckpointProps = {\n iModelId: tokenProps.iModelId,\n iTwinId: tokenProps.iTwinId,\n changeset: tokenProps.changeset,\n accessToken: activity.accessToken,\n };\n\n // opening a checkpoint, readonly.\n let db: SnapshotDb | void;\n // first check if it's already open\n db = SnapshotDb.tryFindByKey(CheckpointManager.getKey(checkpoint));\n if (db) {\n Logger.logTrace(loggerCategory, \"Checkpoint was already open\", () => ({ ...tokenProps }));\n BriefcaseManager.logUsage(db);\n return db;\n }\n\n try {\n // now try V2 checkpoint\n db = await SnapshotDb.openCheckpointV2(checkpoint);\n Logger.logTrace(loggerCategory, \"using V2 checkpoint briefcase\", () => ({ ...tokenProps }));\n } catch (e) {\n Logger.logTrace(loggerCategory, \"unable to open V2 checkpoint - falling back to V1 checkpoint\", () => ({ error: BentleyError.getErrorProps(e), ...tokenProps }));\n\n // this isn't a v2 checkpoint. Set up a race between the specified timeout period and the open. Throw an RpcPendingResponse exception if the timeout happens first.\n const request = {\n checkpoint,\n localFile: V1CheckpointManager.getFileName(checkpoint),\n aliasFiles: [],\n };\n db = await BeDuration.race(timeout, V1CheckpointManager.getCheckpointDb(request));\n\n if (db === undefined) {\n Logger.logTrace(loggerCategory, \"Open V1 checkpoint - pending\", () => ({ ...tokenProps }));\n throw new RpcPendingResponse();\n }\n Logger.logTrace(loggerCategory, \"Opened V1 checkpoint\", () => ({ ...tokenProps }));\n }\n\n BriefcaseManager.logUsage(db, activity);\n return db;\n }\n\n public static async openWithTimeout(activity: RpcActivity, tokenProps: IModelRpcOpenProps, syncMode: SyncMode, timeout: number = 1000): Promise<IModelConnectionProps> {\n if (tokenProps.iModelId)\n await IModelHost.tileStorage?.initialize(tokenProps.iModelId);\n return (await this.open({ activity, tokenProps, syncMode, timeout })).toJSON();\n }\n\n}\n"]}
1
+ {"version":3,"file":"RpcBriefcaseUtility.js","sourceRoot":"","sources":["../../../src/rpc-impl/RpcBriefcaseUtility.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 RpcInterface\r\n */\r\n\r\nimport { AccessToken, assert, BeDuration, BentleyError, IModelStatus, Logger } from \"@itwin/core-bentley\";\r\nimport {\r\n BriefcaseProps, IModelConnectionProps, IModelRpcOpenProps, IModelRpcProps, IModelVersion, RpcActivity, RpcPendingResponse, SyncMode,\r\n} from \"@itwin/core-common\";\r\nimport { BackendLoggerCategory } from \"../BackendLoggerCategory\";\r\nimport { BriefcaseManager, RequestNewBriefcaseArg } from \"../BriefcaseManager\";\r\nimport { CheckpointManager, CheckpointProps, V1CheckpointManager } from \"../CheckpointManager\";\r\nimport { BriefcaseDb, IModelDb, SnapshotDb } from \"../IModelDb\";\r\nimport { IModelHost } from \"../IModelHost\";\r\nimport { IModelJsFs } from \"../IModelJsFs\";\r\n\r\nconst loggerCategory: string = BackendLoggerCategory.IModelDb;\r\n\r\n/** @internal */\r\nexport interface DownloadAndOpenArgs {\r\n activity: RpcActivity;\r\n tokenProps: IModelRpcOpenProps;\r\n syncMode: SyncMode;\r\n fileNameResolvers?: ((arg: BriefcaseProps) => string)[];\r\n timeout?: number;\r\n forceDownload?: boolean;\r\n}\r\n/**\r\n * Utility to open the iModel for RPC interfaces\r\n * @internal\r\n */\r\nexport class RpcBriefcaseUtility {\r\n\r\n private static async downloadAndOpen(args: DownloadAndOpenArgs): Promise<BriefcaseDb> {\r\n const { activity, tokenProps } = args;\r\n const accessToken = activity.accessToken;\r\n assert(undefined !== tokenProps.iModelId);\r\n\r\n const iModelId = tokenProps.iModelId;\r\n let myBriefcaseIds: number[];\r\n if (args.syncMode === SyncMode.PullOnly) {\r\n myBriefcaseIds = [0]; // PullOnly means briefcaseId 0\r\n } else {\r\n // check with iModelHub and see if we already have acquired any briefcaseIds\r\n myBriefcaseIds = await IModelHost.hubAccess.getMyBriefcaseIds({ accessToken, iModelId });\r\n }\r\n\r\n const resolvers = args.fileNameResolvers ?? [(arg) => BriefcaseManager.getFileName(arg)];\r\n\r\n // see if we can open any of the briefcaseIds we already acquired from iModelHub\r\n if (resolvers) {\r\n for (const resolver of resolvers) {\r\n for (const briefcaseId of myBriefcaseIds) {\r\n const fileName = resolver({ briefcaseId, iModelId });\r\n if (IModelJsFs.existsSync(fileName)) {\r\n const briefcaseDb = BriefcaseDb.findByFilename(fileName);\r\n if (briefcaseDb !== undefined)\r\n return briefcaseDb as BriefcaseDb;\r\n try {\r\n if (args.forceDownload)\r\n throw new Error(); // causes delete below\r\n const db = await BriefcaseDb.open({ fileName });\r\n if (db.changeset.id !== tokenProps.changeset?.id) {\r\n assert(undefined !== tokenProps.changeset);\r\n const toIndex = tokenProps.changeset?.index ??\r\n (await IModelHost.hubAccess.getChangesetFromVersion({ accessToken, iModelId, version: IModelVersion.asOfChangeSet(tokenProps.changeset.id) })).index;\r\n await BriefcaseManager.pullAndApplyChangesets(db, { accessToken, toIndex });\r\n }\r\n return db;\r\n } catch (error: any) {\r\n if (!(error.errorNumber === IModelStatus.AlreadyOpen))\r\n // somehow we have this briefcaseId and the file exists, but we can't open it. Delete it.\r\n await BriefcaseManager.deleteBriefcaseFiles(fileName, accessToken);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // no local briefcase available. Download one and open it.\r\n assert(undefined !== tokenProps.iTwinId);\r\n const request: RequestNewBriefcaseArg = {\r\n accessToken,\r\n iTwinId: tokenProps.iTwinId,\r\n iModelId,\r\n briefcaseId: args.syncMode === SyncMode.PullOnly ? 0 : undefined, // if briefcaseId is undefined, we'll acquire a new one.\r\n };\r\n\r\n const props = await BriefcaseManager.downloadBriefcase(request);\r\n return BriefcaseDb.open(props);\r\n }\r\n\r\n private static _briefcasePromise: Promise<BriefcaseDb> | undefined;\r\n private static async openBriefcase(args: DownloadAndOpenArgs): Promise<BriefcaseDb> {\r\n if (this._briefcasePromise)\r\n return this._briefcasePromise;\r\n\r\n try {\r\n this._briefcasePromise = this.downloadAndOpen(args); // save the fact that we're working on downloading so if we timeout, we'll reuse this request.\r\n return await this._briefcasePromise;\r\n } finally {\r\n this._briefcasePromise = undefined; // the download and open is now done\r\n }\r\n }\r\n\r\n /** find a previously opened iModel for RPC.\r\n * @param accessToken necessary (only) for V2 checkpoints to refresh access token in daemon if it has expired. We use the accessToken of the current RPC request\r\n * to refresh the daemon, even though it will be used for all authorized users.\r\n * @param the IModelRpcProps to locate the opened iModel.\r\n */\r\n public static async findOpenIModel(accessToken: AccessToken, iModel: IModelRpcProps) {\r\n const iModelDb = IModelDb.findByKey(iModel.key);\r\n\r\n // call refreshContainerSas, just in case this is a V2 checkpoint whose sasToken is about to expire.\r\n await iModelDb.refreshContainerSas(accessToken);\r\n return iModelDb;\r\n }\r\n\r\n /**\r\n * Download and open a checkpoint or briefcase, ensuring the operation completes within a default timeout. If the time to open exceeds the timeout period,\r\n * a RpcPendingResponse exception is thrown\r\n */\r\n public static async open(args: DownloadAndOpenArgs): Promise<IModelDb> {\r\n const { activity, tokenProps, syncMode } = args;\r\n Logger.logTrace(loggerCategory, \"RpcBriefcaseUtility.open\", () => ({ ...tokenProps }));\r\n\r\n const timeout = args.timeout ?? 1000;\r\n if (syncMode === SyncMode.PullOnly || syncMode === SyncMode.PullAndPush) {\r\n const briefcaseDb = await BeDuration.race(timeout, this.openBriefcase(args));\r\n\r\n if (briefcaseDb === undefined) {\r\n Logger.logTrace(loggerCategory, \"Open briefcase - pending\", () => ({ ...tokenProps }));\r\n throw new RpcPendingResponse();\r\n }\r\n // note: usage is logged in the function BriefcaseManager.downloadNewBriefcaseAndOpen\r\n return briefcaseDb;\r\n }\r\n\r\n assert(undefined !== tokenProps.iModelId);\r\n assert(undefined !== tokenProps.iTwinId);\r\n assert(undefined !== tokenProps.changeset);\r\n\r\n const checkpoint: CheckpointProps = {\r\n iModelId: tokenProps.iModelId,\r\n iTwinId: tokenProps.iTwinId,\r\n changeset: tokenProps.changeset,\r\n accessToken: activity.accessToken,\r\n };\r\n\r\n // opening a checkpoint, readonly.\r\n let db: SnapshotDb | void;\r\n // first check if it's already open\r\n db = SnapshotDb.tryFindByKey(CheckpointManager.getKey(checkpoint));\r\n if (db) {\r\n Logger.logTrace(loggerCategory, \"Checkpoint was already open\", () => ({ ...tokenProps }));\r\n BriefcaseManager.logUsage(db);\r\n return db;\r\n }\r\n\r\n try {\r\n // now try V2 checkpoint\r\n db = await SnapshotDb.openCheckpointV2(checkpoint);\r\n Logger.logTrace(loggerCategory, \"using V2 checkpoint briefcase\", () => ({ ...tokenProps }));\r\n } catch (e) {\r\n Logger.logTrace(loggerCategory, \"unable to open V2 checkpoint - falling back to V1 checkpoint\", () => ({ error: BentleyError.getErrorProps(e), ...tokenProps }));\r\n\r\n // this isn't a v2 checkpoint. Set up a race between the specified timeout period and the open. Throw an RpcPendingResponse exception if the timeout happens first.\r\n const request = {\r\n checkpoint,\r\n localFile: V1CheckpointManager.getFileName(checkpoint),\r\n aliasFiles: [],\r\n };\r\n db = await BeDuration.race(timeout, V1CheckpointManager.getCheckpointDb(request));\r\n\r\n if (db === undefined) {\r\n Logger.logTrace(loggerCategory, \"Open V1 checkpoint - pending\", () => ({ ...tokenProps }));\r\n throw new RpcPendingResponse();\r\n }\r\n Logger.logTrace(loggerCategory, \"Opened V1 checkpoint\", () => ({ ...tokenProps }));\r\n }\r\n\r\n BriefcaseManager.logUsage(db, activity);\r\n return db;\r\n }\r\n\r\n public static async openWithTimeout(activity: RpcActivity, tokenProps: IModelRpcOpenProps, syncMode: SyncMode, timeout: number = 1000): Promise<IModelConnectionProps> {\r\n if (tokenProps.iModelId)\r\n await IModelHost.tileStorage?.initialize(tokenProps.iModelId);\r\n return (await this.open({ activity, tokenProps, syncMode, timeout })).toJSON();\r\n }\r\n\r\n}\r\n"]}
@@ -1,17 +1,17 @@
1
- /** @packageDocumentation
2
- * @module RpcInterface
3
- */
4
- import { IModelConnectionProps, IModelRpcProps, RpcInterface, SnapshotIModelRpcInterface, SnapshotOpenOptions } from "@itwin/core-common";
5
- /** The backend implementation of SnapshotIModelRpcInterface.
6
- * @internal
7
- */
8
- export declare class SnapshotIModelRpcImpl extends RpcInterface implements SnapshotIModelRpcInterface {
9
- static register(): void;
10
- /** Ask the backend to open a snapshot iModel from a file name that is resolved by the backend. */
11
- openFile(filePath: string, opts?: SnapshotOpenOptions): Promise<IModelConnectionProps>;
12
- /** Ask the backend to open a snapshot iModel from a key that is resolved by the backend. */
13
- openRemote(fileKey: string, opts?: SnapshotOpenOptions): Promise<IModelConnectionProps>;
14
- /** Ask the backend to close a snapshot iModel. */
15
- close(tokenProps: IModelRpcProps): Promise<boolean>;
16
- }
1
+ /** @packageDocumentation
2
+ * @module RpcInterface
3
+ */
4
+ import { IModelConnectionProps, IModelRpcProps, RpcInterface, SnapshotIModelRpcInterface, SnapshotOpenOptions } from "@itwin/core-common";
5
+ /** The backend implementation of SnapshotIModelRpcInterface.
6
+ * @internal
7
+ */
8
+ export declare class SnapshotIModelRpcImpl extends RpcInterface implements SnapshotIModelRpcInterface {
9
+ static register(): void;
10
+ /** Ask the backend to open a snapshot iModel from a file name that is resolved by the backend. */
11
+ openFile(filePath: string, opts?: SnapshotOpenOptions): Promise<IModelConnectionProps>;
12
+ /** Ask the backend to open a snapshot iModel from a key that is resolved by the backend. */
13
+ openRemote(fileKey: string, opts?: SnapshotOpenOptions): Promise<IModelConnectionProps>;
14
+ /** Ask the backend to close a snapshot iModel. */
15
+ close(tokenProps: IModelRpcProps): Promise<boolean>;
16
+ }
17
17
  //# sourceMappingURL=SnapshotIModelRpcImpl.d.ts.map