create-fluxstack 1.13.0 → 1.15.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/LLMD/patterns/anti-patterns.md +100 -0
- package/LLMD/reference/routing.md +39 -39
- package/LLMD/resources/live-auth.md +20 -2
- package/LLMD/resources/live-components.md +300 -21
- package/LLMD/resources/live-logging.md +95 -33
- package/LLMD/resources/live-upload.md +59 -8
- package/app/client/.live-stubs/LiveAdminPanel.js +5 -0
- package/app/client/.live-stubs/LiveChat.js +7 -0
- package/app/client/.live-stubs/LiveCounter.js +9 -0
- package/app/client/.live-stubs/LiveForm.js +11 -0
- package/app/client/.live-stubs/LiveLocalCounter.js +8 -0
- package/app/client/.live-stubs/LiveRoomChat.js +10 -0
- package/app/client/.live-stubs/LiveTodoList.js +9 -0
- package/app/client/.live-stubs/LiveUpload.js +15 -0
- package/app/client/index.html +2 -2
- package/app/client/public/favicon.svg +46 -0
- package/app/client/src/App.tsx +13 -1
- package/app/client/src/assets/fluxstack-static.svg +46 -0
- package/app/client/src/assets/fluxstack.svg +183 -0
- package/app/client/src/components/AppLayout.tsx +146 -9
- package/app/client/src/components/BackButton.tsx +13 -13
- package/app/client/src/components/DemoPage.tsx +4 -4
- package/app/client/src/live/AuthDemo.tsx +23 -21
- package/app/client/src/live/ChatDemo.tsx +2 -2
- package/app/client/src/live/CounterDemo.tsx +12 -12
- package/app/client/src/live/FormDemo.tsx +2 -2
- package/app/client/src/live/LiveDebuggerPanel.tsx +779 -0
- package/app/client/src/live/RoomChatDemo.tsx +24 -16
- package/app/client/src/live/TodoListDemo.tsx +158 -0
- package/app/client/src/main.tsx +13 -13
- package/app/client/src/pages/ApiTestPage.tsx +6 -6
- package/app/client/src/pages/HomePage.tsx +80 -52
- package/app/server/auth/DevAuthProvider.ts +2 -2
- package/app/server/auth/JWTAuthProvider.example.ts +2 -2
- package/app/server/index.ts +2 -2
- package/app/server/live/LiveAdminPanel.ts +2 -1
- package/app/server/live/LiveChat.ts +78 -77
- package/app/server/live/LiveCounter.ts +1 -1
- package/app/server/live/LiveForm.ts +1 -0
- package/app/server/live/LiveLocalCounter.ts +38 -37
- package/app/server/live/LiveProtectedChat.ts +2 -1
- package/app/server/live/LiveRoomChat.ts +1 -0
- package/app/server/live/LiveTodoList.ts +110 -0
- package/app/server/live/LiveUpload.ts +1 -0
- package/app/server/live/register-components.ts +19 -19
- package/app/server/routes/room.routes.ts +1 -2
- package/config/system/runtime.config.ts +4 -0
- package/core/build/live-components-generator.ts +1 -1
- package/core/build/optimizer.ts +235 -235
- package/core/build/vite-plugins.ts +28 -0
- package/core/client/components/LiveDebugger.tsx +1324 -0
- package/core/client/hooks/useLiveUpload.ts +3 -4
- package/core/client/index.ts +41 -21
- package/core/framework/server.ts +1 -1
- package/core/plugins/built-in/index.ts +134 -134
- package/core/plugins/built-in/live-components/commands/create-live-component.ts +4 -0
- package/core/plugins/built-in/vite/index.ts +75 -21
- package/core/server/index.ts +14 -15
- package/core/server/live/auto-generated-components.ts +6 -3
- package/core/server/live/index.ts +95 -21
- package/core/server/live/websocket-plugin.ts +27 -862
- package/core/server/plugins/static-files-plugin.ts +179 -69
- package/core/types/build.ts +219 -219
- package/core/types/plugin.ts +107 -107
- package/core/types/types.ts +77 -890
- package/core/utils/logger/startup-banner.ts +82 -82
- package/core/utils/version.ts +6 -6
- package/create-fluxstack.ts +1 -1
- package/package.json +5 -1
- package/plugins/crypto-auth/index.ts +1 -1
- package/plugins/crypto-auth/server/CryptoAuthLiveProvider.ts +2 -2
- package/vite.config.ts +40 -12
- package/app/client/src/assets/react.svg +0 -1
- package/core/client/LiveComponentsProvider.tsx +0 -531
- package/core/client/components/Live.tsx +0 -105
- package/core/client/hooks/AdaptiveChunkSizer.ts +0 -215
- package/core/client/hooks/state-validator.ts +0 -130
- package/core/client/hooks/useChunkedUpload.ts +0 -359
- package/core/client/hooks/useLiveChunkedUpload.ts +0 -87
- package/core/client/hooks/useLiveComponent.ts +0 -843
- package/core/client/hooks/useRoom.ts +0 -409
- package/core/client/hooks/useRoomProxy.ts +0 -382
- package/core/server/live/ComponentRegistry.ts +0 -1099
- package/core/server/live/FileUploadManager.ts +0 -282
- package/core/server/live/LiveComponentPerformanceMonitor.ts +0 -931
- package/core/server/live/LiveLogger.ts +0 -111
- package/core/server/live/LiveRoomManager.ts +0 -262
- package/core/server/live/RoomEventBus.ts +0 -234
- package/core/server/live/RoomStateManager.ts +0 -172
- package/core/server/live/SingleConnectionManager.ts +0 -0
- package/core/server/live/StateSignature.ts +0 -645
- package/core/server/live/WebSocketConnectionManager.ts +0 -709
- package/core/server/live/auth/LiveAuthContext.ts +0 -71
- package/core/server/live/auth/LiveAuthManager.ts +0 -304
- package/core/server/live/auth/index.ts +0 -19
- package/core/server/live/auth/types.ts +0 -179
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
// 🔥 FluxStack Live - Room State Manager (In-memory storage per room)
|
|
2
|
-
|
|
3
|
-
type RoomStateData = Record<string, any>
|
|
4
|
-
|
|
5
|
-
interface RoomInfo {
|
|
6
|
-
state: RoomStateData
|
|
7
|
-
componentCount: number
|
|
8
|
-
createdAt: number
|
|
9
|
-
lastUpdate: number
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export function createTypedRoomState<TRoomTypes extends Record<string, RoomStateData>>() {
|
|
13
|
-
const rooms = new Map<string, RoomInfo>()
|
|
14
|
-
const getKey = (type: string, roomId: string) => `${type}:${roomId}`
|
|
15
|
-
|
|
16
|
-
return {
|
|
17
|
-
get<K extends keyof TRoomTypes>(type: K, roomId: string, defaultState: TRoomTypes[K]): TRoomTypes[K] {
|
|
18
|
-
const key = getKey(type as string, roomId)
|
|
19
|
-
const room = rooms.get(key)
|
|
20
|
-
|
|
21
|
-
if (room) return room.state as TRoomTypes[K]
|
|
22
|
-
|
|
23
|
-
rooms.set(key, { state: defaultState, componentCount: 0, createdAt: Date.now(), lastUpdate: Date.now() })
|
|
24
|
-
return defaultState
|
|
25
|
-
},
|
|
26
|
-
|
|
27
|
-
update<K extends keyof TRoomTypes>(type: K, roomId: string, updates: Partial<TRoomTypes[K]>): TRoomTypes[K] {
|
|
28
|
-
const key = getKey(type as string, roomId)
|
|
29
|
-
const room = rooms.get(key)
|
|
30
|
-
|
|
31
|
-
if (room) {
|
|
32
|
-
room.state = { ...room.state, ...updates }
|
|
33
|
-
room.lastUpdate = Date.now()
|
|
34
|
-
return room.state as TRoomTypes[K]
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
const newState = updates as TRoomTypes[K]
|
|
38
|
-
rooms.set(key, { state: newState, componentCount: 0, createdAt: Date.now(), lastUpdate: Date.now() })
|
|
39
|
-
return newState
|
|
40
|
-
},
|
|
41
|
-
|
|
42
|
-
set<K extends keyof TRoomTypes>(type: K, roomId: string, state: TRoomTypes[K]): void {
|
|
43
|
-
const key = getKey(type as string, roomId)
|
|
44
|
-
const room = rooms.get(key)
|
|
45
|
-
|
|
46
|
-
if (room) {
|
|
47
|
-
room.state = state
|
|
48
|
-
room.lastUpdate = Date.now()
|
|
49
|
-
} else {
|
|
50
|
-
rooms.set(key, { state, componentCount: 0, createdAt: Date.now(), lastUpdate: Date.now() })
|
|
51
|
-
}
|
|
52
|
-
},
|
|
53
|
-
|
|
54
|
-
join<K extends keyof TRoomTypes>(type: K, roomId: string): void {
|
|
55
|
-
const room = rooms.get(getKey(type as string, roomId))
|
|
56
|
-
if (room) room.componentCount++
|
|
57
|
-
},
|
|
58
|
-
|
|
59
|
-
leave<K extends keyof TRoomTypes>(type: K, roomId: string): void {
|
|
60
|
-
const key = getKey(type as string, roomId)
|
|
61
|
-
const room = rooms.get(key)
|
|
62
|
-
if (room) {
|
|
63
|
-
room.componentCount--
|
|
64
|
-
if (room.componentCount <= 0) {
|
|
65
|
-
setTimeout(() => {
|
|
66
|
-
const current = rooms.get(key)
|
|
67
|
-
if (current && current.componentCount <= 0) {
|
|
68
|
-
rooms.delete(key)
|
|
69
|
-
}
|
|
70
|
-
}, 5 * 60 * 1000)
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
},
|
|
74
|
-
|
|
75
|
-
has<K extends keyof TRoomTypes>(type: K, roomId: string): boolean {
|
|
76
|
-
return rooms.has(getKey(type as string, roomId))
|
|
77
|
-
},
|
|
78
|
-
|
|
79
|
-
delete<K extends keyof TRoomTypes>(type: K, roomId: string): boolean {
|
|
80
|
-
return rooms.delete(getKey(type as string, roomId))
|
|
81
|
-
},
|
|
82
|
-
|
|
83
|
-
getStats(): { totalRooms: number; rooms: Record<string, { componentCount: number; stateKeys: string[] }> } {
|
|
84
|
-
const roomStats: Record<string, { componentCount: number; stateKeys: string[] }> = {}
|
|
85
|
-
for (const [key, info] of rooms) {
|
|
86
|
-
roomStats[key] = { componentCount: info.componentCount, stateKeys: Object.keys(info.state) }
|
|
87
|
-
}
|
|
88
|
-
return { totalRooms: rooms.size, rooms: roomStats }
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
class RoomStateManager {
|
|
94
|
-
private rooms = new Map<string, RoomInfo>()
|
|
95
|
-
|
|
96
|
-
get<T extends RoomStateData>(roomId: string, defaultState?: T): T {
|
|
97
|
-
const room = this.rooms.get(roomId)
|
|
98
|
-
if (room) return room.state as T
|
|
99
|
-
|
|
100
|
-
if (defaultState) {
|
|
101
|
-
this.rooms.set(roomId, { state: defaultState, componentCount: 0, createdAt: Date.now(), lastUpdate: Date.now() })
|
|
102
|
-
return defaultState
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
return {} as T
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
update<T extends RoomStateData>(roomId: string, updates: Partial<T>): T {
|
|
109
|
-
const room = this.rooms.get(roomId)
|
|
110
|
-
|
|
111
|
-
if (room) {
|
|
112
|
-
room.state = { ...room.state, ...updates }
|
|
113
|
-
room.lastUpdate = Date.now()
|
|
114
|
-
return room.state as T
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
const newState = updates as T
|
|
118
|
-
this.rooms.set(roomId, { state: newState, componentCount: 0, createdAt: Date.now(), lastUpdate: Date.now() })
|
|
119
|
-
return newState
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
set<T extends RoomStateData>(roomId: string, state: T): void {
|
|
123
|
-
const room = this.rooms.get(roomId)
|
|
124
|
-
|
|
125
|
-
if (room) {
|
|
126
|
-
room.state = state
|
|
127
|
-
room.lastUpdate = Date.now()
|
|
128
|
-
} else {
|
|
129
|
-
this.rooms.set(roomId, { state, componentCount: 0, createdAt: Date.now(), lastUpdate: Date.now() })
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
join(roomId: string): void {
|
|
134
|
-
const room = this.rooms.get(roomId)
|
|
135
|
-
if (room) room.componentCount++
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
leave(roomId: string): void {
|
|
139
|
-
const room = this.rooms.get(roomId)
|
|
140
|
-
if (room) {
|
|
141
|
-
room.componentCount--
|
|
142
|
-
if (room.componentCount <= 0) {
|
|
143
|
-
setTimeout(() => {
|
|
144
|
-
const current = this.rooms.get(roomId)
|
|
145
|
-
if (current && current.componentCount <= 0) {
|
|
146
|
-
this.rooms.delete(roomId)
|
|
147
|
-
}
|
|
148
|
-
}, 5 * 60 * 1000)
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
has(roomId: string): boolean {
|
|
154
|
-
return this.rooms.has(roomId)
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
delete(roomId: string): boolean {
|
|
158
|
-
return this.rooms.delete(roomId)
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
getStats(): { totalRooms: number; rooms: Record<string, { componentCount: number; stateKeys: string[] }> } {
|
|
162
|
-
const rooms: Record<string, { componentCount: number; stateKeys: string[] }> = {}
|
|
163
|
-
for (const [roomId, info] of this.rooms) {
|
|
164
|
-
rooms[roomId] = { componentCount: info.componentCount, stateKeys: Object.keys(info.state) }
|
|
165
|
-
}
|
|
166
|
-
return { totalRooms: this.rooms.size, rooms }
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
export const roomState = new RoomStateManager()
|
|
171
|
-
|
|
172
|
-
export type { RoomStateData, RoomInfo }
|
|
File without changes
|