@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.
- package/dist/cjs/Assets/UCs/GetAssetBlobURLUC.js +104 -27
- package/dist/cjs/Assets/UCs/GetAssetBlobURLUC.js.map +1 -1
- package/dist/cjs/Assets/UCs/GetAssetFileUC.js +111 -34
- package/dist/cjs/Assets/UCs/GetAssetFileUC.js.map +1 -1
- package/dist/cjs/Cache/Controllers/clearCache.js +13 -0
- package/dist/cjs/Cache/Controllers/clearCache.js.map +1 -0
- package/dist/cjs/Cache/Controllers/index.js +18 -0
- package/dist/cjs/Cache/Controllers/index.js.map +1 -0
- package/dist/cjs/Cache/Entities/AssetCacheEntity.js +95 -0
- package/dist/cjs/Cache/Entities/AssetCacheEntity.js.map +1 -0
- package/dist/cjs/Cache/Entities/CacheEntity.js +54 -0
- package/dist/cjs/Cache/Entities/CacheEntity.js.map +1 -0
- package/dist/cjs/Cache/Entities/ScriptCacheEntity.js +137 -0
- package/dist/cjs/Cache/Entities/ScriptCacheEntity.js.map +1 -0
- package/dist/cjs/Cache/Entities/index.js +25 -0
- package/dist/cjs/Cache/Entities/index.js.map +1 -0
- package/dist/cjs/Cache/Factories/index.js +18 -0
- package/dist/cjs/Cache/Factories/index.js.map +1 -0
- package/dist/cjs/Cache/Factories/setupCache.js +27 -0
- package/dist/cjs/Cache/Factories/setupCache.js.map +1 -0
- package/dist/cjs/Cache/Mocks/MockCacheEntity.js +22 -0
- package/dist/cjs/Cache/Mocks/MockCacheEntity.js.map +1 -0
- package/dist/cjs/Cache/Mocks/MockGetAssetFromCacheUC.js +19 -0
- package/dist/cjs/Cache/Mocks/MockGetAssetFromCacheUC.js.map +1 -0
- package/dist/cjs/Cache/Mocks/MockGetScriptFromCacheUC.js +22 -0
- package/dist/cjs/Cache/Mocks/MockGetScriptFromCacheUC.js.map +1 -0
- package/dist/cjs/Cache/Mocks/MockStoreAssetInCacheUC.js +17 -0
- package/dist/cjs/Cache/Mocks/MockStoreAssetInCacheUC.js.map +1 -0
- package/dist/cjs/Cache/Mocks/MockStoreScriptInCacheUC.js +22 -0
- package/dist/cjs/Cache/Mocks/MockStoreScriptInCacheUC.js.map +1 -0
- package/dist/cjs/Cache/Mocks/index.js +22 -0
- package/dist/cjs/Cache/Mocks/index.js.map +1 -0
- package/dist/cjs/Cache/UCs/GetAssetFromCacheUC.js +40 -0
- package/dist/cjs/Cache/UCs/GetAssetFromCacheUC.js.map +1 -0
- package/dist/cjs/Cache/UCs/GetScriptFromCacheUC.js +49 -0
- package/dist/cjs/Cache/UCs/GetScriptFromCacheUC.js.map +1 -0
- package/dist/cjs/Cache/UCs/StoreAssetInCacheUC.js +39 -0
- package/dist/cjs/Cache/UCs/StoreAssetInCacheUC.js.map +1 -0
- package/dist/cjs/Cache/UCs/StoreScriptInCacheUC.js +48 -0
- package/dist/cjs/Cache/UCs/StoreScriptInCacheUC.js.map +1 -0
- package/dist/cjs/Cache/UCs/index.js +26 -0
- package/dist/cjs/Cache/UCs/index.js.map +1 -0
- package/dist/cjs/Cache/index.js +21 -0
- package/dist/cjs/Cache/index.js.map +1 -0
- package/dist/cjs/StateMachine/Entities/HostEditingStateEntity.js +62 -0
- package/dist/cjs/StateMachine/Entities/HostEditingStateEntity.js.map +1 -1
- package/dist/cjs/StateMachine/Entities/HostStateEntity.js +91 -2
- package/dist/cjs/StateMachine/Entities/HostStateEntity.js.map +1 -1
- package/dist/cjs/StateMachine/Entities/HostStateMachine.js +127 -0
- package/dist/cjs/StateMachine/Entities/HostStateMachine.js.map +1 -1
- package/dist/cjs/StateMachine/Mocks/MockHostStateEntity.js +1 -0
- package/dist/cjs/StateMachine/Mocks/MockHostStateEntity.js.map +1 -1
- package/dist/cjs/StateMachine/PMs/HostStatePM.js +6 -2
- package/dist/cjs/StateMachine/PMs/HostStatePM.js.map +1 -1
- package/dist/cjs/StateMachine/UCs/DeleteStateUC.js +1 -1
- package/dist/cjs/StateMachine/UCs/DeleteStateUC.js.map +1 -1
- package/dist/cjs/StateMachine/UCs/DuplicateStateUC.js +1 -1
- package/dist/cjs/StateMachine/UCs/DuplicateStateUC.js.map +1 -1
- package/dist/cjs/StateMachine/UCs/SavePersistentStates.js.map +1 -1
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/Assets/UCs/GetAssetBlobURLUC.js +104 -27
- package/dist/esm/Assets/UCs/GetAssetBlobURLUC.js.map +1 -1
- package/dist/esm/Assets/UCs/GetAssetFileUC.js +111 -34
- package/dist/esm/Assets/UCs/GetAssetFileUC.js.map +1 -1
- package/dist/esm/Cache/Controllers/clearCache.js +10 -0
- package/dist/esm/Cache/Controllers/clearCache.js.map +1 -0
- package/dist/esm/Cache/Controllers/index.js +2 -0
- package/dist/esm/Cache/Controllers/index.js.map +1 -0
- package/dist/esm/Cache/Entities/AssetCacheEntity.js +90 -0
- package/dist/esm/Cache/Entities/AssetCacheEntity.js.map +1 -0
- package/dist/esm/Cache/Entities/CacheEntity.js +49 -0
- package/dist/esm/Cache/Entities/CacheEntity.js.map +1 -0
- package/dist/esm/Cache/Entities/ScriptCacheEntity.js +132 -0
- package/dist/esm/Cache/Entities/ScriptCacheEntity.js.map +1 -0
- package/dist/esm/Cache/Entities/index.js +9 -0
- package/dist/esm/Cache/Entities/index.js.map +1 -0
- package/dist/esm/Cache/Factories/index.js +2 -0
- package/dist/esm/Cache/Factories/index.js.map +1 -0
- package/dist/esm/Cache/Factories/setupCache.js +24 -0
- package/dist/esm/Cache/Factories/setupCache.js.map +1 -0
- package/dist/esm/Cache/Mocks/MockCacheEntity.js +17 -0
- package/dist/esm/Cache/Mocks/MockCacheEntity.js.map +1 -0
- package/dist/esm/Cache/Mocks/MockGetAssetFromCacheUC.js +14 -0
- package/dist/esm/Cache/Mocks/MockGetAssetFromCacheUC.js.map +1 -0
- package/dist/esm/Cache/Mocks/MockGetScriptFromCacheUC.js +17 -0
- package/dist/esm/Cache/Mocks/MockGetScriptFromCacheUC.js.map +1 -0
- package/dist/esm/Cache/Mocks/MockStoreAssetInCacheUC.js +12 -0
- package/dist/esm/Cache/Mocks/MockStoreAssetInCacheUC.js.map +1 -0
- package/dist/esm/Cache/Mocks/MockStoreScriptInCacheUC.js +17 -0
- package/dist/esm/Cache/Mocks/MockStoreScriptInCacheUC.js.map +1 -0
- package/dist/esm/Cache/Mocks/index.js +6 -0
- package/dist/esm/Cache/Mocks/index.js.map +1 -0
- package/dist/esm/Cache/UCs/GetAssetFromCacheUC.js +35 -0
- package/dist/esm/Cache/UCs/GetAssetFromCacheUC.js.map +1 -0
- package/dist/esm/Cache/UCs/GetScriptFromCacheUC.js +44 -0
- package/dist/esm/Cache/UCs/GetScriptFromCacheUC.js.map +1 -0
- package/dist/esm/Cache/UCs/StoreAssetInCacheUC.js +34 -0
- package/dist/esm/Cache/UCs/StoreAssetInCacheUC.js.map +1 -0
- package/dist/esm/Cache/UCs/StoreScriptInCacheUC.js +43 -0
- package/dist/esm/Cache/UCs/StoreScriptInCacheUC.js.map +1 -0
- package/dist/esm/Cache/UCs/index.js +10 -0
- package/dist/esm/Cache/UCs/index.js.map +1 -0
- package/dist/esm/Cache/index.js +5 -0
- package/dist/esm/Cache/index.js.map +1 -0
- package/dist/esm/StateMachine/Entities/HostEditingStateEntity.js +62 -0
- package/dist/esm/StateMachine/Entities/HostEditingStateEntity.js.map +1 -1
- package/dist/esm/StateMachine/Entities/HostStateEntity.js +90 -1
- package/dist/esm/StateMachine/Entities/HostStateEntity.js.map +1 -1
- package/dist/esm/StateMachine/Entities/HostStateMachine.js +127 -0
- package/dist/esm/StateMachine/Entities/HostStateMachine.js.map +1 -1
- package/dist/esm/StateMachine/Mocks/MockHostStateEntity.js +2 -1
- package/dist/esm/StateMachine/Mocks/MockHostStateEntity.js.map +1 -1
- package/dist/esm/StateMachine/PMs/HostStatePM.js +7 -3
- package/dist/esm/StateMachine/PMs/HostStatePM.js.map +1 -1
- package/dist/esm/StateMachine/UCs/DeleteStateUC.js +1 -1
- package/dist/esm/StateMachine/UCs/DeleteStateUC.js.map +1 -1
- package/dist/esm/StateMachine/UCs/DuplicateStateUC.js +1 -1
- package/dist/esm/StateMachine/UCs/DuplicateStateUC.js.map +1 -1
- package/dist/esm/StateMachine/UCs/SavePersistentStates.js.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/types/Assets/UCs/GetAssetBlobURLUC.d.ts.map +1 -1
- package/dist/types/Cache/Controllers/clearCache.d.ts +3 -0
- package/dist/types/Cache/Controllers/clearCache.d.ts.map +1 -0
- package/dist/types/Cache/Controllers/index.d.ts +2 -0
- package/dist/types/Cache/Controllers/index.d.ts.map +1 -0
- package/dist/types/Cache/Entities/AssetCacheEntity.d.ts +43 -0
- package/dist/types/Cache/Entities/AssetCacheEntity.d.ts.map +1 -0
- package/dist/types/Cache/Entities/CacheEntity.d.ts +57 -0
- package/dist/types/Cache/Entities/CacheEntity.d.ts.map +1 -0
- package/dist/types/Cache/Entities/ScriptCacheEntity.d.ts +64 -0
- package/dist/types/Cache/Entities/ScriptCacheEntity.d.ts.map +1 -0
- package/dist/types/Cache/Entities/index.d.ts +9 -0
- package/dist/types/Cache/Entities/index.d.ts.map +1 -0
- package/dist/types/Cache/Factories/index.d.ts +2 -0
- package/dist/types/Cache/Factories/index.d.ts.map +1 -0
- package/dist/types/Cache/Factories/setupCache.d.ts +6 -0
- package/dist/types/Cache/Factories/setupCache.d.ts.map +1 -0
- package/dist/types/Cache/Mocks/MockCacheEntity.d.ts +13 -0
- package/dist/types/Cache/Mocks/MockCacheEntity.d.ts.map +1 -0
- package/dist/types/Cache/Mocks/MockGetAssetFromCacheUC.d.ts +8 -0
- package/dist/types/Cache/Mocks/MockGetAssetFromCacheUC.d.ts.map +1 -0
- package/dist/types/Cache/Mocks/MockGetScriptFromCacheUC.d.ts +9 -0
- package/dist/types/Cache/Mocks/MockGetScriptFromCacheUC.d.ts.map +1 -0
- package/dist/types/Cache/Mocks/MockStoreAssetInCacheUC.d.ts +8 -0
- package/dist/types/Cache/Mocks/MockStoreAssetInCacheUC.d.ts.map +1 -0
- package/dist/types/Cache/Mocks/MockStoreScriptInCacheUC.d.ts +9 -0
- package/dist/types/Cache/Mocks/MockStoreScriptInCacheUC.d.ts.map +1 -0
- package/dist/types/Cache/Mocks/index.d.ts +6 -0
- package/dist/types/Cache/Mocks/index.d.ts.map +1 -0
- package/dist/types/Cache/UCs/GetAssetFromCacheUC.d.ts +8 -0
- package/dist/types/Cache/UCs/GetAssetFromCacheUC.d.ts.map +1 -0
- package/dist/types/Cache/UCs/GetScriptFromCacheUC.d.ts +13 -0
- package/dist/types/Cache/UCs/GetScriptFromCacheUC.d.ts.map +1 -0
- package/dist/types/Cache/UCs/StoreAssetInCacheUC.d.ts +8 -0
- package/dist/types/Cache/UCs/StoreAssetInCacheUC.d.ts.map +1 -0
- package/dist/types/Cache/UCs/StoreScriptInCacheUC.d.ts +13 -0
- package/dist/types/Cache/UCs/StoreScriptInCacheUC.d.ts.map +1 -0
- package/dist/types/Cache/UCs/index.d.ts +10 -0
- package/dist/types/Cache/UCs/index.d.ts.map +1 -0
- package/dist/types/Cache/index.d.ts +5 -0
- package/dist/types/Cache/index.d.ts.map +1 -0
- package/dist/types/StateMachine/Entities/HostEditingStateEntity.d.ts +42 -0
- package/dist/types/StateMachine/Entities/HostEditingStateEntity.d.ts.map +1 -1
- package/dist/types/StateMachine/Entities/HostStateEntity.d.ts +72 -5
- package/dist/types/StateMachine/Entities/HostStateEntity.d.ts.map +1 -1
- package/dist/types/StateMachine/Entities/HostStateMachine.d.ts +77 -0
- package/dist/types/StateMachine/Entities/HostStateMachine.d.ts.map +1 -1
- package/dist/types/StateMachine/Mocks/MockHostStateEntity.d.ts +2 -1
- package/dist/types/StateMachine/Mocks/MockHostStateEntity.d.ts.map +1 -1
- package/dist/types/StateMachine/PMs/HostStatePM.d.ts +2 -0
- package/dist/types/StateMachine/PMs/HostStatePM.d.ts.map +1 -1
- package/dist/types/StateMachine/UCs/SavePersistentStates.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- 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":";;;
|
|
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":";;;
|
|
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.
|
|
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,
|
|
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.
|
|
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,
|
|
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":";;;
|
|
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);
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -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
|
|
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"]}
|