@itwin/core-backend 3.5.0-dev.4 → 3.5.0-dev.41

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 (257) hide show
  1. package/CHANGELOG.md +70 -1
  2. package/lib/cjs/AliCloudStorageService.d.ts +23 -23
  3. package/lib/cjs/AliCloudStorageService.js +71 -71
  4. package/lib/cjs/AliCloudStorageService.js.map +1 -1
  5. package/lib/cjs/BackendHubAccess.d.ts +224 -224
  6. package/lib/cjs/BackendHubAccess.js +41 -41
  7. package/lib/cjs/BackendHubAccess.js.map +1 -1
  8. package/lib/cjs/BackendLoggerCategory.d.ts +91 -91
  9. package/lib/cjs/BackendLoggerCategory.js +99 -99
  10. package/lib/cjs/BackendLoggerCategory.js.map +1 -1
  11. package/lib/cjs/BisCoreSchema.d.ts +21 -21
  12. package/lib/cjs/BisCoreSchema.js +60 -60
  13. package/lib/cjs/BisCoreSchema.js.map +1 -1
  14. package/lib/cjs/BriefcaseManager.d.ts +170 -165
  15. package/lib/cjs/BriefcaseManager.d.ts.map +1 -1
  16. package/lib/cjs/BriefcaseManager.js +413 -405
  17. package/lib/cjs/BriefcaseManager.js.map +1 -1
  18. package/lib/cjs/Category.d.ts +153 -153
  19. package/lib/cjs/Category.js +243 -243
  20. package/lib/cjs/Category.js.map +1 -1
  21. package/lib/cjs/ChangeSummaryManager.d.ts +187 -187
  22. package/lib/cjs/ChangeSummaryManager.d.ts.map +1 -1
  23. package/lib/cjs/ChangeSummaryManager.js +447 -445
  24. package/lib/cjs/ChangeSummaryManager.js.map +1 -1
  25. package/lib/cjs/ChangedElementsDb.d.ts +99 -99
  26. package/lib/cjs/ChangedElementsDb.js +165 -165
  27. package/lib/cjs/ChangedElementsDb.js.map +1 -1
  28. package/lib/cjs/ChangedElementsManager.d.ts +39 -39
  29. package/lib/cjs/ChangedElementsManager.js +88 -88
  30. package/lib/cjs/ChangedElementsManager.js.map +1 -1
  31. package/lib/cjs/CheckpointManager.d.ts +120 -120
  32. package/lib/cjs/CheckpointManager.js +343 -343
  33. package/lib/cjs/CheckpointManager.js.map +1 -1
  34. package/lib/cjs/ClassRegistry.d.ts +72 -71
  35. package/lib/cjs/ClassRegistry.d.ts.map +1 -1
  36. package/lib/cjs/ClassRegistry.js +243 -215
  37. package/lib/cjs/ClassRegistry.js.map +1 -1
  38. package/lib/cjs/CloudSqlite.d.ts +350 -349
  39. package/lib/cjs/CloudSqlite.d.ts.map +1 -1
  40. package/lib/cjs/CloudSqlite.js +152 -151
  41. package/lib/cjs/CloudSqlite.js.map +1 -1
  42. package/lib/cjs/CloudStorageBackend.d.ts +58 -58
  43. package/lib/cjs/CloudStorageBackend.js +173 -173
  44. package/lib/cjs/CloudStorageBackend.js.map +1 -1
  45. package/lib/cjs/CodeService.d.ts +396 -396
  46. package/lib/cjs/CodeService.js +63 -63
  47. package/lib/cjs/CodeService.js.map +1 -1
  48. package/lib/cjs/CodeSpecs.d.ts +50 -50
  49. package/lib/cjs/CodeSpecs.js +112 -112
  50. package/lib/cjs/CodeSpecs.js.map +1 -1
  51. package/lib/cjs/ConcurrentQuery.d.ts +11 -11
  52. package/lib/cjs/ConcurrentQuery.js +30 -30
  53. package/lib/cjs/ConcurrentQuery.js.map +1 -1
  54. package/lib/cjs/CustomViewState3dCreator.d.ts +21 -32
  55. package/lib/cjs/CustomViewState3dCreator.d.ts.map +1 -1
  56. package/lib/cjs/CustomViewState3dCreator.js +81 -113
  57. package/lib/cjs/CustomViewState3dCreator.js.map +1 -1
  58. package/lib/cjs/DevTools.d.ts +71 -71
  59. package/lib/cjs/DevTools.js +154 -154
  60. package/lib/cjs/DevTools.js.map +1 -1
  61. package/lib/cjs/DisplayStyle.d.ts +106 -106
  62. package/lib/cjs/DisplayStyle.d.ts.map +1 -1
  63. package/lib/cjs/DisplayStyle.js +256 -256
  64. package/lib/cjs/DisplayStyle.js.map +1 -1
  65. package/lib/cjs/ECDb.d.ts +191 -191
  66. package/lib/cjs/ECDb.js +350 -350
  67. package/lib/cjs/ECDb.js.map +1 -1
  68. package/lib/cjs/ECSchemaXmlContext.d.ts +18 -18
  69. package/lib/cjs/ECSchemaXmlContext.js +41 -41
  70. package/lib/cjs/ECSchemaXmlContext.js.map +1 -1
  71. package/lib/cjs/ECSqlStatement.d.ts +466 -466
  72. package/lib/cjs/ECSqlStatement.js +791 -791
  73. package/lib/cjs/ECSqlStatement.js.map +1 -1
  74. package/lib/cjs/Element.d.ts +1102 -1109
  75. package/lib/cjs/Element.d.ts.map +1 -1
  76. package/lib/cjs/Element.js +1416 -1420
  77. package/lib/cjs/Element.js.map +1 -1
  78. package/lib/cjs/ElementAspect.d.ts +158 -156
  79. package/lib/cjs/ElementAspect.d.ts.map +1 -1
  80. package/lib/cjs/ElementAspect.js +186 -178
  81. package/lib/cjs/ElementAspect.js.map +1 -1
  82. package/lib/cjs/ElementGraphics.d.ts +9 -9
  83. package/lib/cjs/ElementGraphics.js +41 -41
  84. package/lib/cjs/ElementGraphics.js.map +1 -1
  85. package/lib/cjs/ElementTreeWalker.d.ts +162 -162
  86. package/lib/cjs/ElementTreeWalker.js +409 -409
  87. package/lib/cjs/ElementTreeWalker.js.map +1 -1
  88. package/lib/cjs/Entity.d.ts +106 -76
  89. package/lib/cjs/Entity.d.ts.map +1 -1
  90. package/lib/cjs/Entity.js +134 -82
  91. package/lib/cjs/Entity.js.map +1 -1
  92. package/lib/cjs/EntityReferences.d.ts +50 -0
  93. package/lib/cjs/EntityReferences.d.ts.map +1 -0
  94. package/lib/cjs/EntityReferences.js +96 -0
  95. package/lib/cjs/EntityReferences.js.map +1 -0
  96. package/lib/cjs/ExportGraphics.d.ts +317 -317
  97. package/lib/cjs/ExportGraphics.js +208 -208
  98. package/lib/cjs/ExportGraphics.js.map +1 -1
  99. package/lib/cjs/ExternalSource.d.ts +96 -94
  100. package/lib/cjs/ExternalSource.d.ts.map +1 -1
  101. package/lib/cjs/ExternalSource.js +131 -125
  102. package/lib/cjs/ExternalSource.js.map +1 -1
  103. package/lib/cjs/GeoCoordConfig.d.ts +19 -19
  104. package/lib/cjs/GeoCoordConfig.d.ts.map +1 -1
  105. package/lib/cjs/GeoCoordConfig.js +81 -82
  106. package/lib/cjs/GeoCoordConfig.js.map +1 -1
  107. package/lib/cjs/GeometrySummary.d.ts +4 -4
  108. package/lib/cjs/GeometrySummary.js +380 -380
  109. package/lib/cjs/GeometrySummary.js.map +1 -1
  110. package/lib/cjs/HubMock.d.ts +94 -93
  111. package/lib/cjs/HubMock.d.ts.map +1 -1
  112. package/lib/cjs/HubMock.js +222 -190
  113. package/lib/cjs/HubMock.js.map +1 -1
  114. package/lib/cjs/IModelCloneContext.d.ts +8 -85
  115. package/lib/cjs/IModelCloneContext.d.ts.map +1 -1
  116. package/lib/cjs/IModelCloneContext.js +15 -150
  117. package/lib/cjs/IModelCloneContext.js.map +1 -1
  118. package/lib/cjs/IModelDb.d.ts +1183 -1164
  119. package/lib/cjs/IModelDb.d.ts.map +1 -1
  120. package/lib/cjs/IModelDb.js +2374 -2324
  121. package/lib/cjs/IModelDb.js.map +1 -1
  122. package/lib/cjs/IModelElementCloneContext.d.ts +90 -0
  123. package/lib/cjs/IModelElementCloneContext.d.ts.map +1 -0
  124. package/lib/cjs/IModelElementCloneContext.js +160 -0
  125. package/lib/cjs/IModelElementCloneContext.js.map +1 -0
  126. package/lib/cjs/IModelHost.d.ts +369 -361
  127. package/lib/cjs/IModelHost.d.ts.map +1 -1
  128. package/lib/cjs/IModelHost.js +492 -489
  129. package/lib/cjs/IModelHost.js.map +1 -1
  130. package/lib/cjs/IModelJsFs.d.ts +62 -62
  131. package/lib/cjs/IModelJsFs.js +140 -140
  132. package/lib/cjs/IModelJsFs.js.map +1 -1
  133. package/lib/cjs/IpcHost.d.ts +104 -98
  134. package/lib/cjs/IpcHost.d.ts.map +1 -1
  135. package/lib/cjs/IpcHost.js +278 -234
  136. package/lib/cjs/IpcHost.js.map +1 -1
  137. package/lib/cjs/LineStyle.d.ts +311 -311
  138. package/lib/cjs/LineStyle.js +295 -295
  139. package/lib/cjs/LineStyle.js.map +1 -1
  140. package/lib/cjs/LocalHub.d.ts +162 -162
  141. package/lib/cjs/LocalHub.js +587 -587
  142. package/lib/cjs/LocalHub.js.map +1 -1
  143. package/lib/cjs/LocalhostIpcHost.d.ts +20 -20
  144. package/lib/cjs/LocalhostIpcHost.js +81 -81
  145. package/lib/cjs/LocalhostIpcHost.js.map +1 -1
  146. package/lib/cjs/Material.d.ts +103 -103
  147. package/lib/cjs/Material.js +147 -147
  148. package/lib/cjs/Material.js.map +1 -1
  149. package/lib/cjs/Model.d.ts +392 -386
  150. package/lib/cjs/Model.d.ts.map +1 -1
  151. package/lib/cjs/Model.js +485 -471
  152. package/lib/cjs/Model.js.map +1 -1
  153. package/lib/cjs/NativeAppStorage.d.ts +51 -51
  154. package/lib/cjs/NativeAppStorage.js +202 -202
  155. package/lib/cjs/NativeAppStorage.js.map +1 -1
  156. package/lib/cjs/NativeHost.d.ts +52 -52
  157. package/lib/cjs/NativeHost.d.ts.map +1 -1
  158. package/lib/cjs/NativeHost.js +163 -168
  159. package/lib/cjs/NativeHost.js.map +1 -1
  160. package/lib/cjs/NavigationRelationship.d.ts +156 -156
  161. package/lib/cjs/NavigationRelationship.js +225 -225
  162. package/lib/cjs/NavigationRelationship.js.map +1 -1
  163. package/lib/cjs/PromiseMemoizer.d.ts +51 -51
  164. package/lib/cjs/PromiseMemoizer.d.ts.map +1 -1
  165. package/lib/cjs/PromiseMemoizer.js +101 -101
  166. package/lib/cjs/PromiseMemoizer.js.map +1 -1
  167. package/lib/cjs/PropertyStore.d.ts +132 -132
  168. package/lib/cjs/PropertyStore.js +11 -11
  169. package/lib/cjs/PropertyStore.js.map +1 -1
  170. package/lib/cjs/Relationship.d.ts +416 -400
  171. package/lib/cjs/Relationship.d.ts.map +1 -1
  172. package/lib/cjs/Relationship.js +494 -465
  173. package/lib/cjs/Relationship.js.map +1 -1
  174. package/lib/cjs/RpcBackend.d.ts +28 -28
  175. package/lib/cjs/RpcBackend.js +126 -126
  176. package/lib/cjs/RpcBackend.js.map +1 -1
  177. package/lib/cjs/SQLiteDb.d.ts +219 -219
  178. package/lib/cjs/SQLiteDb.js +214 -214
  179. package/lib/cjs/SQLiteDb.js.map +1 -1
  180. package/lib/cjs/Schema.d.ts +55 -55
  181. package/lib/cjs/Schema.js +83 -83
  182. package/lib/cjs/Schema.js.map +1 -1
  183. package/lib/cjs/ServerBasedLocks.d.ts +57 -57
  184. package/lib/cjs/ServerBasedLocks.js +168 -168
  185. package/lib/cjs/ServerBasedLocks.js.map +1 -1
  186. package/lib/cjs/SqliteStatement.d.ts +360 -283
  187. package/lib/cjs/SqliteStatement.d.ts.map +1 -1
  188. package/lib/cjs/SqliteStatement.js +586 -448
  189. package/lib/cjs/SqliteStatement.js.map +1 -1
  190. package/lib/cjs/Texture.d.ts +58 -58
  191. package/lib/cjs/Texture.js +82 -82
  192. package/lib/cjs/Texture.js.map +1 -1
  193. package/lib/cjs/TileStorage.d.ts +18 -18
  194. package/lib/cjs/TileStorage.js +90 -90
  195. package/lib/cjs/TileStorage.js.map +1 -1
  196. package/lib/cjs/TxnManager.d.ts +202 -202
  197. package/lib/cjs/TxnManager.js +356 -356
  198. package/lib/cjs/TxnManager.js.map +1 -1
  199. package/lib/cjs/ViewDefinition.d.ts +439 -435
  200. package/lib/cjs/ViewDefinition.d.ts.map +1 -1
  201. package/lib/cjs/ViewDefinition.js +646 -635
  202. package/lib/cjs/ViewDefinition.js.map +1 -1
  203. package/lib/cjs/ViewStateHydrator.d.ts +13 -13
  204. package/lib/cjs/ViewStateHydrator.js +103 -103
  205. package/lib/cjs/ViewStateHydrator.js.map +1 -1
  206. package/lib/cjs/assets/IModelChange.02.00.00.ecschema.xml +90 -90
  207. package/lib/cjs/assets/Settings/Schemas/Cloud.Schema.json +67 -67
  208. package/lib/cjs/assets/Settings/Schemas/Gcs.schema.json +31 -31
  209. package/lib/cjs/assets/Settings/Schemas/Workspace.Schema.json +52 -52
  210. package/lib/cjs/assets/Settings/backend.setting.json5 +138 -138
  211. package/lib/cjs/core-backend.d.ts +184 -182
  212. package/lib/cjs/core-backend.d.ts.map +1 -1
  213. package/lib/cjs/core-backend.js +204 -202
  214. package/lib/cjs/core-backend.js.map +1 -1
  215. package/lib/cjs/domains/FunctionalElements.d.ts +101 -101
  216. package/lib/cjs/domains/FunctionalElements.js +145 -145
  217. package/lib/cjs/domains/FunctionalElements.js.map +1 -1
  218. package/lib/cjs/domains/FunctionalSchema.d.ts +13 -13
  219. package/lib/cjs/domains/FunctionalSchema.js +40 -40
  220. package/lib/cjs/domains/FunctionalSchema.js.map +1 -1
  221. package/lib/cjs/domains/GenericElements.d.ts +177 -177
  222. package/lib/cjs/domains/GenericElements.js +263 -263
  223. package/lib/cjs/domains/GenericElements.js.map +1 -1
  224. package/lib/cjs/domains/GenericSchema.d.ts +10 -10
  225. package/lib/cjs/domains/GenericSchema.js +28 -28
  226. package/lib/cjs/domains/GenericSchema.js.map +1 -1
  227. package/lib/cjs/rpc-impl/DevToolsRpcImpl.d.ts +15 -15
  228. package/lib/cjs/rpc-impl/DevToolsRpcImpl.js +32 -32
  229. package/lib/cjs/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  230. package/lib/cjs/rpc-impl/IModelReadRpcImpl.d.ts +46 -45
  231. package/lib/cjs/rpc-impl/IModelReadRpcImpl.d.ts.map +1 -1
  232. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js +287 -262
  233. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  234. package/lib/cjs/rpc-impl/IModelTileRpcImpl.d.ts +22 -22
  235. package/lib/cjs/rpc-impl/IModelTileRpcImpl.d.ts.map +1 -1
  236. package/lib/cjs/rpc-impl/IModelTileRpcImpl.js +202 -204
  237. package/lib/cjs/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  238. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.d.ts +36 -36
  239. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js +168 -168
  240. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  241. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.d.ts +16 -16
  242. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js +43 -43
  243. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  244. package/lib/cjs/rpc-impl/WipRpcImpl.d.ts +15 -15
  245. package/lib/cjs/rpc-impl/WipRpcImpl.js +37 -37
  246. package/lib/cjs/rpc-impl/WipRpcImpl.js.map +1 -1
  247. package/lib/cjs/workspace/Settings.d.ts +186 -186
  248. package/lib/cjs/workspace/Settings.js +155 -155
  249. package/lib/cjs/workspace/Settings.js.map +1 -1
  250. package/lib/cjs/workspace/SettingsSchemas.d.ts +75 -75
  251. package/lib/cjs/workspace/SettingsSchemas.js +191 -191
  252. package/lib/cjs/workspace/SettingsSchemas.js.map +1 -1
  253. package/lib/cjs/workspace/Workspace.d.ts +414 -414
  254. package/lib/cjs/workspace/Workspace.d.ts.map +1 -1
  255. package/lib/cjs/workspace/Workspace.js +543 -543
  256. package/lib/cjs/workspace/Workspace.js.map +1 -1
  257. package/package.json +14 -13
