@itwin/core-backend 3.0.0-dev.98 → 3.0.0

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 (163) hide show
  1. package/CHANGELOG.md +211 -67
  2. package/LICENSE.md +1 -1
  3. package/lib/cjs/AliCloudStorageService.d.ts +8 -2
  4. package/lib/cjs/AliCloudStorageService.d.ts.map +1 -1
  5. package/lib/cjs/AliCloudStorageService.js +4 -5
  6. package/lib/cjs/AliCloudStorageService.js.map +1 -1
  7. package/lib/cjs/BackendHubAccess.d.ts +9 -9
  8. package/lib/cjs/BackendHubAccess.d.ts.map +1 -1
  9. package/lib/cjs/BackendHubAccess.js.map +1 -1
  10. package/lib/cjs/BriefcaseManager.js +4 -3
  11. package/lib/cjs/BriefcaseManager.js.map +1 -1
  12. package/lib/cjs/Category.d.ts +1 -1
  13. package/lib/cjs/Category.d.ts.map +1 -1
  14. package/lib/cjs/Category.js +6 -6
  15. package/lib/cjs/Category.js.map +1 -1
  16. package/lib/cjs/ChangeSummaryManager.d.ts.map +1 -1
  17. package/lib/cjs/ChangeSummaryManager.js +2 -0
  18. package/lib/cjs/ChangeSummaryManager.js.map +1 -1
  19. package/lib/cjs/ChangedElementsDb.d.ts +2 -0
  20. package/lib/cjs/ChangedElementsDb.d.ts.map +1 -1
  21. package/lib/cjs/ChangedElementsDb.js +1 -1
  22. package/lib/cjs/ChangedElementsDb.js.map +1 -1
  23. package/lib/cjs/CheckpointManager.d.ts.map +1 -1
  24. package/lib/cjs/CheckpointManager.js +10 -7
  25. package/lib/cjs/CheckpointManager.js.map +1 -1
  26. package/lib/cjs/ClassRegistry.d.ts.map +1 -1
  27. package/lib/cjs/ClassRegistry.js +10 -3
  28. package/lib/cjs/ClassRegistry.js.map +1 -1
  29. package/lib/cjs/CloudStorageBackend.d.ts +2 -3
  30. package/lib/cjs/CloudStorageBackend.d.ts.map +1 -1
  31. package/lib/cjs/CloudStorageBackend.js +5 -2
  32. package/lib/cjs/CloudStorageBackend.js.map +1 -1
  33. package/lib/cjs/ConcurrentQuery.d.ts.map +1 -1
  34. package/lib/cjs/ConcurrentQuery.js +7 -0
  35. package/lib/cjs/ConcurrentQuery.js.map +1 -1
  36. package/lib/cjs/DevTools.d.ts +2 -2
  37. package/lib/cjs/DevTools.d.ts.map +1 -1
  38. package/lib/cjs/DevTools.js +2 -2
  39. package/lib/cjs/DevTools.js.map +1 -1
  40. package/lib/cjs/DisplayStyle.d.ts +2 -2
  41. package/lib/cjs/DisplayStyle.d.ts.map +1 -1
  42. package/lib/cjs/DisplayStyle.js +15 -47
  43. package/lib/cjs/DisplayStyle.js.map +1 -1
  44. package/lib/cjs/ECDb.d.ts +5 -9
  45. package/lib/cjs/ECDb.d.ts.map +1 -1
  46. package/lib/cjs/ECDb.js +11 -14
  47. package/lib/cjs/ECDb.js.map +1 -1
  48. package/lib/cjs/ECSchemaXmlContext.d.ts +1 -0
  49. package/lib/cjs/ECSchemaXmlContext.d.ts.map +1 -1
  50. package/lib/cjs/ECSchemaXmlContext.js +10 -4
  51. package/lib/cjs/ECSchemaXmlContext.js.map +1 -1
  52. package/lib/cjs/ECSqlStatement.d.ts +8 -8
  53. package/lib/cjs/ECSqlStatement.d.ts.map +1 -1
  54. package/lib/cjs/ECSqlStatement.js +24 -15
  55. package/lib/cjs/ECSqlStatement.js.map +1 -1
  56. package/lib/cjs/Element.d.ts +16 -16
  57. package/lib/cjs/Element.d.ts.map +1 -1
  58. package/lib/cjs/Element.js +9 -9
  59. package/lib/cjs/Element.js.map +1 -1
  60. package/lib/cjs/ElementAspect.d.ts +2 -2
  61. package/lib/cjs/ElementAspect.d.ts.map +1 -1
  62. package/lib/cjs/ElementAspect.js +2 -2
  63. package/lib/cjs/ElementAspect.js.map +1 -1
  64. package/lib/cjs/ElementGraphics.js +1 -1
  65. package/lib/cjs/ElementGraphics.js.map +1 -1
  66. package/lib/cjs/Entity.d.ts +11 -3
  67. package/lib/cjs/Entity.d.ts.map +1 -1
  68. package/lib/cjs/Entity.js +10 -2
  69. package/lib/cjs/Entity.js.map +1 -1
  70. package/lib/cjs/ExportGraphics.d.ts +1 -1
  71. package/lib/cjs/ExportGraphics.d.ts.map +1 -1
  72. package/lib/cjs/ExportGraphics.js +3 -0
  73. package/lib/cjs/ExportGraphics.js.map +1 -1
  74. package/lib/cjs/GeometrySummary.d.ts.map +1 -1
  75. package/lib/cjs/GeometrySummary.js +5 -2
  76. package/lib/cjs/GeometrySummary.js.map +1 -1
  77. package/lib/cjs/IModelDb.d.ts +44 -26
  78. package/lib/cjs/IModelDb.d.ts.map +1 -1
  79. package/lib/cjs/IModelDb.js +114 -42
  80. package/lib/cjs/IModelDb.js.map +1 -1
  81. package/lib/cjs/IModelHost.d.ts +40 -19
  82. package/lib/cjs/IModelHost.d.ts.map +1 -1
  83. package/lib/cjs/IModelHost.js +70 -20
  84. package/lib/cjs/IModelHost.js.map +1 -1
  85. package/lib/cjs/IModelJsFs.js +1 -1
  86. package/lib/cjs/IModelJsFs.js.map +1 -1
  87. package/lib/cjs/IpcHost.js +2 -1
  88. package/lib/cjs/IpcHost.js.map +1 -1
  89. package/lib/cjs/LocalhostIpcHost.d.ts.map +1 -1
  90. package/lib/cjs/LocalhostIpcHost.js +10 -3
  91. package/lib/cjs/LocalhostIpcHost.js.map +1 -1
  92. package/lib/cjs/Material.d.ts +1 -1
  93. package/lib/cjs/Material.d.ts.map +1 -1
  94. package/lib/cjs/Material.js +1 -1
  95. package/lib/cjs/Material.js.map +1 -1
  96. package/lib/cjs/Model.d.ts +4 -4
  97. package/lib/cjs/Model.d.ts.map +1 -1
  98. package/lib/cjs/Model.js +3 -3
  99. package/lib/cjs/Model.js.map +1 -1
  100. package/lib/cjs/NativeHost.d.ts +4 -22
  101. package/lib/cjs/NativeHost.d.ts.map +1 -1
  102. package/lib/cjs/NativeHost.js +4 -56
  103. package/lib/cjs/NativeHost.js.map +1 -1
  104. package/lib/cjs/Relationship.d.ts +10 -9
  105. package/lib/cjs/Relationship.d.ts.map +1 -1
  106. package/lib/cjs/Relationship.js +14 -8
  107. package/lib/cjs/Relationship.js.map +1 -1
  108. package/lib/cjs/RpcBackend.d.ts +4 -0
  109. package/lib/cjs/RpcBackend.d.ts.map +1 -1
  110. package/lib/cjs/RpcBackend.js +7 -0
  111. package/lib/cjs/RpcBackend.js.map +1 -1
  112. package/lib/cjs/SQLiteDb.js +1 -1
  113. package/lib/cjs/SQLiteDb.js.map +1 -1
  114. package/lib/cjs/ServerBasedLocks.d.ts +4 -10
  115. package/lib/cjs/ServerBasedLocks.d.ts.map +1 -1
  116. package/lib/cjs/ServerBasedLocks.js +12 -20
  117. package/lib/cjs/ServerBasedLocks.js.map +1 -1
  118. package/lib/cjs/SqliteStatement.d.ts.map +1 -1
  119. package/lib/cjs/SqliteStatement.js.map +1 -1
  120. package/lib/cjs/Texture.js +1 -1
  121. package/lib/cjs/Texture.js.map +1 -1
  122. package/lib/cjs/TxnManager.js +1 -1
  123. package/lib/cjs/TxnManager.js.map +1 -1
  124. package/lib/cjs/ViewDefinition.d.ts +11 -11
  125. package/lib/cjs/ViewDefinition.d.ts.map +1 -1
  126. package/lib/cjs/ViewDefinition.js +5 -5
  127. package/lib/cjs/ViewDefinition.js.map +1 -1
  128. package/lib/cjs/assets/Settings.schema.json +25 -0
  129. package/lib/cjs/core-backend.d.ts +8 -1
  130. package/lib/cjs/core-backend.d.ts.map +1 -1
  131. package/lib/cjs/core-backend.js +9 -1
  132. package/lib/cjs/core-backend.js.map +1 -1
  133. package/lib/cjs/domains/FunctionalElements.d.ts +1 -1
  134. package/lib/cjs/domains/FunctionalElements.d.ts.map +1 -1
  135. package/lib/cjs/domains/FunctionalElements.js.map +1 -1
  136. package/lib/cjs/domains/GenericElements.d.ts +2 -2
  137. package/lib/cjs/domains/GenericElements.d.ts.map +1 -1
  138. package/lib/cjs/domains/GenericElements.js.map +1 -1
  139. package/lib/cjs/rpc-impl/IModelReadRpcImpl.d.ts.map +1 -1
  140. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js +33 -24
  141. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  142. package/lib/cjs/rpc-impl/IModelTileRpcImpl.d.ts.map +1 -1
  143. package/lib/cjs/rpc-impl/IModelTileRpcImpl.js +10 -7
  144. package/lib/cjs/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  145. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.d.ts.map +1 -1
  146. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js +11 -1
  147. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  148. package/lib/cjs/rpc-impl/WipRpcImpl.d.ts.map +1 -1
  149. package/lib/cjs/rpc-impl/WipRpcImpl.js +3 -0
  150. package/lib/cjs/rpc-impl/WipRpcImpl.js.map +1 -1
  151. package/lib/cjs/workspace/Settings.d.ts +182 -0
  152. package/lib/cjs/workspace/Settings.d.ts.map +1 -0
  153. package/lib/cjs/workspace/Settings.js +144 -0
  154. package/lib/cjs/workspace/Settings.js.map +1 -0
  155. package/lib/cjs/workspace/SettingsSpecRegistry.d.ts +68 -0
  156. package/lib/cjs/workspace/SettingsSpecRegistry.d.ts.map +1 -0
  157. package/lib/cjs/workspace/SettingsSpecRegistry.js +122 -0
  158. package/lib/cjs/workspace/SettingsSpecRegistry.js.map +1 -0
  159. package/lib/cjs/workspace/Workspace.d.ts +306 -0
  160. package/lib/cjs/workspace/Workspace.d.ts.map +1 -0
  161. package/lib/cjs/workspace/Workspace.js +372 -0
  162. package/lib/cjs/workspace/Workspace.js.map +1 -0
  163. package/package.json +33 -19
@@ -7,69 +7,23 @@
7
7
  * @module NativeApp
8
8
  */
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.NativeHost = exports.NativeAppAuthorizationBackend = void 0;
10
+ exports.NativeHost = void 0;
11
11
  const path_1 = require("path");
12
12
  const core_bentley_1 = require("@itwin/core-bentley");
13
13
  const core_common_1 = require("@itwin/core-common");
14
- const itwin_client_1 = require("@bentley/itwin-client");
15
14
  const BriefcaseManager_1 = require("./BriefcaseManager");
16
15
  const CheckpointManager_1 = require("./CheckpointManager");
17
16
  const IModelHost_1 = require("./IModelHost");
18
17
  const IpcHost_1 = require("./IpcHost");
19
18
  const NativeAppStorage_1 = require("./NativeAppStorage");
20
- /** @internal */
21
- class NativeAppAuthorizationBackend extends itwin_client_1.ImsAuthorizationClient {
22
- constructor(config) {
23
- super();
24
- this._accessToken = "";
25
- this.expireSafety = 60 * 10; // refresh token 10 minutes before real expiration time
26
- this.config = config;
27
- }
28
- setAccessToken(token) {
29
- if (token === this._accessToken)
30
- return;
31
- this._accessToken = token;
32
- NativeHost.onAccessTokenChanged.raiseEvent(token);
33
- }
34
- async getAccessToken() {
35
- if (!this._accessToken) // TODO: This should happen from a timer, not here
36
- this.setAccessToken(await this.refreshToken());
37
- return this._accessToken;
38
- }
39
- async initialize(config) {
40
- var _c;
41
- this.config = config !== null && config !== void 0 ? config : this.config;
42
- if (!this.config)
43
- throw new core_common_1.IModelError(core_bentley_1.AuthStatus.Error, "Must specify a valid configuration when initializing authorization");
44
- if (this.config.expiryBuffer)
45
- this.expireSafety = this.config.expiryBuffer;
46
- this.issuerUrl = (_c = this.config.issuerUrl) !== null && _c !== void 0 ? _c : await this.getUrl();
47
- }
48
- }
49
- exports.NativeAppAuthorizationBackend = NativeAppAuthorizationBackend;
50
19
  /**
51
20
  * Implementation of NativeAppFunctions
52
21
  */
