@vived/host 4.6.0 → 4.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/dist/cjs/Assets/UCs/GetAssetBlobURLUC.js +104 -27
  2. package/dist/cjs/Assets/UCs/GetAssetBlobURLUC.js.map +1 -1
  3. package/dist/cjs/Assets/UCs/GetAssetFileUC.js +111 -34
  4. package/dist/cjs/Assets/UCs/GetAssetFileUC.js.map +1 -1
  5. package/dist/cjs/Cache/Controllers/clearCache.js +13 -0
  6. package/dist/cjs/Cache/Controllers/clearCache.js.map +1 -0
  7. package/dist/cjs/Cache/Controllers/index.js +18 -0
  8. package/dist/cjs/Cache/Controllers/index.js.map +1 -0
  9. package/dist/cjs/Cache/Entities/AssetCacheEntity.js +95 -0
  10. package/dist/cjs/Cache/Entities/AssetCacheEntity.js.map +1 -0
  11. package/dist/cjs/Cache/Entities/CacheEntity.js +54 -0
  12. package/dist/cjs/Cache/Entities/CacheEntity.js.map +1 -0
  13. package/dist/cjs/Cache/Entities/ScriptCacheEntity.js +137 -0
  14. package/dist/cjs/Cache/Entities/ScriptCacheEntity.js.map +1 -0
  15. package/dist/cjs/Cache/Entities/index.js +25 -0
  16. package/dist/cjs/Cache/Entities/index.js.map +1 -0
  17. package/dist/cjs/Cache/Factories/index.js +18 -0
  18. package/dist/cjs/Cache/Factories/index.js.map +1 -0
  19. package/dist/cjs/Cache/Factories/setupCache.js +27 -0
  20. package/dist/cjs/Cache/Factories/setupCache.js.map +1 -0
  21. package/dist/cjs/Cache/Mocks/MockCacheEntity.js +22 -0
  22. package/dist/cjs/Cache/Mocks/MockCacheEntity.js.map +1 -0
  23. package/dist/cjs/Cache/Mocks/MockGetAssetFromCacheUC.js +19 -0
  24. package/dist/cjs/Cache/Mocks/MockGetAssetFromCacheUC.js.map +1 -0
  25. package/dist/cjs/Cache/Mocks/MockGetScriptFromCacheUC.js +22 -0
  26. package/dist/cjs/Cache/Mocks/MockGetScriptFromCacheUC.js.map +1 -0
  27. package/dist/cjs/Cache/Mocks/MockStoreAssetInCacheUC.js +17 -0
  28. package/dist/cjs/Cache/Mocks/MockStoreAssetInCacheUC.js.map +1 -0
  29. package/dist/cjs/Cache/Mocks/MockStoreScriptInCacheUC.js +22 -0
  30. package/dist/cjs/Cache/Mocks/MockStoreScriptInCacheUC.js.map +1 -0
  31. package/dist/cjs/Cache/Mocks/index.js +22 -0
  32. package/dist/cjs/Cache/Mocks/index.js.map +1 -0
  33. package/dist/cjs/Cache/UCs/GetAssetFromCacheUC.js +40 -0
  34. package/dist/cjs/Cache/UCs/GetAssetFromCacheUC.js.map +1 -0
  35. package/dist/cjs/Cache/UCs/GetScriptFromCacheUC.js +49 -0
  36. package/dist/cjs/Cache/UCs/GetScriptFromCacheUC.js.map +1 -0
  37. package/dist/cjs/Cache/UCs/StoreAssetInCacheUC.js +39 -0
  38. package/dist/cjs/Cache/UCs/StoreAssetInCacheUC.js.map +1 -0
  39. package/dist/cjs/Cache/UCs/StoreScriptInCacheUC.js +48 -0
  40. package/dist/cjs/Cache/UCs/StoreScriptInCacheUC.js.map +1 -0
  41. package/dist/cjs/Cache/UCs/index.js +26 -0
  42. package/dist/cjs/Cache/UCs/index.js.map +1 -0
  43. package/dist/cjs/Cache/index.js +21 -0
  44. package/dist/cjs/Cache/index.js.map +1 -0
  45. package/dist/cjs/StateMachine/Entities/HostEditingStateEntity.js +62 -0
  46. package/dist/cjs/StateMachine/Entities/HostEditingStateEntity.js.map +1 -1
  47. package/dist/cjs/StateMachine/Entities/HostStateEntity.js +91 -2
  48. package/dist/cjs/StateMachine/Entities/HostStateEntity.js.map +1 -1
  49. package/dist/cjs/StateMachine/Entities/HostStateMachine.js +127 -0
  50. package/dist/cjs/StateMachine/Entities/HostStateMachine.js.map +1 -1
  51. package/dist/cjs/StateMachine/Mocks/MockHostStateEntity.js +1 -0
  52. package/dist/cjs/StateMachine/Mocks/MockHostStateEntity.js.map +1 -1
  53. package/dist/cjs/StateMachine/PMs/HostStatePM.js +6 -2
  54. package/dist/cjs/StateMachine/PMs/HostStatePM.js.map +1 -1
  55. package/dist/cjs/StateMachine/UCs/DeleteStateUC.js +1 -1
  56. package/dist/cjs/StateMachine/UCs/DeleteStateUC.js.map +1 -1
  57. package/dist/cjs/StateMachine/UCs/DuplicateStateUC.js +1 -1
  58. package/dist/cjs/StateMachine/UCs/DuplicateStateUC.js.map +1 -1
  59. package/dist/cjs/StateMachine/UCs/SavePersistentStates.js.map +1 -1
  60. package/dist/cjs/index.js +1 -0
  61. package/dist/cjs/index.js.map +1 -1
  62. package/dist/esm/Assets/UCs/GetAssetBlobURLUC.js +104 -27
  63. package/dist/esm/Assets/UCs/GetAssetBlobURLUC.js.map +1 -1
  64. package/dist/esm/Assets/UCs/GetAssetFileUC.js +111 -34
  65. package/dist/esm/Assets/UCs/GetAssetFileUC.js.map +1 -1
  66. package/dist/esm/Cache/Controllers/clearCache.js +10 -0
  67. package/dist/esm/Cache/Controllers/clearCache.js.map +1 -0
  68. package/dist/esm/Cache/Controllers/index.js +2 -0
  69. package/dist/esm/Cache/Controllers/index.js.map +1 -0
  70. package/dist/esm/Cache/Entities/AssetCacheEntity.js +90 -0
  71. package/dist/esm/Cache/Entities/AssetCacheEntity.js.map +1 -0
  72. package/dist/esm/Cache/Entities/CacheEntity.js +49 -0
  73. package/dist/esm/Cache/Entities/CacheEntity.js.map +1 -0
  74. package/dist/esm/Cache/Entities/ScriptCacheEntity.js +132 -0
  75. package/dist/esm/Cache/Entities/ScriptCacheEntity.js.map +1 -0
  76. package/dist/esm/Cache/Entities/index.js +9 -0
  77. package/dist/esm/Cache/Entities/index.js.map +1 -0
  78. package/dist/esm/Cache/Factories/index.js +2 -0
  79. package/dist/esm/Cache/Factories/index.js.map +1 -0
  80. package/dist/esm/Cache/Factories/setupCache.js +24 -0
  81. package/dist/esm/Cache/Factories/setupCache.js.map +1 -0
  82. package/dist/esm/Cache/Mocks/MockCacheEntity.js +17 -0
  83. package/dist/esm/Cache/Mocks/MockCacheEntity.js.map +1 -0
  84. package/dist/esm/Cache/Mocks/MockGetAssetFromCacheUC.js +14 -0
  85. package/dist/esm/Cache/Mocks/MockGetAssetFromCacheUC.js.map +1 -0
  86. package/dist/esm/Cache/Mocks/MockGetScriptFromCacheUC.js +17 -0
  87. package/dist/esm/Cache/Mocks/MockGetScriptFromCacheUC.js.map +1 -0
  88. package/dist/esm/Cache/Mocks/MockStoreAssetInCacheUC.js +12 -0
  89. package/dist/esm/Cache/Mocks/MockStoreAssetInCacheUC.js.map +1 -0
  90. package/dist/esm/Cache/Mocks/MockStoreScriptInCacheUC.js +17 -0
  91. package/dist/esm/Cache/Mocks/MockStoreScriptInCacheUC.js.map +1 -0
  92. package/dist/esm/Cache/Mocks/index.js +6 -0
  93. package/dist/esm/Cache/Mocks/index.js.map +1 -0
  94. package/dist/esm/Cache/UCs/GetAssetFromCacheUC.js +35 -0
  95. package/dist/esm/Cache/UCs/GetAssetFromCacheUC.js.map +1 -0
  96. package/dist/esm/Cache/UCs/GetScriptFromCacheUC.js +44 -0
  97. package/dist/esm/Cache/UCs/GetScriptFromCacheUC.js.map +1 -0
  98. package/dist/esm/Cache/UCs/StoreAssetInCacheUC.js +34 -0
  99. package/dist/esm/Cache/UCs/StoreAssetInCacheUC.js.map +1 -0
  100. package/dist/esm/Cache/UCs/StoreScriptInCacheUC.js +43 -0
  101. package/dist/esm/Cache/UCs/StoreScriptInCacheUC.js.map +1 -0
  102. package/dist/esm/Cache/UCs/index.js +10 -0
  103. package/dist/esm/Cache/UCs/index.js.map +1 -0
  104. package/dist/esm/Cache/index.js +5 -0
  105. package/dist/esm/Cache/index.js.map +1 -0
  106. package/dist/esm/StateMachine/Entities/HostEditingStateEntity.js +62 -0
  107. package/dist/esm/StateMachine/Entities/HostEditingStateEntity.js.map +1 -1
  108. package/dist/esm/StateMachine/Entities/HostStateEntity.js +90 -1
  109. package/dist/esm/StateMachine/Entities/HostStateEntity.js.map +1 -1
  110. package/dist/esm/StateMachine/Entities/HostStateMachine.js +127 -0
  111. package/dist/esm/StateMachine/Entities/HostStateMachine.js.map +1 -1
  112. package/dist/esm/StateMachine/Mocks/MockHostStateEntity.js +2 -1
  113. package/dist/esm/StateMachine/Mocks/MockHostStateEntity.js.map +1 -1
  114. package/dist/esm/StateMachine/PMs/HostStatePM.js +7 -3
  115. package/dist/esm/StateMachine/PMs/HostStatePM.js.map +1 -1
  116. package/dist/esm/StateMachine/UCs/DeleteStateUC.js +1 -1
  117. package/dist/esm/StateMachine/UCs/DeleteStateUC.js.map +1 -1
  118. package/dist/esm/StateMachine/UCs/DuplicateStateUC.js +1 -1
  119. package/dist/esm/StateMachine/UCs/DuplicateStateUC.js.map +1 -1
  120. package/dist/esm/StateMachine/UCs/SavePersistentStates.js.map +1 -1
  121. package/dist/esm/index.js +1 -0
  122. package/dist/esm/index.js.map +1 -1
  123. package/dist/types/Assets/UCs/GetAssetBlobURLUC.d.ts.map +1 -1
  124. package/dist/types/Cache/Controllers/clearCache.d.ts +3 -0
  125. package/dist/types/Cache/Controllers/clearCache.d.ts.map +1 -0
  126. package/dist/types/Cache/Controllers/index.d.ts +2 -0
  127. package/dist/types/Cache/Controllers/index.d.ts.map +1 -0
  128. package/dist/types/Cache/Entities/AssetCacheEntity.d.ts +43 -0
  129. package/dist/types/Cache/Entities/AssetCacheEntity.d.ts.map +1 -0
  130. package/dist/types/Cache/Entities/CacheEntity.d.ts +57 -0
  131. package/dist/types/Cache/Entities/CacheEntity.d.ts.map +1 -0
  132. package/dist/types/Cache/Entities/ScriptCacheEntity.d.ts +64 -0
  133. package/dist/types/Cache/Entities/ScriptCacheEntity.d.ts.map +1 -0
  134. package/dist/types/Cache/Entities/index.d.ts +9 -0
  135. package/dist/types/Cache/Entities/index.d.ts.map +1 -0
  136. package/dist/types/Cache/Factories/index.d.ts +2 -0
  137. package/dist/types/Cache/Factories/index.d.ts.map +1 -0
  138. package/dist/types/Cache/Factories/setupCache.d.ts +6 -0
  139. package/dist/types/Cache/Factories/setupCache.d.ts.map +1 -0
  140. package/dist/types/Cache/Mocks/MockCacheEntity.d.ts +13 -0
  141. package/dist/types/Cache/Mocks/MockCacheEntity.d.ts.map +1 -0
  142. package/dist/types/Cache/Mocks/MockGetAssetFromCacheUC.d.ts +8 -0
  143. package/dist/types/Cache/Mocks/MockGetAssetFromCacheUC.d.ts.map +1 -0
  144. package/dist/types/Cache/Mocks/MockGetScriptFromCacheUC.d.ts +9 -0
  145. package/dist/types/Cache/Mocks/MockGetScriptFromCacheUC.d.ts.map +1 -0
  146. package/dist/types/Cache/Mocks/MockStoreAssetInCacheUC.d.ts +8 -0
  147. package/dist/types/Cache/Mocks/MockStoreAssetInCacheUC.d.ts.map +1 -0
  148. package/dist/types/Cache/Mocks/MockStoreScriptInCacheUC.d.ts +9 -0
  149. package/dist/types/Cache/Mocks/MockStoreScriptInCacheUC.d.ts.map +1 -0
  150. package/dist/types/Cache/Mocks/index.d.ts +6 -0
  151. package/dist/types/Cache/Mocks/index.d.ts.map +1 -0
  152. package/dist/types/Cache/UCs/GetAssetFromCacheUC.d.ts +8 -0
  153. package/dist/types/Cache/UCs/GetAssetFromCacheUC.d.ts.map +1 -0
  154. package/dist/types/Cache/UCs/GetScriptFromCacheUC.d.ts +13 -0
  155. package/dist/types/Cache/UCs/GetScriptFromCacheUC.d.ts.map +1 -0
  156. package/dist/types/Cache/UCs/StoreAssetInCacheUC.d.ts +8 -0
  157. package/dist/types/Cache/UCs/StoreAssetInCacheUC.d.ts.map +1 -0
  158. package/dist/types/Cache/UCs/StoreScriptInCacheUC.d.ts +13 -0
  159. package/dist/types/Cache/UCs/StoreScriptInCacheUC.d.ts.map +1 -0
  160. package/dist/types/Cache/UCs/index.d.ts +10 -0
  161. package/dist/types/Cache/UCs/index.d.ts.map +1 -0
  162. package/dist/types/Cache/index.d.ts +5 -0
  163. package/dist/types/Cache/index.d.ts.map +1 -0
  164. package/dist/types/StateMachine/Entities/HostEditingStateEntity.d.ts +42 -0
  165. package/dist/types/StateMachine/Entities/HostEditingStateEntity.d.ts.map +1 -1
  166. package/dist/types/StateMachine/Entities/HostStateEntity.d.ts +72 -5
  167. package/dist/types/StateMachine/Entities/HostStateEntity.d.ts.map +1 -1
  168. package/dist/types/StateMachine/Entities/HostStateMachine.d.ts +77 -0
  169. package/dist/types/StateMachine/Entities/HostStateMachine.d.ts.map +1 -1
  170. package/dist/types/StateMachine/Mocks/MockHostStateEntity.d.ts +2 -1
  171. package/dist/types/StateMachine/Mocks/MockHostStateEntity.d.ts.map +1 -1
  172. package/dist/types/StateMachine/PMs/HostStatePM.d.ts +2 -0
  173. package/dist/types/StateMachine/PMs/HostStatePM.d.ts.map +1 -1
  174. package/dist/types/StateMachine/UCs/SavePersistentStates.d.ts.map +1 -1
  175. package/dist/types/index.d.ts +1 -0
  176. package/dist/types/index.d.ts.map +1 -1
  177. package/package.json +1 -1
