@vertexvis/viewer 0.24.4-canary.9 → 0.24.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (236) hide show
  1. package/README.template.md +6 -0
  2. package/dist/cjs/{cursors-2dfb0ef3.js → cursors-17ad74ac.js} +2 -2
  3. package/dist/cjs/{cursors-2dfb0ef3.js.map → cursors-17ad74ac.js.map} +1 -1
  4. package/dist/cjs/dom-fc408b4c.js.map +1 -1
  5. package/dist/cjs/{index-5fa5a527.js → index-0abd8b0b.js} +2 -2
  6. package/dist/cjs/index-0abd8b0b.js.map +1 -0
  7. package/dist/cjs/index.cjs.js +2 -2
  8. package/dist/cjs/loader.cjs.js +1 -1
  9. package/dist/cjs/loader.cjs.js.map +1 -1
  10. package/dist/cjs/{queries-cf96c8bc.js → queries-4580caa5.js} +8 -2
  11. package/dist/cjs/queries-4580caa5.js.map +1 -0
  12. package/dist/cjs/{shadow-css-8962c4a9.js → shadow-css-37297ac8.js} +1 -1
  13. package/dist/cjs/shadow-css-37297ac8.js.map +1 -0
  14. package/dist/cjs/{stencil-a3f4e15b.js → stencil-40ef9119.js} +2 -2
  15. package/dist/cjs/{stencil-a3f4e15b.js.map → stencil-40ef9119.js.map} +1 -1
  16. package/dist/cjs/vertex-scene-tree-notification-banner_4.cjs.entry.js +8 -2
  17. package/dist/cjs/vertex-scene-tree-notification-banner_4.cjs.entry.js.map +1 -1
  18. package/dist/cjs/vertex-scene-tree-table-cell.cjs.entry.js +1 -1
  19. package/dist/cjs/vertex-scene-tree-table-column.cjs.entry.js +1 -1
  20. package/dist/cjs/vertex-scene-tree-table-header.cjs.entry.js +1 -1
  21. package/dist/cjs/vertex-scene-tree-table-resize-divider.cjs.entry.js +1 -1
  22. package/dist/cjs/vertex-scene-tree-toolbar-group.cjs.entry.js +1 -1
  23. package/dist/cjs/vertex-scene-tree.cjs.entry.js +1 -1
  24. package/dist/cjs/vertex-viewer-annotation-callout.cjs.entry.js +1 -1
  25. package/dist/cjs/vertex-viewer-box-query-tool.cjs.entry.js +2 -2
  26. package/dist/cjs/vertex-viewer-button_3.cjs.entry.js +1 -1
  27. package/dist/cjs/vertex-viewer-default-toolbar.cjs.entry.js +1 -1
  28. package/dist/cjs/vertex-viewer-dom-element_2.cjs.entry.js +1 -1
  29. package/dist/cjs/vertex-viewer-dom-group.cjs.entry.js +1 -1
  30. package/dist/cjs/vertex-viewer-hit-result-indicator.cjs.entry.js +2 -2
  31. package/dist/cjs/vertex-viewer-icon.cjs.entry.js +1 -1
  32. package/dist/cjs/vertex-viewer-layer.cjs.entry.js +1 -1
  33. package/dist/cjs/vertex-viewer-markup-arrow_3.cjs.entry.js +1 -1
  34. package/dist/cjs/vertex-viewer-markup-tool.cjs.entry.js +1 -1
  35. package/dist/cjs/vertex-viewer-markup.cjs.entry.js +1 -1
  36. package/dist/cjs/vertex-viewer-measurement-details.cjs.entry.js +1 -1
  37. package/dist/cjs/vertex-viewer-measurement-distance.cjs.entry.js +2 -2
  38. package/dist/cjs/vertex-viewer-measurement-line_2.cjs.entry.js +1 -1
  39. package/dist/cjs/vertex-viewer-measurement-precise.cjs.entry.js +2 -2
  40. package/dist/cjs/vertex-viewer-pin-group.cjs.entry.js +3 -3
  41. package/dist/cjs/vertex-viewer-pin-group.cjs.entry.js.map +1 -1
  42. package/dist/cjs/vertex-viewer-pin-label_2.cjs.entry.js +2 -2
  43. package/dist/cjs/vertex-viewer-pin-tool.cjs.entry.js +2 -2
  44. package/dist/cjs/vertex-viewer-spinner.cjs.entry.js +1 -1
  45. package/dist/cjs/vertex-viewer-teleport-tool.cjs.entry.js +1 -1
  46. package/dist/cjs/vertex-viewer-transform-widget.cjs.entry.js +2 -2
  47. package/dist/cjs/vertex-viewer-view-cube.cjs.entry.js +2 -2
  48. package/dist/cjs/vertex-viewer-walk-mode-tool.cjs.entry.js +4 -4
  49. package/dist/cjs/vertex-viewer-walk-mode-tool.cjs.entry.js.map +1 -1
  50. package/dist/cjs/vertex-viewer.cjs.entry.js +22 -11
  51. package/dist/cjs/vertex-viewer.cjs.entry.js.map +1 -1
  52. package/dist/cjs/viewer.cjs.js +1 -1
  53. package/dist/cjs/viewer.cjs.js.map +1 -1
  54. package/dist/collection/components/scene-tree-search/scene-tree-search.js +21 -1
  55. package/dist/collection/components/scene-tree-search/scene-tree-search.js.map +1 -1
  56. package/dist/collection/components/viewer/viewer.js +18 -7
  57. package/dist/collection/components/viewer/viewer.js.map +1 -1
  58. package/dist/collection/components/viewer-pin-group/viewer-pin-group.css +5 -0
  59. package/dist/collection/components/viewer-walk-mode-tool/viewer-walk-mode-tool.js +3 -3
  60. package/dist/collection/components/viewer-walk-mode-tool/viewer-walk-mode-tool.js.map +1 -1
  61. package/dist/collection/lib/cursors.js +1 -1
  62. package/dist/collection/lib/cursors.js.map +1 -1
  63. package/dist/collection/lib/model-views/controller.js +7 -1
  64. package/dist/collection/lib/model-views/controller.js.map +1 -1
  65. package/dist/collection/lib/stream/stream.js +4 -3
  66. package/dist/collection/lib/stream/stream.js.map +1 -1
  67. package/dist/collection/testing/viewer.js +1 -1
  68. package/dist/collection/testing/viewer.js.map +1 -1
  69. package/dist/components/cursors.js +1 -1
  70. package/dist/components/cursors.js.map +1 -1
  71. package/dist/components/queries.js +7 -1
  72. package/dist/components/queries.js.map +1 -1
  73. package/dist/components/scene-tree-search.js +6 -0
  74. package/dist/components/scene-tree-search.js.map +1 -1
  75. package/dist/components/vertex-viewer-walk-mode-tool.js +3 -3
  76. package/dist/components/vertex-viewer-walk-mode-tool.js.map +1 -1
  77. package/dist/components/vertex-viewer.js +18 -7
  78. package/dist/components/vertex-viewer.js.map +1 -1
  79. package/dist/components/viewer-pin-group.js +1 -1
  80. package/dist/components/viewer-pin-group.js.map +1 -1
  81. package/dist/esm/{cursors-9e349d61.js → cursors-3806bc04.js} +2 -2
  82. package/dist/esm/{cursors-9e349d61.js.map → cursors-3806bc04.js.map} +1 -1
  83. package/dist/esm/dom-dba69343.js.map +1 -1
  84. package/dist/esm/{index-f3e96c9e.js → index-c12dc0cd.js} +2 -2
  85. package/dist/esm/index-c12dc0cd.js.map +1 -0
  86. package/dist/esm/index.js +2 -2
  87. package/dist/esm/index.mjs +2 -2
  88. package/dist/esm/loader.js +1 -1
  89. package/dist/esm/loader.js.map +1 -1
  90. package/dist/esm/loader.mjs +1 -1
  91. package/dist/esm/{queries-2f4a492c.js → queries-948a88f9.js} +8 -2
  92. package/dist/esm/queries-948a88f9.js.map +1 -0
  93. package/dist/esm/{shadow-css-9363884b.js → shadow-css-d5069bdf.js} +1 -1
  94. package/dist/esm/shadow-css-d5069bdf.js.map +1 -0
  95. package/dist/esm/{stencil-9d9f090f.js → stencil-38b2fc28.js} +2 -2
  96. package/dist/esm/{stencil-9d9f090f.js.map → stencil-38b2fc28.js.map} +1 -1
  97. package/dist/esm/vertex-scene-tree-notification-banner_4.entry.js +8 -2
  98. package/dist/esm/vertex-scene-tree-notification-banner_4.entry.js.map +1 -1
  99. package/dist/esm/vertex-scene-tree-table-cell.entry.js +1 -1
  100. package/dist/esm/vertex-scene-tree-table-column.entry.js +1 -1
  101. package/dist/esm/vertex-scene-tree-table-header.entry.js +1 -1
  102. package/dist/esm/vertex-scene-tree-table-resize-divider.entry.js +1 -1
  103. package/dist/esm/vertex-scene-tree-toolbar-group.entry.js +1 -1
  104. package/dist/esm/vertex-scene-tree.entry.js +1 -1
  105. package/dist/esm/vertex-viewer-annotation-callout.entry.js +1 -1
  106. package/dist/esm/vertex-viewer-box-query-tool.entry.js +2 -2
  107. package/dist/esm/vertex-viewer-button_3.entry.js +1 -1
  108. package/dist/esm/vertex-viewer-default-toolbar.entry.js +1 -1
  109. package/dist/esm/vertex-viewer-dom-element_2.entry.js +1 -1
  110. package/dist/esm/vertex-viewer-dom-group.entry.js +1 -1
  111. package/dist/esm/vertex-viewer-hit-result-indicator.entry.js +2 -2
  112. package/dist/esm/vertex-viewer-icon.entry.js +1 -1
  113. package/dist/esm/vertex-viewer-layer.entry.js +1 -1
  114. package/dist/esm/vertex-viewer-markup-arrow_3.entry.js +1 -1
  115. package/dist/esm/vertex-viewer-markup-tool.entry.js +1 -1
  116. package/dist/esm/vertex-viewer-markup.entry.js +1 -1
  117. package/dist/esm/vertex-viewer-measurement-details.entry.js +1 -1
  118. package/dist/esm/vertex-viewer-measurement-distance.entry.js +2 -2
  119. package/dist/esm/vertex-viewer-measurement-line_2.entry.js +1 -1
  120. package/dist/esm/vertex-viewer-measurement-precise.entry.js +2 -2
  121. package/dist/esm/vertex-viewer-pin-group.entry.js +3 -3
  122. package/dist/esm/vertex-viewer-pin-group.entry.js.map +1 -1
  123. package/dist/esm/vertex-viewer-pin-label_2.entry.js +2 -2
  124. package/dist/esm/vertex-viewer-pin-tool.entry.js +2 -2
  125. package/dist/esm/vertex-viewer-spinner.entry.js +1 -1
  126. package/dist/esm/vertex-viewer-teleport-tool.entry.js +1 -1
  127. package/dist/esm/vertex-viewer-transform-widget.entry.js +2 -2
  128. package/dist/esm/vertex-viewer-view-cube.entry.js +2 -2
  129. package/dist/esm/vertex-viewer-walk-mode-tool.entry.js +4 -4
  130. package/dist/esm/vertex-viewer-walk-mode-tool.entry.js.map +1 -1
  131. package/dist/esm/vertex-viewer.entry.js +22 -11
  132. package/dist/esm/vertex-viewer.entry.js.map +1 -1
  133. package/dist/esm/viewer.js +1 -1
  134. package/dist/esm/viewer.js.map +1 -1
  135. package/dist/types/components/scene-tree-search/scene-tree-search.d.ts +5 -1
  136. package/dist/types/components/viewer/viewer.d.ts +3 -2
  137. package/dist/types/components.d.ts +9 -5
  138. package/dist/types/lib/stream/stream.d.ts +1 -1
  139. package/dist/types/testing/viewer.d.ts +1 -1
  140. package/dist/viewer/index.esm.js +1 -1
  141. package/dist/viewer/{p-0e0973f0.entry.js → p-03efd0d6.entry.js} +2 -2
  142. package/dist/viewer/{p-7f0eeb06.entry.js → p-0988832f.entry.js} +2 -2
  143. package/dist/viewer/{p-78a1be4e.entry.js → p-0aa04328.entry.js} +2 -2
  144. package/dist/viewer/p-18ce3f3b.entry.js +5 -0
  145. package/dist/viewer/{p-9bb550e2.entry.js.map → p-18ce3f3b.entry.js.map} +1 -1
  146. package/dist/viewer/{p-2ecdcd5d.entry.js → p-23f0bb30.entry.js} +2 -2
  147. package/dist/viewer/{p-06b8bca7.entry.js → p-296311d3.entry.js} +2 -2
  148. package/dist/viewer/{p-2172230d.entry.js → p-2fd66679.entry.js} +2 -2
  149. package/dist/viewer/{p-5540add8.entry.js → p-362f3e12.entry.js} +2 -2
  150. package/dist/viewer/{p-110f66c6.js → p-388f809e.js} +2 -2
  151. package/dist/viewer/p-388f809e.js.map +1 -0
  152. package/dist/viewer/{p-48b63c5f.entry.js → p-45044ff2.entry.js} +2 -2
  153. package/dist/viewer/{p-9fc2e56e.entry.js → p-45b5b5ed.entry.js} +2 -2
  154. package/dist/viewer/{p-f79933ae.entry.js → p-4bd1ea70.entry.js} +2 -2
  155. package/dist/viewer/{p-842cc51b.entry.js → p-4bf16450.entry.js} +2 -2
  156. package/dist/viewer/{p-a057d7f2.entry.js → p-56fa8168.entry.js} +2 -2
  157. package/dist/viewer/{p-8c367e87.entry.js → p-59f204e7.entry.js} +2 -2
  158. package/dist/viewer/p-59f204e7.entry.js.map +1 -0
  159. package/dist/viewer/{p-33033b58.entry.js → p-6cf6eb8a.entry.js} +2 -2
  160. package/dist/viewer/p-715255e1.entry.js +5 -0
  161. package/dist/viewer/p-715255e1.entry.js.map +1 -0
  162. package/dist/viewer/{p-5f9352c0.entry.js → p-75f5ae33.entry.js} +2 -2
  163. package/dist/viewer/{p-7eea3fb3.entry.js → p-7a87ae97.entry.js} +2 -2
  164. package/dist/viewer/{p-22b42d4b.entry.js → p-86e1ee86.entry.js} +2 -2
  165. package/dist/viewer/p-89d93218.entry.js +5 -0
  166. package/dist/viewer/p-89d93218.entry.js.map +1 -0
  167. package/dist/viewer/{p-07325d65.entry.js → p-8c53ed63.entry.js} +2 -2
  168. package/dist/viewer/p-991f7bac.js.map +1 -1
  169. package/dist/viewer/{p-983db3dd.entry.js → p-a009c6d9.entry.js} +2 -2
  170. package/dist/viewer/{p-dcb64250.entry.js → p-a3bc0b79.entry.js} +2 -2
  171. package/dist/viewer/{p-29318a17.entry.js → p-aece4279.entry.js} +2 -2
  172. package/dist/viewer/{p-be257155.js → p-b8c0f6ff.js} +1 -1
  173. package/dist/viewer/p-b8c0f6ff.js.map +1 -0
  174. package/dist/viewer/p-bab8266e.js +5 -0
  175. package/dist/viewer/p-bab8266e.js.map +1 -0
  176. package/dist/viewer/{p-05562c21.entry.js → p-bcddbdb2.entry.js} +2 -2
  177. package/dist/viewer/{p-40e8a5ea.entry.js → p-c3b071a3.entry.js} +2 -2
  178. package/dist/viewer/{p-fbfa1e82.entry.js → p-cd3f0870.entry.js} +2 -2
  179. package/dist/viewer/{p-d2677c13.entry.js → p-d9e75269.entry.js} +2 -2
  180. package/dist/viewer/p-e1eaedd8.js +5 -0
  181. package/dist/viewer/{p-a27a9775.entry.js → p-e70e2c04.entry.js} +2 -2
  182. package/dist/viewer/{p-ffa8a2dd.entry.js → p-ebea8f56.entry.js} +2 -2
  183. package/dist/viewer/{p-342dac8b.js → p-eda9f5d4.js} +2 -2
  184. package/dist/viewer/{p-342dac8b.js.map → p-eda9f5d4.js.map} +1 -1
  185. package/dist/viewer/{p-9d54d593.entry.js → p-f292e8ae.entry.js} +2 -2
  186. package/dist/viewer/{p-d024c250.entry.js → p-f8a9c4d2.entry.js} +2 -2
  187. package/dist/viewer/viewer.esm.js +1 -1
  188. package/dist/viewer/viewer.esm.js.map +1 -1
  189. package/package.json +7 -7
  190. package/readme.md +10 -4
  191. package/dist/cjs/index-5fa5a527.js.map +0 -1
  192. package/dist/cjs/queries-cf96c8bc.js.map +0 -1
  193. package/dist/cjs/shadow-css-8962c4a9.js.map +0 -1
  194. package/dist/esm/index-f3e96c9e.js.map +0 -1
  195. package/dist/esm/queries-2f4a492c.js.map +0 -1
  196. package/dist/esm/shadow-css-9363884b.js.map +0 -1
  197. package/dist/viewer/p-04bf6b89.js +0 -5
  198. package/dist/viewer/p-110f66c6.js.map +0 -1
  199. package/dist/viewer/p-51eff23a.entry.js +0 -5
  200. package/dist/viewer/p-51eff23a.entry.js.map +0 -1
  201. package/dist/viewer/p-629a5ae7.entry.js +0 -5
  202. package/dist/viewer/p-629a5ae7.entry.js.map +0 -1
  203. package/dist/viewer/p-8c367e87.entry.js.map +0 -1
  204. package/dist/viewer/p-9bb550e2.entry.js +0 -5
  205. package/dist/viewer/p-b2e80d7f.js +0 -5
  206. package/dist/viewer/p-b2e80d7f.js.map +0 -1
  207. package/dist/viewer/p-be257155.js.map +0 -1
  208. /package/dist/viewer/{p-0e0973f0.entry.js.map → p-03efd0d6.entry.js.map} +0 -0
  209. /package/dist/viewer/{p-7f0eeb06.entry.js.map → p-0988832f.entry.js.map} +0 -0
  210. /package/dist/viewer/{p-78a1be4e.entry.js.map → p-0aa04328.entry.js.map} +0 -0
  211. /package/dist/viewer/{p-2ecdcd5d.entry.js.map → p-23f0bb30.entry.js.map} +0 -0
  212. /package/dist/viewer/{p-06b8bca7.entry.js.map → p-296311d3.entry.js.map} +0 -0
  213. /package/dist/viewer/{p-2172230d.entry.js.map → p-2fd66679.entry.js.map} +0 -0
  214. /package/dist/viewer/{p-5540add8.entry.js.map → p-362f3e12.entry.js.map} +0 -0
  215. /package/dist/viewer/{p-48b63c5f.entry.js.map → p-45044ff2.entry.js.map} +0 -0
  216. /package/dist/viewer/{p-9fc2e56e.entry.js.map → p-45b5b5ed.entry.js.map} +0 -0
  217. /package/dist/viewer/{p-f79933ae.entry.js.map → p-4bd1ea70.entry.js.map} +0 -0
  218. /package/dist/viewer/{p-842cc51b.entry.js.map → p-4bf16450.entry.js.map} +0 -0
  219. /package/dist/viewer/{p-a057d7f2.entry.js.map → p-56fa8168.entry.js.map} +0 -0
  220. /package/dist/viewer/{p-33033b58.entry.js.map → p-6cf6eb8a.entry.js.map} +0 -0
  221. /package/dist/viewer/{p-5f9352c0.entry.js.map → p-75f5ae33.entry.js.map} +0 -0
  222. /package/dist/viewer/{p-7eea3fb3.entry.js.map → p-7a87ae97.entry.js.map} +0 -0
  223. /package/dist/viewer/{p-22b42d4b.entry.js.map → p-86e1ee86.entry.js.map} +0 -0
  224. /package/dist/viewer/{p-07325d65.entry.js.map → p-8c53ed63.entry.js.map} +0 -0
  225. /package/dist/viewer/{p-983db3dd.entry.js.map → p-a009c6d9.entry.js.map} +0 -0
  226. /package/dist/viewer/{p-dcb64250.entry.js.map → p-a3bc0b79.entry.js.map} +0 -0
  227. /package/dist/viewer/{p-29318a17.entry.js.map → p-aece4279.entry.js.map} +0 -0
  228. /package/dist/viewer/{p-05562c21.entry.js.map → p-bcddbdb2.entry.js.map} +0 -0
  229. /package/dist/viewer/{p-40e8a5ea.entry.js.map → p-c3b071a3.entry.js.map} +0 -0
  230. /package/dist/viewer/{p-fbfa1e82.entry.js.map → p-cd3f0870.entry.js.map} +0 -0
  231. /package/dist/viewer/{p-d2677c13.entry.js.map → p-d9e75269.entry.js.map} +0 -0
  232. /package/dist/viewer/{p-04bf6b89.js.map → p-e1eaedd8.js.map} +0 -0
  233. /package/dist/viewer/{p-a27a9775.entry.js.map → p-e70e2c04.entry.js.map} +0 -0
  234. /package/dist/viewer/{p-ffa8a2dd.entry.js.map → p-ebea8f56.entry.js.map} +0 -0
  235. /package/dist/viewer/{p-9d54d593.entry.js.map → p-f292e8ae.entry.js.map} +0 -0
  236. /package/dist/viewer/{p-d024c250.entry.js.map → p-f8a9c4d2.entry.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"cursors.js","sourceRoot":"","sources":["../../../../src/lib/cursors.ts"],"names":[],"mappings":"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","sourcesContent":["import { Disposable, EventDispatcher } from '@vertexvis/utils';\n\n/**\n * Represents a built-in [browser CSS\n * cursor](https://developer.mozilla.org/en-US/docs/Web/CSS/cursor).\n */\nexport type CssCursor =\n | 'auto'\n | 'default'\n | 'none'\n | 'context-menu'\n | 'help'\n | 'pointer'\n | 'progress'\n | 'wait'\n | 'cell'\n | 'crosshair'\n | 'text'\n | 'vertical-text'\n | 'alias'\n | 'copy'\n | 'move'\n | 'no-drop'\n | 'not-allowed'\n | 'grab'\n | 'grabbing'\n | 'all-scroll'\n | 'col-resize'\n | 'row-resize'\n | 'n-resize'\n | 'e-resize'\n | 's-resize'\n | 'w-resize'\n | 'ne-resize'\n | 'nw-resize'\n | 'se-resize'\n | 'sw-resize'\n | 'ew-resize'\n | 'ns-resize'\n | 'nesw-resize'\n | 'nwse-resize'\n | 'zoom-in'\n | 'zoom-out'\n | string;\n\n/**\n * Represents a custom cursor that points to an image file and offset.\n */\nexport interface CustomCursor {\n url: string;\n offsetX?: number;\n offsetY?: number;\n}\n\n/**\n * Represents all possible cursor types.\n */\nexport type Cursor = CssCursor | CustomCursor;\n\ninterface CursorInstance extends Disposable {\n id: number;\n cursor: Cursor;\n priority: number;\n}\n\n/**\n * The cursor manager maintains a prioritized list of cursors for the viewer.\n *\n * Cursors with the highest priority will be considered active, where the most\n * recently added cursor will take precedence if there are multiple cursors with\n * the same priority.\n */\nexport class CursorManager {\n /**\n * A constant representing the lowest priority cursors.\n */\n public static readonly LOW_PRIORITY = 0;\n\n /**\n * A constant representing a priority between `LOW_PRIORITY` and\n * `HIGH_PRIORITY`.\n */\n public static readonly NORMAL_PRIORITY = 10;\n\n /**\n * A constant representing the high priority cursors.\n */\n public static readonly HIGH_PRIORITY = 20;\n\n /**\n * An event dispatcher that emits an event when a cursor is added or removed.\n *\n * @see {@link CursorManager.add} to add a cursor.\n * @see {@link CursorManager.getActiveCursor} to query the current cursor.\n */\n public readonly onChanged = new EventDispatcher<void>();\n\n private cursors: CursorInstance[] = [];\n\n private nextId = 0;\n\n /**\n * Adds a cursor to the cursor manager, and returns an identifier that can be\n * used to remove the cursor.\n *\n * @param cursor The cursor to add.\n * @param priority The priority of the cursor. Higher values have higher\n * \tpriority over lower values.\n * @returns An identifier for the cursor.\n * @see {@link CursorManager.getActiveCursor} to query the current cursor.\n */\n public add(\n cursor: Cursor,\n priority = CursorManager.NORMAL_PRIORITY\n ): Disposable {\n // Ensure a duplicate cursor will not be added to the cursor manager.\n // If a matching cursor exists, delete it before proceeding.\n // Note that deleting the old cursor and adding the new one results in the\n // new cursor taking precedent over other existing cursors with the same priority.\n const duplicateCursor = this.getExistingDuplicateCursor(cursor, priority);\n if (duplicateCursor != null) {\n this.remove(duplicateCursor.id);\n }\n\n const id = ++this.nextId;\n const instance = { id, cursor, priority, dispose: () => this.remove(id) };\n this.cursors.push(instance);\n this.onChanged.emit();\n return instance;\n }\n\n /**\n * Removes a cursor with the given ID, if it exists.\n *\n * @param cursorId The ID of the cursor to remove.\n */\n private remove(cursorId: number): void {\n const index = this.cursors.findIndex(({ id }) => id === cursorId);\n if (index >= 0) {\n this.cursors.splice(index, 1);\n this.onChanged.emit();\n }\n }\n\n /**\n * Checks to see if an existing cursor matches the provided cursor and priority level.\n * The matching cursor is returned if found.\n *\n * @param cursorToCheck The cursor to check for duplicates against.\n * @param priorityToCheck The priority level to check for duplicates against.\n */\n private getExistingDuplicateCursor(\n cursorToCheck: Cursor,\n priorityToCheck: number\n ): CursorInstance | undefined {\n return this.cursors.find(\n (cursor) =>\n cursor.cursor === cursorToCheck && cursor.priority === priorityToCheck\n );\n }\n\n /**\n * Returns the active cursor based on priority and insertion order.\n *\n * @see {@link CursorManager.add} to add a cursor.\n */\n public getActiveCursor(): Cursor | undefined {\n const sorted = this.cursors\n .concat()\n .reverse()\n .sort((a, b) => b.priority - a.priority);\n\n return sorted[0]?.cursor;\n }\n}\n\n// CSS SVG images need to be URL encoded: https://yoksel.github.io/url-encoder/\n\nexport const measurementCursor = {\n url: \"data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M21.5 8h-19a.5.5 0 00-.5.5v6a.5.5 0 00.5.5h19a.5.5 0 00.5-.5v-6a.5.5 0 00-.5-.5zm-.5 6H3V9h3v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2z' stroke='%23fff' stroke-width='1.25' stroke-opacity='0.5' stroke-miterlimit='10' shape-rendering='crispEdges'/%3E%3Cpath d='M21.5 8h-19a.5.5 0 00-.5.5v6a.5.5 0 00.5.5h19a.5.5 0 00.5-.5v-6a.5.5 0 00-.5-.5zm-.5 6H3V9h3v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2z' shape-rendering='crispEdges'/%3E%3C/svg%3E\",\n offsetX: -24,\n offsetY: -24,\n};\n\nexport const measurementWithArrowCursor = {\n url: \"data:image/svg+xml;utf8,%3Csvg id='icons' xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bstroke:%23fff;stroke-miterlimit:10;stroke-width:2px;%7D.cls-2%7Bfill:%23fff;%7D.cls-2,.cls-3%7Bfill-rule:evenodd;%7D%3C/style%3E%3C/defs%3E%3Cpath class='cls-1' d='M27.46,21h-19a.5.5,0,0,0-.5.5v6a.5.5,0,0,0,.5.5h19a.5.5,0,0,0,.5-.5v-6A.5.5,0,0,0,27.46,21ZM27,27H9V22h3v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2Z'/%3E%3Cpath d='M27.46,21h-19a.5.5,0,0,0-.5.5v6a.5.5,0,0,0,.5.5h19a.5.5,0,0,0,.5-.5v-6A.5.5,0,0,0,27.46,21ZM27,27H9V22h3v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2Z'/%3E%3Cpath class='cls-2' d='M1,17V1L12.59,12.62H5.81l-.41.12Z'/%3E%3Cpath class='cls-2' d='M10.08,17.69l-3.6,1.53L1.8,8.14,5.48,6.58Z'/%3E%3Cpath class='cls-3' d='M8.75,17l-1.84.77-3.1-7.37,1.84-.78Z'/%3E%3Cpath class='cls-3' d='M2,3.41V14.6l3-2.87.43-.14h4.76Z'/%3E%3C/svg%3E\",\n offsetX: -30,\n offsetY: -30,\n};\n\nexport const pinCursor = {\n url: \"data:image/svg+xml,%3Csvg width='36px' height='36px' viewBox='0 0 24 24' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cdefs%3E%3Cpath d='M12,2 C7.581722,2 4,5.581722 4,10 C4.00435812,11.7714969 4.41127263,13.5188357 5.19,15.11 C6.15517666,17.0237439 7.49502409,18.7240579 9.13,20.11 C9.86916736,20.7592093 10.6620019,21.3446357 11.5,21.86 L12,22.14 L12.5,21.86 C13.8750156,21.0120029 15.1296156,19.9827599 16.23,18.8 C17.2698142,17.7023203 18.1394508,16.4551671 18.81,15.1 C19.5872532,13.5118707 19.9941287,11.7681184 20,10 C20,5.581722 16.418278,2 12,2 Z M12,13 C10.3431458,13 9,11.6568542 9,10 C9,8.34314575 10.3431458,7 12,7 C13.6568542,7 15,8.34314575 15,10 C15,10.7956495 14.6839295,11.5587112 14.1213203,12.1213203 C13.5587112,12.6839295 12.7956495,13 12,13 Z' id='path-1'%3E%3C/path%3E%3C/defs%3E%3Cg id='icons/pin-filled' stroke='none' stroke-width='1' fill='none' fill-rule='evenodd'%3E%3Cmask id='mask-2' fill='white'%3E%3Cuse xlink:href='%23path-1'%3E%3C/use%3E%3C/mask%3E%3Cuse id='Shape' stroke='%23FAFAFA' fill='%23BDBDBD' fill-rule='nonzero' xlink:href='%23path-1'%3E%3C/use%3E%3C/g%3E%3C/svg%3E\",\n offsetX: 17,\n offsetY: 22,\n};\n\nexport const labelPinCursor = {\n url: \"data:image/svg+xml,%3Csvg width='36px' height='36px' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 16 24' %3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bfill:none;%7D.cls-2%7Bfill:%23616161;%7D.cls-3%7Bclip-path:url(%23clip-path);%7D%3C/style%3E%3CclipPath id='clip-path'%3E%3Ccircle cx='-576.76' cy='-107.26' r='4'/%3E%3C/clipPath%3E%3C/defs%3E%3Cpath d='M8,16H8a.48.48,0,0,1-.42-.23L5.75,13H3.51A1.5,1.5,0,0,1,2,11.5v-8A1.5,1.5,0,0,1,3.51,2h9A1.51,1.51,0,0,1,14,3.5v8a1.5,1.5,0,0,1-1.5,1.5H10.22L8.39,15.81A.5.5,0,0,1,8,16ZM3.51,3a.5.5,0,0,0-.5.5v8a.5.5,0,0,0,.5.5H6a.5.5,0,0,1,.42.23L8,14.61l1.55-2.38A.5.5,0,0,1,10,12h2.56a.5.5,0,0,0,.5-.5v-8a.51.51,0,0,0-.5-.5Z'/%3E%3Ccircle cx='8.01' cy='20' r='2'/%3E%3C/svg%3E%0A\",\n offsetX: 17,\n offsetY: 29,\n};\n\nexport const boxQueryCursor = {\n url: \"data:image/svg+xml;utf8,%3Csvg id='icons' xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bstroke:%23fff;stroke-miterlimit:10;stroke-width:2px;%7D.cls-2%7Bfill:%23fff;%7D.cls-2,.cls-3%7Bfill-rule:evenodd;%7D%3C/style%3E%3C/defs%3E%3Cpath class='cls-2' d='M1.25,17V1L12.59,12.62H5.81l-.41.12Z'/%3E%3Cpath class='cls-2' d='M10.33,17.69l-3.6,1.53L1.8,8.14,5.48,6.58Z'/%3E %3Cpath class='cls-3' d='M9,17l-1.84.77-3.1-7.37,1.84-.78Z'/%3E%3Cpath class='cls-3' d='M2.25,3.41V14.6l3-2.87.43-.14h4.76Z'/%3E%3Cpath class='cls-1' d='M21.36,22.5H15.5V16.64a.5.5,0,0,0-1,0V22.5H8.64a.5.5,0,0,0,0,1H14.5v5.86a.5.5,0,0,0,1,0V23.5h5.86a.5.5,0,0,0,0-1Z' /%3E %3Cpath d='M21.36,22.5H15.5V16.64a.5.5,0,0,0-1,0V22.5H8.64a.5.5,0,0,0,0,1H14.5v5.86a.5.5,0,0,0,1,0V23.5h5.86a.5.5,0,0,0,0-1Z' /%3E%3C/svg%3E\",\n offsetX: -30,\n offsetY: -30,\n};\n"]}