53
22
  class NativeAppHandler extends IpcHost_1.IpcHandler {
54
23
  get channelName() { return core_common_1.nativeAppChannel; }
55
- async setAccessToken(token) {
56
- NativeHost.authorization.setAccessToken(token);
57
- }
58
24
  async getAccessToken() {
59
- return NativeHost.authorization.getAccessToken();
60
- }
61
- async initializeAuth(props, config) {
62
- IModelHost_1.IModelHost.session.applicationId = props.applicationId;
63
- IModelHost_1.IModelHost.applicationVersion = props.applicationVersion;
64
- IModelHost_1.IModelHost.sessionId = props.sessionId;
65
- await NativeHost.authorization.initialize(config);
66
- return NativeHost.authorization.expireSafety;
67
- }
68
- async signIn() {
69
- return NativeHost.authorization.signIn();
70
- }
71
- async signOut() {
72
- return NativeHost.authorization.signOut();
25
+ var _c;
26
+ return (_c = IModelHost_1.IModelHost.authorizationClient) === null || _c === void 0 ? void 0 : _c.getAccessToken();
73
27
  }
74
28
  async checkInternetConnectivity() {
75
29
  return NativeHost.checkInternetConnectivity();
@@ -102,6 +56,7 @@ class NativeAppHandler extends IpcHost_1.IpcHandler {
102
56
  }
103
57
  const downloadPromise = BriefcaseManager_1.BriefcaseManager.downloadBriefcase(args);
104
58
  const checkAbort = () => {
59
+ (0, core_bentley_1.assert)(undefined !== args.fileName);
105
60
  const job = CheckpointManager_1.Downloads.isInProgress(args.fileName);
106
61
  return (job && job.request.abort === 1) ? 1 : 0;
107
62
  };
@@ -153,8 +108,6 @@ class NativeAppHandler extends IpcHost_1.IpcHandler {
153
108
  */
154
109
  class NativeHost {
155
110
  constructor() { } // no instances - static methods only
156
- /** @internal */
157
- static get authorization() { return IModelHost_1.IModelHost.authorizationClient; }
158
111
  /** Get the local cache folder for application settings */
159
112
  static get appSettingsCacheDir() {
160
113
  if (this._appSettingsCacheDir === undefined)
@@ -180,7 +133,6 @@ class NativeHost {
180
133
  if (!this.isValid) {
181
134
  this._isValid = true;
182
135
  this.onInternetConnectivityChanged.addListener((status) => NativeHost.notifyNativeFrontend("notifyInternetConnectivityChanged", status));
183
- this.onAccessTokenChanged.addListener((token) => NativeHost.notifyNativeFrontend("notifyAccessTokenChanged", token));
184
136
  this._applicationName = (_d = (_c = opt === null || opt === void 0 ? void 0 : opt.nativeHost) === null || _c === void 0 ? void 0 : _c.applicationName) !== null && _d !== void 0 ? _d : "iTwinApp";
185
137
  }
186
138
  await IpcHost_1.IpcHost.startup(opt);
@@ -191,7 +143,6 @@ class NativeHost {
191
143
  static async shutdown() {
192
144
  this._isValid = false;
193
145
  this.onInternetConnectivityChanged.clear();
194
- this.onAccessTokenChanged.clear();
195
146
  await IpcHost_1.IpcHost.shutdown();
196
147
  }
197
148
  /** get current value of internet connectivity */
@@ -207,14 +158,11 @@ class NativeHost {
207
158
  static overrideInternetConnectivity(_overridenBy, status) {
208
159
  if (this._reachability !== status) {
209
160
  this._reachability = status;
210
- itwin_client_1.RequestGlobalOptions.online = this._reachability === core_common_1.InternetConnectivityStatus.Online;
211
161
  this.onInternetConnectivityChanged.raiseEvent(status);
212
162
  }
213
163
  }
214
164
  }
215
165
  exports.NativeHost = NativeHost;
216
- /** Event called when the user's sign-in state changes - this may be due to calls to signIn(), signOut() or because the token was refreshed */
217
- NativeHost.onAccessTokenChanged = new core_bentley_1.BeEvent();
218
166
  /** Event called when the internet connectivity changes, if known. */
219
167
  NativeHost.onInternetConnectivityChanged = new core_bentley_1.BeEvent();
220
168
  NativeHost._isValid = false;
@@ -1 +1 @@
1
- {"version":3,"file":"NativeHost.js","sourceRoot":"","sources":["../../src/NativeHost.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 NativeApp\r\n */\r\n\r\nimport { join } from \"path\";\r\nimport { AccessToken, AuthStatus, BeEvent, GuidString } from \"@itwin/core-bentley\";\r\nimport {\r\n AuthorizationClient, BriefcaseProps, IModelError, InternetConnectivityStatus, LocalBriefcaseProps, NativeAppAuthorizationConfiguration, nativeAppChannel,\r\n NativeAppFunctions, NativeAppNotifications, nativeAppNotify, OverriddenBy, RequestNewBriefcaseProps, SessionProps, StorageValue,\r\n} from \"@itwin/core-common\";\r\nimport { ImsAuthorizationClient, RequestGlobalOptions } from \"@bentley/itwin-client\";\r\nimport { BriefcaseManager } from \"./BriefcaseManager\";\r\nimport { Downloads } from \"./CheckpointManager\";\r\nimport { IModelHost } from \"./IModelHost\";\r\nimport { IpcHandler, IpcHost, IpcHostOpts } from \"./IpcHost\";\r\nimport { NativeAppStorage } from \"./NativeAppStorage\";\r\n\r\n/** @internal */\r\nexport abstract class NativeAppAuthorizationBackend extends ImsAuthorizationClient implements AuthorizationClient {\r\n protected _accessToken: AccessToken = \"\";\r\n public abstract signIn(): Promise<void>;\r\n public abstract signOut(): Promise<void>;\r\n protected abstract refreshToken(): Promise<AccessToken>;\r\n public config?: NativeAppAuthorizationConfiguration;\r\n public expireSafety = 60 * 10; // refresh token 10 minutes before real expiration time\r\n public issuerUrl?: string;\r\n\r\n protected constructor(config?: NativeAppAuthorizationConfiguration) {\r\n super();\r\n this.config = config;\r\n }\r\n\r\n public setAccessToken(token: AccessToken) {\r\n if (token === this._accessToken)\r\n return;\r\n this._accessToken = token;\r\n NativeHost.onAccessTokenChanged.raiseEvent(token);\r\n }\r\n\r\n public async getAccessToken(): Promise<AccessToken> {\r\n if (!this._accessToken) // TODO: This should happen from a timer, not here\r\n this.setAccessToken(await this.refreshToken());\r\n return this._accessToken;\r\n }\r\n\r\n public async initialize(config?: NativeAppAuthorizationConfiguration) {\r\n this.config = config ?? this.config;\r\n if (!this.config)\r\n throw new IModelError(AuthStatus.Error, \"Must specify a valid configuration when initializing authorization\");\r\n if (this.config.expiryBuffer)\r\n this.expireSafety = this.config.expiryBuffer;\r\n this.issuerUrl = this.config.issuerUrl ?? await this.getUrl();\r\n }\r\n}\r\n\r\n/**\r\n * Implementation of NativeAppFunctions\r\n */\r\nclass NativeAppHandler extends IpcHandler implements NativeAppFunctions {\r\n public get channelName() { return nativeAppChannel; }\r\n\r\n public async setAccessToken(token: AccessToken) {\r\n NativeHost.authorization.setAccessToken(token);\r\n }\r\n public async getAccessToken(): Promise<AccessToken> {\r\n return NativeHost.authorization.getAccessToken();\r\n }\r\n public async initializeAuth(props: SessionProps, config?: NativeAppAuthorizationConfiguration): Promise<number> {\r\n IModelHost.session.applicationId = props.applicationId;\r\n IModelHost.applicationVersion = props.applicationVersion;\r\n IModelHost.sessionId = props.sessionId;\r\n\r\n await NativeHost.authorization.initialize(config);\r\n return NativeHost.authorization.expireSafety;\r\n }\r\n public async signIn(): Promise<void> {\r\n return NativeHost.authorization.signIn();\r\n }\r\n public async signOut(): Promise<void> {\r\n return NativeHost.authorization.signOut();\r\n }\r\n public async checkInternetConnectivity(): Promise<InternetConnectivityStatus> {\r\n return NativeHost.checkInternetConnectivity();\r\n }\r\n public async overrideInternetConnectivity(by: OverriddenBy, status: InternetConnectivityStatus): Promise<void> {\r\n NativeHost.overrideInternetConnectivity(by, status);\r\n }\r\n public async acquireNewBriefcaseId(iModelId: GuidString): Promise<number> {\r\n return BriefcaseManager.acquireNewBriefcaseId({ iModelId });\r\n }\r\n public async getBriefcaseFileName(props: BriefcaseProps): Promise<string> {\r\n return BriefcaseManager.getFileName(props);\r\n }\r\n public async downloadBriefcase(request: RequestNewBriefcaseProps, reportProgress: boolean, progressInterval?: number): Promise<LocalBriefcaseProps> {\r\n const args = {\r\n ...request,\r\n onProgress: (_a: number, _b: number) => checkAbort(),\r\n };\r\n\r\n if (reportProgress) {\r\n const interval = progressInterval ?? 250; // by default, only send progress events every 250 milliseconds\r\n let nextTime = Date.now() + interval;\r\n args.onProgress = (loaded, total) => {\r\n const now = Date.now();\r\n if (loaded >= total || now >= nextTime) {\r\n nextTime = now + interval;\r\n IpcHost.send(`nativeApp.progress-${request.iModelId}`, { loaded, total });\r\n }\r\n return checkAbort();\r\n };\r\n }\r\n\r\n const downloadPromise = BriefcaseManager.downloadBriefcase(args);\r\n const checkAbort = () => {\r\n const job = Downloads.isInProgress(args.fileName!);\r\n return (job && (job.request as any).abort === 1) ? 1 : 0;\r\n };\r\n return downloadPromise;\r\n }\r\n\r\n public async requestCancelDownloadBriefcase(fileName: string): Promise<boolean> {\r\n const job = Downloads.isInProgress(fileName);\r\n if (job)\r\n (job.request as any).abort = 1;\r\n return job !== undefined;\r\n }\r\n\r\n public async deleteBriefcaseFiles(fileName: string): Promise<void> {\r\n await BriefcaseManager.deleteBriefcaseFiles(fileName, await IModelHost.getAccessToken());\r\n }\r\n\r\n public async getCachedBriefcases(iModelId?: GuidString): Promise<LocalBriefcaseProps[]> {\r\n return BriefcaseManager.getCachedBriefcases(iModelId);\r\n }\r\n\r\n public async storageMgrOpen(storageId: string): Promise<string> {\r\n return NativeAppStorage.open(storageId).id;\r\n }\r\n\r\n public async storageMgrClose(storageId: string, deleteIt: boolean): Promise<void> {\r\n NativeAppStorage.find(storageId).close(deleteIt);\r\n }\r\n\r\n public async storageMgrNames(): Promise<string[]> {\r\n return NativeAppStorage.getStorageNames();\r\n }\r\n\r\n public async storageGetValueType(storageId: string, key: string): Promise<\"number\" | \"string\" | \"boolean\" | \"Uint8Array\" | \"null\" | undefined> {\r\n return NativeAppStorage.find(storageId).getValueType(key);\r\n }\r\n\r\n public async storageGet(storageId: string, key: string): Promise<StorageValue | undefined> {\r\n return NativeAppStorage.find(storageId).getData(key);\r\n }\r\n\r\n public async storageSet(storageId: string, key: string, value: StorageValue): Promise<void> {\r\n NativeAppStorage.find(storageId).setData(key, value);\r\n }\r\n\r\n public async storageRemove(storageId: string, key: string): Promise<void> {\r\n NativeAppStorage.find(storageId).removeData(key);\r\n }\r\n\r\n public async storageKeys(storageId: string): Promise<string[]> {\r\n return NativeAppStorage.find(storageId).getKeys();\r\n }\r\n\r\n public async storageRemoveAll(storageId: string): Promise<void> {\r\n NativeAppStorage.find(storageId).removeAll();\r\n }\r\n}\r\n\r\n/** Options for [[NativeHost.startup]]\r\n * @public */\r\nexport interface NativeHostOpts extends IpcHostOpts {\r\n nativeHost?: {\r\n /** Application name. Used, for example, to name the settings file. If not supplied, defaults to \"iTwinApp\". */\r\n applicationName?: string;\r\n };\r\n}\r\n\r\n/**\r\n * Backend for desktop/mobile native applications\r\n * @public\r\n */\r\nexport class NativeHost {\r\n private static _reachability?: InternetConnectivityStatus;\r\n private static _applicationName: string;\r\n private constructor() { } // no instances - static methods only\r\n\r\n /** @internal */\r\n public static get authorization() { return IModelHost.authorizationClient as NativeAppAuthorizationBackend; }\r\n\r\n /** Event called when the user's sign-in state changes - this may be due to calls to signIn(), signOut() or because the token was refreshed */\r\n public static readonly onAccessTokenChanged = new BeEvent<(token: AccessToken) => void>();\r\n\r\n /** Event called when the internet connectivity changes, if known. */\r\n public static readonly onInternetConnectivityChanged = new BeEvent<(status: InternetConnectivityStatus) => void>();\r\n\r\n private static _appSettingsCacheDir?: string;\r\n\r\n /** Get the local cache folder for application settings */\r\n public static get appSettingsCacheDir(): string {\r\n if (this._appSettingsCacheDir === undefined)\r\n this._appSettingsCacheDir = join(IModelHost.cacheDir, \"appSettings\");\r\n return this._appSettingsCacheDir;\r\n }\r\n\r\n /** Send a notification to the NativeApp connected to this NativeHost. */\r\n public static notifyNativeFrontend<T extends keyof NativeAppNotifications>(methodName: T, ...args: Parameters<NativeAppNotifications[T]>) {\r\n return IpcHost.send(nativeAppNotify, methodName, ...args);\r\n }\r\n\r\n private static _isValid = false;\r\n public static get isValid(): boolean { return this._isValid; }\r\n public static get applicationName() { return this._applicationName; }\r\n /** Get the settings store for this NativeHost. */\r\n public static get settingsStore() {\r\n return NativeAppStorage.open(this.applicationName);\r\n }\r\n\r\n /**\r\n * Start the backend of a native app.\r\n * @note this method calls [[IpcHost.startup]] internally.\r\n */\r\n public static async startup(opt?: NativeHostOpts): Promise<void> {\r\n if (!this.isValid) {\r\n this._isValid = true;\r\n this.onInternetConnectivityChanged.addListener((status: InternetConnectivityStatus) =>\r\n NativeHost.notifyNativeFrontend(\"notifyInternetConnectivityChanged\", status));\r\n this.onAccessTokenChanged.addListener((token: AccessToken) =>\r\n NativeHost.notifyNativeFrontend(\"notifyAccessTokenChanged\", token));\r\n this._applicationName = opt?.nativeHost?.applicationName ?? \"iTwinApp\";\r\n }\r\n\r\n await IpcHost.startup(opt);\r\n if (IpcHost.isValid) // for tests, we use NativeHost but don't have a frontend\r\n NativeAppHandler.register();\r\n }\r\n\r\n /** Shutdown native app backend. Also calls [[IpcHost.shutdown]] */\r\n public static async shutdown(): Promise<void> {\r\n this._isValid = false;\r\n this.onInternetConnectivityChanged.clear();\r\n this.onAccessTokenChanged.clear();\r\n await IpcHost.shutdown();\r\n }\r\n\r\n /** get current value of internet connectivity */\r\n public static checkInternetConnectivity(): InternetConnectivityStatus {\r\n return this._reachability ?? InternetConnectivityStatus.Online;\r\n }\r\n\r\n /**\r\n * Override internet connectivity state\r\n * @param _overridenBy who overrode the value.\r\n * @internal\r\n */\r\n public static overrideInternetConnectivity(_overridenBy: OverriddenBy, status: InternetConnectivityStatus): void {\r\n if (this._reachability !== status) {\r\n this._reachability = status;\r\n RequestGlobalOptions.online = this._reachability === InternetConnectivityStatus.Online;\r\n this.onInternetConnectivityChanged.raiseEvent(status);\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"NativeHost.js","sourceRoot":"","sources":["../../src/NativeHost.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 NativeApp\r\n */\r\n\r\nimport { join } from \"path\";\r\nimport { AccessToken, assert, BeEvent, GuidString } from \"@itwin/core-bentley\";\r\nimport {\r\n BriefcaseProps, InternetConnectivityStatus, LocalBriefcaseProps, nativeAppChannel, NativeAppFunctions, NativeAppNotifications, nativeAppNotify,\r\n OverriddenBy, RequestNewBriefcaseProps, StorageValue,\r\n} from \"@itwin/core-common\";\r\nimport { BriefcaseManager } from \"./BriefcaseManager\";\r\nimport { Downloads } from \"./CheckpointManager\";\r\nimport { IModelHost } from \"./IModelHost\";\r\nimport { IpcHandler, IpcHost, IpcHostOpts } from \"./IpcHost\";\r\nimport { NativeAppStorage } from \"./NativeAppStorage\";\r\n\r\n/**\r\n * Implementation of NativeAppFunctions\r\n */\r\nclass NativeAppHandler extends IpcHandler implements NativeAppFunctions {\r\n public get channelName() { return nativeAppChannel; }\r\n\r\n public async getAccessToken(): Promise<AccessToken | undefined> {\r\n return IModelHost.authorizationClient?.getAccessToken();\r\n }\r\n\r\n public async checkInternetConnectivity(): Promise<InternetConnectivityStatus> {\r\n return NativeHost.checkInternetConnectivity();\r\n }\r\n public async overrideInternetConnectivity(by: OverriddenBy, status: InternetConnectivityStatus): Promise<void> {\r\n NativeHost.overrideInternetConnectivity(by, status);\r\n }\r\n public async acquireNewBriefcaseId(iModelId: GuidString): Promise<number> {\r\n return BriefcaseManager.acquireNewBriefcaseId({ iModelId });\r\n }\r\n public async getBriefcaseFileName(props: BriefcaseProps): Promise<string> {\r\n return BriefcaseManager.getFileName(props);\r\n }\r\n public async downloadBriefcase(request: RequestNewBriefcaseProps, reportProgress: boolean, progressInterval?: number): Promise<LocalBriefcaseProps> {\r\n const args = {\r\n ...request,\r\n onProgress: (_a: number, _b: number) => checkAbort(),\r\n };\r\n\r\n if (reportProgress) {\r\n const interval = progressInterval ?? 250; // by default, only send progress events every 250 milliseconds\r\n let nextTime = Date.now() + interval;\r\n args.onProgress = (loaded, total) => {\r\n const now = Date.now();\r\n if (loaded >= total || now >= nextTime) {\r\n nextTime = now + interval;\r\n IpcHost.send(`nativeApp.progress-${request.iModelId}`, { loaded, total });\r\n }\r\n return checkAbort();\r\n };\r\n }\r\n\r\n const downloadPromise = BriefcaseManager.downloadBriefcase(args);\r\n const checkAbort = () => {\r\n assert(undefined !== args.fileName);\r\n const job = Downloads.isInProgress(args.fileName);\r\n return (job && (job.request as any).abort === 1) ? 1 : 0;\r\n };\r\n return downloadPromise;\r\n }\r\n\r\n public async requestCancelDownloadBriefcase(fileName: string): Promise<boolean> {\r\n const job = Downloads.isInProgress(fileName);\r\n if (job)\r\n (job.request as any).abort = 1;\r\n return job !== undefined;\r\n }\r\n\r\n public async deleteBriefcaseFiles(fileName: string): Promise<void> {\r\n await BriefcaseManager.deleteBriefcaseFiles(fileName, await IModelHost.getAccessToken());\r\n }\r\n\r\n public async getCachedBriefcases(iModelId?: GuidString): Promise<LocalBriefcaseProps[]> {\r\n return BriefcaseManager.getCachedBriefcases(iModelId);\r\n }\r\n\r\n public async storageMgrOpen(storageId: string): Promise<string> {\r\n return NativeAppStorage.open(storageId).id;\r\n }\r\n\r\n public async storageMgrClose(storageId: string, deleteIt: boolean): Promise<void> {\r\n NativeAppStorage.find(storageId).close(deleteIt);\r\n }\r\n\r\n public async storageMgrNames(): Promise<string[]> {\r\n return NativeAppStorage.getStorageNames();\r\n }\r\n\r\n public async storageGetValueType(storageId: string, key: string): Promise<\"number\" | \"string\" | \"boolean\" | \"Uint8Array\" | \"null\" | undefined> {\r\n return NativeAppStorage.find(storageId).getValueType(key);\r\n }\r\n\r\n public async storageGet(storageId: string, key: string): Promise<StorageValue | undefined> {\r\n return NativeAppStorage.find(storageId).getData(key);\r\n }\r\n\r\n public async storageSet(storageId: string, key: string, value: StorageValue): Promise<void> {\r\n NativeAppStorage.find(storageId).setData(key, value);\r\n }\r\n\r\n public async storageRemove(storageId: string, key: string): Promise<void> {\r\n NativeAppStorage.find(storageId).removeData(key);\r\n }\r\n\r\n public async storageKeys(storageId: string): Promise<string[]> {\r\n return NativeAppStorage.find(storageId).getKeys();\r\n }\r\n\r\n public async storageRemoveAll(storageId: string): Promise<void> {\r\n NativeAppStorage.find(storageId).removeAll();\r\n }\r\n}\r\n\r\n/** Options for [[NativeHost.startup]]\r\n * @public\r\n */\r\nexport interface NativeHostOpts extends IpcHostOpts {\r\n nativeHost?: {\r\n /** Application name. Used, for example, to name the settings file. If not supplied, defaults to \"iTwinApp\". */\r\n applicationName?: string;\r\n };\r\n}\r\n\r\n/**\r\n * Backend for desktop/mobile native applications\r\n * @public\r\n */\r\nexport class NativeHost {\r\n private static _reachability?: InternetConnectivityStatus;\r\n private static _applicationName: string;\r\n private constructor() { } // no instances - static methods only\r\n\r\n /** Event called when the internet connectivity changes, if known. */\r\n public static readonly onInternetConnectivityChanged = new BeEvent<(status: InternetConnectivityStatus) => void>();\r\n\r\n private static _appSettingsCacheDir?: string;\r\n\r\n /** Get the local cache folder for application settings */\r\n public static get appSettingsCacheDir(): string {\r\n if (this._appSettingsCacheDir === undefined)\r\n this._appSettingsCacheDir = join(IModelHost.cacheDir, \"appSettings\");\r\n return this._appSettingsCacheDir;\r\n }\r\n\r\n /** Send a notification to the NativeApp connected to this NativeHost. */\r\n public static notifyNativeFrontend<T extends keyof NativeAppNotifications>(methodName: T, ...args: Parameters<NativeAppNotifications[T]>) {\r\n return IpcHost.send(nativeAppNotify, methodName, ...args);\r\n }\r\n\r\n private static _isValid = false;\r\n public static get isValid(): boolean { return this._isValid; }\r\n public static get applicationName() { return this._applicationName; }\r\n /** Get the settings store for this NativeHost. */\r\n public static get settingsStore() {\r\n return NativeAppStorage.open(this.applicationName);\r\n }\r\n\r\n /**\r\n * Start the backend of a native app.\r\n * @note this method calls [[IpcHost.startup]] internally.\r\n */\r\n public static async startup(opt?: NativeHostOpts): Promise<void> {\r\n if (!this.isValid) {\r\n this._isValid = true;\r\n this.onInternetConnectivityChanged.addListener((status: InternetConnectivityStatus) =>\r\n NativeHost.notifyNativeFrontend(\"notifyInternetConnectivityChanged\", status));\r\n this._applicationName = opt?.nativeHost?.applicationName ?? \"iTwinApp\";\r\n }\r\n\r\n await IpcHost.startup(opt);\r\n if (IpcHost.isValid) // for tests, we use NativeHost but don't have a frontend\r\n NativeAppHandler.register();\r\n }\r\n\r\n /** Shutdown native app backend. Also calls [[IpcHost.shutdown]] */\r\n public static async shutdown(): Promise<void> {\r\n this._isValid = false;\r\n this.onInternetConnectivityChanged.clear();\r\n await IpcHost.shutdown();\r\n }\r\n\r\n /** get current value of internet connectivity */\r\n public static checkInternetConnectivity(): InternetConnectivityStatus {\r\n return this._reachability ?? InternetConnectivityStatus.Online;\r\n }\r\n\r\n /**\r\n * Override internet connectivity state\r\n * @param _overridenBy who overrode the value.\r\n * @internal\r\n */\r\n public static overrideInternetConnectivity(_overridenBy: OverriddenBy, status: InternetConnectivityStatus): void {\r\n if (this._reachability !== status) {\r\n this._reachability = status;\r\n this.onInternetConnectivityChanged.raiseEvent(status);\r\n }\r\n }\r\n}\r\n"]}
@@ -9,7 +9,7 @@ export type { SourceAndTarget, RelationshipProps } from "@itwin/core-common";
9
9
  /** Base class for all link table ECRelationships
10
10
  * @public
11
11
  */
12
- export declare class Relationship extends Entity implements RelationshipProps {
12
+ export declare class Relationship extends Entity {
13
13
  /** @internal */
14
14
  static get className(): string;
15
15
  readonly sourceId: Id64String;
@@ -204,8 +204,8 @@ export interface ElementDrivesElementProps extends RelationshipProps {
204
204
  * * Inputs - The sources of all edges that point to the element. This includes all upstream elements that flow into the element.
205
205
  * * Outputs - The targets of all edges that point out of the element. This includes all downstream elements.
206
206
  *
207
- * #Subgraph Processing
208
- * When changes are made, iModel.js finds and processes only the part of the overall graph that is affected. So, for example,
207
+ * # Subgraph Processing
208
+ * When changes are made, only the part of the overall graph that is affected will be processed. So, for example,
209
209
  * suppose we have this graph:
210
210
  * ```
211
211
  * e1 --> e2 --> e3
@@ -243,7 +243,7 @@ export interface ElementDrivesElementProps extends RelationshipProps {
243
243
  * e31
244
244
  * ```
245
245
  * # Callbacks
246
- * Once iModel.js has found the affected subgraph to process, it propagates changes through it by making callbacks.
246
+ * Once the affected subgraph to process is found, it propagates changes through it by making callbacks.
247
247
  * Classes for both elements (nodes) and ElementDrivesElements relationships (edges) can receive callbacks.
248
248
  *
249
249
  * ## ElementDrivesElement Callbacks
@@ -319,19 +319,19 @@ export interface ElementDrivesElementProps extends RelationshipProps {
319
319
  * involved in a cycle will have their status set to 1, indicating a failure.
320
320
  *
321
321
  * A callback may call txnManager.reportError to reject an invalid change. It can classify the error as fatal or just a warning.
322
- * A callback make set the status value of an ElementDrivesElement instance to 1 to indicate a processing falure in that edge.
322
+ * A callback make set the status value of an ElementDrivesElement instance to 1 to indicate a processing failure in that edge.
323
323
  *
324
324
  * After BriefcaseDb.saveChanges is called, an app should check db.txns.validationErrors and db.txns.hasFatalError to find out if graph-evaluation failed.
325
325
  *
326
326
  * @beta
327
327
  */
328
- export declare class ElementDrivesElement extends Relationship implements ElementDrivesElementProps {
328
+ export declare class ElementDrivesElement extends Relationship {
329
329
  /** @internal */
330
330
  static get className(): string;
331
331
  /** Relationship status
332
- * * 0 indicates no errors. iModel.js sets this after a successful evaluation.
333
- * * 1 indicates that this driving relationship could not be evaluated. The callback itself can set this to indicate that it failed to process the input changes. Also, iModel.js sets this if it finds that the relationship is part of a circular dependency.
334
- * * 0x80 The app or callback can set this to tell iModel.js not propagate changes through this relationship.
332
+ * * 0 indicates no errors. Set after a successful evaluation.
333
+ * * 1 indicates that this driving relationship could not be evaluated. The callback itself can set this to indicate that it failed to process the input changes. Also, it is set if the relationship is part of a circular dependency.
334
+ * * 0x80 The app or callback can set this to indicate to not propagate changes through this relationship.
335
335
  */
336
336
  status: number;
337
337
  /** Affects the order in which relationships are processed in the case where two relationships have the same output. */
@@ -339,6 +339,7 @@ export declare class ElementDrivesElement extends Relationship implements Elemen
339
339
  /** @internal */
340
340
  constructor(props: ElementDrivesElementProps, iModel: IModelDb);
341
341
  static create<T extends ElementRefersToElements>(iModel: IModelDb, sourceId: Id64String, targetId: Id64String, priority?: number): T;
342
+ toJSON(): ElementDrivesElementProps;
342
343
  }
343
344
  /** Manages [[Relationship]]s.
344
345
  * @public
@@ -1 +1 @@
1
- {"version":3,"file":"Relationship.d.ts","sourceRoot":"","sources":["../../src/Relationship.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAkB,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAA6B,iBAAiB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEnG,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE7E;;GAEG;AACH,qBAAa,YAAa,SAAQ,MAAO,YAAW,iBAAiB;IACnE,gBAAgB;IAChB,WAA2B,SAAS,IAAI,MAAM,CAA2B;IACzE,SAAgB,QAAQ,EAAE,UAAU,CAAC;IACrC,SAAgB,QAAQ,EAAE,UAAU,CAAC;IAErC,gBAAgB;gBACJ,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,QAAQ;IAMtD,gBAAgB;IACA,MAAM,IAAI,iBAAiB;IAO3C;;;;;;OAMG;WACW,aAAa,CAAC,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,QAAQ,GAAG,IAAI;IAE/E;;;;;OAKG;WACW,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,QAAQ,GAAG,IAAI;IAErF,gDAAgD;IACzC,MAAM,IAAI,UAAU;IAC3B,8CAA8C;IACvC,MAAM;IACb,gDAAgD;IACzC,MAAM;WAEC,WAAW,CAAC,CAAC,SAAS,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,GAAG,eAAe,GAAG,CAAC;CAC/G;AAED;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,YAAY;IACvD,gBAAgB;IAChB,WAA2B,SAAS,IAAI,MAAM,CAAsC;IACpF;;;;;OAKG;WACW,MAAM,CAAC,CAAC,SAAS,uBAAuB,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,GAAG,CAAC;IAGxH;;;;;OAKG;WACW,MAAM,CAAC,CAAC,SAAS,uBAAuB,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,GAAG,UAAU;CAIlI;AAED;;GAEG;AACH,qBAAa,+BAAgC,SAAQ,uBAAuB;IAC1E,gBAAgB;IAChB,WAA2B,SAAS,IAAI,MAAM,CAA8C;CAC7F;AAED;;GAEG;AACH,qBAAa,mCAAoC,SAAQ,uBAAuB;IAC9E,gBAAgB;IAChB,WAA2B,SAAS,IAAI,MAAM,CAAkD;CACjG;AAED;;;;GAIG;AACH,qBAAa,qCAAsC,SAAQ,uBAAuB;IAChF,gBAAgB;IAChB,WAA2B,SAAS,IAAI,MAAM,CAAoD;CACnG;AAED;;;GAGG;AACH,qBAAa,yCAA0C,SAAQ,qCAAqC;IAClG,gBAAgB;IAChB,WAA2B,SAAS,IAAI,MAAM,CAAwD;CACvG;AAED;;GAEG;AACH,MAAM,WAAW,yBAA0B,SAAQ,iBAAiB;IAClE,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,uBAAuB;IAC/D,gBAAgB;IAChB,WAA2B,SAAS,IAAI,MAAM,CAAmC;IAC1E,cAAc,EAAE,MAAM,CAAC;gBAElB,KAAK,EAAE,yBAAyB,EAAE,MAAM,EAAE,QAAQ;WAKvC,MAAM,CAAC,CAAC,SAAS,uBAAuB,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,GAAE,MAAU,GAAG,CAAC;CAI9J;AAED;;;GAGG;AACH,qBAAa,gCAAiC,SAAQ,oBAAoB;IACxE,gBAAgB;IAChB,WAA2B,SAAS,IAAI,MAAM,CAA+C;CAC9F;AAED;;;;GAIG;AACH,qBAAa,qBAAsB,SAAQ,oBAAoB;IAC7D,gBAAgB;IAChB,WAA2B,SAAS,IAAI,MAAM,CAAoC;CACnF;AAED;;;GAGG;AACH,qBAAa,gCAAiC,SAAQ,oBAAoB;IACxE,gBAAgB;IAChB,WAA2B,SAAS,IAAI,MAAM,CAA+C;CAC9F;AAED;;GAEG;AACH,MAAM,WAAW,yBAA0B,SAAQ,iBAAiB;IAClE,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuLG;AACH,qBAAa,oBAAqB,SAAQ,YAAa,YAAW,yBAAyB;IACzF,gBAAgB;IAChB,WAA2B,SAAS,IAAI,MAAM,CAAmC;IACjF;;;;OAIG;IACI,MAAM,EAAE,MAAM,CAAC;IACtB,uHAAuH;IAChH,QAAQ,EAAE,MAAM,CAAC;IAExB,gBAAgB;gBACJ,KAAK,EAAE,yBAAyB,EAAE,MAAM,EAAE,QAAQ;WAMhD,MAAM,CAAC,CAAC,SAAS,uBAAuB,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,GAAE,MAAU,GAAG,CAAC;CAI/I;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAW;IAE1B,gBAAgB;gBACJ,MAAM,EAAE,QAAQ;IAE5B;;;OAGG;IACI,cAAc,CAAC,KAAK,EAAE,iBAAiB,GAAG,YAAY;IAE7D,2EAA2E;IAC3E,OAAO,CAAC,sBAAsB;IAM9B;;;;OAIG;IACI,cAAc,CAAC,KAAK,EAAE,iBAAiB,GAAG,UAAU;IAK3D;;OAEG;IACI,cAAc,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAIrD,wDAAwD;IACjD,cAAc,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAIrD;;;;;OAKG;IACI,gBAAgB,CAAC,CAAC,SAAS,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,GAAG,eAAe,GAAG,CAAC;IAQzH;;;;;;OAMG;IACI,mBAAmB,CAAC,CAAC,SAAS,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,GAAG,eAAe,GAAG,CAAC,GAAG,SAAS;IAoBxI;;;;;OAKG;IACI,WAAW,CAAC,CAAC,SAAS,YAAY,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,GAAG,eAAe,GAAG,CAAC;IAI9G;;;;;;OAMG;IACI,cAAc,CAAC,CAAC,SAAS,YAAY,EAAE,gBAAgB,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,GAAG,eAAe,GAAG,CAAC,GAAG,SAAS;CAI/H"}
1
+ {"version":3,"file":"Relationship.d.ts","sourceRoot":"","sources":["../../src/Relationship.ts"],"names":[],"mappings":"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"}
@@ -46,11 +46,11 @@ class Relationship extends Entity_1.Entity {
46
46
  */
47
47
  static onDeletedDependency(_props, _iModel) { }
48
48
  /** Insert this Relationship into the iModel. */
49
- insert() { return this.iModel.relationships.insertInstance(this); }
49
+ insert() { return this.id = this.iModel.relationships.insertInstance(this.toJSON()); }
50
50
  /** Update this Relationship in the iModel. */
51
- update() { this.iModel.relationships.updateInstance(this); }
51
+ update() { this.iModel.relationships.updateInstance(this.toJSON()); }
52
52
  /** Delete this Relationship from the iModel. */
53
- delete() { this.iModel.relationships.deleteInstance(this); }
53
+ delete() { this.iModel.relationships.deleteInstance(this.toJSON()); }
54
54
  static getInstance(iModel, criteria) { return iModel.relationships.getInstance(this.classFullName, criteria); }
55
55
  }
56
56
  exports.Relationship = Relationship;
@@ -77,7 +77,7 @@ class ElementRefersToElements extends Relationship {
77
77
  */
78
78
  static insert(iModel, sourceId, targetId) {
79
79
  const relationship = this.create(iModel, sourceId, targetId);
80
- return iModel.relationships.insertInstance(relationship);
80
+ return iModel.relationships.insertInstance(relationship.toJSON());
81
81
  }
82
82
  }
83
83
  exports.ElementRefersToElements = ElementRefersToElements;
@@ -223,8 +223,8 @@ exports.ExternalSourceGroupGroupsSources = ExternalSourceGroupGroupsSources;
223
223
  * * Inputs - The sources of all edges that point to the element. This includes all upstream elements that flow into the element.
224
224
  * * Outputs - The targets of all edges that point out of the element. This includes all downstream elements.
225
225
  *
226
- * #Subgraph Processing
227
- * When changes are made, iModel.js finds and processes only the part of the overall graph that is affected. So, for example,
226
+ * # Subgraph Processing
227
+ * When changes are made, only the part of the overall graph that is affected will be processed. So, for example,
228
228
  * suppose we have this graph:
229
229
  * ```
230
230
  * e1 --> e2 --> e3
@@ -262,7 +262,7 @@ exports.ExternalSourceGroupGroupsSources = ExternalSourceGroupGroupsSources;
262
262
  * e31
263
263
  * ```
264
264
  * # Callbacks
265
- * Once iModel.js has found the affected subgraph to process, it propagates changes through it by making callbacks.
265
+ * Once the affected subgraph to process is found, it propagates changes through it by making callbacks.
266
266
  * Classes for both elements (nodes) and ElementDrivesElements relationships (edges) can receive callbacks.
267
267
  *
268
268
  * ## ElementDrivesElement Callbacks
@@ -338,7 +338,7 @@ exports.ExternalSourceGroupGroupsSources = ExternalSourceGroupGroupsSources;
338
338
  * involved in a cycle will have their status set to 1, indicating a failure.
339
339
  *
340
340
  * A callback may call txnManager.reportError to reject an invalid change. It can classify the error as fatal or just a warning.
341
- * A callback make set the status value of an ElementDrivesElement instance to 1 to indicate a processing falure in that edge.
341
+ * A callback make set the status value of an ElementDrivesElement instance to 1 to indicate a processing failure in that edge.
342
342
  *
343
343
  * After BriefcaseDb.saveChanges is called, an app should check db.txns.validationErrors and db.txns.hasFatalError to find out if graph-evaluation failed.
344
344
  *
@@ -357,6 +357,12 @@ class ElementDrivesElement extends Relationship {
357
357
  const props = { sourceId, targetId, priority, status: 0, classFullName: this.classFullName };
358
358
  return iModel.relationships.createInstance(props);
359
359
  }
360
+ toJSON() {
361
+ const props = super.toJSON();
362
+ props.status = this.status;
363
+ props.priority = this.priority;
364
+ return props;
365
+ }
360
366
  }
361
367
  exports.ElementDrivesElement = ElementDrivesElement;
362
368
  /** Manages [[Relationship]]s.
@@ -1 +1 @@
1
- {"version":3,"file":"Relationship.js","sourceRoot":"","sources":["../../src/Relationship.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 Relationships\r\n */\r\n\r\nimport { DbResult, Id64, Id64String } from \"@itwin/core-bentley\";\r\nimport { IModelError, IModelStatus, RelationshipProps, SourceAndTarget } from \"@itwin/core-common\";\r\nimport { ECSqlStatement } from \"./ECSqlStatement\";\r\nimport { Entity } from \"./Entity\";\r\nimport { IModelDb } from \"./IModelDb\";\r\n\r\nexport type { SourceAndTarget, RelationshipProps } from \"@itwin/core-common\"; // for backwards compatibility\r\n\r\n/** Base class for all link table ECRelationships\r\n * @public\r\n */\r\nexport class Relationship extends Entity implements RelationshipProps {\r\n /** @internal */\r\n public static override get className(): string { return \"Relationship\"; }\r\n public readonly sourceId: Id64String;\r\n public readonly targetId: Id64String;\r\n\r\n /** @internal */\r\n constructor(props: RelationshipProps, iModel: IModelDb) {\r\n super(props, iModel);\r\n this.sourceId = Id64.fromJSON(props.sourceId);\r\n this.targetId = Id64.fromJSON(props.targetId);\r\n }\r\n\r\n /** @internal */\r\n public override toJSON(): RelationshipProps {\r\n const val = super.toJSON() as RelationshipProps;\r\n val.sourceId = this.sourceId;\r\n val.targetId = this.targetId;\r\n return val;\r\n }\r\n\r\n /**\r\n * Callback invoked by saveChanges on an ElementDrivesElement relationship when its input has changed or is the output of some upstream relationship whose input has changed.\r\n * This callback is invoked after the input element has been processed by upstream relationships.\r\n * A subclass of ElementDrivesElement can re-implement this static method to take some action. onRootChanged may modify the output element only.\r\n * @param _props The ElementDrivesElement relationship instance.\r\n * @param _iModel The iModel\r\n */\r\n public static onRootChanged(_props: RelationshipProps, _iModel: IModelDb): void { }\r\n\r\n /**\r\n * Callback invoked by saveChanges on an ElementDrivesElement relationship when the relationship instance has been deleted.\r\n * A subclass of ElementDrivesElement can re-implement this static method to take some action.\r\n * @param _props The deleted ElementDrivesElement relationship instance.\r\n * @param _iModel The iModel\r\n */\r\n public static onDeletedDependency(_props: RelationshipProps, _iModel: IModelDb): void { }\r\n\r\n /** Insert this Relationship into the iModel. */\r\n public insert(): Id64String { return this.iModel.relationships.insertInstance(this); }\r\n /** Update this Relationship in the iModel. */\r\n public update() { this.iModel.relationships.updateInstance(this); }\r\n /** Delete this Relationship from the iModel. */\r\n public delete() { this.iModel.relationships.deleteInstance(this); }\r\n\r\n public static getInstance<T extends Relationship>(iModel: IModelDb, criteria: Id64String | SourceAndTarget): T { return iModel.relationships.getInstance(this.classFullName, criteria); }\r\n}\r\n\r\n/** A Relationship where one Element refers to another Element\r\n * @public\r\n */\r\nexport class ElementRefersToElements extends Relationship {\r\n /** @internal */\r\n public static override get className(): string { return \"ElementRefersToElements\"; }\r\n /** Create an instance of the Relationship.\r\n * @param iModel The iModel that will contain the relationship\r\n * @param sourceId The sourceId of the relationship, that is, the driver element\r\n * @param targetId The targetId of the relationship, that is, the driven element\r\n * @return an instance of the specified class.\r\n */\r\n public static create<T extends ElementRefersToElements>(iModel: IModelDb, sourceId: Id64String, targetId: Id64String): T {\r\n return iModel.relationships.createInstance({ sourceId, targetId, classFullName: this.classFullName }) as T;\r\n }\r\n /** Insert a new instance of the Relationship.\r\n * @param iModel The iModel that will contain the relationship\r\n * @param sourceId The sourceId of the relationship, that is, the driver element\r\n * @param targetId The targetId of the relationship, that is, the driven element\r\n * @return The Id of the inserted Relationship.\r\n */\r\n public static insert<T extends ElementRefersToElements>(iModel: IModelDb, sourceId: Id64String, targetId: Id64String): Id64String {\r\n const relationship: T = this.create(iModel, sourceId, targetId);\r\n return iModel.relationships.insertInstance(relationship);\r\n }\r\n}\r\n\r\n/** Relates a [[DrawingGraphic]] to the [[Element]] that it represents\r\n * @public\r\n */\r\nexport class DrawingGraphicRepresentsElement extends ElementRefersToElements {\r\n /** @internal */\r\n public static override get className(): string { return \"DrawingGraphicRepresentsElement\"; }\r\n}\r\n\r\n/** Relates a [[GraphicalElement3d]] to the [[Element]] that it represents\r\n * @public\r\n */\r\nexport class GraphicalElement3dRepresentsElement extends ElementRefersToElements {\r\n /** @internal */\r\n public static override get className(): string { return \"GraphicalElement3dRepresentsElement\"; }\r\n}\r\n\r\n/** Relates a [[SynchronizationConfigLink]] to N [[ExternalSource]] instances.\r\n * Each relationship instance represents an external source processed by the synchronization configuration.\r\n * @note The associated ECClass was added to the BisCore schema in version 1.0.13\r\n * @beta\r\n */\r\nexport class SynchronizationConfigProcessesSources extends ElementRefersToElements {\r\n /** @internal */\r\n public static override get className(): string { return \"SynchronizationConfigProcessesSources\"; }\r\n}\r\n\r\n/** Relates a [[SynchronizationConfigLink]] to *root* [[ExternalSource]] instances.\r\n * @note The associated ECClass was added to the BisCore schema in version 1.0.13\r\n * @beta\r\n */\r\nexport class SynchronizationConfigSpecifiesRootSources extends SynchronizationConfigProcessesSources {\r\n /** @internal */\r\n public static override get className(): string { return \"SynchronizationConfigSpecifiesRootSources\"; }\r\n}\r\n\r\n/** Properties that are common to all types of link table ECRelationships\r\n * @public\r\n */\r\nexport interface ElementGroupsMembersProps extends RelationshipProps {\r\n memberPriority: number;\r\n}\r\n\r\n/** An ElementRefersToElements relationship where one Element *groups* a set of other Elements.\r\n * @public\r\n */\r\nexport class ElementGroupsMembers extends ElementRefersToElements {\r\n /** @internal */\r\n public static override get className(): string { return \"ElementGroupsMembers\"; }\r\n public memberPriority: number;\r\n\r\n constructor(props: ElementGroupsMembersProps, iModel: IModelDb) {\r\n super(props, iModel);\r\n this.memberPriority = props.memberPriority;\r\n }\r\n\r\n public static override create<T extends ElementRefersToElements>(iModel: IModelDb, sourceId: Id64String, targetId: Id64String, memberPriority: number = 0): T {\r\n const props: ElementGroupsMembersProps = { sourceId, targetId, memberPriority, classFullName: this.classFullName };\r\n return iModel.relationships.createInstance(props) as T;\r\n }\r\n}\r\n\r\n/** Relates a [[DefinitionGroup]] to its [[DefinitionElement]] members.\r\n * @note The associated ECClass was added to the BisCore schema in version 1.0.10\r\n * @public\r\n */\r\nexport class DefinitionGroupGroupsDefinitions extends ElementGroupsMembers {\r\n /** @internal */\r\n public static override get className(): string { return \"DefinitionGroupGroupsDefinitions\"; }\r\n}\r\n\r\n/** Represents group membership where the group Element (and its properties) impart information about the member Elements above mere membership.\r\n * Implies that properties of the group should be considered as properties of its members.\r\n * @note The associated ECClass was added to the BisCore schema in version 1.0.11\r\n * @public\r\n */\r\nexport class GroupImpartsToMembers extends ElementGroupsMembers {\r\n /** @internal */\r\n public static override get className(): string { return \"GroupImpartsToMembers\"; }\r\n}\r\n\r\n/** Relates an [[ExternalSourceGroup]] to its [[ExternalSource]] members.\r\n * @note The associated ECClass was added to the BisCore schema in version 1.0.13\r\n * @beta\r\n */\r\nexport class ExternalSourceGroupGroupsSources extends ElementGroupsMembers {\r\n /** @internal */\r\n public static override get className(): string { return \"ExternalSourceGroupGroupsSources\"; }\r\n}\r\n\r\n/** Properties that are common to all types of ElementDrivesElements\r\n * @beta\r\n */\r\nexport interface ElementDrivesElementProps extends RelationshipProps {\r\n status: number;\r\n priority: number;\r\n}\r\n\r\n/** A Relationship indicating that one Element *drives* another Element.\r\n * An ElementDrivesElement relationship defines a one-way \"driving\" relationship from the source to the target.\r\n * When the source of an ElementDrivesElement relationship changes, the ElementDrivesElement itself can get a callback, and both the source and target elements can get callbacks.\r\n * By inserting ElementDrivesElement relationships, an app can create and store an acyclic directed graph of dependencies between elements.\r\n *\r\n * # Defining dependencies\r\n * Create an ElementDrivesElement relationship to specify that the source element drives the target element.\r\n * For example, to specify that element e1 drives element e2, create a relationship between them like this:\r\n * ```ts\r\n * const ede = ElementDrivesElement.create(iModel, e1id, e2id);\r\n * ede.insert();\r\n * ```\r\n * This creates a persistent relationship. The fact that e1 drives e2 is persisted in the iModel.\r\n *\r\n * # Defining dependency graphs\r\n * When you create multiple ElementDrivesElement relationships, you create a network of dependencies. The target of one may be the source of another.\r\n * A change in the content of an DgnElement can therefore trigger changes to many downstream elements.\r\n *\r\n * For example, to make element e1 drive element e2 and e2 drive another element, e3, create two relationships like this:\r\n * ```ts\r\n * const ede12 = ElementDrivesElement.create(iModel, e1id, e2id);\r\n * const ede23 = ElementDrivesElement.create(iModel, e2id, e3id);\r\n * ede12.insert();\r\n * ede23.insert();\r\n * ```\r\n * Those two relationships create this graph:\r\n * ```\r\n * e1 --> e2 --> e3\r\n * ```\r\n * Where the \"-->\" is meant to represent a driving relationship.\r\n *\r\n * The order in which you create the relationships does not matter.\r\n * The graph indicates that e3 depends on e2 and e2 depends on e1.\r\n *\r\n * An ElementDrivesElement relationship is between one source element and one target element.\r\n * Many ElementDrivesElement relationships can point to a given element, and many can point out of it.\r\n * Thus, you can define many:many relationships.\r\n * For example:\r\n * ```ts\r\n * const ede12 = ElementDrivesElement.create(iModel, e1id, e2id);\r\n * const ede112 = ElementDrivesElement.create(iModel, e11id, e2id);\r\n * const ede23 = ElementDrivesElement.create(iModel, e2id, e3id);\r\n * const ede231 = ElementDrivesElement.create(iModel, e2id, e31id);\r\n * ede12.insert();\r\n * ede112.insert();\r\n * ede23.insert();\r\n * ede231.insert();\r\n * ```\r\n * Creates this graph:\r\n * ```\r\n * e1 e3\r\n * \\ /\r\n * e2\r\n * / \\\r\n * e11 e31\r\n * ```\r\n * e2 depends on both e1 and e11. e2 then drives e3 and e31.\r\n *\r\n * In an ElementDrivesElement dependency graph, the relationships are the \"edges\" and the Elements are the \"nodes\".\r\n * The following terms are used when referring to the elements (nodes) in a dependency graph:\r\n * * Inputs - The sources of all edges that point to the element. This includes all upstream elements that flow into the element.\r\n * * Outputs - The targets of all edges that point out of the element. This includes all downstream elements.\r\n *\r\n * #Subgraph Processing\r\n * When changes are made, iModel.js finds and processes only the part of the overall graph that is affected. So, for example,\r\n * suppose we have this graph:\r\n * ```\r\n * e1 --> e2 --> e3\r\n * ```\r\n * If e1 changes, then the subgraph to be processed is equal to the full graph, as shown.\r\n *\r\n * If only e2 changes, then the subgraph to be processed is just:\r\n * ```\r\n * e2 --> e3\r\n * ```\r\n * If only e3 changes, then the subgraph consists of e3 by itself.\r\n *\r\n * Returning to the second example above, suppose we have this graph:\r\n * ```\r\n * e1 e3\r\n * \\ /\r\n * e2\r\n * / \\\r\n * e11 e31\r\n * ```\r\n * If e1 is changed, the affected subgraph is:\r\n * ```\r\n * e1 e3\r\n * \\ /\r\n * e2\r\n * \\\r\n * e31\r\n * ```\r\n * If e2 is changed, the affected subgraph is:\r\n * ```\r\n * e3\r\n * /\r\n * e2\r\n * \\\r\n * e31\r\n * ```\r\n * # Callbacks\r\n * Once iModel.js has found the affected subgraph to process, it propagates changes through it by making callbacks.\r\n * Classes for both elements (nodes) and ElementDrivesElements relationships (edges) can receive callbacks.\r\n *\r\n * ## ElementDrivesElement Callbacks\r\n * The following callbacks are invoked on ElementDrivesElement relationship classes (edges):\r\n * * onRootChanged\r\n * * onDeletedDependency\r\n *\r\n * Note that these are static methods. Their default implementations do nothing.\r\n * To receive and act on these callbacks, a domain should define a subclass of ElementDrivesElement and use that to create relationships.\r\n * The subclass should then implement the callbacks that it would like to act on.\r\n *\r\n * A ElementDrivesElement subclass callback is expected to make changes to the output element only!\r\n *\r\n * ## Element Callbacks\r\n * The following callbacks are invoked on Element classes (nodes):\r\n * * Element.onBeforeOutputsHandled\r\n * * Element.onAllInputsHandled\r\n *\r\n * ## Order\r\n * Callbacks are invoked by BriefcaseDb.saveChanges.\r\n * They are invoked in dependency (topological) order: driving elements first, then driven elements.\r\n *\r\n * Each callback is invoked only once. No matter how many times a given element was changed during the transaction,\r\n * a callback such as ElementDrivesElement.onRootChanged will be invoked only once.\r\n * In the same way, no matter how many of its inputs were changed, a callback such as Element.onAllInputsHandled will be\r\n * invoked only once.\r\n *\r\n * For example, suppose we have a graph:\r\n * ```\r\n * e1 --> e2 --> e3\r\n * ```\r\n *\r\n * Suppose that e1 is directly modified. No callbacks are made at that time.\r\n * Later, when BriefcaseDb.saveChanges is called, the following callbacks are made, in order:\r\n * 1. Element.onBeforeOutputsHandled e1\r\n * 1. ElementDrivesElement.onRootChanged e1->e2\r\n * 1. Element.onAllInputsHandled e2\r\n * 1. ElementDrivesElement.onRootChanged e2->e3\r\n * 1. Element.onAllInputsHandled e3\r\n *\r\n * Suppose that e3 is modified directly and BriefcaseDb.saveChanges is called.\r\n * Since no input to a relationship was changed, the sub-graph will be empty, and no callbacks will be made.\r\n *\r\n * Returning to the second example above, suppose we have this graph:\r\n * ```\r\n * e1 e3\r\n * \\ /\r\n * e2\r\n * / \\\r\n * e11 e31\r\n * ```\r\n * If e1 is changed and BriefcaseDb.saveChanges is called, the subgraph is:\r\n * ```\r\n * e1 e3\r\n * \\ /\r\n * e2\r\n * \\\r\n * e31\r\n * ```\r\n * The callbacks are:\r\n * 1. Element.onBeforeOutputsHandled e1\r\n * 1. ElementDrivesElement.onRootChanged e1->e2\r\n * 1. Element.onAllInputsHandled e2\r\n * 1. ElementDrivesElement.onRootChanged e2->e3\r\n * 1. Element.onAllInputsHandled e3\r\n * 1. ElementDrivesElement.onRootChanged e2->e31\r\n * 1. Element.onAllInputsHandled e31\r\n *\r\n * (The ElementDrivesElement.)\r\n *\r\n * #Errors\r\n * Circular dependencies are not permitted. If a cycle is detected, that is treated as a fatal error. All ElementDrivesElement relationships\r\n * involved in a cycle will have their status set to 1, indicating a failure.\r\n *\r\n * A callback may call txnManager.reportError to reject an invalid change. It can classify the error as fatal or just a warning.\r\n * A callback make set the status value of an ElementDrivesElement instance to 1 to indicate a processing falure in that edge.\r\n *\r\n * After BriefcaseDb.saveChanges is called, an app should check db.txns.validationErrors and db.txns.hasFatalError to find out if graph-evaluation failed.\r\n *\r\n * @beta\r\n */\r\nexport class ElementDrivesElement extends Relationship implements ElementDrivesElementProps {\r\n /** @internal */\r\n public static override get className(): string { return \"ElementDrivesElement\"; }\r\n /** Relationship status\r\n * * 0 indicates no errors. iModel.js sets this after a successful evaluation.\r\n * * 1 indicates that this driving relationship could not be evaluated. The callback itself can set this to indicate that it failed to process the input changes. Also, iModel.js sets this if it finds that the relationship is part of a circular dependency.\r\n * * 0x80 The app or callback can set this to tell iModel.js not propagate changes through this relationship.\r\n */\r\n public status: number;\r\n /** Affects the order in which relationships are processed in the case where two relationships have the same output. */\r\n public priority: number;\r\n\r\n /** @internal */\r\n constructor(props: ElementDrivesElementProps, iModel: IModelDb) {\r\n super(props, iModel);\r\n this.status = props.status;\r\n this.priority = props.priority;\r\n }\r\n\r\n public static create<T extends ElementRefersToElements>(iModel: IModelDb, sourceId: Id64String, targetId: Id64String, priority: number = 0): T {\r\n const props: ElementDrivesElementProps = { sourceId, targetId, priority, status: 0, classFullName: this.classFullName };\r\n return iModel.relationships.createInstance(props) as T;\r\n }\r\n}\r\n\r\n/** Manages [[Relationship]]s.\r\n * @public\r\n */\r\nexport class Relationships {\r\n private _iModel: IModelDb;\r\n\r\n /** @internal */\r\n constructor(iModel: IModelDb) { this._iModel = iModel; }\r\n\r\n /** Create a new instance of a Relationship.\r\n * @param props The properties of the new Relationship.\r\n * @throws [[IModelError]] if there is a problem creating the Relationship.\r\n */\r\n public createInstance(props: RelationshipProps): Relationship { return this._iModel.constructEntity<Relationship>(props); }\r\n\r\n /** Check classFullName to ensure it is a link table relationship class. */\r\n private checkRelationshipClass(classFullName: string) {\r\n if (!this._iModel.nativeDb.isLinkTableRelationship(classFullName.replace(\".\", \":\"))) {\r\n throw new IModelError(DbResult.BE_SQLITE_ERROR, `Class '${classFullName}' must be a relationship class and it should be subclass of BisCore:ElementRefersToElements or BisCore:ElementDrivesElement.`);\r\n }\r\n }\r\n\r\n /** Insert a new relationship instance into the iModel. The relationship provided must be subclass of BisCore:ElementRefersToElements or BisCore:ElementDrivesElement.\r\n * @param props The properties of the new relationship.\r\n * @returns The Id of the newly inserted relationship.\r\n * @note The id property of the props object is set as a side effect of this function.\r\n */\r\n public insertInstance(props: RelationshipProps): Id64String {\r\n this.checkRelationshipClass(props.classFullName);\r\n return props.id = this._iModel.nativeDb.insertLinkTableRelationship(props);\r\n }\r\n\r\n /** Update the properties of an existing relationship instance in the iModel.\r\n * @param props the properties of the relationship instance to update. Any properties that are not present will be left unchanged.\r\n */\r\n public updateInstance(props: RelationshipProps): void {\r\n this._iModel.nativeDb.updateLinkTableRelationship(props);\r\n }\r\n\r\n /** Delete an Relationship instance from this iModel. */\r\n public deleteInstance(props: RelationshipProps): void {\r\n this._iModel.nativeDb.deleteLinkTableRelationship(props);\r\n }\r\n\r\n /** Get the props of a Relationship instance\r\n * @param relClassFullName The full class name of the relationship in the form of \"schema:class\"\r\n * @param criteria Either the relationship instanceId or the source and target Ids\r\n * @throws [IModelError]($common) if the relationship is not found or cannot be loaded.\r\n * @see tryGetInstanceProps\r\n */\r\n public getInstanceProps<T extends RelationshipProps>(relClassFullName: string, criteria: Id64String | SourceAndTarget): T {\r\n const relationshipProps = this.tryGetInstanceProps<T>(relClassFullName, criteria);\r\n if (undefined === relationshipProps) {\r\n throw new IModelError(IModelStatus.NotFound, \"Relationship not found\");\r\n }\r\n return relationshipProps;\r\n }\r\n\r\n /** Get the props of a Relationship instance\r\n * @param relClassFullName The full class name of the relationship in the form of \"schema:class\"\r\n * @param criteria Either the relationship instanceId or the source and target Ids\r\n * @returns The RelationshipProps or `undefined` if the relationship is not found.\r\n * @note Useful for cases when a relationship may or may not exist and throwing an `Error` would be overkill.\r\n * @see getInstanceProps\r\n */\r\n public tryGetInstanceProps<T extends RelationshipProps>(relClassFullName: string, criteria: Id64String | SourceAndTarget): T | undefined {\r\n let props: T | undefined;\r\n if (typeof criteria === \"string\") {\r\n props = this._iModel.withPreparedStatement(`SELECT * FROM ${relClassFullName} WHERE ecinstanceid=?`, (stmt: ECSqlStatement) => {\r\n stmt.bindId(1, criteria);\r\n return DbResult.BE_SQLITE_ROW === stmt.step() ? stmt.getRow() as T : undefined;\r\n });\r\n } else {\r\n props = this._iModel.withPreparedStatement(`SELECT * FROM ${relClassFullName} WHERE SourceECInstanceId=? AND TargetECInstanceId=?`, (stmt: ECSqlStatement) => {\r\n stmt.bindId(1, criteria.sourceId);\r\n stmt.bindId(2, criteria.targetId);\r\n return DbResult.BE_SQLITE_ROW === stmt.step() ? stmt.getRow() as T : undefined;\r\n });\r\n }\r\n if (undefined !== props) {\r\n props.classFullName = (props as any).className.replace(\".\", \":\");\r\n }\r\n return props;\r\n }\r\n\r\n /** Get a Relationship instance\r\n * @param relClassFullName The full class name of the relationship in the form of \"schema:class\"\r\n * @param criteria Either the relationship instanceId or the source and target Ids\r\n * @throws [IModelError]($common) if the relationship is not found or cannot be loaded.\r\n * @see tryGetInstance\r\n */\r\n public getInstance<T extends Relationship>(relClassSqlName: string, criteria: Id64String | SourceAndTarget): T {\r\n return this._iModel.constructEntity<T>(this.getInstanceProps(relClassSqlName, criteria));\r\n }\r\n\r\n /** Get a Relationship instance\r\n * @param relClassFullName The full class name of the relationship in the form of \"schema:class\"\r\n * @param criteria Either the relationship instanceId or the source and target Ids\r\n * @returns The relationship or `undefined` if the relationship is not found.\r\n * @note Useful for cases when a relationship may or may not exist and throwing an `Error` would be overkill.\r\n * @see getInstance\r\n */\r\n public tryGetInstance<T extends Relationship>(relClassFullName: string, criteria: Id64String | SourceAndTarget): T | undefined {\r\n const relationshipProps = this.tryGetInstanceProps<T>(relClassFullName, criteria);\r\n return undefined !== relationshipProps ? this._iModel.constructEntity<T>(relationshipProps) : undefined;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"Relationship.js","sourceRoot":"","sources":["../../src/Relationship.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 Relationships\r\n */\r\n\r\nimport { DbResult, Id64, Id64String } from \"@itwin/core-bentley\";\r\nimport { IModelError, IModelStatus, RelationshipProps, SourceAndTarget } from \"@itwin/core-common\";\r\nimport { ECSqlStatement } from \"./ECSqlStatement\";\r\nimport { Entity } from \"./Entity\";\r\nimport { IModelDb } from \"./IModelDb\";\r\n\r\nexport type { SourceAndTarget, RelationshipProps } from \"@itwin/core-common\"; // for backwards compatibility\r\n\r\n/** Base class for all link table ECRelationships\r\n * @public\r\n */\r\nexport class Relationship extends Entity {\r\n /** @internal */\r\n public static override get className(): string { return \"Relationship\"; }\r\n public readonly sourceId: Id64String;\r\n public readonly targetId: Id64String;\r\n\r\n /** @internal */\r\n constructor(props: RelationshipProps, iModel: IModelDb) {\r\n super(props, iModel);\r\n this.sourceId = Id64.fromJSON(props.sourceId);\r\n this.targetId = Id64.fromJSON(props.targetId);\r\n }\r\n\r\n /** @internal */\r\n public override toJSON(): RelationshipProps {\r\n const val = super.toJSON() as RelationshipProps;\r\n val.sourceId = this.sourceId;\r\n val.targetId = this.targetId;\r\n return val;\r\n }\r\n\r\n /**\r\n * Callback invoked by saveChanges on an ElementDrivesElement relationship when its input has changed or is the output of some upstream relationship whose input has changed.\r\n * This callback is invoked after the input element has been processed by upstream relationships.\r\n * A subclass of ElementDrivesElement can re-implement this static method to take some action. onRootChanged may modify the output element only.\r\n * @param _props The ElementDrivesElement relationship instance.\r\n * @param _iModel The iModel\r\n */\r\n public static onRootChanged(_props: RelationshipProps, _iModel: IModelDb): void { }\r\n\r\n /**\r\n * Callback invoked by saveChanges on an ElementDrivesElement relationship when the relationship instance has been deleted.\r\n * A subclass of ElementDrivesElement can re-implement this static method to take some action.\r\n * @param _props The deleted ElementDrivesElement relationship instance.\r\n * @param _iModel The iModel\r\n */\r\n public static onDeletedDependency(_props: RelationshipProps, _iModel: IModelDb): void { }\r\n\r\n /** Insert this Relationship into the iModel. */\r\n public insert(): Id64String { return this.id = this.iModel.relationships.insertInstance(this.toJSON()); }\r\n /** Update this Relationship in the iModel. */\r\n public update() { this.iModel.relationships.updateInstance(this.toJSON()); }\r\n /** Delete this Relationship from the iModel. */\r\n public delete() { this.iModel.relationships.deleteInstance(this.toJSON()); }\r\n\r\n public static getInstance<T extends Relationship>(iModel: IModelDb, criteria: Id64String | SourceAndTarget): T { return iModel.relationships.getInstance(this.classFullName, criteria); }\r\n}\r\n\r\n/** A Relationship where one Element refers to another Element\r\n * @public\r\n */\r\nexport class ElementRefersToElements extends Relationship {\r\n /** @internal */\r\n public static override get className(): string { return \"ElementRefersToElements\"; }\r\n /** Create an instance of the Relationship.\r\n * @param iModel The iModel that will contain the relationship\r\n * @param sourceId The sourceId of the relationship, that is, the driver element\r\n * @param targetId The targetId of the relationship, that is, the driven element\r\n * @return an instance of the specified class.\r\n */\r\n public static create<T extends ElementRefersToElements>(iModel: IModelDb, sourceId: Id64String, targetId: Id64String): T {\r\n return iModel.relationships.createInstance({ sourceId, targetId, classFullName: this.classFullName }) as T;\r\n }\r\n /** Insert a new instance of the Relationship.\r\n * @param iModel The iModel that will contain the relationship\r\n * @param sourceId The sourceId of the relationship, that is, the driver element\r\n * @param targetId The targetId of the relationship, that is, the driven element\r\n * @return The Id of the inserted Relationship.\r\n */\r\n public static insert<T extends ElementRefersToElements>(iModel: IModelDb, sourceId: Id64String, targetId: Id64String): Id64String {\r\n const relationship: T = this.create(iModel, sourceId, targetId);\r\n return iModel.relationships.insertInstance(relationship.toJSON());\r\n }\r\n}\r\n\r\n/** Relates a [[DrawingGraphic]] to the [[Element]] that it represents\r\n * @public\r\n */\r\nexport class DrawingGraphicRepresentsElement extends ElementRefersToElements {\r\n /** @internal */\r\n public static override get className(): string { return \"DrawingGraphicRepresentsElement\"; }\r\n}\r\n\r\n/** Relates a [[GraphicalElement3d]] to the [[Element]] that it represents\r\n * @public\r\n */\r\nexport class GraphicalElement3dRepresentsElement extends ElementRefersToElements {\r\n /** @internal */\r\n public static override get className(): string { return \"GraphicalElement3dRepresentsElement\"; }\r\n}\r\n\r\n/** Relates a [[SynchronizationConfigLink]] to N [[ExternalSource]] instances.\r\n * Each relationship instance represents an external source processed by the synchronization configuration.\r\n * @note The associated ECClass was added to the BisCore schema in version 1.0.13\r\n * @beta\r\n */\r\nexport class SynchronizationConfigProcessesSources extends ElementRefersToElements {\r\n /** @internal */\r\n public static override get className(): string { return \"SynchronizationConfigProcessesSources\"; }\r\n}\r\n\r\n/** Relates a [[SynchronizationConfigLink]] to *root* [[ExternalSource]] instances.\r\n * @note The associated ECClass was added to the BisCore schema in version 1.0.13\r\n * @beta\r\n */\r\nexport class SynchronizationConfigSpecifiesRootSources extends SynchronizationConfigProcessesSources {\r\n /** @internal */\r\n public static override get className(): string { return \"SynchronizationConfigSpecifiesRootSources\"; }\r\n}\r\n\r\n/** Properties that are common to all types of link table ECRelationships\r\n * @public\r\n */\r\nexport interface ElementGroupsMembersProps extends RelationshipProps {\r\n memberPriority: number;\r\n}\r\n\r\n/** An ElementRefersToElements relationship where one Element *groups* a set of other Elements.\r\n * @public\r\n */\r\nexport class ElementGroupsMembers extends ElementRefersToElements {\r\n /** @internal */\r\n public static override get className(): string { return \"ElementGroupsMembers\"; }\r\n public memberPriority: number;\r\n\r\n constructor(props: ElementGroupsMembersProps, iModel: IModelDb) {\r\n super(props, iModel);\r\n this.memberPriority = props.memberPriority;\r\n }\r\n\r\n public static override create<T extends ElementRefersToElements>(iModel: IModelDb, sourceId: Id64String, targetId: Id64String, memberPriority: number = 0): T {\r\n const props: ElementGroupsMembersProps = { sourceId, targetId, memberPriority, classFullName: this.classFullName };\r\n return iModel.relationships.createInstance(props) as T;\r\n }\r\n}\r\n\r\n/** Relates a [[DefinitionGroup]] to its [[DefinitionElement]] members.\r\n * @note The associated ECClass was added to the BisCore schema in version 1.0.10\r\n * @public\r\n */\r\nexport class DefinitionGroupGroupsDefinitions extends ElementGroupsMembers {\r\n /** @internal */\r\n public static override get className(): string { return \"DefinitionGroupGroupsDefinitions\"; }\r\n}\r\n\r\n/** Represents group membership where the group Element (and its properties) impart information about the member Elements above mere membership.\r\n * Implies that properties of the group should be considered as properties of its members.\r\n * @note The associated ECClass was added to the BisCore schema in version 1.0.11\r\n * @public\r\n */\r\nexport class GroupImpartsToMembers extends ElementGroupsMembers {\r\n /** @internal */\r\n public static override get className(): string { return \"GroupImpartsToMembers\"; }\r\n}\r\n\r\n/** Relates an [[ExternalSourceGroup]] to its [[ExternalSource]] members.\r\n * @note The associated ECClass was added to the BisCore schema in version 1.0.13\r\n * @beta\r\n */\r\nexport class ExternalSourceGroupGroupsSources extends ElementGroupsMembers {\r\n /** @internal */\r\n public static override get className(): string { return \"ExternalSourceGroupGroupsSources\"; }\r\n}\r\n\r\n/** Properties that are common to all types of ElementDrivesElements\r\n * @beta\r\n */\r\nexport interface ElementDrivesElementProps extends RelationshipProps {\r\n status: number;\r\n priority: number;\r\n}\r\n\r\n/** A Relationship indicating that one Element *drives* another Element.\r\n * An ElementDrivesElement relationship defines a one-way \"driving\" relationship from the source to the target.\r\n * When the source of an ElementDrivesElement relationship changes, the ElementDrivesElement itself can get a callback, and both the source and target elements can get callbacks.\r\n * By inserting ElementDrivesElement relationships, an app can create and store an acyclic directed graph of dependencies between elements.\r\n *\r\n * # Defining dependencies\r\n * Create an ElementDrivesElement relationship to specify that the source element drives the target element.\r\n * For example, to specify that element e1 drives element e2, create a relationship between them like this:\r\n * ```ts\r\n * const ede = ElementDrivesElement.create(iModel, e1id, e2id);\r\n * ede.insert();\r\n * ```\r\n * This creates a persistent relationship. The fact that e1 drives e2 is persisted in the iModel.\r\n *\r\n * # Defining dependency graphs\r\n * When you create multiple ElementDrivesElement relationships, you create a network of dependencies. The target of one may be the source of another.\r\n * A change in the content of an DgnElement can therefore trigger changes to many downstream elements.\r\n *\r\n * For example, to make element e1 drive element e2 and e2 drive another element, e3, create two relationships like this:\r\n * ```ts\r\n * const ede12 = ElementDrivesElement.create(iModel, e1id, e2id);\r\n * const ede23 = ElementDrivesElement.create(iModel, e2id, e3id);\r\n * ede12.insert();\r\n * ede23.insert();\r\n * ```\r\n * Those two relationships create this graph:\r\n * ```\r\n * e1 --> e2 --> e3\r\n * ```\r\n * Where the \"-->\" is meant to represent a driving relationship.\r\n *\r\n * The order in which you create the relationships does not matter.\r\n * The graph indicates that e3 depends on e2 and e2 depends on e1.\r\n *\r\n * An ElementDrivesElement relationship is between one source element and one target element.\r\n * Many ElementDrivesElement relationships can point to a given element, and many can point out of it.\r\n * Thus, you can define many:many relationships.\r\n * For example:\r\n * ```ts\r\n * const ede12 = ElementDrivesElement.create(iModel, e1id, e2id);\r\n * const ede112 = ElementDrivesElement.create(iModel, e11id, e2id);\r\n * const ede23 = ElementDrivesElement.create(iModel, e2id, e3id);\r\n * const ede231 = ElementDrivesElement.create(iModel, e2id, e31id);\r\n * ede12.insert();\r\n * ede112.insert();\r\n * ede23.insert();\r\n * ede231.insert();\r\n * ```\r\n * Creates this graph:\r\n * ```\r\n * e1 e3\r\n * \\ /\r\n * e2\r\n * / \\\r\n * e11 e31\r\n * ```\r\n * e2 depends on both e1 and e11. e2 then drives e3 and e31.\r\n *\r\n * In an ElementDrivesElement dependency graph, the relationships are the \"edges\" and the Elements are the \"nodes\".\r\n * The following terms are used when referring to the elements (nodes) in a dependency graph:\r\n * * Inputs - The sources of all edges that point to the element. This includes all upstream elements that flow into the element.\r\n * * Outputs - The targets of all edges that point out of the element. This includes all downstream elements.\r\n *\r\n * # Subgraph Processing\r\n * When changes are made, only the part of the overall graph that is affected will be processed. So, for example,\r\n * suppose we have this graph:\r\n * ```\r\n * e1 --> e2 --> e3\r\n * ```\r\n * If e1 changes, then the subgraph to be processed is equal to the full graph, as shown.\r\n *\r\n * If only e2 changes, then the subgraph to be processed is just:\r\n * ```\r\n * e2 --> e3\r\n * ```\r\n * If only e3 changes, then the subgraph consists of e3 by itself.\r\n *\r\n * Returning to the second example above, suppose we have this graph:\r\n * ```\r\n * e1 e3\r\n * \\ /\r\n * e2\r\n * / \\\r\n * e11 e31\r\n * ```\r\n * If e1 is changed, the affected subgraph is:\r\n * ```\r\n * e1 e3\r\n * \\ /\r\n * e2\r\n * \\\r\n * e31\r\n * ```\r\n * If e2 is changed, the affected subgraph is:\r\n * ```\r\n * e3\r\n * /\r\n * e2\r\n * \\\r\n * e31\r\n * ```\r\n * # Callbacks\r\n * Once the affected subgraph to process is found, it propagates changes through it by making callbacks.\r\n * Classes for both elements (nodes) and ElementDrivesElements relationships (edges) can receive callbacks.\r\n *\r\n * ## ElementDrivesElement Callbacks\r\n * The following callbacks are invoked on ElementDrivesElement relationship classes (edges):\r\n * * onRootChanged\r\n * * onDeletedDependency\r\n *\r\n * Note that these are static methods. Their default implementations do nothing.\r\n * To receive and act on these callbacks, a domain should define a subclass of ElementDrivesElement and use that to create relationships.\r\n * The subclass should then implement the callbacks that it would like to act on.\r\n *\r\n * A ElementDrivesElement subclass callback is expected to make changes to the output element only!\r\n *\r\n * ## Element Callbacks\r\n * The following callbacks are invoked on Element classes (nodes):\r\n * * Element.onBeforeOutputsHandled\r\n * * Element.onAllInputsHandled\r\n *\r\n * ## Order\r\n * Callbacks are invoked by BriefcaseDb.saveChanges.\r\n * They are invoked in dependency (topological) order: driving elements first, then driven elements.\r\n *\r\n * Each callback is invoked only once. No matter how many times a given element was changed during the transaction,\r\n * a callback such as ElementDrivesElement.onRootChanged will be invoked only once.\r\n * In the same way, no matter how many of its inputs were changed, a callback such as Element.onAllInputsHandled will be\r\n * invoked only once.\r\n *\r\n * For example, suppose we have a graph:\r\n * ```\r\n * e1 --> e2 --> e3\r\n * ```\r\n *\r\n * Suppose that e1 is directly modified. No callbacks are made at that time.\r\n * Later, when BriefcaseDb.saveChanges is called, the following callbacks are made, in order:\r\n * 1. Element.onBeforeOutputsHandled e1\r\n * 1. ElementDrivesElement.onRootChanged e1->e2\r\n * 1. Element.onAllInputsHandled e2\r\n * 1. ElementDrivesElement.onRootChanged e2->e3\r\n * 1. Element.onAllInputsHandled e3\r\n *\r\n * Suppose that e3 is modified directly and BriefcaseDb.saveChanges is called.\r\n * Since no input to a relationship was changed, the sub-graph will be empty, and no callbacks will be made.\r\n *\r\n * Returning to the second example above, suppose we have this graph:\r\n * ```\r\n * e1 e3\r\n * \\ /\r\n * e2\r\n * / \\\r\n * e11 e31\r\n * ```\r\n * If e1 is changed and BriefcaseDb.saveChanges is called, the subgraph is:\r\n * ```\r\n * e1 e3\r\n * \\ /\r\n * e2\r\n * \\\r\n * e31\r\n * ```\r\n * The callbacks are:\r\n * 1. Element.onBeforeOutputsHandled e1\r\n * 1. ElementDrivesElement.onRootChanged e1->e2\r\n * 1. Element.onAllInputsHandled e2\r\n * 1. ElementDrivesElement.onRootChanged e2->e3\r\n * 1. Element.onAllInputsHandled e3\r\n * 1. ElementDrivesElement.onRootChanged e2->e31\r\n * 1. Element.onAllInputsHandled e31\r\n *\r\n * (The ElementDrivesElement.)\r\n *\r\n * #Errors\r\n * Circular dependencies are not permitted. If a cycle is detected, that is treated as a fatal error. All ElementDrivesElement relationships\r\n * involved in a cycle will have their status set to 1, indicating a failure.\r\n *\r\n * A callback may call txnManager.reportError to reject an invalid change. It can classify the error as fatal or just a warning.\r\n * A callback make set the status value of an ElementDrivesElement instance to 1 to indicate a processing failure in that edge.\r\n *\r\n * After BriefcaseDb.saveChanges is called, an app should check db.txns.validationErrors and db.txns.hasFatalError to find out if graph-evaluation failed.\r\n *\r\n * @beta\r\n */\r\nexport class ElementDrivesElement extends Relationship {\r\n /** @internal */\r\n public static override get className(): string { return \"ElementDrivesElement\"; }\r\n /** Relationship status\r\n * * 0 indicates no errors. Set after a successful evaluation.\r\n * * 1 indicates that this driving relationship could not be evaluated. The callback itself can set this to indicate that it failed to process the input changes. Also, it is set if the relationship is part of a circular dependency.\r\n * * 0x80 The app or callback can set this to indicate to not propagate changes through this relationship.\r\n */\r\n public status: number;\r\n /** Affects the order in which relationships are processed in the case where two relationships have the same output. */\r\n public priority: number;\r\n\r\n /** @internal */\r\n constructor(props: ElementDrivesElementProps, iModel: IModelDb) {\r\n super(props, iModel);\r\n this.status = props.status;\r\n this.priority = props.priority;\r\n }\r\n\r\n public static create<T extends ElementRefersToElements>(iModel: IModelDb, sourceId: Id64String, targetId: Id64String, priority: number = 0): T {\r\n const props: ElementDrivesElementProps = { sourceId, targetId, priority, status: 0, classFullName: this.classFullName };\r\n return iModel.relationships.createInstance(props) as T;\r\n }\r\n\r\n public override toJSON(): ElementDrivesElementProps {\r\n const props = super.toJSON() as ElementDrivesElementProps;\r\n props.status = this.status;\r\n props.priority = this.priority;\r\n return props;\r\n }\r\n}\r\n\r\n/** Manages [[Relationship]]s.\r\n * @public\r\n */\r\nexport class Relationships {\r\n private _iModel: IModelDb;\r\n\r\n /** @internal */\r\n constructor(iModel: IModelDb) { this._iModel = iModel; }\r\n\r\n /** Create a new instance of a Relationship.\r\n * @param props The properties of the new Relationship.\r\n * @throws [[IModelError]] if there is a problem creating the Relationship.\r\n */\r\n public createInstance(props: RelationshipProps): Relationship { return this._iModel.constructEntity<Relationship>(props); }\r\n\r\n /** Check classFullName to ensure it is a link table relationship class. */\r\n private checkRelationshipClass(classFullName: string) {\r\n if (!this._iModel.nativeDb.isLinkTableRelationship(classFullName.replace(\".\", \":\"))) {\r\n throw new IModelError(DbResult.BE_SQLITE_ERROR, `Class '${classFullName}' must be a relationship class and it should be subclass of BisCore:ElementRefersToElements or BisCore:ElementDrivesElement.`);\r\n }\r\n }\r\n\r\n /** Insert a new relationship instance into the iModel. The relationship provided must be subclass of BisCore:ElementRefersToElements or BisCore:ElementDrivesElement.\r\n * @param props The properties of the new relationship.\r\n * @returns The Id of the newly inserted relationship.\r\n * @note The id property of the props object is set as a side effect of this function.\r\n */\r\n public insertInstance(props: RelationshipProps): Id64String {\r\n this.checkRelationshipClass(props.classFullName);\r\n return props.id = this._iModel.nativeDb.insertLinkTableRelationship(props);\r\n }\r\n\r\n /** Update the properties of an existing relationship instance in the iModel.\r\n * @param props the properties of the relationship instance to update. Any properties that are not present will be left unchanged.\r\n */\r\n public updateInstance(props: RelationshipProps): void {\r\n this._iModel.nativeDb.updateLinkTableRelationship(props);\r\n }\r\n\r\n /** Delete an Relationship instance from this iModel. */\r\n public deleteInstance(props: RelationshipProps): void {\r\n this._iModel.nativeDb.deleteLinkTableRelationship(props);\r\n }\r\n\r\n /** Get the props of a Relationship instance\r\n * @param relClassFullName The full class name of the relationship in the form of \"schema:class\"\r\n * @param criteria Either the relationship instanceId or the source and target Ids\r\n * @throws [IModelError]($common) if the relationship is not found or cannot be loaded.\r\n * @see tryGetInstanceProps\r\n */\r\n public getInstanceProps<T extends RelationshipProps>(relClassFullName: string, criteria: Id64String | SourceAndTarget): T {\r\n const relationshipProps = this.tryGetInstanceProps<T>(relClassFullName, criteria);\r\n if (undefined === relationshipProps) {\r\n throw new IModelError(IModelStatus.NotFound, \"Relationship not found\");\r\n }\r\n return relationshipProps;\r\n }\r\n\r\n /** Get the props of a Relationship instance\r\n * @param relClassFullName The full class name of the relationship in the form of \"schema:class\"\r\n * @param criteria Either the relationship instanceId or the source and target Ids\r\n * @returns The RelationshipProps or `undefined` if the relationship is not found.\r\n * @note Useful for cases when a relationship may or may not exist and throwing an `Error` would be overkill.\r\n * @see getInstanceProps\r\n */\r\n public tryGetInstanceProps<T extends RelationshipProps>(relClassFullName: string, criteria: Id64String | SourceAndTarget): T | undefined {\r\n let props: T | undefined;\r\n if (typeof criteria === \"string\") {\r\n props = this._iModel.withPreparedStatement(`SELECT * FROM ${relClassFullName} WHERE ecinstanceid=?`, (stmt: ECSqlStatement) => {\r\n stmt.bindId(1, criteria);\r\n return DbResult.BE_SQLITE_ROW === stmt.step() ? stmt.getRow() as T : undefined;\r\n });\r\n } else {\r\n props = this._iModel.withPreparedStatement(`SELECT * FROM ${relClassFullName} WHERE SourceECInstanceId=? AND TargetECInstanceId=?`, (stmt: ECSqlStatement) => {\r\n stmt.bindId(1, criteria.sourceId);\r\n stmt.bindId(2, criteria.targetId);\r\n return DbResult.BE_SQLITE_ROW === stmt.step() ? stmt.getRow() as T : undefined;\r\n });\r\n }\r\n if (undefined !== props) {\r\n props.classFullName = (props as any).className.replace(\".\", \":\");\r\n }\r\n return props;\r\n }\r\n\r\n /** Get a Relationship instance\r\n * @param relClassFullName The full class name of the relationship in the form of \"schema:class\"\r\n * @param criteria Either the relationship instanceId or the source and target Ids\r\n * @throws [IModelError]($common) if the relationship is not found or cannot be loaded.\r\n * @see tryGetInstance\r\n */\r\n public getInstance<T extends Relationship>(relClassSqlName: string, criteria: Id64String | SourceAndTarget): T {\r\n return this._iModel.constructEntity<T>(this.getInstanceProps(relClassSqlName, criteria));\r\n }\r\n\r\n /** Get a Relationship instance\r\n * @param relClassFullName The full class name of the relationship in the form of \"schema:class\"\r\n * @param criteria Either the relationship instanceId or the source and target Ids\r\n * @returns The relationship or `undefined` if the relationship is not found.\r\n * @note Useful for cases when a relationship may or may not exist and throwing an `Error` would be overkill.\r\n * @see getInstance\r\n */\r\n public tryGetInstance<T extends Relationship>(relClassFullName: string, criteria: Id64String | SourceAndTarget): T | undefined {\r\n const relationshipProps = this.tryGetInstanceProps<RelationshipProps>(relClassFullName, criteria);\r\n return undefined !== relationshipProps ? this._iModel.constructEntity<T>(relationshipProps) : undefined;\r\n }\r\n}\r\n"]}
@@ -15,6 +15,10 @@ export declare class RpcTrace {
15
15
  * RpcActivity in the current call stack.
16
16
  * */
17
17
  static get currentActivity(): RpcActivity | undefined;
18
+ /** Get the [RpcActivity]($common) for the currently executing async. Asserts that the RpcActivity
19
+ * exists in the current call stack.
20
+ * */
21
+ static get expectCurrentActivity(): RpcActivity;
18
22
  /** Start the processing of an RpcActivity. */
19
23
  static run<T>(activity: RpcActivity, fn: () => Promise<T>): Promise<T>;
20
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"RpcBackend.d.ts","sourceRoot":"","sources":["../../src/RpcBackend.ts"],"names":[],"mappings":"AAIA;;GAEG;AAMH,OAAO,EAAiD,WAAW,EAAmD,MAAM,oBAAoB,CAAC;AAIjJ;;;;;;GAMG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA2B;IAElD;;SAEK;IACL,WAAkB,eAAe,IAAI,WAAW,GAAG,SAAS,CAE3D;IAED,8CAA8C;WAC1B,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAGpF;AAGD,gBAAgB;AAChB,wBAAgB,oBAAoB,SA8DnC"}
1
+ {"version":3,"file":"RpcBackend.d.ts","sourceRoot":"","sources":["../../src/RpcBackend.ts"],"names":[],"mappings":"AAIA;;GAEG;AAMH,OAAO,EAAiD,WAAW,EAAmD,MAAM,oBAAoB,CAAC;AAIjJ;;;;;;GAMG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA2B;IAElD;;SAEK;IACL,WAAkB,eAAe,IAAI,WAAW,GAAG,SAAS,CAE3D;IAED;;SAEK;IACL,WAAkB,qBAAqB,IAAI,WAAW,CAGrD;IAED,8CAA8C;WAC1B,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAGpF;AAGD,gBAAgB;AAChB,wBAAgB,oBAAoB,SA8DnC"}
@@ -28,6 +28,13 @@ class RpcTrace {
28
28
  static get currentActivity() {
29
29
  return RpcTrace._storage.getStore();
30
30
  }
31
+ /** Get the [RpcActivity]($common) for the currently executing async. Asserts that the RpcActivity
32
+ * exists in the current call stack.
33
+ * */
34
+ static get expectCurrentActivity() {
35
+ (0, core_bentley_1.assert)(undefined !== RpcTrace.currentActivity);
36
+ return RpcTrace.currentActivity;
37
+ }
31
38
  /** Start the processing of an RpcActivity. */
32
39
  static async run(activity, fn) {
33
40
  return RpcTrace._storage.run(activity, fn);
@@ -1 +1 @@
1
- {"version":3,"file":"RpcBackend.js","sourceRoot":"","sources":["../../src/RpcBackend.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module RpcInterface\r\n */\r\n\r\n// cspell:ignore calltrace\r\n\r\nimport * as multiparty from \"multiparty\";\r\nimport * as FormData from \"form-data\";\r\nimport { BentleyStatus, HttpServerRequest, IModelError, RpcActivity, RpcInvocation, RpcMultipart, RpcSerializedValue } from \"@itwin/core-common\";\r\nimport { AsyncLocalStorage } from \"async_hooks\";\r\nimport { Logger } from \"@itwin/core-bentley\";\r\n\r\n/**\r\n * Utility for tracing Rpc activity processing. When multiple Rpc requests are being processed asynchronously, this\r\n * class can be used to correlate the current calltrace with the originating RpcActivity. This is used for automatic appending\r\n * of RpcActivity to log messages emitted during Rpc processing. It may also be used to retrieve the user accessToken\r\n * from the RpcActivity.\r\n * @public\r\n */\r\nexport class RpcTrace {\r\n private static _storage = new AsyncLocalStorage();\r\n\r\n /** Get the [RpcActivity]($common) for the currently executing async, or `undefined` if there is no\r\n * RpcActivity in the current call stack.\r\n * */\r\n public static get currentActivity(): RpcActivity | undefined {\r\n return RpcTrace._storage.getStore() as RpcActivity | undefined;\r\n }\r\n\r\n /** Start the processing of an RpcActivity. */\r\n public static async run<T>(activity: RpcActivity, fn: () => Promise<T>): Promise<T> {\r\n return RpcTrace._storage.run(activity, fn);\r\n }\r\n}\r\n\r\nlet initialized = false;\r\n/** @internal */\r\nexport function initializeRpcBackend() {\r\n if (initialized)\r\n return;\r\n\r\n initialized = true;\r\n\r\n RpcInvocation.runActivity = RpcTrace.run; // redirect the invocation processing to the tracer\r\n\r\n // set up static logger metadata to include current RpcActivity information for logs during rpc processing\r\n Logger.staticMetaData.set(\"rpc\", () => RpcInvocation.sanitizeForLog(RpcTrace.currentActivity));\r\n\r\n RpcMultipart.createStream = (value: RpcSerializedValue) => {\r\n const form = new FormData();\r\n RpcMultipart.writeValueToForm(form, value);\r\n return form;\r\n };\r\n\r\n RpcMultipart.parseRequest = async (req: HttpServerRequest) => {\r\n return new Promise<RpcSerializedValue>((resolve, reject) => {\r\n const form = new multiparty.Form({ maxFieldsSize: Infinity });\r\n form.on(\"error\", (err) => {\r\n reject(err);\r\n });\r\n\r\n const value = RpcSerializedValue.create();\r\n const data: { [index: string]: { size: number, chunks: Buffer[] } } = {};\r\n\r\n form.on(\"part\", (part: multiparty.Part) => {\r\n part.on(\"data\", (chunk: string | Buffer) => {\r\n if (part.name === \"objects\") {\r\n value.objects += chunk.toString();\r\n } else if (Buffer.isBuffer(chunk)) {\r\n if (!data[part.name]) {\r\n data[part.name] = { size: 0, chunks: [] };\r\n }\r\n\r\n data[part.name].size += chunk.byteLength;\r\n data[part.name].chunks.push(chunk);\r\n } else {\r\n throw new IModelError(BentleyStatus.ERROR, \"Unknown input.\");\r\n }\r\n });\r\n });\r\n\r\n form.on(\"close\", () => {\r\n let i = 0;\r\n for (; ;) {\r\n const part = data[`data-${i}`];\r\n if (!part) {\r\n break;\r\n }\r\n\r\n value.data.push(Buffer.concat(part.chunks, part.size));\r\n ++i;\r\n }\r\n\r\n resolve(value);\r\n });\r\n\r\n form.parse(req);\r\n });\r\n };\r\n}\r\n\r\n"]}
1
+ {"version":3,"file":"RpcBackend.js","sourceRoot":"","sources":["../../src/RpcBackend.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module RpcInterface\r\n */\r\n\r\n// cspell:ignore calltrace\r\n\r\nimport * as multiparty from \"multiparty\";\r\nimport * as FormData from \"form-data\";\r\nimport { BentleyStatus, HttpServerRequest, IModelError, RpcActivity, RpcInvocation, RpcMultipart, RpcSerializedValue } from \"@itwin/core-common\";\r\nimport { AsyncLocalStorage } from \"async_hooks\";\r\nimport { assert, Logger } from \"@itwin/core-bentley\";\r\n\r\n/**\r\n * Utility for tracing Rpc activity processing. When multiple Rpc requests are being processed asynchronously, this\r\n * class can be used to correlate the current calltrace with the originating RpcActivity. This is used for automatic appending\r\n * of RpcActivity to log messages emitted during Rpc processing. It may also be used to retrieve the user accessToken\r\n * from the RpcActivity.\r\n * @public\r\n */\r\nexport class RpcTrace {\r\n private static _storage = new AsyncLocalStorage();\r\n\r\n /** Get the [RpcActivity]($common) for the currently executing async, or `undefined` if there is no\r\n * RpcActivity in the current call stack.\r\n * */\r\n public static get currentActivity(): RpcActivity | undefined {\r\n return RpcTrace._storage.getStore() as RpcActivity | undefined;\r\n }\r\n\r\n /** Get the [RpcActivity]($common) for the currently executing async. Asserts that the RpcActivity\r\n * exists in the current call stack.\r\n * */\r\n public static get expectCurrentActivity(): RpcActivity {\r\n assert(undefined !== RpcTrace.currentActivity);\r\n return RpcTrace.currentActivity;\r\n }\r\n\r\n /** Start the processing of an RpcActivity. */\r\n public static async run<T>(activity: RpcActivity, fn: () => Promise<T>): Promise<T> {\r\n return RpcTrace._storage.run(activity, fn);\r\n }\r\n}\r\n\r\nlet initialized = false;\r\n/** @internal */\r\nexport function initializeRpcBackend() {\r\n if (initialized)\r\n return;\r\n\r\n initialized = true;\r\n\r\n RpcInvocation.runActivity = RpcTrace.run; // redirect the invocation processing to the tracer\r\n\r\n // set up static logger metadata to include current RpcActivity information for logs during rpc processing\r\n Logger.staticMetaData.set(\"rpc\", () => RpcInvocation.sanitizeForLog(RpcTrace.currentActivity));\r\n\r\n RpcMultipart.createStream = (value: RpcSerializedValue) => {\r\n const form = new FormData();\r\n RpcMultipart.writeValueToForm(form, value);\r\n return form;\r\n };\r\n\r\n RpcMultipart.parseRequest = async (req: HttpServerRequest) => {\r\n return new Promise<RpcSerializedValue>((resolve, reject) => {\r\n const form = new multiparty.Form({ maxFieldsSize: Infinity });\r\n form.on(\"error\", (err) => {\r\n reject(err);\r\n });\r\n\r\n const value = RpcSerializedValue.create();\r\n const data: { [index: string]: { size: number, chunks: Buffer[] } } = {};\r\n\r\n form.on(\"part\", (part: multiparty.Part) => {\r\n part.on(\"data\", (chunk: string | Buffer) => {\r\n if (part.name === \"objects\") {\r\n value.objects += chunk.toString();\r\n } else if (Buffer.isBuffer(chunk)) {\r\n if (!data[part.name]) {\r\n data[part.name] = { size: 0, chunks: [] };\r\n }\r\n\r\n data[part.name].size += chunk.byteLength;\r\n data[part.name].chunks.push(chunk);\r\n } else {\r\n throw new IModelError(BentleyStatus.ERROR, \"Unknown input.\");\r\n }\r\n });\r\n });\r\n\r\n form.on(\"close\", () => {\r\n let i = 0;\r\n for (; ;) {\r\n const part = data[`data-${i}`];\r\n if (!part) {\r\n break;\r\n }\r\n\r\n value.data.push(Buffer.concat(part.chunks, part.size));\r\n ++i;\r\n }\r\n\r\n resolve(value);\r\n });\r\n\r\n form.parse(req);\r\n });\r\n };\r\n}\r\n\r\n"]}
@@ -20,7 +20,7 @@ class SQLiteDb {
20
20
  }
21
21
  /** @internal */
22
22
  get nativeDb() {
23
- return this._nativeDb;
23
+ return this._nativeDb; // eslint-disable-line @typescript-eslint/no-non-null-assertion
24
24
  }
25
25
  /** Call this function when finished with this SQLiteDb. This releases the native resources */
26
26
  dispose() {