@itwin/core-common 3.0.0-dev.173 → 3.0.0-dev.177

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/LICENSE.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # MIT License
2
2
 
3
- Copyright © 2017-2021 Bentley Systems, Incorporated. All rights reserved.
3
+ Copyright © 2017-2022 Bentley Systems, Incorporated. All rights reserved.
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
6
6
 
@@ -28,6 +28,23 @@ export interface TextureLoadProps {
28
28
  /** Maximum texture size supported by the client. If specified, the texture will be downsampled so both of its dimensions adhere to this size. */
29
29
  maxTextureSize?: number;
30
30
  }
31
+ /** Describes the type of transparency in the pixels of a [TextureImage]($frontend).
32
+ * Each pixel can be classified as either opaque or translucent.
33
+ * The transparency of the image as a whole is based on the combination of pixel transparencies.
34
+ * If this information is known, it should be supplied when creating a texture for more efficient rendering.
35
+ * @see [TextureImage.transparency]($frontend).
36
+ * @public
37
+ */
38
+ export declare enum TextureTransparency {
39
+ /** The image contains only opaque pixels. It should not blend with other objects in the scene. */
40
+ Opaque = 0,
41
+ /** The image contains only translucent pixels. It should blend with other objects in the scene. */
42
+ Translucent = 1,
43
+ /** The image contains both opaque and translucent pixels. The translucent pixels should blend with other objects in the scene, while
44
+ * the opaque pixels should not. Rendering this type of transparency is somewhat more expensive.
45
+ */
46
+ Mixed = 2
47
+ }
31
48
  /** Information about [Texture]($backend) data returned by [[IModelReadRpcInterface.queryTextureData]].
32
49
  * @public
33
50
  */
@@ -36,9 +53,11 @@ export interface TextureData {
36
53
  width: number;
37
54
  /** The height of the image, possibly reduced from the original height based on [[TextureLoadProps.maxTextureSize]]. */
38
55
  height: number;
39
- /** The format of the returned data, Jpeg or Png. */
56
+ /** The format of the image (Jpeg or Png). */
40
57
  format: ImageSourceFormat;
41
- /** returned byte data */
58
+ /** The encoded image bytes. */
42
59
  bytes: Uint8Array;
60
+ /** Information about the transparency of the texture image. Default: [[TextureTransparency.Mixed]]. */
61
+ transparency?: TextureTransparency;
43
62
  }
44
63
  //# sourceMappingURL=TextureProps.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TextureProps.d.ts","sourceRoot":"","sources":["../../src/TextureProps.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,YAAa,SAAQ,sBAAsB;IAC1D,gCAAgC;IAChC,MAAM,EAAE,iBAAiB,CAAC;IAC1B;;;OAGG;IACH,IAAI,EAAE,mBAAmB,CAAC;IAC1B,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,kDAAkD;IAClD,IAAI,EAAE,UAAU,CAAC;IACjB,iJAAiJ;IACjJ,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,qHAAqH;IACrH,KAAK,EAAE,MAAM,CAAC;IACd,uHAAuH;IACvH,MAAM,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,MAAM,EAAE,iBAAiB,CAAC;IAC1B,yBAAyB;IACzB,KAAK,EAAE,UAAU,CAAC;CACnB"}