1
+ {"version":3,"file":"cursors.js","sourceRoot":"","sources":["../../../../src/lib/cursors.ts"],"names":[],"mappings":"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","sourcesContent":["import { Disposable, EventDispatcher } from '@vertexvis/utils';\n\n/**\n * Represents a built-in [browser CSS\n * cursor](https://developer.mozilla.org/en-US/docs/Web/CSS/cursor).\n */\nexport type CssCursor =\n | 'auto'\n | 'default'\n | 'none'\n | 'context-menu'\n | 'help'\n | 'pointer'\n | 'progress'\n | 'wait'\n | 'cell'\n | 'crosshair'\n | 'text'\n | 'vertical-text'\n | 'alias'\n | 'copy'\n | 'move'\n | 'no-drop'\n | 'not-allowed'\n | 'grab'\n | 'grabbing'\n | 'all-scroll'\n | 'col-resize'\n | 'row-resize'\n | 'n-resize'\n | 'e-resize'\n | 's-resize'\n | 'w-resize'\n | 'ne-resize'\n | 'nw-resize'\n | 'se-resize'\n | 'sw-resize'\n | 'ew-resize'\n | 'ns-resize'\n | 'nesw-resize'\n | 'nwse-resize'\n | 'zoom-in'\n | 'zoom-out'\n | string;\n\n/**\n * Represents a custom cursor that points to an image file and offset.\n */\nexport interface CustomCursor {\n url: string;\n offsetX?: number;\n offsetY?: number;\n}\n\n/**\n * Represents all possible cursor types.\n */\nexport type Cursor = CssCursor | CustomCursor;\n\ninterface CursorInstance extends Disposable {\n id: number;\n cursor: Cursor;\n priority: number;\n}\n\n/**\n * The cursor manager maintains a prioritized list of cursors for the viewer.\n *\n * Cursors with the highest priority will be considered active, where the most\n * recently added cursor will take precedence if there are multiple cursors with\n * the same priority.\n */\nexport class CursorManager {\n /**\n * A constant representing the lowest priority cursors.\n */\n public static readonly LOW_PRIORITY = 0;\n\n /**\n * A constant representing a priority between `LOW_PRIORITY` and\n * `HIGH_PRIORITY`.\n */\n public static readonly NORMAL_PRIORITY = 10;\n\n /**\n * A constant representing the high priority cursors.\n */\n public static readonly HIGH_PRIORITY = 20;\n\n /**\n * An event dispatcher that emits an event when a cursor is added or removed.\n *\n * @see {@link CursorManager.add} to add a cursor.\n * @see {@link CursorManager.getActiveCursor} to query the current cursor.\n */\n public readonly onChanged = new EventDispatcher<void>();\n\n private cursors: CursorInstance[] = [];\n\n private nextId = 0;\n\n /**\n * Adds a cursor to the cursor manager, and returns an identifier that can be\n * used to remove the cursor.\n *\n * @param cursor The cursor to add.\n * @param priority The priority of the cursor. Higher values have higher\n * \tpriority over lower values.\n * @returns An identifier for the cursor.\n * @see {@link CursorManager.getActiveCursor} to query the current cursor.\n */\n public add(\n cursor: Cursor,\n priority = CursorManager.NORMAL_PRIORITY\n ): Disposable {\n // Ensure a duplicate cursor will not be added to the cursor manager.\n // If a matching cursor exists, delete it before proceeding.\n // Note that deleting the old cursor and adding the new one results in the\n // new cursor taking precedent over other existing cursors with the same priority.\n const duplicateCursor = this.getExistingDuplicateCursor(cursor, priority);\n if (duplicateCursor != null) {\n this.remove(duplicateCursor.id);\n }\n\n const id = ++this.nextId;\n const instance = { id, cursor, priority, dispose: () => this.remove(id) };\n this.cursors.push(instance);\n this.onChanged.emit();\n return instance;\n }\n\n /**\n * Removes a cursor with the given ID, if it exists.\n *\n * @param cursorId The ID of the cursor to remove.\n */\n private remove(cursorId: number): void {\n const index = this.cursors.findIndex(({ id }) => id === cursorId);\n if (index >= 0) {\n this.cursors.splice(index, 1);\n this.onChanged.emit();\n }\n }\n\n /**\n * Checks to see if an existing cursor matches the provided cursor and priority level.\n * The matching cursor is returned if found.\n *\n * @param cursorToCheck The cursor to check for duplicates against.\n * @param priorityToCheck The priority level to check for duplicates against.\n */\n private getExistingDuplicateCursor(\n cursorToCheck: Cursor,\n priorityToCheck: number\n ): CursorInstance | undefined {\n return this.cursors.find(\n (cursor) =>\n cursor.cursor === cursorToCheck && cursor.priority === priorityToCheck\n );\n }\n\n /**\n * Returns the active cursor based on priority and insertion order.\n *\n * @see {@link CursorManager.add} to add a cursor.\n */\n public getActiveCursor(): Cursor | undefined {\n const sorted = this.cursors\n .concat()\n .reverse()\n .sort((a, b) => b.priority - a.priority);\n\n return sorted[0]?.cursor;\n }\n}\n\n// CSS SVG images need to be URL encoded: https://yoksel.github.io/url-encoder/\n\nexport const measurementCursor = {\n url: \"data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M21.5 8h-19a.5.5 0 00-.5.5v6a.5.5 0 00.5.5h19a.5.5 0 00.5-.5v-6a.5.5 0 00-.5-.5zm-.5 6H3V9h3v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2z' stroke='%23fff' stroke-width='1.25' stroke-opacity='0.5' stroke-miterlimit='10' shape-rendering='crispEdges'/%3E%3Cpath d='M21.5 8h-19a.5.5 0 00-.5.5v6a.5.5 0 00.5.5h19a.5.5 0 00.5-.5v-6a.5.5 0 00-.5-.5zm-.5 6H3V9h3v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2z' shape-rendering='crispEdges'/%3E%3C/svg%3E\",\n offsetX: -24,\n offsetY: -24,\n};\n\nexport const measurementWithArrowCursor = {\n url: \"data:image/svg+xml;utf8,%3Csvg id='icons' xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bstroke:%23fff;stroke-miterlimit:10;stroke-width:2px;%7D.cls-2%7Bfill:%23fff;%7D.cls-2,.cls-3%7Bfill-rule:evenodd;%7D%3C/style%3E%3C/defs%3E%3Cpath class='cls-1' d='M27.46,21h-19a.5.5,0,0,0-.5.5v6a.5.5,0,0,0,.5.5h19a.5.5,0,0,0,.5-.5v-6A.5.5,0,0,0,27.46,21ZM27,27H9V22h3v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2Z'/%3E%3Cpath d='M27.46,21h-19a.5.5,0,0,0-.5.5v6a.5.5,0,0,0,.5.5h19a.5.5,0,0,0,.5-.5v-6A.5.5,0,0,0,27.46,21ZM27,27H9V22h3v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2Z'/%3E%3Cpath class='cls-2' d='M1,17V1L12.59,12.62H5.81l-.41.12Z'/%3E%3Cpath class='cls-2' d='M10.08,17.69l-3.6,1.53L1.8,8.14,5.48,6.58Z'/%3E%3Cpath class='cls-3' d='M8.75,17l-1.84.77-3.1-7.37,1.84-.78Z'/%3E%3Cpath class='cls-3' d='M2,3.41V14.6l3-2.87.43-.14h4.76Z'/%3E%3C/svg%3E\",\n offsetX: -30,\n offsetY: -30,\n};\n\nexport const pinCursor = {\n url: \"data:image/svg+xml,%3Csvg width='36px' height='36px' viewBox='0 0 24 24' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cdefs%3E%3Cpath d='M12,2 C7.581722,2 4,5.581722 4,10 C4.00435812,11.7714969 4.41127263,13.5188357 5.19,15.11 C6.15517666,17.0237439 7.49502409,18.7240579 9.13,20.11 C9.86916736,20.7592093 10.6620019,21.3446357 11.5,21.86 L12,22.14 L12.5,21.86 C13.8750156,21.0120029 15.1296156,19.9827599 16.23,18.8 C17.2698142,17.7023203 18.1394508,16.4551671 18.81,15.1 C19.5872532,13.5118707 19.9941287,11.7681184 20,10 C20,5.581722 16.418278,2 12,2 Z M12,13 C10.3431458,13 9,11.6568542 9,10 C9,8.34314575 10.3431458,7 12,7 C13.6568542,7 15,8.34314575 15,10 C15,10.7956495 14.6839295,11.5587112 14.1213203,12.1213203 C13.5587112,12.6839295 12.7956495,13 12,13 Z' id='path-1'%3E%3C/path%3E%3C/defs%3E%3Cg id='icons/pin-filled' stroke='none' stroke-width='1' fill='none' fill-rule='evenodd'%3E%3Cmask id='mask-2' fill='white'%3E%3Cuse xlink:href='%23path-1'%3E%3C/use%3E%3C/mask%3E%3Cuse id='Shape' stroke='%23FAFAFA' fill='%23BDBDBD' fill-rule='nonzero' xlink:href='%23path-1'%3E%3C/use%3E%3C/g%3E%3C/svg%3E\",\n offsetX: 17,\n offsetY: 32,\n};\n\nexport const labelPinCursor = {\n url: \"data:image/svg+xml,%3Csvg width='36px' height='36px' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 16 24' %3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bfill:none;%7D.cls-2%7Bfill:%23616161;%7D.cls-3%7Bclip-path:url(%23clip-path);%7D%3C/style%3E%3CclipPath id='clip-path'%3E%3Ccircle cx='-576.76' cy='-107.26' r='4'/%3E%3C/clipPath%3E%3C/defs%3E%3Cpath d='M8,16H8a.48.48,0,0,1-.42-.23L5.75,13H3.51A1.5,1.5,0,0,1,2,11.5v-8A1.5,1.5,0,0,1,3.51,2h9A1.51,1.51,0,0,1,14,3.5v8a1.5,1.5,0,0,1-1.5,1.5H10.22L8.39,15.81A.5.5,0,0,1,8,16ZM3.51,3a.5.5,0,0,0-.5.5v8a.5.5,0,0,0,.5.5H6a.5.5,0,0,1,.42.23L8,14.61l1.55-2.38A.5.5,0,0,1,10,12h2.56a.5.5,0,0,0,.5-.5v-8a.51.51,0,0,0-.5-.5Z'/%3E%3Ccircle cx='8.01' cy='20' r='2'/%3E%3C/svg%3E%0A\",\n offsetX: 17,\n offsetY: 29,\n};\n\nexport const boxQueryCursor = {\n url: \"data:image/svg+xml;utf8,%3Csvg id='icons' xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bstroke:%23fff;stroke-miterlimit:10;stroke-width:2px;%7D.cls-2%7Bfill:%23fff;%7D.cls-2,.cls-3%7Bfill-rule:evenodd;%7D%3C/style%3E%3C/defs%3E%3Cpath class='cls-2' d='M1.25,17V1L12.59,12.62H5.81l-.41.12Z'/%3E%3Cpath class='cls-2' d='M10.33,17.69l-3.6,1.53L1.8,8.14,5.48,6.58Z'/%3E %3Cpath class='cls-3' d='M9,17l-1.84.77-3.1-7.37,1.84-.78Z'/%3E%3Cpath class='cls-3' d='M2.25,3.41V14.6l3-2.87.43-.14h4.76Z'/%3E%3Cpath class='cls-1' d='M21.36,22.5H15.5V16.64a.5.5,0,0,0-1,0V22.5H8.64a.5.5,0,0,0,0,1H14.5v5.86a.5.5,0,0,0,1,0V23.5h5.86a.5.5,0,0,0,0-1Z' /%3E %3Cpath d='M21.36,22.5H15.5V16.64a.5.5,0,0,0-1,0V22.5H8.64a.5.5,0,0,0,0,1H14.5v5.86a.5.5,0,0,0,1,0V23.5h5.86a.5.5,0,0,0,0-1Z' /%3E%3C/svg%3E\",\n offsetX: -30,\n offsetY: -30,\n};\n"]}
@@ -63,7 +63,13 @@ export class ModelViewController {
63
63
  * the scene view.
64
64
  */
65
65
  async unload() {
66
- this.stream.updateModelView({}, true);
66
+ await this.stream.updateModelView({}, true);
67
+ // Clear any cross-section added from the model view
68
+ await this.stream.updateCrossSectioning({
69
+ crossSectioning: {
70
+ sectionPlanes: [],
71
+ },
72
+ }, true);
67
73
  }
68
74
  }