@@ -5,26 +5,69 @@ exports.makeHostStateMachine = makeHostStateMachine;
5
5
  const core_1 = require("@vived/core");
6
6
  const core_2 = require("@vived/core");
7
7
  const HostStateEntity_1 = require("./HostStateEntity");
8
+ /**
9
+ * HostStateMachine manages a collection of states and controls state transitions.
10
+ *
11
+ * This singleton component serves as the central controller for the VIVED platform's
12
+ * state-based application model. It maintains an ordered collection of states,
13
+ * tracks the currently active state, and provides methods for state transitions,
14
+ * creation, deletion, and reordering.
15
+ *
16
+ * The state machine can be used in both runtime and authoring modes:
17
+ * - In runtime: For navigating between predefined states in an application
18
+ * - In authoring: For creating and organizing states through a content editor
19
+ *
20
+ * This entity works closely with HostStateEntity (individual states) and
21
+ * HostEditingStateEntity (for state authoring).
22
+ */
8
23
  class HostStateMachine extends core_2.AppObjectEntity {
24
+ /**
25
+ * Gets the singleton instance of HostStateMachine
26
+ * @param appObjects The app object repository
27
+ * @returns The HostStateMachine instance
28
+ */
9
29
  static get(appObjects) {
10
30
  return (0, core_2.getSingletonComponent)(HostStateMachine.type, appObjects);
11
31
  }
12
32
  }
13
33
  exports.HostStateMachine = HostStateMachine;
14
34
  HostStateMachine.type = "HostStateMachine";
35
+ /**
36
+ * Factory function for creating a HostStateMachine instance
37
+ * @param appObject The AppObject to associate with this entity
38
+ * @returns A new HostStateMachine instance
39
+ */
15
40
  function makeHostStateMachine(appObject) {
16
41
  return new HostStateMachineImp(appObject);
17
42
  }
