bruce-models 2.3.7 → 2.3.9

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 (195) hide show
  1. package/dist/bruce-models.es5.js +8041 -8037
  2. package/dist/bruce-models.es5.js.map +1 -1
  3. package/dist/bruce-models.umd.js +7805 -7801
  4. package/dist/bruce-models.umd.js.map +1 -1
  5. package/dist/lib/account/account-invite.js +81 -81
  6. package/dist/lib/account/account-settings.js +2 -2
  7. package/dist/lib/account/account.js +169 -169
  8. package/dist/lib/account/account.js.map +1 -1
  9. package/dist/lib/ann-document/ann-document.js +94 -94
  10. package/dist/lib/api/abstract-api.js +269 -269
  11. package/dist/lib/api/api-getters.js +172 -172
  12. package/dist/lib/api/api.js +93 -93
  13. package/dist/lib/api/bruce-api.js +224 -224
  14. package/dist/lib/api/bruce-api.js.map +1 -1
  15. package/dist/lib/api/cam-api.js +88 -88
  16. package/dist/lib/api/global-api.js +82 -82
  17. package/dist/lib/api/guardian-api.js +82 -82
  18. package/dist/lib/api/idm-api.js +90 -90
  19. package/dist/lib/bruce-models.js +95 -91
  20. package/dist/lib/bruce-models.js.map +1 -1
  21. package/dist/lib/calculator/calculator.js +341 -341
  22. package/dist/lib/client-file/client-file.js +255 -255
  23. package/dist/lib/client-file/client-file.js.map +1 -1
  24. package/dist/lib/common/bounds.js +61 -61
  25. package/dist/lib/common/bruce-event.js +46 -46
  26. package/dist/lib/common/bruce-variable.js +60 -60
  27. package/dist/lib/common/cache.js +188 -188
  28. package/dist/lib/common/cache.js.map +1 -1
  29. package/dist/lib/common/camera.js +11 -11
  30. package/dist/lib/common/cartes.js +123 -123
  31. package/dist/lib/common/carto.js +60 -60
  32. package/dist/lib/common/color.js +86 -86
  33. package/dist/lib/common/delay-queue.js +56 -56
  34. package/dist/lib/common/dictionary.js +2 -2
  35. package/dist/lib/common/geometry.js +120 -120
  36. package/dist/lib/common/lru-cache.js +25 -25
  37. package/dist/lib/common/transform.js +2 -2
  38. package/dist/lib/common/utc.js +39 -39
  39. package/dist/lib/custom-form/custom-form-content.js +26 -26
  40. package/dist/lib/custom-form/custom-form.js +114 -114
  41. package/dist/lib/data-lab/data-lab.js +49 -49
  42. package/dist/lib/entity/entity-attachment-type.js +87 -87
  43. package/dist/lib/entity/entity-attachment-type.js.map +1 -1
  44. package/dist/lib/entity/entity-attachment.js +126 -126
  45. package/dist/lib/entity/entity-attachment.js.map +1 -1
  46. package/dist/lib/entity/entity-attribute.js +29 -29
  47. package/dist/lib/entity/entity-comment.js +86 -86
  48. package/dist/lib/entity/entity-comment.js.map +1 -1
  49. package/dist/lib/entity/entity-coords.js +153 -153
  50. package/dist/lib/entity/entity-coords.js.map +1 -1
  51. package/dist/lib/entity/entity-link.js +86 -86
  52. package/dist/lib/entity/entity-link.js.map +1 -1
  53. package/dist/lib/entity/entity-lod-category.js +108 -108
  54. package/dist/lib/entity/entity-lod.js +197 -197
  55. package/dist/lib/entity/entity-lod.js.map +1 -1
  56. package/dist/lib/entity/entity-relation-type.js +117 -117
  57. package/dist/lib/entity/entity-relation-type.js.map +1 -1
  58. package/dist/lib/entity/entity-relation.js +157 -157
  59. package/dist/lib/entity/entity-source.js +136 -136
  60. package/dist/lib/entity/entity-source.js.map +1 -1
  61. package/dist/lib/entity/entity-tag.js +157 -157
  62. package/dist/lib/entity/entity-type-visual-settings.js +13 -13
  63. package/dist/lib/entity/entity-type.js +122 -122
  64. package/dist/lib/entity/entity.js +341 -341
  65. package/dist/lib/entity/entity.js.map +1 -1
  66. package/dist/lib/entity/getters/batched-data-getter.js +84 -84
  67. package/dist/lib/entity/getters/batched-data-getter.js.map +1 -1
  68. package/dist/lib/entity/getters/entity-filter-getter.js +316 -316
  69. package/dist/lib/entity/getters/entity-filter-getter.js.map +1 -1
  70. package/dist/lib/entity/getters/entity-globe.js +175 -175
  71. package/dist/lib/entity/getters/view-monitor.js +2 -2
  72. package/dist/lib/import/import-cad.js +53 -53
  73. package/dist/lib/import/import-cad.js.map +1 -1
  74. package/dist/lib/import/import-csv.js +23 -23
  75. package/dist/lib/import/import-json.js +23 -23
  76. package/dist/lib/import/import-kml.js +23 -23
  77. package/dist/lib/import/imported-file.js +130 -130
  78. package/dist/lib/internal/uploader.js +76 -76
  79. package/dist/lib/internal/uploader.js.map +1 -1
  80. package/dist/lib/markup/markup.js +185 -185
  81. package/dist/lib/plugin/plugin.js +91 -91
  82. package/dist/lib/program-key/program-key.js +120 -120
  83. package/dist/lib/program-key/program-key.js.map +1 -1
  84. package/dist/lib/project/menu-item.js +122 -122
  85. package/dist/lib/project/project-view-bookmark.js +159 -159
  86. package/dist/lib/project/project-view-bookmark.js.map +1 -1
  87. package/dist/lib/project/project-view-legacy-tile.js +77 -77
  88. package/dist/lib/project/project-view-legacy-tile.js.map +1 -1
  89. package/dist/lib/project/project-view-tile.js +125 -125
  90. package/dist/lib/project/project-view.js +141 -141
  91. package/dist/lib/project/zoom-control.js +17 -17
  92. package/dist/lib/server/hosting-location.js +156 -156
  93. package/dist/lib/server/hosting-location.js.map +1 -1
  94. package/dist/lib/server/message-broker.js +142 -142
  95. package/dist/lib/server/message-broker.js.map +1 -1
  96. package/dist/lib/server/pending-action.js +83 -83
  97. package/dist/lib/server/task.js +63 -63
  98. package/dist/lib/style/style.js +129 -129
  99. package/dist/lib/style/style.js.map +1 -1
  100. package/dist/lib/tileset/tileset.js +431 -431
  101. package/dist/lib/tileset/tileset.js.map +1 -1
  102. package/dist/lib/user/permission.js +20 -20
  103. package/dist/lib/user/session.js +145 -142
  104. package/dist/lib/user/session.js.map +1 -1
  105. package/dist/lib/user/user-group.js +94 -94
  106. package/dist/lib/user/user.js +475 -474
  107. package/dist/lib/user/user.js.map +1 -1
  108. package/dist/lib/util/encrypt-utils.js +19 -19
  109. package/dist/lib/util/math-utils.js +40 -40
  110. package/dist/lib/util/object-utils.js +17 -17
  111. package/dist/lib/util/path-utils.js +61 -61
  112. package/dist/lib/util/url-utils.js +94 -94
  113. package/dist/lib/util/url-utils.js.map +1 -1
  114. package/dist/types/account/account-invite.d.ts +68 -68
  115. package/dist/types/account/account-settings.d.ts +24 -24
  116. package/dist/types/account/account.d.ts +84 -84
  117. package/dist/types/ann-document/ann-document.d.ts +50 -50
  118. package/dist/types/api/abstract-api.d.ts +36 -36
  119. package/dist/types/api/api-getters.d.ts +64 -64
  120. package/dist/types/api/api.d.ts +93 -93
  121. package/dist/types/api/bruce-api.d.ts +64 -64
  122. package/dist/types/api/cam-api.d.ts +26 -26
  123. package/dist/types/api/global-api.d.ts +25 -25
  124. package/dist/types/api/guardian-api.d.ts +25 -25
  125. package/dist/types/api/idm-api.d.ts +28 -28
  126. package/dist/types/bruce-models.d.ts +79 -79
  127. package/dist/types/calculator/calculator.d.ts +61 -61
  128. package/dist/types/client-file/client-file.d.ts +130 -130
  129. package/dist/types/common/bounds.d.ts +30 -30
  130. package/dist/types/common/bruce-event.d.ts +12 -12
  131. package/dist/types/common/bruce-variable.d.ts +21 -21
  132. package/dist/types/common/cache.d.ts +57 -57
  133. package/dist/types/common/camera.d.ts +6 -6
  134. package/dist/types/common/cartes.d.ts +51 -51
  135. package/dist/types/common/carto.d.ts +15 -15
  136. package/dist/types/common/color.d.ts +24 -24
  137. package/dist/types/common/delay-queue.d.ts +14 -14
  138. package/dist/types/common/dictionary.d.ts +3 -3
  139. package/dist/types/common/geometry.d.ts +44 -44
  140. package/dist/types/common/lru-cache.d.ts +7 -7
  141. package/dist/types/common/transform.d.ts +15 -15
  142. package/dist/types/common/utc.d.ts +29 -29
  143. package/dist/types/custom-form/custom-form-content.d.ts +60 -60
  144. package/dist/types/custom-form/custom-form.d.ts +49 -49
  145. package/dist/types/data-lab/data-lab.d.ts +28 -28
  146. package/dist/types/entity/entity-attachment-type.d.ts +39 -39
  147. package/dist/types/entity/entity-attachment.d.ts +61 -61
  148. package/dist/types/entity/entity-attribute.d.ts +39 -39
  149. package/dist/types/entity/entity-comment.d.ts +40 -40
  150. package/dist/types/entity/entity-coords.d.ts +66 -66
  151. package/dist/types/entity/entity-link.d.ts +36 -36
  152. package/dist/types/entity/entity-lod-category.d.ts +36 -36
  153. package/dist/types/entity/entity-lod.d.ts +99 -99
  154. package/dist/types/entity/entity-relation-type.d.ts +44 -44
  155. package/dist/types/entity/entity-relation.d.ts +59 -59
  156. package/dist/types/entity/entity-source.d.ts +45 -45
  157. package/dist/types/entity/entity-tag.d.ts +53 -53
  158. package/dist/types/entity/entity-type-visual-settings.d.ts +16 -16
  159. package/dist/types/entity/entity-type.d.ts +63 -63
  160. package/dist/types/entity/entity.d.ts +118 -118
  161. package/dist/types/entity/getters/batched-data-getter.d.ts +26 -26
  162. package/dist/types/entity/getters/entity-filter-getter.d.ts +61 -61
  163. package/dist/types/entity/getters/entity-globe.d.ts +21 -21
  164. package/dist/types/entity/getters/view-monitor.d.ts +13 -13
  165. package/dist/types/import/import-cad.d.ts +49 -49
  166. package/dist/types/import/import-csv.d.ts +31 -31
  167. package/dist/types/import/import-json.d.ts +26 -26
  168. package/dist/types/import/import-kml.d.ts +19 -19
  169. package/dist/types/import/imported-file.d.ts +47 -47
  170. package/dist/types/internal/uploader.d.ts +16 -16
  171. package/dist/types/markup/markup.d.ts +227 -227
  172. package/dist/types/plugin/plugin.d.ts +39 -39
  173. package/dist/types/program-key/program-key.d.ts +48 -48
  174. package/dist/types/project/menu-item.d.ts +169 -169
  175. package/dist/types/project/project-view-bookmark.d.ts +180 -179
  176. package/dist/types/project/project-view-legacy-tile.d.ts +48 -48
  177. package/dist/types/project/project-view-tile.d.ts +65 -65
  178. package/dist/types/project/project-view.d.ts +136 -136
  179. package/dist/types/project/zoom-control.d.ts +22 -22
  180. package/dist/types/server/hosting-location.d.ts +74 -74
  181. package/dist/types/server/message-broker.d.ts +86 -86
  182. package/dist/types/server/pending-action.d.ts +66 -66
  183. package/dist/types/server/task.d.ts +36 -36
  184. package/dist/types/style/style.d.ts +107 -107
  185. package/dist/types/tileset/tileset.d.ts +264 -264
  186. package/dist/types/user/permission.d.ts +15 -15
  187. package/dist/types/user/session.d.ts +72 -66
  188. package/dist/types/user/user-group.d.ts +58 -58
  189. package/dist/types/user/user.d.ts +189 -188
  190. package/dist/types/util/encrypt-utils.d.ts +3 -3
  191. package/dist/types/util/math-utils.d.ts +16 -16
  192. package/dist/types/util/object-utils.d.ts +7 -7
  193. package/dist/types/util/path-utils.d.ts +8 -8
  194. package/dist/types/util/url-utils.d.ts +26 -26
  195. package/package.json +79 -78