69
75
  //# sourceMappingURL=controller.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"controller.js","sourceRoot":"","sources":["../../../../../src/lib/model-views/controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oDAAoD,CAAC;AAC3E,OAAO,EACL,yBAAyB,GAE1B,MAAM,iEAAiE,CAAC;AAIzE,OAAO,EAAE,SAAS,EAAE,MAAM,6CAA6C,CAAC;AAExE,OAAO,EAAE,cAAc,EAAe,YAAY,EAAE,MAAM,SAAS,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EACL,uBAAuB,EACvB,oCAAoC,GACrC,MAAM,UAAU,CAAC;AASlB;;GAEG;AACH,MAAM,OAAO,mBAAmB;EAC9B,YACU,MAA0B,EAC1B,MAAiB,EACjB,WAAwB,EACxB,gBAA0C;IAH1C,WAAM,GAAN,MAAM,CAAoB;IAC1B,WAAM,GAAN,MAAM,CAAW;IACjB,gBAAW,GAAX,WAAW,CAAa;IACxB,qBAAgB,GAAhB,gBAAgB,CAA0B;EACjD,CAAC;EAEJ;;;;;;;KAOG;EACI,KAAK,CAAC,UAAU,CACrB,MAAiB,EACjB,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,GAAG,EAAE,KAAwB,EAAE;IAE7D,MAAM,GAAG,GAA+B,MAAM,YAAY,CACxD,KAAK,EAAE,OAAO,EAAE,EAAE;MAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;MACzC,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;MAC9D,MAAM,GAAG,GAAG,IAAI,yBAAyB,EAAE,CAAC;MAE5C,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;MAClC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;MAExB,IAAI,cAAc,IAAI,IAAI,EAAE;QAC1B,MAAM,iBAAiB,GAAG,IAAI,SAAS,EAAE,CAAC;QAC1C,iBAAiB,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QAC3C,GAAG,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;OAC1C;MAED,MAAM,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;MACzB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;MACpB,IAAI,MAAM,IAAI,IAAI,EAAE;QAClB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;OACxB;MACD,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;MAElB,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC,CACF,CAAC;IAEF,OAAO,oCAAoC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;EAC9D,CAAC;EAED;;;;;KAKG;EACI,KAAK,CAAC,IAAI,CACf,WAAsB,EACtB,WAAsB;IAEtB,MAAM,aAAa,GAAG,uBAAuB,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC;IAC5E,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,aAAa,EAAE,EAAE,IAAI,CAAC,CAAC;EACvD,CAAC;EAED;;;;KAIG;EACI,KAAK,CAAC,MAAM;IACjB,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;EACxC,CAAC;CACF","sourcesContent":["import { Pager } from '@vertexvis/scene-view-protos/core/protos/paging_pb';\nimport {\n ListItemModelViewsRequest,\n ListItemModelViewsResponse,\n} from '@vertexvis/scene-view-protos/sceneview/protos/scene_view_api_pb';\nimport { SceneViewAPIClient } from '@vertexvis/scene-view-protos/sceneview/protos/scene_view_api_pb_service';\nimport { StreamApi } from '@vertexvis/stream-api';\nimport { UUID } from '@vertexvis/utils';\nimport { BoolValue } from 'google-protobuf/google/protobuf/wrappers_pb';\n\nimport { createMetadata, JwtProvider, requestUnary } from '../grpc';\nimport { toUuid2l } from '../mappers/uuid';\nimport {\n mapItemModelViewOrThrow,\n mapListItemModelViewsResponseOrThrow,\n} from './mapper';\nimport { ModelViewListResponse } from './types';\n\nexport interface ListByItemOptions {\n hasAnnotations?: boolean;\n cursor?: string;\n size?: number;\n}\n\n/**\n * The controller for managing the model views of a scene view.\n */\nexport class ModelViewController {\n public constructor(\n private client: SceneViewAPIClient,\n private stream: StreamApi,\n private jwtProvider: JwtProvider,\n private deviceIdProvider: () => string | undefined\n ) {}\n\n /**\n * Fetches a page of model views for a given item. The result includes a\n * cursor that can be used to fetch the next page of results.\n *\n * @param itemId The ID of the scene item to retrieve model views for.\n * @param options Options to configure fetching of items.\n * @returns A page of model views.\n */\n public async listByItem(\n itemId: UUID.UUID,\n { hasAnnotations, cursor, size = 50 }: ListByItemOptions = {}\n ): Promise<ModelViewListResponse> {\n const res: ListItemModelViewsResponse = await requestUnary(\n async (handler) => {\n const deviceId = this.deviceIdProvider();\n const meta = await createMetadata(this.jwtProvider, deviceId);\n const req = new ListItemModelViewsRequest();\n\n const itemId2l = toUuid2l(itemId);\n req.setItemId(itemId2l);\n\n if (hasAnnotations != null) {\n const hasAnnotationsVal = new BoolValue();\n hasAnnotationsVal.setValue(hasAnnotations);\n req.setHasAnnotations(hasAnnotationsVal);\n }\n\n const page = new Pager();\n page.setLimit(size);\n if (cursor != null) {\n page.setCursor(cursor);\n }\n req.setPage(page);\n\n this.client.listItemModelViews(req, meta, handler);\n }\n );\n\n return mapListItemModelViewsResponseOrThrow(res.toObject());\n }\n\n /**\n * Loads the provided model view within the current scene view.\n *\n * @param sceneItemId The ID of the scene item this model view is being loaded for.\n * @param modelViewId The ID of the model view to load.\n */\n public async load(\n sceneItemId: UUID.UUID,\n modelViewId: UUID.UUID\n ): Promise<void> {\n const itemModelView = mapItemModelViewOrThrow({ modelViewId, sceneItemId });\n this.stream.updateModelView({ itemModelView }, true);\n }\n\n /**\n * Unloads any previously loaded model view within the current scene view,\n * then performs a `reset` on the scene to return to the initial state for\n * the scene view.\n */\n public async unload(): Promise<void> {\n this.stream.updateModelView({}, true);\n }\n}\n"]}