43
+ /**
44
+ * Implementation of the HostStateMachine abstract class
45
+ * Provides concrete implementation of state machine functionality
46
+ */
18
47
  class HostStateMachineImp extends HostStateMachine {
48
+ /**
49
+ * List of all state IDs in order
50
+ * @returns Array of state IDs
51
+ */
19
52
  get states() {
20
53
  return this._states.map((state) => state.id);
21
54
  }
55
+ /**
56
+ * Total number of states in the machine
57
+ * @returns Number of states
58
+ */
22
59
  get stateCount() {
23
60
  return this._states.length;
24
61
  }
25
62
  get activeState() {
26
63
  return this._activeState;
27
64
  }
65
+ /**
66
+ * ID of the state preceding the active state
67
+ * Returns undefined if:
68
+ * - No active state
69
+ * - Active state is the first state
70
+ */
28
71
  get previousState() {
29
72
  if (!this._activeState)
30
73
  return undefined;
@@ -33,6 +76,12 @@ class HostStateMachineImp extends HostStateMachine {
33
76
  return undefined;
34
77
  return this._states[currentIndex - 1].id;
35
78
  }
79
+ /**
80
+ * ID of the state following the active state
81
+ * Returns undefined if:
82
+ * - No active state
83
+ * - Active state is the last state
84
+ */
36
85
  get nextState() {
37
86
  if (!this._activeState)
38
87
  return undefined;
@@ -68,6 +117,11 @@ class HostStateMachineImp extends HostStateMachine {
68
117
  set lastAssets(lastAssets) {
69
118
  this._lastAssets = lastAssets;
70
119
  }
120
+ /**
121
+ * Helper method to find a state by ID
122
+ * @param id ID to search for
123
+ * @returns The state entity or undefined if not found
124
+ */
71
125
  findStateByID(id) {
72
126
  for (const state of this._states) {
73
127
  if (state.id === id) {
@@ -78,10 +132,25 @@ class HostStateMachineImp extends HostStateMachine {
78
132
  }
79
133
  constructor(appObject) {
80
134
  super(appObject, HostStateMachine.type);
135
+ /** Internal storage for state entities */
81
136
  this._states = [];
137
+ /** Duration for transitions between states (in seconds) */
82
138
  this.transitionDuration = 1;
139
+ /**
140
+ * Whether the state machine is in authoring mode
141
+ * In authoring mode, additional editing features are enabled
142
+ */
83
143
  this.memoizedIsAuthoring = new core_1.MemoizedBoolean(false, this.notifyOnChange);
144
+ /**
145
+ * Tracks assets used in previous state for preloading optimization
146
+ * Helps optimize asset loading between state transitions
147
+ */
84
148
  this._lastAssets = [];
149
+ /**
150
+ * Checks if a state with the given ID exists
151
+ * @param id ID to check
152
+ * @returns true if state exists, false otherwise
153
+ */
85
154
  this.hasState = (id) => {
86
155
  const state = this.findStateByID(id);
87
156
  if (state) {
@@ -91,6 +160,10 @@ class HostStateMachineImp extends HostStateMachine {
91
160
  return false;
92
161
  }
93
162
  };
163
+ /**
164
+ * Sets the active state by its ID
165
+ * @param id ID of the state to activate
166
+ */
94
167
  this.setActiveStateByID = (id) => {
95
168
  const state = this.findStateByID(id);
96
169
  if (!state)
@@ -100,35 +173,66 @@ class HostStateMachineImp extends HostStateMachine {
100
173
  this._activeState = state.id;
101
174
  this.notifyOnChange();
102
175
  };
176
+ /**
177
+ * Sets the active state by its index in the states array
178
+ * @param index Zero-based index of the state to activate
179
+ */
103
180
  this.setActiveStateByIndex = (index) => {
104
181
  if (index < 0 || index >= this._states.length)
105
182
  return;
106
183
  const state = this._states[index];
107
184
  this.setActiveStateByID(state.id);
108
185
  };
186
+ /**
187
+ * Clears the active state (no state will be active)
188
+ */
109
189
  this.clearActiveState = () => {
110
190
  if (!this.activeState)
111
191
  return;
112
192
  this._activeState = undefined;
113
193
  this.notifyOnChange();
114
194
  };
195
+ /**
196
+ * Replaces all states with a new collection
197
+ * @param states Array of state entities to use
198
+ */
115
199
  this.setStates = (states) => {
116
200
  this._states = states;
117
201
  this.notifyOnChange();
118
202
  };
203
+ /**
204
+ * Factory function for creating state entities
205
+ * Creates a new AppObject with the given ID and wraps it in a HostStateEntity
206
+ * @param id ID for the new state
207
+ * @returns A new HostStateEntity instance
208
+ */
119
209
  this.stateFactory = (id) => {
120
210
  const ao = this.appObjects.getOrCreate(id);
121
211
  return (0, HostStateEntity_1.makeHostStateEntity)(ao);
122
212
  };
213
+ /**
214
+ * Creates a new empty state and adds it to the end of the states array
215
+ * @returns The newly created state entity
216
+ */
123
217
  this.createNewState = () => {
124
218
  const newState = this.stateFactory((0, core_1.generateUniqueID)());
125
219
  this._states.push(newState);
126
220
  this.notifyOnChange();
127
221
  return newState;
128
222
  };
223
+ /**
224
+ * Gets a state entity by its ID
225
+ * @param id ID of the state to retrieve
226
+ * @returns The state entity or undefined if not found
227
+ */
129
228
  this.getStateByID = (id) => {
130
229
  return this.findStateByID(id);
131
230
  };
231
+ /**
232
+ * Deletes a state from the machine by its ID
233
+ * Also disposes the associated AppObject
234
+ * @param id ID of the state to delete
235
+ */
132
236
  this.deleteState = (id) => {
133
237
  const index = this.getStateIndex(id);
134
238
  if (index === undefined) {
@@ -139,6 +243,10 @@ class HostStateMachineImp extends HostStateMachine {
139
243
  this._states.splice(index, 1);
140
244
  this.notifyOnChange();
141
245
  };
246
+ /**
247
+ * Deletes all states from the machine
248
+ * Also disposes all associated AppObjects
249
+ */
142
250
  this.deleteAllStates = () => {
143
251
  if (this._states.length === 0)
144
252
  return;
@@ -150,6 +258,11 @@ class HostStateMachineImp extends HostStateMachine {
150
258
  this.clearActiveState();
151
259
  this.notifyOnChange();
152
260
  };
261
+ /**
262
+ * Gets the index of a state in the states array
263
+ * @param id ID of the state
264
+ * @returns Zero-based index or undefined if not found
265
+ */
153
266
  this.getStateIndex = (id) => {
154
267
  let index = -1;
155
268
  this._states.forEach((state, i) => {
@@ -164,16 +277,30 @@ class HostStateMachineImp extends HostStateMachine {
164
277
  return undefined;
165
278
  }
166
279
  };
280
+ /**
281
+ * Activates the state before the current active state
282
+ * Does nothing if there is no previous state
283
+ */
167
284
  this.setPreviousStateActive = () => {
168
285
  if (!this.previousState)
169
286
  return;
170
287
  this.setActiveStateByID(this.previousState);
171
288
  };
289
+ /**
290
+ * Activates the state after the current active state
291
+ * Does nothing if there is no next state
292
+ */
172
293
  this.setNextStateActive = () => {
173
294
  if (!this.nextState)
174
295
  return;
175
296
  this.setActiveStateByID(this.nextState);
176
297
  };
298
+ /**
299
+ * Moves a state to a different position in the states array
300
+ * Used for reordering states in the state machine
301
+ * @param stateID ID of the state to move
302
+ * @param index Destination index
303
+ */
177
304
  this.setStateIndex = (stateID, index) => {
178
305
  // Check if the state exists
179
306
  const state = this.getStateByID(stateID);
@@ -1 +1 @@
1
- {"version":3,"file":"HostStateMachine.js","sourceRoot":"","sources":["../../../../src/StateMachine/Entities/HostStateMachine.ts"],"names":[],"mappings":"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","sourcesContent":["import { generateUniqueID, MemoizedBoolean } from \"@vived/core\";\r\nimport {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectEntity,\r\n AppObjectRepo\r\n} from \"@vived/core\";\r\nimport { HostStateEntity, makeHostStateEntity } from \"./HostStateEntity\";\r\n\r\nexport abstract class HostStateMachine extends AppObjectEntity {\r\n static type = \"HostStateMachine\";\r\n\r\n abstract states: string[];\r\n abstract stateCount: number;\r\n\r\n abstract activeState: string | undefined;\r\n abstract previousState: string | undefined;\r\n abstract nextState: string | undefined;\r\n\r\n abstract transitionDuration: number;\r\n\r\n abstract setActiveStateByID: (id: string) => void;\r\n abstract setActiveStateByIndex: (index: number) => void;\r\n abstract clearActiveState: () => void;\r\n abstract setStates: (states: HostStateEntity[]) => void;\r\n abstract createNewState: () => HostStateEntity;\r\n abstract getStateByID: (id: string) => HostStateEntity | undefined;\r\n abstract deleteState: (id: string) => void;\r\n abstract deleteAllStates: () => void;\r\n abstract getStateIndex: (id: string) => number | undefined;\r\n abstract hasState: (id: string) => boolean;\r\n abstract stateFactory: (id: string) => HostStateEntity;\r\n abstract setPreviousStateActive: () => void;\r\n abstract setNextStateActive: () => void;\r\n abstract setStateIndex: (stateID: string, index: number) => void;\r\n\r\n static get(appObjects: AppObjectRepo) {\r\n return getSingletonComponent<HostStateMachine>(\r\n HostStateMachine.type,\r\n appObjects\r\n );\r\n }\r\n}\r\n\r\nexport function makeHostStateMachine(appObject: AppObject): HostStateMachine {\r\n return new HostStateMachineImp(appObject);\r\n}\r\n\r\nclass HostStateMachineImp extends HostStateMachine {\r\n private _states: HostStateEntity[] = [];\r\n\r\n transitionDuration = 1;\r\n\r\n get states() {\r\n return this._states.map((state) => state.id);\r\n }\r\n\r\n get stateCount(): number {\r\n return this._states.length;\r\n }\r\n\r\n private _activeState: string | undefined;\r\n get activeState() {\r\n return this._activeState;\r\n }\r\n\r\n get previousState(): string | undefined {\r\n if (!this._activeState) return undefined;\r\n \r\n const currentIndex = this.getStateIndex(this._activeState);\r\n if (currentIndex === undefined || currentIndex === 0) return undefined;\r\n \r\n return this._states[currentIndex - 1].id;\r\n }\r\n\r\n get nextState(): string | undefined {\r\n if (!this._activeState) return undefined;\r\n \r\n const currentIndex = this.getStateIndex(this._activeState);\r\n if (currentIndex === undefined || currentIndex >= this._states.length - 1) return undefined;\r\n \r\n return this._states[currentIndex + 1].id;\r\n }\r\n\r\n private memoizedIsAuthoring = new MemoizedBoolean(false, this.notifyOnChange);\r\n get isAuthoring() {\r\n return this.memoizedIsAuthoring.val;\r\n }\r\n set isAuthoring(val: boolean) {\r\n this.memoizedIsAuthoring.val = val;\r\n }\r\n\r\n public initialEditingState?: string;\r\n\r\n private _lastEditingState: object | undefined;\r\n get lastEditingState(): object | undefined {\r\n return this._lastEditingState;\r\n }\r\n set lastEditingState(val: object | undefined) {\r\n if (this._lastEditingState === undefined && val === undefined) return;\r\n\r\n const lastStateStr =\r\n this.lastEditingState === undefined\r\n ? \"\"\r\n : JSON.stringify(this.lastEditingState);\r\n const valStateStr = val === undefined ? \"\" : JSON.stringify(val);\r\n\r\n if (lastStateStr === valStateStr) return;\r\n\r\n this._lastEditingState = val;\r\n this.notifyOnChange();\r\n }\r\n\r\n private _lastAssets: string[] = [];\r\n get lastAssets(): string[] {\r\n return this._lastAssets;\r\n }\r\n\r\n set lastAssets(lastAssets: string[]) {\r\n this._lastAssets = lastAssets;\r\n }\r\n\r\n public validationErrorMessage?: string;\r\n\r\n hasState = (id: string): boolean => {\r\n const state = this.findStateByID(id);\r\n if (state) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n setActiveStateByID = (id: string): void => {\r\n const state = this.findStateByID(id);\r\n\r\n if (!state) return;\r\n\r\n if (state.id === this._activeState) return;\r\n this._activeState = state.id;\r\n\r\n this.notifyOnChange();\r\n };\r\n\r\n setActiveStateByIndex = (index: number): void => {\r\n if (index < 0 || index >= this._states.length) return;\r\n\r\n const state = this._states[index];\r\n this.setActiveStateByID(state.id);\r\n };\r\n\r\n clearActiveState = (): void => {\r\n if (!this.activeState) return;\r\n\r\n this._activeState = undefined;\r\n this.notifyOnChange();\r\n };\r\n\r\n setStates = (states: HostStateEntity[]): void => {\r\n this._states = states;\r\n this.notifyOnChange();\r\n };\r\n\r\n stateFactory = (id: string): HostStateEntity => {\r\n const ao = this.appObjects.getOrCreate(id);\r\n return makeHostStateEntity(ao);\r\n };\r\n\r\n createNewState = (): HostStateEntity => {\r\n const newState = this.stateFactory(generateUniqueID());\r\n\r\n this._states.push(newState);\r\n this.notifyOnChange();\r\n return newState;\r\n };\r\n\r\n getStateByID = (id: string): HostStateEntity | undefined => {\r\n return this.findStateByID(id);\r\n };\r\n\r\n deleteState = (id: string): void => {\r\n const index = this.getStateIndex(id);\r\n\r\n if (index === undefined) {\r\n return;\r\n }\r\n\r\n const state = this.getStateByID(id);\r\n state?.appObject.dispose();\r\n\r\n this._states.splice(index, 1);\r\n this.notifyOnChange();\r\n };\r\n\r\n deleteAllStates = (): void => {\r\n if (this._states.length === 0) return;\r\n\r\n // Dispose all state app objects\r\n this._states.forEach((state) => {\r\n state.appObject.dispose();\r\n });\r\n\r\n this._states = [];\r\n this.clearActiveState();\r\n this.notifyOnChange();\r\n };\r\n\r\n getStateIndex = (id: string): number | undefined => {\r\n let index = -1;\r\n\r\n this._states.forEach((state, i) => {\r\n if (state.id === id) {\r\n index = i;\r\n }\r\n });\r\n\r\n if (index >= 0) {\r\n return index;\r\n } else {\r\n return undefined;\r\n }\r\n };\r\n\r\n private findStateByID(id: string): HostStateEntity | undefined {\r\n for (const state of this._states) {\r\n if (state.id === id) {\r\n return state;\r\n }\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n setPreviousStateActive = (): void => {\r\n if (!this.previousState) return;\r\n\r\n this.setActiveStateByID(this.previousState);\r\n };\r\n\r\n setNextStateActive = (): void => {\r\n if (!this.nextState) return;\r\n\r\n this.setActiveStateByID(this.nextState);\r\n };\r\n\r\n setStateIndex = (stateID: string, index: number): void => {\r\n // Check if the state exists\r\n const state = this.getStateByID(stateID);\r\n if (!state) return;\r\n\r\n // Check if the index is valid\r\n if (index < 0 || index >= this._states.length) return;\r\n\r\n // Get the current index\r\n const currentIndex = this.getStateIndex(stateID);\r\n if (currentIndex === undefined) return;\r\n\r\n // If the index is the same, do nothing\r\n if (currentIndex === index) return;\r\n\r\n // Remove the state from the current position\r\n const stateToMove = this._states.splice(currentIndex, 1)[0];\r\n\r\n // Insert it at the new position\r\n this._states.splice(index, 0, stateToMove);\r\n\r\n // If the moved state was active, update previous and next states\r\n if (stateID === this._activeState) {\r\n this.setActiveStateByID(stateID);\r\n }\r\n\r\n this.notifyOnChange();\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, HostStateMachine.type);\r\n\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"HostStateMachine.js","sourceRoot":"","sources":["../../../../src/StateMachine/Entities/HostStateMachine.ts"],"names":[],"mappings":"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","sourcesContent":["import { generateUniqueID, MemoizedBoolean } from \"@vived/core\";\r\nimport {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectEntity,\r\n AppObjectRepo\r\n} from \"@vived/core\";\r\nimport { HostStateEntity, makeHostStateEntity } from \"./HostStateEntity\";\r\n\r\n/**\r\n * HostStateMachine manages a collection of states and controls state transitions.\r\n *\r\n * This singleton component serves as the central controller for the VIVED platform's\r\n * state-based application model. It maintains an ordered collection of states,\r\n * tracks the currently active state, and provides methods for state transitions,\r\n * creation, deletion, and reordering.\r\n *\r\n * The state machine can be used in both runtime and authoring modes:\r\n * - In runtime: For navigating between predefined states in an application\r\n * - In authoring: For creating and organizing states through a content editor\r\n *\r\n * This entity works closely with HostStateEntity (individual states) and\r\n * HostEditingStateEntity (for state authoring).\r\n */\r\nexport abstract class HostStateMachine extends AppObjectEntity {\r\n static type = \"HostStateMachine\";\r\n\r\n /** Array of all state IDs in order */\r\n abstract states: string[];\r\n\r\n /** Total number of states in the machine */\r\n abstract stateCount: number;\r\n\r\n /** ID of the currently active state, if any */\r\n abstract activeState: string | undefined;\r\n\r\n /** ID of the state preceding the active state, if any */\r\n abstract previousState: string | undefined;\r\n\r\n /** ID of the state following the active state, if any */\r\n abstract nextState: string | undefined;\r\n\r\n /** Duration of transition animations between states (in seconds) */\r\n abstract transitionDuration: number;\r\n\r\n /**\r\n * Sets a state as active by its ID\r\n * @param id ID of the state to activate\r\n */\r\n abstract setActiveStateByID: (id: string) => void;\r\n\r\n /**\r\n * Sets a state as active by its position in the states array\r\n * @param index Zero-based index of the state to activate\r\n */\r\n abstract setActiveStateByIndex: (index: number) => void;\r\n\r\n /** Deactivates the current state (no state will be active) */\r\n abstract clearActiveState: () => void;\r\n\r\n /**\r\n * Replaces all states with a new collection\r\n * @param states Array of state entities to use\r\n */\r\n abstract setStates: (states: HostStateEntity[]) => void;\r\n\r\n /** Creates a new empty state and adds it to the end of the states array */\r\n abstract createNewState: () => HostStateEntity;\r\n\r\n /**\r\n * Retrieves a state entity by its ID\r\n * @param id The ID of the state to retrieve\r\n * @returns The state entity or undefined if not found\r\n */\r\n abstract getStateByID: (id: string) => HostStateEntity | undefined;\r\n\r\n /**\r\n * Removes a state from the machine\r\n * @param id ID of the state to remove\r\n */\r\n abstract deleteState: (id: string) => void;\r\n\r\n /** Removes all states from the machine */\r\n abstract deleteAllStates: () => void;\r\n\r\n /**\r\n * Gets the index of a state in the states array\r\n * @param id ID of the state\r\n * @returns Zero-based index or undefined if not found\r\n */\r\n abstract getStateIndex: (id: string) => number | undefined;\r\n\r\n /**\r\n * Checks if a state with the given ID exists in the machine\r\n * @param id ID to check\r\n * @returns true if the state exists, false otherwise\r\n */\r\n abstract hasState: (id: string) => boolean;\r\n\r\n /**\r\n * Factory function for creating state entities\r\n * @param id ID for the new state\r\n * @returns A new HostStateEntity instance\r\n */\r\n abstract stateFactory: (id: string) => HostStateEntity;\r\n\r\n /** Activates the state before the current active state */\r\n abstract setPreviousStateActive: () => void;\r\n\r\n /** Activates the state after the current active state */\r\n abstract setNextStateActive: () => void;\r\n\r\n /**\r\n * Moves a state to a different position in the states array\r\n * @param stateID ID of the state to move\r\n * @param index Destination index\r\n */\r\n abstract setStateIndex: (stateID: string, index: number) => void;\r\n\r\n /**\r\n * Gets the singleton instance of HostStateMachine\r\n * @param appObjects The app object repository\r\n * @returns The HostStateMachine instance\r\n */\r\n static get(appObjects: AppObjectRepo) {\r\n return getSingletonComponent<HostStateMachine>(\r\n HostStateMachine.type,\r\n appObjects\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Factory function for creating a HostStateMachine instance\r\n * @param appObject The AppObject to associate with this entity\r\n * @returns A new HostStateMachine instance\r\n */\r\nexport function makeHostStateMachine(appObject: AppObject): HostStateMachine {\r\n return new HostStateMachineImp(appObject);\r\n}\r\n\r\n/**\r\n * Implementation of the HostStateMachine abstract class\r\n * Provides concrete implementation of state machine functionality\r\n */\r\nclass HostStateMachineImp extends HostStateMachine {\r\n /** Internal storage for state entities */\r\n private _states: HostStateEntity[] = [];\r\n\r\n /** Duration for transitions between states (in seconds) */\r\n transitionDuration = 1;\r\n\r\n /**\r\n * List of all state IDs in order\r\n * @returns Array of state IDs\r\n */\r\n get states() {\r\n return this._states.map((state) => state.id);\r\n }\r\n\r\n /**\r\n * Total number of states in the machine\r\n * @returns Number of states\r\n */\r\n get stateCount(): number {\r\n return this._states.length;\r\n }\r\n\r\n /** ID of the currently active state */\r\n private _activeState: string | undefined;\r\n get activeState() {\r\n return this._activeState;\r\n }\r\n\r\n /**\r\n * ID of the state preceding the active state\r\n * Returns undefined if:\r\n * - No active state\r\n * - Active state is the first state\r\n */\r\n get previousState(): string | undefined {\r\n if (!this._activeState) return undefined;\r\n\r\n const currentIndex = this.getStateIndex(this._activeState);\r\n if (currentIndex === undefined || currentIndex === 0) return undefined;\r\n\r\n return this._states[currentIndex - 1].id;\r\n }\r\n\r\n /**\r\n * ID of the state following the active state\r\n * Returns undefined if:\r\n * - No active state\r\n * - Active state is the last state\r\n */\r\n get nextState(): string | undefined {\r\n if (!this._activeState) return undefined;\r\n\r\n const currentIndex = this.getStateIndex(this._activeState);\r\n if (currentIndex === undefined || currentIndex >= this._states.length - 1)\r\n return undefined;\r\n\r\n return this._states[currentIndex + 1].id;\r\n }\r\n\r\n /**\r\n * Whether the state machine is in authoring mode\r\n * In authoring mode, additional editing features are enabled\r\n */\r\n private memoizedIsAuthoring = new MemoizedBoolean(false, this.notifyOnChange);\r\n get isAuthoring() {\r\n return this.memoizedIsAuthoring.val;\r\n }\r\n set isAuthoring(val: boolean) {\r\n this.memoizedIsAuthoring.val = val;\r\n }\r\n\r\n /** State to initially show in editing mode */\r\n public initialEditingState?: string;\r\n\r\n /**\r\n * Last state data that was being edited\r\n * Used to restore editing state when returning to editor\r\n */\r\n private _lastEditingState: object | undefined;\r\n get lastEditingState(): object | undefined {\r\n return this._lastEditingState;\r\n }\r\n set lastEditingState(val: object | undefined) {\r\n if (this._lastEditingState === undefined && val === undefined) return;\r\n\r\n const lastStateStr =\r\n this.lastEditingState === undefined\r\n ? \"\"\r\n : JSON.stringify(this.lastEditingState);\r\n const valStateStr = val === undefined ? \"\" : JSON.stringify(val);\r\n\r\n if (lastStateStr === valStateStr) return;\r\n\r\n this._lastEditingState = val;\r\n this.notifyOnChange();\r\n }\r\n\r\n /**\r\n * Tracks assets used in previous state for preloading optimization\r\n * Helps optimize asset loading between state transitions\r\n */\r\n private _lastAssets: string[] = [];\r\n get lastAssets(): string[] {\r\n return this._lastAssets;\r\n }\r\n set lastAssets(lastAssets: string[]) {\r\n this._lastAssets = lastAssets;\r\n }\r\n\r\n /** Error message for state validation failures */\r\n public validationErrorMessage?: string;\r\n\r\n /**\r\n * Checks if a state with the given ID exists\r\n * @param id ID to check\r\n * @returns true if state exists, false otherwise\r\n */\r\n hasState = (id: string): boolean => {\r\n const state = this.findStateByID(id);\r\n if (state) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n /**\r\n * Sets the active state by its ID\r\n * @param id ID of the state to activate\r\n */\r\n setActiveStateByID = (id: string): void => {\r\n const state = this.findStateByID(id);\r\n\r\n if (!state) return;\r\n\r\n if (state.id === this._activeState) return;\r\n this._activeState = state.id;\r\n\r\n this.notifyOnChange();\r\n };\r\n\r\n /**\r\n * Sets the active state by its index in the states array\r\n * @param index Zero-based index of the state to activate\r\n */\r\n setActiveStateByIndex = (index: number): void => {\r\n if (index < 0 || index >= this._states.length) return;\r\n\r\n const state = this._states[index];\r\n this.setActiveStateByID(state.id);\r\n };\r\n\r\n /**\r\n * Clears the active state (no state will be active)\r\n */\r\n clearActiveState = (): void => {\r\n if (!this.activeState) return;\r\n\r\n this._activeState = undefined;\r\n this.notifyOnChange();\r\n };\r\n\r\n /**\r\n * Replaces all states with a new collection\r\n * @param states Array of state entities to use\r\n */\r\n setStates = (states: HostStateEntity[]): void => {\r\n this._states = states;\r\n this.notifyOnChange();\r\n };\r\n\r\n /**\r\n * Factory function for creating state entities\r\n * Creates a new AppObject with the given ID and wraps it in a HostStateEntity\r\n * @param id ID for the new state\r\n * @returns A new HostStateEntity instance\r\n */\r\n stateFactory = (id: string): HostStateEntity => {\r\n const ao = this.appObjects.getOrCreate(id);\r\n return makeHostStateEntity(ao);\r\n };\r\n\r\n /**\r\n * Creates a new empty state and adds it to the end of the states array\r\n * @returns The newly created state entity\r\n */\r\n createNewState = (): HostStateEntity => {\r\n const newState = this.stateFactory(generateUniqueID());\r\n\r\n this._states.push(newState);\r\n this.notifyOnChange();\r\n return newState;\r\n };\r\n\r\n /**\r\n * Gets a state entity by its ID\r\n * @param id ID of the state to retrieve\r\n * @returns The state entity or undefined if not found\r\n */\r\n getStateByID = (id: string): HostStateEntity | undefined => {\r\n return this.findStateByID(id);\r\n };\r\n\r\n /**\r\n * Deletes a state from the machine by its ID\r\n * Also disposes the associated AppObject\r\n * @param id ID of the state to delete\r\n */\r\n deleteState = (id: string): void => {\r\n const index = this.getStateIndex(id);\r\n\r\n if (index === undefined) {\r\n return;\r\n }\r\n\r\n const state = this.getStateByID(id);\r\n state?.appObject.dispose();\r\n\r\n this._states.splice(index, 1);\r\n this.notifyOnChange();\r\n };\r\n\r\n /**\r\n * Deletes all states from the machine\r\n * Also disposes all associated AppObjects\r\n */\r\n deleteAllStates = (): void => {\r\n if (this._states.length === 0) return;\r\n\r\n // Dispose all state app objects\r\n this._states.forEach((state) => {\r\n state.appObject.dispose();\r\n });\r\n\r\n this._states = [];\r\n this.clearActiveState();\r\n this.notifyOnChange();\r\n };\r\n\r\n /**\r\n * Gets the index of a state in the states array\r\n * @param id ID of the state\r\n * @returns Zero-based index or undefined if not found\r\n */\r\n getStateIndex = (id: string): number | undefined => {\r\n let index = -1;\r\n\r\n this._states.forEach((state, i) => {\r\n if (state.id === id) {\r\n index = i;\r\n }\r\n });\r\n\r\n if (index >= 0) {\r\n return index;\r\n } else {\r\n return undefined;\r\n }\r\n };\r\n\r\n /**\r\n * Helper method to find a state by ID\r\n * @param id ID to search for\r\n * @returns The state entity or undefined if not found\r\n */\r\n private findStateByID(id: string): HostStateEntity | undefined {\r\n for (const state of this._states) {\r\n if (state.id === id) {\r\n return state;\r\n }\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Activates the state before the current active state\r\n * Does nothing if there is no previous state\r\n */\r\n setPreviousStateActive = (): void => {\r\n if (!this.previousState) return;\r\n\r\n this.setActiveStateByID(this.previousState);\r\n };\r\n\r\n /**\r\n * Activates the state after the current active state\r\n * Does nothing if there is no next state\r\n */\r\n setNextStateActive = (): void => {\r\n if (!this.nextState) return;\r\n\r\n this.setActiveStateByID(this.nextState);\r\n };\r\n\r\n /**\r\n * Moves a state to a different position in the states array\r\n * Used for reordering states in the state machine\r\n * @param stateID ID of the state to move\r\n * @param index Destination index\r\n */\r\n setStateIndex = (stateID: string, index: number): void => {\r\n // Check if the state exists\r\n const state = this.getStateByID(stateID);\r\n if (!state) return;\r\n\r\n // Check if the index is valid\r\n if (index < 0 || index >= this._states.length) return;\r\n\r\n // Get the current index\r\n const currentIndex = this.getStateIndex(stateID);\r\n if (currentIndex === undefined) return;\r\n\r\n // If the index is the same, do nothing\r\n if (currentIndex === index) return;\r\n\r\n // Remove the state from the current position\r\n const stateToMove = this._states.splice(currentIndex, 1)[0];\r\n\r\n // Insert it at the new position\r\n this._states.splice(index, 0, stateToMove);\r\n\r\n // If the moved state was active, update previous and next states\r\n if (stateID === this._activeState) {\r\n this.setActiveStateByID(stateID);\r\n }\r\n\r\n this.notifyOnChange();\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, HostStateMachine.type);\r\n\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
@@ -12,6 +12,7 @@ class MockHostStateEntity extends HostStateEntity_1.HostStateEntity {
12
12
  }
13
13
  constructor(appObject) {
14
14
  super(appObject, HostStateEntity_1.HostStateEntity.type);
15
+ this.streamState = HostStateEntity_1.StreamState.INIT;
15
16
  this.name = "State Name";
16
17
  this.assets = [];
17
18
  this.expectedResponse = HostStateEntity_1.ChallengeResponse.NONE;
@@ -1 +1 @@
1
- {"version":3,"file":"MockHostStateEntity.js","sourceRoot":"","sources":["../../../../src/StateMachine/Mocks/MockHostStateEntity.ts"],"names":[],"mappings":";;;AA4BA,0DAEC;AA7BD,iEAGqC;AAErC,MAAa,mBAAoB,SAAQ,iCAAe;IACtD,IAAI,EAAE;QACJ,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;IAC3B,CAAC;IAQD,IAAI,SAAS;QACX,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;IACxB,CAAC;IAID,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,iCAAe,CAAC,IAAI,CAAC,CAAC;QAdzC,SAAI,GAAG,YAAY,CAAC;QACpB,WAAM,GAAG,EAAE,CAAC;QACZ,qBAAgB,GAAG,mCAAiB,CAAC,IAAI,CAAC;QAC1C,UAAK,GAAG,OAAO,CAAC;QAChB,WAAM,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QACnB,WAAM,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAMnB,iBAAY,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;IAIzB,CAAC;CACF;AApBD,kDAoBC;AAED,SAAgB,uBAAuB,CAAC,EAAU,EAAE,UAAyB;IAC3E,OAAO,IAAI,mBAAmB,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7D,CAAC","sourcesContent":["import { AppObject, AppObjectRepo } from \"@vived/core\";\r\nimport {\r\n ChallengeResponse,\r\n HostStateEntity\r\n} from \"../Entities/HostStateEntity\";\r\n\r\nexport class MockHostStateEntity extends HostStateEntity {\r\n get id() {\r\n return this.appObject.id;\r\n }\r\n name = \"State Name\";\r\n assets = [];\r\n expectedResponse = ChallengeResponse.NONE;\r\n appID = \"AppID\";\r\n getDTO = jest.fn();\r\n setDTO = jest.fn();\r\n\r\n get stateData(): object {\r\n return { foo: \"bar\" };\r\n }\r\n\r\n setStateData = jest.fn();\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, HostStateEntity.type);\r\n }\r\n}\r\n\r\nexport function makeMockHostStateEntity(id: string, appObjects: AppObjectRepo) {\r\n return new MockHostStateEntity(appObjects.getOrCreate(id));\r\n}\r\n"]}
1
+ {"version":3,"file":"MockHostStateEntity.js","sourceRoot":"","sources":["../../../../src/StateMachine/Mocks/MockHostStateEntity.ts"],"names":[],"mappings":";;;AA8BA,0DAEC;AA/BD,iEAIqC;AAErC,MAAa,mBAAoB,SAAQ,iCAAe;IAEtD,IAAI,EAAE;QACJ,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;IAC3B,CAAC;IAQD,IAAI,SAAS;QACX,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;IACxB,CAAC;IAID,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,iCAAe,CAAC,IAAI,CAAC,CAAC;QAlBzC,gBAAW,GAAgB,6BAAW,CAAC,IAAI,CAAC;QAI5C,SAAI,GAAG,YAAY,CAAC;QACpB,WAAM,GAAG,EAAE,CAAC;QACZ,qBAAgB,GAAG,mCAAiB,CAAC,IAAI,CAAC;QAC1C,UAAK,GAAG,OAAO,CAAC;QAChB,WAAM,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QACnB,WAAM,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAMnB,iBAAY,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;IAIzB,CAAC;CACF;AArBD,kDAqBC;AAED,SAAgB,uBAAuB,CAAC,EAAU,EAAE,UAAyB;IAC3E,OAAO,IAAI,mBAAmB,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7D,CAAC","sourcesContent":["import { AppObject, AppObjectRepo } from \"@vived/core\";\r\nimport {\r\n ChallengeResponse,\r\n HostStateEntity,\r\n StreamState\r\n} from \"../Entities/HostStateEntity\";\r\n\r\nexport class MockHostStateEntity extends HostStateEntity {\r\n streamState: StreamState = StreamState.INIT;\r\n get id() {\r\n return this.appObject.id;\r\n }\r\n name = \"State Name\";\r\n assets = [];\r\n expectedResponse = ChallengeResponse.NONE;\r\n appID = \"AppID\";\r\n getDTO = jest.fn();\r\n setDTO = jest.fn();\r\n\r\n get stateData(): object {\r\n return { foo: \"bar\" };\r\n }\r\n\r\n setStateData = jest.fn();\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, HostStateEntity.type);\r\n }\r\n}\r\n\r\nexport function makeMockHostStateEntity(id: string, appObjects: AppObjectRepo) {\r\n return new MockHostStateEntity(appObjects.getOrCreate(id));\r\n}\r\n"]}
@@ -23,7 +23,8 @@ HostStatePM.defaultVM = {
23
23
  appName: "",
24
24
  canBumpBackwards: false,
25
25
  canBumpForward: false,
26
- index: -1
26
+ index: -1,
27
+ streamState: HostStateEntity_1.StreamState.INIT
27
28
  };
28
29
  function makeHostStatePM(appObject) {
29
30
  return new HostStatePMImp(appObject);
@@ -57,6 +58,8 @@ class HostStatePMImp extends HostStatePM {
57
58
  return false;
58
59
  if (a.index !== b.index)
59
60
  return false;
61
+ if (a.streamState !== b.streamState)
62
+ return false;
60
63
  // Deep comparison for the data object
61
64
  const aData = JSON.stringify(a.data);
62
65
  const bData = JSON.stringify(b.data);
@@ -105,7 +108,8 @@ class HostStatePMImp extends HostStatePM {
105
108
  appName,
106
109
  canBumpBackwards,
107
110
  canBumpForward,
108
- index
111
+ index,
112
+ streamState: entity.streamState
109
113
  };
110
114
  // Update the view with the new view model
111
115
  this.doUpdateView(newVM);
@@ -1 +1 @@
1
- {"version":3,"file":"HostStatePM.js","sourceRoot":"","sources":["../../../../src/StateMachine/PMs/HostStatePM.ts"],"names":[],"mappings":"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","sourcesContent":["import { AppObject, AppObjectPM, AppObjectRepo } from \"@vived/core\";\r\nimport { AppRepoEntity } from \"../../Apps/Entities/AppRepo\";\r\nimport { HostStateEntity } from \"../Entities/HostStateEntity\";\r\nimport { HostStateMachine } from \"../Entities/HostStateMachine\";\r\n\r\nexport interface HostStateVM {\r\n readonly id: string;\r\n readonly name: string;\r\n readonly data: object;\r\n readonly isActive: boolean;\r\n readonly appName: string;\r\n readonly canBumpBackwards: boolean;\r\n readonly canBumpForward: boolean;\r\n readonly index: number;\r\n}\r\n\r\nexport abstract class HostStatePM extends AppObjectPM<HostStateVM> {\r\n static readonly type = \"HostStatePM\";\r\n\r\n // Default view model\r\n static readonly defaultVM: HostStateVM = {\r\n id: \"\",\r\n name: \"\",\r\n data: {},\r\n isActive: false,\r\n appName: \"\",\r\n canBumpBackwards: false,\r\n canBumpForward: false,\r\n index: -1\r\n };\r\n\r\n // Non-singleton getter pattern\r\n static getById(\r\n id: string,\r\n appObjects: AppObjectRepo\r\n ): HostStatePM | undefined {\r\n return appObjects.get(id)?.getComponent<HostStatePM>(HostStatePM.type);\r\n }\r\n}\r\n\r\nexport function makeHostStatePM(appObject: AppObject): HostStatePM {\r\n return new HostStatePMImp(appObject);\r\n}\r\n\r\nclass HostStatePMImp extends HostStatePM {\r\n // Get the entity from the same AppObject\r\n private get hostStateEntity() {\r\n return this.getCachedLocalComponent<HostStateEntity>(HostStateEntity.type);\r\n }\r\n\r\n // Get the state machine which is a singleton\r\n private get hostStateMachine() {\r\n return this.getCachedSingleton<HostStateMachine>(HostStateMachine.type);\r\n }\r\n\r\n // Get the app repo which is a singleton\r\n private get appRepo() {\r\n return this.getCachedSingleton<AppRepoEntity>(AppRepoEntity.type);\r\n }\r\n\r\n // Required equality check method for view models\r\n vmsAreEqual(a: HostStateVM, b: HostStateVM): boolean {\r\n if (a.id !== b.id) return false;\r\n if (a.name !== b.name) return false;\r\n if (a.isActive !== b.isActive) return false;\r\n if (a.appName !== b.appName) return false;\r\n if (a.canBumpBackwards !== b.canBumpBackwards) return false;\r\n if (a.canBumpForward !== b.canBumpForward) return false;\r\n if (a.index !== b.index) return false;\r\n\r\n // Deep comparison for the data object\r\n const aData = JSON.stringify(a.data);\r\n const bData = JSON.stringify(b.data);\r\n if (aData !== bData) return false;\r\n\r\n return true;\r\n }\r\n\r\n // Handler for entity changes\r\n private onEntityChange = (): void => {\r\n this.updateViewModel();\r\n };\r\n\r\n // Handler for state machine changes\r\n private onStateMachineChange = (): void => {\r\n this.updateViewModel();\r\n };\r\n\r\n private updateViewModel(): void {\r\n const entity = this.hostStateEntity;\r\n const stateMachine = this.hostStateMachine;\r\n const appRepo = this.appRepo;\r\n\r\n if (!entity) {\r\n this.doUpdateView(HostStatePM.defaultVM);\r\n return;\r\n }\r\n\r\n // Check if this state is the active one in the state machine\r\n const isActive = stateMachine?.activeState === entity.id;\r\n\r\n // Look up the app name using the appID from the state entity\r\n let appName = \"\";\r\n if (appRepo && entity.appID) {\r\n const app = appRepo.getApp(entity.appID);\r\n if (app) {\r\n appName = app.name;\r\n }\r\n }\r\n\r\n // Determine if the state can be bumped backwards or forwards\r\n let canBumpBackwards = false;\r\n let canBumpForward = false;\r\n let index = -1;\r\n\r\n if (stateMachine) {\r\n const stateIndex = stateMachine.getStateIndex(entity.id);\r\n if (stateIndex !== undefined) {\r\n index = stateIndex;\r\n // Can bump backwards if index > 0\r\n canBumpBackwards = stateIndex > 0;\r\n // Can bump forward if index < length-1\r\n canBumpForward = stateIndex < stateMachine.stateCount - 1;\r\n }\r\n }\r\n\r\n // Create a new immutable view model based on entity state\r\n const newVM: HostStateVM = {\r\n id: entity.id,\r\n name: entity.name,\r\n data: entity.stateData,\r\n isActive: isActive || false,\r\n appName,\r\n canBumpBackwards,\r\n canBumpForward,\r\n index\r\n };\r\n\r\n // Update the view with the new view model\r\n this.doUpdateView(newVM);\r\n }\r\n\r\n dispose = (): void => {\r\n this.hostStateEntity?.removeChangeObserver(this.onEntityChange);\r\n this.hostStateMachine?.removeChangeObserver(this.onStateMachineChange);\r\n super.dispose();\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, HostStatePM.type);\r\n\r\n // Subscribe to entity changes\r\n this.hostStateEntity?.addChangeObserver(this.onEntityChange);\r\n\r\n // Subscribe to state machine changes\r\n this.hostStateMachine?.addChangeObserver(this.onStateMachineChange);\r\n\r\n // Initialize the view model\r\n this.updateViewModel();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"HostStatePM.js","sourceRoot":"","sources":["../../../../src/StateMachine/PMs/HostStatePM.ts"],"names":[],"mappings":"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","sourcesContent":["import { AppObject, AppObjectPM, AppObjectRepo } from \"@vived/core\";\r\nimport { AppRepoEntity } from \"../../Apps/Entities/AppRepo\";\r\nimport { HostStateEntity, StreamState } from \"../Entities/HostStateEntity\";\r\nimport { HostStateMachine } from \"../Entities/HostStateMachine\";\r\n\r\nexport interface HostStateVM {\r\n readonly id: string;\r\n readonly name: string;\r\n readonly data: object;\r\n readonly isActive: boolean;\r\n readonly appName: string;\r\n readonly canBumpBackwards: boolean;\r\n readonly canBumpForward: boolean;\r\n readonly index: number;\r\n readonly streamState: StreamState;\r\n}\r\n\r\nexport abstract class HostStatePM extends AppObjectPM<HostStateVM> {\r\n static readonly type = \"HostStatePM\";\r\n\r\n // Default view model\r\n static readonly defaultVM: HostStateVM = {\r\n id: \"\",\r\n name: \"\",\r\n data: {},\r\n isActive: false,\r\n appName: \"\",\r\n canBumpBackwards: false,\r\n canBumpForward: false,\r\n index: -1,\r\n streamState: StreamState.INIT\r\n };\r\n\r\n // Non-singleton getter pattern\r\n static getById(\r\n id: string,\r\n appObjects: AppObjectRepo\r\n ): HostStatePM | undefined {\r\n return appObjects.get(id)?.getComponent<HostStatePM>(HostStatePM.type);\r\n }\r\n}\r\n\r\nexport function makeHostStatePM(appObject: AppObject): HostStatePM {\r\n return new HostStatePMImp(appObject);\r\n}\r\n\r\nclass HostStatePMImp extends HostStatePM {\r\n // Get the entity from the same AppObject\r\n private get hostStateEntity() {\r\n return this.getCachedLocalComponent<HostStateEntity>(HostStateEntity.type);\r\n }\r\n\r\n // Get the state machine which is a singleton\r\n private get hostStateMachine() {\r\n return this.getCachedSingleton<HostStateMachine>(HostStateMachine.type);\r\n }\r\n\r\n // Get the app repo which is a singleton\r\n private get appRepo() {\r\n return this.getCachedSingleton<AppRepoEntity>(AppRepoEntity.type);\r\n }\r\n\r\n // Required equality check method for view models\r\n vmsAreEqual(a: HostStateVM, b: HostStateVM): boolean {\r\n if (a.id !== b.id) return false;\r\n if (a.name !== b.name) return false;\r\n if (a.isActive !== b.isActive) return false;\r\n if (a.appName !== b.appName) return false;\r\n if (a.canBumpBackwards !== b.canBumpBackwards) return false;\r\n if (a.canBumpForward !== b.canBumpForward) return false;\r\n if (a.index !== b.index) return false;\r\n if (a.streamState !== b.streamState) return false;\r\n\r\n // Deep comparison for the data object\r\n const aData = JSON.stringify(a.data);\r\n const bData = JSON.stringify(b.data);\r\n if (aData !== bData) return false;\r\n\r\n return true;\r\n }\r\n\r\n // Handler for entity changes\r\n private onEntityChange = (): void => {\r\n this.updateViewModel();\r\n };\r\n\r\n // Handler for state machine changes\r\n private onStateMachineChange = (): void => {\r\n this.updateViewModel();\r\n };\r\n\r\n private updateViewModel(): void {\r\n const entity = this.hostStateEntity;\r\n const stateMachine = this.hostStateMachine;\r\n const appRepo = this.appRepo;\r\n\r\n if (!entity) {\r\n this.doUpdateView(HostStatePM.defaultVM);\r\n return;\r\n }\r\n\r\n // Check if this state is the active one in the state machine\r\n const isActive = stateMachine?.activeState === entity.id;\r\n\r\n // Look up the app name using the appID from the state entity\r\n let appName = \"\";\r\n if (appRepo && entity.appID) {\r\n const app = appRepo.getApp(entity.appID);\r\n if (app) {\r\n appName = app.name;\r\n }\r\n }\r\n\r\n // Determine if the state can be bumped backwards or forwards\r\n let canBumpBackwards = false;\r\n let canBumpForward = false;\r\n let index = -1;\r\n\r\n if (stateMachine) {\r\n const stateIndex = stateMachine.getStateIndex(entity.id);\r\n if (stateIndex !== undefined) {\r\n index = stateIndex;\r\n // Can bump backwards if index > 0\r\n canBumpBackwards = stateIndex > 0;\r\n // Can bump forward if index < length-1\r\n canBumpForward = stateIndex < stateMachine.stateCount - 1;\r\n }\r\n }\r\n\r\n // Create a new immutable view model based on entity state\r\n const newVM: HostStateVM = {\r\n id: entity.id,\r\n name: entity.name,\r\n data: entity.stateData,\r\n isActive: isActive || false,\r\n appName,\r\n canBumpBackwards,\r\n canBumpForward,\r\n index,\r\n streamState: entity.streamState\r\n };\r\n\r\n // Update the view with the new view model\r\n this.doUpdateView(newVM);\r\n }\r\n\r\n dispose = (): void => {\r\n this.hostStateEntity?.removeChangeObserver(this.onEntityChange);\r\n this.hostStateMachine?.removeChangeObserver(this.onStateMachineChange);\r\n super.dispose();\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, HostStatePM.type);\r\n\r\n // Subscribe to entity changes\r\n this.hostStateEntity?.addChangeObserver(this.onEntityChange);\r\n\r\n // Subscribe to state machine changes\r\n this.hostStateMachine?.addChangeObserver(this.onStateMachineChange);\r\n\r\n // Initialize the view model\r\n this.updateViewModel();\r\n }\r\n}\r\n"]}
@@ -16,7 +16,7 @@ function makeDeleteStateUC(appObject) {
16
16
  }
17
17
  class DeleteStateUCImp extends DeleteStateUC {
18
18
  get stateMachine() {
19
- return this.getCachedLocalComponent(Entities_1.HostStateMachine.type);
19
+ return this.getCachedSingleton(Entities_1.HostStateMachine.type);
20
20
  }
21
21
  constructor(appObject) {
22
22
  super(appObject, DeleteStateUC.type);
@@ -1 +1 @@
1
- {"version":3,"file":"DeleteStateUC.js","sourceRoot":"","sources":["../../../../src/StateMachine/UCs/DeleteStateUC.ts"],"names":[],"mappings":";;;AAkBA,8CAEC;AApBD,sCAKqB;AACrB,0CAA+C;AAE/C,MAAsB,aAAc,SAAQ,kBAAW;IAGrD,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,IAAA,4BAAqB,EAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC9E,CAAC;;AALH,sCAQC;AAPQ,kBAAI,GAAG,eAAe,CAAC;AAShC,SAAgB,iBAAiB,CAAC,SAAoB;IACpD,OAAO,IAAI,gBAAgB,CAAC,SAAS,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,gBAAiB,SAAQ,aAAa;IAC1C,IAAY,YAAY;QACtB,OAAO,IAAI,CAAC,uBAAuB,CACjC,2BAAgB,CAAC,IAAI,CACtB,CAAC;IACJ,CAAC;IAcD,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;QAbvC,gBAAW,GAAG,CAAC,EAAU,EAAQ,EAAE;YACjC,IAAI,CAAC,IAAI,CAAC,YAAY;gBAAE,OAAO;YAE/B,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YACjD,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;gBACnC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;gBAC5C,OAAO;YACT,CAAC;QACH,CAAC,CAAC;QAIA,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;CACF","sourcesContent":["import {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectRepo,\r\n AppObjectUC\r\n} from \"@vived/core\";\r\nimport { HostStateMachine } from \"../Entities\";\r\n\r\nexport abstract class DeleteStateUC extends AppObjectUC {\r\n static type = \"DeleteStateUC\";\r\n\r\n static get(appObjects: AppObjectRepo) {\r\n return getSingletonComponent<DeleteStateUC>(DeleteStateUC.type, appObjects);\r\n }\r\n\r\n abstract deleteState(id: string): void;\r\n}\r\n\r\nexport function makeDeleteStateUC(appObject: AppObject): DeleteStateUC {\r\n return new DeleteStateUCImp(appObject);\r\n}\r\n\r\nclass DeleteStateUCImp extends DeleteStateUC {\r\n private get stateMachine() {\r\n return this.getCachedLocalComponent<HostStateMachine>(\r\n HostStateMachine.type\r\n );\r\n }\r\n\r\n deleteState = (id: string): void => {\r\n if (!this.stateMachine) return;\r\n\r\n const state = this.stateMachine.getStateByID(id);\r\n if (this.stateMachine.hasState(id)) {\r\n this.stateMachine.deleteState(id);\r\n } else {\r\n this.warn(\"Unable to find state to delete\");\r\n return;\r\n }\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, DeleteStateUC.type);\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"DeleteStateUC.js","sourceRoot":"","sources":["../../../../src/StateMachine/UCs/DeleteStateUC.ts"],"names":[],"mappings":";;;AAkBA,8CAEC;AApBD,sCAKqB;AACrB,0CAA+C;AAE/C,MAAsB,aAAc,SAAQ,kBAAW;IAGrD,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,IAAA,4BAAqB,EAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC9E,CAAC;;AALH,sCAQC;AAPQ,kBAAI,GAAG,eAAe,CAAC;AAShC,SAAgB,iBAAiB,CAAC,SAAoB;IACpD,OAAO,IAAI,gBAAgB,CAAC,SAAS,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,gBAAiB,SAAQ,aAAa;IAC1C,IAAY,YAAY;QACtB,OAAO,IAAI,CAAC,kBAAkB,CAAmB,2BAAgB,CAAC,IAAI,CAAC,CAAC;IAC1E,CAAC;IAcD,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;QAbvC,gBAAW,GAAG,CAAC,EAAU,EAAQ,EAAE;YACjC,IAAI,CAAC,IAAI,CAAC,YAAY;gBAAE,OAAO;YAE/B,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YACjD,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;gBACnC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;gBAC5C,OAAO;YACT,CAAC;QACH,CAAC,CAAC;QAIA,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;CACF","sourcesContent":["import {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectRepo,\r\n AppObjectUC\r\n} from \"@vived/core\";\r\nimport { HostStateMachine } from \"../Entities\";\r\n\r\nexport abstract class DeleteStateUC extends AppObjectUC {\r\n static type = \"DeleteStateUC\";\r\n\r\n static get(appObjects: AppObjectRepo) {\r\n return getSingletonComponent<DeleteStateUC>(DeleteStateUC.type, appObjects);\r\n }\r\n\r\n abstract deleteState(id: string): void;\r\n}\r\n\r\nexport function makeDeleteStateUC(appObject: AppObject): DeleteStateUC {\r\n return new DeleteStateUCImp(appObject);\r\n}\r\n\r\nclass DeleteStateUCImp extends DeleteStateUC {\r\n private get stateMachine() {\r\n return this.getCachedSingleton<HostStateMachine>(HostStateMachine.type);\r\n }\r\n\r\n deleteState = (id: string): void => {\r\n if (!this.stateMachine) return;\r\n\r\n const state = this.stateMachine.getStateByID(id);\r\n if (this.stateMachine.hasState(id)) {\r\n this.stateMachine.deleteState(id);\r\n } else {\r\n this.warn(\"Unable to find state to delete\");\r\n return;\r\n }\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, DeleteStateUC.type);\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
@@ -16,7 +16,7 @@ function makeDuplicateStateUC(appObject) {
16
16
  }
17
17
  class DuplicateStateUCImp extends DuplicateStateUC {
18
18
  get stateMachine() {
19
- return this.getCachedLocalComponent(Entities_1.HostStateMachine.type);
19
+ return this.getCachedSingleton(Entities_1.HostStateMachine.type);
20
20
  }
21
21
  constructor(appObject) {
22
22
  super(appObject, DuplicateStateUC.type);
@@ -1 +1 @@
1
- {"version":3,"file":"DuplicateStateUC.js","sourceRoot":"","sources":["../../../../src/StateMachine/UCs/DuplicateStateUC.ts"],"names":[],"mappings":";;;AAqBA,oDAEC;AAvBD,sCAKqB;AACrB,0CAA+C;AAE/C,MAAsB,gBAAiB,SAAQ,kBAAW;IAGxD,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,IAAA,4BAAqB,EAC1B,gBAAgB,CAAC,IAAI,EACrB,UAAU,CACX,CAAC;IACJ,CAAC;;AARH,4CAWC;AAVQ,qBAAI,GAAG,kBAAkB,CAAC;AAYnC,SAAgB,oBAAoB,CAAC,SAAoB;IACvD,OAAO,IAAI,mBAAmB,CAAC,SAAS,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,mBAAoB,SAAQ,gBAAgB;IAChD,IAAY,YAAY;QACtB,OAAO,IAAI,CAAC,uBAAuB,CACjC,2BAAgB,CAAC,IAAI,CACtB,CAAC;IACJ,CAAC;IAkBD,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAjB1C,mBAAc,GAAG,CAAC,EAAU,EAAQ,EAAE;YACpC,IAAI,CAAC,IAAI,CAAC,YAAY;gBAAE,OAAO;YAE/B,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YACjD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,IAAI,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;gBAC/C,OAAO;YACT,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC;YACpD,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC3B,GAAG,CAAC,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAC;YACrB,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC;YAC9B,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC,CAAC;QAKA,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;CACF","sourcesContent":["import {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectRepo,\r\n AppObjectUC\r\n} from \"@vived/core\";\r\nimport { HostStateMachine } from \"../Entities\";\r\n\r\nexport abstract class DuplicateStateUC extends AppObjectUC {\r\n static type = \"DuplicateStateUC\";\r\n\r\n static get(appObjects: AppObjectRepo) {\r\n return getSingletonComponent<DuplicateStateUC>(\r\n DuplicateStateUC.type,\r\n appObjects\r\n );\r\n }\r\n\r\n abstract duplicateState(id: string): void;\r\n}\r\n\r\nexport function makeDuplicateStateUC(appObject: AppObject): DuplicateStateUC {\r\n return new DuplicateStateUCImp(appObject);\r\n}\r\n\r\nclass DuplicateStateUCImp extends DuplicateStateUC {\r\n private get stateMachine() {\r\n return this.getCachedLocalComponent<HostStateMachine>(\r\n HostStateMachine.type\r\n );\r\n }\r\n\r\n duplicateState = (id: string): void => {\r\n if (!this.stateMachine) return;\r\n\r\n const state = this.stateMachine.getStateByID(id);\r\n if (!state) {\r\n this.warn(\"Unable to find state to duplicate\");\r\n return;\r\n }\r\n\r\n const newState = this.stateMachine.createNewState();\r\n const dto = state.getDTO();\r\n dto.id = newState.id;\r\n dto.name = dto.name + \" Copy\";\r\n newState.setDTO(dto);\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, DuplicateStateUC.type);\r\n\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"DuplicateStateUC.js","sourceRoot":"","sources":["../../../../src/StateMachine/UCs/DuplicateStateUC.ts"],"names":[],"mappings":";;;AAqBA,oDAEC;AAvBD,sCAKqB;AACrB,0CAA+C;AAE/C,MAAsB,gBAAiB,SAAQ,kBAAW;IAGxD,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,IAAA,4BAAqB,EAC1B,gBAAgB,CAAC,IAAI,EACrB,UAAU,CACX,CAAC;IACJ,CAAC;;AARH,4CAWC;AAVQ,qBAAI,GAAG,kBAAkB,CAAC;AAYnC,SAAgB,oBAAoB,CAAC,SAAoB;IACvD,OAAO,IAAI,mBAAmB,CAAC,SAAS,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,mBAAoB,SAAQ,gBAAgB;IAChD,IAAY,YAAY;QACtB,OAAO,IAAI,CAAC,kBAAkB,CAAmB,2BAAgB,CAAC,IAAI,CAAC,CAAC;IAC1E,CAAC;IAkBD,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAjB1C,mBAAc,GAAG,CAAC,EAAU,EAAQ,EAAE;YACpC,IAAI,CAAC,IAAI,CAAC,YAAY;gBAAE,OAAO;YAE/B,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YACjD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,IAAI,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;gBAC/C,OAAO;YACT,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC;YACpD,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC3B,GAAG,CAAC,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAC;YACrB,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC;YAC9B,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC,CAAC;QAKA,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;CACF","sourcesContent":["import {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectRepo,\r\n AppObjectUC\r\n} from \"@vived/core\";\r\nimport { HostStateMachine } from \"../Entities\";\r\n\r\nexport abstract class DuplicateStateUC extends AppObjectUC {\r\n static type = \"DuplicateStateUC\";\r\n\r\n static get(appObjects: AppObjectRepo) {\r\n return getSingletonComponent<DuplicateStateUC>(\r\n DuplicateStateUC.type,\r\n appObjects\r\n );\r\n }\r\n\r\n abstract duplicateState(id: string): void;\r\n}\r\n\r\nexport function makeDuplicateStateUC(appObject: AppObject): DuplicateStateUC {\r\n return new DuplicateStateUCImp(appObject);\r\n}\r\n\r\nclass DuplicateStateUCImp extends DuplicateStateUC {\r\n private get stateMachine() {\r\n return this.getCachedSingleton<HostStateMachine>(HostStateMachine.type);\r\n }\r\n\r\n duplicateState = (id: string): void => {\r\n if (!this.stateMachine) return;\r\n\r\n const state = this.stateMachine.getStateByID(id);\r\n if (!state) {\r\n this.warn(\"Unable to find state to duplicate\");\r\n return;\r\n }\r\n\r\n const newState = this.stateMachine.createNewState();\r\n const dto = state.getDTO();\r\n dto.id = newState.id;\r\n dto.name = dto.name + \" Copy\";\r\n newState.setDTO(dto);\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, DuplicateStateUC.type);\r\n\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"SavePersistentStates.js","sourceRoot":"","sources":["../../../../src/StateMachine/UCs/SavePersistentStates.ts"],"names":[],"mappings":";;;AAqBA,gEAIC;AAzBD,sCAKqB;AACrB,0CAA+C;AAE/C,MAAsB,sBAAuB,SAAQ,kBAAW;IAK9D,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,IAAA,4BAAqB,EAC1B,sBAAsB,CAAC,IAAI,EAC3B,UAAU,CACX,CAAC;IACJ,CAAC;;AAVH,wDAWC;AAVQ,2BAAI,GAAG,wBAAwB,CAAC;AAYzC,SAAgB,0BAA0B,CACxC,SAAoB;IAEpB,OAAO,IAAI,yBAAyB,CAAC,SAAS,CAAC,CAAC;AAClD,CAAC;AASD,MAAM,yBAA0B,SAAQ,sBAAsB;IAC5D,IAAY,YAAY;QACtB,OAAO,IAAI,CAAC,kBAAkB,CAAmB,2BAAgB,CAAC,IAAI,CAAC,CAAC;IAC1E,CAAC;IA4BD,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,sBAAsB,CAAC,IAAI,CAAC,CAAC;QA3BhD,gBAAW,GAAG,GAAS,EAAE;YACvB,IAAI,CAAC,IAAI,CAAC,YAAY;gBAAE,OAAO;YAE/B,MAAM,MAAM,GAAuB,EAAE,CAAC;YACtC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;gBACvD,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,IAAI,GAAqB;wBAC7B,MAAM,EAAE,KAAK,CAAC,MAAM;wBACpB,IAAI,EAAE,KAAK,CAAC,SAAS;wBACrB,EAAE,EAAE,KAAK,CAAC,EAAE;wBACZ,IAAI,EAAE,KAAK,CAAC,IAAI;qBACjB,CAAC;oBAEF,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACpB,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAC1C,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;YACtC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;YAC5D,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACnC,CAAC,CAAC,QAAQ,GAAG,uBAAuB,CAAC;YACrC,CAAC,CAAC,KAAK,EAAE,CAAC;QACZ,CAAC,CAAC;QAIA,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;CACF","sourcesContent":["import {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectRepo,\r\n AppObjectUC\r\n} from \"@vived/core\";\r\nimport { HostStateMachine } from \"../Entities\";\r\n\r\nexport abstract class SavePersistentStatesUC extends AppObjectUC {\r\n static type = \"SavePersistentStatesUC\";\r\n\r\n abstract saveLocally(): void;\r\n\r\n static get(appObjects: AppObjectRepo) {\r\n return getSingletonComponent<SavePersistentStatesUC>(\r\n SavePersistentStatesUC.type,\r\n appObjects\r\n );\r\n }\r\n}\r\n\r\nexport function makeSavePersistentStatesUC(\r\n appObject: AppObject\r\n): SavePersistentStatesUC {\r\n return new SavePersistentStatesUCImp(appObject);\r\n}\r\n\r\ninterface SandboxStateData {\r\n id: string;\r\n name: string;\r\n data: object;\r\n assets: string[];\r\n}\r\n\r\nclass SavePersistentStatesUCImp extends SavePersistentStatesUC {\r\n private get stateMachine() {\r\n return this.getCachedSingleton<HostStateMachine>(HostStateMachine.type);\r\n }\r\n\r\n saveLocally = (): void => {\r\n if (!this.stateMachine) return;\r\n\r\n const states: SandboxStateData[] = [];\r\n this.stateMachine.states.forEach((stateID) => {\r\n const state = this.stateMachine?.getStateByID(stateID);\r\n if (state) {\r\n const rVal: SandboxStateData = {\r\n assets: state.assets,\r\n data: state.stateData,\r\n id: state.id,\r\n name: state.name\r\n };\r\n\r\n states.push(rVal);\r\n }\r\n });\r\n\r\n const statesData = JSON.stringify(states);\r\n const a = document.createElement(\"a\");\r\n const file = new Blob([statesData], { type: \"text/plain\" });\r\n a.href = URL.createObjectURL(file);\r\n a.download = \"persistentStates.json\";\r\n a.click();\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, SavePersistentStatesUC.type);\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"SavePersistentStates.js","sourceRoot":"","sources":["../../../../src/StateMachine/UCs/SavePersistentStates.ts"],"names":[],"mappings":";;;AAsBA,gEAIC;AA1BD,sCAKqB;AACrB,0CAA+C;AAG/C,MAAsB,sBAAuB,SAAQ,kBAAW;IAK9D,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,IAAA,4BAAqB,EAC1B,sBAAsB,CAAC,IAAI,EAC3B,UAAU,CACX,CAAC;IACJ,CAAC;;AAVH,wDAWC;AAVQ,2BAAI,GAAG,wBAAwB,CAAC;AAYzC,SAAgB,0BAA0B,CACxC,SAAoB;IAEpB,OAAO,IAAI,yBAAyB,CAAC,SAAS,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,yBAA0B,SAAQ,sBAAsB;IAC5D,IAAY,YAAY;QACtB,OAAO,IAAI,CAAC,kBAAkB,CAAmB,2BAAgB,CAAC,IAAI,CAAC,CAAC;IAC1E,CAAC;IA4BD,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,sBAAsB,CAAC,IAAI,CAAC,CAAC;QA3BhD,gBAAW,GAAG,GAAS,EAAE;YACvB,IAAI,CAAC,IAAI,CAAC,YAAY;gBAAE,OAAO;YAE/B,MAAM,MAAM,GAAuB,EAAE,CAAC;YACtC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;gBACvD,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,IAAI,GAAqB;wBAC7B,MAAM,EAAE,KAAK,CAAC,MAAM;wBACpB,IAAI,EAAE,KAAK,CAAC,SAAS;wBACrB,EAAE,EAAE,KAAK,CAAC,EAAE;wBACZ,IAAI,EAAE,KAAK,CAAC,IAAI;qBACjB,CAAC;oBAEF,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACpB,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAC1C,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;YACtC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;YAC5D,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACnC,CAAC,CAAC,QAAQ,GAAG,uBAAuB,CAAC;YACrC,CAAC,CAAC,KAAK,EAAE,CAAC;QACZ,CAAC,CAAC;QAIA,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;CACF","sourcesContent":["import {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectRepo,\r\n AppObjectUC\r\n} from \"@vived/core\";\r\nimport { HostStateMachine } from \"../Entities\";\r\nimport { SandboxStateData } from \"./setSandboxStatesFromData\";\r\n\r\nexport abstract class SavePersistentStatesUC extends AppObjectUC {\r\n static type = \"SavePersistentStatesUC\";\r\n\r\n abstract saveLocally(): void;\r\n\r\n static get(appObjects: AppObjectRepo) {\r\n return getSingletonComponent<SavePersistentStatesUC>(\r\n SavePersistentStatesUC.type,\r\n appObjects\r\n );\r\n }\r\n}\r\n\r\nexport function makeSavePersistentStatesUC(\r\n appObject: AppObject\r\n): SavePersistentStatesUC {\r\n return new SavePersistentStatesUCImp(appObject);\r\n}\r\n\r\nclass SavePersistentStatesUCImp extends SavePersistentStatesUC {\r\n private get stateMachine() {\r\n return this.getCachedSingleton<HostStateMachine>(HostStateMachine.type);\r\n }\r\n\r\n saveLocally = (): void => {\r\n if (!this.stateMachine) return;\r\n\r\n const states: SandboxStateData[] = [];\r\n this.stateMachine.states.forEach((stateID) => {\r\n const state = this.stateMachine?.getStateByID(stateID);\r\n if (state) {\r\n const rVal: SandboxStateData = {\r\n assets: state.assets,\r\n data: state.stateData,\r\n id: state.id,\r\n name: state.name\r\n };\r\n\r\n states.push(rVal);\r\n }\r\n });\r\n\r\n const statesData = JSON.stringify(states);\r\n const a = document.createElement(\"a\");\r\n const file = new Blob([statesData], { type: \"text/plain\" });\r\n a.href = URL.createObjectURL(file);\r\n a.download = \"persistentStates.json\";\r\n a.click();\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, SavePersistentStatesUC.type);\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
package/dist/cjs/index.js CHANGED
@@ -18,6 +18,7 @@ __exportStar(require("./Apps"), exports);
18
18
  __exportStar(require("./AppSandbox"), exports);
19
19
  __exportStar(require("./AssetPlugin"), exports);
20
20
  __exportStar(require("./Assets"), exports);
21
+ __exportStar(require("./Cache"), exports);
21
22
  __exportStar(require("./ChallengeResults"), exports);
22
23
  __exportStar(require("./Dialog"), exports);
23
24
  __exportStar(require("./Dispatcher"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yCAAuB;AACvB,+CAA6B;AAC7B,gDAA8B;AAC9B,2CAAyB;AACzB,qDAAmC;AACnC,2CAAyB;AACzB,+CAA6B;AAC7B,2CAAyB;AACzB,4CAA0B;AAC1B,2CAAyB;AACzB,6CAA2B;AAC3B,iDAA+B;AAC/B,gDAA8B;AAC9B,6CAA2B;AAC3B,+CAA6B","sourcesContent":["export * from \"./Apps\";\r\nexport * from \"./AppSandbox\";\r\nexport * from \"./AssetPlugin\";\r\nexport * from \"./Assets\";\r\nexport * from \"./ChallengeResults\";\r\nexport * from \"./Dialog\";\r\nexport * from \"./Dispatcher\";\r\nexport * from \"./Events\";\r\nexport * from \"./Handler\";\r\nexport * from \"./Logger\";\r\nexport * from \"./Snackbar\";\r\nexport * from \"./StateMachine\";\r\nexport * from \"./ThemeColors\";\r\nexport * from \"./VivedAPI\";\r\nexport * from \"./ZSpaceHost\";\r\n\r\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yCAAuB;AACvB,+CAA6B;AAC7B,gDAA8B;AAC9B,2CAAyB;AACzB,0CAAwB;AACxB,qDAAmC;AACnC,2CAAyB;AACzB,+CAA6B;AAC7B,2CAAyB;AACzB,4CAA0B;AAC1B,2CAAyB;AACzB,6CAA2B;AAC3B,iDAA+B;AAC/B,gDAA8B;AAC9B,6CAA2B;AAC3B,+CAA6B","sourcesContent":["export * from \"./Apps\";\r\nexport * from \"./AppSandbox\";\r\nexport * from \"./AssetPlugin\";\r\nexport * from \"./Assets\";\r\nexport * from \"./Cache\";\r\nexport * from \"./ChallengeResults\";\r\nexport * from \"./Dialog\";\r\nexport * from \"./Dispatcher\";\r\nexport * from \"./Events\";\r\nexport * from \"./Handler\";\r\nexport * from \"./Logger\";\r\nexport * from \"./Snackbar\";\r\nexport * from \"./StateMachine\";\r\nexport * from \"./ThemeColors\";\r\nexport * from \"./VivedAPI\";\r\nexport * from \"./ZSpaceHost\";\r\n"]}