@itwin/core-backend 4.0.0-dev.1 → 4.0.0-dev.100

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 (270) hide show
  1. package/CHANGELOG.md +68 -1
  2. package/lib/cjs/BackendHubAccess.d.ts +226 -224
  3. package/lib/cjs/BackendHubAccess.d.ts.map +1 -1
  4. package/lib/cjs/BackendHubAccess.js +41 -41
  5. package/lib/cjs/BackendHubAccess.js.map +1 -1
  6. package/lib/cjs/BackendLoggerCategory.d.ts +90 -91
  7. package/lib/cjs/BackendLoggerCategory.d.ts.map +1 -1
  8. package/lib/cjs/BackendLoggerCategory.js +98 -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/BlobContainerService.d.ts +120 -0
  13. package/lib/cjs/BlobContainerService.d.ts.map +1 -0
  14. package/lib/cjs/BlobContainerService.js +18 -0
  15. package/lib/cjs/BlobContainerService.js.map +1 -0
  16. package/lib/cjs/BriefcaseManager.d.ts +184 -170
  17. package/lib/cjs/BriefcaseManager.d.ts.map +1 -1
  18. package/lib/cjs/BriefcaseManager.js +421 -414
  19. package/lib/cjs/BriefcaseManager.js.map +1 -1
  20. package/lib/cjs/Category.d.ts +153 -153
  21. package/lib/cjs/Category.js +243 -243
  22. package/lib/cjs/Category.js.map +1 -1
  23. package/lib/cjs/ChangeSummaryManager.d.ts +187 -187
  24. package/lib/cjs/ChangeSummaryManager.js +444 -445
  25. package/lib/cjs/ChangeSummaryManager.js.map +1 -1
  26. package/lib/cjs/ChangedElementsDb.d.ts +99 -99
  27. package/lib/cjs/ChangedElementsDb.js +165 -165
  28. package/lib/cjs/ChangedElementsManager.d.ts +39 -39
  29. package/lib/cjs/ChangedElementsManager.js +88 -88
  30. package/lib/cjs/ChannelControl.d.ts +70 -0
  31. package/lib/cjs/ChannelControl.d.ts.map +1 -0
  32. package/lib/cjs/ChannelControl.js +89 -0
  33. package/lib/cjs/ChannelControl.js.map +1 -0
  34. package/lib/cjs/CheckpointManager.d.ts +121 -121
  35. package/lib/cjs/CheckpointManager.d.ts.map +1 -1
  36. package/lib/cjs/CheckpointManager.js +351 -349
  37. package/lib/cjs/CheckpointManager.js.map +1 -1
  38. package/lib/cjs/ClassRegistry.d.ts +79 -79
  39. package/lib/cjs/ClassRegistry.js +249 -245
  40. package/lib/cjs/ClassRegistry.js.map +1 -1
  41. package/lib/cjs/CloudSqlite.d.ts +572 -350
  42. package/lib/cjs/CloudSqlite.d.ts.map +1 -1
  43. package/lib/cjs/CloudSqlite.js +374 -153
  44. package/lib/cjs/CloudSqlite.js.map +1 -1
  45. package/lib/cjs/CodeService.d.ts +399 -396
  46. package/lib/cjs/CodeService.d.ts.map +1 -1
  47. package/lib/cjs/CodeService.js +63 -63
  48. package/lib/cjs/CodeService.js.map +1 -1
  49. package/lib/cjs/CodeSpecs.d.ts +58 -55
  50. package/lib/cjs/CodeSpecs.d.ts.map +1 -1
  51. package/lib/cjs/CodeSpecs.js +154 -124
  52. package/lib/cjs/CodeSpecs.js.map +1 -1
  53. package/lib/cjs/ConcurrentQuery.d.ts +13 -13
  54. package/lib/cjs/ConcurrentQuery.d.ts.map +1 -1
  55. package/lib/cjs/ConcurrentQuery.js +36 -36
  56. package/lib/cjs/CustomViewState3dCreator.d.ts +21 -21
  57. package/lib/cjs/CustomViewState3dCreator.d.ts.map +1 -1
  58. package/lib/cjs/CustomViewState3dCreator.js +80 -81
  59. package/lib/cjs/CustomViewState3dCreator.js.map +1 -1
  60. package/lib/cjs/DevTools.d.ts +74 -71
  61. package/lib/cjs/DevTools.d.ts.map +1 -1
  62. package/lib/cjs/DevTools.js +156 -154
  63. package/lib/cjs/DevTools.js.map +1 -1
  64. package/lib/cjs/DisplayStyle.d.ts +104 -106
  65. package/lib/cjs/DisplayStyle.d.ts.map +1 -1
  66. package/lib/cjs/DisplayStyle.js +251 -256
  67. package/lib/cjs/DisplayStyle.js.map +1 -1
  68. package/lib/cjs/ECDb.d.ts +194 -191
  69. package/lib/cjs/ECDb.d.ts.map +1 -1
  70. package/lib/cjs/ECDb.js +351 -350
  71. package/lib/cjs/ECDb.js.map +1 -1
  72. package/lib/cjs/ECSchemaXmlContext.d.ts +18 -18
  73. package/lib/cjs/ECSchemaXmlContext.d.ts.map +1 -1
  74. package/lib/cjs/ECSchemaXmlContext.js +41 -41
  75. package/lib/cjs/ECSqlStatement.d.ts +473 -473
  76. package/lib/cjs/ECSqlStatement.js +791 -791
  77. package/lib/cjs/Element.d.ts +1105 -1109
  78. package/lib/cjs/Element.d.ts.map +1 -1
  79. package/lib/cjs/Element.js +1416 -1427
  80. package/lib/cjs/Element.js.map +1 -1
  81. package/lib/cjs/ElementAspect.d.ts +175 -179
  82. package/lib/cjs/ElementAspect.d.ts.map +1 -1
  83. package/lib/cjs/ElementAspect.js +202 -211
  84. package/lib/cjs/ElementAspect.js.map +1 -1
  85. package/lib/cjs/ElementGraphics.d.ts +9 -9
  86. package/lib/cjs/ElementGraphics.js +41 -41
  87. package/lib/cjs/ElementGraphics.js.map +1 -1
  88. package/lib/cjs/ElementTreeWalker.d.ts +162 -162
  89. package/lib/cjs/ElementTreeWalker.d.ts.map +1 -1
  90. package/lib/cjs/ElementTreeWalker.js +409 -409
  91. package/lib/cjs/ElementTreeWalker.js.map +1 -1
  92. package/lib/cjs/Entity.d.ts +102 -106
  93. package/lib/cjs/Entity.d.ts.map +1 -1
  94. package/lib/cjs/Entity.js +118 -134
  95. package/lib/cjs/Entity.js.map +1 -1
  96. package/lib/cjs/EntityReferences.d.ts +49 -49
  97. package/lib/cjs/EntityReferences.d.ts.map +1 -1
  98. package/lib/cjs/EntityReferences.js +95 -95
  99. package/lib/cjs/ExportGraphics.d.ts +317 -317
  100. package/lib/cjs/ExportGraphics.d.ts.map +1 -1
  101. package/lib/cjs/ExportGraphics.js +208 -208
  102. package/lib/cjs/ExternalSource.d.ts +95 -96
  103. package/lib/cjs/ExternalSource.d.ts.map +1 -1
  104. package/lib/cjs/ExternalSource.js +130 -131
  105. package/lib/cjs/ExternalSource.js.map +1 -1
  106. package/lib/cjs/GeoCoordConfig.d.ts +19 -19
  107. package/lib/cjs/GeoCoordConfig.js +85 -85
  108. package/lib/cjs/GeoCoordConfig.js.map +1 -1
  109. package/lib/cjs/GeometrySummary.d.ts +4 -4
  110. package/lib/cjs/GeometrySummary.js +333 -333
  111. package/lib/cjs/GeometrySummary.js.map +1 -1
  112. package/lib/cjs/HubMock.d.ts +94 -94
  113. package/lib/cjs/HubMock.js +220 -222
  114. package/lib/cjs/HubMock.js.map +1 -1
  115. package/lib/cjs/IModelCloneContext.d.ts +8 -8
  116. package/lib/cjs/IModelCloneContext.d.ts.map +1 -1
  117. package/lib/cjs/IModelCloneContext.js +15 -15
  118. package/lib/cjs/IModelDb.d.ts +1222 -1196
  119. package/lib/cjs/IModelDb.d.ts.map +1 -1
  120. package/lib/cjs/IModelDb.js +2389 -2392
  121. package/lib/cjs/IModelDb.js.map +1 -1
  122. package/lib/cjs/IModelElementCloneContext.d.ts +89 -89
  123. package/lib/cjs/IModelElementCloneContext.js +159 -159
  124. package/lib/cjs/IModelHost.d.ts +370 -369
  125. package/lib/cjs/IModelHost.d.ts.map +1 -1
  126. package/lib/cjs/IModelHost.js +476 -496
  127. package/lib/cjs/IModelHost.js.map +1 -1
  128. package/lib/cjs/IModelJsFs.d.ts +62 -62
  129. package/lib/cjs/IModelJsFs.js +139 -140
  130. package/lib/cjs/IModelJsFs.js.map +1 -1
  131. package/lib/cjs/IpcHost.d.ts +104 -104
  132. package/lib/cjs/IpcHost.js +276 -278
  133. package/lib/cjs/IpcHost.js.map +1 -1
  134. package/lib/cjs/LineStyle.d.ts +311 -311
  135. package/lib/cjs/LineStyle.js +295 -295
  136. package/lib/cjs/LocalHub.d.ts +162 -162
  137. package/lib/cjs/LocalHub.d.ts.map +1 -1
  138. package/lib/cjs/LocalHub.js +579 -584
  139. package/lib/cjs/LocalHub.js.map +1 -1
  140. package/lib/cjs/LocalhostIpcHost.d.ts +21 -20
  141. package/lib/cjs/LocalhostIpcHost.d.ts.map +1 -1
  142. package/lib/cjs/LocalhostIpcHost.js +79 -81
  143. package/lib/cjs/LocalhostIpcHost.js.map +1 -1
  144. package/lib/cjs/Material.d.ts +131 -131
  145. package/lib/cjs/Material.d.ts.map +1 -1
  146. package/lib/cjs/Material.js +185 -181
  147. package/lib/cjs/Material.js.map +1 -1
  148. package/lib/cjs/Model.d.ts +391 -392
  149. package/lib/cjs/Model.d.ts.map +1 -1
  150. package/lib/cjs/Model.js +487 -485
  151. package/lib/cjs/Model.js.map +1 -1
  152. package/lib/cjs/NativeAppStorage.d.ts +51 -51
  153. package/lib/cjs/NativeAppStorage.js +202 -202
  154. package/lib/cjs/NativeAppStorage.js.map +1 -1
  155. package/lib/cjs/NativeHost.d.ts +52 -52
  156. package/lib/cjs/NativeHost.d.ts.map +1 -1
  157. package/lib/cjs/NativeHost.js +158 -163
  158. package/lib/cjs/NativeHost.js.map +1 -1
  159. package/lib/cjs/NavigationRelationship.d.ts +156 -156
  160. package/lib/cjs/NavigationRelationship.js +225 -225
  161. package/lib/cjs/NavigationRelationship.js.map +1 -1
  162. package/lib/cjs/PromiseMemoizer.d.ts +51 -51
  163. package/lib/cjs/PromiseMemoizer.d.ts.map +1 -1
  164. package/lib/cjs/PromiseMemoizer.js +101 -101
  165. package/lib/cjs/PromiseMemoizer.js.map +1 -1
  166. package/lib/cjs/PropertyStore.d.ts +123 -132
  167. package/lib/cjs/PropertyStore.d.ts.map +1 -1
  168. package/lib/cjs/PropertyStore.js +179 -11
  169. package/lib/cjs/PropertyStore.js.map +1 -1
  170. package/lib/cjs/Relationship.d.ts +413 -416
  171. package/lib/cjs/Relationship.d.ts.map +1 -1
  172. package/lib/cjs/Relationship.js +491 -494
  173. package/lib/cjs/Relationship.js.map +1 -1
  174. package/lib/cjs/RpcBackend.d.ts +5 -5
  175. package/lib/cjs/RpcBackend.js +32 -32
  176. package/lib/cjs/SQLiteDb.d.ts +317 -219
  177. package/lib/cjs/SQLiteDb.d.ts.map +1 -1
  178. package/lib/cjs/SQLiteDb.js +318 -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 -360
  187. package/lib/cjs/SqliteStatement.d.ts.map +1 -1
  188. package/lib/cjs/SqliteStatement.js +586 -586
  189. package/lib/cjs/Texture.d.ts +58 -58
  190. package/lib/cjs/Texture.js +82 -82
  191. package/lib/cjs/Texture.js.map +1 -1
  192. package/lib/cjs/TileStorage.d.ts +44 -18
  193. package/lib/cjs/TileStorage.d.ts.map +1 -1
  194. package/lib/cjs/TileStorage.js +109 -90
  195. package/lib/cjs/TileStorage.js.map +1 -1
  196. package/lib/cjs/TxnManager.d.ts +202 -202
  197. package/lib/cjs/TxnManager.d.ts.map +1 -1
  198. package/lib/cjs/TxnManager.js +356 -356
  199. package/lib/cjs/TxnManager.js.map +1 -1
  200. package/lib/cjs/ViewDefinition.d.ts +429 -439
  201. package/lib/cjs/ViewDefinition.d.ts.map +1 -1
  202. package/lib/cjs/ViewDefinition.js +640 -646
  203. package/lib/cjs/ViewDefinition.js.map +1 -1
  204. package/lib/cjs/ViewStateHydrator.d.ts +13 -13
  205. package/lib/cjs/ViewStateHydrator.js +103 -103
  206. package/lib/cjs/core-backend.d.ts +181 -184
  207. package/lib/cjs/core-backend.d.ts.map +1 -1
  208. package/lib/cjs/core-backend.js +205 -204
  209. package/lib/cjs/core-backend.js.map +1 -1
  210. package/lib/cjs/domains/FunctionalElements.d.ts +101 -101
  211. package/lib/cjs/domains/FunctionalElements.js +145 -145
  212. package/lib/cjs/domains/FunctionalElements.js.map +1 -1
  213. package/lib/cjs/domains/FunctionalSchema.d.ts +13 -13
  214. package/lib/cjs/domains/FunctionalSchema.d.ts.map +1 -1
  215. package/lib/cjs/domains/FunctionalSchema.js +39 -40
  216. package/lib/cjs/domains/FunctionalSchema.js.map +1 -1
  217. package/lib/cjs/domains/GenericElements.d.ts +177 -177
  218. package/lib/cjs/domains/GenericElements.js +263 -263
  219. package/lib/cjs/domains/GenericSchema.d.ts +10 -10
  220. package/lib/cjs/domains/GenericSchema.js +28 -28
  221. package/lib/cjs/rpc/multipart.d.ts +11 -11
  222. package/lib/cjs/rpc/multipart.js +71 -71
  223. package/lib/cjs/rpc/tracing.d.ts +28 -28
  224. package/lib/cjs/rpc/tracing.js +73 -74
  225. package/lib/cjs/rpc/tracing.js.map +1 -1
  226. package/lib/cjs/rpc/web/logging.d.ts +9 -9
  227. package/lib/cjs/rpc/web/logging.js +43 -43
  228. package/lib/cjs/rpc/web/request.d.ts +6 -6
  229. package/lib/cjs/rpc/web/request.js +73 -74
  230. package/lib/cjs/rpc/web/request.js.map +1 -1
  231. package/lib/cjs/rpc/web/response.d.ts +6 -6
  232. package/lib/cjs/rpc/web/response.js +105 -106
  233. package/lib/cjs/rpc/web/response.js.map +1 -1
  234. package/lib/cjs/rpc-impl/DevToolsRpcImpl.d.ts +15 -15
  235. package/lib/cjs/rpc-impl/DevToolsRpcImpl.js +32 -32
  236. package/lib/cjs/rpc-impl/IModelReadRpcImpl.d.ts +47 -47
  237. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js +293 -294
  238. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  239. package/lib/cjs/rpc-impl/IModelTileRpcImpl.d.ts +20 -22
  240. package/lib/cjs/rpc-impl/IModelTileRpcImpl.d.ts.map +1 -1
  241. package/lib/cjs/rpc-impl/IModelTileRpcImpl.js +193 -205
  242. package/lib/cjs/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  243. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.d.ts +36 -36
  244. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js +166 -168
  245. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  246. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.d.ts +16 -16
  247. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js +42 -43
  248. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  249. package/lib/cjs/rpc-impl/WipRpcImpl.d.ts +15 -15
  250. package/lib/cjs/rpc-impl/WipRpcImpl.js +37 -37
  251. package/lib/cjs/workspace/Settings.d.ts +186 -186
  252. package/lib/cjs/workspace/Settings.d.ts.map +1 -1
  253. package/lib/cjs/workspace/Settings.js +155 -155
  254. package/lib/cjs/workspace/Settings.js.map +1 -1
  255. package/lib/cjs/workspace/SettingsSchemas.d.ts +75 -75
  256. package/lib/cjs/workspace/SettingsSchemas.js +190 -191
  257. package/lib/cjs/workspace/SettingsSchemas.js.map +1 -1
  258. package/lib/cjs/workspace/Workspace.d.ts +411 -414
  259. package/lib/cjs/workspace/Workspace.d.ts.map +1 -1
  260. package/lib/cjs/workspace/Workspace.js +521 -543
  261. package/lib/cjs/workspace/Workspace.js.map +1 -1
  262. package/package.json +25 -28
  263. package/lib/cjs/AliCloudStorageService.d.ts +0 -24
  264. package/lib/cjs/AliCloudStorageService.d.ts.map +0 -1
  265. package/lib/cjs/AliCloudStorageService.js +0 -72
  266. package/lib/cjs/AliCloudStorageService.js.map +0 -1
  267. package/lib/cjs/CloudStorageBackend.d.ts +0 -59
  268. package/lib/cjs/CloudStorageBackend.d.ts.map +0 -1
  269. package/lib/cjs/CloudStorageBackend.js +0 -174
  270. package/lib/cjs/CloudStorageBackend.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"LocalHub.js","sourceRoot":"","sources":["../../src/LocalHub.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { join } from \"path\";\r\nimport { DbResult, GuidString, Id64String, IModelHubStatus, IModelStatus, OpenMode } from \"@itwin/core-bentley\";\r\nimport {\r\n BriefcaseId, BriefcaseIdValue, ChangesetFileProps, ChangesetId, ChangesetIdWithIndex, ChangesetIndex, ChangesetIndexOrId, ChangesetProps,\r\n ChangesetRange, IModelError, LocalDirName, LocalFileName,\r\n} from \"@itwin/core-common\";\r\nimport { LockConflict, LockMap, LockProps, LockState } from \"./BackendHubAccess\";\r\nimport { BriefcaseManager } from \"./BriefcaseManager\";\r\nimport { BriefcaseLocalValue, IModelDb, SnapshotDb } from \"./IModelDb\";\r\nimport { IModelJsFs } from \"./IModelJsFs\";\r\nimport { SQLiteDb } from \"./SQLiteDb\";\r\n\r\n// cspell:ignore rowid\r\n\r\n/** @internal */\r\ninterface MockBriefcaseIdProps {\r\n id: BriefcaseId;\r\n user: string; // Just an AccessToken that simulates a user\r\n alias: string;\r\n assigned: boolean;\r\n}\r\n\r\n/** @internal */\r\ninterface LocalHubProps {\r\n readonly iTwinId: GuidString;\r\n readonly iModelId: GuidString;\r\n readonly iModelName: string;\r\n readonly description?: string;\r\n readonly version0?: string;\r\n readonly noLocks?: true;\r\n}\r\n\r\ninterface LocksEntry {\r\n id: Id64String;\r\n level: LockState;\r\n lastCsIndex?: ChangesetIndex;\r\n briefcaseId?: BriefcaseId;\r\n}\r\n\r\ninterface LockStatusNone {\r\n state: LockState.None;\r\n lastCsIndex?: ChangesetIndex;\r\n}\r\n\r\n/** @internal exported for tests. */\r\nexport interface LockStatusExclusive {\r\n state: LockState.Exclusive;\r\n briefcaseId: BriefcaseId;\r\n lastCsIndex?: ChangesetIndex;\r\n}\r\n\r\n/** @internal exported for tests. */\r\nexport interface LockStatusShared {\r\n state: LockState.Shared;\r\n sharedBy: Set<BriefcaseId>;\r\n lastCsIndex?: ChangesetIndex;\r\n}\r\n\r\ninterface BriefcaseIdAndChangeset {\r\n changeset: ChangesetIdWithIndex;\r\n briefcaseId: BriefcaseId;\r\n}\r\n\r\ntype LockStatus = LockStatusNone | LockStatusExclusive | LockStatusShared;\r\n\r\n/**\r\n * A \"local\" mock for IModelHub to provide access to a single iModel. Used by HubMock.\r\n * @internal\r\n */\r\nexport class LocalHub {\r\n public readonly iTwinId: GuidString;\r\n public readonly iModelId: GuidString;\r\n public readonly iModelName: string;\r\n public readonly description?: string;\r\n private _hubDb?: SQLiteDb;\r\n private _nextBriefcaseId = BriefcaseIdValue.FirstValid;\r\n private _latestChangesetIndex = 0;\r\n public get latestChangesetIndex() { return this._latestChangesetIndex; }\r\n\r\n public constructor(public readonly rootDir: LocalDirName, arg: LocalHubProps) {\r\n this.iTwinId = arg.iTwinId;\r\n this.iModelId = arg.iModelId;\r\n this.iModelName = arg.iModelName;\r\n this.description = arg.description;\r\n\r\n this.cleanup();\r\n\r\n IModelJsFs.recursiveMkDirSync(this.rootDir);\r\n IModelJsFs.mkdirSync(this.changesetDir);\r\n IModelJsFs.mkdirSync(this.checkpointDir);\r\n\r\n const db = this._hubDb = new SQLiteDb();\r\n db.createDb(this.mockDbName);\r\n db.executeSQL(\"CREATE TABLE briefcases(id INTEGER PRIMARY KEY NOT NULL,user TEXT NOT NULL,alias TEXT NOT NULL,assigned INTEGER DEFAULT 1)\");\r\n db.executeSQL(\"CREATE TABLE timeline(csIndex INTEGER PRIMARY KEY NOT NULL,csId TEXT NOT NULL UNIQUE,description TEXT,user TEXT,size BIGINT,type INTEGER,pushDate TEXT,briefcaseId INTEGER,\\\r\n FOREIGN KEY(briefcaseId) REFERENCES briefcases(id))\");\r\n db.executeSQL(\"CREATE TABLE checkpoints(csIndex INTEGER PRIMARY KEY NOT NULL)\");\r\n db.executeSQL(\"CREATE TABLE versions(name TEXT PRIMARY KEY NOT NULL,csIndex TEXT,FOREIGN KEY(csIndex) REFERENCES timeline(csIndex))\");\r\n db.executeSQL(\"CREATE TABLE locks(id INTEGER PRIMARY KEY NOT NULL,level INTEGER NOT NULL,lastCSetIndex INTEGER,briefcaseId INTEGER)\");\r\n db.executeSQL(\"CREATE TABLE sharedLocks(lockId INTEGER NOT NULL,briefcaseId INTEGER NOT NULL,PRIMARY KEY(lockId,briefcaseId))\");\r\n db.executeSQL(\"CREATE INDEX LockIdx ON locks(briefcaseId)\");\r\n db.executeSQL(\"CREATE INDEX SharedLockIdx ON sharedLocks(briefcaseId)\");\r\n db.saveChanges();\r\n\r\n const version0Root = `${rootDir}_version0`;\r\n const version0 = arg.version0 ?? join(version0Root, \"version0.bim\");\r\n\r\n if (!arg.version0) { // if they didn't supply a version0 file, create a blank one.\r\n IModelJsFs.recursiveMkDirSync(version0Root);\r\n IModelJsFs.removeSync(version0);\r\n SnapshotDb.createEmpty(version0, { rootSubject: { name: arg.description ?? arg.iModelName } }).close();\r\n }\r\n\r\n const path = this.uploadCheckpoint({ changesetIndex: 0, localFile: version0 });\r\n if (!arg.version0)\r\n IModelJsFs.removeSync(version0);\r\n\r\n const nativeDb = IModelDb.openDgnDb({ path }, OpenMode.ReadWrite);\r\n try {\r\n nativeDb.setITwinId(this.iTwinId);\r\n nativeDb.setIModelId(this.iModelId);\r\n nativeDb.saveChanges();\r\n nativeDb.deleteAllTxns(); // necessary before resetting briefcaseId\r\n nativeDb.resetBriefcaseId(BriefcaseIdValue.Unassigned);\r\n nativeDb.saveLocalValue(BriefcaseLocalValue.NoLocking, arg.noLocks ? \"true\" : undefined);\r\n nativeDb.saveChanges();\r\n } finally {\r\n nativeDb.closeIModel();\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n private get db(): SQLiteDb { return this._hubDb!; } // eslint-disable-line @typescript-eslint/naming-convention\r\n public get changesetDir() { return join(this.rootDir, \"changesets\"); }\r\n public get checkpointDir() { return join(this.rootDir, \"checkpoints\"); }\r\n public get mockDbName() { return join(this.rootDir, \"localHub.db\"); }\r\n\r\n /** Acquire the next available briefcaseId and assign it to the supplied user */\r\n public acquireNewBriefcaseId(user: string, alias?: string): BriefcaseId {\r\n const db = this.db;\r\n const newId = this._nextBriefcaseId++;\r\n db.withSqliteStatement(\"INSERT INTO briefcases(id,user,alias) VALUES (?,?,?)\", (stmt) => {\r\n stmt.bindInteger(1, newId);\r\n stmt.bindString(2, user);\r\n stmt.bindString(3, alias ?? `${user} (${newId})`);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n throw new IModelError(rc, \"can't insert briefcaseId in mock database\");\r\n });\r\n db.saveChanges();\r\n return newId;\r\n }\r\n\r\n /** Release a briefcaseId */\r\n public releaseBriefcaseId(id: BriefcaseId) {\r\n const db = this.db;\r\n this.releaseAllLocks({ briefcaseId: id, changesetIndex: 0 });\r\n db.withSqliteStatement(\"UPDATE briefcases SET assigned=0 WHERE id=?\", (stmt) => {\r\n stmt.bindInteger(1, id);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n throw new IModelError(rc, `briefcaseId ${id} was not reserved`);\r\n });\r\n db.saveChanges();\r\n }\r\n\r\n /** Get an array of all of the currently assigned Briefcases */\r\n public getBriefcases(onlyAssigned = true): MockBriefcaseIdProps[] {\r\n const briefcases: MockBriefcaseIdProps[] = [];\r\n let sql = \"SELECT id,user,alias,assigned FROM briefcases\";\r\n if (onlyAssigned)\r\n sql += \" WHERE assigned=1\";\r\n\r\n this.db.withSqliteStatement(sql, (stmt) => {\r\n while (DbResult.BE_SQLITE_ROW === stmt.step()) {\r\n briefcases.push({\r\n id: stmt.getValueInteger(0),\r\n user: stmt.getValueString(1),\r\n alias: stmt.getValueString(2),\r\n assigned: stmt.getValueInteger(3) !== 0,\r\n });\r\n }\r\n });\r\n return briefcases;\r\n }\r\n\r\n /** Get an array of all of the currently assigned BriefcaseIds for a user */\r\n public getBriefcaseIds(user: string): BriefcaseId[] {\r\n const briefcases: BriefcaseId[] = [];\r\n this.db.withSqliteStatement(\"SELECT id FROM briefcases WHERE user=? AND assigned=1\", (stmt) => {\r\n stmt.bindString(1, user);\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n briefcases.push(stmt.getValueInteger(0));\r\n });\r\n return briefcases;\r\n }\r\n\r\n public getBriefcase(id: BriefcaseId): MockBriefcaseIdProps {\r\n return this.db.withSqliteStatement(\"SELECT user,alias,assigned FROM briefcases WHERE id=?\", (stmt) => {\r\n stmt.bindInteger(1, id);\r\n if (DbResult.BE_SQLITE_ROW !== stmt.step())\r\n throw new IModelError(IModelStatus.NotFound, \"no briefcase with that id\");\r\n return { id, user: stmt.getValueString(0), alias: stmt.getValueString(1), assigned: stmt.getValueInteger(2) !== 0 };\r\n });\r\n }\r\n\r\n private getChangesetFileName(index: ChangesetIndex) {\r\n return join(this.changesetDir, `changeset-${index}`);\r\n }\r\n\r\n /** Add a changeset to the timeline\r\n * @return the changesetIndex of the added changeset\r\n */\r\n public addChangeset(changeset: ChangesetFileProps): ChangesetIndex {\r\n const stats = IModelJsFs.lstatSync(changeset.pathname);\r\n if (!stats)\r\n throw new Error(`cannot read changeset file ${changeset.pathname}`);\r\n\r\n const parentIndex = this.getChangesetById(changeset.parentId).index;\r\n if (parentIndex !== this.latestChangesetIndex)\r\n throw new IModelError(IModelStatus.InvalidParent, \"changeset parent is not latest changeset\");\r\n\r\n this.getBriefcase(changeset.briefcaseId); // throws if invalid id\r\n const db = this.db;\r\n changeset.index = this._latestChangesetIndex + 1;\r\n db.withSqliteStatement(\"INSERT INTO timeline(csIndex,csId,description,size,type,pushDate,user,briefcaseId) VALUES (?,?,?,?,?,?,?,?)\", (stmt) => {\r\n stmt.bindInteger(1, changeset.index);\r\n stmt.bindString(2, changeset.id);\r\n stmt.bindString(3, changeset.description);\r\n stmt.bindInteger(4, stats.size);\r\n stmt.bindInteger(5, changeset.changesType ?? 0);\r\n stmt.bindString(6, changeset.pushDate ?? new Date().toISOString());\r\n stmt.bindString(7, changeset.userCreated ?? \"\");\r\n stmt.bindInteger(8, changeset.briefcaseId);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n throw new IModelError(rc, \"can't insert changeset into mock db\");\r\n });\r\n this._latestChangesetIndex = changeset.index; // only change this after insert succeeds\r\n db.saveChanges();\r\n IModelJsFs.copySync(changeset.pathname, this.getChangesetFileName(changeset.index));\r\n return changeset.index;\r\n }\r\n\r\n public getIndexFromChangeset(changeset: ChangesetIndexOrId): ChangesetIndex {\r\n return changeset.index ?? this.getChangesetIndex(changeset.id);\r\n }\r\n\r\n /** Get the index of a changeset by its Id */\r\n public getChangesetIndex(id: ChangesetId): ChangesetIndex {\r\n if (id === \"\")\r\n return 0;\r\n\r\n return this.db.withPreparedSqliteStatement(\"SELECT csIndex FROM timeline WHERE csId=?\", (stmt) => {\r\n stmt.bindString(1, id);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_ROW !== rc)\r\n throw new IModelError(rc, `changeset ${id} not found`);\r\n\r\n return stmt.getValueInteger(0);\r\n });\r\n }\r\n\r\n /** Get the properties of a changeset by its Id */\r\n public getChangesetById(id: ChangesetId): ChangesetProps {\r\n return this.getChangesetByIndex(this.getChangesetIndex(id));\r\n }\r\n\r\n public getPreviousIndex(index: ChangesetIndex) {\r\n return this.db.withPreparedSqliteStatement(\"SELECT max(csIndex) FROM timeline WHERE csIndex<?\", (stmt) => {\r\n stmt.bindInteger(1, index);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_ROW !== rc)\r\n throw new IModelError(rc, `cannot get previous index`);\r\n\r\n return stmt.getValueInteger(0);\r\n });\r\n }\r\n\r\n public getParentId(index: ChangesetIndex): ChangesetId {\r\n if (index === 0)\r\n return \"\";\r\n\r\n return this.db.withPreparedSqliteStatement(\"SELECT csId FROM timeline WHERE csIndex=?\", (stmt) => {\r\n stmt.bindInteger(1, this.getPreviousIndex(index));\r\n stmt.step();\r\n return stmt.getValueString(0);\r\n });\r\n }\r\n\r\n /** Get the properties of a changeset by its index */\r\n public getChangesetByIndex(index: ChangesetIndex): ChangesetProps {\r\n if (index <= 0)\r\n return { id: \"\", changesType: 0, description: \"version0\", parentId: \"\", briefcaseId: 0, pushDate: \"\", userCreated: \"\", index: 0 };\r\n\r\n return this.db.withPreparedSqliteStatement(\"SELECT description,size,type,pushDate,user,csId,briefcaseId FROM timeline WHERE csIndex=?\", (stmt) => {\r\n stmt.bindInteger(1, index);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_ROW !== rc)\r\n throw new IModelError(rc, `changeset at index ${index} not found`);\r\n\r\n return {\r\n description: stmt.getValueString(0),\r\n size: stmt.getValueDouble(1),\r\n changesType: stmt.getValueInteger(2),\r\n pushDate: stmt.getValueString(3),\r\n userCreated: stmt.getValueString(4),\r\n id: stmt.getValueString(5),\r\n briefcaseId: stmt.getValueInteger(6),\r\n index,\r\n parentId: this.getParentId(index),\r\n };\r\n });\r\n }\r\n\r\n public getLatestChangeset(): ChangesetProps {\r\n return this.getChangesetByIndex(this.latestChangesetIndex);\r\n }\r\n\r\n public getChangesetId(index: ChangesetIndex): ChangesetId {\r\n return this.getChangesetByIndex(index).id;\r\n }\r\n\r\n /** Get an array of changesets starting with first to last, by index */\r\n public queryChangesets(range?: ChangesetRange): ChangesetProps[] {\r\n const changesets: ChangesetProps[] = [];\r\n const first = range?.first ?? 0;\r\n const last = range?.end ?? this.latestChangesetIndex;\r\n\r\n this.db.withPreparedSqliteStatement(\"SELECT csIndex FROM timeline WHERE csIndex>=? AND csIndex<=? ORDER BY csIndex\", (stmt) => {\r\n stmt.bindInteger(1, first);\r\n stmt.bindInteger(2, last);\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n changesets.push(this.getChangesetByIndex(stmt.getValueInteger(0)));\r\n });\r\n return changesets;\r\n }\r\n\r\n /** Name a version */\r\n public addNamedVersion(arg: { versionName: string, csIndex: ChangesetIndex }) {\r\n const db = this.db;\r\n db.withSqliteStatement(\"INSERT INTO versions(name,csIndex) VALUES (?,?)\", (stmt) => {\r\n stmt.bindString(1, arg.versionName);\r\n stmt.bindInteger(2, arg.csIndex);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n throw new IModelError(rc, \"can't insert named version\");\r\n });\r\n db.saveChanges();\r\n }\r\n\r\n /** Delete a named version */\r\n public deleteNamedVersion(versionName: string) {\r\n const db = this.db;\r\n db.withSqliteStatement(\"DELETE FROM versions WHERE name=?\", (stmt) => {\r\n stmt.bindString(1, versionName);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n throw new IModelError(rc, \"can't delete named version\");\r\n });\r\n db.saveChanges();\r\n }\r\n\r\n /** find the changeset for a named version */\r\n public findNamedVersion(versionName: string): ChangesetProps {\r\n const index = this.db.withSqliteStatement(\"SELECT csIndex FROM versions WHERE name=?\", (stmt) => {\r\n stmt.bindString(1, versionName);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_ROW !== rc)\r\n throw new IModelError(IModelStatus.NotFound, `Named version ${versionName} not found`);\r\n return stmt.getValueInteger(0);\r\n });\r\n return this.getChangesetByIndex(index);\r\n }\r\n\r\n public checkpointNameFromIndex(csIndex: ChangesetIndex) {\r\n return `checkpoint-${csIndex}`;\r\n }\r\n\r\n /** \"upload\" a checkpoint */\r\n public uploadCheckpoint(arg: { changesetIndex: ChangesetIndex, localFile: LocalFileName }) {\r\n const db = this.db;\r\n db.withSqliteStatement(\"INSERT INTO checkpoints(csIndex) VALUES (?)\", (stmt) => {\r\n stmt.bindInteger(1, arg.changesetIndex);\r\n const res = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== res)\r\n throw new IModelError(res, \"can't insert checkpoint into mock db\");\r\n });\r\n db.saveChanges();\r\n const outName = join(this.checkpointDir, this.checkpointNameFromIndex(arg.changesetIndex));\r\n IModelJsFs.copySync(arg.localFile, outName);\r\n return outName;\r\n }\r\n\r\n /** Get an array of the indexes for a range of checkpoints */\r\n public getCheckpoints(range?: ChangesetRange): ChangesetIndex[] {\r\n const first = range?.first ?? 0;\r\n const last = range?.end ?? this.latestChangesetIndex;\r\n\r\n const checkpoints: ChangesetIndex[] = [];\r\n this.db.withSqliteStatement(\"SELECT csIndex FROM checkpoints WHERE csIndex>=? AND csIndex<=? ORDER BY csIndex\", (stmt) => {\r\n stmt.bindInteger(1, first);\r\n stmt.bindInteger(2, last);\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n checkpoints.push(stmt.getValueInteger(0));\r\n\r\n });\r\n return checkpoints;\r\n }\r\n\r\n /** Find the checkpoint that is no newer than a changesetIndex */\r\n public queryPreviousCheckpoint(changesetIndex: ChangesetIndex): ChangesetIndex {\r\n if (changesetIndex <= 0)\r\n return 0;\r\n\r\n return this.db.withSqliteStatement(\"SELECT max(csIndex) FROM checkpoints WHERE csIndex <= ? \", (stmt) => {\r\n stmt.bindInteger(1, changesetIndex);\r\n const res = stmt.step();\r\n if (DbResult.BE_SQLITE_ROW !== res)\r\n throw new IModelError(res, \"can't get previous checkpoint\");\r\n return stmt.getValueInteger(0);\r\n });\r\n }\r\n\r\n /** \"download\" a checkpoint */\r\n public downloadCheckpoint(arg: { changeset: ChangesetIndexOrId, targetFile: LocalFileName }) {\r\n const index = this.getIndexFromChangeset(arg.changeset);\r\n const prev = this.queryPreviousCheckpoint(index);\r\n IModelJsFs.copySync(join(this.checkpointDir, this.checkpointNameFromIndex(prev)), arg.targetFile);\r\n const changeset = this.getChangesetByIndex(index);\r\n return { index, id: changeset.id };\r\n }\r\n\r\n private copyChangeset(arg: ChangesetFileProps): ChangesetFileProps {\r\n IModelJsFs.copySync(this.getChangesetFileName(arg.index), arg.pathname);\r\n return arg;\r\n }\r\n\r\n /** \"download\" a changeset */\r\n public downloadChangeset(arg: { index: ChangesetIndex, targetDir: LocalDirName }) {\r\n const cs = this.getChangesetByIndex(arg.index);\r\n const csProps = { ...cs, pathname: join(arg.targetDir, cs.id), index: arg.index };\r\n return this.copyChangeset(csProps);\r\n }\r\n\r\n /** \"download\" all the changesets in a given range */\r\n public downloadChangesets(arg: { range?: ChangesetRange, targetDir: LocalDirName }): ChangesetFileProps[] {\r\n const cSets = this.queryChangesets(arg.range) as ChangesetFileProps[];\r\n for (const cs of cSets) {\r\n cs.pathname = join(arg.targetDir, cs.id);\r\n this.copyChangeset(cs);\r\n }\r\n return cSets;\r\n }\r\n\r\n private querySharedLockHolders(elementId: Id64String) {\r\n return this.db.withPreparedSqliteStatement(\"SELECT briefcaseId FROM sharedLocks WHERE lockId=?\", (stmt) => {\r\n stmt.bindId(1, elementId);\r\n const briefcases = new Set<BriefcaseId>();\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n briefcases.add(stmt.getValueInteger(0));\r\n return briefcases;\r\n });\r\n }\r\n\r\n public queryAllLocks(briefcaseId: BriefcaseId) {\r\n this.getBriefcase(briefcaseId); // throws if briefcaseId invalid.\r\n const locks: LockProps[] = [];\r\n this.db.withPreparedSqliteStatement(\"SELECT id FROM locks WHERE briefcaseId=?\", (stmt) => {\r\n stmt.bindInteger(1, briefcaseId);\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n locks.push({ id: stmt.getValueId(0), state: LockState.Exclusive });\r\n });\r\n this.db.withPreparedSqliteStatement(\"SELECT lockId FROM sharedLocks WHERE briefcaseId=?\", (stmt) => {\r\n stmt.bindInteger(1, briefcaseId);\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n locks.push({ id: stmt.getValueId(0), state: LockState.Shared });\r\n });\r\n return locks;\r\n }\r\n\r\n public queryLockStatus(elementId: Id64String): LockStatus {\r\n return this.db.withPreparedSqliteStatement(\"SELECT lastCSetIndex,level,briefcaseId FROM locks WHERE id=?\", (stmt) => {\r\n stmt.bindId(1, elementId);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_ROW !== rc)\r\n return { state: LockState.None };\r\n const lastCsVal = stmt.getValue(0);\r\n const lock = {\r\n lastCsIndex: lastCsVal.isNull ? undefined : lastCsVal.getInteger(),\r\n state: stmt.getValueInteger(1),\r\n };\r\n switch (lock.state) {\r\n case LockState.None:\r\n return lock;\r\n case LockState.Exclusive:\r\n return { ...lock, briefcaseId: stmt.getValueInteger(2) };\r\n case LockState.Shared:\r\n return { ...lock, sharedBy: this.querySharedLockHolders(elementId) };\r\n default:\r\n throw new Error(\"illegal lock state\");\r\n }\r\n });\r\n }\r\n\r\n private reserveLock(currStatus: LockStatus, props: LockProps, briefcase: BriefcaseIdAndChangeset) {\r\n if (props.state === LockState.Exclusive && currStatus.lastCsIndex && (currStatus.lastCsIndex > this.getIndexFromChangeset(briefcase.changeset)))\r\n throw new IModelError(IModelHubStatus.PullIsRequired, \"pull is required to obtain lock\");\r\n\r\n const wantShared = props.state === LockState.Shared;\r\n if (wantShared && (currStatus.state === LockState.Exclusive))\r\n throw new Error(\"cannot acquire shared lock because an exclusive lock is already held\");\r\n\r\n this.db.withPreparedSqliteStatement(\"INSERT INTO locks(id,level,briefcaseId) VALUES(?,?,?) ON CONFLICT(id) DO UPDATE SET briefcaseId=excluded.briefcaseId,level=excluded.level\", (stmt) => {\r\n stmt.bindId(1, props.id);\r\n stmt.bindInteger(2, props.state);\r\n stmt.bindValue(3, wantShared ? undefined : briefcase.briefcaseId);\r\n const rc = stmt.step();\r\n if (rc !== DbResult.BE_SQLITE_DONE)\r\n throw new IModelError(rc, \"cannot insert lock\");\r\n });\r\n\r\n if (wantShared) {\r\n this.db.withPreparedSqliteStatement(\"INSERT INTO sharedLocks(lockId,briefcaseId) VALUES(?,?)\", (stmt) => {\r\n stmt.bindId(1, props.id);\r\n stmt.bindInteger(2, briefcase.briefcaseId);\r\n const rc = stmt.step();\r\n if (rc !== DbResult.BE_SQLITE_DONE)\r\n throw new IModelError(rc, \"cannot insert shared lock\");\r\n });\r\n }\r\n }\r\n\r\n private clearLock(id: Id64String) {\r\n this.db.withPreparedSqliteStatement(\"UPDATE locks SET level=0,briefcaseId=NULL WHERE id=?\", (stmt) => {\r\n stmt.bindId(1, id);\r\n const rc = stmt.step();\r\n if (rc !== DbResult.BE_SQLITE_DONE)\r\n throw new IModelError(rc, \"can't release lock\");\r\n });\r\n }\r\n\r\n private updateLockChangeset(id: Id64String, index: ChangesetIndex) {\r\n if (index <= 0)\r\n return;\r\n\r\n this.db.withPreparedSqliteStatement(\"UPDATE locks SET lastCSetIndex=? WHERE id=?\", (stmt) => {\r\n stmt.bindInteger(1, index);\r\n stmt.bindId(2, id);\r\n const rc = stmt.step();\r\n if (rc !== DbResult.BE_SQLITE_DONE)\r\n throw new IModelError(rc, \"can't update lock changeSetId\");\r\n });\r\n }\r\n\r\n private requestLock(props: LockProps, briefcase: BriefcaseIdAndChangeset) {\r\n if (props.state === LockState.None)\r\n throw new Error(\"cannot request lock for LockState.None\");\r\n\r\n this.getBriefcase(briefcase.briefcaseId); // throws if briefcaseId invalid.\r\n\r\n const lockStatus = this.queryLockStatus(props.id);\r\n switch (lockStatus.state) {\r\n case LockState.None:\r\n return this.reserveLock(lockStatus, props, briefcase);\r\n\r\n case LockState.Shared:\r\n if (props.state === LockState.Shared) {\r\n if (!lockStatus.sharedBy.has(briefcase.briefcaseId))\r\n this.reserveLock(lockStatus, props, briefcase);\r\n } else {\r\n // if requester is the only one holding a shared lock, \"upgrade\" the lock from shared to exclusive\r\n if (lockStatus.sharedBy.size > 1 || !lockStatus.sharedBy.has(briefcase.briefcaseId)) {\r\n const id = lockStatus.sharedBy.values().next().value;\r\n throw new LockConflict(id, this.getBriefcase(id).alias, \"shared lock is held\");\r\n }\r\n this.removeSharedLock(props.id, briefcase.briefcaseId);\r\n this.reserveLock(this.queryLockStatus(props.id), props, briefcase);\r\n }\r\n return;\r\n\r\n case LockState.Exclusive:\r\n if (lockStatus.briefcaseId !== briefcase.briefcaseId)\r\n throw new LockConflict(lockStatus.briefcaseId, this.getBriefcase(lockStatus.briefcaseId).alias, \"exclusive lock is already held\");\r\n }\r\n }\r\n\r\n private removeSharedLock(lockId: Id64String, briefcaseId: BriefcaseId) {\r\n this.db.withPreparedSqliteStatement(\"DELETE FROM sharedLocks WHERE lockId=? AND briefcaseId=?\", (stmt) => {\r\n stmt.bindId(1, lockId);\r\n stmt.bindInteger(2, briefcaseId);\r\n const rc = stmt.step();\r\n if (rc !== DbResult.BE_SQLITE_DONE)\r\n throw new IModelError(rc, \"can't remove shared lock\");\r\n });\r\n }\r\n\r\n private releaseLock(props: LockProps, arg: { briefcaseId: BriefcaseId, changesetIndex: ChangesetIndex }) {\r\n const lockId = props.id;\r\n const lockStatus = this.queryLockStatus(lockId);\r\n switch (lockStatus.state) {\r\n case LockState.None:\r\n throw new IModelError(IModelHubStatus.LockDoesNotExist, \"lock not held\");\r\n\r\n case LockState.Exclusive:\r\n if (lockStatus.briefcaseId !== arg.briefcaseId)\r\n throw new IModelError(IModelHubStatus.LockOwnedByAnotherBriefcase, \"lock not held by this briefcase\");\r\n this.updateLockChangeset(lockId, arg.changesetIndex);\r\n this.clearLock(lockId);\r\n break;\r\n\r\n case LockState.Shared:\r\n if (!lockStatus.sharedBy.has(arg.briefcaseId))\r\n throw new IModelError(IModelHubStatus.LockDoesNotExist, \"shared lock not held by this briefcase\");\r\n this.removeSharedLock(lockId, arg.briefcaseId);\r\n if (lockStatus.sharedBy.size === 1)\r\n this.clearLock(lockId);\r\n }\r\n }\r\n\r\n /** Acquire a set of locks. If any lock cannot be acquired, no locks are acquired */\r\n public acquireLocks(locks: LockMap, briefcase: BriefcaseIdAndChangeset) {\r\n try {\r\n for (const lock of locks)\r\n this.requestLock({ id: lock[0], state: lock[1] }, briefcase);\r\n this.db.saveChanges(); // only after all locks have been acquired\r\n } catch (err) {\r\n this.db.abandonChanges(); // abandon all locks that may have been acquired\r\n throw err;\r\n }\r\n }\r\n\r\n public acquireLock(props: LockProps, briefcase: BriefcaseIdAndChangeset) {\r\n const locks = new Map<Id64String, LockState>();\r\n locks.set(props.id, props.state);\r\n this.acquireLocks(locks, briefcase);\r\n }\r\n\r\n public releaseLocks(locks: LockProps[], arg: { briefcaseId: BriefcaseId, changesetIndex: ChangesetIndex }) {\r\n for (const props of locks)\r\n this.releaseLock(props, arg);\r\n this.db.saveChanges();\r\n }\r\n\r\n public releaseAllLocks(arg: { briefcaseId: BriefcaseId, changesetIndex: ChangesetIndex }) {\r\n const locks = this.queryAllLocks(arg.briefcaseId);\r\n this.releaseLocks(locks, arg);\r\n }\r\n\r\n private countTable(tableName: string): number {\r\n return this.db.withSqliteStatement(`SELECT count(*) from ${tableName}`, (stmt) => {\r\n stmt.step();\r\n return stmt.getValueInteger(0);\r\n });\r\n }\r\n\r\n // for debugging\r\n public countSharedLocks(): number { return this.countTable(\"sharedLocks\"); }\r\n // for debugging\r\n public countLocks(): number { return this.countTable(\"locks\"); }\r\n\r\n // for debugging\r\n public queryAllSharedLocks(): { id: Id64String, briefcaseId: BriefcaseId }[] {\r\n const locks: { id: Id64String, briefcaseId: BriefcaseId }[] = [];\r\n this.db.withPreparedSqliteStatement(\"SELECT lockId,briefcaseId FROM sharedLocks\", (stmt) => {\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n locks.push({ id: stmt.getValueId(0), briefcaseId: stmt.getValueInteger(1) });\r\n });\r\n return locks;\r\n }\r\n\r\n // for debugging\r\n public queryLocks(): LocksEntry[] {\r\n const locks: LocksEntry[] = [];\r\n this.db.withPreparedSqliteStatement(\"SELECT id,level,lastCSetIndex,briefcaseId FROM locks\", (stmt) => {\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n locks.push({\r\n id: stmt.getValueId(0),\r\n level: stmt.getValueInteger(1),\r\n lastCsIndex: stmt.getValue(2).isNull ? undefined : stmt.getValueInteger(2),\r\n briefcaseId: stmt.getValue(3).isNull ? undefined : stmt.getValueInteger(3),\r\n });\r\n });\r\n return locks;\r\n }\r\n\r\n public removeDir(dirName: string) {\r\n if (IModelJsFs.existsSync(dirName)) {\r\n IModelJsFs.purgeDirSync(dirName);\r\n IModelJsFs.rmdirSync(dirName);\r\n }\r\n\r\n }\r\n public cleanup() {\r\n if (this._hubDb) {\r\n this._hubDb.closeDb();\r\n this._hubDb = undefined;\r\n }\r\n try {\r\n this.removeDir(BriefcaseManager.getIModelPath(this.iModelId));\r\n this.removeDir(this.rootDir);\r\n } catch (err) {\r\n // eslint-disable-next-line no-console\r\n console.log(`ERROR: test left an iModel open for [${this.iModelName}]. LocalMock cannot clean up - make sure you call imodel.close() in your test`);\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"LocalHub.js","sourceRoot":"","sources":["../../src/LocalHub.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { join } from \"path\";\r\nimport { DbResult, GuidString, Id64String, IModelHubStatus, IModelStatus, OpenMode } from \"@itwin/core-bentley\";\r\nimport {\r\n BriefcaseId, BriefcaseIdValue, ChangesetFileProps, ChangesetId, ChangesetIdWithIndex, ChangesetIndex, ChangesetIndexOrId, ChangesetProps,\r\n ChangesetRange, IModelError, LocalDirName, LocalFileName,\r\n} from \"@itwin/core-common\";\r\nimport { LockConflict, LockMap, LockProps, LockState } from \"./BackendHubAccess\";\r\nimport { BriefcaseManager } from \"./BriefcaseManager\";\r\nimport { BriefcaseLocalValue, IModelDb, SnapshotDb } from \"./IModelDb\";\r\nimport { IModelJsFs } from \"./IModelJsFs\";\r\nimport { SQLiteDb } from \"./SQLiteDb\";\r\n\r\n// cspell:ignore rowid\r\n\r\n/** @internal */\r\ninterface MockBriefcaseIdProps {\r\n id: BriefcaseId;\r\n user: string; // Just an AccessToken that simulates a user\r\n alias: string;\r\n assigned: boolean;\r\n}\r\n\r\n/** @internal */\r\ninterface LocalHubProps {\r\n readonly iTwinId: GuidString;\r\n readonly iModelId: GuidString;\r\n readonly iModelName: string;\r\n readonly description?: string;\r\n readonly version0?: string;\r\n readonly noLocks?: true;\r\n}\r\n\r\ninterface LocksEntry {\r\n id: Id64String;\r\n level: LockState;\r\n lastCsIndex?: ChangesetIndex;\r\n briefcaseId?: BriefcaseId;\r\n}\r\n\r\ninterface LockStatusNone {\r\n state: LockState.None;\r\n lastCsIndex?: ChangesetIndex;\r\n}\r\n\r\n/** @internal exported for tests. */\r\nexport interface LockStatusExclusive {\r\n state: LockState.Exclusive;\r\n briefcaseId: BriefcaseId;\r\n lastCsIndex?: ChangesetIndex;\r\n}\r\n\r\n/** @internal exported for tests. */\r\nexport interface LockStatusShared {\r\n state: LockState.Shared;\r\n sharedBy: Set<BriefcaseId>;\r\n lastCsIndex?: ChangesetIndex;\r\n}\r\n\r\ninterface BriefcaseIdAndChangeset {\r\n changeset: ChangesetIdWithIndex;\r\n briefcaseId: BriefcaseId;\r\n}\r\n\r\ntype LockStatus = LockStatusNone | LockStatusExclusive | LockStatusShared;\r\n\r\n/**\r\n * A \"local\" mock for IModelHub to provide access to a single iModel. Used by HubMock.\r\n * @internal\r\n */\r\nexport class LocalHub {\r\n public readonly iTwinId: GuidString;\r\n public readonly iModelId: GuidString;\r\n public readonly iModelName: string;\r\n public readonly description?: string;\r\n private _hubDb?: SQLiteDb;\r\n private _nextBriefcaseId = BriefcaseIdValue.FirstValid;\r\n private _latestChangesetIndex = 0;\r\n public get latestChangesetIndex() { return this._latestChangesetIndex; }\r\n\r\n public constructor(public readonly rootDir: LocalDirName, arg: LocalHubProps) {\r\n this.iTwinId = arg.iTwinId;\r\n this.iModelId = arg.iModelId;\r\n this.iModelName = arg.iModelName;\r\n this.description = arg.description;\r\n\r\n this.cleanup();\r\n\r\n IModelJsFs.recursiveMkDirSync(this.rootDir);\r\n IModelJsFs.mkdirSync(this.changesetDir);\r\n IModelJsFs.mkdirSync(this.checkpointDir);\r\n\r\n const db = this._hubDb = new SQLiteDb();\r\n db.createDb(this.mockDbName);\r\n db.executeSQL(\"CREATE TABLE briefcases(id INTEGER PRIMARY KEY NOT NULL,user TEXT NOT NULL,alias TEXT NOT NULL,assigned INTEGER DEFAULT 1)\");\r\n db.executeSQL(\"CREATE TABLE timeline(csIndex INTEGER PRIMARY KEY NOT NULL,csId TEXT NOT NULL UNIQUE,description TEXT,user TEXT,size BIGINT,type INTEGER,pushDate TEXT,briefcaseId INTEGER,\\\r\n FOREIGN KEY(briefcaseId) REFERENCES briefcases(id))\");\r\n db.executeSQL(\"CREATE TABLE checkpoints(csIndex INTEGER PRIMARY KEY NOT NULL)\");\r\n db.executeSQL(\"CREATE TABLE versions(name TEXT PRIMARY KEY NOT NULL,csIndex TEXT,FOREIGN KEY(csIndex) REFERENCES timeline(csIndex))\");\r\n db.executeSQL(\"CREATE TABLE locks(id INTEGER PRIMARY KEY NOT NULL,level INTEGER NOT NULL,lastCSetIndex INTEGER,briefcaseId INTEGER)\");\r\n db.executeSQL(\"CREATE TABLE sharedLocks(lockId INTEGER NOT NULL,briefcaseId INTEGER NOT NULL,PRIMARY KEY(lockId,briefcaseId))\");\r\n db.executeSQL(\"CREATE INDEX LockIdx ON locks(briefcaseId)\");\r\n db.executeSQL(\"CREATE INDEX SharedLockIdx ON sharedLocks(briefcaseId)\");\r\n db.saveChanges();\r\n\r\n const version0Root = `${rootDir}_version0`;\r\n const version0 = arg.version0 ?? join(version0Root, \"version0.bim\");\r\n\r\n if (!arg.version0) { // if they didn't supply a version0 file, create a blank one.\r\n IModelJsFs.recursiveMkDirSync(version0Root);\r\n IModelJsFs.removeSync(version0);\r\n SnapshotDb.createEmpty(version0, { rootSubject: { name: arg.description ?? arg.iModelName } }).close();\r\n }\r\n\r\n const path = this.uploadCheckpoint({ changesetIndex: 0, localFile: version0 });\r\n if (!arg.version0)\r\n IModelJsFs.removeSync(version0);\r\n\r\n const nativeDb = IModelDb.openDgnDb({ path }, OpenMode.ReadWrite);\r\n try {\r\n nativeDb.setITwinId(this.iTwinId);\r\n nativeDb.setIModelId(this.iModelId);\r\n nativeDb.saveChanges();\r\n nativeDb.deleteAllTxns(); // necessary before resetting briefcaseId\r\n nativeDb.resetBriefcaseId(BriefcaseIdValue.Unassigned);\r\n nativeDb.saveLocalValue(BriefcaseLocalValue.NoLocking, arg.noLocks ? \"true\" : undefined);\r\n nativeDb.saveChanges();\r\n } finally {\r\n nativeDb.closeIModel();\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n private get db(): SQLiteDb { return this._hubDb!; } // eslint-disable-line @typescript-eslint/naming-convention\r\n public get changesetDir() { return join(this.rootDir, \"changesets\"); }\r\n public get checkpointDir() { return join(this.rootDir, \"checkpoints\"); }\r\n public get mockDbName() { return join(this.rootDir, \"localHub.db\"); }\r\n\r\n /** Acquire the next available briefcaseId and assign it to the supplied user */\r\n public acquireNewBriefcaseId(user: string, alias?: string): BriefcaseId {\r\n const db = this.db;\r\n const newId = this._nextBriefcaseId++;\r\n db.withSqliteStatement(\"INSERT INTO briefcases(id,user,alias) VALUES (?,?,?)\", (stmt) => {\r\n stmt.bindInteger(1, newId);\r\n stmt.bindString(2, user);\r\n stmt.bindString(3, alias ?? `${user} (${newId})`);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n throw new IModelError(rc, \"can't insert briefcaseId in mock database\");\r\n });\r\n db.saveChanges();\r\n return newId;\r\n }\r\n\r\n /** Release a briefcaseId */\r\n public releaseBriefcaseId(id: BriefcaseId) {\r\n const db = this.db;\r\n this.releaseAllLocks({ briefcaseId: id, changesetIndex: 0 });\r\n db.withSqliteStatement(\"UPDATE briefcases SET assigned=0 WHERE id=?\", (stmt) => {\r\n stmt.bindInteger(1, id);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n throw new IModelError(rc, `briefcaseId ${id} was not reserved`);\r\n });\r\n db.saveChanges();\r\n }\r\n\r\n /** Get an array of all of the currently assigned Briefcases */\r\n public getBriefcases(onlyAssigned = true): MockBriefcaseIdProps[] {\r\n const briefcases: MockBriefcaseIdProps[] = [];\r\n let sql = \"SELECT id,user,alias,assigned FROM briefcases\";\r\n if (onlyAssigned)\r\n sql += \" WHERE assigned=1\";\r\n\r\n this.db.withSqliteStatement(sql, (stmt) => {\r\n while (DbResult.BE_SQLITE_ROW === stmt.step()) {\r\n briefcases.push({\r\n id: stmt.getValueInteger(0),\r\n user: stmt.getValueString(1),\r\n alias: stmt.getValueString(2),\r\n assigned: stmt.getValueInteger(3) !== 0,\r\n });\r\n }\r\n });\r\n return briefcases;\r\n }\r\n\r\n /** Get an array of all of the currently assigned BriefcaseIds for a user */\r\n public getBriefcaseIds(user: string): BriefcaseId[] {\r\n const briefcases: BriefcaseId[] = [];\r\n this.db.withSqliteStatement(\"SELECT id FROM briefcases WHERE user=? AND assigned=1\", (stmt) => {\r\n stmt.bindString(1, user);\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n briefcases.push(stmt.getValueInteger(0));\r\n });\r\n return briefcases;\r\n }\r\n\r\n public getBriefcase(id: BriefcaseId): MockBriefcaseIdProps {\r\n return this.db.withSqliteStatement(\"SELECT user,alias,assigned FROM briefcases WHERE id=?\", (stmt) => {\r\n stmt.bindInteger(1, id);\r\n if (DbResult.BE_SQLITE_ROW !== stmt.step())\r\n throw new IModelError(IModelStatus.NotFound, \"no briefcase with that id\");\r\n return { id, user: stmt.getValueString(0), alias: stmt.getValueString(1), assigned: stmt.getValueInteger(2) !== 0 };\r\n });\r\n }\r\n\r\n private getChangesetFileName(index: ChangesetIndex) {\r\n return join(this.changesetDir, `changeset-${index}`);\r\n }\r\n\r\n /** Add a changeset to the timeline\r\n * @return the changesetIndex of the added changeset\r\n */\r\n public addChangeset(changeset: ChangesetFileProps): ChangesetIndex {\r\n const stats = IModelJsFs.lstatSync(changeset.pathname);\r\n if (!stats)\r\n throw new Error(`cannot read changeset file ${changeset.pathname}`);\r\n\r\n const parentIndex = this.getChangesetById(changeset.parentId).index;\r\n if (parentIndex !== this.latestChangesetIndex)\r\n throw new IModelError(IModelStatus.InvalidParent, \"changeset parent is not latest changeset\");\r\n\r\n this.getBriefcase(changeset.briefcaseId); // throws if invalid id\r\n const db = this.db;\r\n changeset.index = this._latestChangesetIndex + 1;\r\n db.withSqliteStatement(\"INSERT INTO timeline(csIndex,csId,description,size,type,pushDate,user,briefcaseId) VALUES (?,?,?,?,?,?,?,?)\", (stmt) => {\r\n stmt.bindInteger(1, changeset.index);\r\n stmt.bindString(2, changeset.id);\r\n stmt.bindString(3, changeset.description);\r\n stmt.bindInteger(4, stats.size);\r\n stmt.bindInteger(5, changeset.changesType ?? 0);\r\n stmt.bindString(6, changeset.pushDate ?? new Date().toISOString());\r\n stmt.bindString(7, changeset.userCreated ?? \"\");\r\n stmt.bindInteger(8, changeset.briefcaseId);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n throw new IModelError(rc, \"can't insert changeset into mock db\");\r\n });\r\n this._latestChangesetIndex = changeset.index; // only change this after insert succeeds\r\n db.saveChanges();\r\n IModelJsFs.copySync(changeset.pathname, this.getChangesetFileName(changeset.index));\r\n return changeset.index;\r\n }\r\n\r\n public getIndexFromChangeset(changeset: ChangesetIndexOrId): ChangesetIndex {\r\n return changeset.index ?? this.getChangesetIndex(changeset.id);\r\n }\r\n\r\n /** Get the index of a changeset by its Id */\r\n public getChangesetIndex(id: ChangesetId): ChangesetIndex {\r\n if (id === \"\")\r\n return 0;\r\n\r\n return this.db.withPreparedSqliteStatement(\"SELECT csIndex FROM timeline WHERE csId=?\", (stmt) => {\r\n stmt.bindString(1, id);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_ROW !== rc)\r\n throw new IModelError(rc, `changeset ${id} not found`);\r\n\r\n return stmt.getValueInteger(0);\r\n });\r\n }\r\n\r\n /** Get the properties of a changeset by its Id */\r\n public getChangesetById(id: ChangesetId): ChangesetProps {\r\n return this.getChangesetByIndex(this.getChangesetIndex(id));\r\n }\r\n\r\n public getPreviousIndex(index: ChangesetIndex) {\r\n return this.db.withPreparedSqliteStatement(\"SELECT max(csIndex) FROM timeline WHERE csIndex<?\", (stmt) => {\r\n stmt.bindInteger(1, index);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_ROW !== rc)\r\n throw new IModelError(rc, `cannot get previous index`);\r\n\r\n return stmt.getValueInteger(0);\r\n });\r\n }\r\n\r\n public getParentId(index: ChangesetIndex): ChangesetId {\r\n if (index === 0)\r\n return \"\";\r\n\r\n return this.db.withPreparedSqliteStatement(\"SELECT csId FROM timeline WHERE csIndex=?\", (stmt) => {\r\n stmt.bindInteger(1, this.getPreviousIndex(index));\r\n stmt.step();\r\n return stmt.getValueString(0);\r\n });\r\n }\r\n\r\n /** Get the properties of a changeset by its index */\r\n public getChangesetByIndex(index: ChangesetIndex): ChangesetProps {\r\n if (index <= 0)\r\n return { id: \"\", changesType: 0, description: \"version0\", parentId: \"\", briefcaseId: 0, pushDate: \"\", userCreated: \"\", index: 0, size: 0 };\r\n\r\n return this.db.withPreparedSqliteStatement(\"SELECT description,size,type,pushDate,user,csId,briefcaseId FROM timeline WHERE csIndex=?\", (stmt) => {\r\n stmt.bindInteger(1, index);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_ROW !== rc)\r\n throw new IModelError(rc, `changeset at index ${index} not found`);\r\n\r\n return {\r\n description: stmt.getValueString(0),\r\n size: stmt.getValueDouble(1),\r\n changesType: stmt.getValueInteger(2),\r\n pushDate: stmt.getValueString(3),\r\n userCreated: stmt.getValueString(4),\r\n id: stmt.getValueString(5),\r\n briefcaseId: stmt.getValueInteger(6),\r\n index,\r\n parentId: this.getParentId(index),\r\n };\r\n });\r\n }\r\n\r\n public getLatestChangeset(): ChangesetProps {\r\n return this.getChangesetByIndex(this.latestChangesetIndex);\r\n }\r\n\r\n public getChangesetId(index: ChangesetIndex): ChangesetId {\r\n return this.getChangesetByIndex(index).id;\r\n }\r\n\r\n /** Get an array of changesets starting with first to last, by index */\r\n public queryChangesets(range?: ChangesetRange): ChangesetProps[] {\r\n const changesets: ChangesetProps[] = [];\r\n const first = range?.first ?? 0;\r\n const last = range?.end ?? this.latestChangesetIndex;\r\n\r\n this.db.withPreparedSqliteStatement(\"SELECT csIndex FROM timeline WHERE csIndex>=? AND csIndex<=? ORDER BY csIndex\", (stmt) => {\r\n stmt.bindInteger(1, first);\r\n stmt.bindInteger(2, last);\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n changesets.push(this.getChangesetByIndex(stmt.getValueInteger(0)));\r\n });\r\n return changesets;\r\n }\r\n\r\n /** Name a version */\r\n public addNamedVersion(arg: { versionName: string, csIndex: ChangesetIndex }) {\r\n const db = this.db;\r\n db.withSqliteStatement(\"INSERT INTO versions(name,csIndex) VALUES (?,?)\", (stmt) => {\r\n stmt.bindString(1, arg.versionName);\r\n stmt.bindInteger(2, arg.csIndex);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n throw new IModelError(rc, \"can't insert named version\");\r\n });\r\n db.saveChanges();\r\n }\r\n\r\n /** Delete a named version */\r\n public deleteNamedVersion(versionName: string) {\r\n const db = this.db;\r\n db.withSqliteStatement(\"DELETE FROM versions WHERE name=?\", (stmt) => {\r\n stmt.bindString(1, versionName);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n throw new IModelError(rc, \"can't delete named version\");\r\n });\r\n db.saveChanges();\r\n }\r\n\r\n /** find the changeset for a named version */\r\n public findNamedVersion(versionName: string): ChangesetProps {\r\n const index = this.db.withSqliteStatement(\"SELECT csIndex FROM versions WHERE name=?\", (stmt) => {\r\n stmt.bindString(1, versionName);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_ROW !== rc)\r\n throw new IModelError(IModelStatus.NotFound, `Named version ${versionName} not found`);\r\n return stmt.getValueInteger(0);\r\n });\r\n return this.getChangesetByIndex(index);\r\n }\r\n\r\n public checkpointNameFromIndex(csIndex: ChangesetIndex) {\r\n return `checkpoint-${csIndex}`;\r\n }\r\n\r\n /** \"upload\" a checkpoint */\r\n public uploadCheckpoint(arg: { changesetIndex: ChangesetIndex, localFile: LocalFileName }) {\r\n const db = this.db;\r\n db.withSqliteStatement(\"INSERT INTO checkpoints(csIndex) VALUES (?)\", (stmt) => {\r\n stmt.bindInteger(1, arg.changesetIndex);\r\n const res = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== res)\r\n throw new IModelError(res, \"can't insert checkpoint into mock db\");\r\n });\r\n db.saveChanges();\r\n const outName = join(this.checkpointDir, this.checkpointNameFromIndex(arg.changesetIndex));\r\n IModelJsFs.copySync(arg.localFile, outName);\r\n return outName;\r\n }\r\n\r\n /** Get an array of the indexes for a range of checkpoints */\r\n public getCheckpoints(range?: ChangesetRange): ChangesetIndex[] {\r\n const first = range?.first ?? 0;\r\n const last = range?.end ?? this.latestChangesetIndex;\r\n\r\n const checkpoints: ChangesetIndex[] = [];\r\n this.db.withSqliteStatement(\"SELECT csIndex FROM checkpoints WHERE csIndex>=? AND csIndex<=? ORDER BY csIndex\", (stmt) => {\r\n stmt.bindInteger(1, first);\r\n stmt.bindInteger(2, last);\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n checkpoints.push(stmt.getValueInteger(0));\r\n\r\n });\r\n return checkpoints;\r\n }\r\n\r\n /** Find the checkpoint that is no newer than a changesetIndex */\r\n public queryPreviousCheckpoint(changesetIndex: ChangesetIndex): ChangesetIndex {\r\n if (changesetIndex <= 0)\r\n return 0;\r\n\r\n return this.db.withSqliteStatement(\"SELECT max(csIndex) FROM checkpoints WHERE csIndex <= ? \", (stmt) => {\r\n stmt.bindInteger(1, changesetIndex);\r\n const res = stmt.step();\r\n if (DbResult.BE_SQLITE_ROW !== res)\r\n throw new IModelError(res, \"can't get previous checkpoint\");\r\n return stmt.getValueInteger(0);\r\n });\r\n }\r\n\r\n /** \"download\" a checkpoint */\r\n public downloadCheckpoint(arg: { changeset: ChangesetIndexOrId, targetFile: LocalFileName }) {\r\n const index = this.getIndexFromChangeset(arg.changeset);\r\n const prev = this.queryPreviousCheckpoint(index);\r\n IModelJsFs.copySync(join(this.checkpointDir, this.checkpointNameFromIndex(prev)), arg.targetFile);\r\n const changeset = this.getChangesetByIndex(index);\r\n return { index, id: changeset.id };\r\n }\r\n\r\n private copyChangeset(arg: ChangesetFileProps): ChangesetFileProps {\r\n IModelJsFs.copySync(this.getChangesetFileName(arg.index), arg.pathname);\r\n return arg;\r\n }\r\n\r\n /** \"download\" a changeset */\r\n public downloadChangeset(arg: { index: ChangesetIndex, targetDir: LocalDirName }) {\r\n const cs = this.getChangesetByIndex(arg.index);\r\n const csProps = { ...cs, pathname: join(arg.targetDir, cs.id), index: arg.index };\r\n return this.copyChangeset(csProps);\r\n }\r\n\r\n /** \"download\" all the changesets in a given range */\r\n public downloadChangesets(arg: { range?: ChangesetRange, targetDir: LocalDirName }): ChangesetFileProps[] {\r\n const cSets = this.queryChangesets(arg.range) as ChangesetFileProps[];\r\n for (const cs of cSets) {\r\n cs.pathname = join(arg.targetDir, cs.id);\r\n this.copyChangeset(cs);\r\n }\r\n return cSets;\r\n }\r\n\r\n private querySharedLockHolders(elementId: Id64String) {\r\n return this.db.withPreparedSqliteStatement(\"SELECT briefcaseId FROM sharedLocks WHERE lockId=?\", (stmt) => {\r\n stmt.bindId(1, elementId);\r\n const briefcases = new Set<BriefcaseId>();\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n briefcases.add(stmt.getValueInteger(0));\r\n return briefcases;\r\n });\r\n }\r\n\r\n public queryAllLocks(briefcaseId: BriefcaseId) {\r\n this.getBriefcase(briefcaseId); // throws if briefcaseId invalid.\r\n const locks: LockProps[] = [];\r\n this.db.withPreparedSqliteStatement(\"SELECT id FROM locks WHERE briefcaseId=?\", (stmt) => {\r\n stmt.bindInteger(1, briefcaseId);\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n locks.push({ id: stmt.getValueId(0), state: LockState.Exclusive });\r\n });\r\n this.db.withPreparedSqliteStatement(\"SELECT lockId FROM sharedLocks WHERE briefcaseId=?\", (stmt) => {\r\n stmt.bindInteger(1, briefcaseId);\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n locks.push({ id: stmt.getValueId(0), state: LockState.Shared });\r\n });\r\n return locks;\r\n }\r\n\r\n public queryLockStatus(elementId: Id64String): LockStatus {\r\n return this.db.withPreparedSqliteStatement(\"SELECT lastCSetIndex,level,briefcaseId FROM locks WHERE id=?\", (stmt) => {\r\n stmt.bindId(1, elementId);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_ROW !== rc)\r\n return { state: LockState.None };\r\n const lastCsVal = stmt.getValue(0);\r\n const lock = {\r\n lastCsIndex: lastCsVal.isNull ? undefined : lastCsVal.getInteger(),\r\n state: stmt.getValueInteger(1),\r\n };\r\n switch (lock.state) {\r\n case LockState.None:\r\n return lock;\r\n case LockState.Exclusive:\r\n return { ...lock, briefcaseId: stmt.getValueInteger(2) };\r\n case LockState.Shared:\r\n return { ...lock, sharedBy: this.querySharedLockHolders(elementId) };\r\n default:\r\n throw new Error(\"illegal lock state\");\r\n }\r\n });\r\n }\r\n\r\n private reserveLock(currStatus: LockStatus, props: LockProps, briefcase: BriefcaseIdAndChangeset) {\r\n if (props.state === LockState.Exclusive && currStatus.lastCsIndex && (currStatus.lastCsIndex > this.getIndexFromChangeset(briefcase.changeset)))\r\n throw new IModelError(IModelHubStatus.PullIsRequired, \"pull is required to obtain lock\");\r\n\r\n const wantShared = props.state === LockState.Shared;\r\n if (wantShared && (currStatus.state === LockState.Exclusive))\r\n throw new Error(\"cannot acquire shared lock because an exclusive lock is already held\");\r\n\r\n this.db.withPreparedSqliteStatement(\"INSERT INTO locks(id,level,briefcaseId) VALUES(?,?,?) ON CONFLICT(id) DO UPDATE SET briefcaseId=excluded.briefcaseId,level=excluded.level\", (stmt) => {\r\n stmt.bindId(1, props.id);\r\n stmt.bindInteger(2, props.state);\r\n stmt.bindValue(3, wantShared ? undefined : briefcase.briefcaseId);\r\n const rc = stmt.step();\r\n if (rc !== DbResult.BE_SQLITE_DONE)\r\n throw new IModelError(rc, \"cannot insert lock\");\r\n });\r\n\r\n if (wantShared) {\r\n this.db.withPreparedSqliteStatement(\"INSERT INTO sharedLocks(lockId,briefcaseId) VALUES(?,?)\", (stmt) => {\r\n stmt.bindId(1, props.id);\r\n stmt.bindInteger(2, briefcase.briefcaseId);\r\n const rc = stmt.step();\r\n if (rc !== DbResult.BE_SQLITE_DONE)\r\n throw new IModelError(rc, \"cannot insert shared lock\");\r\n });\r\n }\r\n }\r\n\r\n private clearLock(id: Id64String) {\r\n this.db.withPreparedSqliteStatement(\"UPDATE locks SET level=0,briefcaseId=NULL WHERE id=?\", (stmt) => {\r\n stmt.bindId(1, id);\r\n const rc = stmt.step();\r\n if (rc !== DbResult.BE_SQLITE_DONE)\r\n throw new IModelError(rc, \"can't release lock\");\r\n });\r\n }\r\n\r\n private updateLockChangeset(id: Id64String, index: ChangesetIndex) {\r\n if (index <= 0)\r\n return;\r\n\r\n this.db.withPreparedSqliteStatement(\"UPDATE locks SET lastCSetIndex=? WHERE id=?\", (stmt) => {\r\n stmt.bindInteger(1, index);\r\n stmt.bindId(2, id);\r\n const rc = stmt.step();\r\n if (rc !== DbResult.BE_SQLITE_DONE)\r\n throw new IModelError(rc, \"can't update lock changeSetId\");\r\n });\r\n }\r\n\r\n private requestLock(props: LockProps, briefcase: BriefcaseIdAndChangeset) {\r\n if (props.state === LockState.None)\r\n throw new Error(\"cannot request lock for LockState.None\");\r\n\r\n this.getBriefcase(briefcase.briefcaseId); // throws if briefcaseId invalid.\r\n\r\n const lockStatus = this.queryLockStatus(props.id);\r\n switch (lockStatus.state) {\r\n case LockState.None:\r\n return this.reserveLock(lockStatus, props, briefcase);\r\n\r\n case LockState.Shared:\r\n if (props.state === LockState.Shared) {\r\n if (!lockStatus.sharedBy.has(briefcase.briefcaseId))\r\n this.reserveLock(lockStatus, props, briefcase);\r\n } else {\r\n // if requester is the only one holding a shared lock, \"upgrade\" the lock from shared to exclusive\r\n if (lockStatus.sharedBy.size > 1 || !lockStatus.sharedBy.has(briefcase.briefcaseId)) {\r\n const id = lockStatus.sharedBy.values().next().value;\r\n throw new LockConflict(id, this.getBriefcase(id).alias, \"shared lock is held\");\r\n }\r\n this.removeSharedLock(props.id, briefcase.briefcaseId);\r\n this.reserveLock(this.queryLockStatus(props.id), props, briefcase);\r\n }\r\n return;\r\n\r\n case LockState.Exclusive:\r\n if (lockStatus.briefcaseId !== briefcase.briefcaseId)\r\n throw new LockConflict(lockStatus.briefcaseId, this.getBriefcase(lockStatus.briefcaseId).alias, \"exclusive lock is already held\");\r\n }\r\n }\r\n\r\n private removeSharedLock(lockId: Id64String, briefcaseId: BriefcaseId) {\r\n this.db.withPreparedSqliteStatement(\"DELETE FROM sharedLocks WHERE lockId=? AND briefcaseId=?\", (stmt) => {\r\n stmt.bindId(1, lockId);\r\n stmt.bindInteger(2, briefcaseId);\r\n const rc = stmt.step();\r\n if (rc !== DbResult.BE_SQLITE_DONE)\r\n throw new IModelError(rc, \"can't remove shared lock\");\r\n });\r\n }\r\n\r\n private releaseLock(props: LockProps, arg: { briefcaseId: BriefcaseId, changesetIndex: ChangesetIndex }) {\r\n const lockId = props.id;\r\n const lockStatus = this.queryLockStatus(lockId);\r\n switch (lockStatus.state) {\r\n case LockState.None:\r\n throw new IModelError(IModelHubStatus.LockDoesNotExist, \"lock not held\");\r\n\r\n case LockState.Exclusive:\r\n if (lockStatus.briefcaseId !== arg.briefcaseId)\r\n throw new IModelError(IModelHubStatus.LockOwnedByAnotherBriefcase, \"lock not held by this briefcase\");\r\n this.updateLockChangeset(lockId, arg.changesetIndex);\r\n this.clearLock(lockId);\r\n break;\r\n\r\n case LockState.Shared:\r\n if (!lockStatus.sharedBy.has(arg.briefcaseId))\r\n throw new IModelError(IModelHubStatus.LockDoesNotExist, \"shared lock not held by this briefcase\");\r\n this.removeSharedLock(lockId, arg.briefcaseId);\r\n if (lockStatus.sharedBy.size === 1)\r\n this.clearLock(lockId);\r\n }\r\n }\r\n\r\n /** Acquire a set of locks. If any lock cannot be acquired, no locks are acquired */\r\n public acquireLocks(locks: LockMap, briefcase: BriefcaseIdAndChangeset) {\r\n try {\r\n for (const lock of locks)\r\n this.requestLock({ id: lock[0], state: lock[1] }, briefcase);\r\n this.db.saveChanges(); // only after all locks have been acquired\r\n } catch (err) {\r\n this.db.abandonChanges(); // abandon all locks that may have been acquired\r\n throw err;\r\n }\r\n }\r\n\r\n public acquireLock(props: LockProps, briefcase: BriefcaseIdAndChangeset) {\r\n const locks = new Map<Id64String, LockState>();\r\n locks.set(props.id, props.state);\r\n this.acquireLocks(locks, briefcase);\r\n }\r\n\r\n public releaseLocks(locks: LockProps[], arg: { briefcaseId: BriefcaseId, changesetIndex: ChangesetIndex }) {\r\n for (const props of locks)\r\n this.releaseLock(props, arg);\r\n this.db.saveChanges();\r\n }\r\n\r\n public releaseAllLocks(arg: { briefcaseId: BriefcaseId, changesetIndex: ChangesetIndex }) {\r\n const locks = this.queryAllLocks(arg.briefcaseId);\r\n this.releaseLocks(locks, arg);\r\n }\r\n\r\n private countTable(tableName: string): number {\r\n return this.db.withSqliteStatement(`SELECT count(*) from ${tableName}`, (stmt) => {\r\n stmt.step();\r\n return stmt.getValueInteger(0);\r\n });\r\n }\r\n\r\n // for debugging\r\n public countSharedLocks(): number { return this.countTable(\"sharedLocks\"); }\r\n // for debugging\r\n public countLocks(): number { return this.countTable(\"locks\"); }\r\n\r\n // for debugging\r\n public queryAllSharedLocks(): { id: Id64String, briefcaseId: BriefcaseId }[] {\r\n const locks: { id: Id64String, briefcaseId: BriefcaseId }[] = [];\r\n this.db.withPreparedSqliteStatement(\"SELECT lockId,briefcaseId FROM sharedLocks\", (stmt) => {\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n locks.push({ id: stmt.getValueId(0), briefcaseId: stmt.getValueInteger(1) });\r\n });\r\n return locks;\r\n }\r\n\r\n // for debugging\r\n public queryLocks(): LocksEntry[] {\r\n const locks: LocksEntry[] = [];\r\n this.db.withPreparedSqliteStatement(\"SELECT id,level,lastCSetIndex,briefcaseId FROM locks\", (stmt) => {\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n locks.push({\r\n id: stmt.getValueId(0),\r\n level: stmt.getValueInteger(1),\r\n lastCsIndex: stmt.getValue(2).isNull ? undefined : stmt.getValueInteger(2),\r\n briefcaseId: stmt.getValue(3).isNull ? undefined : stmt.getValueInteger(3),\r\n });\r\n });\r\n return locks;\r\n }\r\n\r\n public removeDir(dirName: string) {\r\n if (IModelJsFs.existsSync(dirName)) {\r\n IModelJsFs.purgeDirSync(dirName);\r\n IModelJsFs.rmdirSync(dirName);\r\n }\r\n\r\n }\r\n public cleanup() {\r\n if (this._hubDb) {\r\n this._hubDb.closeDb();\r\n this._hubDb = undefined;\r\n }\r\n try {\r\n this.removeDir(BriefcaseManager.getIModelPath(this.iModelId));\r\n this.removeDir(this.rootDir);\r\n } catch (err) {\r\n // eslint-disable-next-line no-console\r\n console.log(`ERROR: test left an iModel open for [${this.iModelName}]. LocalMock cannot clean up - make sure you call imodel.close() in your test`);\r\n }\r\n }\r\n}\r\n"]}