@@ -1,490 +1,493 @@
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 IModelHost
8
- */
9
- Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.FileNameResolver = exports.KnownLocations = exports.Platform = exports.IModelHost = exports.IModelHostConfiguration = void 0;
11
- const imodeljs_native_1 = require("@bentley/imodeljs-native");
12
- const object_storage_azure_1 = require("@itwin/object-storage-azure");
13
- const cloud_agnostic_core_1 = require("@itwin/cloud-agnostic-core");
14
- const object_storage_core_1 = require("@itwin/object-storage-core");
15
- const core_bentley_1 = require("@itwin/core-bentley");
16
- const core_common_1 = require("@itwin/core-common");
17
- const core_telemetry_1 = require("@itwin/core-telemetry");
18
- const inversify_1 = require("inversify");
19
- const os = require("os");
20
- const path = require("path");
21
- const BackendLoggerCategory_1 = require("./BackendLoggerCategory");
22
- const BisCoreSchema_1 = require("./BisCoreSchema");
23
- const BriefcaseManager_1 = require("./BriefcaseManager");
24
- const CloudStorageBackend_1 = require("./CloudStorageBackend");
25
- const FunctionalSchema_1 = require("./domains/FunctionalSchema");
26
- const GenericSchema_1 = require("./domains/GenericSchema");
27
- const GeoCoordConfig_1 = require("./GeoCoordConfig");
28
- const IModelJsFs_1 = require("./IModelJsFs");
29
- const DevToolsRpcImpl_1 = require("./rpc-impl/DevToolsRpcImpl");
30
- const IModelReadRpcImpl_1 = require("./rpc-impl/IModelReadRpcImpl");
31
- const IModelTileRpcImpl_1 = require("./rpc-impl/IModelTileRpcImpl");
32
- const SnapshotIModelRpcImpl_1 = require("./rpc-impl/SnapshotIModelRpcImpl");
33
- const WipRpcImpl_1 = require("./rpc-impl/WipRpcImpl");
34
- const RpcBackend_1 = require("./RpcBackend");
35
- const TileStorage_1 = require("./TileStorage");
36
- const Settings_1 = require("./workspace/Settings");
37
- const SettingsSchemas_1 = require("./workspace/SettingsSchemas");
38
- const Workspace_1 = require("./workspace/Workspace");
39
- const loggerCategory = BackendLoggerCategory_1.BackendLoggerCategory.IModelHost;
40
- /** Configuration of core-backend.
41
- * @public
42
- */
43
- class IModelHostConfiguration {
44
- constructor() {
45
- /** @internal */
46
- this.tileTreeRequestTimeout = IModelHostConfiguration.defaultTileRequestTimeout;
47
- /** @internal */
48
- this.tileContentRequestTimeout = IModelHostConfiguration.defaultTileRequestTimeout;
49
- /** @internal */
50
- this.logTileLoadTimeThreshold = IModelHostConfiguration.defaultLogTileLoadTimeThreshold;
51
- /** @internal */
52
- this.logTileSizeThreshold = IModelHostConfiguration.defaultLogTileSizeThreshold;
53
- }
54
- }
55
- exports.IModelHostConfiguration = IModelHostConfiguration;
56
- IModelHostConfiguration.defaultTileRequestTimeout = 20 * 1000;
57
- IModelHostConfiguration.defaultLogTileLoadTimeThreshold = 40;
58
- IModelHostConfiguration.defaultLogTileSizeThreshold = 20 * 1000000;
59
- /**
60
- * Settings for `IModelHost.appWorkspace`.
61
- * @note this includes the default dictionary from the SettingsSpecRegistry
62
- */
63
- class ApplicationSettings extends Settings_1.BaseSettings {
64
- constructor() {
65
- super();
66
- this._remove = SettingsSchemas_1.SettingsSchemas.onSchemaChanged.addListener(() => this.updateDefaults());
67
- this.updateDefaults();
68
- }
69
- verifyPriority(priority) {
70
- if (priority >= Settings_1.SettingsPriority.iModel) // iModel settings may not appear in ApplicationSettings
71
- throw new Error("Use IModelSettings");
72
- }
73
- updateDefaults() {
74
- const defaults = {};
75
- for (const [schemaName, val] of SettingsSchemas_1.SettingsSchemas.allSchemas) {
76
- if (val.default)
77
- defaults[schemaName] = val.default;
78
- }
79
- this.addDictionary("_default_", 0, defaults);
80
- }
81
- close() {
82
- if (this._remove) {
83
- this._remove();
84
- this._remove = undefined;
85
- }
86
- }
87
- }
88
- /** IModelHost initializes ($backend) and captures its configuration. A backend must call [[IModelHost.startup]] before using any backend classes.
89
- * See [the learning article]($docs/learning/backend/IModelHost.md)
90
- * @public
91
- */
92
- class IModelHost {
93
- constructor() { }
94
- /** @internal */
95
- static get platform() {
96
- if (this._platform === undefined)
97
- throw new Error("IModelHost.startup must be called first");
98
- return this._platform;
99
- }
100
- /** A uniqueId for this session */
101
- static get sessionId() { return this.session.sessionId; }
102
- static set sessionId(id) { this.session.sessionId = id; }
103
- /** The Id of this application - needs to be set only if it is an agent application. The applicationId will otherwise originate at the frontend. */
104
- static get applicationId() { return this.session.applicationId; }
105
- static set applicationId(id) { this.session.applicationId = id; }
106
- /** The version of this application - needs to be set if is an agent application. The applicationVersion will otherwise originate at the frontend. */
107
- static get applicationVersion() { return this.session.applicationVersion; }
108
- static set applicationVersion(version) { this.session.applicationVersion = version; }
109
- /** Root directory holding files that iTwin.js caches */
110
- static get cacheDir() { return this._cacheDir; }
111
- /** The application [[Workspace]] for this `IModelHost`
112
- * @note this `Workspace` only holds [[WorkspaceContainer]]s and [[Settings]] scoped to the currently loaded application(s).
113
- * All organization, iTwin, and iModel based containers or settings must be accessed through [[IModelDb.workspace]] and
114
- * attempting to add them to this Workspace will fail.
115
- * @beta
116
- */
117
- static get appWorkspace() { return this._appWorkspace; } // eslint-disable-line @typescript-eslint/no-non-null-assertion
118
- /** Get the current access token for this IModelHost, or a blank string if none is available.
119
- * @note for web backends, this will *always* return a blank string because the backend itself has no token (but never needs one either.)
120
- * For all IpcHosts, where this backend is servicing a single frontend, this will be the user's token. For ElectronHost, the backend
121
- * obtains the token and forwards it to the frontend.
122
- * @note accessTokens expire periodically and are automatically refreshed, if possible. Therefore tokens should not be saved, and the value
123
- * returned by this method may change over time throughout the course of a session.
124
- */
125
- static async getAccessToken() {
126
- var _a, _b;
127
- try {
128
- return (_b = (await ((_a = this.authorizationClient) === null || _a === void 0 ? void 0 : _a.getAccessToken()))) !== null && _b !== void 0 ? _b : "";
129
- }
130
- catch (e) {
131
- return "";
132
- }
133
- }
134
- /** @internal */
135
- static flushLog() {
136
- return this.platform.flushLog();
137
- }
138
- /** @internal */
139
- static loadNative() {
140
- const platform = Platform.load();
141
- this.registerPlatform(platform);
142
- }
143
- static registerPlatform(platform) {
144
- this._platform = platform;
145
- if (undefined === platform)
146
- return;
147
- platform.logger = core_bentley_1.Logger;
148
- }
149
- /** @internal */
150
- static setHubAccess(hubAccess) { this._hubAccess = hubAccess; }
151
- /** get the current hubAccess, if present.
152
- * @beta
153
- */
154
- static getHubAccess() { return this._hubAccess; }
155
- /** Provides access to the IModelHub for this IModelHost
156
- * @beta
157
- * @note If [[IModelHostOptions.hubAccess]] was undefined when initializing this class, accessing this property will throw an error.
158
- * To determine whether one is present, use [[getHubAccess]].
159
- */
160
- static get hubAccess() {
161
- if (this._hubAccess === undefined)
162
- throw new core_common_1.IModelError(core_bentley_1.IModelStatus.BadRequest, "No BackendHubAccess supplied in IModelHostOptions");
163
- return this._hubAccess;
164
- }
165
- static initializeWorkspace(configuration) {
166
- const settingAssets = path.join(KnownLocations.packageAssetsDir, "Settings");
167
- SettingsSchemas_1.SettingsSchemas.addDirectory(path.join(settingAssets, "Schemas"));
168
- this._appWorkspace = new Workspace_1.ITwinWorkspace(new ApplicationSettings(), configuration.workspace);
169
- this.appWorkspace.settings.addDirectory(settingAssets, Settings_1.SettingsPriority.defaults);
170
- GeoCoordConfig_1.GeoCoordConfig.onStartup();
171
- // allow applications to load their default settings
172
- this.onWorkspaceStartup.raiseEvent();
173
- }
174
- /** Returns true if IModelHost is started. */
175
- static get isValid() { return this._isValid; }
176
- /** This method must be called before any iTwin.js services are used.
177
- * @param options Host configuration data.
178
- * Raises [[onAfterStartup]].
179
- * @see [[shutdown]].
180
- */
181
- static async startup(options) {
182
- var _a, _b, _c, _d;
183
- if (this._isValid)
184
- return; // we're already initialized
185
- this._isValid = true;
186
- options = options !== null && options !== void 0 ? options : {};
187
- if (IModelHost.sessionId === "")
188
- IModelHost.sessionId = core_bentley_1.Guid.createValue();
189
- this.authorizationClient = options.authorizationClient;
190
- this.logStartup();
191
- this.backendVersion = require("../../package.json").version; // eslint-disable-line @typescript-eslint/no-var-requires
192
- (0, RpcBackend_1.initializeRpcBackend)(options.enableOpenTelemetry);
193
- if (this._platform === undefined) {
194
- try {
195
- this.loadNative();
196
- }
197
- catch (error) {
198
- core_bentley_1.Logger.logError(loggerCategory, "Error registering/loading the native platform API", () => (options));
199
- throw error;
200
- }
201
- }
202
- if (options.crashReportingConfig && options.crashReportingConfig.crashDir && !core_bentley_1.ProcessDetector.isElectronAppBackend && !core_bentley_1.ProcessDetector.isMobileAppBackend) {
203
- this.platform.setCrashReporting(options.crashReportingConfig);
204
- core_bentley_1.Logger.logTrace(loggerCategory, "Configured crash reporting", {
205
- enableCrashDumps: (_a = options.crashReportingConfig) === null || _a === void 0 ? void 0 : _a.enableCrashDumps,
206
- wantFullMemoryDumps: (_b = options.crashReportingConfig) === null || _b === void 0 ? void 0 : _b.wantFullMemoryDumps,
207
- enableNodeReport: (_c = options.crashReportingConfig) === null || _c === void 0 ? void 0 : _c.enableNodeReport,
208
- uploadToBentley: (_d = options.crashReportingConfig) === null || _d === void 0 ? void 0 : _d.uploadToBentley,
209
- });
210
- if (options.crashReportingConfig.enableNodeReport) {
211
- if (process.report !== undefined) {
212
- process.report.reportOnFatalError = true;
213
- process.report.reportOnUncaughtException = true;
214
- process.report.directory = options.crashReportingConfig.crashDir;
215
- core_bentley_1.Logger.logTrace(loggerCategory, "Configured Node.js crash reporting");
216
- }
217
- else {
218
- core_bentley_1.Logger.logWarning(loggerCategory, "Unable to configure Node.js crash reporting");
219
- }
220
- }
221
- }
222
- this.setupHostDirs(options);
223
- this.initializeWorkspace(options);
224
- BriefcaseManager_1.BriefcaseManager.initialize(this._briefcaseCacheDir);
225
- [
226
- IModelReadRpcImpl_1.IModelReadRpcImpl,
227
- IModelTileRpcImpl_1.IModelTileRpcImpl,
228
- SnapshotIModelRpcImpl_1.SnapshotIModelRpcImpl,
229
- WipRpcImpl_1.WipRpcImpl,
230
- DevToolsRpcImpl_1.DevToolsRpcImpl,
231
- ].forEach((rpc) => rpc.register()); // register all of the RPC implementations
232
- [
233
- BisCoreSchema_1.BisCoreSchema,
234
- GenericSchema_1.GenericSchema,
235
- FunctionalSchema_1.FunctionalSchema,
236
- ].forEach((schema) => schema.registerSchema()); // register all of the schemas
237
- if (undefined !== options.hubAccess)
238
- this._hubAccess = options.hubAccess;
239
- this.configuration = options;
240
- this.setupTileCache();
241
- process.once("beforeExit", IModelHost.shutdown);
242
- this.onAfterStartup.raiseEvent();
243
- }
244
- static logStartup() {
245
- if (!core_bentley_1.Logger.isEnabled(loggerCategory, core_bentley_1.LogLevel.Trace))
246
- return;
247
- // Extract the iModel details from environment - note this is very specific to Bentley hosted backends, but is quite useful for tracing
248
- let startupInfo = {};
249
- const serviceName = process.env.FABRIC_SERVICE_NAME;
250
- if (serviceName) {
251
- // e.g., fabric:/iModelWebViewer3.0/iModelJSGuest/1/08daaeb3-b56f-480b-9051-7efc834d18ae/512d971d-b641-4735-bb1c-c07ab3e44ce7/c1315fcce125ca40b2d405bb7809214daf8b4c85
252
- const serviceNameComponents = serviceName.split("/");
253
- if (serviceNameComponents.length === 7) {
254
- startupInfo = {
255
- ...startupInfo,
256
- iTwinId: serviceNameComponents[4],
257
- iModelId: serviceNameComponents[5],
258
- changesetId: serviceNameComponents[6],
259
- };
260
- }
261
- }
262
- core_bentley_1.Logger.logTrace(loggerCategory, "IModelHost.startup", () => startupInfo);
263
- }
264
- static setupHostDirs(configuration) {
265
- var _a;
266
- const setupDir = (dir) => {
267
- dir = path.normalize(dir);
268
- IModelJsFs_1.IModelJsFs.recursiveMkDirSync(dir);
269
- return dir;
270
- };
271
- this._cacheDir = setupDir((_a = configuration.cacheDir) !== null && _a !== void 0 ? _a : imodeljs_native_1.NativeLibrary.defaultCacheDir);
272
- this._briefcaseCacheDir = path.join(this._cacheDir, "imodels");
273
- }
274
- /** This method must be called when an iTwin.js host is shut down. Raises [[onBeforeShutdown]] */
275
- static async shutdown() {
276
- var _a;
277
- // NB: This method is set as a node listener where `this` is unbound
278
- if (!IModelHost._isValid)
279
- return;
280
- IModelHost._isValid = false;
281
- IModelHost.onBeforeShutdown.raiseEvent();
282
- IModelHost.configuration = undefined;
283
- // eslint-disable-next-line deprecation/deprecation
284
- IModelHost.tileCacheService = undefined;
285
- // eslint-disable-next-line deprecation/deprecation
286
- IModelHost.tileUploader = undefined;
287
- IModelHost.tileStorage = undefined;
288
- (_a = IModelHost._appWorkspace) === null || _a === void 0 ? void 0 : _a.close();
289
- IModelHost._appWorkspace = undefined;
290
- Workspace_1.ITwinWorkspace.finalize();
291
- process.removeListener("beforeExit", IModelHost.shutdown);
292
- }
293
- /**
294
- * Add or update a property that should be included in a crash report.
295
- * @param name The name of the property
296
- * @param value The value of the property
297
- * @alpha
298
- */
299
- static setCrashReportProperty(name, value) {
300
- (0, core_bentley_1.assert)(undefined !== this._platform);
301
- this._platform.setCrashReportProperty(name, value);
302
- }
303
- /**
304
- * Remove a previously defined property so that will not be included in a crash report.
305
- * @param name The name of the property
306
- * @alpha
307
- */
308
- static removeCrashReportProperty(name) {
309
- (0, core_bentley_1.assert)(undefined !== this._platform);
310
- this._platform.setCrashReportProperty(name, undefined);
311
- }
312
- /**
313
- * Get all properties that will be included in a crash report.
314
- * @alpha
315
- */
316
- static getCrashReportProperties() {
317
- (0, core_bentley_1.assert)(undefined !== this._platform);
318
- return this._platform.getCrashReportProperties();
319
- }
320
- /** The directory where application assets may be found */
321
- static get appAssetsDir() { return undefined !== IModelHost.configuration ? IModelHost.configuration.appAssetsDir : undefined; }
322
- /** The time, in milliseconds, for which IModelTileRpcInterface.requestTileTreeProps should wait before returning a "pending" status.
323
- * @internal
324
- */
325
- static get tileTreeRequestTimeout() {
326
- var _a, _b;
327
- return (_b = (_a = IModelHost.configuration) === null || _a === void 0 ? void 0 : _a.tileTreeRequestTimeout) !== null && _b !== void 0 ? _b : IModelHostConfiguration.defaultTileRequestTimeout;
328
- }
329
- /** The time, in milliseconds, for which IModelTileRpcInterface.requestTileContent should wait before returning a "pending" status.
330
- * @internal
331
- */
332
- static get tileContentRequestTimeout() {
333
- var _a, _b;
334
- return (_b = (_a = IModelHost.configuration) === null || _a === void 0 ? void 0 : _a.tileContentRequestTimeout) !== null && _b !== void 0 ? _b : IModelHostConfiguration.defaultTileRequestTimeout;
335
- }
336
- /** The backend will log when a tile took longer to load than this threshold in seconds. */
337
- static get logTileLoadTimeThreshold() { var _a, _b; return (_b = (_a = IModelHost.configuration) === null || _a === void 0 ? void 0 : _a.logTileLoadTimeThreshold) !== null && _b !== void 0 ? _b : IModelHostConfiguration.defaultLogTileLoadTimeThreshold; }
338
- /** The backend will log when a tile is loaded with a size in bytes above this threshold. */
339
- static get logTileSizeThreshold() { var _a, _b; return (_b = (_a = IModelHost.configuration) === null || _a === void 0 ? void 0 : _a.logTileSizeThreshold) !== null && _b !== void 0 ? _b : IModelHostConfiguration.defaultLogTileSizeThreshold; }
340
- /** Whether external tile caching is active.
341
- * @internal
342
- */
343
- static get usingExternalTileCache() {
344
- return undefined !== IModelHost.tileStorage;
345
- }
346
- /** Whether to restrict tile cache URLs by client IP address.
347
- * @internal
348
- */
349
- static get restrictTileUrlsByClientIp() { return undefined !== IModelHost.configuration && (IModelHost.configuration.restrictTileUrlsByClientIp ? true : false); }
350
- /** Whether to compress cached tiles.
351
- * @internal
352
- */
353
- static get compressCachedTiles() { var _a; return false !== ((_a = IModelHost.configuration) === null || _a === void 0 ? void 0 : _a.compressCachedTiles); }
354
- static setupTileCache() {
355
- (0, core_bentley_1.assert)(undefined !== IModelHost.configuration);
356
- const config = IModelHost.configuration;
357
- // eslint-disable-next-line deprecation/deprecation
358
- const service = config.tileCacheService;
359
- const storage = config.tileCacheStorage;
360
- const credentials = config.tileCacheAzureCredentials;
361
- if (!service && !storage && !credentials) {
362
- this.platform.setUseTileCache(true);
363
- return;
364
- }
365
- this.platform.setUseTileCache(false);
366
- // eslint-disable-next-line deprecation/deprecation
367
- IModelHost.tileUploader = new CloudStorageBackend_1.CloudStorageTileUploader();
368
- if (credentials) {
369
- if (storage || service)
370
- throw new core_common_1.IModelError(core_common_1.BentleyStatus.ERROR, "Cannot use both Azure and custom cloud storage providers for tile cache.");
371
- this.setupAzureTileCache(credentials);
372
- }
373
- if (service) {
374
- if (!storage)
375
- core_bentley_1.Logger.logWarning(loggerCategory, "Using tileCacheService without tileCacheStorage is unsupported");
376
- IModelHost.tileCacheService = service; // eslint-disable-line deprecation/deprecation
377
- }
378
- if (storage)
379
- IModelHost.tileStorage = new TileStorage_1.TileStorage(storage);
380
- }
381
- static setupAzureTileCache(credentials) {
382
- var _a;
383
- const config = {
384
- // eslint-disable-next-line @typescript-eslint/naming-convention
385
- ServerSideStorage: {
386
- dependencyName: "azure",
387
- accountName: credentials.account,
388
- accountKey: credentials.accessKey,
389
- baseUrl: (_a = credentials.baseUrl) !== null && _a !== void 0 ? _a : `https://${credentials.account}.blob.core.windows.net`,
390
- },
391
- };
392
- const ioc = new inversify_1.Container();
393
- ioc.bind(cloud_agnostic_core_1.Types.dependenciesConfig).toConstantValue(config);
394
- new object_storage_azure_1.AzureServerStorageBindings().register(ioc, config.ServerSideStorage);
395
- IModelHost.tileStorage = new TileStorage_1.TileStorage(ioc.get(object_storage_core_1.ServerStorage));
396
- // eslint-disable-next-line deprecation/deprecation
397
- IModelHost.tileCacheService = new CloudStorageBackend_1.AzureBlobStorage(credentials); // needed for backwards compatibility with old frontends
398
- }
399
- /** @internal */
400
- static computeSchemaChecksum(arg) {
401
- return this.platform.computeSchemaChecksum(arg);
402
- }
403
- }
404
- exports.IModelHost = IModelHost;
405
- /** @alpha */
406
- IModelHost.telemetry = new core_telemetry_1.TelemetryManager();
407
- IModelHost.backendVersion = "";
408
- IModelHost._cacheDir = "";
409
- /** Event raised during startup to allow loading settings data */
410
- IModelHost.onWorkspaceStartup = new core_bentley_1.BeEvent();
411
- /** Event raised just after the backend IModelHost was started */
412
- IModelHost.onAfterStartup = new core_bentley_1.BeEvent();
413
- /** Event raised just before the backend IModelHost is to be shut down */
414
- IModelHost.onBeforeShutdown = new core_bentley_1.BeEvent();
415
- /** @internal */
416
- IModelHost.session = { applicationId: "2686", applicationVersion: "1.0.0", sessionId: "" };
417
- IModelHost._isValid = false;
418
- /** Information about the platform on which the app is running. Also see [[KnownLocations]] and [[IModelJsFs]].
419
- * @public
420
- */
421
- class Platform {
422
- /** Get the name of the platform. */
423
- static get platformName() {
424
- return process.platform;
425
- }
426
- /** @internal */
427
- static load() {
428
- return core_bentley_1.ProcessDetector.isMobileAppBackend ? process._linkedBinding("iModelJsNative") : imodeljs_native_1.NativeLibrary.load();
429
- }
430
- }
431
- exports.Platform = Platform;
432
- /** Well known directories that may be used by the application. Also see [[Platform]]
433
- * @public
434
- */
435
- class KnownLocations {
436
- /** The directory where the imodeljs-native assets are stored. */
437
- static get nativeAssetsDir() { return IModelHost.platform.DgnDb.getAssetsDir(); }
438
- /** The directory where the core-backend assets are stored. */
439
- static get packageAssetsDir() {
440
- return path.join(__dirname, "assets");
441
- }
442
- /** The temporary directory. */
443
- static get tmpdir() {
444
- return os.tmpdir();
445
- }
446
- }
447
- exports.KnownLocations = KnownLocations;
448
- /** Extend this class to provide custom file name resolution behavior.
449
- * @note Only `tryResolveKey` and/or `tryResolveFileName` need to be overridden as the implementations of `resolveKey` and `resolveFileName` work for most purposes.
450
- * @see [[IModelHost.snapshotFileNameResolver]]
451
- * @public
452
- */
453
- class FileNameResolver {
454
- /** Resolve a file name from the specified key.
455
- * @param _fileKey The key that identifies the file name in a `Map` or other similar data structure.
456
- * @returns The resolved file name or `undefined` if not found.
457
- */
458
- tryResolveKey(_fileKey) { return undefined; }
459
- /** Resolve a file name from the specified key.
460
- * @param fileKey The key that identifies the file name in a `Map` or other similar data structure.
461
- * @returns The resolved file name.
462
- * @throws [[IModelError]] if not found.
463
- */
464
- resolveKey(fileKey) {
465
- const resolvedFileName = this.tryResolveKey(fileKey);
466
- if (undefined === resolvedFileName) {
467
- throw new core_common_1.IModelError(core_bentley_1.IModelStatus.NotFound, `${fileKey} not resolved`);
468
- }
469
- return resolvedFileName;
470
- }
471
- /** Resolve the input file name, which may be a partial name, into a full path file name.
472
- * @param inFileName The partial file name.
473
- * @returns The resolved full path file name or `undefined` if not found.
474
- */
475
- tryResolveFileName(inFileName) { return inFileName; }
476
- /** Resolve the input file name, which may be a partial name, into a full path file name.
477
- * @param inFileName The partial file name.
478
- * @returns The resolved full path file name.
479
- * @throws [[IModelError]] if not found.
480
- */
481
- resolveFileName(inFileName) {
482
- const resolvedFileName = this.tryResolveFileName(inFileName);
483
- if (undefined === resolvedFileName) {
484
- throw new core_common_1.IModelError(core_bentley_1.IModelStatus.NotFound, `${inFileName} not resolved`);
485
- }
486
- return resolvedFileName;
487
- }
488
- }
489
- exports.FileNameResolver = FileNameResolver;
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 IModelHost
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.FileNameResolver = exports.KnownLocations = exports.Platform = exports.IModelHost = exports.IModelHostConfiguration = void 0;
11
+ const imodeljs_native_1 = require("@bentley/imodeljs-native");
12
+ const object_storage_azure_1 = require("@itwin/object-storage-azure");
13
+ const cloud_agnostic_core_1 = require("@itwin/cloud-agnostic-core");
14
+ const object_storage_core_1 = require("@itwin/object-storage-core");
15
+ const core_bentley_1 = require("@itwin/core-bentley");
16
+ const core_common_1 = require("@itwin/core-common");
17
+ const core_telemetry_1 = require("@itwin/core-telemetry");
18
+ const inversify_1 = require("inversify");
19
+ const os = require("os");
20
+ const path = require("path");
21
+ const BackendLoggerCategory_1 = require("./BackendLoggerCategory");
22
+ const BisCoreSchema_1 = require("./BisCoreSchema");
23
+ const BriefcaseManager_1 = require("./BriefcaseManager");
24
+ const CloudStorageBackend_1 = require("./CloudStorageBackend");
25
+ const FunctionalSchema_1 = require("./domains/FunctionalSchema");
26
+ const GenericSchema_1 = require("./domains/GenericSchema");
27
+ const GeoCoordConfig_1 = require("./GeoCoordConfig");
28
+ const IModelJsFs_1 = require("./IModelJsFs");
29
+ const DevToolsRpcImpl_1 = require("./rpc-impl/DevToolsRpcImpl");
30
+ const IModelReadRpcImpl_1 = require("./rpc-impl/IModelReadRpcImpl");
31
+ const IModelTileRpcImpl_1 = require("./rpc-impl/IModelTileRpcImpl");
32
+ const SnapshotIModelRpcImpl_1 = require("./rpc-impl/SnapshotIModelRpcImpl");
33
+ const WipRpcImpl_1 = require("./rpc-impl/WipRpcImpl");
34
+ const RpcBackend_1 = require("./RpcBackend");
35
+ const TileStorage_1 = require("./TileStorage");
36
+ const Settings_1 = require("./workspace/Settings");
37
+ const SettingsSchemas_1 = require("./workspace/SettingsSchemas");
38
+ const Workspace_1 = require("./workspace/Workspace");
39
+ const loggerCategory = BackendLoggerCategory_1.BackendLoggerCategory.IModelHost;
40
+ /** Configuration of core-backend.
41
+ * @public
42
+ */
43
+ class IModelHostConfiguration {
44
+ constructor() {
45
+ /** @internal */
46
+ this.tileTreeRequestTimeout = IModelHostConfiguration.defaultTileRequestTimeout;
47
+ /** @internal */
48
+ this.tileContentRequestTimeout = IModelHostConfiguration.defaultTileRequestTimeout;
49
+ /** @internal */
50
+ this.logTileLoadTimeThreshold = IModelHostConfiguration.defaultLogTileLoadTimeThreshold;
51
+ /** @internal */
52
+ this.logTileSizeThreshold = IModelHostConfiguration.defaultLogTileSizeThreshold;
53
+ }
54
+ }
55
+ exports.IModelHostConfiguration = IModelHostConfiguration;
56
+ IModelHostConfiguration.defaultTileRequestTimeout = 20 * 1000;
57
+ IModelHostConfiguration.defaultLogTileLoadTimeThreshold = 40;
58
+ IModelHostConfiguration.defaultLogTileSizeThreshold = 20 * 1000000;
59
+ /** @internal */
60
+ IModelHostConfiguration.defaultMaxTileCacheDbSize = 1024 * 1024 * 1024;
61
+ /**
62
+ * Settings for `IModelHost.appWorkspace`.
63
+ * @note this includes the default dictionary from the SettingsSpecRegistry
64
+ */
65
+ class ApplicationSettings extends Settings_1.BaseSettings {
66
+ constructor() {
67
+ super();
68
+ this._remove = SettingsSchemas_1.SettingsSchemas.onSchemaChanged.addListener(() => this.updateDefaults());
69
+ this.updateDefaults();
70
+ }
71
+ verifyPriority(priority) {
72
+ if (priority >= Settings_1.SettingsPriority.iModel) // iModel settings may not appear in ApplicationSettings
73
+ throw new Error("Use IModelSettings");
74
+ }
75
+ updateDefaults() {
76
+ const defaults = {};
77
+ for (const [schemaName, val] of SettingsSchemas_1.SettingsSchemas.allSchemas) {
78
+ if (val.default)
79
+ defaults[schemaName] = val.default;
80
+ }
81
+ this.addDictionary("_default_", 0, defaults);
82
+ }
83
+ close() {
84
+ if (this._remove) {
85
+ this._remove();
86
+ this._remove = undefined;
87
+ }
88
+ }
89
+ }
90
+ /** IModelHost initializes ($backend) and captures its configuration. A backend must call [[IModelHost.startup]] before using any backend classes.
91
+ * See [the learning article]($docs/learning/backend/IModelHost.md)
92
+ * @public
93
+ */
94
+ class IModelHost {
95
+ constructor() { }
96
+ /** @internal */
97
+ static get platform() {
98
+ if (this._platform === undefined)
99
+ throw new Error("IModelHost.startup must be called first");
100
+ return this._platform;
101
+ }
102
+ /** A uniqueId for this session */
103
+ static get sessionId() { return this.session.sessionId; }
104
+ static set sessionId(id) { this.session.sessionId = id; }
105
+ /** The Id of this application - needs to be set only if it is an agent application. The applicationId will otherwise originate at the frontend. */
106
+ static get applicationId() { return this.session.applicationId; }
107
+ static set applicationId(id) { this.session.applicationId = id; }
108
+ /** The version of this application - needs to be set if is an agent application. The applicationVersion will otherwise originate at the frontend. */
109
+ static get applicationVersion() { return this.session.applicationVersion; }
110
+ static set applicationVersion(version) { this.session.applicationVersion = version; }
111
+ /** Root directory holding files that iTwin.js caches */
112
+ static get cacheDir() { return this._cacheDir; }
113
+ /** The application [[Workspace]] for this `IModelHost`
114
+ * @note this `Workspace` only holds [[WorkspaceContainer]]s and [[Settings]] scoped to the currently loaded application(s).
115
+ * All organization, iTwin, and iModel based containers or settings must be accessed through [[IModelDb.workspace]] and
116
+ * attempting to add them to this Workspace will fail.
117
+ * @beta
118
+ */
119
+ static get appWorkspace() { return this._appWorkspace; } // eslint-disable-line @typescript-eslint/no-non-null-assertion
120
+ /** Get the current access token for this IModelHost, or a blank string if none is available.
121
+ * @note for web backends, this will *always* return a blank string because the backend itself has no token (but never needs one either.)
122
+ * For all IpcHosts, where this backend is servicing a single frontend, this will be the user's token. For ElectronHost, the backend
123
+ * obtains the token and forwards it to the frontend.
124
+ * @note accessTokens expire periodically and are automatically refreshed, if possible. Therefore tokens should not be saved, and the value
125
+ * returned by this method may change over time throughout the course of a session.
126
+ */
127
+ static async getAccessToken() {
128
+ var _a, _b;
129
+ try {
130
+ return (_b = (await ((_a = this.authorizationClient) === null || _a === void 0 ? void 0 : _a.getAccessToken()))) !== null && _b !== void 0 ? _b : "";
131
+ }
132
+ catch (e) {
133
+ return "";
134
+ }
135
+ }
136
+ /** @internal */
137
+ static flushLog() {
138
+ return this.platform.flushLog();
139
+ }
140
+ /** @internal */
141
+ static loadNative() {
142
+ const platform = Platform.load();
143
+ this.registerPlatform(platform);
144
+ }
145
+ static registerPlatform(platform) {
146
+ this._platform = platform;
147
+ if (undefined === platform)
148
+ return;
149
+ platform.logger = core_bentley_1.Logger;
150
+ }
151
+ /** @internal */
152
+ static setHubAccess(hubAccess) { this._hubAccess = hubAccess; }
153
+ /** get the current hubAccess, if present.
154
+ * @beta
155
+ */
156
+ static getHubAccess() { return this._hubAccess; }
157
+ /** Provides access to the IModelHub for this IModelHost
158
+ * @beta
159
+ * @note If [[IModelHostOptions.hubAccess]] was undefined when initializing this class, accessing this property will throw an error.
160
+ * To determine whether one is present, use [[getHubAccess]].
161
+ */
162
+ static get hubAccess() {
163
+ if (this._hubAccess === undefined)
164
+ throw new core_common_1.IModelError(core_bentley_1.IModelStatus.BadRequest, "No BackendHubAccess supplied in IModelHostOptions");
165
+ return this._hubAccess;
166
+ }
167
+ static initializeWorkspace(configuration) {
168
+ const settingAssets = path.join(KnownLocations.packageAssetsDir, "Settings");
169
+ SettingsSchemas_1.SettingsSchemas.addDirectory(path.join(settingAssets, "Schemas"));
170
+ this._appWorkspace = new Workspace_1.ITwinWorkspace(new ApplicationSettings(), configuration.workspace);
171
+ this.appWorkspace.settings.addDirectory(settingAssets, Settings_1.SettingsPriority.defaults);
172
+ GeoCoordConfig_1.GeoCoordConfig.onStartup();
173
+ // allow applications to load their default settings
174
+ this.onWorkspaceStartup.raiseEvent();
175
+ }
176
+ /** Returns true if IModelHost is started. */
177
+ static get isValid() { return this._isValid; }
178
+ /** This method must be called before any iTwin.js services are used.
179
+ * @param options Host configuration data.
180
+ * Raises [[onAfterStartup]].
181
+ * @see [[shutdown]].
182
+ */
183
+ static async startup(options) {
184
+ var _a, _b, _c, _d;
185
+ if (this._isValid)
186
+ return; // we're already initialized
187
+ this._isValid = true;
188
+ options = options !== null && options !== void 0 ? options : {};
189
+ if (IModelHost.sessionId === "")
190
+ IModelHost.sessionId = core_bentley_1.Guid.createValue();
191
+ this.authorizationClient = options.authorizationClient;
192
+ this.logStartup();
193
+ this.backendVersion = require("../../package.json").version; // eslint-disable-line @typescript-eslint/no-var-requires
194
+ (0, RpcBackend_1.initializeRpcBackend)(options.enableOpenTelemetry);
195
+ if (this._platform === undefined) {
196
+ try {
197
+ this.loadNative();
198
+ }
199
+ catch (error) {
200
+ core_bentley_1.Logger.logError(loggerCategory, "Error registering/loading the native platform API", () => (options));
201
+ throw error;
202
+ }
203
+ }
204
+ if (options.crashReportingConfig && options.crashReportingConfig.crashDir && !core_bentley_1.ProcessDetector.isElectronAppBackend && !core_bentley_1.ProcessDetector.isMobileAppBackend) {
205
+ this.platform.setCrashReporting(options.crashReportingConfig);
206
+ core_bentley_1.Logger.logTrace(loggerCategory, "Configured crash reporting", {
207
+ enableCrashDumps: (_a = options.crashReportingConfig) === null || _a === void 0 ? void 0 : _a.enableCrashDumps,
208
+ wantFullMemoryDumps: (_b = options.crashReportingConfig) === null || _b === void 0 ? void 0 : _b.wantFullMemoryDumps,
209
+ enableNodeReport: (_c = options.crashReportingConfig) === null || _c === void 0 ? void 0 : _c.enableNodeReport,
210
+ uploadToBentley: (_d = options.crashReportingConfig) === null || _d === void 0 ? void 0 : _d.uploadToBentley,
211
+ });
212
+ if (options.crashReportingConfig.enableNodeReport) {
213
+ if (process.report !== undefined) {
214
+ process.report.reportOnFatalError = true;
215
+ process.report.reportOnUncaughtException = true;
216
+ process.report.directory = options.crashReportingConfig.crashDir;
217
+ core_bentley_1.Logger.logTrace(loggerCategory, "Configured Node.js crash reporting");
218
+ }
219
+ else {
220
+ core_bentley_1.Logger.logWarning(loggerCategory, "Unable to configure Node.js crash reporting");
221
+ }
222
+ }
223
+ }
224
+ this.setupHostDirs(options);
225
+ this.initializeWorkspace(options);
226
+ BriefcaseManager_1.BriefcaseManager.initialize(this._briefcaseCacheDir);
227
+ [
228
+ IModelReadRpcImpl_1.IModelReadRpcImpl,
229
+ IModelTileRpcImpl_1.IModelTileRpcImpl,
230
+ SnapshotIModelRpcImpl_1.SnapshotIModelRpcImpl,
231
+ WipRpcImpl_1.WipRpcImpl,
232
+ DevToolsRpcImpl_1.DevToolsRpcImpl,
233
+ ].forEach((rpc) => rpc.register()); // register all of the RPC implementations
234
+ [
235
+ BisCoreSchema_1.BisCoreSchema,
236
+ GenericSchema_1.GenericSchema,
237
+ FunctionalSchema_1.FunctionalSchema,
238
+ ].forEach((schema) => schema.registerSchema()); // register all of the schemas
239
+ if (undefined !== options.hubAccess)
240
+ this._hubAccess = options.hubAccess;
241
+ this.configuration = options;
242
+ this.setupTileCache();
243
+ process.once("beforeExit", IModelHost.shutdown);
244
+ this.onAfterStartup.raiseEvent();
245
+ }
246
+ static logStartup() {
247
+ if (!core_bentley_1.Logger.isEnabled(loggerCategory, core_bentley_1.LogLevel.Trace))
248
+ return;
249
+ // Extract the iModel details from environment - note this is very specific to Bentley hosted backends, but is quite useful for tracing
250
+ let startupInfo = {};
251
+ const serviceName = process.env.FABRIC_SERVICE_NAME;
252
+ if (serviceName) {
253
+ // e.g., fabric:/iModelWebViewer3.0/iModelJSGuest/1/08daaeb3-b56f-480b-9051-7efc834d18ae/512d971d-b641-4735-bb1c-c07ab3e44ce7/c1315fcce125ca40b2d405bb7809214daf8b4c85
254
+ const serviceNameComponents = serviceName.split("/");
255
+ if (serviceNameComponents.length === 7) {
256
+ startupInfo = {
257
+ ...startupInfo,
258
+ iTwinId: serviceNameComponents[4],
259
+ iModelId: serviceNameComponents[5],
260
+ changesetId: serviceNameComponents[6],
261
+ };
262
+ }
263
+ }
264
+ core_bentley_1.Logger.logTrace(loggerCategory, "IModelHost.startup", () => startupInfo);
265
+ }
266
+ static setupHostDirs(configuration) {
267
+ var _a;
268
+ const setupDir = (dir) => {
269
+ dir = path.normalize(dir);
270
+ IModelJsFs_1.IModelJsFs.recursiveMkDirSync(dir);
271
+ return dir;
272
+ };
273
+ this._cacheDir = setupDir((_a = configuration.cacheDir) !== null && _a !== void 0 ? _a : imodeljs_native_1.NativeLibrary.defaultCacheDir);
274
+ this._briefcaseCacheDir = path.join(this._cacheDir, "imodels");
275
+ }
276
+ /** This method must be called when an iTwin.js host is shut down. Raises [[onBeforeShutdown]] */
277
+ static async shutdown() {
278
+ var _a;
279
+ // NB: This method is set as a node listener where `this` is unbound
280
+ if (!IModelHost._isValid)
281
+ return;
282
+ IModelHost._isValid = false;
283
+ IModelHost.onBeforeShutdown.raiseEvent();
284
+ IModelHost.configuration = undefined;
285
+ // eslint-disable-next-line deprecation/deprecation
286
+ IModelHost.tileCacheService = undefined;
287
+ // eslint-disable-next-line deprecation/deprecation
288
+ IModelHost.tileUploader = undefined;
289
+ IModelHost.tileStorage = undefined;
290
+ (_a = IModelHost._appWorkspace) === null || _a === void 0 ? void 0 : _a.close();
291
+ IModelHost._appWorkspace = undefined;
292
+ Workspace_1.ITwinWorkspace.finalize();
293
+ process.removeListener("beforeExit", IModelHost.shutdown);
294
+ }
295
+ /**
296
+ * Add or update a property that should be included in a crash report.
297
+ * @param name The name of the property
298
+ * @param value The value of the property
299
+ * @alpha
300
+ */
301
+ static setCrashReportProperty(name, value) {
302
+ (0, core_bentley_1.assert)(undefined !== this._platform);
303
+ this._platform.setCrashReportProperty(name, value);
304
+ }
305
+ /**
306
+ * Remove a previously defined property so that will not be included in a crash report.
307
+ * @param name The name of the property
308
+ * @alpha
309
+ */
310
+ static removeCrashReportProperty(name) {
311
+ (0, core_bentley_1.assert)(undefined !== this._platform);
312
+ this._platform.setCrashReportProperty(name, undefined);
313
+ }
314
+ /**
315
+ * Get all properties that will be included in a crash report.
316
+ * @alpha
317
+ */
318
+ static getCrashReportProperties() {
319
+ (0, core_bentley_1.assert)(undefined !== this._platform);
320
+ return this._platform.getCrashReportProperties();
321
+ }
322
+ /** The directory where application assets may be found */
323
+ static get appAssetsDir() { return undefined !== IModelHost.configuration ? IModelHost.configuration.appAssetsDir : undefined; }
324
+ /** The time, in milliseconds, for which IModelTileRpcInterface.requestTileTreeProps should wait before returning a "pending" status.
325
+ * @internal
326
+ */
327
+ static get tileTreeRequestTimeout() {
328
+ var _a, _b;
329
+ return (_b = (_a = IModelHost.configuration) === null || _a === void 0 ? void 0 : _a.tileTreeRequestTimeout) !== null && _b !== void 0 ? _b : IModelHostConfiguration.defaultTileRequestTimeout;
330
+ }
331
+ /** The time, in milliseconds, for which IModelTileRpcInterface.requestTileContent should wait before returning a "pending" status.
332
+ * @internal
333
+ */
334
+ static get tileContentRequestTimeout() {
335
+ var _a, _b;
336
+ return (_b = (_a = IModelHost.configuration) === null || _a === void 0 ? void 0 : _a.tileContentRequestTimeout) !== null && _b !== void 0 ? _b : IModelHostConfiguration.defaultTileRequestTimeout;
337
+ }
338
+ /** The backend will log when a tile took longer to load than this threshold in seconds. */
339
+ static get logTileLoadTimeThreshold() { var _a, _b; return (_b = (_a = IModelHost.configuration) === null || _a === void 0 ? void 0 : _a.logTileLoadTimeThreshold) !== null && _b !== void 0 ? _b : IModelHostConfiguration.defaultLogTileLoadTimeThreshold; }
340
+ /** The backend will log when a tile is loaded with a size in bytes above this threshold. */
341
+ static get logTileSizeThreshold() { var _a, _b; return (_b = (_a = IModelHost.configuration) === null || _a === void 0 ? void 0 : _a.logTileSizeThreshold) !== null && _b !== void 0 ? _b : IModelHostConfiguration.defaultLogTileSizeThreshold; }
342
+ /** Whether external tile caching is active.
343
+ * @internal
344
+ */
345
+ static get usingExternalTileCache() {
346
+ return undefined !== IModelHost.tileStorage;
347
+ }
348
+ /** Whether to restrict tile cache URLs by client IP address.
349
+ * @internal
350
+ */
351
+ static get restrictTileUrlsByClientIp() { return undefined !== IModelHost.configuration && (IModelHost.configuration.restrictTileUrlsByClientIp ? true : false); }
352
+ /** Whether to compress cached tiles.
353
+ * @internal
354
+ */
355
+ static get compressCachedTiles() { var _a; return false !== ((_a = IModelHost.configuration) === null || _a === void 0 ? void 0 : _a.compressCachedTiles); }
356
+ static setupTileCache() {
357
+ var _a;
358
+ (0, core_bentley_1.assert)(undefined !== IModelHost.configuration);
359
+ const config = IModelHost.configuration;
360
+ // eslint-disable-next-line deprecation/deprecation
361
+ const service = config.tileCacheService;
362
+ const storage = config.tileCacheStorage;
363
+ const credentials = config.tileCacheAzureCredentials;
364
+ if (!service && !storage && !credentials) {
365
+ this.platform.setMaxTileCacheSize((_a = config.maxTileCacheDbSize) !== null && _a !== void 0 ? _a : IModelHostConfiguration.defaultMaxTileCacheDbSize);
366
+ return;
367
+ }
368
+ this.platform.setMaxTileCacheSize(0);
369
+ // eslint-disable-next-line deprecation/deprecation
370
+ IModelHost.tileUploader = new CloudStorageBackend_1.CloudStorageTileUploader();
371
+ if (credentials) {
372
+ if (storage || service)
373
+ throw new core_common_1.IModelError(core_common_1.BentleyStatus.ERROR, "Cannot use both Azure and custom cloud storage providers for tile cache.");
374
+ this.setupAzureTileCache(credentials);
375
+ }
376
+ if (service) {
377
+ if (!storage)
378
+ core_bentley_1.Logger.logWarning(loggerCategory, "Using tileCacheService without tileCacheStorage is unsupported");
379
+ IModelHost.tileCacheService = service; // eslint-disable-line deprecation/deprecation
380
+ }
381
+ if (storage)
382
+ IModelHost.tileStorage = new TileStorage_1.TileStorage(storage);
383
+ }
384
+ static setupAzureTileCache(credentials) {
385
+ var _a;
386
+ const config = {
387
+ // eslint-disable-next-line @typescript-eslint/naming-convention
388
+ ServerSideStorage: {
389
+ dependencyName: "azure",
390
+ accountName: credentials.account,
391
+ accountKey: credentials.accessKey,
392
+ baseUrl: (_a = credentials.baseUrl) !== null && _a !== void 0 ? _a : `https://${credentials.account}.blob.core.windows.net`,
393
+ },
394
+ };
395
+ const ioc = new inversify_1.Container();
396
+ ioc.bind(cloud_agnostic_core_1.Types.dependenciesConfig).toConstantValue(config);
397
+ new object_storage_azure_1.AzureServerStorageBindings().register(ioc, config.ServerSideStorage);
398
+ IModelHost.tileStorage = new TileStorage_1.TileStorage(ioc.get(object_storage_core_1.ServerStorage));
399
+ // eslint-disable-next-line deprecation/deprecation
400
+ IModelHost.tileCacheService = new CloudStorageBackend_1.AzureBlobStorage(credentials); // needed for backwards compatibility with old frontends
401
+ }
402
+ /** @internal */
403
+ static computeSchemaChecksum(arg) {
404
+ return this.platform.computeSchemaChecksum(arg);
405
+ }
406
+ }
407
+ exports.IModelHost = IModelHost;
408
+ /** @alpha */
409
+ IModelHost.telemetry = new core_telemetry_1.TelemetryManager();
410
+ IModelHost.backendVersion = "";
411
+ IModelHost._cacheDir = "";
412
+ /** Event raised during startup to allow loading settings data */
413
+ IModelHost.onWorkspaceStartup = new core_bentley_1.BeEvent();
414
+ /** Event raised just after the backend IModelHost was started */
415
+ IModelHost.onAfterStartup = new core_bentley_1.BeEvent();
416
+ /** Event raised just before the backend IModelHost is to be shut down */
417
+ IModelHost.onBeforeShutdown = new core_bentley_1.BeEvent();
418
+ /** @internal */
419
+ IModelHost.session = { applicationId: "2686", applicationVersion: "1.0.0", sessionId: "" };
420
+ IModelHost._isValid = false;
421
+ /** Information about the platform on which the app is running. Also see [[KnownLocations]] and [[IModelJsFs]].
422
+ * @public
423
+ */
424
+ class Platform {
425
+ /** Get the name of the platform. */
426
+ static get platformName() {
427
+ return process.platform;
428
+ }
429
+ /** @internal */
430
+ static load() {
431
+ return core_bentley_1.ProcessDetector.isMobileAppBackend ? process._linkedBinding("iModelJsNative") : imodeljs_native_1.NativeLibrary.load();
432
+ }
433
+ }
434
+ exports.Platform = Platform;
435
+ /** Well known directories that may be used by the application. Also see [[Platform]]
436
+ * @public
437
+ */
438
+ class KnownLocations {
439
+ /** The directory where the imodeljs-native assets are stored. */
440
+ static get nativeAssetsDir() { return IModelHost.platform.DgnDb.getAssetsDir(); }
441
+ /** The directory where the core-backend assets are stored. */
442
+ static get packageAssetsDir() {
443
+ return path.join(__dirname, "assets");
444
+ }
445
+ /** The temporary directory. */
446
+ static get tmpdir() {
447
+ return os.tmpdir();
448
+ }
449
+ }
450
+ exports.KnownLocations = KnownLocations;
451
+ /** Extend this class to provide custom file name resolution behavior.
452
+ * @note Only `tryResolveKey` and/or `tryResolveFileName` need to be overridden as the implementations of `resolveKey` and `resolveFileName` work for most purposes.
453
+ * @see [[IModelHost.snapshotFileNameResolver]]
454
+ * @public
455
+ */
456
+ class FileNameResolver {
457
+ /** Resolve a file name from the specified key.
458
+ * @param _fileKey The key that identifies the file name in a `Map` or other similar data structure.
459
+ * @returns The resolved file name or `undefined` if not found.
460
+ */
461
+ tryResolveKey(_fileKey) { return undefined; }
462
+ /** Resolve a file name from the specified key.
463
+ * @param fileKey The key that identifies the file name in a `Map` or other similar data structure.
464
+ * @returns The resolved file name.
465
+ * @throws [[IModelError]] if not found.
466
+ */
467
+ resolveKey(fileKey) {
468
+ const resolvedFileName = this.tryResolveKey(fileKey);
469
+ if (undefined === resolvedFileName) {
470
+ throw new core_common_1.IModelError(core_bentley_1.IModelStatus.NotFound, `${fileKey} not resolved`);
471
+ }
472
+ return resolvedFileName;
473
+ }
474
+ /** Resolve the input file name, which may be a partial name, into a full path file name.
475
+ * @param inFileName The partial file name.
476
+ * @returns The resolved full path file name or `undefined` if not found.
477
+ */
478
+ tryResolveFileName(inFileName) { return inFileName; }
479
+ /** Resolve the input file name, which may be a partial name, into a full path file name.
480
+ * @param inFileName The partial file name.
481
+ * @returns The resolved full path file name.
482
+ * @throws [[IModelError]] if not found.
483
+ */
484
+ resolveFileName(inFileName) {
485
+ const resolvedFileName = this.tryResolveFileName(inFileName);
486
+ if (undefined === resolvedFileName) {
487
+ throw new core_common_1.IModelError(core_bentley_1.IModelStatus.NotFound, `${inFileName} not resolved`);
488
+ }
489
+ return resolvedFileName;
490
+ }
491
+ }
492
+ exports.FileNameResolver = FileNameResolver;
490
493
  //# sourceMappingURL=IModelHost.js.map