1
+ {"version":3,"file":"controller.js","sourceRoot":"","sources":["../../../../../src/lib/model-views/controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oDAAoD,CAAC;AAC3E,OAAO,EACL,yBAAyB,GAE1B,MAAM,iEAAiE,CAAC;AAIzE,OAAO,EAAE,SAAS,EAAE,MAAM,6CAA6C,CAAC;AAExE,OAAO,EAAE,cAAc,EAAe,YAAY,EAAE,MAAM,SAAS,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EACL,uBAAuB,EACvB,oCAAoC,GACrC,MAAM,UAAU,CAAC;AASlB;;GAEG;AACH,MAAM,OAAO,mBAAmB;EAC9B,YACU,MAA0B,EAC1B,MAAiB,EACjB,WAAwB,EACxB,gBAA0C;IAH1C,WAAM,GAAN,MAAM,CAAoB;IAC1B,WAAM,GAAN,MAAM,CAAW;IACjB,gBAAW,GAAX,WAAW,CAAa;IACxB,qBAAgB,GAAhB,gBAAgB,CAA0B;EACjD,CAAC;EAEJ;;;;;;;KAOG;EACI,KAAK,CAAC,UAAU,CACrB,MAAiB,EACjB,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,GAAG,EAAE,KAAwB,EAAE;IAE7D,MAAM,GAAG,GAA+B,MAAM,YAAY,CACxD,KAAK,EAAE,OAAO,EAAE,EAAE;MAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;MACzC,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;MAC9D,MAAM,GAAG,GAAG,IAAI,yBAAyB,EAAE,CAAC;MAE5C,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;MAClC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;MAExB,IAAI,cAAc,IAAI,IAAI,EAAE;QAC1B,MAAM,iBAAiB,GAAG,IAAI,SAAS,EAAE,CAAC;QAC1C,iBAAiB,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QAC3C,GAAG,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;OAC1C;MAED,MAAM,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;MACzB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;MACpB,IAAI,MAAM,IAAI,IAAI,EAAE;QAClB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;OACxB;MACD,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;MAElB,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC,CACF,CAAC;IAEF,OAAO,oCAAoC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;EAC9D,CAAC;EAED;;;;;KAKG;EACI,KAAK,CAAC,IAAI,CACf,WAAsB,EACtB,WAAsB;IAEtB,MAAM,aAAa,GAAG,uBAAuB,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC;IAC5E,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,aAAa,EAAE,EAAE,IAAI,CAAC,CAAC;EACvD,CAAC;EAED;;;;KAIG;EACI,KAAK,CAAC,MAAM;IACjB,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAE5C,oDAAoD;IACpD,MAAM,IAAI,CAAC,MAAM,CAAC,qBAAqB,CACrC;MACE,eAAe,EAAE;QACf,aAAa,EAAE,EAAE;OAClB;KACF,EACD,IAAI,CACL,CAAC;EACJ,CAAC;CACF","sourcesContent":["import { Pager } from '@vertexvis/scene-view-protos/core/protos/paging_pb';\nimport {\n ListItemModelViewsRequest,\n ListItemModelViewsResponse,\n} from '@vertexvis/scene-view-protos/sceneview/protos/scene_view_api_pb';\nimport { SceneViewAPIClient } from '@vertexvis/scene-view-protos/sceneview/protos/scene_view_api_pb_service';\nimport { StreamApi } from '@vertexvis/stream-api';\nimport { UUID } from '@vertexvis/utils';\nimport { BoolValue } from 'google-protobuf/google/protobuf/wrappers_pb';\n\nimport { createMetadata, JwtProvider, requestUnary } from '../grpc';\nimport { toUuid2l } from '../mappers/uuid';\nimport {\n mapItemModelViewOrThrow,\n mapListItemModelViewsResponseOrThrow,\n} from './mapper';\nimport { ModelViewListResponse } from './types';\n\nexport interface ListByItemOptions {\n hasAnnotations?: boolean;\n cursor?: string;\n size?: number;\n}\n\n/**\n * The controller for managing the model views of a scene view.\n */\nexport class ModelViewController {\n public constructor(\n private client: SceneViewAPIClient,\n private stream: StreamApi,\n private jwtProvider: JwtProvider,\n private deviceIdProvider: () => string | undefined\n ) {}\n\n /**\n * Fetches a page of model views for a given item. The result includes a\n * cursor that can be used to fetch the next page of results.\n *\n * @param itemId The ID of the scene item to retrieve model views for.\n * @param options Options to configure fetching of items.\n * @returns A page of model views.\n */\n public async listByItem(\n itemId: UUID.UUID,\n { hasAnnotations, cursor, size = 50 }: ListByItemOptions = {}\n ): Promise<ModelViewListResponse> {\n const res: ListItemModelViewsResponse = await requestUnary(\n async (handler) => {\n const deviceId = this.deviceIdProvider();\n const meta = await createMetadata(this.jwtProvider, deviceId);\n const req = new ListItemModelViewsRequest();\n\n const itemId2l = toUuid2l(itemId);\n req.setItemId(itemId2l);\n\n if (hasAnnotations != null) {\n const hasAnnotationsVal = new BoolValue();\n hasAnnotationsVal.setValue(hasAnnotations);\n req.setHasAnnotations(hasAnnotationsVal);\n }\n\n const page = new Pager();\n page.setLimit(size);\n if (cursor != null) {\n page.setCursor(cursor);\n }\n req.setPage(page);\n\n this.client.listItemModelViews(req, meta, handler);\n }\n );\n\n return mapListItemModelViewsResponseOrThrow(res.toObject());\n }\n\n /**\n * Loads the provided model view within the current scene view.\n *\n * @param sceneItemId The ID of the scene item this model view is being loaded for.\n * @param modelViewId The ID of the model view to load.\n */\n public async load(\n sceneItemId: UUID.UUID,\n modelViewId: UUID.UUID\n ): Promise<void> {\n const itemModelView = mapItemModelViewOrThrow({ modelViewId, sceneItemId });\n this.stream.updateModelView({ itemModelView }, true);\n }\n\n /**\n * Unloads any previously loaded model view within the current scene view,\n * then performs a `reset` on the scene to return to the initial state for\n * the scene view.\n */\n public async unload(): Promise<void> {\n await this.stream.updateModelView({}, true);\n\n // Clear any cross-section added from the model view\n await this.stream.updateCrossSectioning(\n {\n crossSectioning: {\n sectionPlanes: [],\n },\n },\n true\n );\n }\n}\n"]}
@@ -48,14 +48,15 @@ export class ViewerStream extends StreamApi {
48
48
  this.deviceId = deviceId;
49
49
  this.config = config;
50
50
  if (this.state.type === 'disconnected') {
51
- return this.loadIfDisconnected(urn, cameraType);
51
+ await this.loadIfDisconnected(urn, cameraType);
52
52
  }
53
53
  else if (this.state.type === 'connection-failed') {
54
- return this.loadIfDisconnected(urn, cameraType);
54
+ await this.loadIfDisconnected(urn, cameraType);
55
55
  }
56
56
  else {
57
- return this.loadIfConnectingOrConnected(urn, this.state, cameraType);
57
+ await this.loadIfConnectingOrConnected(urn, this.state, cameraType);
58
58
  }
59
+ return this.state;
59
60
  }
60
61
  update(fields) {
61
62
  this.frameBgColor = fields.frameBgColor
@@ -1 +1 @@
1
- {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../../../../src/lib/stream/stream.ts"],"names":[],"mappings":"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","sourcesContent":["import { Dimensions } from '@vertexvis/geometry';\nimport {\n ConnectionDescriptor,\n currentDateAsProtoTimestamp,\n Settings,\n StreamApi,\n StreamRequestError,\n WebSocketClient,\n} from '@vertexvis/stream-api';\nimport {\n Async,\n Color,\n Disposable,\n EventDispatcher,\n Listener,\n Mapper,\n Objects,\n Uri,\n} from '@vertexvis/utils';\nimport deepEqual from 'fast-deep-equal';\n\nimport { Color3, StreamAttributes } from '../../interfaces';\nimport { Config, parseAndValidateConfig } from '../config';\nimport {\n CustomError,\n SceneRenderError,\n WebsocketConnectionError,\n} from '../errors';\nimport {\n fromPbFrameOrThrow,\n fromPbReconnectResponseOrThrow,\n fromPbRefreshTokenResponseOrThrow,\n fromPbStartStreamResponseOrThrow,\n fromPbSyncTimeResponseOrThrow,\n toPbCameraType,\n toPbRGBi,\n toPbStreamAttributes,\n} from '../mappers';\nimport { acknowledgeFrameRequests } from '../rendering';\nimport { Token } from '../token';\nimport {\n Frame,\n LoadableResource,\n Orientation,\n SynchronizedClock,\n} from '../types';\nimport { FrameCameraType } from '../types/frameCamera';\nimport { Resource, SuppliedIdQueryValue } from '../types/loadableResource';\nimport {\n Connected,\n Connecting,\n Reconnecting,\n ViewerStreamState,\n} from './state';\nimport { retryIfNotAborted } from './utils';\n\ntype StreamResult = Omit<\n Connected,\n 'type' | 'frame' | 'connection' | 'clock'\n> & { frame: Frame | undefined };\n\ninterface FrameStreamOptions {\n /**\n * The number of seconds before the token expires, when the token will be\n * refreshed. Defaults to 30 seconds.\n */\n tokenRefreshOffsetInSeconds?: number;\n\n /**\n * Indicates if debug logs will be emitted for websocket messages.\n */\n loggingEnabled?: boolean;\n\n /**\n * The number of seconds after the host goes offline before a reconnect is\n * attempted.\n */\n offlineThresholdInSeconds?: number;\n\n /**\n * The number of seconds before we consider loading a scene failed.\n */\n loadTimeoutInSeconds?: number;\n\n /**\n * Enable temporal refinement of still images.\n */\n enableTemporalRefinement?: boolean;\n}\n\ninterface UpdateFields {\n dimensions?: ViewerStream['dimensions'];\n streamAttributes?: ViewerStream['streamAttributes'];\n enableTemporalRefinement?: ViewerStream['enableTemporalRefinement'];\n frameBgColor?: ViewerStream['frameBgColor'];\n config?: ViewerStream['config'];\n clientId?: ViewerStream['clientId'];\n deviceId?: ViewerStream['deviceId'];\n}\n\nexport class ViewerStream extends StreamApi {\n private static WS_RECONNECT_DELAYS = [0, 1000, 1000, 5000];\n\n private dimensions: Dimensions.Dimensions;\n private streamAttributes: StreamAttributes;\n private enableTemporalRefinement: boolean;\n private frameBgColor: Color3;\n private config: Config;\n private clientId: string | undefined;\n private deviceId: string | undefined;\n private abortController?: AbortController;\n\n private state: ViewerStreamState = { type: 'disconnected' };\n private pausedState?: Connected;\n public readonly stateChanged = new EventDispatcher<ViewerStreamState>();\n\n private options: Required<Omit<FrameStreamOptions, 'loggingEnabled'>>;\n\n public constructor(ws: WebSocketClient, opts: FrameStreamOptions = {}) {\n super(ws, { loggingEnabled: opts.loggingEnabled });\n\n this.dimensions = Dimensions.create(0, 0);\n this.streamAttributes = {};\n this.enableTemporalRefinement = opts.enableTemporalRefinement ?? true;\n this.frameBgColor = Color.create(255, 255, 255);\n this.config = parseAndValidateConfig('platprod');\n\n this.options = {\n tokenRefreshOffsetInSeconds: opts.tokenRefreshOffsetInSeconds ?? 30,\n offlineThresholdInSeconds: opts.offlineThresholdInSeconds ?? 30,\n loadTimeoutInSeconds: opts.loadTimeoutInSeconds ?? 15,\n enableTemporalRefinement: opts.enableTemporalRefinement ?? true,\n };\n }\n\n public isPaused(): boolean {\n return this.pausedState != null;\n }\n\n public getState(): ViewerStreamState {\n return this.state;\n }\n\n public disconnect(): void {\n if (\n this.state.type !== 'disconnected' &&\n this.state.type !== 'connection-failed'\n ) {\n console.debug('Disconnecting websocket');\n this.state.connection.dispose();\n this.updateState({ type: 'disconnected' });\n }\n }\n\n public async load(\n urn: string,\n clientId: string | undefined,\n deviceId: string | undefined,\n config: Config = parseAndValidateConfig('platprod'),\n cameraType?: FrameCameraType\n ): Promise<void> {\n this.clientId = clientId;\n this.deviceId = deviceId;\n this.config = config;\n\n if (this.state.type === 'disconnected') {\n return this.loadIfDisconnected(urn, cameraType);\n } else if (this.state.type === 'connection-failed') {\n return this.loadIfDisconnected(urn, cameraType);\n } else {\n return this.loadIfConnectingOrConnected(urn, this.state, cameraType);\n }\n }\n\n public update(fields: UpdateFields): void {\n this.frameBgColor = fields.frameBgColor\n ? fields.frameBgColor\n : this.frameBgColor;\n\n if (\n fields.dimensions != null &&\n !deepEqual(fields.dimensions, this.dimensions)\n ) {\n this.dimensions = fields.dimensions;\n this.ifState('connected', () =>\n this.updateDimensions({ dimensions: this.getDimensions() })\n );\n }\n\n const streamAttributesAreDifferent = !deepEqual(\n this.streamAttributes,\n fields.streamAttributes\n );\n if (fields.streamAttributes != null && streamAttributesAreDifferent) {\n this.streamAttributes = fields.streamAttributes;\n this.ifState('connected', () =>\n this.updateStream({\n streamAttributes: toPbStreamAttributesOrThrow(this.streamAttributes),\n })\n );\n }\n\n if (\n fields.enableTemporalRefinement != null &&\n fields.enableTemporalRefinement !== this.enableTemporalRefinement\n ) {\n this.enableTemporalRefinement = fields.enableTemporalRefinement;\n\n if (this.state.type === 'connected') {\n this.closeAndReconnect(this.state);\n }\n }\n }\n\n public pause(): void {\n if (this.state.type === 'connected') {\n this.pausedState = this.state;\n\n console.debug(\n `Stream paused [stream-id=${this.pausedState.streamId}, scene-id=${this.pausedState.sceneId}, scene-view-id=${this.pausedState.sceneViewId}]`\n );\n\n this.disconnect();\n }\n }\n\n public async resume(): Promise<void> {\n if (this.pausedState != null) {\n console.debug(\n `Stream resumed [stream-id=${this.pausedState.streamId}, scene-id=${this.pausedState.sceneId}, scene-view-id=${this.pausedState.sceneViewId}]`\n );\n\n await this.connectToExistingStream(this.pausedState);\n\n this.pausedState = undefined;\n }\n }\n\n private async loadIfConnectingOrConnected(\n urn: string,\n state: Connected | Connecting | Reconnecting,\n cameraType?: FrameCameraType\n ): Promise<void> {\n const { resource: pResource, subResource: pSubResource } = state.resource;\n const resource = LoadableResource.fromUrn(urn);\n\n const hasResourceChanged = !Objects.isEqual(pResource, resource.resource);\n const hasSubResourceChanged = !Objects.isEqual(\n pSubResource,\n resource.subResource\n );\n const isConnecting =\n state.type === 'connecting' || state.type === 'reconnecting';\n const isConnected = state.type === 'connected';\n\n if (hasResourceChanged || (isConnecting && hasSubResourceChanged)) {\n this.disconnect();\n return this.loadIfDisconnected(urn);\n } else if (\n isConnected &&\n hasSubResourceChanged &&\n resource.subResource?.type === 'scene-view-state'\n ) {\n const suppliedIdQuery = resource.queries.find(\n (q) => q.type === 'supplied-id'\n ) as SuppliedIdQueryValue | undefined;\n\n const payload = {\n ...(resource.subResource.id != null\n ? { sceneViewStateId: { hex: resource.subResource.id } }\n : {}),\n ...(suppliedIdQuery != null\n ? { sceneViewStateSuppliedId: { value: suppliedIdQuery.id } }\n : {}),\n ...(cameraType != null\n ? { cameraType: toPbCameraTypeOrThrow(cameraType) }\n : {}),\n };\n\n await this.loadSceneViewState(payload);\n this.updateState({ ...state, resource });\n }\n }\n\n private async loadIfDisconnected(\n urn: string,\n cameraType?: FrameCameraType\n ): Promise<void> {\n try {\n await this.connectWithNewStream(\n LoadableResource.fromUrn(urn),\n cameraType\n );\n } catch (e) {\n if (e instanceof CustomError) {\n this.updateState({\n type: 'connection-failed',\n message: `Cannot load scene. ${e.message}`,\n error: e,\n });\n } else if (e instanceof StreamRequestError) {\n this.updateState({\n type: 'connection-failed',\n message: `Cannot load scene. Stream request failed to start stream.`,\n error: e,\n });\n } else {\n this.updateState({\n type: 'connection-failed',\n message: `Cannot load scene for unknown reason. See console logs.`,\n error: e,\n });\n }\n\n throw e;\n }\n }\n\n private connectWithNewStream(\n resource: Resource,\n cameraType?: FrameCameraType\n ): Promise<void> {\n return this.openWebsocketStream(resource, 'connecting', () =>\n this.requestNewStream(resource, cameraType)\n );\n }\n\n private connectToExistingStream(state: Connected): Promise<void> {\n return this.openWebsocketStream(\n state.resource,\n 'reconnecting',\n () => this.requestReconnectStream(state),\n { maxRetries: Number.POSITIVE_INFINITY }\n );\n }\n\n private async openWebsocketStream(\n resource: Resource,\n type: Connecting['type'] | Reconnecting['type'],\n requestStream: () => Promise<StreamResult>,\n { maxRetries = 3 }: { maxRetries?: number } = {}\n ): Promise<void> {\n const descriptor = getWebsocketDescriptor(\n getWebsocketUri(\n this.config,\n resource.resource,\n this.clientId,\n this.deviceId\n )\n );\n console.debug(`Initiating WS connection [uri=${descriptor.url}]`);\n\n // Ensure that any previous attempt to initiate a WebSocket connection has been\n // aborted prior to attempting to create a new connection. This prevents scenarios\n // where a previously initiated connection attempt is still in the `connecting`\n // state and gets closed, and the `Async.retry` utility attempts to connect again.\n this.abortController?.abort();\n const newAbortController = new AbortController();\n this.abortController = newAbortController;\n\n const settings = getStreamSettings(this.config);\n this.updateState({\n type,\n resource,\n connection: {\n dispose: () => {\n this.dispose();\n newAbortController.abort();\n },\n },\n });\n\n const connection = await Async.abort(\n newAbortController.signal,\n retryIfNotAborted(\n newAbortController.signal,\n () => this.connect(descriptor, settings),\n {\n dispose: () => {\n // Intentional empty dispose to prevent typing mismatches.\n },\n },\n {\n maxRetries,\n delaysInMs: ViewerStream.WS_RECONNECT_DELAYS,\n }\n )\n ).catch((e) => {\n throw new WebsocketConnectionError(\n 'Websocket connection failed.',\n e instanceof Error ? e : undefined\n );\n });\n\n if (!connection.aborted) {\n return this.requestNewOrExistingStream(\n resource,\n connection.result,\n requestStream\n );\n } else {\n this.updateState({ type: 'disconnected' });\n }\n }\n\n private async requestNewOrExistingStream(\n resource: Resource,\n connection: Disposable,\n requestStream: () => Promise<StreamResult>\n ): Promise<void> {\n const pendingClock = this.requestClock();\n\n const stream = await requestStream();\n console.debug(\n `Stream connected [stream-id=${stream.streamId}, scene-id=${stream.sceneId}, scene-view-id=${stream.sceneViewId}]`\n );\n\n const onRequest = this.onRequest((msg) => {\n const req = msg.request.drawFrame;\n if (req != null) {\n const frame = fromPbFrameOrThrow(stream.worldOrientation)(req);\n\n if (this.state.type === 'connected') {\n if (\n frame.depthBufferBytes != null ||\n this.state.frame.temporalRefinementCorrelationId !==\n frame.temporalRefinementCorrelationId\n ) {\n this.updateState({\n ...this.state,\n frame: frame,\n fallbackDepthBufferBytes: frame.depthBufferBytes,\n });\n } else {\n this.updateState({\n ...this.state,\n frame: frame.copy({\n depthBufferBytes: this.state.fallbackDepthBufferBytes,\n }),\n });\n }\n }\n }\n });\n\n const reconnect = this.reconnectWhenNeeded();\n const refreshToken = this.refreshTokenWhenExpired(stream.token);\n const acknowledgeFrameRequests = this.acknowledgeFrameRequests();\n const frame =\n stream.frame == null\n ? await this.waitForFrame(\n stream.worldOrientation,\n this.options.loadTimeoutInSeconds\n )\n : stream.frame;\n const clock = await pendingClock;\n console.debug(\n `Synchronized clocks [local-time=${clock.knownLocalTime.toISOString()}, remote-time=${clock.knownRemoteTime.toISOString()}]`\n );\n\n this.updateState({\n type: 'connected',\n connection: {\n dispose: () => {\n reconnect.dispose();\n onRequest.dispose();\n refreshToken.dispose();\n acknowledgeFrameRequests.dispose();\n connection.dispose();\n },\n },\n resource,\n streamId: stream.streamId,\n deviceId: stream.deviceId,\n sceneId: stream.sceneId,\n sceneViewId: stream.sceneViewId,\n worldOrientation: stream.worldOrientation,\n token: stream.token,\n frame,\n clock,\n fallbackDepthBufferBytes: undefined,\n });\n }\n\n private async requestNewStream(\n resource: Resource,\n cameraType?: FrameCameraType\n ): Promise<StreamResult> {\n const suppliedIdQuery = resource.queries.find(\n (q) => q.type === 'supplied-id'\n ) as SuppliedIdQueryValue | undefined;\n\n const res = fromPbStartStreamResponseOrThrow(\n await this.startStream({\n streamKey: { value: resource.resource.id },\n dimensions: this.getDimensions(),\n frameBackgroundColor: toPbColorOrThrow(this.frameBgColor),\n clientSupportsTemporalRefinement: this.enableTemporalRefinement,\n streamAttributes: toPbStreamAttributesOrThrow(this.streamAttributes),\n sceneViewStateId:\n resource.subResource?.type === 'scene-view-state' &&\n resource.subResource.id != null\n ? { hex: resource.subResource.id }\n : undefined,\n sceneViewStateSuppliedId:\n resource.subResource?.type === 'scene-view-state' &&\n suppliedIdQuery != null\n ? { value: suppliedIdQuery.id }\n : undefined,\n cameraType:\n cameraType != null ? toPbCameraTypeOrThrow(cameraType) : undefined,\n })\n );\n\n return {\n resource: resource,\n streamId: res.streamId,\n sceneId: res.sceneId,\n sceneViewId: res.sceneViewId,\n deviceId: res.sessionId,\n token: res.token,\n worldOrientation: res.worldOrientation,\n frame: undefined,\n fallbackDepthBufferBytes: undefined,\n };\n }\n\n private async requestReconnectStream(\n state: Connected\n ): Promise<StreamResult> {\n const res = fromPbReconnectResponseOrThrow(\n await this.reconnect({\n streamId: { hex: state.streamId },\n dimensions: this.getDimensions(),\n frameBackgroundColor: toPbColorOrThrow(this.frameBgColor),\n streamAttributes: toPbStreamAttributesOrThrow(this.streamAttributes),\n clientSupportsTemporalRefinement: this.enableTemporalRefinement,\n })\n );\n return { ...state, token: res.token };\n }\n\n private async requestClock(): Promise<SynchronizedClock> {\n const remoteTime = fromPbSyncTimeResponseOrThrow(\n await this.syncTime({\n requestTime: currentDateAsProtoTimestamp(),\n })\n );\n\n return new SynchronizedClock(remoteTime);\n }\n\n private reconnectWhenNeeded(): Disposable {\n const whenDisconnected = this.onClose(() => {\n if (this.state.type === 'connected') {\n this.closeAndReconnect(this.state);\n }\n });\n\n const whenRequested = this.onRequest((msg) => {\n const isReconnectMsg = msg.request.gracefulReconnection != null;\n if (isReconnectMsg && this.state.type === 'connected') {\n console.debug(\n 'Received request for graceful reconnect. Closing connection and attempting reconnect.'\n );\n this.closeAndReconnect(this.state);\n }\n });\n\n const whenOffline = this.reconnectWhenOffline();\n\n return {\n dispose: () => {\n whenDisconnected.dispose();\n whenRequested.dispose();\n whenOffline.dispose();\n },\n };\n }\n\n private refreshTokenWhenExpired(token: Token): Disposable {\n let timer: number;\n\n const startTimer = (token: Token): void => {\n const { tokenRefreshOffsetInSeconds } = this.options;\n const ms = token.remainingTimeInMs(tokenRefreshOffsetInSeconds);\n\n timer = window.setTimeout(async () => {\n const res = await this.refreshToken();\n const newToken = fromPbRefreshTokenResponseOrThrow(res);\n startTimer(newToken);\n if (this.state.type === 'connected') {\n this.updateState({ ...this.state, token: newToken });\n }\n }, ms);\n };\n\n startTimer(token);\n\n return { dispose: () => clearTimeout(timer) };\n }\n\n private reconnectWhenOffline(): Disposable {\n let timer: number;\n\n const clearTimer = (): void => window.clearTimeout(timer);\n\n const restartTimer = (): void => {\n clearTimer();\n\n const delayInSec = this.options.offlineThresholdInSeconds;\n console.debug(\n `Detected that host is offline. Will attempt reconnect in ${delayInSec}s.`\n );\n\n timer = window.setTimeout(() => {\n if (this.state.type === 'connected') {\n this.closeAndReconnect(this.state);\n }\n }, delayInSec * 1000);\n };\n\n const handleOnline = (): void => {\n console.debug('Detected that host is online.');\n clearTimer();\n };\n\n const handleOffline = (): void => restartTimer();\n\n window.addEventListener('offline', handleOffline);\n window.addEventListener('online', handleOnline);\n\n return {\n dispose: () => {\n clearTimer();\n window.removeEventListener('offline', handleOffline);\n window.removeEventListener('online', handleOnline);\n },\n };\n }\n\n private closeAndReconnect(state: Connected): Promise<void> {\n state.connection.dispose();\n return this.connectToExistingStream(state);\n }\n\n private async waitForFrame(\n worldOrientation: Orientation,\n timeoutInSeconds: number\n ): Promise<Frame> {\n let disposable: Disposable | undefined;\n\n try {\n return await Async.timeout(\n timeoutInSeconds * 1000,\n new Promise<Frame>((resolve) => {\n disposable = this.onRequest((msg) => {\n try {\n const req = msg.request.drawFrame;\n if (req != null) {\n const frame = fromPbFrameOrThrow(worldOrientation)(req);\n resolve(frame);\n }\n } finally {\n disposable?.dispose();\n }\n });\n })\n );\n } catch (e) {\n throw new SceneRenderError(\n `Frame timed out after ${timeoutInSeconds}s`,\n e instanceof Error ? e : undefined\n );\n } finally {\n disposable?.dispose();\n }\n }\n\n private acknowledgeFrameRequests(): Disposable {\n return this.onRequest(\n acknowledgeFrameRequests(this, () =>\n this.state.type === 'connected' ? this.state.clock : undefined\n )\n );\n }\n\n private updateState(state: ViewerStreamState): void {\n if (this.state !== state) {\n this.state = state;\n this.stateChanged.emit(this.state);\n }\n }\n\n private getDimensions(): Dimensions.Dimensions {\n if (Dimensions.area(this.dimensions) === 0) {\n // Ensure we always request at least a 1-pixel frame, even if the dimensions\n // haven't been set higher than zero.\n return Dimensions.create(1, 1);\n }\n return this.dimensions;\n }\n\n private ifState<T>(\n state: ViewerStreamState['type'],\n f: () => T\n ): T | undefined {\n if (this.state.type === state) {\n return f();\n }\n }\n\n public onStateChanged(listener: Listener<ViewerStreamState>): Disposable {\n return this.stateChanged.on(listener);\n }\n}\n\nconst toPbStreamAttributesOrThrow = Mapper.ifInvalidThrow(toPbStreamAttributes);\nconst toPbColorOrThrow = Mapper.ifInvalidThrow(toPbRGBi);\nconst toPbCameraTypeOrThrow = Mapper.ifInvalidThrow(toPbCameraType);\n\nfunction getStreamSettings(config: Config): Settings {\n return {\n EXPERIMENTAL_frameDelivery: {\n ...config.EXPERIMENTAL_frameDelivery,\n rateLimitingEnabled: config.flags.throttleFrameDelivery,\n },\n EXPERIMENTAL_adaptiveRendering: {\n ...config.EXPERIMENTAL_adaptiveRendering,\n enabled: config.flags.adaptiveRendering,\n },\n EXPERIMENTAL_qualityOfService: {\n ...config.EXPERIMENTAL_qualityOfService,\n },\n };\n}\n\nfunction getWebsocketDescriptor(uri: Uri.Uri): ConnectionDescriptor {\n return {\n url: Uri.toString(uri),\n protocols: ['ws.vertexvis.com'],\n };\n}\n\nfunction getWebsocketUri(\n config: Config,\n resource: LoadableResource.LoadableResource,\n clientId?: string,\n deviceId?: string\n): Uri.Uri {\n if (clientId != null) {\n return Uri.appendPath(\n Uri.toString(\n Uri.parseAndAddParams('/ws', {\n clientId,\n deviceId,\n })\n ),\n Uri.parse(config.network.renderingHost)\n );\n } else {\n return Uri.appendPath(\n `/stream-keys/${resource.id}/session`,\n Uri.parse(config.network.renderingHost)\n );\n }\n}\n"]}
1
+ {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../../../../src/lib/stream/stream.ts"],"names":[],"mappings":"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","sourcesContent":["import { Dimensions } from '@vertexvis/geometry';\nimport {\n ConnectionDescriptor,\n currentDateAsProtoTimestamp,\n Settings,\n StreamApi,\n StreamRequestError,\n WebSocketClient,\n} from '@vertexvis/stream-api';\nimport {\n Async,\n Color,\n Disposable,\n EventDispatcher,\n Listener,\n Mapper,\n Objects,\n Uri,\n} from '@vertexvis/utils';\nimport deepEqual from 'fast-deep-equal';\n\nimport { Color3, StreamAttributes } from '../../interfaces';\nimport { Config, parseAndValidateConfig } from '../config';\nimport {\n CustomError,\n SceneRenderError,\n WebsocketConnectionError,\n} from '../errors';\nimport {\n fromPbFrameOrThrow,\n fromPbReconnectResponseOrThrow,\n fromPbRefreshTokenResponseOrThrow,\n fromPbStartStreamResponseOrThrow,\n fromPbSyncTimeResponseOrThrow,\n toPbCameraType,\n toPbRGBi,\n toPbStreamAttributes,\n} from '../mappers';\nimport { acknowledgeFrameRequests } from '../rendering';\nimport { Token } from '../token';\nimport {\n Frame,\n LoadableResource,\n Orientation,\n SynchronizedClock,\n} from '../types';\nimport { FrameCameraType } from '../types/frameCamera';\nimport { Resource, SuppliedIdQueryValue } from '../types/loadableResource';\nimport {\n Connected,\n Connecting,\n Reconnecting,\n ViewerStreamState,\n} from './state';\nimport { retryIfNotAborted } from './utils';\n\ntype StreamResult = Omit<\n Connected,\n 'type' | 'frame' | 'connection' | 'clock'\n> & { frame: Frame | undefined };\n\ninterface FrameStreamOptions {\n /**\n * The number of seconds before the token expires, when the token will be\n * refreshed. Defaults to 30 seconds.\n */\n tokenRefreshOffsetInSeconds?: number;\n\n /**\n * Indicates if debug logs will be emitted for websocket messages.\n */\n loggingEnabled?: boolean;\n\n /**\n * The number of seconds after the host goes offline before a reconnect is\n * attempted.\n */\n offlineThresholdInSeconds?: number;\n\n /**\n * The number of seconds before we consider loading a scene failed.\n */\n loadTimeoutInSeconds?: number;\n\n /**\n * Enable temporal refinement of still images.\n */\n enableTemporalRefinement?: boolean;\n}\n\ninterface UpdateFields {\n dimensions?: ViewerStream['dimensions'];\n streamAttributes?: ViewerStream['streamAttributes'];\n enableTemporalRefinement?: ViewerStream['enableTemporalRefinement'];\n frameBgColor?: ViewerStream['frameBgColor'];\n config?: ViewerStream['config'];\n clientId?: ViewerStream['clientId'];\n deviceId?: ViewerStream['deviceId'];\n}\n\nexport class ViewerStream extends StreamApi {\n private static WS_RECONNECT_DELAYS = [0, 1000, 1000, 5000];\n\n private dimensions: Dimensions.Dimensions;\n private streamAttributes: StreamAttributes;\n private enableTemporalRefinement: boolean;\n private frameBgColor: Color3;\n private config: Config;\n private clientId: string | undefined;\n private deviceId: string | undefined;\n private abortController?: AbortController;\n\n private state: ViewerStreamState = { type: 'disconnected' };\n private pausedState?: Connected;\n public readonly stateChanged = new EventDispatcher<ViewerStreamState>();\n\n private options: Required<Omit<FrameStreamOptions, 'loggingEnabled'>>;\n\n public constructor(ws: WebSocketClient, opts: FrameStreamOptions = {}) {\n super(ws, { loggingEnabled: opts.loggingEnabled });\n\n this.dimensions = Dimensions.create(0, 0);\n this.streamAttributes = {};\n this.enableTemporalRefinement = opts.enableTemporalRefinement ?? true;\n this.frameBgColor = Color.create(255, 255, 255);\n this.config = parseAndValidateConfig('platprod');\n\n this.options = {\n tokenRefreshOffsetInSeconds: opts.tokenRefreshOffsetInSeconds ?? 30,\n offlineThresholdInSeconds: opts.offlineThresholdInSeconds ?? 30,\n loadTimeoutInSeconds: opts.loadTimeoutInSeconds ?? 15,\n enableTemporalRefinement: opts.enableTemporalRefinement ?? true,\n };\n }\n\n public isPaused(): boolean {\n return this.pausedState != null;\n }\n\n public getState(): ViewerStreamState {\n return this.state;\n }\n\n public disconnect(): void {\n if (\n this.state.type !== 'disconnected' &&\n this.state.type !== 'connection-failed'\n ) {\n console.debug('Disconnecting websocket');\n this.state.connection.dispose();\n this.updateState({ type: 'disconnected' });\n }\n }\n\n public async load(\n urn: string,\n clientId: string | undefined,\n deviceId: string | undefined,\n config: Config = parseAndValidateConfig('platprod'),\n cameraType?: FrameCameraType\n ): Promise<ViewerStreamState> {\n this.clientId = clientId;\n this.deviceId = deviceId;\n this.config = config;\n\n if (this.state.type === 'disconnected') {\n await this.loadIfDisconnected(urn, cameraType);\n } else if (this.state.type === 'connection-failed') {\n await this.loadIfDisconnected(urn, cameraType);\n } else {\n await this.loadIfConnectingOrConnected(urn, this.state, cameraType);\n }\n return this.state;\n }\n\n public update(fields: UpdateFields): void {\n this.frameBgColor = fields.frameBgColor\n ? fields.frameBgColor\n : this.frameBgColor;\n\n if (\n fields.dimensions != null &&\n !deepEqual(fields.dimensions, this.dimensions)\n ) {\n this.dimensions = fields.dimensions;\n this.ifState('connected', () =>\n this.updateDimensions({ dimensions: this.getDimensions() })\n );\n }\n\n const streamAttributesAreDifferent = !deepEqual(\n this.streamAttributes,\n fields.streamAttributes\n );\n if (fields.streamAttributes != null && streamAttributesAreDifferent) {\n this.streamAttributes = fields.streamAttributes;\n this.ifState('connected', () =>\n this.updateStream({\n streamAttributes: toPbStreamAttributesOrThrow(this.streamAttributes),\n })\n );\n }\n\n if (\n fields.enableTemporalRefinement != null &&\n fields.enableTemporalRefinement !== this.enableTemporalRefinement\n ) {\n this.enableTemporalRefinement = fields.enableTemporalRefinement;\n\n if (this.state.type === 'connected') {\n this.closeAndReconnect(this.state);\n }\n }\n }\n\n public pause(): void {\n if (this.state.type === 'connected') {\n this.pausedState = this.state;\n\n console.debug(\n `Stream paused [stream-id=${this.pausedState.streamId}, scene-id=${this.pausedState.sceneId}, scene-view-id=${this.pausedState.sceneViewId}]`\n );\n\n this.disconnect();\n }\n }\n\n public async resume(): Promise<void> {\n if (this.pausedState != null) {\n console.debug(\n `Stream resumed [stream-id=${this.pausedState.streamId}, scene-id=${this.pausedState.sceneId}, scene-view-id=${this.pausedState.sceneViewId}]`\n );\n\n await this.connectToExistingStream(this.pausedState);\n\n this.pausedState = undefined;\n }\n }\n\n private async loadIfConnectingOrConnected(\n urn: string,\n state: Connected | Connecting | Reconnecting,\n cameraType?: FrameCameraType\n ): Promise<void> {\n const { resource: pResource, subResource: pSubResource } = state.resource;\n const resource = LoadableResource.fromUrn(urn);\n\n const hasResourceChanged = !Objects.isEqual(pResource, resource.resource);\n const hasSubResourceChanged = !Objects.isEqual(\n pSubResource,\n resource.subResource\n );\n const isConnecting =\n state.type === 'connecting' || state.type === 'reconnecting';\n const isConnected = state.type === 'connected';\n\n if (hasResourceChanged || (isConnecting && hasSubResourceChanged)) {\n this.disconnect();\n return this.loadIfDisconnected(urn);\n } else if (\n isConnected &&\n hasSubResourceChanged &&\n resource.subResource?.type === 'scene-view-state'\n ) {\n const suppliedIdQuery = resource.queries.find(\n (q) => q.type === 'supplied-id'\n ) as SuppliedIdQueryValue | undefined;\n\n const payload = {\n ...(resource.subResource.id != null\n ? { sceneViewStateId: { hex: resource.subResource.id } }\n : {}),\n ...(suppliedIdQuery != null\n ? { sceneViewStateSuppliedId: { value: suppliedIdQuery.id } }\n : {}),\n ...(cameraType != null\n ? { cameraType: toPbCameraTypeOrThrow(cameraType) }\n : {}),\n };\n\n await this.loadSceneViewState(payload);\n this.updateState({ ...state, resource });\n }\n }\n\n private async loadIfDisconnected(\n urn: string,\n cameraType?: FrameCameraType\n ): Promise<void> {\n try {\n await this.connectWithNewStream(\n LoadableResource.fromUrn(urn),\n cameraType\n );\n } catch (e) {\n if (e instanceof CustomError) {\n this.updateState({\n type: 'connection-failed',\n message: `Cannot load scene. ${e.message}`,\n error: e,\n });\n } else if (e instanceof StreamRequestError) {\n this.updateState({\n type: 'connection-failed',\n message: `Cannot load scene. Stream request failed to start stream.`,\n error: e,\n });\n } else {\n this.updateState({\n type: 'connection-failed',\n message: `Cannot load scene for unknown reason. See console logs.`,\n error: e,\n });\n }\n\n throw e;\n }\n }\n\n private connectWithNewStream(\n resource: Resource,\n cameraType?: FrameCameraType\n ): Promise<void> {\n return this.openWebsocketStream(resource, 'connecting', () =>\n this.requestNewStream(resource, cameraType)\n );\n }\n\n private connectToExistingStream(state: Connected): Promise<void> {\n return this.openWebsocketStream(\n state.resource,\n 'reconnecting',\n () => this.requestReconnectStream(state),\n { maxRetries: Number.POSITIVE_INFINITY }\n );\n }\n\n private async openWebsocketStream(\n resource: Resource,\n type: Connecting['type'] | Reconnecting['type'],\n requestStream: () => Promise<StreamResult>,\n { maxRetries = 3 }: { maxRetries?: number } = {}\n ): Promise<void> {\n const descriptor = getWebsocketDescriptor(\n getWebsocketUri(\n this.config,\n resource.resource,\n this.clientId,\n this.deviceId\n )\n );\n console.debug(`Initiating WS connection [uri=${descriptor.url}]`);\n\n // Ensure that any previous attempt to initiate a WebSocket connection has been\n // aborted prior to attempting to create a new connection. This prevents scenarios\n // where a previously initiated connection attempt is still in the `connecting`\n // state and gets closed, and the `Async.retry` utility attempts to connect again.\n this.abortController?.abort();\n const newAbortController = new AbortController();\n this.abortController = newAbortController;\n\n const settings = getStreamSettings(this.config);\n this.updateState({\n type,\n resource,\n connection: {\n dispose: () => {\n this.dispose();\n newAbortController.abort();\n },\n },\n });\n\n const connection = await Async.abort(\n newAbortController.signal,\n retryIfNotAborted(\n newAbortController.signal,\n () => this.connect(descriptor, settings),\n {\n dispose: () => {\n // Intentional empty dispose to prevent typing mismatches.\n },\n },\n {\n maxRetries,\n delaysInMs: ViewerStream.WS_RECONNECT_DELAYS,\n }\n )\n ).catch((e) => {\n throw new WebsocketConnectionError(\n 'Websocket connection failed.',\n e instanceof Error ? e : undefined\n );\n });\n\n if (!connection.aborted) {\n return this.requestNewOrExistingStream(\n resource,\n connection.result,\n requestStream\n );\n } else {\n this.updateState({ type: 'disconnected' });\n }\n }\n\n private async requestNewOrExistingStream(\n resource: Resource,\n connection: Disposable,\n requestStream: () => Promise<StreamResult>\n ): Promise<void> {\n const pendingClock = this.requestClock();\n\n const stream = await requestStream();\n console.debug(\n `Stream connected [stream-id=${stream.streamId}, scene-id=${stream.sceneId}, scene-view-id=${stream.sceneViewId}]`\n );\n\n const onRequest = this.onRequest((msg) => {\n const req = msg.request.drawFrame;\n if (req != null) {\n const frame = fromPbFrameOrThrow(stream.worldOrientation)(req);\n\n if (this.state.type === 'connected') {\n if (\n frame.depthBufferBytes != null ||\n this.state.frame.temporalRefinementCorrelationId !==\n frame.temporalRefinementCorrelationId\n ) {\n this.updateState({\n ...this.state,\n frame: frame,\n fallbackDepthBufferBytes: frame.depthBufferBytes,\n });\n } else {\n this.updateState({\n ...this.state,\n frame: frame.copy({\n depthBufferBytes: this.state.fallbackDepthBufferBytes,\n }),\n });\n }\n }\n }\n });\n\n const reconnect = this.reconnectWhenNeeded();\n const refreshToken = this.refreshTokenWhenExpired(stream.token);\n const acknowledgeFrameRequests = this.acknowledgeFrameRequests();\n const frame =\n stream.frame == null\n ? await this.waitForFrame(\n stream.worldOrientation,\n this.options.loadTimeoutInSeconds\n )\n : stream.frame;\n const clock = await pendingClock;\n console.debug(\n `Synchronized clocks [local-time=${clock.knownLocalTime.toISOString()}, remote-time=${clock.knownRemoteTime.toISOString()}]`\n );\n\n this.updateState({\n type: 'connected',\n connection: {\n dispose: () => {\n reconnect.dispose();\n onRequest.dispose();\n refreshToken.dispose();\n acknowledgeFrameRequests.dispose();\n connection.dispose();\n },\n },\n resource,\n streamId: stream.streamId,\n deviceId: stream.deviceId,\n sceneId: stream.sceneId,\n sceneViewId: stream.sceneViewId,\n worldOrientation: stream.worldOrientation,\n token: stream.token,\n frame,\n clock,\n fallbackDepthBufferBytes: undefined,\n });\n }\n\n private async requestNewStream(\n resource: Resource,\n cameraType?: FrameCameraType\n ): Promise<StreamResult> {\n const suppliedIdQuery = resource.queries.find(\n (q) => q.type === 'supplied-id'\n ) as SuppliedIdQueryValue | undefined;\n\n const res = fromPbStartStreamResponseOrThrow(\n await this.startStream({\n streamKey: { value: resource.resource.id },\n dimensions: this.getDimensions(),\n frameBackgroundColor: toPbColorOrThrow(this.frameBgColor),\n clientSupportsTemporalRefinement: this.enableTemporalRefinement,\n streamAttributes: toPbStreamAttributesOrThrow(this.streamAttributes),\n sceneViewStateId:\n resource.subResource?.type === 'scene-view-state' &&\n resource.subResource.id != null\n ? { hex: resource.subResource.id }\n : undefined,\n sceneViewStateSuppliedId:\n resource.subResource?.type === 'scene-view-state' &&\n suppliedIdQuery != null\n ? { value: suppliedIdQuery.id }\n : undefined,\n cameraType:\n cameraType != null ? toPbCameraTypeOrThrow(cameraType) : undefined,\n })\n );\n\n return {\n resource: resource,\n streamId: res.streamId,\n sceneId: res.sceneId,\n sceneViewId: res.sceneViewId,\n deviceId: res.sessionId,\n token: res.token,\n worldOrientation: res.worldOrientation,\n frame: undefined,\n fallbackDepthBufferBytes: undefined,\n };\n }\n\n private async requestReconnectStream(\n state: Connected\n ): Promise<StreamResult> {\n const res = fromPbReconnectResponseOrThrow(\n await this.reconnect({\n streamId: { hex: state.streamId },\n dimensions: this.getDimensions(),\n frameBackgroundColor: toPbColorOrThrow(this.frameBgColor),\n streamAttributes: toPbStreamAttributesOrThrow(this.streamAttributes),\n clientSupportsTemporalRefinement: this.enableTemporalRefinement,\n })\n );\n return { ...state, token: res.token };\n }\n\n private async requestClock(): Promise<SynchronizedClock> {\n const remoteTime = fromPbSyncTimeResponseOrThrow(\n await this.syncTime({\n requestTime: currentDateAsProtoTimestamp(),\n })\n );\n\n return new SynchronizedClock(remoteTime);\n }\n\n private reconnectWhenNeeded(): Disposable {\n const whenDisconnected = this.onClose(() => {\n if (this.state.type === 'connected') {\n this.closeAndReconnect(this.state);\n }\n });\n\n const whenRequested = this.onRequest((msg) => {\n const isReconnectMsg = msg.request.gracefulReconnection != null;\n if (isReconnectMsg && this.state.type === 'connected') {\n console.debug(\n 'Received request for graceful reconnect. Closing connection and attempting reconnect.'\n );\n this.closeAndReconnect(this.state);\n }\n });\n\n const whenOffline = this.reconnectWhenOffline();\n\n return {\n dispose: () => {\n whenDisconnected.dispose();\n whenRequested.dispose();\n whenOffline.dispose();\n },\n };\n }\n\n private refreshTokenWhenExpired(token: Token): Disposable {\n let timer: number;\n\n const startTimer = (token: Token): void => {\n const { tokenRefreshOffsetInSeconds } = this.options;\n const ms = token.remainingTimeInMs(tokenRefreshOffsetInSeconds);\n\n timer = window.setTimeout(async () => {\n const res = await this.refreshToken();\n const newToken = fromPbRefreshTokenResponseOrThrow(res);\n startTimer(newToken);\n if (this.state.type === 'connected') {\n this.updateState({ ...this.state, token: newToken });\n }\n }, ms);\n };\n\n startTimer(token);\n\n return { dispose: () => clearTimeout(timer) };\n }\n\n private reconnectWhenOffline(): Disposable {\n let timer: number;\n\n const clearTimer = (): void => window.clearTimeout(timer);\n\n const restartTimer = (): void => {\n clearTimer();\n\n const delayInSec = this.options.offlineThresholdInSeconds;\n console.debug(\n `Detected that host is offline. Will attempt reconnect in ${delayInSec}s.`\n );\n\n timer = window.setTimeout(() => {\n if (this.state.type === 'connected') {\n this.closeAndReconnect(this.state);\n }\n }, delayInSec * 1000);\n };\n\n const handleOnline = (): void => {\n console.debug('Detected that host is online.');\n clearTimer();\n };\n\n const handleOffline = (): void => restartTimer();\n\n window.addEventListener('offline', handleOffline);\n window.addEventListener('online', handleOnline);\n\n return {\n dispose: () => {\n clearTimer();\n window.removeEventListener('offline', handleOffline);\n window.removeEventListener('online', handleOnline);\n },\n };\n }\n\n private closeAndReconnect(state: Connected): Promise<void> {\n state.connection.dispose();\n return this.connectToExistingStream(state);\n }\n\n private async waitForFrame(\n worldOrientation: Orientation,\n timeoutInSeconds: number\n ): Promise<Frame> {\n let disposable: Disposable | undefined;\n\n try {\n return await Async.timeout(\n timeoutInSeconds * 1000,\n new Promise<Frame>((resolve) => {\n disposable = this.onRequest((msg) => {\n try {\n const req = msg.request.drawFrame;\n if (req != null) {\n const frame = fromPbFrameOrThrow(worldOrientation)(req);\n resolve(frame);\n }\n } finally {\n disposable?.dispose();\n }\n });\n })\n );\n } catch (e) {\n throw new SceneRenderError(\n `Frame timed out after ${timeoutInSeconds}s`,\n e instanceof Error ? e : undefined\n );\n } finally {\n disposable?.dispose();\n }\n }\n\n private acknowledgeFrameRequests(): Disposable {\n return this.onRequest(\n acknowledgeFrameRequests(this, () =>\n this.state.type === 'connected' ? this.state.clock : undefined\n )\n );\n }\n\n private updateState(state: ViewerStreamState): void {\n if (this.state !== state) {\n this.state = state;\n this.stateChanged.emit(this.state);\n }\n }\n\n private getDimensions(): Dimensions.Dimensions {\n if (Dimensions.area(this.dimensions) === 0) {\n // Ensure we always request at least a 1-pixel frame, even if the dimensions\n // haven't been set higher than zero.\n return Dimensions.create(1, 1);\n }\n return this.dimensions;\n }\n\n private ifState<T>(\n state: ViewerStreamState['type'],\n f: () => T\n ): T | undefined {\n if (this.state.type === state) {\n return f();\n }\n }\n\n public onStateChanged(listener: Listener<ViewerStreamState>): Disposable {\n return this.stateChanged.on(listener);\n }\n}\n\nconst toPbStreamAttributesOrThrow = Mapper.ifInvalidThrow(toPbStreamAttributes);\nconst toPbColorOrThrow = Mapper.ifInvalidThrow(toPbRGBi);\nconst toPbCameraTypeOrThrow = Mapper.ifInvalidThrow(toPbCameraType);\n\nfunction getStreamSettings(config: Config): Settings {\n return {\n EXPERIMENTAL_frameDelivery: {\n ...config.EXPERIMENTAL_frameDelivery,\n rateLimitingEnabled: config.flags.throttleFrameDelivery,\n },\n EXPERIMENTAL_adaptiveRendering: {\n ...config.EXPERIMENTAL_adaptiveRendering,\n enabled: config.flags.adaptiveRendering,\n },\n EXPERIMENTAL_qualityOfService: {\n ...config.EXPERIMENTAL_qualityOfService,\n },\n };\n}\n\nfunction getWebsocketDescriptor(uri: Uri.Uri): ConnectionDescriptor {\n return {\n url: Uri.toString(uri),\n protocols: ['ws.vertexvis.com'],\n };\n}\n\nfunction getWebsocketUri(\n config: Config,\n resource: LoadableResource.LoadableResource,\n clientId?: string,\n deviceId?: string\n): Uri.Uri {\n if (clientId != null) {\n return Uri.appendPath(\n Uri.toString(\n Uri.parseAndAddParams('/ws', {\n clientId,\n deviceId,\n })\n ),\n Uri.parse(config.network.renderingHost)\n );\n } else {\n return Uri.appendPath(\n `/stream-keys/${resource.id}/session`,\n Uri.parse(config.network.renderingHost)\n );\n }\n}\n"]}
@@ -30,7 +30,7 @@ export async function loadViewerStreamKey(urn, { viewer, stream, ws }, { token =
30
30
  // Emit frame drawn on next event loop
31
31
  await connecting;
32
32
  await Async.delay(10);
33
- beforeConnected === null || beforeConnected === void 0 ? void 0 : beforeConnected();
33
+ await (beforeConnected === null || beforeConnected === void 0 ? void 0 : beforeConnected());
34
34
  ws.receiveMessage(encode(StreamFixtures.Requests.drawFrame({
35
35
  payload: Fixtures.drawFramePayloadPerspective,
36
36
  })));
@@ -1 +1 @@
1
- {"version":3,"file":"viewer.js","sourceRoot":"","sources":["../../../../src/testing/viewer.ts"],"names":[],"mappings":"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","sourcesContent":["import { vertexvis } from '@vertexvis/frame-streaming-protos';\nimport {\n encode,\n Fixtures as StreamFixtures,\n WebSocketClientMock,\n} from '@vertexvis/stream-api';\nimport { Async } from '@vertexvis/utils';\n\nimport { ViewerStream } from '../lib/stream/stream';\nimport * as Fixtures from './fixtures';\nimport { random } from './random';\n\ninterface ViewerStreamOperationCtx {\n stream: ViewerStream;\n ws: WebSocketClientMock;\n viewer: HTMLVertexViewerElement;\n}\n\ninterface LoadViewerStreamKeyOptions {\n token?: string;\n beforeConnected?: VoidFunction;\n}\n\nexport const key1 = 'urn:vertex:stream-key:123';\n\nexport const key2 = 'urn:vertex:stream-key:234';\n\nexport function makeViewerStream(): {\n stream: ViewerStream;\n ws: WebSocketClientMock;\n} {\n const ws = new WebSocketClientMock();\n const stream = new ViewerStream(ws);\n return { stream, ws };\n}\n\nexport async function loadViewerStreamKey(\n urn: string,\n { viewer, stream, ws }: ViewerStreamOperationCtx,\n {\n token = random.string({ alpha: true }),\n beforeConnected,\n }: LoadViewerStreamKeyOptions = {}\n): Promise<void> {\n jest.spyOn(stream, 'startStream').mockResolvedValue(\n StreamFixtures.Responses.startStream({\n result: {\n token: {\n token: token,\n expiresIn: new Date().getTime() + 10000,\n },\n },\n }).response\n );\n jest\n .spyOn(stream, 'syncTime')\n .mockResolvedValue(StreamFixtures.Responses.syncTime().response);\n\n const connecting = stream.stateChanged.onceWhen(\n (s) => s.type === 'connecting'\n );\n const loaded = viewer.load(urn);\n\n // Emit frame drawn on next event loop\n await connecting;\n await Async.delay(10);\n beforeConnected?.();\n ws.receiveMessage(\n encode(\n StreamFixtures.Requests.drawFrame({\n payload: Fixtures.drawFramePayloadPerspective,\n })\n )\n );\n await loaded;\n}\n\ninterface GracefulReconnectOptions<T = void> {\n beforeReconnect?: () => Promise<T>;\n}\n\nexport async function gracefulReconnect<T = void>(\n { stream, ws }: ViewerStreamOperationCtx,\n { beforeReconnect }: GracefulReconnectOptions<T> = {}\n): Promise<T | undefined> {\n jest\n .spyOn(stream, 'reconnect')\n .mockResolvedValue(StreamFixtures.Responses.reconnect().response);\n jest\n .spyOn(stream, 'syncTime')\n .mockResolvedValue(StreamFixtures.Responses.syncTime().response);\n\n const connecting = stream.stateChanged.onceWhen(\n (s) => s.type === 'reconnecting'\n );\n\n ws.receiveMessage(encode(StreamFixtures.Requests.gracefulReconnect()));\n const result = await beforeReconnect?.();\n\n await connecting;\n await Async.delay(10);\n\n ws.receiveMessage(\n encode(\n StreamFixtures.Requests.drawFrame({\n payload: Fixtures.drawFramePayloadPerspective,\n })\n )\n );\n\n return result;\n}\n\nexport function receiveFrame(\n ws: WebSocketClientMock,\n transformPayload?: (\n payload: vertexvis.protobuf.stream.IDrawFramePayload\n ) => vertexvis.protobuf.stream.IDrawFramePayload\n): void {\n ws.receiveMessage(\n encode(\n StreamFixtures.Requests.drawFrame({\n payload: transformPayload?.(Fixtures.drawFramePayloadPerspective),\n })\n )\n );\n}\n"]}
1
+ {"version":3,"file":"viewer.js","sourceRoot":"","sources":["../../../../src/testing/viewer.ts"],"names":[],"mappings":"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","sourcesContent":["import { vertexvis } from '@vertexvis/frame-streaming-protos';\nimport {\n encode,\n Fixtures as StreamFixtures,\n WebSocketClientMock,\n} from '@vertexvis/stream-api';\nimport { Async } from '@vertexvis/utils';\n\nimport { ViewerStream } from '../lib/stream/stream';\nimport * as Fixtures from './fixtures';\nimport { random } from './random';\n\ninterface ViewerStreamOperationCtx {\n stream: ViewerStream;\n ws: WebSocketClientMock;\n viewer: HTMLVertexViewerElement;\n}\n\ninterface LoadViewerStreamKeyOptions {\n token?: string;\n beforeConnected?: VoidFunction | (() => Promise<void>);\n}\n\nexport const key1 = 'urn:vertex:stream-key:123';\n\nexport const key2 = 'urn:vertex:stream-key:234';\n\nexport function makeViewerStream(): {\n stream: ViewerStream;\n ws: WebSocketClientMock;\n} {\n const ws = new WebSocketClientMock();\n const stream = new ViewerStream(ws);\n return { stream, ws };\n}\n\nexport async function loadViewerStreamKey(\n urn: string,\n { viewer, stream, ws }: ViewerStreamOperationCtx,\n {\n token = random.string({ alpha: true }),\n beforeConnected,\n }: LoadViewerStreamKeyOptions = {}\n): Promise<void> {\n jest.spyOn(stream, 'startStream').mockResolvedValue(\n StreamFixtures.Responses.startStream({\n result: {\n token: {\n token: token,\n expiresIn: new Date().getTime() + 10000,\n },\n },\n }).response\n );\n jest\n .spyOn(stream, 'syncTime')\n .mockResolvedValue(StreamFixtures.Responses.syncTime().response);\n\n const connecting = stream.stateChanged.onceWhen(\n (s) => s.type === 'connecting'\n );\n const loaded = viewer.load(urn);\n\n // Emit frame drawn on next event loop\n await connecting;\n await Async.delay(10);\n await beforeConnected?.();\n ws.receiveMessage(\n encode(\n StreamFixtures.Requests.drawFrame({\n payload: Fixtures.drawFramePayloadPerspective,\n })\n )\n );\n await loaded;\n}\n\ninterface GracefulReconnectOptions<T = void> {\n beforeReconnect?: () => Promise<T>;\n}\n\nexport async function gracefulReconnect<T = void>(\n { stream, ws }: ViewerStreamOperationCtx,\n { beforeReconnect }: GracefulReconnectOptions<T> = {}\n): Promise<T | undefined> {\n jest\n .spyOn(stream, 'reconnect')\n .mockResolvedValue(StreamFixtures.Responses.reconnect().response);\n jest\n .spyOn(stream, 'syncTime')\n .mockResolvedValue(StreamFixtures.Responses.syncTime().response);\n\n const connecting = stream.stateChanged.onceWhen(\n (s) => s.type === 'reconnecting'\n );\n\n ws.receiveMessage(encode(StreamFixtures.Requests.gracefulReconnect()));\n const result = await beforeReconnect?.();\n\n await connecting;\n await Async.delay(10);\n\n ws.receiveMessage(\n encode(\n StreamFixtures.Requests.drawFrame({\n payload: Fixtures.drawFramePayloadPerspective,\n })\n )\n );\n\n return result;\n}\n\nexport function receiveFrame(\n ws: WebSocketClientMock,\n transformPayload?: (\n payload: vertexvis.protobuf.stream.IDrawFramePayload\n ) => vertexvis.protobuf.stream.IDrawFramePayload\n): void {\n ws.receiveMessage(\n encode(\n StreamFixtures.Requests.drawFrame({\n payload: transformPayload?.(Fixtures.drawFramePayloadPerspective),\n })\n )\n );\n}\n"]}
@@ -110,7 +110,7 @@ const measurementWithArrowCursor = {
110
110
  const pinCursor = {
111
111
  url: "data:image/svg+xml,%3Csvg width='36px' height='36px' viewBox='0 0 24 24' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cdefs%3E%3Cpath d='M12,2 C7.581722,2 4,5.581722 4,10 C4.00435812,11.7714969 4.41127263,13.5188357 5.19,15.11 C6.15517666,17.0237439 7.49502409,18.7240579 9.13,20.11 C9.86916736,20.7592093 10.6620019,21.3446357 11.5,21.86 L12,22.14 L12.5,21.86 C13.8750156,21.0120029 15.1296156,19.9827599 16.23,18.8 C17.2698142,17.7023203 18.1394508,16.4551671 18.81,15.1 C19.5872532,13.5118707 19.9941287,11.7681184 20,10 C20,5.581722 16.418278,2 12,2 Z M12,13 C10.3431458,13 9,11.6568542 9,10 C9,8.34314575 10.3431458,7 12,7 C13.6568542,7 15,8.34314575 15,10 C15,10.7956495 14.6839295,11.5587112 14.1213203,12.1213203 C13.5587112,12.6839295 12.7956495,13 12,13 Z' id='path-1'%3E%3C/path%3E%3C/defs%3E%3Cg id='icons/pin-filled' stroke='none' stroke-width='1' fill='none' fill-rule='evenodd'%3E%3Cmask id='mask-2' fill='white'%3E%3Cuse xlink:href='%23path-1'%3E%3C/use%3E%3C/mask%3E%3Cuse id='Shape' stroke='%23FAFAFA' fill='%23BDBDBD' fill-rule='nonzero' xlink:href='%23path-1'%3E%3C/use%3E%3C/g%3E%3C/svg%3E",
112
112
  offsetX: 17,
113
- offsetY: 22,
113
+ offsetY: 32,
114
114
  };
115
115
  const labelPinCursor = {
116
116
  url: "data:image/svg+xml,%3Csvg width='36px' height='36px' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 16 24' %3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bfill:none;%7D.cls-2%7Bfill:%23616161;%7D.cls-3%7Bclip-path:url(%23clip-path);%7D%3C/style%3E%3CclipPath id='clip-path'%3E%3Ccircle cx='-576.76' cy='-107.26' r='4'/%3E%3C/clipPath%3E%3C/defs%3E%3Cpath d='M8,16H8a.48.48,0,0,1-.42-.23L5.75,13H3.51A1.5,1.5,0,0,1,2,11.5v-8A1.5,1.5,0,0,1,3.51,2h9A1.51,1.51,0,0,1,14,3.5v8a1.5,1.5,0,0,1-1.5,1.5H10.22L8.39,15.81A.5.5,0,0,1,8,16ZM3.51,3a.5.5,0,0,0-.5.5v8a.5.5,0,0,0,.5.5H6a.5.5,0,0,1,.42.23L8,14.61l1.55-2.38A.5.5,0,0,1,10,12h2.56a.5.5,0,0,0,.5-.5v-8a.51.51,0,0,0-.5-.5Z'/%3E%3Ccircle cx='8.01' cy='20' r='2'/%3E%3C/svg%3E%0A",
@@ -1 +1 @@
1
- {"file":"cursors.js","mappings":";;;;;AAiEA;;;;;;;MAOa,aAAa;EAA1B;;;;;;;IAuBkB,cAAS,GAAG,IAAI,eAAe,EAAQ,CAAC;IAEhD,YAAO,GAAqB,EAAE,CAAC;IAE/B,WAAM,GAAG,CAAC,CAAC;GA2EpB;;;;;;;;;;;EA/DQ,GAAG,CACR,MAAc,EACd,QAAQ,GAAG,aAAa,CAAC,eAAe;;;;;IAMxC,MAAM,eAAe,GAAG,IAAI,CAAC,0BAA0B,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC1E,IAAI,eAAe,IAAI,IAAI,EAAE;MAC3B,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;KACjC;IAED,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC;IACzB,MAAM,QAAQ,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;IAC1E,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5B,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IACtB,OAAO,QAAQ,CAAC;GACjB;;;;;;EAOO,MAAM,CAAC,QAAgB;IAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,QAAQ,CAAC,CAAC;IAClE,IAAI,KAAK,IAAI,CAAC,EAAE;MACd,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;MAC9B,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;KACvB;GACF;;;;;;;;EASO,0BAA0B,CAChC,aAAqB,EACrB,eAAuB;IAEvB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CACtB,CAAC,MAAM,KACL,MAAM,CAAC,MAAM,KAAK,aAAa,IAAI,MAAM,CAAC,QAAQ,KAAK,eAAe,CACzE,CAAC;GACH;;;;;;EAOM,eAAe;;IACpB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO;OACxB,MAAM,EAAE;OACR,OAAO,EAAE;OACT,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IAE3C,OAAO,MAAA,MAAM,CAAC,CAAC,CAAC,0CAAE,MAAM,CAAC;GAC1B;;AApGD;;;AAGuB,0BAAY,GAAG,CAAC,CAAC;AAExC;;;;AAIuB,6BAAe,GAAG,EAAE,CAAC;AAE5C;;;AAGuB,2BAAa,GAAG,EAAE,CAAC;AAyF5C;MAEa,iBAAiB,GAAG;EAC/B,GAAG,EAAE,irBAAirB;EACtrB,OAAO,EAAE,CAAC,EAAE;EACZ,OAAO,EAAE,CAAC,EAAE;EACZ;MAEW,0BAA0B,GAAG;EACxC,GAAG,EAAE,siCAAsiC;EAC3iC,OAAO,EAAE,CAAC,EAAE;EACZ,OAAO,EAAE,CAAC,EAAE;EACZ;MAEW,SAAS,GAAG;EACvB,GAAG,EAAE,2oCAA2oC;EAChpC,OAAO,EAAE,EAAE;EACX,OAAO,EAAE,EAAE;EACX;MAEW,cAAc,GAAG;EAC5B,GAAG,EAAE,mvBAAmvB;EACxvB,OAAO,EAAE,EAAE;EACX,OAAO,EAAE,EAAE;EACX;MAEW,cAAc,GAAG;EAC5B,GAAG,EAAE,+0BAA+0B;EACp1B,OAAO,EAAE,CAAC,EAAE;EACZ,OAAO,EAAE,CAAC,EAAE;;;;;","names":[],"sources":["./src/lib/cursors.ts"],"sourcesContent":["import { Disposable, EventDispatcher } from '@vertexvis/utils';\n\n/**\n * Represents a built-in [browser CSS\n * cursor](https://developer.mozilla.org/en-US/docs/Web/CSS/cursor).\n */\nexport type CssCursor =\n | 'auto'\n | 'default'\n | 'none'\n | 'context-menu'\n | 'help'\n | 'pointer'\n | 'progress'\n | 'wait'\n | 'cell'\n | 'crosshair'\n | 'text'\n | 'vertical-text'\n | 'alias'\n | 'copy'\n | 'move'\n | 'no-drop'\n | 'not-allowed'\n | 'grab'\n | 'grabbing'\n | 'all-scroll'\n | 'col-resize'\n | 'row-resize'\n | 'n-resize'\n | 'e-resize'\n | 's-resize'\n | 'w-resize'\n | 'ne-resize'\n | 'nw-resize'\n | 'se-resize'\n | 'sw-resize'\n | 'ew-resize'\n | 'ns-resize'\n | 'nesw-resize'\n | 'nwse-resize'\n | 'zoom-in'\n | 'zoom-out'\n | string;\n\n/**\n * Represents a custom cursor that points to an image file and offset.\n */\nexport interface CustomCursor {\n url: string;\n offsetX?: number;\n offsetY?: number;\n}\n\n/**\n * Represents all possible cursor types.\n */\nexport type Cursor = CssCursor | CustomCursor;\n\ninterface CursorInstance extends Disposable {\n id: number;\n cursor: Cursor;\n priority: number;\n}\n\n/**\n * The cursor manager maintains a prioritized list of cursors for the viewer.\n *\n * Cursors with the highest priority will be considered active, where the most\n * recently added cursor will take precedence if there are multiple cursors with\n * the same priority.\n */\nexport class CursorManager {\n /**\n * A constant representing the lowest priority cursors.\n */\n public static readonly LOW_PRIORITY = 0;\n\n /**\n * A constant representing a priority between `LOW_PRIORITY` and\n * `HIGH_PRIORITY`.\n */\n public static readonly NORMAL_PRIORITY = 10;\n\n /**\n * A constant representing the high priority cursors.\n */\n public static readonly HIGH_PRIORITY = 20;\n\n /**\n * An event dispatcher that emits an event when a cursor is added or removed.\n *\n * @see {@link CursorManager.add} to add a cursor.\n * @see {@link CursorManager.getActiveCursor} to query the current cursor.\n */\n public readonly onChanged = new EventDispatcher<void>();\n\n private cursors: CursorInstance[] = [];\n\n private nextId = 0;\n\n /**\n * Adds a cursor to the cursor manager, and returns an identifier that can be\n * used to remove the cursor.\n *\n * @param cursor The cursor to add.\n * @param priority The priority of the cursor. Higher values have higher\n * \tpriority over lower values.\n * @returns An identifier for the cursor.\n * @see {@link CursorManager.getActiveCursor} to query the current cursor.\n */\n public add(\n cursor: Cursor,\n priority = CursorManager.NORMAL_PRIORITY\n ): Disposable {\n // Ensure a duplicate cursor will not be added to the cursor manager.\n // If a matching cursor exists, delete it before proceeding.\n // Note that deleting the old cursor and adding the new one results in the\n // new cursor taking precedent over other existing cursors with the same priority.\n const duplicateCursor = this.getExistingDuplicateCursor(cursor, priority);\n if (duplicateCursor != null) {\n this.remove(duplicateCursor.id);\n }\n\n const id = ++this.nextId;\n const instance = { id, cursor, priority, dispose: () => this.remove(id) };\n this.cursors.push(instance);\n this.onChanged.emit();\n return instance;\n }\n\n /**\n * Removes a cursor with the given ID, if it exists.\n *\n * @param cursorId The ID of the cursor to remove.\n */\n private remove(cursorId: number): void {\n const index = this.cursors.findIndex(({ id }) => id === cursorId);\n if (index >= 0) {\n this.cursors.splice(index, 1);\n this.onChanged.emit();\n }\n }\n\n /**\n * Checks to see if an existing cursor matches the provided cursor and priority level.\n * The matching cursor is returned if found.\n *\n * @param cursorToCheck The cursor to check for duplicates against.\n * @param priorityToCheck The priority level to check for duplicates against.\n */\n private getExistingDuplicateCursor(\n cursorToCheck: Cursor,\n priorityToCheck: number\n ): CursorInstance | undefined {\n return this.cursors.find(\n (cursor) =>\n cursor.cursor === cursorToCheck && cursor.priority === priorityToCheck\n );\n }\n\n /**\n * Returns the active cursor based on priority and insertion order.\n *\n * @see {@link CursorManager.add} to add a cursor.\n */\n public getActiveCursor(): Cursor | undefined {\n const sorted = this.cursors\n .concat()\n .reverse()\n .sort((a, b) => b.priority - a.priority);\n\n return sorted[0]?.cursor;\n }\n}\n\n// CSS SVG images need to be URL encoded: https://yoksel.github.io/url-encoder/\n\nexport const measurementCursor = {\n url: \"data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M21.5 8h-19a.5.5 0 00-.5.5v6a.5.5 0 00.5.5h19a.5.5 0 00.5-.5v-6a.5.5 0 00-.5-.5zm-.5 6H3V9h3v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2z' stroke='%23fff' stroke-width='1.25' stroke-opacity='0.5' stroke-miterlimit='10' shape-rendering='crispEdges'/%3E%3Cpath d='M21.5 8h-19a.5.5 0 00-.5.5v6a.5.5 0 00.5.5h19a.5.5 0 00.5-.5v-6a.5.5 0 00-.5-.5zm-.5 6H3V9h3v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2z' shape-rendering='crispEdges'/%3E%3C/svg%3E\",\n offsetX: -24,\n offsetY: -24,\n};\n\nexport const measurementWithArrowCursor = {\n url: \"data:image/svg+xml;utf8,%3Csvg id='icons' xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bstroke:%23fff;stroke-miterlimit:10;stroke-width:2px;%7D.cls-2%7Bfill:%23fff;%7D.cls-2,.cls-3%7Bfill-rule:evenodd;%7D%3C/style%3E%3C/defs%3E%3Cpath class='cls-1' d='M27.46,21h-19a.5.5,0,0,0-.5.5v6a.5.5,0,0,0,.5.5h19a.5.5,0,0,0,.5-.5v-6A.5.5,0,0,0,27.46,21ZM27,27H9V22h3v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2Z'/%3E%3Cpath d='M27.46,21h-19a.5.5,0,0,0-.5.5v6a.5.5,0,0,0,.5.5h19a.5.5,0,0,0,.5-.5v-6A.5.5,0,0,0,27.46,21ZM27,27H9V22h3v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2Z'/%3E%3Cpath class='cls-2' d='M1,17V1L12.59,12.62H5.81l-.41.12Z'/%3E%3Cpath class='cls-2' d='M10.08,17.69l-3.6,1.53L1.8,8.14,5.48,6.58Z'/%3E%3Cpath class='cls-3' d='M8.75,17l-1.84.77-3.1-7.37,1.84-.78Z'/%3E%3Cpath class='cls-3' d='M2,3.41V14.6l3-2.87.43-.14h4.76Z'/%3E%3C/svg%3E\",\n offsetX: -30,\n offsetY: -30,\n};\n\nexport const pinCursor = {\n url: \"data:image/svg+xml,%3Csvg width='36px' height='36px' viewBox='0 0 24 24' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cdefs%3E%3Cpath d='M12,2 C7.581722,2 4,5.581722 4,10 C4.00435812,11.7714969 4.41127263,13.5188357 5.19,15.11 C6.15517666,17.0237439 7.49502409,18.7240579 9.13,20.11 C9.86916736,20.7592093 10.6620019,21.3446357 11.5,21.86 L12,22.14 L12.5,21.86 C13.8750156,21.0120029 15.1296156,19.9827599 16.23,18.8 C17.2698142,17.7023203 18.1394508,16.4551671 18.81,15.1 C19.5872532,13.5118707 19.9941287,11.7681184 20,10 C20,5.581722 16.418278,2 12,2 Z M12,13 C10.3431458,13 9,11.6568542 9,10 C9,8.34314575 10.3431458,7 12,7 C13.6568542,7 15,8.34314575 15,10 C15,10.7956495 14.6839295,11.5587112 14.1213203,12.1213203 C13.5587112,12.6839295 12.7956495,13 12,13 Z' id='path-1'%3E%3C/path%3E%3C/defs%3E%3Cg id='icons/pin-filled' stroke='none' stroke-width='1' fill='none' fill-rule='evenodd'%3E%3Cmask id='mask-2' fill='white'%3E%3Cuse xlink:href='%23path-1'%3E%3C/use%3E%3C/mask%3E%3Cuse id='Shape' stroke='%23FAFAFA' fill='%23BDBDBD' fill-rule='nonzero' xlink:href='%23path-1'%3E%3C/use%3E%3C/g%3E%3C/svg%3E\",\n offsetX: 17,\n offsetY: 22,\n};\n\nexport const labelPinCursor = {\n url: \"data:image/svg+xml,%3Csvg width='36px' height='36px' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 16 24' %3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bfill:none;%7D.cls-2%7Bfill:%23616161;%7D.cls-3%7Bclip-path:url(%23clip-path);%7D%3C/style%3E%3CclipPath id='clip-path'%3E%3Ccircle cx='-576.76' cy='-107.26' r='4'/%3E%3C/clipPath%3E%3C/defs%3E%3Cpath d='M8,16H8a.48.48,0,0,1-.42-.23L5.75,13H3.51A1.5,1.5,0,0,1,2,11.5v-8A1.5,1.5,0,0,1,3.51,2h9A1.51,1.51,0,0,1,14,3.5v8a1.5,1.5,0,0,1-1.5,1.5H10.22L8.39,15.81A.5.5,0,0,1,8,16ZM3.51,3a.5.5,0,0,0-.5.5v8a.5.5,0,0,0,.5.5H6a.5.5,0,0,1,.42.23L8,14.61l1.55-2.38A.5.5,0,0,1,10,12h2.56a.5.5,0,0,0,.5-.5v-8a.51.51,0,0,0-.5-.5Z'/%3E%3Ccircle cx='8.01' cy='20' r='2'/%3E%3C/svg%3E%0A\",\n offsetX: 17,\n offsetY: 29,\n};\n\nexport const boxQueryCursor = {\n url: \"data:image/svg+xml;utf8,%3Csvg id='icons' xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bstroke:%23fff;stroke-miterlimit:10;stroke-width:2px;%7D.cls-2%7Bfill:%23fff;%7D.cls-2,.cls-3%7Bfill-rule:evenodd;%7D%3C/style%3E%3C/defs%3E%3Cpath class='cls-2' d='M1.25,17V1L12.59,12.62H5.81l-.41.12Z'/%3E%3Cpath class='cls-2' d='M10.33,17.69l-3.6,1.53L1.8,8.14,5.48,6.58Z'/%3E %3Cpath class='cls-3' d='M9,17l-1.84.77-3.1-7.37,1.84-.78Z'/%3E%3Cpath class='cls-3' d='M2.25,3.41V14.6l3-2.87.43-.14h4.76Z'/%3E%3Cpath class='cls-1' d='M21.36,22.5H15.5V16.64a.5.5,0,0,0-1,0V22.5H8.64a.5.5,0,0,0,0,1H14.5v5.86a.5.5,0,0,0,1,0V23.5h5.86a.5.5,0,0,0,0-1Z' /%3E %3Cpath d='M21.36,22.5H15.5V16.64a.5.5,0,0,0-1,0V22.5H8.64a.5.5,0,0,0,0,1H14.5v5.86a.5.5,0,0,0,1,0V23.5h5.86a.5.5,0,0,0,0-1Z' /%3E%3C/svg%3E\",\n offsetX: -30,\n offsetY: -30,\n};\n"],"version":3}
1
+ {"file":"cursors.js","mappings":";;;;;AAiEA;;;;;;;MAOa,aAAa;EAA1B;;;;;;;IAuBkB,cAAS,GAAG,IAAI,eAAe,EAAQ,CAAC;IAEhD,YAAO,GAAqB,EAAE,CAAC;IAE/B,WAAM,GAAG,CAAC,CAAC;GA2EpB;;;;;;;;;;;EA/DQ,GAAG,CACR,MAAc,EACd,QAAQ,GAAG,aAAa,CAAC,eAAe;;;;;IAMxC,MAAM,eAAe,GAAG,IAAI,CAAC,0BAA0B,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC1E,IAAI,eAAe,IAAI,IAAI,EAAE;MAC3B,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;KACjC;IAED,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC;IACzB,MAAM,QAAQ,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;IAC1E,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5B,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IACtB,OAAO,QAAQ,CAAC;GACjB;;;;;;EAOO,MAAM,CAAC,QAAgB;IAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,QAAQ,CAAC,CAAC;IAClE,IAAI,KAAK,IAAI,CAAC,EAAE;MACd,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;MAC9B,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;KACvB;GACF;;;;;;;;EASO,0BAA0B,CAChC,aAAqB,EACrB,eAAuB;IAEvB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CACtB,CAAC,MAAM,KACL,MAAM,CAAC,MAAM,KAAK,aAAa,IAAI,MAAM,CAAC,QAAQ,KAAK,eAAe,CACzE,CAAC;GACH;;;;;;EAOM,eAAe;;IACpB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO;OACxB,MAAM,EAAE;OACR,OAAO,EAAE;OACT,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IAE3C,OAAO,MAAA,MAAM,CAAC,CAAC,CAAC,0CAAE,MAAM,CAAC;GAC1B;;AApGD;;;AAGuB,0BAAY,GAAG,CAAC,CAAC;AAExC;;;;AAIuB,6BAAe,GAAG,EAAE,CAAC;AAE5C;;;AAGuB,2BAAa,GAAG,EAAE,CAAC;AAyF5C;MAEa,iBAAiB,GAAG;EAC/B,GAAG,EAAE,irBAAirB;EACtrB,OAAO,EAAE,CAAC,EAAE;EACZ,OAAO,EAAE,CAAC,EAAE;EACZ;MAEW,0BAA0B,GAAG;EACxC,GAAG,EAAE,siCAAsiC;EAC3iC,OAAO,EAAE,CAAC,EAAE;EACZ,OAAO,EAAE,CAAC,EAAE;EACZ;MAEW,SAAS,GAAG;EACvB,GAAG,EAAE,2oCAA2oC;EAChpC,OAAO,EAAE,EAAE;EACX,OAAO,EAAE,EAAE;EACX;MAEW,cAAc,GAAG;EAC5B,GAAG,EAAE,mvBAAmvB;EACxvB,OAAO,EAAE,EAAE;EACX,OAAO,EAAE,EAAE;EACX;MAEW,cAAc,GAAG;EAC5B,GAAG,EAAE,+0BAA+0B;EACp1B,OAAO,EAAE,CAAC,EAAE;EACZ,OAAO,EAAE,CAAC,EAAE;;;;;","names":[],"sources":["./src/lib/cursors.ts"],"sourcesContent":["import { Disposable, EventDispatcher } from '@vertexvis/utils';\n\n/**\n * Represents a built-in [browser CSS\n * cursor](https://developer.mozilla.org/en-US/docs/Web/CSS/cursor).\n */\nexport type CssCursor =\n | 'auto'\n | 'default'\n | 'none'\n | 'context-menu'\n | 'help'\n | 'pointer'\n | 'progress'\n | 'wait'\n | 'cell'\n | 'crosshair'\n | 'text'\n | 'vertical-text'\n | 'alias'\n | 'copy'\n | 'move'\n | 'no-drop'\n | 'not-allowed'\n | 'grab'\n | 'grabbing'\n | 'all-scroll'\n | 'col-resize'\n | 'row-resize'\n | 'n-resize'\n | 'e-resize'\n | 's-resize'\n | 'w-resize'\n | 'ne-resize'\n | 'nw-resize'\n | 'se-resize'\n | 'sw-resize'\n | 'ew-resize'\n | 'ns-resize'\n | 'nesw-resize'\n | 'nwse-resize'\n | 'zoom-in'\n | 'zoom-out'\n | string;\n\n/**\n * Represents a custom cursor that points to an image file and offset.\n */\nexport interface CustomCursor {\n url: string;\n offsetX?: number;\n offsetY?: number;\n}\n\n/**\n * Represents all possible cursor types.\n */\nexport type Cursor = CssCursor | CustomCursor;\n\ninterface CursorInstance extends Disposable {\n id: number;\n cursor: Cursor;\n priority: number;\n}\n\n/**\n * The cursor manager maintains a prioritized list of cursors for the viewer.\n *\n * Cursors with the highest priority will be considered active, where the most\n * recently added cursor will take precedence if there are multiple cursors with\n * the same priority.\n */\nexport class CursorManager {\n /**\n * A constant representing the lowest priority cursors.\n */\n public static readonly LOW_PRIORITY = 0;\n\n /**\n * A constant representing a priority between `LOW_PRIORITY` and\n * `HIGH_PRIORITY`.\n */\n public static readonly NORMAL_PRIORITY = 10;\n\n /**\n * A constant representing the high priority cursors.\n */\n public static readonly HIGH_PRIORITY = 20;\n\n /**\n * An event dispatcher that emits an event when a cursor is added or removed.\n *\n * @see {@link CursorManager.add} to add a cursor.\n * @see {@link CursorManager.getActiveCursor} to query the current cursor.\n */\n public readonly onChanged = new EventDispatcher<void>();\n\n private cursors: CursorInstance[] = [];\n\n private nextId = 0;\n\n /**\n * Adds a cursor to the cursor manager, and returns an identifier that can be\n * used to remove the cursor.\n *\n * @param cursor The cursor to add.\n * @param priority The priority of the cursor. Higher values have higher\n * \tpriority over lower values.\n * @returns An identifier for the cursor.\n * @see {@link CursorManager.getActiveCursor} to query the current cursor.\n */\n public add(\n cursor: Cursor,\n priority = CursorManager.NORMAL_PRIORITY\n ): Disposable {\n // Ensure a duplicate cursor will not be added to the cursor manager.\n // If a matching cursor exists, delete it before proceeding.\n // Note that deleting the old cursor and adding the new one results in the\n // new cursor taking precedent over other existing cursors with the same priority.\n const duplicateCursor = this.getExistingDuplicateCursor(cursor, priority);\n if (duplicateCursor != null) {\n this.remove(duplicateCursor.id);\n }\n\n const id = ++this.nextId;\n const instance = { id, cursor, priority, dispose: () => this.remove(id) };\n this.cursors.push(instance);\n this.onChanged.emit();\n return instance;\n }\n\n /**\n * Removes a cursor with the given ID, if it exists.\n *\n * @param cursorId The ID of the cursor to remove.\n */\n private remove(cursorId: number): void {\n const index = this.cursors.findIndex(({ id }) => id === cursorId);\n if (index >= 0) {\n this.cursors.splice(index, 1);\n this.onChanged.emit();\n }\n }\n\n /**\n * Checks to see if an existing cursor matches the provided cursor and priority level.\n * The matching cursor is returned if found.\n *\n * @param cursorToCheck The cursor to check for duplicates against.\n * @param priorityToCheck The priority level to check for duplicates against.\n */\n private getExistingDuplicateCursor(\n cursorToCheck: Cursor,\n priorityToCheck: number\n ): CursorInstance | undefined {\n return this.cursors.find(\n (cursor) =>\n cursor.cursor === cursorToCheck && cursor.priority === priorityToCheck\n );\n }\n\n /**\n * Returns the active cursor based on priority and insertion order.\n *\n * @see {@link CursorManager.add} to add a cursor.\n */\n public getActiveCursor(): Cursor | undefined {\n const sorted = this.cursors\n .concat()\n .reverse()\n .sort((a, b) => b.priority - a.priority);\n\n return sorted[0]?.cursor;\n }\n}\n\n// CSS SVG images need to be URL encoded: https://yoksel.github.io/url-encoder/\n\nexport const measurementCursor = {\n url: \"data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M21.5 8h-19a.5.5 0 00-.5.5v6a.5.5 0 00.5.5h19a.5.5 0 00.5-.5v-6a.5.5 0 00-.5-.5zm-.5 6H3V9h3v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2z' stroke='%23fff' stroke-width='1.25' stroke-opacity='0.5' stroke-miterlimit='10' shape-rendering='crispEdges'/%3E%3Cpath d='M21.5 8h-19a.5.5 0 00-.5.5v6a.5.5 0 00.5.5h19a.5.5 0 00.5-.5v-6a.5.5 0 00-.5-.5zm-.5 6H3V9h3v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2z' shape-rendering='crispEdges'/%3E%3C/svg%3E\",\n offsetX: -24,\n offsetY: -24,\n};\n\nexport const measurementWithArrowCursor = {\n url: \"data:image/svg+xml;utf8,%3Csvg id='icons' xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bstroke:%23fff;stroke-miterlimit:10;stroke-width:2px;%7D.cls-2%7Bfill:%23fff;%7D.cls-2,.cls-3%7Bfill-rule:evenodd;%7D%3C/style%3E%3C/defs%3E%3Cpath class='cls-1' d='M27.46,21h-19a.5.5,0,0,0-.5.5v6a.5.5,0,0,0,.5.5h19a.5.5,0,0,0,.5-.5v-6A.5.5,0,0,0,27.46,21ZM27,27H9V22h3v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2Z'/%3E%3Cpath d='M27.46,21h-19a.5.5,0,0,0-.5.5v6a.5.5,0,0,0,.5.5h19a.5.5,0,0,0,.5-.5v-6A.5.5,0,0,0,27.46,21ZM27,27H9V22h3v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2Z'/%3E%3Cpath class='cls-2' d='M1,17V1L12.59,12.62H5.81l-.41.12Z'/%3E%3Cpath class='cls-2' d='M10.08,17.69l-3.6,1.53L1.8,8.14,5.48,6.58Z'/%3E%3Cpath class='cls-3' d='M8.75,17l-1.84.77-3.1-7.37,1.84-.78Z'/%3E%3Cpath class='cls-3' d='M2,3.41V14.6l3-2.87.43-.14h4.76Z'/%3E%3C/svg%3E\",\n offsetX: -30,\n offsetY: -30,\n};\n\nexport const pinCursor = {\n url: \"data:image/svg+xml,%3Csvg width='36px' height='36px' viewBox='0 0 24 24' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cdefs%3E%3Cpath d='M12,2 C7.581722,2 4,5.581722 4,10 C4.00435812,11.7714969 4.41127263,13.5188357 5.19,15.11 C6.15517666,17.0237439 7.49502409,18.7240579 9.13,20.11 C9.86916736,20.7592093 10.6620019,21.3446357 11.5,21.86 L12,22.14 L12.5,21.86 C13.8750156,21.0120029 15.1296156,19.9827599 16.23,18.8 C17.2698142,17.7023203 18.1394508,16.4551671 18.81,15.1 C19.5872532,13.5118707 19.9941287,11.7681184 20,10 C20,5.581722 16.418278,2 12,2 Z M12,13 C10.3431458,13 9,11.6568542 9,10 C9,8.34314575 10.3431458,7 12,7 C13.6568542,7 15,8.34314575 15,10 C15,10.7956495 14.6839295,11.5587112 14.1213203,12.1213203 C13.5587112,12.6839295 12.7956495,13 12,13 Z' id='path-1'%3E%3C/path%3E%3C/defs%3E%3Cg id='icons/pin-filled' stroke='none' stroke-width='1' fill='none' fill-rule='evenodd'%3E%3Cmask id='mask-2' fill='white'%3E%3Cuse xlink:href='%23path-1'%3E%3C/use%3E%3C/mask%3E%3Cuse id='Shape' stroke='%23FAFAFA' fill='%23BDBDBD' fill-rule='nonzero' xlink:href='%23path-1'%3E%3C/use%3E%3C/g%3E%3C/svg%3E\",\n offsetX: 17,\n offsetY: 32,\n};\n\nexport const labelPinCursor = {\n url: \"data:image/svg+xml,%3Csvg width='36px' height='36px' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 16 24' %3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bfill:none;%7D.cls-2%7Bfill:%23616161;%7D.cls-3%7Bclip-path:url(%23clip-path);%7D%3C/style%3E%3CclipPath id='clip-path'%3E%3Ccircle cx='-576.76' cy='-107.26' r='4'/%3E%3C/clipPath%3E%3C/defs%3E%3Cpath d='M8,16H8a.48.48,0,0,1-.42-.23L5.75,13H3.51A1.5,1.5,0,0,1,2,11.5v-8A1.5,1.5,0,0,1,3.51,2h9A1.51,1.51,0,0,1,14,3.5v8a1.5,1.5,0,0,1-1.5,1.5H10.22L8.39,15.81A.5.5,0,0,1,8,16ZM3.51,3a.5.5,0,0,0-.5.5v8a.5.5,0,0,0,.5.5H6a.5.5,0,0,1,.42.23L8,14.61l1.55-2.38A.5.5,0,0,1,10,12h2.56a.5.5,0,0,0,.5-.5v-8a.51.51,0,0,0-.5-.5Z'/%3E%3Ccircle cx='8.01' cy='20' r='2'/%3E%3C/svg%3E%0A\",\n offsetX: 17,\n offsetY: 29,\n};\n\nexport const boxQueryCursor = {\n url: \"data:image/svg+xml;utf8,%3Csvg id='icons' xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bstroke:%23fff;stroke-miterlimit:10;stroke-width:2px;%7D.cls-2%7Bfill:%23fff;%7D.cls-2,.cls-3%7Bfill-rule:evenodd;%7D%3C/style%3E%3C/defs%3E%3Cpath class='cls-2' d='M1.25,17V1L12.59,12.62H5.81l-.41.12Z'/%3E%3Cpath class='cls-2' d='M10.33,17.69l-3.6,1.53L1.8,8.14,5.48,6.58Z'/%3E %3Cpath class='cls-3' d='M9,17l-1.84.77-3.1-7.37,1.84-.78Z'/%3E%3Cpath class='cls-3' d='M2.25,3.41V14.6l3-2.87.43-.14h4.76Z'/%3E%3Cpath class='cls-1' d='M21.36,22.5H15.5V16.64a.5.5,0,0,0-1,0V22.5H8.64a.5.5,0,0,0,0,1H14.5v5.86a.5.5,0,0,0,1,0V23.5h5.86a.5.5,0,0,0,0-1Z' /%3E %3Cpath d='M21.36,22.5H15.5V16.64a.5.5,0,0,0-1,0V22.5H8.64a.5.5,0,0,0,0,1H14.5v5.86a.5.5,0,0,0,1,0V23.5h5.86a.5.5,0,0,0,0-1Z' /%3E%3C/svg%3E\",\n offsetX: -30,\n offsetY: -30,\n};\n"],"version":3}
@@ -291,7 +291,13 @@ class ModelViewController {
291
291
  * the scene view.
292
292
  */
293
293
  async unload() {
294
- this.stream.updateModelView({}, true);
294
+ await this.stream.updateModelView({}, true);
295
+ // Clear any cross-section added from the model view
296
+ await this.stream.updateCrossSectioning({
297
+ crossSectioning: {
298
+ sectionPlanes: [],
299
+ },
300
+ }, true);
295
301
  }
296
302
  }
297
303