@@ -1,21 +1,22 @@
1
- /** @packageDocumentation
2
- * @module IModelHost
3
- */
4
- import * as ws from "ws";
5
- import { IModelHostOptions } from "./IModelHost";
6
- /** @internal */
7
- export interface LocalhostIpcHostOpts {
8
- socketPort?: number;
9
- noServer?: boolean;
10
- }
11
- /** @internal */
12
- export declare class LocalhostIpcHost {
13
- private static _initialized;
14
- private static _socket;
15
- static connect(connection: ws): void;
16
- static startup(opts?: {
17
- localhostIpcHost?: LocalhostIpcHostOpts;
18
- iModelHost?: IModelHostOptions;
19
- }): Promise<void>;
20
- }
1
+ /** @packageDocumentation
2
+ * @module IModelHost
3
+ */
4
+ import * as ws from "ws";
5
+ import { IpcWebSocketBackend } from "@itwin/core-common";
6
+ import { IModelHostOptions } from "./IModelHost";
7
+ /** @internal */
8
+ export interface LocalhostIpcHostOpts {
9
+ socketPort?: number;
10
+ noServer?: boolean;
11
+ }
12
+ /** @internal */
13
+ export declare class LocalhostIpcHost {
14
+ private static _initialized;
15
+ static socket: IpcWebSocketBackend;
16
+ static connect(connection: ws): void;
17
+ static startup(opts?: {
18
+ localhostIpcHost?: LocalhostIpcHostOpts;
19
+ iModelHost?: IModelHostOptions;
20
+ }): Promise<void>;
21
+ }
21
22
  //# sourceMappingURL=LocalhostIpcHost.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"LocalhostIpcHost.d.ts","sourceRoot":"","sources":["../../src/LocalhostIpcHost.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAGzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,gBAAgB;AAChB,MAAM,WAAW,oBAAoB;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAuDD,gBAAgB;AAChB,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAC,YAAY,CAAS;IACpC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAsB;WAE9B,OAAO,CAAC,UAAU,EAAE,EAAE;WAIhB,OAAO,CAAC,IAAI,CAAC,EAAE;QAAE,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;QAAC,UAAU,CAAC,EAAE,iBAAiB,CAAA;KAAE;CAgB/G"}