1
+ {"version":3,"file":"TextureProps.d.ts","sourceRoot":"","sources":["../../src/TextureProps.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,YAAa,SAAQ,sBAAsB;IAC1D,gCAAgC;IAChC,MAAM,EAAE,iBAAiB,CAAC;IAC1B;;;OAGG;IACH,IAAI,EAAE,mBAAmB,CAAC;IAC1B,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,kDAAkD;IAClD,IAAI,EAAE,UAAU,CAAC;IACjB,iJAAiJ;IACjJ,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;GAMG;AACH,oBAAY,mBAAmB;IAC7B,kGAAkG;IAClG,MAAM,IAAA;IACN,mGAAmG;IACnG,WAAW,IAAA;IACX;;OAEG;IACH,KAAK,IAAA;CACN;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,qHAAqH;IACrH,KAAK,EAAE,MAAM,CAAC;IACd,uHAAuH;IACvH,MAAM,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,MAAM,EAAE,iBAAiB,CAAC;IAC1B,+BAA+B;IAC/B,KAAK,EAAE,UAAU,CAAC;IAClB,uGAAuG;IACvG,YAAY,CAAC,EAAE,mBAAmB,CAAC;CACpC"}
@@ -7,4 +7,23 @@
7
7
  * @module Entities
8
8
  */
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.TextureTransparency = void 0;
11
+ /** Describes the type of transparency in the pixels of a [TextureImage]($frontend).
12
+ * Each pixel can be classified as either opaque or translucent.
13
+ * The transparency of the image as a whole is based on the combination of pixel transparencies.
14
+ * If this information is known, it should be supplied when creating a texture for more efficient rendering.
15
+ * @see [TextureImage.transparency]($frontend).
16
+ * @public
17
+ */
18
+ var TextureTransparency;
19
+ (function (TextureTransparency) {
20
+ /** The image contains only opaque pixels. It should not blend with other objects in the scene. */
21
+ TextureTransparency[TextureTransparency["Opaque"] = 0] = "Opaque";
22
+ /** The image contains only translucent pixels. It should blend with other objects in the scene. */
23
+ TextureTransparency[TextureTransparency["Translucent"] = 1] = "Translucent";
24
+ /** The image contains both opaque and translucent pixels. The translucent pixels should blend with other objects in the scene, while
25
+ * the opaque pixels should not. Rendering this type of transparency is somewhat more expensive.
26
+ */
27
+ TextureTransparency[TextureTransparency["Mixed"] = 2] = "Mixed";
28
+ })(TextureTransparency = exports.TextureTransparency || (exports.TextureTransparency = {}));
10
29
  //# sourceMappingURL=TextureProps.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TextureProps.js","sourceRoot":"","sources":["../../src/TextureProps.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG","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 Entities\r\n */\r\n\r\nimport { Id64String } from \"@itwin/core-bentley\";\r\nimport { DefinitionElementProps } from \"./ElementProps\";\r\nimport { ImageSourceFormat } from \"./Image\";\r\nimport { Base64EncodedString } from \"./Base64EncodedString\";\r\n\r\n/** Properties that define a [Texture]($backend) element.\r\n * @public\r\n */\r\nexport interface TextureProps extends DefinitionElementProps {\r\n /** Format of the image data. */\r\n format: ImageSourceFormat;\r\n /** The image data stored in a Base64-encoded string according to the specified format.\r\n * @see [[Base64EncodedString.fromUint8Array]] to produce a well-formed base-64-encoded string.\r\n * @see [[Base64EncodedString.toUint8Array]] to decode the bytes.\r\n */\r\n data: Base64EncodedString;\r\n /** An optional description of the texture. */\r\n description?: string;\r\n}\r\n\r\n/** Properties that specify what texture should be loaded and how it should be loaded.\r\n * @public\r\n */\r\nexport interface TextureLoadProps {\r\n /** A valid Id64 string identifying the texture */\r\n name: Id64String;\r\n /** Maximum texture size supported by the client. If specified, the texture will be downsampled so both of its dimensions adhere to this size. */\r\n maxTextureSize?: number;\r\n}\r\n\r\n/** Information about [Texture]($backend) data returned by [[IModelReadRpcInterface.queryTextureData]].\r\n * @public\r\n */\r\nexport interface TextureData {\r\n /** The width of the image, possibly reduced from the original width based on [[TextureLoadProps.maxTextureSize]]. */\r\n width: number;\r\n /** The height of the image, possibly reduced from the original height based on [[TextureLoadProps.maxTextureSize]]. */\r\n height: number;\r\n /** The format of the returned data, Jpeg or Png. */\r\n format: ImageSourceFormat;\r\n /** returned byte data */\r\n bytes: Uint8Array;\r\n}\r\n"]}
1
+ {"version":3,"file":"TextureProps.js","sourceRoot":"","sources":["../../src/TextureProps.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAgCH;;;;;;GAMG;AACH,IAAY,mBASX;AATD,WAAY,mBAAmB;IAC7B,kGAAkG;IAClG,iEAAM,CAAA;IACN,mGAAmG;IACnG,2EAAW,CAAA;IACX;;OAEG;IACH,+DAAK,CAAA;AACP,CAAC,EATW,mBAAmB,GAAnB,2BAAmB,KAAnB,2BAAmB,QAS9B","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 Entities\r\n */\r\n\r\nimport { Id64String } from \"@itwin/core-bentley\";\r\nimport { DefinitionElementProps } from \"./ElementProps\";\r\nimport { ImageSourceFormat } from \"./Image\";\r\nimport { Base64EncodedString } from \"./Base64EncodedString\";\r\n\r\n/** Properties that define a [Texture]($backend) element.\r\n * @public\r\n */\r\nexport interface TextureProps extends DefinitionElementProps {\r\n /** Format of the image data. */\r\n format: ImageSourceFormat;\r\n /** The image data stored in a Base64-encoded string according to the specified format.\r\n * @see [[Base64EncodedString.fromUint8Array]] to produce a well-formed base-64-encoded string.\r\n * @see [[Base64EncodedString.toUint8Array]] to decode the bytes.\r\n */\r\n data: Base64EncodedString;\r\n /** An optional description of the texture. */\r\n description?: string;\r\n}\r\n\r\n/** Properties that specify what texture should be loaded and how it should be loaded.\r\n * @public\r\n */\r\nexport interface TextureLoadProps {\r\n /** A valid Id64 string identifying the texture */\r\n name: Id64String;\r\n /** Maximum texture size supported by the client. If specified, the texture will be downsampled so both of its dimensions adhere to this size. */\r\n maxTextureSize?: number;\r\n}\r\n\r\n/** Describes the type of transparency in the pixels of a [TextureImage]($frontend).\r\n * Each pixel can be classified as either opaque or translucent.\r\n * The transparency of the image as a whole is based on the combination of pixel transparencies.\r\n * If this information is known, it should be supplied when creating a texture for more efficient rendering.\r\n * @see [TextureImage.transparency]($frontend).\r\n * @public\r\n */\r\nexport enum TextureTransparency {\r\n /** The image contains only opaque pixels. It should not blend with other objects in the scene. */\r\n Opaque,\r\n /** The image contains only translucent pixels. It should blend with other objects in the scene. */\r\n Translucent,\r\n /** The image contains both opaque and translucent pixels. The translucent pixels should blend with other objects in the scene, while\r\n * the opaque pixels should not. Rendering this type of transparency is somewhat more expensive.\r\n */\r\n Mixed,\r\n}\r\n\r\n/** Information about [Texture]($backend) data returned by [[IModelReadRpcInterface.queryTextureData]].\r\n * @public\r\n */\r\nexport interface TextureData {\r\n /** The width of the image, possibly reduced from the original width based on [[TextureLoadProps.maxTextureSize]]. */\r\n width: number;\r\n /** The height of the image, possibly reduced from the original height based on [[TextureLoadProps.maxTextureSize]]. */\r\n height: number;\r\n /** The format of the image (Jpeg or Png). */\r\n format: ImageSourceFormat;\r\n /** The encoded image bytes. */\r\n bytes: Uint8Array;\r\n /** Information about the transparency of the texture image. Default: [[TextureTransparency.Mixed]]. */\r\n transparency?: TextureTransparency;\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"IpcWebSocketTransport.d.ts","sourceRoot":"","sources":["../../../src/ipc/IpcWebSocketTransport.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAIrD,gBAAgB;AAChB,8BAAsB,qBAAqB;IACzC,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,YAAY,CAAK;aAET,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;IAExD,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG;cAIV,cAAc,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA6BvE,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,mBAAmB,GAAG,GAAG,EAAE;CAOtD"}
1
+ {"version":3,"file":"IpcWebSocketTransport.d.ts","sourceRoot":"","sources":["../../../src/ipc/IpcWebSocketTransport.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAIrD,gBAAgB;AAChB,8BAAsB,qBAAqB;IACzC,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,YAAY,CAAK;aAET,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;IAExD,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG;cAIV,cAAc,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAkCvE,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,mBAAmB,GAAG,GAAG,EAAE;CAOtD"}
@@ -24,10 +24,13 @@ class IpcWebSocketTransport {
24
24
  this._received.push(data);
25
25
  --this._outstanding;
26
26
  if (this._outstanding === 0) {
27
- await Promise.all(this._received.map(async (v, i, a) => a[i] = await this.unwrap(v)));
28
- parts = this._received;
29
- const message = JSON.parse(this._partial, reviver);
27
+ const partial = this._partial;
28
+ const received = this._received;
30
29
  this._partial = undefined;
30
+ this._received = [];
31
+ await Promise.all(received.map(async (v, i, a) => a[i] = await this.unwrap(v)));
32
+ parts = received;
33
+ const message = JSON.parse(partial, reviver);
31
34
  parts.length = 0;
32
35
  return InSentOrder.deliver(message);
33
36
  }
@@ -127,6 +130,9 @@ class InSentOrder {
127
130
  this._queue.shift();
128
131
  next.release();
129
132
  }
133
+ else {
134
+ break;
135
+ }
130
136
  }
131
137
  return entry.message;
132
138
  }
@@ -1 +1 @@
1
- {"version":3,"file":"IpcWebSocketTransport.js","sourceRoot":"","sources":["../../../src/ipc/IpcWebSocketTransport.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAEH,iDAAqD;AAErD,IAAI,KAAK,GAAU,EAAE,CAAC;AAEtB,gBAAgB;AAChB,MAAsB,qBAAqB;IAA3C;QAEU,cAAS,GAAU,EAAE,CAAC;QACtB,iBAAY,GAAG,CAAC,CAAC;IA4C3B,CAAC;IAxCW,MAAM,CAAC,IAAS;QACxB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,WAAW,IAAI,IAAI,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7F,CAAC;IAES,KAAK,CAAC,cAAc,CAAC,IAAS;QACtC,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1B,EAAE,IAAI,CAAC,YAAY,CAAC;YAEpB,IAAI,IAAI,CAAC,YAAY,KAAK,CAAC,EAAE;gBAC3B,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtF,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC;gBACvB,MAAM,OAAO,GAAwB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACxE,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;gBAC1B,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;gBACjB,OAAO,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;aACrC;iBAAM;gBACL,OAAO,kCAAmB,CAAC,QAAQ,EAAE,CAAC;aACvC;SACF;aAAM;YACL,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAEjD,IAAI,SAAS,EAAE;gBACb,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC;gBAC3B,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;gBAC9B,OAAO,kCAAmB,CAAC,QAAQ,EAAE,CAAC;aACvC;iBAAM;gBACL,MAAM,OAAO,GAAwB,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBACrE,OAAO,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;aACrC;SACF;IACH,CAAC;IAES,SAAS,CAAC,IAAyB;QAC3C,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QACjB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC;QAClE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QACjB,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AA/CD,sDA+CC;AAGD,MAAM,KAAK,GAAG,CAAC,UAAU,EAAE,SAAS,EAAE,iBAAiB,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;AACjJ,SAAS,QAAQ,CAAC,KAAU,IAAI,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;AACvG,SAAS,MAAM,CAAC,KAAa,IAAI,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAE5D,SAAS,QAAQ,CAAY,IAAY,EAAE,KAAU;IACnD,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,QAAQ,EAAE;QACZ,OAAO,QAAQ,CAAC;KACjB;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,OAAO,CAAC,IAAY,EAAE,KAAU;IACvC,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;QAC1G,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;KAC5B;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,KAAU;IAC/B,IAAI,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;QACvD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC7B,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;KACvC;SAAM;QACL,OAAO,SAAS,CAAC;KAClB;AACH,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAChC,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,WAAW;IAClB,IAAI,OAAO,GAAwC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC7D,IAAI,MAAM,GAA2B,GAAG,EAAE,GAAG,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,OAAO,GAAG,GAAG,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AACtC,CAAC;AAED;sFACsF;AACtF,MAAM,WAAW;IAmCf,YAAoB,OAA4B;QALzC,YAAO,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC;QAEpB,cAAS,GAAG,KAAK,CAAC;QAIvB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QAEjC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,WAAW,EAAuB,CAAC;QAChE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QAEvB,IAAI,CAAC,OAAO,GAAG,GAAG,EAAE;YAClB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,kCAAmB,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACzE,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC,CAAC;IACJ,CAAC;IA1CO,MAAM,KAAK,KAAK,KAAK,OAAO,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IAE9C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAA4B;QACtD,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QAEpD,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;YAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC;YAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,KAAK,CAAC;YAE3C,IAAI,SAAS,EAAE;gBACb,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;aACvB;iBAAM,IAAI,KAAK,EAAE;gBAChB,EAAE,IAAI,CAAC,KAAK,CAAC;aACd;YAED,IAAI,SAAS,IAAI,KAAK,EAAE;gBACtB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBACpB,IAAI,CAAC,OAAO,EAAE,CAAC;aAChB;SACF;QAED,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;;AA3Bc,kBAAM,GAAkB,EAAE,CAAC;AAC3B,iBAAK,GAAG,CAAC,CAAC,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module IpcSocket\r\n */\r\n\r\nimport { IpcWebSocketMessage } from \"./IpcWebSocket\";\r\n\r\nlet parts: any[] = [];\r\n\r\n/** @internal */\r\nexport abstract class IpcWebSocketTransport {\r\n private _partial?: string;\r\n private _received: any[] = [];\r\n private _outstanding = 0;\r\n\r\n public abstract send(message: IpcWebSocketMessage): void;\r\n\r\n protected unwrap(data: any) {\r\n return (typeof (Blob) !== \"undefined\" && data instanceof Blob) ? data.arrayBuffer() : data;\r\n }\r\n\r\n protected async notifyIncoming(data: any): Promise<IpcWebSocketMessage> {\r\n if (this._partial) {\r\n this._received.push(data);\r\n --this._outstanding;\r\n\r\n if (this._outstanding === 0) {\r\n await Promise.all(this._received.map(async (v, i, a) => a[i] = await this.unwrap(v)));\r\n parts = this._received;\r\n const message: IpcWebSocketMessage = JSON.parse(this._partial, reviver);\r\n this._partial = undefined;\r\n parts.length = 0;\r\n return InSentOrder.deliver(message);\r\n } else {\r\n return IpcWebSocketMessage.internal();\r\n }\r\n } else {\r\n const [serialized, followers] = JSON.parse(data);\r\n\r\n if (followers) {\r\n this._partial = serialized;\r\n this._outstanding = followers;\r\n return IpcWebSocketMessage.internal();\r\n } else {\r\n const message: IpcWebSocketMessage = JSON.parse(serialized, reviver);\r\n return InSentOrder.deliver(message);\r\n }\r\n }\r\n }\r\n\r\n protected serialize(data: IpcWebSocketMessage): any[] {\r\n parts.length = 0;\r\n const objects = JSON.stringify(data, replacer);\r\n const value = [JSON.stringify([objects, parts.length]), ...parts];\r\n parts.length = 0;\r\n return value;\r\n }\r\n}\r\n\r\ninterface Marker { ipc: \"binary\", type: number, index: number }\r\nconst types = [Uint8Array, Int8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array, Float32Array, Float64Array, DataView];\r\nfunction identify(value: any) { return Buffer.isBuffer(value) ? 0 : types.indexOf(value.constructor); }\r\nfunction lookup(value: Marker) { return types[value.type]; }\r\n\r\nfunction replacer(this: any, _key: string, value: any) {\r\n const asBinary = replaceBinary(value);\r\n if (asBinary) {\r\n return asBinary;\r\n }\r\n\r\n return value;\r\n}\r\n\r\nfunction reviver(_key: string, value: any) {\r\n if (typeof (value) === \"object\" && value !== null && value.hasOwnProperty(\"ipc\") && value.ipc === \"binary\") {\r\n return reviveBinary(value);\r\n }\r\n\r\n return value;\r\n}\r\n\r\nfunction replaceBinary(value: any): Marker | undefined {\r\n if (ArrayBuffer.isView(value) || Buffer.isBuffer(value)) {\r\n const index = parts.push(value) - 1;\r\n const type = identify(value);\r\n return { ipc: \"binary\", type, index };\r\n } else {\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction reviveBinary(value: Marker): ArrayBufferView {\r\n const constructor = lookup(value);\r\n const part = parts[value.index];\r\n return new constructor(part);\r\n}\r\n\r\nfunction makePromise<T>() {\r\n let resolve: (value: T | PromiseLike<T>) => void = () => { };\r\n let reject: (reason?: any) => void = () => { };\r\n const promise = new Promise<T>((res, rej) => { resolve = res; reject = rej; });\r\n return { promise, resolve, reject };\r\n}\r\n\r\n/* Reconstructing the sequence in which messages were sent is necessary since\r\n the binary data for a message has to be awaited in IpcWebSocketTransport.unwrap. */\r\nclass InSentOrder {\r\n private static _queue: InSentOrder[] = [];\r\n private static _last = -1;\r\n private static get _next() { return this._last + 1; }\r\n\r\n public static async deliver(message: IpcWebSocketMessage): Promise<IpcWebSocketMessage> {\r\n const entry = new InSentOrder(message);\r\n this._queue.push(entry);\r\n this._queue.sort((a, b) => a.sequence - b.sequence);\r\n\r\n while (this._queue.length !== 0) {\r\n const next = this._queue[0];\r\n const duplicate = next.sequence <= this._last;\r\n const match = next.sequence === this._next;\r\n\r\n if (duplicate) {\r\n next.duplicate = true;\r\n } else if (match) {\r\n ++this._last;\r\n }\r\n\r\n if (duplicate || match) {\r\n this._queue.shift();\r\n next.release();\r\n }\r\n }\r\n\r\n return entry.message;\r\n }\r\n\r\n public release = () => { };\r\n public sequence: number;\r\n public duplicate = false;\r\n public message: Promise<IpcWebSocketMessage>;\r\n\r\n private constructor(message: IpcWebSocketMessage) {\r\n this.sequence = message.sequence;\r\n\r\n const { promise, resolve } = makePromise<IpcWebSocketMessage>();\r\n this.message = promise;\r\n\r\n this.release = () => {\r\n const value = this.duplicate ? IpcWebSocketMessage.duplicate() : message;\r\n resolve(value);\r\n };\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"IpcWebSocketTransport.js","sourceRoot":"","sources":["../../../src/ipc/IpcWebSocketTransport.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 IpcSocket\r\n */\r\n\r\nimport { IpcWebSocketMessage } from \"./IpcWebSocket\";\r\n\r\nlet parts: any[] = [];\r\n\r\n/** @internal */\r\nexport abstract class IpcWebSocketTransport {\r\n private _partial?: string;\r\n private _received: any[] = [];\r\n private _outstanding = 0;\r\n\r\n public abstract send(message: IpcWebSocketMessage): void;\r\n\r\n protected unwrap(data: any) {\r\n return (typeof (Blob) !== \"undefined\" && data instanceof Blob) ? data.arrayBuffer() : data;\r\n }\r\n\r\n protected async notifyIncoming(data: any): Promise<IpcWebSocketMessage> {\r\n if (this._partial) {\r\n this._received.push(data);\r\n --this._outstanding;\r\n\r\n if (this._outstanding === 0) {\r\n const partial = this._partial;\r\n const received = this._received;\r\n this._partial = undefined;\r\n this._received = [];\r\n await Promise.all(received.map(async (v, i, a) => a[i] = await this.unwrap(v)));\r\n\r\n parts = received;\r\n const message: IpcWebSocketMessage = JSON.parse(partial, reviver);\r\n parts.length = 0;\r\n\r\n return InSentOrder.deliver(message);\r\n } else {\r\n return IpcWebSocketMessage.internal();\r\n }\r\n } else {\r\n const [serialized, followers] = JSON.parse(data);\r\n\r\n if (followers) {\r\n this._partial = serialized;\r\n this._outstanding = followers;\r\n return IpcWebSocketMessage.internal();\r\n } else {\r\n const message: IpcWebSocketMessage = JSON.parse(serialized, reviver);\r\n return InSentOrder.deliver(message);\r\n }\r\n }\r\n }\r\n\r\n protected serialize(data: IpcWebSocketMessage): any[] {\r\n parts.length = 0;\r\n const objects = JSON.stringify(data, replacer);\r\n const value = [JSON.stringify([objects, parts.length]), ...parts];\r\n parts.length = 0;\r\n return value;\r\n }\r\n}\r\n\r\ninterface Marker { ipc: \"binary\", type: number, index: number }\r\nconst types = [Uint8Array, Int8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array, Float32Array, Float64Array, DataView];\r\nfunction identify(value: any) { return Buffer.isBuffer(value) ? 0 : types.indexOf(value.constructor); }\r\nfunction lookup(value: Marker) { return types[value.type]; }\r\n\r\nfunction replacer(this: any, _key: string, value: any) {\r\n const asBinary = replaceBinary(value);\r\n if (asBinary) {\r\n return asBinary;\r\n }\r\n\r\n return value;\r\n}\r\n\r\nfunction reviver(_key: string, value: any) {\r\n if (typeof (value) === \"object\" && value !== null && value.hasOwnProperty(\"ipc\") && value.ipc === \"binary\") {\r\n return reviveBinary(value);\r\n }\r\n\r\n return value;\r\n}\r\n\r\nfunction replaceBinary(value: any): Marker | undefined {\r\n if (ArrayBuffer.isView(value) || Buffer.isBuffer(value)) {\r\n const index = parts.push(value) - 1;\r\n const type = identify(value);\r\n return { ipc: \"binary\", type, index };\r\n } else {\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction reviveBinary(value: Marker): ArrayBufferView {\r\n const constructor = lookup(value);\r\n const part = parts[value.index];\r\n return new constructor(part);\r\n}\r\n\r\nfunction makePromise<T>() {\r\n let resolve: (value: T | PromiseLike<T>) => void = () => { };\r\n let reject: (reason?: any) => void = () => { };\r\n const promise = new Promise<T>((res, rej) => { resolve = res; reject = rej; });\r\n return { promise, resolve, reject };\r\n}\r\n\r\n/* Reconstructing the sequence in which messages were sent is necessary since\r\n the binary data for a message has to be awaited in IpcWebSocketTransport.unwrap. */\r\nclass InSentOrder {\r\n private static _queue: InSentOrder[] = [];\r\n private static _last = -1;\r\n private static get _next() { return this._last + 1; }\r\n\r\n public static async deliver(message: IpcWebSocketMessage): Promise<IpcWebSocketMessage> {\r\n const entry = new InSentOrder(message);\r\n this._queue.push(entry);\r\n this._queue.sort((a, b) => a.sequence - b.sequence);\r\n\r\n while (this._queue.length !== 0) {\r\n const next = this._queue[0];\r\n const duplicate = next.sequence <= this._last;\r\n const match = next.sequence === this._next;\r\n\r\n if (duplicate) {\r\n next.duplicate = true;\r\n } else if (match) {\r\n ++this._last;\r\n }\r\n\r\n if (duplicate || match) {\r\n this._queue.shift();\r\n next.release();\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n return entry.message;\r\n }\r\n\r\n public release = () => { };\r\n public sequence: number;\r\n public duplicate = false;\r\n public message: Promise<IpcWebSocketMessage>;\r\n\r\n private constructor(message: IpcWebSocketMessage) {\r\n this.sequence = message.sequence;\r\n\r\n const { promise, resolve } = makePromise<IpcWebSocketMessage>();\r\n this.message = promise;\r\n\r\n this.release = () => {\r\n const value = this.duplicate ? IpcWebSocketMessage.duplicate() : message;\r\n resolve(value);\r\n };\r\n }\r\n}\r\n"]}
@@ -28,6 +28,23 @@ export interface TextureLoadProps {
28
28
  /** Maximum texture size supported by the client. If specified, the texture will be downsampled so both of its dimensions adhere to this size. */
29
29
  maxTextureSize?: number;
30
30
  }
31
+ /** Describes the type of transparency in the pixels of a [TextureImage]($frontend).
32
+ * Each pixel can be classified as either opaque or translucent.
33
+ * The transparency of the image as a whole is based on the combination of pixel transparencies.
34
+ * If this information is known, it should be supplied when creating a texture for more efficient rendering.
35
+ * @see [TextureImage.transparency]($frontend).
36
+ * @public
37
+ */
38
+ export declare enum TextureTransparency {
39
+ /** The image contains only opaque pixels. It should not blend with other objects in the scene. */
40
+ Opaque = 0,
41
+ /** The image contains only translucent pixels. It should blend with other objects in the scene. */
42
+ Translucent = 1,
43
+ /** The image contains both opaque and translucent pixels. The translucent pixels should blend with other objects in the scene, while
44
+ * the opaque pixels should not. Rendering this type of transparency is somewhat more expensive.
45
+ */
46
+ Mixed = 2
47
+ }
31
48
  /** Information about [Texture]($backend) data returned by [[IModelReadRpcInterface.queryTextureData]].
32
49
  * @public
33
50
  */
@@ -36,9 +53,11 @@ export interface TextureData {
36
53
  width: number;
37
54
  /** The height of the image, possibly reduced from the original height based on [[TextureLoadProps.maxTextureSize]]. */
38
55
  height: number;
39
- /** The format of the returned data, Jpeg or Png. */
56
+ /** The format of the image (Jpeg or Png). */
40
57
  format: ImageSourceFormat;
41
- /** returned byte data */
58
+ /** The encoded image bytes. */
42
59
  bytes: Uint8Array;
60
+ /** Information about the transparency of the texture image. Default: [[TextureTransparency.Mixed]]. */
61
+ transparency?: TextureTransparency;
43
62
  }
44
63
  //# sourceMappingURL=TextureProps.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TextureProps.d.ts","sourceRoot":"","sources":["../../src/TextureProps.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,YAAa,SAAQ,sBAAsB;IAC1D,gCAAgC;IAChC,MAAM,EAAE,iBAAiB,CAAC;IAC1B;;;OAGG;IACH,IAAI,EAAE,mBAAmB,CAAC;IAC1B,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,kDAAkD;IAClD,IAAI,EAAE,UAAU,CAAC;IACjB,iJAAiJ;IACjJ,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,qHAAqH;IACrH,KAAK,EAAE,MAAM,CAAC;IACd,uHAAuH;IACvH,MAAM,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,MAAM,EAAE,iBAAiB,CAAC;IAC1B,yBAAyB;IACzB,KAAK,EAAE,UAAU,CAAC;CACnB"}
1
+ {"version":3,"file":"TextureProps.d.ts","sourceRoot":"","sources":["../../src/TextureProps.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,YAAa,SAAQ,sBAAsB;IAC1D,gCAAgC;IAChC,MAAM,EAAE,iBAAiB,CAAC;IAC1B;;;OAGG;IACH,IAAI,EAAE,mBAAmB,CAAC;IAC1B,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,kDAAkD;IAClD,IAAI,EAAE,UAAU,CAAC;IACjB,iJAAiJ;IACjJ,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;GAMG;AACH,oBAAY,mBAAmB;IAC7B,kGAAkG;IAClG,MAAM,IAAA;IACN,mGAAmG;IACnG,WAAW,IAAA;IACX;;OAEG;IACH,KAAK,IAAA;CACN;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,qHAAqH;IACrH,KAAK,EAAE,MAAM,CAAC;IACd,uHAAuH;IACvH,MAAM,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,MAAM,EAAE,iBAAiB,CAAC;IAC1B,+BAA+B;IAC/B,KAAK,EAAE,UAAU,CAAC;IAClB,uGAAuG;IACvG,YAAY,CAAC,EAAE,mBAAmB,CAAC;CACpC"}
@@ -5,5 +5,22 @@
5
5
  /** @packageDocumentation
6
6
  * @module Entities
7
7
  */
8
- export {};
8
+ /** Describes the type of transparency in the pixels of a [TextureImage]($frontend).
9
+ * Each pixel can be classified as either opaque or translucent.
10
+ * The transparency of the image as a whole is based on the combination of pixel transparencies.
11
+ * If this information is known, it should be supplied when creating a texture for more efficient rendering.
12
+ * @see [TextureImage.transparency]($frontend).
13
+ * @public
14
+ */
15
+ export var TextureTransparency;
16
+ (function (TextureTransparency) {
17
+ /** The image contains only opaque pixels. It should not blend with other objects in the scene. */
18
+ TextureTransparency[TextureTransparency["Opaque"] = 0] = "Opaque";
19
+ /** The image contains only translucent pixels. It should blend with other objects in the scene. */
20
+ TextureTransparency[TextureTransparency["Translucent"] = 1] = "Translucent";
21
+ /** The image contains both opaque and translucent pixels. The translucent pixels should blend with other objects in the scene, while
22
+ * the opaque pixels should not. Rendering this type of transparency is somewhat more expensive.
23
+ */
24
+ TextureTransparency[TextureTransparency["Mixed"] = 2] = "Mixed";
25
+ })(TextureTransparency || (TextureTransparency = {}));
9
26
  //# sourceMappingURL=TextureProps.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TextureProps.js","sourceRoot":"","sources":["../../src/TextureProps.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG","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 Entities\r\n */\r\n\r\nimport { Id64String } from \"@itwin/core-bentley\";\r\nimport { DefinitionElementProps } from \"./ElementProps\";\r\nimport { ImageSourceFormat } from \"./Image\";\r\nimport { Base64EncodedString } from \"./Base64EncodedString\";\r\n\r\n/** Properties that define a [Texture]($backend) element.\r\n * @public\r\n */\r\nexport interface TextureProps extends DefinitionElementProps {\r\n /** Format of the image data. */\r\n format: ImageSourceFormat;\r\n /** The image data stored in a Base64-encoded string according to the specified format.\r\n * @see [[Base64EncodedString.fromUint8Array]] to produce a well-formed base-64-encoded string.\r\n * @see [[Base64EncodedString.toUint8Array]] to decode the bytes.\r\n */\r\n data: Base64EncodedString;\r\n /** An optional description of the texture. */\r\n description?: string;\r\n}\r\n\r\n/** Properties that specify what texture should be loaded and how it should be loaded.\r\n * @public\r\n */\r\nexport interface TextureLoadProps {\r\n /** A valid Id64 string identifying the texture */\r\n name: Id64String;\r\n /** Maximum texture size supported by the client. If specified, the texture will be downsampled so both of its dimensions adhere to this size. */\r\n maxTextureSize?: number;\r\n}\r\n\r\n/** Information about [Texture]($backend) data returned by [[IModelReadRpcInterface.queryTextureData]].\r\n * @public\r\n */\r\nexport interface TextureData {\r\n /** The width of the image, possibly reduced from the original width based on [[TextureLoadProps.maxTextureSize]]. */\r\n width: number;\r\n /** The height of the image, possibly reduced from the original height based on [[TextureLoadProps.maxTextureSize]]. */\r\n height: number;\r\n /** The format of the returned data, Jpeg or Png. */\r\n format: ImageSourceFormat;\r\n /** returned byte data */\r\n bytes: Uint8Array;\r\n}\r\n"]}
1
+ {"version":3,"file":"TextureProps.js","sourceRoot":"","sources":["../../src/TextureProps.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAgCH;;;;;;GAMG;AACH,MAAM,CAAN,IAAY,mBASX;AATD,WAAY,mBAAmB;IAC7B,kGAAkG;IAClG,iEAAM,CAAA;IACN,mGAAmG;IACnG,2EAAW,CAAA;IACX;;OAEG;IACH,+DAAK,CAAA;AACP,CAAC,EATW,mBAAmB,KAAnB,mBAAmB,QAS9B","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 Entities\r\n */\r\n\r\nimport { Id64String } from \"@itwin/core-bentley\";\r\nimport { DefinitionElementProps } from \"./ElementProps\";\r\nimport { ImageSourceFormat } from \"./Image\";\r\nimport { Base64EncodedString } from \"./Base64EncodedString\";\r\n\r\n/** Properties that define a [Texture]($backend) element.\r\n * @public\r\n */\r\nexport interface TextureProps extends DefinitionElementProps {\r\n /** Format of the image data. */\r\n format: ImageSourceFormat;\r\n /** The image data stored in a Base64-encoded string according to the specified format.\r\n * @see [[Base64EncodedString.fromUint8Array]] to produce a well-formed base-64-encoded string.\r\n * @see [[Base64EncodedString.toUint8Array]] to decode the bytes.\r\n */\r\n data: Base64EncodedString;\r\n /** An optional description of the texture. */\r\n description?: string;\r\n}\r\n\r\n/** Properties that specify what texture should be loaded and how it should be loaded.\r\n * @public\r\n */\r\nexport interface TextureLoadProps {\r\n /** A valid Id64 string identifying the texture */\r\n name: Id64String;\r\n /** Maximum texture size supported by the client. If specified, the texture will be downsampled so both of its dimensions adhere to this size. */\r\n maxTextureSize?: number;\r\n}\r\n\r\n/** Describes the type of transparency in the pixels of a [TextureImage]($frontend).\r\n * Each pixel can be classified as either opaque or translucent.\r\n * The transparency of the image as a whole is based on the combination of pixel transparencies.\r\n * If this information is known, it should be supplied when creating a texture for more efficient rendering.\r\n * @see [TextureImage.transparency]($frontend).\r\n * @public\r\n */\r\nexport enum TextureTransparency {\r\n /** The image contains only opaque pixels. It should not blend with other objects in the scene. */\r\n Opaque,\r\n /** The image contains only translucent pixels. It should blend with other objects in the scene. */\r\n Translucent,\r\n /** The image contains both opaque and translucent pixels. The translucent pixels should blend with other objects in the scene, while\r\n * the opaque pixels should not. Rendering this type of transparency is somewhat more expensive.\r\n */\r\n Mixed,\r\n}\r\n\r\n/** Information about [Texture]($backend) data returned by [[IModelReadRpcInterface.queryTextureData]].\r\n * @public\r\n */\r\nexport interface TextureData {\r\n /** The width of the image, possibly reduced from the original width based on [[TextureLoadProps.maxTextureSize]]. */\r\n width: number;\r\n /** The height of the image, possibly reduced from the original height based on [[TextureLoadProps.maxTextureSize]]. */\r\n height: number;\r\n /** The format of the image (Jpeg or Png). */\r\n format: ImageSourceFormat;\r\n /** The encoded image bytes. */\r\n bytes: Uint8Array;\r\n /** Information about the transparency of the texture image. Default: [[TextureTransparency.Mixed]]. */\r\n transparency?: TextureTransparency;\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"IpcWebSocketTransport.d.ts","sourceRoot":"","sources":["../../../src/ipc/IpcWebSocketTransport.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAIrD,gBAAgB;AAChB,8BAAsB,qBAAqB;IACzC,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,YAAY,CAAK;aAET,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;IAExD,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG;cAIV,cAAc,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA6BvE,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,mBAAmB,GAAG,GAAG,EAAE;CAOtD"}
1
+ {"version":3,"file":"IpcWebSocketTransport.d.ts","sourceRoot":"","sources":["../../../src/ipc/IpcWebSocketTransport.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAIrD,gBAAgB;AAChB,8BAAsB,qBAAqB;IACzC,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,YAAY,CAAK;aAET,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;IAExD,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG;cAIV,cAAc,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAkCvE,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,mBAAmB,GAAG,GAAG,EAAE;CAOtD"}
@@ -21,10 +21,13 @@ export class IpcWebSocketTransport {
21
21
  this._received.push(data);
22
22
  --this._outstanding;
23
23
  if (this._outstanding === 0) {
24
- await Promise.all(this._received.map(async (v, i, a) => a[i] = await this.unwrap(v)));
25
- parts = this._received;
26
- const message = JSON.parse(this._partial, reviver);
24
+ const partial = this._partial;
25
+ const received = this._received;
27
26
  this._partial = undefined;
27
+ this._received = [];
28
+ await Promise.all(received.map(async (v, i, a) => a[i] = await this.unwrap(v)));
29
+ parts = received;
30
+ const message = JSON.parse(partial, reviver);
28
31
  parts.length = 0;
29
32
  return InSentOrder.deliver(message);
30
33
  }
@@ -123,6 +126,9 @@ class InSentOrder {
123
126
  this._queue.shift();
124
127
  next.release();
125
128
  }
129
+ else {
130
+ break;
131
+ }
126
132
  }
127
133
  return entry.message;
128
134
  }
@@ -1 +1 @@
1
- {"version":3,"file":"IpcWebSocketTransport.js","sourceRoot":"","sources":["../../../src/ipc/IpcWebSocketTransport.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 IpcSocket\r\n */\r\n\r\nimport { IpcWebSocketMessage } from \"./IpcWebSocket\";\r\n\r\nlet parts: any[] = [];\r\n\r\n/** @internal */\r\nexport abstract class IpcWebSocketTransport {\r\n private _partial?: string;\r\n private _received: any[] = [];\r\n private _outstanding = 0;\r\n\r\n public abstract send(message: IpcWebSocketMessage): void;\r\n\r\n protected unwrap(data: any) {\r\n return (typeof (Blob) !== \"undefined\" && data instanceof Blob) ? data.arrayBuffer() : data;\r\n }\r\n\r\n protected async notifyIncoming(data: any): Promise<IpcWebSocketMessage> {\r\n if (this._partial) {\r\n this._received.push(data);\r\n --this._outstanding;\r\n\r\n if (this._outstanding === 0) {\r\n await Promise.all(this._received.map(async (v, i, a) => a[i] = await this.unwrap(v)));\r\n parts = this._received;\r\n const message: IpcWebSocketMessage = JSON.parse(this._partial, reviver);\r\n this._partial = undefined;\r\n parts.length = 0;\r\n return InSentOrder.deliver(message);\r\n } else {\r\n return IpcWebSocketMessage.internal();\r\n }\r\n } else {\r\n const [serialized, followers] = JSON.parse(data);\r\n\r\n if (followers) {\r\n this._partial = serialized;\r\n this._outstanding = followers;\r\n return IpcWebSocketMessage.internal();\r\n } else {\r\n const message: IpcWebSocketMessage = JSON.parse(serialized, reviver);\r\n return InSentOrder.deliver(message);\r\n }\r\n }\r\n }\r\n\r\n protected serialize(data: IpcWebSocketMessage): any[] {\r\n parts.length = 0;\r\n const objects = JSON.stringify(data, replacer);\r\n const value = [JSON.stringify([objects, parts.length]), ...parts];\r\n parts.length = 0;\r\n return value;\r\n }\r\n}\r\n\r\ninterface Marker { ipc: \"binary\", type: number, index: number }\r\nconst types = [Uint8Array, Int8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array, Float32Array, Float64Array, DataView];\r\nfunction identify(value: any) { return Buffer.isBuffer(value) ? 0 : types.indexOf(value.constructor); }\r\nfunction lookup(value: Marker) { return types[value.type]; }\r\n\r\nfunction replacer(this: any, _key: string, value: any) {\r\n const asBinary = replaceBinary(value);\r\n if (asBinary) {\r\n return asBinary;\r\n }\r\n\r\n return value;\r\n}\r\n\r\nfunction reviver(_key: string, value: any) {\r\n if (typeof (value) === \"object\" && value !== null && value.hasOwnProperty(\"ipc\") && value.ipc === \"binary\") {\r\n return reviveBinary(value);\r\n }\r\n\r\n return value;\r\n}\r\n\r\nfunction replaceBinary(value: any): Marker | undefined {\r\n if (ArrayBuffer.isView(value) || Buffer.isBuffer(value)) {\r\n const index = parts.push(value) - 1;\r\n const type = identify(value);\r\n return { ipc: \"binary\", type, index };\r\n } else {\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction reviveBinary(value: Marker): ArrayBufferView {\r\n const constructor = lookup(value);\r\n const part = parts[value.index];\r\n return new constructor(part);\r\n}\r\n\r\nfunction makePromise<T>() {\r\n let resolve: (value: T | PromiseLike<T>) => void = () => { };\r\n let reject: (reason?: any) => void = () => { };\r\n const promise = new Promise<T>((res, rej) => { resolve = res; reject = rej; });\r\n return { promise, resolve, reject };\r\n}\r\n\r\n/* Reconstructing the sequence in which messages were sent is necessary since\r\n the binary data for a message has to be awaited in IpcWebSocketTransport.unwrap. */\r\nclass InSentOrder {\r\n private static _queue: InSentOrder[] = [];\r\n private static _last = -1;\r\n private static get _next() { return this._last + 1; }\r\n\r\n public static async deliver(message: IpcWebSocketMessage): Promise<IpcWebSocketMessage> {\r\n const entry = new InSentOrder(message);\r\n this._queue.push(entry);\r\n this._queue.sort((a, b) => a.sequence - b.sequence);\r\n\r\n while (this._queue.length !== 0) {\r\n const next = this._queue[0];\r\n const duplicate = next.sequence <= this._last;\r\n const match = next.sequence === this._next;\r\n\r\n if (duplicate) {\r\n next.duplicate = true;\r\n } else if (match) {\r\n ++this._last;\r\n }\r\n\r\n if (duplicate || match) {\r\n this._queue.shift();\r\n next.release();\r\n }\r\n }\r\n\r\n return entry.message;\r\n }\r\n\r\n public release = () => { };\r\n public sequence: number;\r\n public duplicate = false;\r\n public message: Promise<IpcWebSocketMessage>;\r\n\r\n private constructor(message: IpcWebSocketMessage) {\r\n this.sequence = message.sequence;\r\n\r\n const { promise, resolve } = makePromise<IpcWebSocketMessage>();\r\n this.message = promise;\r\n\r\n this.release = () => {\r\n const value = this.duplicate ? IpcWebSocketMessage.duplicate() : message;\r\n resolve(value);\r\n };\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"IpcWebSocketTransport.js","sourceRoot":"","sources":["../../../src/ipc/IpcWebSocketTransport.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErD,IAAI,KAAK,GAAU,EAAE,CAAC;AAEtB,gBAAgB;AAChB,MAAM,OAAgB,qBAAqB;IAA3C;QAEU,cAAS,GAAU,EAAE,CAAC;QACtB,iBAAY,GAAG,CAAC,CAAC;IAiD3B,CAAC;IA7CW,MAAM,CAAC,IAAS;QACxB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,WAAW,IAAI,IAAI,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7F,CAAC;IAES,KAAK,CAAC,cAAc,CAAC,IAAS;QACtC,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1B,EAAE,IAAI,CAAC,YAAY,CAAC;YAEpB,IAAI,IAAI,CAAC,YAAY,KAAK,CAAC,EAAE;gBAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC;gBAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;gBAChC,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;gBAC1B,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;gBACpB,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAEhF,KAAK,GAAG,QAAQ,CAAC;gBACjB,MAAM,OAAO,GAAwB,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAClE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;gBAEjB,OAAO,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;aACrC;iBAAM;gBACL,OAAO,mBAAmB,CAAC,QAAQ,EAAE,CAAC;aACvC;SACF;aAAM;YACL,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAEjD,IAAI,SAAS,EAAE;gBACb,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC;gBAC3B,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;gBAC9B,OAAO,mBAAmB,CAAC,QAAQ,EAAE,CAAC;aACvC;iBAAM;gBACL,MAAM,OAAO,GAAwB,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBACrE,OAAO,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;aACrC;SACF;IACH,CAAC;IAES,SAAS,CAAC,IAAyB;QAC3C,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QACjB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC;QAClE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QACjB,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAGD,MAAM,KAAK,GAAG,CAAC,UAAU,EAAE,SAAS,EAAE,iBAAiB,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;AACjJ,SAAS,QAAQ,CAAC,KAAU,IAAI,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;AACvG,SAAS,MAAM,CAAC,KAAa,IAAI,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAE5D,SAAS,QAAQ,CAAY,IAAY,EAAE,KAAU;IACnD,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,QAAQ,EAAE;QACZ,OAAO,QAAQ,CAAC;KACjB;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,OAAO,CAAC,IAAY,EAAE,KAAU;IACvC,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;QAC1G,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;KAC5B;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,KAAU;IAC/B,IAAI,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;QACvD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC7B,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;KACvC;SAAM;QACL,OAAO,SAAS,CAAC;KAClB;AACH,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAChC,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,WAAW;IAClB,IAAI,OAAO,GAAwC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC7D,IAAI,MAAM,GAA2B,GAAG,EAAE,GAAG,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,OAAO,GAAG,GAAG,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AACtC,CAAC;AAED;sFACsF;AACtF,MAAM,WAAW;IAqCf,YAAoB,OAA4B;QALzC,YAAO,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC;QAEpB,cAAS,GAAG,KAAK,CAAC;QAIvB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QAEjC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,WAAW,EAAuB,CAAC;QAChE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QAEvB,IAAI,CAAC,OAAO,GAAG,GAAG,EAAE;YAClB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACzE,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC,CAAC;IACJ,CAAC;IA5CO,MAAM,KAAK,KAAK,KAAK,OAAO,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IAE9C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAA4B;QACtD,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QAEpD,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;YAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC;YAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,KAAK,CAAC;YAE3C,IAAI,SAAS,EAAE;gBACb,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;aACvB;iBAAM,IAAI,KAAK,EAAE;gBAChB,EAAE,IAAI,CAAC,KAAK,CAAC;aACd;YAED,IAAI,SAAS,IAAI,KAAK,EAAE;gBACtB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBACpB,IAAI,CAAC,OAAO,EAAE,CAAC;aAChB;iBAAM;gBACL,MAAM;aACP;SACF;QAED,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;;AA7Bc,kBAAM,GAAkB,EAAE,CAAC;AAC3B,iBAAK,GAAG,CAAC,CAAC,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module IpcSocket\r\n */\r\n\r\nimport { IpcWebSocketMessage } from \"./IpcWebSocket\";\r\n\r\nlet parts: any[] = [];\r\n\r\n/** @internal */\r\nexport abstract class IpcWebSocketTransport {\r\n private _partial?: string;\r\n private _received: any[] = [];\r\n private _outstanding = 0;\r\n\r\n public abstract send(message: IpcWebSocketMessage): void;\r\n\r\n protected unwrap(data: any) {\r\n return (typeof (Blob) !== \"undefined\" && data instanceof Blob) ? data.arrayBuffer() : data;\r\n }\r\n\r\n protected async notifyIncoming(data: any): Promise<IpcWebSocketMessage> {\r\n if (this._partial) {\r\n this._received.push(data);\r\n --this._outstanding;\r\n\r\n if (this._outstanding === 0) {\r\n const partial = this._partial;\r\n const received = this._received;\r\n this._partial = undefined;\r\n this._received = [];\r\n await Promise.all(received.map(async (v, i, a) => a[i] = await this.unwrap(v)));\r\n\r\n parts = received;\r\n const message: IpcWebSocketMessage = JSON.parse(partial, reviver);\r\n parts.length = 0;\r\n\r\n return InSentOrder.deliver(message);\r\n } else {\r\n return IpcWebSocketMessage.internal();\r\n }\r\n } else {\r\n const [serialized, followers] = JSON.parse(data);\r\n\r\n if (followers) {\r\n this._partial = serialized;\r\n this._outstanding = followers;\r\n return IpcWebSocketMessage.internal();\r\n } else {\r\n const message: IpcWebSocketMessage = JSON.parse(serialized, reviver);\r\n return InSentOrder.deliver(message);\r\n }\r\n }\r\n }\r\n\r\n protected serialize(data: IpcWebSocketMessage): any[] {\r\n parts.length = 0;\r\n const objects = JSON.stringify(data, replacer);\r\n const value = [JSON.stringify([objects, parts.length]), ...parts];\r\n parts.length = 0;\r\n return value;\r\n }\r\n}\r\n\r\ninterface Marker { ipc: \"binary\", type: number, index: number }\r\nconst types = [Uint8Array, Int8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array, Float32Array, Float64Array, DataView];\r\nfunction identify(value: any) { return Buffer.isBuffer(value) ? 0 : types.indexOf(value.constructor); }\r\nfunction lookup(value: Marker) { return types[value.type]; }\r\n\r\nfunction replacer(this: any, _key: string, value: any) {\r\n const asBinary = replaceBinary(value);\r\n if (asBinary) {\r\n return asBinary;\r\n }\r\n\r\n return value;\r\n}\r\n\r\nfunction reviver(_key: string, value: any) {\r\n if (typeof (value) === \"object\" && value !== null && value.hasOwnProperty(\"ipc\") && value.ipc === \"binary\") {\r\n return reviveBinary(value);\r\n }\r\n\r\n return value;\r\n}\r\n\r\nfunction replaceBinary(value: any): Marker | undefined {\r\n if (ArrayBuffer.isView(value) || Buffer.isBuffer(value)) {\r\n const index = parts.push(value) - 1;\r\n const type = identify(value);\r\n return { ipc: \"binary\", type, index };\r\n } else {\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction reviveBinary(value: Marker): ArrayBufferView {\r\n const constructor = lookup(value);\r\n const part = parts[value.index];\r\n return new constructor(part);\r\n}\r\n\r\nfunction makePromise<T>() {\r\n let resolve: (value: T | PromiseLike<T>) => void = () => { };\r\n let reject: (reason?: any) => void = () => { };\r\n const promise = new Promise<T>((res, rej) => { resolve = res; reject = rej; });\r\n return { promise, resolve, reject };\r\n}\r\n\r\n/* Reconstructing the sequence in which messages were sent is necessary since\r\n the binary data for a message has to be awaited in IpcWebSocketTransport.unwrap. */\r\nclass InSentOrder {\r\n private static _queue: InSentOrder[] = [];\r\n private static _last = -1;\r\n private static get _next() { return this._last + 1; }\r\n\r\n public static async deliver(message: IpcWebSocketMessage): Promise<IpcWebSocketMessage> {\r\n const entry = new InSentOrder(message);\r\n this._queue.push(entry);\r\n this._queue.sort((a, b) => a.sequence - b.sequence);\r\n\r\n while (this._queue.length !== 0) {\r\n const next = this._queue[0];\r\n const duplicate = next.sequence <= this._last;\r\n const match = next.sequence === this._next;\r\n\r\n if (duplicate) {\r\n next.duplicate = true;\r\n } else if (match) {\r\n ++this._last;\r\n }\r\n\r\n if (duplicate || match) {\r\n this._queue.shift();\r\n next.release();\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n return entry.message;\r\n }\r\n\r\n public release = () => { };\r\n public sequence: number;\r\n public duplicate = false;\r\n public message: Promise<IpcWebSocketMessage>;\r\n\r\n private constructor(message: IpcWebSocketMessage) {\r\n this.sequence = message.sequence;\r\n\r\n const { promise, resolve } = makePromise<IpcWebSocketMessage>();\r\n this.message = promise;\r\n\r\n this.release = () => {\r\n const value = this.duplicate ? IpcWebSocketMessage.duplicate() : message;\r\n resolve(value);\r\n };\r\n }\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@itwin/core-common",
3
- "version": "3.0.0-dev.173",
3
+ "version": "3.0.0-dev.177",
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",
@@ -29,14 +29,14 @@
29
29
  "js-base64": "^3.6.1"
30
30
  },
31
31
  "peerDependencies": {
32
- "@itwin/core-bentley": "^3.0.0-dev.173",
33
- "@itwin/core-geometry": "^3.0.0-dev.173"
32
+ "@itwin/core-bentley": "^3.0.0-dev.177",
33
+ "@itwin/core-geometry": "^3.0.0-dev.177"
34
34
  },
35
35
  "devDependencies": {
36
- "@itwin/build-tools": "3.0.0-dev.173",
37
- "@itwin/core-bentley": "3.0.0-dev.173",
38
- "@itwin/core-geometry": "3.0.0-dev.173",
39
- "@itwin/eslint-plugin": "3.0.0-dev.173",
36
+ "@itwin/build-tools": "3.0.0-dev.177",
37
+ "@itwin/core-bentley": "3.0.0-dev.177",
38
+ "@itwin/core-geometry": "3.0.0-dev.177",
39
+ "@itwin/eslint-plugin": "3.0.0-dev.177",
40
40
  "@types/chai": "^4.1.4",
41
41
  "@types/flatbuffers": "~1.10.0",
42
42
  "@types/mocha": "^8.2.2",
@@ -70,5 +70,6 @@
70
70
  "lint": "eslint -f visualstudio \"./src/**/*.ts\" 1>&2",
71
71
  "test": "mocha",
72
72
  "cover": "nyc npm -s test"
73
- }
73
+ },
74
+ "readme": "# @itwin/core-common\r\n\r\nCopyright © Bentley Systems, Incorporated. All rights reserved. See LICENSE.md for license terms and full copyright notice.\r\n\r\n## Description\r\n\r\nThe __@itwin/core-common__ package contains classes for working with iModels that can be used in both the frontend and backend.\r\n\r\n## Documentation\r\n\r\nSee the [iTwin.js](https://www.itwinjs.org) documentation for more information.\r\n"
74
75
  }