@@ -1,317 +1,317 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.EntityFilterGetter = void 0;
13
- const api_1 = require("../../api/api");
14
- const bruce_event_1 = require("../../common/bruce-event");
15
- const entity_1 = require("../entity");
16
- const entity_globe_1 = require("./entity-globe");
17
- const MAX_AREA_IN_DEGREES = 90;
18
- const MAX_RETRY_ATTEMPTS = 1;
19
- const RETRY_DELAY_INCREMENT = 500;
20
- const REQUEST_PAGE_DELAY = 50;
21
- class regMenuItemGetter {
22
- constructor(tagIds, minHeight, maxHeight) {
23
- this.TagIds = tagIds;
24
- this.MinHeight = minHeight;
25
- this.MaxHeight = maxHeight;
26
- }
27
- }
28
- function delay(milliseconds) {
29
- return __awaiter(this, void 0, void 0, function* () {
30
- return new Promise((res) => {
31
- setTimeout(() => {
32
- res();
33
- }, milliseconds);
34
- });
35
- });
36
- }
37
- /**
38
- * This is a batched entity getter.
39
- * It will scan for entity records in a view-area and emit them in batches.
40
- * It will restart scanning if the camera moves.
41
- */
42
- var EntityFilterGetter;
43
- (function (EntityFilterGetter) {
44
- let EStatus;
45
- (function (EStatus) {
46
- EStatus["Scanning"] = "SCANNING";
47
- EStatus["Loading"] = "LOADING";
48
- })(EStatus = EntityFilterGetter.EStatus || (EntityFilterGetter.EStatus = {}));
49
- class Getter {
50
- constructor(api, viewPort, typeId, batchSize, attrFilter, viaCdn) {
51
- this.onUpdate = null;
52
- this.LastStateUpdates = {};
53
- this.onStateUpdate = null;
54
- this.onScanUpdate = null;
55
- this.viewPortChangeRemoval = null;
56
- this.cells = null;
57
- this.registeredItems = {};
58
- this.getterLoopId = 0;
59
- this.tagIds = null;
60
- this.minHeight = 0;
61
- this.maxHeight = 100000;
62
- this.viewRect = null;
63
- this.viewCenter = null;
64
- this.api = api;
65
- this.typeId = typeId;
66
- this.viaCdn = Boolean(viaCdn);
67
- this.batchSize = isNaN(batchSize) ? 300 : batchSize;
68
- this.viewPort = viewPort;
69
- this.attrFilter = attrFilter;
70
- this.updateBounds();
71
- }
72
- get OnUpdate() {
73
- if (!this.onUpdate) {
74
- this.onUpdate = new bruce_event_1.BruceEvent();
75
- }
76
- return this.onUpdate;
77
- }
78
- get OnStateUpdate() {
79
- if (!this.onStateUpdate) {
80
- this.onStateUpdate = new bruce_event_1.BruceEvent();
81
- }
82
- return this.onStateUpdate;
83
- }
84
- get OnScanUpdate() {
85
- if (!this.onScanUpdate) {
86
- this.onScanUpdate = new bruce_event_1.BruceEvent();
87
- }
88
- return this.onScanUpdate;
89
- }
90
- /**
91
- * Returns id that represents the combined menu item parameters.
92
- * If integrity changes while a request is running, the request will not emit a response.
93
- * @returns
94
- */
95
- getIntegrityId() {
96
- return this.tagIds == null ? "" : this.tagIds.join();
97
- }
98
- viewAreaSub() {
99
- this.viewAreaDispose();
100
- this.viewPortChangeRemoval = this.viewPort.Updated().Subscribe(() => {
101
- this.updateBounds();
102
- this.startGetterLoop();
103
- });
104
- }
105
- viewAreaDispose() {
106
- var _a;
107
- (_a = this.viewPortChangeRemoval) === null || _a === void 0 ? void 0 : _a.call(this);
108
- }
109
- GetMenuItems() {
110
- return Object.keys(this.registeredItems);
111
- }
112
- IncludeMenuItem(menuItemId, layerIds, minHeight, maxHeight) {
113
- this.registeredItems[menuItemId] = new regMenuItemGetter(layerIds, minHeight, maxHeight);
114
- this.updateState();
115
- }
116
- ExcludeMenuItem(menuItemId) {
117
- this.registeredItems[menuItemId] = null;
118
- delete this.registeredItems[menuItemId];
119
- this.updateState();
120
- }
121
- updateBounds() {
122
- const viewRect = this.viewPort.GetBounds();
123
- const poi = this.viewPort.GetTarget();
124
- if (viewRect && poi) {
125
- if (Math.abs(viewRect.west - viewRect.east) > MAX_AREA_IN_DEGREES) {
126
- return;
127
- }
128
- if (Math.abs(viewRect.south - viewRect.north) > MAX_AREA_IN_DEGREES) {
129
- return;
130
- }
131
- this.viewRect = viewRect;
132
- this.viewCenter = poi;
133
- }
134
- }
135
- updateState() {
136
- const tagIds = [];
137
- const menuItemIds = this.GetMenuItems();
138
- let minHeight = null;
139
- let maxHeight = null;
140
- for (let i = 0; i < menuItemIds.length; i++) {
141
- const menuItem = this.registeredItems[menuItemIds[i]];
142
- if (menuItem) {
143
- if (maxHeight == null || maxHeight < menuItem.MaxHeight) {
144
- maxHeight = menuItem.MaxHeight;
145
- }
146
- if (minHeight == null || minHeight > menuItem.MinHeight) {
147
- minHeight = menuItem.MinHeight;
148
- }
149
- const itemLayerIds = menuItem.TagIds;
150
- if (itemLayerIds) {
151
- for (let j = 0; j < itemLayerIds.length; j++) {
152
- const itemLayerId = itemLayerIds[j];
153
- if (!tagIds.includes(itemLayerId)) {
154
- tagIds.push(itemLayerId);
155
- }
156
- }
157
- }
158
- }
159
- }
160
- if (menuItemIds.length > 0) {
161
- // Reset cells so none are marked as fetched.
162
- this.cells = new entity_globe_1.EntityGlobe.Grid();
163
- this.tagIds = tagIds;
164
- this.minHeight = minHeight;
165
- this.maxHeight = maxHeight;
166
- this.updateBounds();
167
- this.startGetterLoop();
168
- this.viewAreaSub();
169
- }
170
- else {
171
- this.getterLoopId += 1;
172
- this.viewAreaDispose();
173
- }
174
- }
175
- postStatus(status) {
176
- var _a;
177
- this.LastStateUpdates[status.msg] = status;
178
- (_a = this.onStateUpdate) === null || _a === void 0 ? void 0 : _a.Trigger(status);
179
- }
180
- startGetterLoop() {
181
- // Increase id so that existing loops stop.
182
- this.getterLoopId += 1;
183
- const loopId = this.getterLoopId;
184
- const loopIntegrity = this.getIntegrityId();
185
- new Promise(() => __awaiter(this, void 0, void 0, function* () {
186
- var _a, _b, _c, _d, _e, _f, _g, _h;
187
- // Minor delay to stop 50 menu items enabling doing their first request all together.
188
- // This gives it time to recognize only 1 request is needed.
189
- // Would be better to not use this delay but we're on a clock.
190
- yield delay(100);
191
- const MIN_HEIGHT = this.minHeight;
192
- const MAX_HEIGHT = this.maxHeight;
193
- const PAGE_SIZE = this.batchSize;
194
- let retryAttempts = MAX_RETRY_ATTEMPTS;
195
- let retryDelay = 0;
196
- let prevFirstId = "";
197
- let prevLastId = "";
198
- let prevTicks = 0;
199
- while ((!this.viewCenter || !this.viewRect) && this.getterLoopId == loopId) {
200
- yield delay(RETRY_DELAY_INCREMENT);
201
- }
202
- if (this.getterLoopId != loopId) {
203
- return;
204
- }
205
- const alt = this.viewRect.alt;
206
- if (alt > MAX_HEIGHT || (alt < MIN_HEIGHT && MIN_HEIGHT > 0)) {
207
- return;
208
- }
209
- const cells = this.cells.GetCellsForView(this.viewCenter, this.viewRect);
210
- (_a = this.onScanUpdate) === null || _a === void 0 ? void 0 : _a.Trigger(cells);
211
- let curCellIndex = cells.length > 0 ? 0 : null;
212
- let postedScanning = false;
213
- let postedLoading = false;
214
- let total = 0;
215
- while (retryAttempts > 0 && curCellIndex != null) {
216
- if (retryDelay > 0) {
217
- yield delay(retryDelay);
218
- }
219
- if (this.getterLoopId != loopId) {
220
- break;
221
- }
222
- if (!postedScanning) {
223
- this.postStatus({ msg: EStatus.Scanning, revoking: false });
224
- postedScanning = true;
225
- }
226
- const curCell = cells[curCellIndex];
227
- if (curCell.IsFetched()) {
228
- curCell.Fetching = false;
229
- curCellIndex += 1;
230
- if (cells[curCellIndex]) {
231
- cells[curCellIndex].Fetching = true;
232
- }
233
- else {
234
- curCellIndex = null;
235
- }
236
- (_b = this.onScanUpdate) === null || _b === void 0 ? void 0 : _b.Trigger(cells);
237
- continue;
238
- }
239
- try {
240
- let { entities } = yield entity_1.Entity.GetList({
241
- api: this.api,
242
- filter: {
243
- pageSize: PAGE_SIZE,
244
- pageIndex: curCell.FetchPageIndex,
245
- entityTypeId: this.typeId,
246
- layerIds: this.tagIds,
247
- bounds: curCell.GetBounds(),
248
- sortOrder: api_1.Api.ESortOrder.Asc,
249
- entityTypeConditions: this.attrFilter
250
- },
251
- viaCdn: this.viaCdn,
252
- req: {
253
- noCache: true
254
- }
255
- });
256
- const integrity = this.getIntegrityId();
257
- if (loopIntegrity == integrity && entities) {
258
- (_c = this.onUpdate) === null || _c === void 0 ? void 0 : _c.Trigger(entities);
259
- }
260
- if (this.getterLoopId != loopId) {
261
- break;
262
- }
263
- if (entities.length) {
264
- total += entities.length;
265
- }
266
- if (!postedLoading) {
267
- this.postStatus({ msg: EStatus.Loading, revoking: false });
268
- postedLoading = true;
269
- }
270
- // Only mark as fetched when ALL pages are done.
271
- if (entities.length <= 0) {
272
- curCell.Fetched = true;
273
- curCell.Fetching = false;
274
- (_d = this.onScanUpdate) === null || _d === void 0 ? void 0 : _d.Trigger(cells);
275
- continue;
276
- }
277
- // Checking to make sure it's not just the same batch over and over again.
278
- if (entities.length > 0) {
279
- const first = (_f = (_e = entities[0]) === null || _e === void 0 ? void 0 : _e.Bruce) === null || _f === void 0 ? void 0 : _f.ID;
280
- const last = (_h = (_g = entities[entities.length - 1]) === null || _g === void 0 ? void 0 : _g.Bruce) === null || _h === void 0 ? void 0 : _h.ID;
281
- if (prevFirstId == first && prevLastId == last) {
282
- prevTicks += 1;
283
- if (prevTicks > 3) {
284
- break;
285
- }
286
- }
287
- else {
288
- prevFirstId = first;
289
- prevLastId = last;
290
- prevTicks = 0;
291
- }
292
- }
293
- curCell.FetchPageIndex++;
294
- // Request passed so let's assume it was server hiccup and refresh counts.
295
- retryAttempts = MAX_RETRY_ATTEMPTS;
296
- retryDelay = 0;
297
- }
298
- catch (e) {
299
- console.error(e);
300
- // Request failed so let's add a delay and try again soon.
301
- retryDelay += RETRY_DELAY_INCREMENT;
302
- retryAttempts -= 1;
303
- }
304
- yield delay(REQUEST_PAGE_DELAY);
305
- }
306
- if (postedLoading) {
307
- this.postStatus({ msg: EStatus.Loading, revoking: true });
308
- }
309
- if (postedScanning) {
310
- this.postStatus({ msg: EStatus.Scanning, revoking: true });
311
- }
312
- }));
313
- }
314
- }
315
- EntityFilterGetter.Getter = Getter;
316
- })(EntityFilterGetter = exports.EntityFilterGetter || (exports.EntityFilterGetter = {}));
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.EntityFilterGetter = void 0;
13
+ const api_1 = require("../../api/api");
14
+ const bruce_event_1 = require("../../common/bruce-event");
15
+ const entity_1 = require("../entity");
16
+ const entity_globe_1 = require("./entity-globe");
17
+ const MAX_AREA_IN_DEGREES = 90;
18
+ const MAX_RETRY_ATTEMPTS = 1;
19
+ const RETRY_DELAY_INCREMENT = 500;
20
+ const REQUEST_PAGE_DELAY = 50;
21
+ class regMenuItemGetter {
22
+ constructor(tagIds, minHeight, maxHeight) {
23
+ this.TagIds = tagIds;
24
+ this.MinHeight = minHeight;
25
+ this.MaxHeight = maxHeight;
26
+ }
27
+ }
28
+ function delay(milliseconds) {
29
+ return __awaiter(this, void 0, void 0, function* () {
30
+ return new Promise((res) => {
31
+ setTimeout(() => {
32
+ res();
33
+ }, milliseconds);
34
+ });
35
+ });
36
+ }
37
+ /**
38
+ * This is a batched entity getter.
39
+ * It will scan for entity records in a view-area and emit them in batches.
40
+ * It will restart scanning if the camera moves.
41
+ */
42
+ var EntityFilterGetter;
43
+ (function (EntityFilterGetter) {
44
+ let EStatus;
45
+ (function (EStatus) {
46
+ EStatus["Scanning"] = "SCANNING";
47
+ EStatus["Loading"] = "LOADING";
48
+ })(EStatus = EntityFilterGetter.EStatus || (EntityFilterGetter.EStatus = {}));
49
+ class Getter {
50
+ get OnUpdate() {
51
+ if (!this.onUpdate) {
52
+ this.onUpdate = new bruce_event_1.BruceEvent();
53
+ }
54
+ return this.onUpdate;
55
+ }
56
+ get OnStateUpdate() {
57
+ if (!this.onStateUpdate) {
58
+ this.onStateUpdate = new bruce_event_1.BruceEvent();
59
+ }
60
+ return this.onStateUpdate;
61
+ }
62
+ get OnScanUpdate() {
63
+ if (!this.onScanUpdate) {
64
+ this.onScanUpdate = new bruce_event_1.BruceEvent();
65
+ }
66
+ return this.onScanUpdate;
67
+ }
68
+ constructor(api, viewPort, typeId, batchSize, attrFilter, viaCdn) {
69
+ this.onUpdate = null;
70
+ this.LastStateUpdates = {};
71
+ this.onStateUpdate = null;
72
+ this.onScanUpdate = null;
73
+ this.viewPortChangeRemoval = null;
74
+ this.cells = null;
75
+ this.registeredItems = {};
76
+ this.getterLoopId = 0;
77
+ this.tagIds = null;
78
+ this.minHeight = 0;
79
+ this.maxHeight = 100000;
80
+ this.viewRect = null;
81
+ this.viewCenter = null;
82
+ this.api = api;
83
+ this.typeId = typeId;
84
+ this.viaCdn = Boolean(viaCdn);
85
+ this.batchSize = isNaN(batchSize) ? 300 : batchSize;
86
+ this.viewPort = viewPort;
87
+ this.attrFilter = attrFilter;
88
+ this.updateBounds();
89
+ }
90
+ /**
91
+ * Returns id that represents the combined menu item parameters.
92
+ * If integrity changes while a request is running, the request will not emit a response.
93
+ * @returns
94
+ */
95
+ getIntegrityId() {
96
+ return this.tagIds == null ? "" : this.tagIds.join();
97
+ }
98
+ viewAreaSub() {
99
+ this.viewAreaDispose();
100
+ this.viewPortChangeRemoval = this.viewPort.Updated().Subscribe(() => {
101
+ this.updateBounds();
102
+ this.startGetterLoop();
103
+ });
104
+ }
105
+ viewAreaDispose() {
106
+ var _a;
107
+ (_a = this.viewPortChangeRemoval) === null || _a === void 0 ? void 0 : _a.call(this);
108
+ }
109
+ GetMenuItems() {
110
+ return Object.keys(this.registeredItems);
111
+ }
112
+ IncludeMenuItem(menuItemId, layerIds, minHeight, maxHeight) {
113
+ this.registeredItems[menuItemId] = new regMenuItemGetter(layerIds, minHeight, maxHeight);
114
+ this.updateState();
115
+ }
116
+ ExcludeMenuItem(menuItemId) {
117
+ this.registeredItems[menuItemId] = null;
118
+ delete this.registeredItems[menuItemId];
119
+ this.updateState();
120
+ }
121
+ updateBounds() {
122
+ const viewRect = this.viewPort.GetBounds();
123
+ const poi = this.viewPort.GetTarget();
124
+ if (viewRect && poi) {
125
+ if (Math.abs(viewRect.west - viewRect.east) > MAX_AREA_IN_DEGREES) {
126
+ return;
127
+ }
128
+ if (Math.abs(viewRect.south - viewRect.north) > MAX_AREA_IN_DEGREES) {
129
+ return;
130
+ }
131
+ this.viewRect = viewRect;
132
+ this.viewCenter = poi;
133
+ }
134
+ }
135
+ updateState() {
136
+ const tagIds = [];
137
+ const menuItemIds = this.GetMenuItems();
138
+ let minHeight = null;
139
+ let maxHeight = null;
140
+ for (let i = 0; i < menuItemIds.length; i++) {
141
+ const menuItem = this.registeredItems[menuItemIds[i]];
142
+ if (menuItem) {
143
+ if (maxHeight == null || maxHeight < menuItem.MaxHeight) {
144
+ maxHeight = menuItem.MaxHeight;
145
+ }
146
+ if (minHeight == null || minHeight > menuItem.MinHeight) {
147
+ minHeight = menuItem.MinHeight;
148
+ }
149
+ const itemLayerIds = menuItem.TagIds;
150
+ if (itemLayerIds) {
151
+ for (let j = 0; j < itemLayerIds.length; j++) {
152
+ const itemLayerId = itemLayerIds[j];
153
+ if (!tagIds.includes(itemLayerId)) {
154
+ tagIds.push(itemLayerId);
155
+ }
156
+ }
157
+ }
158
+ }
159
+ }
160
+ if (menuItemIds.length > 0) {
161
+ // Reset cells so none are marked as fetched.
162
+ this.cells = new entity_globe_1.EntityGlobe.Grid();
163
+ this.tagIds = tagIds;
164
+ this.minHeight = minHeight;
165
+ this.maxHeight = maxHeight;
166
+ this.updateBounds();
167
+ this.startGetterLoop();
168
+ this.viewAreaSub();
169
+ }
170
+ else {
171
+ this.getterLoopId += 1;
172
+ this.viewAreaDispose();
173
+ }
174
+ }
175
+ postStatus(status) {
176
+ var _a;
177
+ this.LastStateUpdates[status.msg] = status;
178
+ (_a = this.onStateUpdate) === null || _a === void 0 ? void 0 : _a.Trigger(status);
179
+ }
180
+ startGetterLoop() {
181
+ // Increase id so that existing loops stop.
182
+ this.getterLoopId += 1;
183
+ const loopId = this.getterLoopId;
184
+ const loopIntegrity = this.getIntegrityId();
185
+ new Promise(() => __awaiter(this, void 0, void 0, function* () {
186
+ var _a, _b, _c, _d, _e, _f, _g, _h;
187
+ // Minor delay to stop 50 menu items enabling doing their first request all together.
188
+ // This gives it time to recognize only 1 request is needed.
189
+ // Would be better to not use this delay but we're on a clock.
190
+ yield delay(100);
191
+ const MIN_HEIGHT = this.minHeight;
192
+ const MAX_HEIGHT = this.maxHeight;
193
+ const PAGE_SIZE = this.batchSize;
194
+ let retryAttempts = MAX_RETRY_ATTEMPTS;
195
+ let retryDelay = 0;
196
+ let prevFirstId = "";
197
+ let prevLastId = "";
198
+ let prevTicks = 0;
199
+ while ((!this.viewCenter || !this.viewRect) && this.getterLoopId == loopId) {
200
+ yield delay(RETRY_DELAY_INCREMENT);
201
+ }
202
+ if (this.getterLoopId != loopId) {
203
+ return;
204
+ }
205
+ const alt = this.viewRect.alt;
206
+ if (alt > MAX_HEIGHT || (alt < MIN_HEIGHT && MIN_HEIGHT > 0)) {
207
+ return;
208
+ }
209
+ const cells = this.cells.GetCellsForView(this.viewCenter, this.viewRect);
210
+ (_a = this.onScanUpdate) === null || _a === void 0 ? void 0 : _a.Trigger(cells);
211
+ let curCellIndex = cells.length > 0 ? 0 : null;
212
+ let postedScanning = false;
213
+ let postedLoading = false;
214
+ let total = 0;
215
+ while (retryAttempts > 0 && curCellIndex != null) {
216
+ if (retryDelay > 0) {
217
+ yield delay(retryDelay);
218
+ }
219
+ if (this.getterLoopId != loopId) {
220
+ break;
221
+ }
222
+ if (!postedScanning) {
223
+ this.postStatus({ msg: EStatus.Scanning, revoking: false });
224
+ postedScanning = true;
225
+ }
226
+ const curCell = cells[curCellIndex];
227
+ if (curCell.IsFetched()) {
228
+ curCell.Fetching = false;
229
+ curCellIndex += 1;
230
+ if (cells[curCellIndex]) {
231
+ cells[curCellIndex].Fetching = true;
232
+ }
233
+ else {
234
+ curCellIndex = null;
235
+ }
236
+ (_b = this.onScanUpdate) === null || _b === void 0 ? void 0 : _b.Trigger(cells);
237
+ continue;
238
+ }
239
+ try {
240
+ let { entities } = yield entity_1.Entity.GetList({
241
+ api: this.api,
242
+ filter: {
243
+ pageSize: PAGE_SIZE,
244
+ pageIndex: curCell.FetchPageIndex,
245
+ entityTypeId: this.typeId,
246
+ layerIds: this.tagIds,
247
+ bounds: curCell.GetBounds(),
248
+ sortOrder: api_1.Api.ESortOrder.Asc,
249
+ entityTypeConditions: this.attrFilter
250
+ },
251
+ viaCdn: this.viaCdn,
252
+ req: {
253
+ noCache: true
254
+ }
255
+ });
256
+ const integrity = this.getIntegrityId();
257
+ if (loopIntegrity == integrity && entities) {
258
+ (_c = this.onUpdate) === null || _c === void 0 ? void 0 : _c.Trigger(entities);
259
+ }
260
+ if (this.getterLoopId != loopId) {
261
+ break;
262
+ }
263
+ if (entities.length) {
264
+ total += entities.length;
265
+ }
266
+ if (!postedLoading) {
267
+ this.postStatus({ msg: EStatus.Loading, revoking: false });
268
+ postedLoading = true;
269
+ }
270
+ // Only mark as fetched when ALL pages are done.
271
+ if (entities.length <= 0) {
272
+ curCell.Fetched = true;
273
+ curCell.Fetching = false;
274
+ (_d = this.onScanUpdate) === null || _d === void 0 ? void 0 : _d.Trigger(cells);
275
+ continue;
276
+ }
277
+ // Checking to make sure it's not just the same batch over and over again.
278
+ if (entities.length > 0) {
279
+ const first = (_f = (_e = entities[0]) === null || _e === void 0 ? void 0 : _e.Bruce) === null || _f === void 0 ? void 0 : _f.ID;
280
+ const last = (_h = (_g = entities[entities.length - 1]) === null || _g === void 0 ? void 0 : _g.Bruce) === null || _h === void 0 ? void 0 : _h.ID;
281
+ if (prevFirstId == first && prevLastId == last) {
282
+ prevTicks += 1;
283
+ if (prevTicks > 3) {
284
+ break;
285
+ }
286
+ }
287
+ else {
288
+ prevFirstId = first;
289
+ prevLastId = last;
290
+ prevTicks = 0;
291
+ }
292
+ }
293
+ curCell.FetchPageIndex++;
294
+ // Request passed so let's assume it was server hiccup and refresh counts.
295
+ retryAttempts = MAX_RETRY_ATTEMPTS;
296
+ retryDelay = 0;
297
+ }
298
+ catch (e) {
299
+ console.error(e);
300
+ // Request failed so let's add a delay and try again soon.
301
+ retryDelay += RETRY_DELAY_INCREMENT;
302
+ retryAttempts -= 1;
303
+ }
304
+ yield delay(REQUEST_PAGE_DELAY);
305
+ }
306
+ if (postedLoading) {
307
+ this.postStatus({ msg: EStatus.Loading, revoking: true });
308
+ }
309
+ if (postedScanning) {
310
+ this.postStatus({ msg: EStatus.Scanning, revoking: true });
311
+ }
312
+ }));
313
+ }
314
+ }
315
+ EntityFilterGetter.Getter = Getter;
316
+ })(EntityFilterGetter = exports.EntityFilterGetter || (exports.EntityFilterGetter = {}));
317
317
  //# sourceMappingURL=entity-filter-getter.js.map