1
+ {"version":3,"file":"LocalhostIpcHost.d.ts","sourceRoot":"","sources":["../../src/LocalhostIpcHost.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAuC,mBAAmB,EAAoE,MAAM,oBAAoB,CAAC;AAEhK,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,gBAAgB;AAChB,MAAM,WAAW,oBAAoB;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAuDD,gBAAgB;AAChB,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAC,YAAY,CAAS;IACpC,OAAc,MAAM,EAAE,mBAAmB,CAAC;WAE5B,OAAO,CAAC,UAAU,EAAE,EAAE;WAIhB,OAAO,CAAC,IAAI,CAAC,EAAE;QAAE,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;QAAC,UAAU,CAAC,EAAE,iBAAiB,CAAA;KAAE;CAgB/G"}
@@ -1,82 +1,80 @@
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.LocalhostIpcHost = void 0;
11
- const ws = require("ws");
12
- const core_common_1 = require("@itwin/core-common");
13
- const IpcHost_1 = require("./IpcHost");
14
- class LocalTransport extends core_common_1.IpcWebSocketTransport {
15
- constructor(opts) {
16
- var _a;
17
- super();
18
- this._connections = new Map();
19
- if (!opts.noServer) {
20
- this._server = new ws.Server({ port: (_a = opts.socketPort) !== null && _a !== void 0 ? _a : 3002 });
21
- this._server.on("connection", (connection) => LocalhostIpcHost.connect(connection));
22
- }
23
- }
24
- send(message) {
25
- this._connections.forEach((last, connection) => {
26
- message.sequence = last + 1;
27
- this._connections.set(connection, message.sequence);
28
- const parts = this.serialize(message);
29
- parts.forEach((part) => connection.send(part));
30
- });
31
- }
32
- connect(connection) {
33
- this._connections.set(connection, -1);
34
- connection.on("message", async (data) => {
35
- const message = await this.notifyIncoming(data, connection);
36
- if (core_common_1.IpcWebSocketMessage.skip(message)) {
37
- return;
38
- }
39
- for (const listener of core_common_1.IpcWebSocket.receivers) {
40
- listener({}, message);
41
- }
42
- });
43
- connection.on("close", () => {
44
- this._connections.delete(connection);
45
- this.notifyClose(connection);
46
- });
47
- }
48
- }
49
- class RpcHandler extends IpcHost_1.IpcHandler {
50
- constructor() {
51
- super(...arguments);
52
- this.channelName = "RPC";
53
- }
54
- async request(info) {
55
- const invocation = core_common_1.RpcSessionInvocation.create(info);
56
- const fulfillment = await invocation.fulfillment;
57
- return invocation.rejected ? Promise.reject(fulfillment.rawResult) : fulfillment.rawResult;
58
- }
59
- }
60
- /** @internal */
61
- class LocalhostIpcHost {
62
- static connect(connection) {
63
- core_common_1.IpcWebSocket.transport.connect(connection);
64
- }
65
- static async startup(opts) {
66
- var _a;
67
- let registerHandler = false;
68
- if (!this._initialized) {
69
- registerHandler = true;
70
- core_common_1.IpcWebSocket.transport = new LocalTransport((_a = opts === null || opts === void 0 ? void 0 : opts.localhostIpcHost) !== null && _a !== void 0 ? _a : {});
71
- this._socket = new core_common_1.IpcWebSocketBackend();
72
- this._initialized = true;
73
- }
74
- await IpcHost_1.IpcHost.startup({ ipcHost: { socket: this._socket }, iModelHost: opts === null || opts === void 0 ? void 0 : opts.iModelHost });
75
- if (registerHandler) {
76
- RpcHandler.register();
77
- }
78
- }
79
- }
80
- exports.LocalhostIpcHost = LocalhostIpcHost;
81
- LocalhostIpcHost._initialized = false;
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.LocalhostIpcHost = void 0;
11
+ const ws = require("ws");
12
+ const core_common_1 = require("@itwin/core-common");
13
+ const IpcHost_1 = require("./IpcHost");
14
+ class LocalTransport extends core_common_1.IpcWebSocketTransport {
15
+ constructor(opts) {
16
+ super();
17
+ this._connections = new Map();
18
+ if (!opts.noServer) {
19
+ this._server = new ws.Server({ port: opts.socketPort ?? 3002 });
20
+ this._server.on("connection", (connection) => LocalhostIpcHost.connect(connection));
21
+ }
22
+ }
23
+ send(message) {
24
+ this._connections.forEach((last, connection) => {
25
+ message.sequence = last + 1;
26
+ this._connections.set(connection, message.sequence);
27
+ const parts = this.serialize(message);
28
+ parts.forEach((part) => connection.send(part));
29
+ });
30
+ }
31
+ connect(connection) {
32
+ this._connections.set(connection, -1);
33
+ connection.on("message", async (data) => {
34
+ const message = await this.notifyIncoming(data, connection);
35
+ if (core_common_1.IpcWebSocketMessage.skip(message)) {
36
+ return;
37
+ }
38
+ for (const listener of core_common_1.IpcWebSocket.receivers) {
39
+ listener({}, message);
40
+ }
41
+ });
42
+ connection.on("close", () => {
43
+ this._connections.delete(connection);
44
+ this.notifyClose(connection);
45
+ });
46
+ }
47
+ }
48
+ class RpcHandler extends IpcHost_1.IpcHandler {
49
+ constructor() {
50
+ super(...arguments);
51
+ this.channelName = "RPC";
52
+ }
53
+ async request(info) {
54
+ const invocation = core_common_1.RpcSessionInvocation.create(info);
55
+ const fulfillment = await invocation.fulfillment;
56
+ return invocation.rejected ? Promise.reject(fulfillment.rawResult) : fulfillment.rawResult;
57
+ }
58
+ }
59
+ /** @internal */
60
+ class LocalhostIpcHost {
61
+ static connect(connection) {
62
+ core_common_1.IpcWebSocket.transport.connect(connection);
63
+ }
64
+ static async startup(opts) {
65
+ let registerHandler = false;
66
+ if (!this._initialized) {
67
+ registerHandler = true;
68
+ core_common_1.IpcWebSocket.transport = new LocalTransport(opts?.localhostIpcHost ?? {});
69
+ this.socket = new core_common_1.IpcWebSocketBackend();
70
+ this._initialized = true;
71
+ }
72
+ await IpcHost_1.IpcHost.startup({ ipcHost: { socket: this.socket }, iModelHost: opts?.iModelHost });
73
+ if (registerHandler) {
74
+ RpcHandler.register();
75
+ }
76
+ }
77
+ }
78
+ LocalhostIpcHost._initialized = false;
79
+ exports.LocalhostIpcHost = LocalhostIpcHost;
82
80
  //# sourceMappingURL=LocalhostIpcHost.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LocalhostIpcHost.js","sourceRoot":"","sources":["../../src/LocalhostIpcHost.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAEH,yBAAyB;AACzB,oDAAgK;AAChK,uCAAgD;AAShD,MAAM,cAAe,SAAQ,mCAAqB;IAIhD,YAAmB,IAA0B;;QAC3C,KAAK,EAAE,CAAC;QAHF,iBAAY,GAAoB,IAAI,GAAG,EAAE,CAAC;QAKhD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClB,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAA,IAAI,CAAC,UAAU,mCAAI,IAAI,EAAE,CAAC,CAAC;YAChE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;SACrF;IACH,CAAC;IAEM,IAAI,CAAC,OAA4B;QACtC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE;YAC7C,OAAO,CAAC,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC;YAC5B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;YACpD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACtC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,OAAO,CAAC,UAAc;QAC3B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;QAEtC,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACtC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAC5D,IAAI,iCAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;gBACrC,OAAO;aACR;YAED,KAAK,MAAM,QAAQ,IAAI,0BAAY,CAAC,SAAS,EAAE;gBAC7C,QAAQ,CAAC,EAAW,EAAE,OAAO,CAAC,CAAC;aAChC;QACH,CAAC,CAAC,CAAC;QAEH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAC1B,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACrC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAED,MAAM,UAAW,SAAQ,oBAAU;IAAnC;;QACS,gBAAW,GAAG,KAAK,CAAC;IAO7B,CAAC;IALQ,KAAK,CAAC,OAAO,CAAC,IAA2B;QAC9C,MAAM,UAAU,GAAG,kCAAoB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC;QACjD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC;IAC7F,CAAC;CACF;AAED,gBAAgB;AAChB,MAAa,gBAAgB;IAIpB,MAAM,CAAC,OAAO,CAAC,UAAc;QACjC,0BAAY,CAAC,SAA4B,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACjE,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAkF;;QAC5G,IAAI,eAAe,GAAG,KAAK,CAAC;QAE5B,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACtB,eAAe,GAAG,IAAI,CAAC;YACvB,0BAAY,CAAC,SAAS,GAAG,IAAI,cAAc,CAAC,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,gBAAgB,mCAAI,EAAE,CAAC,CAAC;YAC1E,IAAI,CAAC,OAAO,GAAG,IAAI,iCAAmB,EAAE,CAAC;YACzC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;SAC1B;QAED,MAAM,iBAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,UAAU,EAAE,CAAC,CAAC;QAE3F,IAAI,eAAe,EAAE;YACnB,UAAU,CAAC,QAAQ,EAAE,CAAC;SACvB;IACH,CAAC;;AAvBH,4CAwBC;AAvBgB,6BAAY,GAAG,KAAK,CAAC","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 IModelHost\r\n */\r\n\r\nimport * as ws from \"ws\";\r\nimport { InterceptedRpcRequest, IpcWebSocket, IpcWebSocketBackend, IpcWebSocketMessage, IpcWebSocketTransport, RpcSessionInvocation } from \"@itwin/core-common\";\r\nimport { IpcHandler, IpcHost } from \"./IpcHost\";\r\nimport { IModelHostOptions } from \"./IModelHost\";\r\n\r\n/** @internal */\r\nexport interface LocalhostIpcHostOpts {\r\n socketPort?: number;\r\n noServer?: boolean;\r\n}\r\n\r\nclass LocalTransport extends IpcWebSocketTransport {\r\n private _server: ws.Server | undefined;\r\n private _connections: Map<ws, number> = new Map();\r\n\r\n public constructor(opts: LocalhostIpcHostOpts) {\r\n super();\r\n\r\n if (!opts.noServer) {\r\n this._server = new ws.Server({ port: opts.socketPort ?? 3002 });\r\n this._server.on(\"connection\", (connection) => LocalhostIpcHost.connect(connection));\r\n }\r\n }\r\n\r\n public send(message: IpcWebSocketMessage): void {\r\n this._connections.forEach((last, connection) => {\r\n message.sequence = last + 1;\r\n this._connections.set(connection, message.sequence);\r\n const parts = this.serialize(message);\r\n parts.forEach((part) => connection.send(part));\r\n });\r\n }\r\n\r\n public connect(connection: ws) {\r\n this._connections.set(connection, -1);\r\n\r\n connection.on(\"message\", async (data) => {\r\n const message = await this.notifyIncoming(data, connection);\r\n if (IpcWebSocketMessage.skip(message)) {\r\n return;\r\n }\r\n\r\n for (const listener of IpcWebSocket.receivers) {\r\n listener({} as Event, message);\r\n }\r\n });\r\n\r\n connection.on(\"close\", () => {\r\n this._connections.delete(connection);\r\n this.notifyClose(connection);\r\n });\r\n }\r\n}\r\n\r\nclass RpcHandler extends IpcHandler {\r\n public channelName = \"RPC\";\r\n\r\n public async request(info: InterceptedRpcRequest) {\r\n const invocation = RpcSessionInvocation.create(info);\r\n const fulfillment = await invocation.fulfillment;\r\n return invocation.rejected ? Promise.reject(fulfillment.rawResult) : fulfillment.rawResult;\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class LocalhostIpcHost {\r\n private static _initialized = false;\r\n private static _socket: IpcWebSocketBackend;\r\n\r\n public static connect(connection: ws) {\r\n (IpcWebSocket.transport as LocalTransport).connect(connection);\r\n }\r\n\r\n public static async startup(opts?: { localhostIpcHost?: LocalhostIpcHostOpts, iModelHost?: IModelHostOptions }) {\r\n let registerHandler = false;\r\n\r\n if (!this._initialized) {\r\n registerHandler = true;\r\n IpcWebSocket.transport = new LocalTransport(opts?.localhostIpcHost ?? {});\r\n this._socket = new IpcWebSocketBackend();\r\n this._initialized = true;\r\n }\r\n\r\n await IpcHost.startup({ ipcHost: { socket: this._socket }, iModelHost: opts?.iModelHost });\r\n\r\n if (registerHandler) {\r\n RpcHandler.register();\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"LocalhostIpcHost.js","sourceRoot":"","sources":["../../src/LocalhostIpcHost.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 IModelHost\r\n */\r\n\r\nimport * as ws from \"ws\";\r\nimport { InterceptedRpcRequest, IpcWebSocket, IpcWebSocketBackend, IpcWebSocketMessage, IpcWebSocketTransport, RpcSessionInvocation } from \"@itwin/core-common\";\r\nimport { IpcHandler, IpcHost } from \"./IpcHost\";\r\nimport { IModelHostOptions } from \"./IModelHost\";\r\n\r\n/** @internal */\r\nexport interface LocalhostIpcHostOpts {\r\n socketPort?: number;\r\n noServer?: boolean;\r\n}\r\n\r\nclass LocalTransport extends IpcWebSocketTransport {\r\n private _server: ws.Server | undefined;\r\n private _connections: Map<ws, number> = new Map();\r\n\r\n public constructor(opts: LocalhostIpcHostOpts) {\r\n super();\r\n\r\n if (!opts.noServer) {\r\n this._server = new ws.Server({ port: opts.socketPort ?? 3002 });\r\n this._server.on(\"connection\", (connection) => LocalhostIpcHost.connect(connection));\r\n }\r\n }\r\n\r\n public send(message: IpcWebSocketMessage): void {\r\n this._connections.forEach((last, connection) => {\r\n message.sequence = last + 1;\r\n this._connections.set(connection, message.sequence);\r\n const parts = this.serialize(message);\r\n parts.forEach((part) => connection.send(part));\r\n });\r\n }\r\n\r\n public connect(connection: ws) {\r\n this._connections.set(connection, -1);\r\n\r\n connection.on(\"message\", async (data) => {\r\n const message = await this.notifyIncoming(data, connection);\r\n if (IpcWebSocketMessage.skip(message)) {\r\n return;\r\n }\r\n\r\n for (const listener of IpcWebSocket.receivers) {\r\n listener({} as Event, message);\r\n }\r\n });\r\n\r\n connection.on(\"close\", () => {\r\n this._connections.delete(connection);\r\n this.notifyClose(connection);\r\n });\r\n }\r\n}\r\n\r\nclass RpcHandler extends IpcHandler {\r\n public channelName = \"RPC\";\r\n\r\n public async request(info: InterceptedRpcRequest) {\r\n const invocation = RpcSessionInvocation.create(info);\r\n const fulfillment = await invocation.fulfillment;\r\n return invocation.rejected ? Promise.reject(fulfillment.rawResult) : fulfillment.rawResult;\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class LocalhostIpcHost {\r\n private static _initialized = false;\r\n public static socket: IpcWebSocketBackend;\r\n\r\n public static connect(connection: ws) {\r\n (IpcWebSocket.transport as LocalTransport).connect(connection);\r\n }\r\n\r\n public static async startup(opts?: { localhostIpcHost?: LocalhostIpcHostOpts, iModelHost?: IModelHostOptions }) {\r\n let registerHandler = false;\r\n\r\n if (!this._initialized) {\r\n registerHandler = true;\r\n IpcWebSocket.transport = new LocalTransport(opts?.localhostIpcHost ?? {});\r\n this.socket = new IpcWebSocketBackend();\r\n this._initialized = true;\r\n }\r\n\r\n await IpcHost.startup({ ipcHost: { socket: this.socket }, iModelHost: opts?.iModelHost });\r\n\r\n if (registerHandler) {\r\n RpcHandler.register();\r\n }\r\n }\r\n}\r\n"]}