@itwin/core-common 4.0.0-dev.96 → 4.0.0-dev.98
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.
- package/lib/cjs/ChangesetProps.d.ts +3 -3
- package/lib/cjs/ChangesetProps.d.ts.map +1 -1
- package/lib/cjs/ChangesetProps.js.map +1 -1
- package/lib/cjs/RpcInterface.d.ts +2 -0
- package/lib/cjs/RpcInterface.d.ts.map +1 -1
- package/lib/cjs/RpcInterface.js +30 -9
- package/lib/cjs/RpcInterface.js.map +1 -1
- package/lib/esm/ChangesetProps.d.ts +3 -3
- package/lib/esm/ChangesetProps.d.ts.map +1 -1
- package/lib/esm/ChangesetProps.js.map +1 -1
- package/lib/esm/RpcInterface.d.ts +2 -0
- package/lib/esm/RpcInterface.d.ts.map +1 -1
- package/lib/esm/RpcInterface.js +28 -7
- package/lib/esm/RpcInterface.js.map +1 -1
- package/package.json +6 -8
|
@@ -56,7 +56,7 @@ export declare enum ChangesetType {
|
|
|
56
56
|
Schema = 1
|
|
57
57
|
}
|
|
58
58
|
/** Properties of a changeset
|
|
59
|
-
* @
|
|
59
|
+
* @public
|
|
60
60
|
*/
|
|
61
61
|
export interface ChangesetProps {
|
|
62
62
|
/** The index (sequence number) from IModelHub for this changeset. Larger index values were pushed later. */
|
|
@@ -76,10 +76,10 @@ export interface ChangesetProps {
|
|
|
76
76
|
/** The identity of the user that created this changeset */
|
|
77
77
|
userCreated: string;
|
|
78
78
|
/** The size, in bytes, of this changeset */
|
|
79
|
-
size
|
|
79
|
+
size: number;
|
|
80
80
|
}
|
|
81
81
|
/** Properties of a changeset file
|
|
82
|
-
* @
|
|
82
|
+
* @internal
|
|
83
83
|
*/
|
|
84
84
|
export interface ChangesetFileProps extends ChangesetProps {
|
|
85
85
|
/** The full pathname of the local file holding this changeset. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChangesetProps.d.ts","sourceRoot":"","sources":["../../src/ChangesetProps.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,cAAc;AACd,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC;AACnC,cAAc;AACd,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC;AAElC;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC;AAEjC;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAEpC;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAAG,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,WAAW,CAAA;CAAE;AAEjG;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,WAAW,CAAA;CAAE;AAEnG;;;EAGE;AACF,MAAM,MAAM,kBAAkB,GAAG,mBAAmB,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,KAAK,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AAEtK;;;GAGG;AACH,oBAAY,aAAa;IACvB,mDAAmD;IACnD,OAAO,IAAI;IACX,+CAA+C;IAC/C,MAAM,IAAI;CACX;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,4GAA4G;IAC5G,KAAK,EAAE,cAAc,CAAC;IACtB,sBAAsB;IACtB,EAAE,EAAE,WAAW,CAAC;IAChB,gEAAgE;IAChE,QAAQ,EAAE,WAAW,CAAC;IACtB,4BAA4B;IAC5B,WAAW,EAAE,aAAa,CAAC;IAC3B,qEAAqE;IACrE,WAAW,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,WAAW,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,QAAQ,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,4CAA4C;IAC5C,IAAI,
|
|
1
|
+
{"version":3,"file":"ChangesetProps.d.ts","sourceRoot":"","sources":["../../src/ChangesetProps.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,cAAc;AACd,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC;AACnC,cAAc;AACd,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC;AAElC;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC;AAEjC;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAEpC;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAAG,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,WAAW,CAAA;CAAE;AAEjG;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,WAAW,CAAA;CAAE;AAEnG;;;EAGE;AACF,MAAM,MAAM,kBAAkB,GAAG,mBAAmB,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,KAAK,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AAEtK;;;GAGG;AACH,oBAAY,aAAa;IACvB,mDAAmD;IACnD,OAAO,IAAI;IACX,+CAA+C;IAC/C,MAAM,IAAI;CACX;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,4GAA4G;IAC5G,KAAK,EAAE,cAAc,CAAC;IACtB,sBAAsB;IACtB,EAAE,EAAE,WAAW,CAAC;IAChB,gEAAgE;IAChE,QAAQ,EAAE,WAAW,CAAC;IACtB,4BAA4B;IAC5B,WAAW,EAAE,aAAa,CAAC;IAC3B,qEAAqE;IACrE,WAAW,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,WAAW,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,QAAQ,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACxD,kEAAkE;IAClE,QAAQ,EAAE,aAAa,CAAC;CACzB;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,mCAAmC;IACnC,KAAK,EAAE,cAAc,CAAC;IACtB,sFAAsF;IACtF,GAAG,CAAC,EAAE,cAAc,CAAC;CACtB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChangesetProps.js","sourceRoot":"","sources":["../../src/ChangesetProps.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;;GAGG;;;AAuCH;;;GAGG;AACH,IAAY,aAKX;AALD,WAAY,aAAa;IACvB,mDAAmD;IACnD,uDAAW,CAAA;IACX,+CAA+C;IAC/C,qDAAU,CAAA;AACZ,CAAC,EALW,aAAa,GAAb,qBAAa,KAAb,qBAAa,QAKxB","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/**\r\n * @packageDocumentation\r\n * @module iModels\r\n */\r\n\r\n/** @public */\r\nexport type LocalFileName = string;\r\n/** @public */\r\nexport type LocalDirName = string;\r\n\r\n/** A string that identifies a changeset.\r\n * @note this string is *not* a Guid. It is generated internally based on the content of the changeset.\r\n * @public\r\n * @extensions\r\n */\r\nexport type ChangesetId = string;\r\n\r\n/** The index of a changeset, assigned by iModelHub.\r\n * @note 0 means \"before the first changeset.\" Values less than 0 are invalid.\r\n * @public\r\n * @extensions\r\n */\r\nexport type ChangesetIndex = number;\r\n\r\n/** Both the index and Id of a changeset\r\n * @public\r\n * @extensions\r\n */\r\nexport interface ChangesetIndexAndId { readonly index: ChangesetIndex, readonly id: ChangesetId }\r\n\r\n/** The Id and optionally the index of a changeset\r\n * @public\r\n * @extensions\r\n */\r\nexport interface ChangesetIdWithIndex { readonly index?: ChangesetIndex, readonly id: ChangesetId }\r\n\r\n/** either changeset index, id, or both\r\n* @public\r\n * @extensions\r\n*/\r\nexport type ChangesetIndexOrId = ChangesetIndexAndId | { readonly index: ChangesetIndex, readonly id?: never } | { readonly id: ChangesetId, readonly index?: never };\r\n\r\n/** Value to indicate whether a changeset contains schema changes or not\r\n * @public\r\n * @extensions\r\n */\r\nexport enum ChangesetType {\r\n /** changeset does *not* contain schema changes. */\r\n Regular = 0,\r\n /** changeset *does* contain schema changes. */\r\n Schema = 1,\r\n}\r\n\r\n/** Properties of a changeset\r\n * @
|
|
1
|
+
{"version":3,"file":"ChangesetProps.js","sourceRoot":"","sources":["../../src/ChangesetProps.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;;GAGG;;;AAuCH;;;GAGG;AACH,IAAY,aAKX;AALD,WAAY,aAAa;IACvB,mDAAmD;IACnD,uDAAW,CAAA;IACX,+CAA+C;IAC/C,qDAAU,CAAA;AACZ,CAAC,EALW,aAAa,GAAb,qBAAa,KAAb,qBAAa,QAKxB","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/**\r\n * @packageDocumentation\r\n * @module iModels\r\n */\r\n\r\n/** @public */\r\nexport type LocalFileName = string;\r\n/** @public */\r\nexport type LocalDirName = string;\r\n\r\n/** A string that identifies a changeset.\r\n * @note this string is *not* a Guid. It is generated internally based on the content of the changeset.\r\n * @public\r\n * @extensions\r\n */\r\nexport type ChangesetId = string;\r\n\r\n/** The index of a changeset, assigned by iModelHub.\r\n * @note 0 means \"before the first changeset.\" Values less than 0 are invalid.\r\n * @public\r\n * @extensions\r\n */\r\nexport type ChangesetIndex = number;\r\n\r\n/** Both the index and Id of a changeset\r\n * @public\r\n * @extensions\r\n */\r\nexport interface ChangesetIndexAndId { readonly index: ChangesetIndex, readonly id: ChangesetId }\r\n\r\n/** The Id and optionally the index of a changeset\r\n * @public\r\n * @extensions\r\n */\r\nexport interface ChangesetIdWithIndex { readonly index?: ChangesetIndex, readonly id: ChangesetId }\r\n\r\n/** either changeset index, id, or both\r\n* @public\r\n * @extensions\r\n*/\r\nexport type ChangesetIndexOrId = ChangesetIndexAndId | { readonly index: ChangesetIndex, readonly id?: never } | { readonly id: ChangesetId, readonly index?: never };\r\n\r\n/** Value to indicate whether a changeset contains schema changes or not\r\n * @public\r\n * @extensions\r\n */\r\nexport enum ChangesetType {\r\n /** changeset does *not* contain schema changes. */\r\n Regular = 0,\r\n /** changeset *does* contain schema changes. */\r\n Schema = 1,\r\n}\r\n\r\n/** Properties of a changeset\r\n * @public\r\n */\r\nexport interface ChangesetProps {\r\n /** The index (sequence number) from IModelHub for this changeset. Larger index values were pushed later. */\r\n index: ChangesetIndex;\r\n /** the ChangesetId */\r\n id: ChangesetId;\r\n /** the ChangeSetId of the parent changeset of this changeset */\r\n parentId: ChangesetId;\r\n /** The type of changeset */\r\n changesType: ChangesetType;\r\n /** The user-supplied description of the work this changeset holds */\r\n description: string;\r\n /** The BriefcaseId of the briefcase that created this changeset */\r\n briefcaseId: number;\r\n /** The date this changeset was uploaded to the hub */\r\n pushDate: string;\r\n /** The identity of the user that created this changeset */\r\n userCreated: string;\r\n /** The size, in bytes, of this changeset */\r\n size: number;\r\n}\r\n\r\n/** Properties of a changeset file\r\n * @internal\r\n */\r\nexport interface ChangesetFileProps extends ChangesetProps {\r\n /** The full pathname of the local file holding this changeset. */\r\n pathname: LocalFileName;\r\n}\r\n\r\n/**\r\n * A range of changesets\r\n * @public\r\n * @extensions\r\n */\r\nexport interface ChangesetRange {\r\n /** index of the first changeset */\r\n first: ChangesetIndex;\r\n /** index of last changeset. If undefined, all changesets after first are returned. */\r\n end?: ChangesetIndex;\r\n}\r\n"]}
|
|
@@ -23,6 +23,8 @@ export type RpcInterfaceImplementation<T extends RpcInterface = RpcInterface> =
|
|
|
23
23
|
* @public
|
|
24
24
|
*/
|
|
25
25
|
export declare abstract class RpcInterface {
|
|
26
|
+
private static findDiff;
|
|
27
|
+
private static parseVer;
|
|
26
28
|
/** Determines whether the backend version of an RPC interface is compatible (according to semantic versioning) with the frontend version of the interface. */
|
|
27
29
|
static isVersionCompatible(backend: string, frontend: string): boolean;
|
|
28
30
|
/** The configuration for the RPC interface.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RpcInterface.d.ts","sourceRoot":"","sources":["../../src/RpcInterface.ts"],"names":[],"mappings":"AAIA;;GAEG;
|
|
1
|
+
{"version":3,"file":"RpcInterface.d.ts","sourceRoot":"","sources":["../../src/RpcInterface.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAGzF,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAW7D;;;;GAIG;AACH,MAAM,WAAW,sBAAsB,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY;IAAI,SAAS,EAAE,CAAC,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE;AAEhJ;;;GAGG;AACH,MAAM,MAAM,0BAA0B,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY,IAAI,UAAU,CAAC,CAAC;AAS5F;;;GAGG;AACH,8BAAsB,YAAY;IAEhC,OAAO,CAAC,MAAM,CAAC,QAAQ;IAIvB,OAAO,CAAC,MAAM,CAAC,QAAQ;IAYvB,8JAA8J;WAChJ,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAmB7E;;OAEG;IACH,SAAgB,aAAa,EAAE,gBAAgB,CAAC;IAEhD,gBAAgB;IAChB,SAAgB,OAAO,EAAE,eAAe,CAAC;IAEzC,gBAAgB;gBACG,OAAO,GAAE,eAAyC;IAKrE,8DAA8D;IACjD,OAAO,CAAC,CAAC,GAAG,GAAG,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC;IAgBjE,gBAAgB;IACT,qBAAqB,EAAE,wBAAwB,GAAG,SAAS,CAAC;CACpE"}
|
package/lib/cjs/RpcInterface.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RpcInterface = void 0;
|
|
2
4
|
/*---------------------------------------------------------------------------------------------
|
|
3
5
|
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
4
6
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
@@ -6,9 +8,6 @@
|
|
|
6
8
|
/** @packageDocumentation
|
|
7
9
|
* @module RpcInterface
|
|
8
10
|
*/
|
|
9
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.RpcInterface = void 0;
|
|
11
|
-
const semver = require("semver");
|
|
12
11
|
const RpcConfiguration_1 = require("./rpc/core/RpcConfiguration");
|
|
13
12
|
const RpcRegistry_1 = require("./rpc/core/RpcRegistry");
|
|
14
13
|
const RpcRequest_1 = require("./rpc/core/RpcRequest");
|
|
@@ -22,17 +21,39 @@ const core_bentley_1 = require("@itwin/core-bentley");
|
|
|
22
21
|
* @public
|
|
23
22
|
*/
|
|
24
23
|
class RpcInterface {
|
|
24
|
+
static findDiff(backend, frontend) {
|
|
25
|
+
return backend.major !== frontend.major ? "major" : backend.minor !== frontend.minor ? "minor" : backend.patch !== frontend.patch ? "patch" : backend.prerelease !== frontend.prerelease ? "prerelease" : "same";
|
|
26
|
+
}
|
|
27
|
+
static parseVer(version) {
|
|
28
|
+
// Split the version string into major.minor.path and prerelease tag
|
|
29
|
+
const split = version.split(/[:-]/);
|
|
30
|
+
// Split the major.minor.path into seperate components
|
|
31
|
+
const prefix = split[0].split(".");
|
|
32
|
+
if (split.length === 1) {
|
|
33
|
+
return { major: Number(prefix[0]), minor: Number(prefix[1]), patch: Number(prefix[2]) };
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
return { major: Number(prefix[0]), minor: Number(prefix[1]), patch: Number(prefix[2]), prerelease: split[1] };
|
|
37
|
+
}
|
|
38
|
+
}
|
|
25
39
|
/** Determines whether the backend version of an RPC interface is compatible (according to semantic versioning) with the frontend version of the interface. */
|
|
26
40
|
static isVersionCompatible(backend, frontend) {
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
41
|
+
const backendSemver = this.parseVer(backend);
|
|
42
|
+
const frontendSemver = this.parseVer(frontend);
|
|
43
|
+
const difference = this.findDiff(backendSemver, frontendSemver);
|
|
44
|
+
// If the major versions are different, the versions are not compatible
|
|
45
|
+
// In the case of prerelease tags, they are compatible if the whole version string matches, otherwise it fails
|
|
46
|
+
if ((backendSemver.prerelease !== undefined || frontendSemver.prerelease !== undefined) || difference === "major") {
|
|
47
|
+
return difference === "same";
|
|
30
48
|
}
|
|
31
|
-
else if (
|
|
32
|
-
|
|
49
|
+
else if (backendSemver.major === 0 || frontendSemver.major === 0) {
|
|
50
|
+
// If the major and minor versions match and major versions are 0, compatible as long as backend patch version is greater
|
|
51
|
+
return difference === "same" || (difference === "patch" && frontendSemver.patch < backendSemver.patch);
|
|
33
52
|
}
|
|
34
53
|
else {
|
|
35
|
-
|
|
54
|
+
// If the strings match exactly, major and minor match but patch differs, versions are compatible
|
|
55
|
+
// If minor versions differ, compatible as long as backend patch versionn is greater
|
|
56
|
+
return difference === "same" || difference === "patch" || (difference === "minor" && frontendSemver.minor < backendSemver.minor);
|
|
36
57
|
}
|
|
37
58
|
}
|
|
38
59
|
/** @internal */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RpcInterface.js","sourceRoot":"","sources":["../../src/RpcInterface.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module RpcInterface\r\n */\r\n\r\nimport * as semver from \"semver\";\r\nimport { RpcConfiguration, RpcConfigurationSupplier } from \"./rpc/core/RpcConfiguration\";\r\nimport { CURRENT_REQUEST } from \"./rpc/core/RpcRegistry\";\r\nimport { aggregateLoad, RpcRequest } from \"./rpc/core/RpcRequest\";\r\nimport { RpcRoutingToken } from \"./rpc/core/RpcRoutingToken\";\r\nimport { InterceptedRpcRequest, IpcSession } from \"./ipc/IpcSession\";\r\nimport { RpcSerializedValue } from \"./rpc/core/RpcMarshaling\";\r\nimport { RpcManagedStatus } from \"./rpc/core/RpcProtocol\";\r\nimport { BentleyStatus, IModelError, NoContentError } from \"./IModelError\";\r\nimport { RpcRequestEvent, RpcRequestStatus } from \"./rpc/core/RpcConstants\";\r\nimport { BeDuration } from \"@itwin/core-bentley\";\r\nimport { RpcNotFoundResponse } from \"./rpc/core/RpcControl\";\r\n\r\n/* eslint-disable deprecation/deprecation */\r\n\r\n/**\r\n * Specifies the required static properties of an RpcInterface class.\r\n * These properties are used to identify RPC requests and responses.\r\n * @beta\r\n */\r\nexport interface RpcInterfaceDefinition<T extends RpcInterface = RpcInterface> { prototype: T, interfaceName: string, interfaceVersion: string }\r\n\r\n/**\r\n * A class that implements the operations of an RPC interface.\r\n * @beta\r\n */\r\nexport type RpcInterfaceImplementation<T extends RpcInterface = RpcInterface> = new () => T;\r\n\r\n/** An RPC interface is a set of operations exposed by a service that a client can call, using configurable protocols,\r\n * in a platform-independent way. TheRpcInterface class is the base class for RPC interface definitions and implementations.\r\n * @public\r\n */\r\nexport abstract class RpcInterface {\r\n /** Determines whether the backend version of an RPC interface is compatible (according to semantic versioning) with the frontend version of the interface. */\r\n public static isVersionCompatible(backend: string, frontend: string): boolean {\r\n const difference = semver.diff(backend, frontend);\r\n if (semver.prerelease(backend) || semver.prerelease(frontend)) {\r\n return difference === null;\r\n } else if (semver.major(backend) === 0 || semver.major(frontend) === 0) {\r\n return difference === null || (difference === \"patch\" && semver.patch(frontend) < semver.patch(backend));\r\n } else {\r\n return difference === null || difference === \"patch\" || (difference === \"minor\" && semver.minor(frontend) < semver.minor(backend));\r\n }\r\n }\r\n\r\n /** The configuration for the RPC interface.\r\n * @internal\r\n */\r\n public readonly configuration: RpcConfiguration;\r\n\r\n /** @internal */\r\n public readonly routing: RpcRoutingToken;\r\n\r\n /** @internal */\r\n public constructor(routing: RpcRoutingToken = RpcRoutingToken.default) {\r\n this.routing = routing;\r\n this.configuration = RpcConfiguration.supply(this);\r\n }\r\n\r\n /** Obtains the implementation result for an RPC operation. */\r\n public async forward<T = any>(parameters: IArguments): Promise<T> {\r\n const parametersCompat = (arguments.length === 1 && typeof (parameters) === \"object\") ? parameters : arguments;\r\n const parametersArray = Array.isArray(parametersCompat) ? parametersCompat : Array.prototype.slice.call(parametersCompat);\r\n const operationName = parametersArray.pop();\r\n\r\n const session = IpcSession.active;\r\n if (session) {\r\n return intercept(session, this, operationName, parametersArray);\r\n } else {\r\n const request = new (this.configuration.protocol.requestType as any)(this, operationName, parametersArray) as RpcRequest;\r\n request.submit(); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n (this as any)[CURRENT_REQUEST] = request;\r\n return request.response;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public configurationSupplier: RpcConfigurationSupplier | undefined;\r\n}\r\n\r\nRpcInterface.prototype.configurationSupplier = undefined;\r\n\r\nclass InterceptedRequest extends RpcRequest {\r\n protected override async load(): Promise<RpcSerializedValue> { throw new Error(); }\r\n protected override async send(): Promise<number> { throw new Error(); }\r\n protected override setHeader(_name: string, _value: string): void { throw new Error(); }\r\n}\r\n\r\nasync function intercept(session: IpcSession, client: RpcInterface, operation: string, parameters: any[]) {\r\n const request = new InterceptedRequest(client, operation, []);\r\n (client as any)[CURRENT_REQUEST] = request;\r\n\r\n const context = await client.configuration.protocol.serialize(request);\r\n request.parameters = parameters;\r\n\r\n const info: InterceptedRpcRequest = {\r\n definition: {\r\n interfaceName: context.operation.interfaceDefinition,\r\n interfaceVersion: context.operation.interfaceVersion,\r\n },\r\n operation,\r\n parameters,\r\n context: {\r\n applicationId: context.applicationId,\r\n applicationVersion: context.applicationVersion,\r\n id: context.id,\r\n sessionId: context.sessionId,\r\n protocolVersion: (context.protocolVersion || 0).toString(),\r\n },\r\n };\r\n\r\n const dispatch = async () => {\r\n aggregateLoad.lastRequest = new Date().getTime();\r\n\r\n const response = await session.handleRpc(info);\r\n\r\n aggregateLoad.lastResponse = new Date().getTime();\r\n\r\n if (typeof (response) === \"object\" && response.hasOwnProperty(\"iTwinRpcCoreResponse\") && response.hasOwnProperty(\"managedStatus\")) {\r\n const status: RpcManagedStatus = response;\r\n\r\n if (status.managedStatus === \"pending\") {\r\n return handlePending(request, status, dispatch);\r\n } else if (status.managedStatus === \"notFound\") {\r\n return handleNotFound(request, status, dispatch);\r\n } else if (status.managedStatus === \"noContent\") {\r\n return handleNoContent();\r\n }\r\n } else {\r\n return response;\r\n }\r\n };\r\n\r\n return dispatch();\r\n}\r\n\r\nasync function handlePending(request: InterceptedRequest, status: RpcManagedStatus, dispatch: () => Promise<any>) {\r\n request._status = RpcRequestStatus.Pending;\r\n request._extendedStatus = (status.responseValue as { message: string }).message;\r\n RpcRequest.events.raiseEvent(RpcRequestEvent.PendingUpdateReceived, request);\r\n\r\n const delay = request.operation.policy.retryInterval(request.client.configuration);\r\n\r\n await BeDuration.wait(delay);\r\n return dispatch();\r\n}\r\n\r\nasync function handleNotFound(request: InterceptedRequest, status: RpcManagedStatus, dispatch: () => Promise<any>) {\r\n return new Promise((resolve, reject) => {\r\n let resubmitted = false;\r\n\r\n RpcRequest.notFoundHandlers.raiseEvent(request, status.responseValue as RpcNotFoundResponse, async () => {\r\n if (resubmitted) {\r\n throw new IModelError(BentleyStatus.ERROR, `Already resubmitted using this handler.`);\r\n }\r\n\r\n resubmitted = true;\r\n\r\n try {\r\n const response = await dispatch();\r\n resolve(response);\r\n } catch (err) {\r\n reject(err);\r\n }\r\n }, reject);\r\n });\r\n}\r\n\r\nasync function handleNoContent() {\r\n throw new NoContentError();\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"RpcInterface.js","sourceRoot":"","sources":["../../src/RpcInterface.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\nimport { RpcConfiguration, RpcConfigurationSupplier } from \"./rpc/core/RpcConfiguration\";\r\nimport { CURRENT_REQUEST } from \"./rpc/core/RpcRegistry\";\r\nimport { aggregateLoad, RpcRequest } from \"./rpc/core/RpcRequest\";\r\nimport { RpcRoutingToken } from \"./rpc/core/RpcRoutingToken\";\r\nimport { InterceptedRpcRequest, IpcSession } from \"./ipc/IpcSession\";\r\nimport { RpcSerializedValue } from \"./rpc/core/RpcMarshaling\";\r\nimport { RpcManagedStatus } from \"./rpc/core/RpcProtocol\";\r\nimport { BentleyStatus, IModelError, NoContentError } from \"./IModelError\";\r\nimport { RpcRequestEvent, RpcRequestStatus } from \"./rpc/core/RpcConstants\";\r\nimport { BeDuration } from \"@itwin/core-bentley\";\r\nimport { RpcNotFoundResponse } from \"./rpc/core/RpcControl\";\r\n\r\n/* eslint-disable deprecation/deprecation */\r\n\r\n/**\r\n * Specifies the required static properties of an RpcInterface class.\r\n * These properties are used to identify RPC requests and responses.\r\n * @beta\r\n */\r\nexport interface RpcInterfaceDefinition<T extends RpcInterface = RpcInterface> { prototype: T, interfaceName: string, interfaceVersion: string }\r\n\r\n/**\r\n * A class that implements the operations of an RPC interface.\r\n * @beta\r\n */\r\nexport type RpcInterfaceImplementation<T extends RpcInterface = RpcInterface> = new () => T;\r\n\r\ninterface SemverType {\r\n major: number;\r\n minor: number;\r\n patch: number;\r\n prerelease?: string;\r\n}\r\n\r\n/** An RPC interface is a set of operations exposed by a service that a client can call, using configurable protocols,\r\n * in a platform-independent way. TheRpcInterface class is the base class for RPC interface definitions and implementations.\r\n * @public\r\n */\r\nexport abstract class RpcInterface {\r\n\r\n private static findDiff(backend: SemverType, frontend: SemverType) {\r\n return backend.major !== frontend.major ? \"major\" : backend.minor !== frontend.minor ? \"minor\" : backend.patch !== frontend.patch ? \"patch\" : backend.prerelease !== frontend.prerelease ? \"prerelease\" : \"same\";\r\n }\r\n\r\n private static parseVer(version: string): SemverType {\r\n // Split the version string into major.minor.path and prerelease tag\r\n const split = version.split(/[:-]/);\r\n // Split the major.minor.path into seperate components\r\n const prefix = split[0].split(\".\");\r\n if (split.length === 1) {\r\n return { major: Number(prefix[0]), minor: Number(prefix[1]), patch: Number(prefix[2]) };\r\n } else {\r\n return { major: Number(prefix[0]), minor: Number(prefix[1]), patch: Number(prefix[2]), prerelease: split[1] };\r\n }\r\n }\r\n\r\n /** Determines whether the backend version of an RPC interface is compatible (according to semantic versioning) with the frontend version of the interface. */\r\n public static isVersionCompatible(backend: string, frontend: string): boolean {\r\n const backendSemver = this.parseVer(backend);\r\n const frontendSemver = this.parseVer(frontend);\r\n const difference = this.findDiff(backendSemver, frontendSemver);\r\n\r\n // If the major versions are different, the versions are not compatible\r\n // In the case of prerelease tags, they are compatible if the whole version string matches, otherwise it fails\r\n if ((backendSemver.prerelease !== undefined || frontendSemver.prerelease !== undefined) || difference === \"major\") {\r\n return difference === \"same\";\r\n } else if (backendSemver.major === 0 || frontendSemver.major === 0) {\r\n // If the major and minor versions match and major versions are 0, compatible as long as backend patch version is greater\r\n return difference === \"same\" || (difference === \"patch\" && frontendSemver.patch < backendSemver.patch);\r\n } else {\r\n // If the strings match exactly, major and minor match but patch differs, versions are compatible\r\n // If minor versions differ, compatible as long as backend patch versionn is greater\r\n return difference === \"same\" || difference === \"patch\" || (difference === \"minor\" && frontendSemver.minor < backendSemver.minor);\r\n }\r\n }\r\n\r\n /** The configuration for the RPC interface.\r\n * @internal\r\n */\r\n public readonly configuration: RpcConfiguration;\r\n\r\n /** @internal */\r\n public readonly routing: RpcRoutingToken;\r\n\r\n /** @internal */\r\n public constructor(routing: RpcRoutingToken = RpcRoutingToken.default) {\r\n this.routing = routing;\r\n this.configuration = RpcConfiguration.supply(this);\r\n }\r\n\r\n /** Obtains the implementation result for an RPC operation. */\r\n public async forward<T = any>(parameters: IArguments): Promise<T> {\r\n const parametersCompat = (arguments.length === 1 && typeof (parameters) === \"object\") ? parameters : arguments;\r\n const parametersArray = Array.isArray(parametersCompat) ? parametersCompat : Array.prototype.slice.call(parametersCompat);\r\n const operationName = parametersArray.pop();\r\n\r\n const session = IpcSession.active;\r\n if (session) {\r\n return intercept(session, this, operationName, parametersArray);\r\n } else {\r\n const request = new (this.configuration.protocol.requestType as any)(this, operationName, parametersArray) as RpcRequest;\r\n request.submit(); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n (this as any)[CURRENT_REQUEST] = request;\r\n return request.response;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public configurationSupplier: RpcConfigurationSupplier | undefined;\r\n}\r\n\r\nRpcInterface.prototype.configurationSupplier = undefined;\r\n\r\nclass InterceptedRequest extends RpcRequest {\r\n protected override async load(): Promise<RpcSerializedValue> { throw new Error(); }\r\n protected override async send(): Promise<number> { throw new Error(); }\r\n protected override setHeader(_name: string, _value: string): void { throw new Error(); }\r\n}\r\n\r\nasync function intercept(session: IpcSession, client: RpcInterface, operation: string, parameters: any[]) {\r\n const request = new InterceptedRequest(client, operation, []);\r\n (client as any)[CURRENT_REQUEST] = request;\r\n\r\n const context = await client.configuration.protocol.serialize(request);\r\n request.parameters = parameters;\r\n\r\n const info: InterceptedRpcRequest = {\r\n definition: {\r\n interfaceName: context.operation.interfaceDefinition,\r\n interfaceVersion: context.operation.interfaceVersion,\r\n },\r\n operation,\r\n parameters,\r\n context: {\r\n applicationId: context.applicationId,\r\n applicationVersion: context.applicationVersion,\r\n id: context.id,\r\n sessionId: context.sessionId,\r\n protocolVersion: (context.protocolVersion || 0).toString(),\r\n },\r\n };\r\n\r\n const dispatch = async () => {\r\n aggregateLoad.lastRequest = new Date().getTime();\r\n\r\n const response = await session.handleRpc(info);\r\n\r\n aggregateLoad.lastResponse = new Date().getTime();\r\n\r\n if (typeof (response) === \"object\" && response.hasOwnProperty(\"iTwinRpcCoreResponse\") && response.hasOwnProperty(\"managedStatus\")) {\r\n const status: RpcManagedStatus = response;\r\n\r\n if (status.managedStatus === \"pending\") {\r\n return handlePending(request, status, dispatch);\r\n } else if (status.managedStatus === \"notFound\") {\r\n return handleNotFound(request, status, dispatch);\r\n } else if (status.managedStatus === \"noContent\") {\r\n return handleNoContent();\r\n }\r\n } else {\r\n return response;\r\n }\r\n };\r\n\r\n return dispatch();\r\n}\r\n\r\nasync function handlePending(request: InterceptedRequest, status: RpcManagedStatus, dispatch: () => Promise<any>) {\r\n request._status = RpcRequestStatus.Pending;\r\n request._extendedStatus = (status.responseValue as { message: string }).message;\r\n RpcRequest.events.raiseEvent(RpcRequestEvent.PendingUpdateReceived, request);\r\n\r\n const delay = request.operation.policy.retryInterval(request.client.configuration);\r\n\r\n await BeDuration.wait(delay);\r\n return dispatch();\r\n}\r\n\r\nasync function handleNotFound(request: InterceptedRequest, status: RpcManagedStatus, dispatch: () => Promise<any>) {\r\n return new Promise((resolve, reject) => {\r\n let resubmitted = false;\r\n\r\n RpcRequest.notFoundHandlers.raiseEvent(request, status.responseValue as RpcNotFoundResponse, async () => {\r\n if (resubmitted) {\r\n throw new IModelError(BentleyStatus.ERROR, `Already resubmitted using this handler.`);\r\n }\r\n\r\n resubmitted = true;\r\n\r\n try {\r\n const response = await dispatch();\r\n resolve(response);\r\n } catch (err) {\r\n reject(err);\r\n }\r\n }, reject);\r\n });\r\n}\r\n\r\nasync function handleNoContent() {\r\n throw new NoContentError();\r\n}\r\n"]}
|
|
@@ -56,7 +56,7 @@ export declare enum ChangesetType {
|
|
|
56
56
|
Schema = 1
|
|
57
57
|
}
|
|
58
58
|
/** Properties of a changeset
|
|
59
|
-
* @
|
|
59
|
+
* @public
|
|
60
60
|
*/
|
|
61
61
|
export interface ChangesetProps {
|
|
62
62
|
/** The index (sequence number) from IModelHub for this changeset. Larger index values were pushed later. */
|
|
@@ -76,10 +76,10 @@ export interface ChangesetProps {
|
|
|
76
76
|
/** The identity of the user that created this changeset */
|
|
77
77
|
userCreated: string;
|
|
78
78
|
/** The size, in bytes, of this changeset */
|
|
79
|
-
size
|
|
79
|
+
size: number;
|
|
80
80
|
}
|
|
81
81
|
/** Properties of a changeset file
|
|
82
|
-
* @
|
|
82
|
+
* @internal
|
|
83
83
|
*/
|
|
84
84
|
export interface ChangesetFileProps extends ChangesetProps {
|
|
85
85
|
/** The full pathname of the local file holding this changeset. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChangesetProps.d.ts","sourceRoot":"","sources":["../../src/ChangesetProps.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,cAAc;AACd,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC;AACnC,cAAc;AACd,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC;AAElC;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC;AAEjC;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAEpC;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAAG,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,WAAW,CAAA;CAAE;AAEjG;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,WAAW,CAAA;CAAE;AAEnG;;;EAGE;AACF,MAAM,MAAM,kBAAkB,GAAG,mBAAmB,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,KAAK,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AAEtK;;;GAGG;AACH,oBAAY,aAAa;IACvB,mDAAmD;IACnD,OAAO,IAAI;IACX,+CAA+C;IAC/C,MAAM,IAAI;CACX;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,4GAA4G;IAC5G,KAAK,EAAE,cAAc,CAAC;IACtB,sBAAsB;IACtB,EAAE,EAAE,WAAW,CAAC;IAChB,gEAAgE;IAChE,QAAQ,EAAE,WAAW,CAAC;IACtB,4BAA4B;IAC5B,WAAW,EAAE,aAAa,CAAC;IAC3B,qEAAqE;IACrE,WAAW,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,WAAW,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,QAAQ,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,4CAA4C;IAC5C,IAAI,
|
|
1
|
+
{"version":3,"file":"ChangesetProps.d.ts","sourceRoot":"","sources":["../../src/ChangesetProps.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,cAAc;AACd,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC;AACnC,cAAc;AACd,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC;AAElC;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC;AAEjC;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAEpC;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAAG,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,WAAW,CAAA;CAAE;AAEjG;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,WAAW,CAAA;CAAE;AAEnG;;;EAGE;AACF,MAAM,MAAM,kBAAkB,GAAG,mBAAmB,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,KAAK,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AAEtK;;;GAGG;AACH,oBAAY,aAAa;IACvB,mDAAmD;IACnD,OAAO,IAAI;IACX,+CAA+C;IAC/C,MAAM,IAAI;CACX;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,4GAA4G;IAC5G,KAAK,EAAE,cAAc,CAAC;IACtB,sBAAsB;IACtB,EAAE,EAAE,WAAW,CAAC;IAChB,gEAAgE;IAChE,QAAQ,EAAE,WAAW,CAAC;IACtB,4BAA4B;IAC5B,WAAW,EAAE,aAAa,CAAC;IAC3B,qEAAqE;IACrE,WAAW,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,WAAW,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,QAAQ,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACxD,kEAAkE;IAClE,QAAQ,EAAE,aAAa,CAAC;CACzB;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,mCAAmC;IACnC,KAAK,EAAE,cAAc,CAAC;IACtB,sFAAsF;IACtF,GAAG,CAAC,EAAE,cAAc,CAAC;CACtB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChangesetProps.js","sourceRoot":"","sources":["../../src/ChangesetProps.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;;GAGG;AAuCH;;;GAGG;AACH,MAAM,CAAN,IAAY,aAKX;AALD,WAAY,aAAa;IACvB,mDAAmD;IACnD,uDAAW,CAAA;IACX,+CAA+C;IAC/C,qDAAU,CAAA;AACZ,CAAC,EALW,aAAa,KAAb,aAAa,QAKxB","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/**\r\n * @packageDocumentation\r\n * @module iModels\r\n */\r\n\r\n/** @public */\r\nexport type LocalFileName = string;\r\n/** @public */\r\nexport type LocalDirName = string;\r\n\r\n/** A string that identifies a changeset.\r\n * @note this string is *not* a Guid. It is generated internally based on the content of the changeset.\r\n * @public\r\n * @extensions\r\n */\r\nexport type ChangesetId = string;\r\n\r\n/** The index of a changeset, assigned by iModelHub.\r\n * @note 0 means \"before the first changeset.\" Values less than 0 are invalid.\r\n * @public\r\n * @extensions\r\n */\r\nexport type ChangesetIndex = number;\r\n\r\n/** Both the index and Id of a changeset\r\n * @public\r\n * @extensions\r\n */\r\nexport interface ChangesetIndexAndId { readonly index: ChangesetIndex, readonly id: ChangesetId }\r\n\r\n/** The Id and optionally the index of a changeset\r\n * @public\r\n * @extensions\r\n */\r\nexport interface ChangesetIdWithIndex { readonly index?: ChangesetIndex, readonly id: ChangesetId }\r\n\r\n/** either changeset index, id, or both\r\n* @public\r\n * @extensions\r\n*/\r\nexport type ChangesetIndexOrId = ChangesetIndexAndId | { readonly index: ChangesetIndex, readonly id?: never } | { readonly id: ChangesetId, readonly index?: never };\r\n\r\n/** Value to indicate whether a changeset contains schema changes or not\r\n * @public\r\n * @extensions\r\n */\r\nexport enum ChangesetType {\r\n /** changeset does *not* contain schema changes. */\r\n Regular = 0,\r\n /** changeset *does* contain schema changes. */\r\n Schema = 1,\r\n}\r\n\r\n/** Properties of a changeset\r\n * @
|
|
1
|
+
{"version":3,"file":"ChangesetProps.js","sourceRoot":"","sources":["../../src/ChangesetProps.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;;GAGG;AAuCH;;;GAGG;AACH,MAAM,CAAN,IAAY,aAKX;AALD,WAAY,aAAa;IACvB,mDAAmD;IACnD,uDAAW,CAAA;IACX,+CAA+C;IAC/C,qDAAU,CAAA;AACZ,CAAC,EALW,aAAa,KAAb,aAAa,QAKxB","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/**\r\n * @packageDocumentation\r\n * @module iModels\r\n */\r\n\r\n/** @public */\r\nexport type LocalFileName = string;\r\n/** @public */\r\nexport type LocalDirName = string;\r\n\r\n/** A string that identifies a changeset.\r\n * @note this string is *not* a Guid. It is generated internally based on the content of the changeset.\r\n * @public\r\n * @extensions\r\n */\r\nexport type ChangesetId = string;\r\n\r\n/** The index of a changeset, assigned by iModelHub.\r\n * @note 0 means \"before the first changeset.\" Values less than 0 are invalid.\r\n * @public\r\n * @extensions\r\n */\r\nexport type ChangesetIndex = number;\r\n\r\n/** Both the index and Id of a changeset\r\n * @public\r\n * @extensions\r\n */\r\nexport interface ChangesetIndexAndId { readonly index: ChangesetIndex, readonly id: ChangesetId }\r\n\r\n/** The Id and optionally the index of a changeset\r\n * @public\r\n * @extensions\r\n */\r\nexport interface ChangesetIdWithIndex { readonly index?: ChangesetIndex, readonly id: ChangesetId }\r\n\r\n/** either changeset index, id, or both\r\n* @public\r\n * @extensions\r\n*/\r\nexport type ChangesetIndexOrId = ChangesetIndexAndId | { readonly index: ChangesetIndex, readonly id?: never } | { readonly id: ChangesetId, readonly index?: never };\r\n\r\n/** Value to indicate whether a changeset contains schema changes or not\r\n * @public\r\n * @extensions\r\n */\r\nexport enum ChangesetType {\r\n /** changeset does *not* contain schema changes. */\r\n Regular = 0,\r\n /** changeset *does* contain schema changes. */\r\n Schema = 1,\r\n}\r\n\r\n/** Properties of a changeset\r\n * @public\r\n */\r\nexport interface ChangesetProps {\r\n /** The index (sequence number) from IModelHub for this changeset. Larger index values were pushed later. */\r\n index: ChangesetIndex;\r\n /** the ChangesetId */\r\n id: ChangesetId;\r\n /** the ChangeSetId of the parent changeset of this changeset */\r\n parentId: ChangesetId;\r\n /** The type of changeset */\r\n changesType: ChangesetType;\r\n /** The user-supplied description of the work this changeset holds */\r\n description: string;\r\n /** The BriefcaseId of the briefcase that created this changeset */\r\n briefcaseId: number;\r\n /** The date this changeset was uploaded to the hub */\r\n pushDate: string;\r\n /** The identity of the user that created this changeset */\r\n userCreated: string;\r\n /** The size, in bytes, of this changeset */\r\n size: number;\r\n}\r\n\r\n/** Properties of a changeset file\r\n * @internal\r\n */\r\nexport interface ChangesetFileProps extends ChangesetProps {\r\n /** The full pathname of the local file holding this changeset. */\r\n pathname: LocalFileName;\r\n}\r\n\r\n/**\r\n * A range of changesets\r\n * @public\r\n * @extensions\r\n */\r\nexport interface ChangesetRange {\r\n /** index of the first changeset */\r\n first: ChangesetIndex;\r\n /** index of last changeset. If undefined, all changesets after first are returned. */\r\n end?: ChangesetIndex;\r\n}\r\n"]}
|
|
@@ -23,6 +23,8 @@ export type RpcInterfaceImplementation<T extends RpcInterface = RpcInterface> =
|
|
|
23
23
|
* @public
|
|
24
24
|
*/
|
|
25
25
|
export declare abstract class RpcInterface {
|
|
26
|
+
private static findDiff;
|
|
27
|
+
private static parseVer;
|
|
26
28
|
/** Determines whether the backend version of an RPC interface is compatible (according to semantic versioning) with the frontend version of the interface. */
|
|
27
29
|
static isVersionCompatible(backend: string, frontend: string): boolean;
|
|
28
30
|
/** The configuration for the RPC interface.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RpcInterface.d.ts","sourceRoot":"","sources":["../../src/RpcInterface.ts"],"names":[],"mappings":"AAIA;;GAEG;
|
|
1
|
+
{"version":3,"file":"RpcInterface.d.ts","sourceRoot":"","sources":["../../src/RpcInterface.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAGzF,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAW7D;;;;GAIG;AACH,MAAM,WAAW,sBAAsB,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY;IAAI,SAAS,EAAE,CAAC,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE;AAEhJ;;;GAGG;AACH,MAAM,MAAM,0BAA0B,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY,IAAI,UAAU,CAAC,CAAC;AAS5F;;;GAGG;AACH,8BAAsB,YAAY;IAEhC,OAAO,CAAC,MAAM,CAAC,QAAQ;IAIvB,OAAO,CAAC,MAAM,CAAC,QAAQ;IAYvB,8JAA8J;WAChJ,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAmB7E;;OAEG;IACH,SAAgB,aAAa,EAAE,gBAAgB,CAAC;IAEhD,gBAAgB;IAChB,SAAgB,OAAO,EAAE,eAAe,CAAC;IAEzC,gBAAgB;gBACG,OAAO,GAAE,eAAyC;IAKrE,8DAA8D;IACjD,OAAO,CAAC,CAAC,GAAG,GAAG,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC;IAgBjE,gBAAgB;IACT,qBAAqB,EAAE,wBAAwB,GAAG,SAAS,CAAC;CACpE"}
|
package/lib/esm/RpcInterface.js
CHANGED
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
/** @packageDocumentation
|
|
6
6
|
* @module RpcInterface
|
|
7
7
|
*/
|
|
8
|
-
import * as semver from "semver";
|
|
9
8
|
import { RpcConfiguration } from "./rpc/core/RpcConfiguration";
|
|
10
9
|
import { CURRENT_REQUEST } from "./rpc/core/RpcRegistry";
|
|
11
10
|
import { aggregateLoad, RpcRequest } from "./rpc/core/RpcRequest";
|
|
@@ -19,17 +18,39 @@ import { BeDuration } from "@itwin/core-bentley";
|
|
|
19
18
|
* @public
|
|
20
19
|
*/
|
|
21
20
|
export class RpcInterface {
|
|
21
|
+
static findDiff(backend, frontend) {
|
|
22
|
+
return backend.major !== frontend.major ? "major" : backend.minor !== frontend.minor ? "minor" : backend.patch !== frontend.patch ? "patch" : backend.prerelease !== frontend.prerelease ? "prerelease" : "same";
|
|
23
|
+
}
|
|
24
|
+
static parseVer(version) {
|
|
25
|
+
// Split the version string into major.minor.path and prerelease tag
|
|
26
|
+
const split = version.split(/[:-]/);
|
|
27
|
+
// Split the major.minor.path into seperate components
|
|
28
|
+
const prefix = split[0].split(".");
|
|
29
|
+
if (split.length === 1) {
|
|
30
|
+
return { major: Number(prefix[0]), minor: Number(prefix[1]), patch: Number(prefix[2]) };
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
return { major: Number(prefix[0]), minor: Number(prefix[1]), patch: Number(prefix[2]), prerelease: split[1] };
|
|
34
|
+
}
|
|
35
|
+
}
|
|
22
36
|
/** Determines whether the backend version of an RPC interface is compatible (according to semantic versioning) with the frontend version of the interface. */
|
|
23
37
|
static isVersionCompatible(backend, frontend) {
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
38
|
+
const backendSemver = this.parseVer(backend);
|
|
39
|
+
const frontendSemver = this.parseVer(frontend);
|
|
40
|
+
const difference = this.findDiff(backendSemver, frontendSemver);
|
|
41
|
+
// If the major versions are different, the versions are not compatible
|
|
42
|
+
// In the case of prerelease tags, they are compatible if the whole version string matches, otherwise it fails
|
|
43
|
+
if ((backendSemver.prerelease !== undefined || frontendSemver.prerelease !== undefined) || difference === "major") {
|
|
44
|
+
return difference === "same";
|
|
27
45
|
}
|
|
28
|
-
else if (
|
|
29
|
-
|
|
46
|
+
else if (backendSemver.major === 0 || frontendSemver.major === 0) {
|
|
47
|
+
// If the major and minor versions match and major versions are 0, compatible as long as backend patch version is greater
|
|
48
|
+
return difference === "same" || (difference === "patch" && frontendSemver.patch < backendSemver.patch);
|
|
30
49
|
}
|
|
31
50
|
else {
|
|
32
|
-
|
|
51
|
+
// If the strings match exactly, major and minor match but patch differs, versions are compatible
|
|
52
|
+
// If minor versions differ, compatible as long as backend patch versionn is greater
|
|
53
|
+
return difference === "same" || difference === "patch" || (difference === "minor" && frontendSemver.minor < backendSemver.minor);
|
|
33
54
|
}
|
|
34
55
|
}
|
|
35
56
|
/** @internal */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RpcInterface.js","sourceRoot":"","sources":["../../src/RpcInterface.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module RpcInterface\r\n */\r\n\r\nimport * as semver from \"semver\";\r\nimport { RpcConfiguration, RpcConfigurationSupplier } from \"./rpc/core/RpcConfiguration\";\r\nimport { CURRENT_REQUEST } from \"./rpc/core/RpcRegistry\";\r\nimport { aggregateLoad, RpcRequest } from \"./rpc/core/RpcRequest\";\r\nimport { RpcRoutingToken } from \"./rpc/core/RpcRoutingToken\";\r\nimport { InterceptedRpcRequest, IpcSession } from \"./ipc/IpcSession\";\r\nimport { RpcSerializedValue } from \"./rpc/core/RpcMarshaling\";\r\nimport { RpcManagedStatus } from \"./rpc/core/RpcProtocol\";\r\nimport { BentleyStatus, IModelError, NoContentError } from \"./IModelError\";\r\nimport { RpcRequestEvent, RpcRequestStatus } from \"./rpc/core/RpcConstants\";\r\nimport { BeDuration } from \"@itwin/core-bentley\";\r\nimport { RpcNotFoundResponse } from \"./rpc/core/RpcControl\";\r\n\r\n/* eslint-disable deprecation/deprecation */\r\n\r\n/**\r\n * Specifies the required static properties of an RpcInterface class.\r\n * These properties are used to identify RPC requests and responses.\r\n * @beta\r\n */\r\nexport interface RpcInterfaceDefinition<T extends RpcInterface = RpcInterface> { prototype: T, interfaceName: string, interfaceVersion: string }\r\n\r\n/**\r\n * A class that implements the operations of an RPC interface.\r\n * @beta\r\n */\r\nexport type RpcInterfaceImplementation<T extends RpcInterface = RpcInterface> = new () => T;\r\n\r\n/** An RPC interface is a set of operations exposed by a service that a client can call, using configurable protocols,\r\n * in a platform-independent way. TheRpcInterface class is the base class for RPC interface definitions and implementations.\r\n * @public\r\n */\r\nexport abstract class RpcInterface {\r\n /** Determines whether the backend version of an RPC interface is compatible (according to semantic versioning) with the frontend version of the interface. */\r\n public static isVersionCompatible(backend: string, frontend: string): boolean {\r\n const difference = semver.diff(backend, frontend);\r\n if (semver.prerelease(backend) || semver.prerelease(frontend)) {\r\n return difference === null;\r\n } else if (semver.major(backend) === 0 || semver.major(frontend) === 0) {\r\n return difference === null || (difference === \"patch\" && semver.patch(frontend) < semver.patch(backend));\r\n } else {\r\n return difference === null || difference === \"patch\" || (difference === \"minor\" && semver.minor(frontend) < semver.minor(backend));\r\n }\r\n }\r\n\r\n /** The configuration for the RPC interface.\r\n * @internal\r\n */\r\n public readonly configuration: RpcConfiguration;\r\n\r\n /** @internal */\r\n public readonly routing: RpcRoutingToken;\r\n\r\n /** @internal */\r\n public constructor(routing: RpcRoutingToken = RpcRoutingToken.default) {\r\n this.routing = routing;\r\n this.configuration = RpcConfiguration.supply(this);\r\n }\r\n\r\n /** Obtains the implementation result for an RPC operation. */\r\n public async forward<T = any>(parameters: IArguments): Promise<T> {\r\n const parametersCompat = (arguments.length === 1 && typeof (parameters) === \"object\") ? parameters : arguments;\r\n const parametersArray = Array.isArray(parametersCompat) ? parametersCompat : Array.prototype.slice.call(parametersCompat);\r\n const operationName = parametersArray.pop();\r\n\r\n const session = IpcSession.active;\r\n if (session) {\r\n return intercept(session, this, operationName, parametersArray);\r\n } else {\r\n const request = new (this.configuration.protocol.requestType as any)(this, operationName, parametersArray) as RpcRequest;\r\n request.submit(); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n (this as any)[CURRENT_REQUEST] = request;\r\n return request.response;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public configurationSupplier: RpcConfigurationSupplier | undefined;\r\n}\r\n\r\nRpcInterface.prototype.configurationSupplier = undefined;\r\n\r\nclass InterceptedRequest extends RpcRequest {\r\n protected override async load(): Promise<RpcSerializedValue> { throw new Error(); }\r\n protected override async send(): Promise<number> { throw new Error(); }\r\n protected override setHeader(_name: string, _value: string): void { throw new Error(); }\r\n}\r\n\r\nasync function intercept(session: IpcSession, client: RpcInterface, operation: string, parameters: any[]) {\r\n const request = new InterceptedRequest(client, operation, []);\r\n (client as any)[CURRENT_REQUEST] = request;\r\n\r\n const context = await client.configuration.protocol.serialize(request);\r\n request.parameters = parameters;\r\n\r\n const info: InterceptedRpcRequest = {\r\n definition: {\r\n interfaceName: context.operation.interfaceDefinition,\r\n interfaceVersion: context.operation.interfaceVersion,\r\n },\r\n operation,\r\n parameters,\r\n context: {\r\n applicationId: context.applicationId,\r\n applicationVersion: context.applicationVersion,\r\n id: context.id,\r\n sessionId: context.sessionId,\r\n protocolVersion: (context.protocolVersion || 0).toString(),\r\n },\r\n };\r\n\r\n const dispatch = async () => {\r\n aggregateLoad.lastRequest = new Date().getTime();\r\n\r\n const response = await session.handleRpc(info);\r\n\r\n aggregateLoad.lastResponse = new Date().getTime();\r\n\r\n if (typeof (response) === \"object\" && response.hasOwnProperty(\"iTwinRpcCoreResponse\") && response.hasOwnProperty(\"managedStatus\")) {\r\n const status: RpcManagedStatus = response;\r\n\r\n if (status.managedStatus === \"pending\") {\r\n return handlePending(request, status, dispatch);\r\n } else if (status.managedStatus === \"notFound\") {\r\n return handleNotFound(request, status, dispatch);\r\n } else if (status.managedStatus === \"noContent\") {\r\n return handleNoContent();\r\n }\r\n } else {\r\n return response;\r\n }\r\n };\r\n\r\n return dispatch();\r\n}\r\n\r\nasync function handlePending(request: InterceptedRequest, status: RpcManagedStatus, dispatch: () => Promise<any>) {\r\n request._status = RpcRequestStatus.Pending;\r\n request._extendedStatus = (status.responseValue as { message: string }).message;\r\n RpcRequest.events.raiseEvent(RpcRequestEvent.PendingUpdateReceived, request);\r\n\r\n const delay = request.operation.policy.retryInterval(request.client.configuration);\r\n\r\n await BeDuration.wait(delay);\r\n return dispatch();\r\n}\r\n\r\nasync function handleNotFound(request: InterceptedRequest, status: RpcManagedStatus, dispatch: () => Promise<any>) {\r\n return new Promise((resolve, reject) => {\r\n let resubmitted = false;\r\n\r\n RpcRequest.notFoundHandlers.raiseEvent(request, status.responseValue as RpcNotFoundResponse, async () => {\r\n if (resubmitted) {\r\n throw new IModelError(BentleyStatus.ERROR, `Already resubmitted using this handler.`);\r\n }\r\n\r\n resubmitted = true;\r\n\r\n try {\r\n const response = await dispatch();\r\n resolve(response);\r\n } catch (err) {\r\n reject(err);\r\n }\r\n }, reject);\r\n });\r\n}\r\n\r\nasync function handleNoContent() {\r\n throw new NoContentError();\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"RpcInterface.js","sourceRoot":"","sources":["../../src/RpcInterface.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\nimport { RpcConfiguration, RpcConfigurationSupplier } from \"./rpc/core/RpcConfiguration\";\r\nimport { CURRENT_REQUEST } from \"./rpc/core/RpcRegistry\";\r\nimport { aggregateLoad, RpcRequest } from \"./rpc/core/RpcRequest\";\r\nimport { RpcRoutingToken } from \"./rpc/core/RpcRoutingToken\";\r\nimport { InterceptedRpcRequest, IpcSession } from \"./ipc/IpcSession\";\r\nimport { RpcSerializedValue } from \"./rpc/core/RpcMarshaling\";\r\nimport { RpcManagedStatus } from \"./rpc/core/RpcProtocol\";\r\nimport { BentleyStatus, IModelError, NoContentError } from \"./IModelError\";\r\nimport { RpcRequestEvent, RpcRequestStatus } from \"./rpc/core/RpcConstants\";\r\nimport { BeDuration } from \"@itwin/core-bentley\";\r\nimport { RpcNotFoundResponse } from \"./rpc/core/RpcControl\";\r\n\r\n/* eslint-disable deprecation/deprecation */\r\n\r\n/**\r\n * Specifies the required static properties of an RpcInterface class.\r\n * These properties are used to identify RPC requests and responses.\r\n * @beta\r\n */\r\nexport interface RpcInterfaceDefinition<T extends RpcInterface = RpcInterface> { prototype: T, interfaceName: string, interfaceVersion: string }\r\n\r\n/**\r\n * A class that implements the operations of an RPC interface.\r\n * @beta\r\n */\r\nexport type RpcInterfaceImplementation<T extends RpcInterface = RpcInterface> = new () => T;\r\n\r\ninterface SemverType {\r\n major: number;\r\n minor: number;\r\n patch: number;\r\n prerelease?: string;\r\n}\r\n\r\n/** An RPC interface is a set of operations exposed by a service that a client can call, using configurable protocols,\r\n * in a platform-independent way. TheRpcInterface class is the base class for RPC interface definitions and implementations.\r\n * @public\r\n */\r\nexport abstract class RpcInterface {\r\n\r\n private static findDiff(backend: SemverType, frontend: SemverType) {\r\n return backend.major !== frontend.major ? \"major\" : backend.minor !== frontend.minor ? \"minor\" : backend.patch !== frontend.patch ? \"patch\" : backend.prerelease !== frontend.prerelease ? \"prerelease\" : \"same\";\r\n }\r\n\r\n private static parseVer(version: string): SemverType {\r\n // Split the version string into major.minor.path and prerelease tag\r\n const split = version.split(/[:-]/);\r\n // Split the major.minor.path into seperate components\r\n const prefix = split[0].split(\".\");\r\n if (split.length === 1) {\r\n return { major: Number(prefix[0]), minor: Number(prefix[1]), patch: Number(prefix[2]) };\r\n } else {\r\n return { major: Number(prefix[0]), minor: Number(prefix[1]), patch: Number(prefix[2]), prerelease: split[1] };\r\n }\r\n }\r\n\r\n /** Determines whether the backend version of an RPC interface is compatible (according to semantic versioning) with the frontend version of the interface. */\r\n public static isVersionCompatible(backend: string, frontend: string): boolean {\r\n const backendSemver = this.parseVer(backend);\r\n const frontendSemver = this.parseVer(frontend);\r\n const difference = this.findDiff(backendSemver, frontendSemver);\r\n\r\n // If the major versions are different, the versions are not compatible\r\n // In the case of prerelease tags, they are compatible if the whole version string matches, otherwise it fails\r\n if ((backendSemver.prerelease !== undefined || frontendSemver.prerelease !== undefined) || difference === \"major\") {\r\n return difference === \"same\";\r\n } else if (backendSemver.major === 0 || frontendSemver.major === 0) {\r\n // If the major and minor versions match and major versions are 0, compatible as long as backend patch version is greater\r\n return difference === \"same\" || (difference === \"patch\" && frontendSemver.patch < backendSemver.patch);\r\n } else {\r\n // If the strings match exactly, major and minor match but patch differs, versions are compatible\r\n // If minor versions differ, compatible as long as backend patch versionn is greater\r\n return difference === \"same\" || difference === \"patch\" || (difference === \"minor\" && frontendSemver.minor < backendSemver.minor);\r\n }\r\n }\r\n\r\n /** The configuration for the RPC interface.\r\n * @internal\r\n */\r\n public readonly configuration: RpcConfiguration;\r\n\r\n /** @internal */\r\n public readonly routing: RpcRoutingToken;\r\n\r\n /** @internal */\r\n public constructor(routing: RpcRoutingToken = RpcRoutingToken.default) {\r\n this.routing = routing;\r\n this.configuration = RpcConfiguration.supply(this);\r\n }\r\n\r\n /** Obtains the implementation result for an RPC operation. */\r\n public async forward<T = any>(parameters: IArguments): Promise<T> {\r\n const parametersCompat = (arguments.length === 1 && typeof (parameters) === \"object\") ? parameters : arguments;\r\n const parametersArray = Array.isArray(parametersCompat) ? parametersCompat : Array.prototype.slice.call(parametersCompat);\r\n const operationName = parametersArray.pop();\r\n\r\n const session = IpcSession.active;\r\n if (session) {\r\n return intercept(session, this, operationName, parametersArray);\r\n } else {\r\n const request = new (this.configuration.protocol.requestType as any)(this, operationName, parametersArray) as RpcRequest;\r\n request.submit(); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n (this as any)[CURRENT_REQUEST] = request;\r\n return request.response;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public configurationSupplier: RpcConfigurationSupplier | undefined;\r\n}\r\n\r\nRpcInterface.prototype.configurationSupplier = undefined;\r\n\r\nclass InterceptedRequest extends RpcRequest {\r\n protected override async load(): Promise<RpcSerializedValue> { throw new Error(); }\r\n protected override async send(): Promise<number> { throw new Error(); }\r\n protected override setHeader(_name: string, _value: string): void { throw new Error(); }\r\n}\r\n\r\nasync function intercept(session: IpcSession, client: RpcInterface, operation: string, parameters: any[]) {\r\n const request = new InterceptedRequest(client, operation, []);\r\n (client as any)[CURRENT_REQUEST] = request;\r\n\r\n const context = await client.configuration.protocol.serialize(request);\r\n request.parameters = parameters;\r\n\r\n const info: InterceptedRpcRequest = {\r\n definition: {\r\n interfaceName: context.operation.interfaceDefinition,\r\n interfaceVersion: context.operation.interfaceVersion,\r\n },\r\n operation,\r\n parameters,\r\n context: {\r\n applicationId: context.applicationId,\r\n applicationVersion: context.applicationVersion,\r\n id: context.id,\r\n sessionId: context.sessionId,\r\n protocolVersion: (context.protocolVersion || 0).toString(),\r\n },\r\n };\r\n\r\n const dispatch = async () => {\r\n aggregateLoad.lastRequest = new Date().getTime();\r\n\r\n const response = await session.handleRpc(info);\r\n\r\n aggregateLoad.lastResponse = new Date().getTime();\r\n\r\n if (typeof (response) === \"object\" && response.hasOwnProperty(\"iTwinRpcCoreResponse\") && response.hasOwnProperty(\"managedStatus\")) {\r\n const status: RpcManagedStatus = response;\r\n\r\n if (status.managedStatus === \"pending\") {\r\n return handlePending(request, status, dispatch);\r\n } else if (status.managedStatus === \"notFound\") {\r\n return handleNotFound(request, status, dispatch);\r\n } else if (status.managedStatus === \"noContent\") {\r\n return handleNoContent();\r\n }\r\n } else {\r\n return response;\r\n }\r\n };\r\n\r\n return dispatch();\r\n}\r\n\r\nasync function handlePending(request: InterceptedRequest, status: RpcManagedStatus, dispatch: () => Promise<any>) {\r\n request._status = RpcRequestStatus.Pending;\r\n request._extendedStatus = (status.responseValue as { message: string }).message;\r\n RpcRequest.events.raiseEvent(RpcRequestEvent.PendingUpdateReceived, request);\r\n\r\n const delay = request.operation.policy.retryInterval(request.client.configuration);\r\n\r\n await BeDuration.wait(delay);\r\n return dispatch();\r\n}\r\n\r\nasync function handleNotFound(request: InterceptedRequest, status: RpcManagedStatus, dispatch: () => Promise<any>) {\r\n return new Promise((resolve, reject) => {\r\n let resubmitted = false;\r\n\r\n RpcRequest.notFoundHandlers.raiseEvent(request, status.responseValue as RpcNotFoundResponse, async () => {\r\n if (resubmitted) {\r\n throw new IModelError(BentleyStatus.ERROR, `Already resubmitted using this handler.`);\r\n }\r\n\r\n resubmitted = true;\r\n\r\n try {\r\n const response = await dispatch();\r\n resolve(response);\r\n } catch (err) {\r\n reject(err);\r\n }\r\n }, reject);\r\n });\r\n}\r\n\r\nasync function handleNoContent() {\r\n throw new NoContentError();\r\n}\r\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@itwin/core-common",
|
|
3
|
-
"version": "4.0.0-dev.
|
|
3
|
+
"version": "4.0.0-dev.98",
|
|
4
4
|
"description": "iTwin.js components common to frontend and backend",
|
|
5
5
|
"main": "lib/cjs/core-common.js",
|
|
6
6
|
"module": "lib/esm/core-common.js",
|
|
@@ -25,12 +25,11 @@
|
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"@itwin/object-storage-core": "^1.5.0",
|
|
27
27
|
"flatbuffers": "~1.12.0",
|
|
28
|
-
"semver": "^7.3.5",
|
|
29
28
|
"js-base64": "^3.6.1"
|
|
30
29
|
},
|
|
31
30
|
"peerDependencies": {
|
|
32
|
-
"@itwin/core-bentley": "^4.0.0-dev.
|
|
33
|
-
"@itwin/core-geometry": "^4.0.0-dev.
|
|
31
|
+
"@itwin/core-bentley": "^4.0.0-dev.98",
|
|
32
|
+
"@itwin/core-geometry": "^4.0.0-dev.98"
|
|
34
33
|
},
|
|
35
34
|
"devDependencies": {
|
|
36
35
|
"@itwin/eslint-plugin": "^4.0.0-dev.33",
|
|
@@ -38,16 +37,15 @@
|
|
|
38
37
|
"@types/flatbuffers": "~1.10.0",
|
|
39
38
|
"@types/mocha": "^8.2.2",
|
|
40
39
|
"@types/node": "^18.11.5",
|
|
41
|
-
"@types/semver": "7.3.10",
|
|
42
40
|
"chai": "^4.1.2",
|
|
43
41
|
"eslint": "^8.36.0",
|
|
44
42
|
"mocha": "^10.0.0",
|
|
45
43
|
"nyc": "^15.1.0",
|
|
46
44
|
"rimraf": "^3.0.2",
|
|
47
45
|
"typescript": "~5.0.2",
|
|
48
|
-
"@itwin/
|
|
49
|
-
"@itwin/
|
|
50
|
-
"@itwin/core-geometry": "4.0.0-dev.
|
|
46
|
+
"@itwin/build-tools": "4.0.0-dev.98",
|
|
47
|
+
"@itwin/core-bentley": "4.0.0-dev.98",
|
|
48
|
+
"@itwin/core-geometry": "4.0.0-dev.98"
|
|
51
49
|
},
|
|
52
50
|
"nyc": {
|
|
53
51
|
"extends": "./node_modules/@itwin/build-tools/.nycrc",
|