@allternit/ix 0.1.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/README.md +320 -0
- package/dist/adapters/json-render.d.ts +211 -0
- package/dist/adapters/json-render.d.ts.bak +211 -0
- package/dist/adapters/json-render.d.ts.map +1 -0
- package/dist/adapters/json-render.js +576 -0
- package/dist/adapters/json-render.js.bak +576 -0
- package/dist/adapters/json-render.js.map +1 -0
- package/dist/catalog/registry.d.ts +65 -0
- package/dist/catalog/registry.d.ts.bak +65 -0
- package/dist/catalog/registry.d.ts.map +1 -0
- package/dist/catalog/registry.js +388 -0
- package/dist/catalog/registry.js.bak +388 -0
- package/dist/catalog/registry.js.map +1 -0
- package/dist/collab/capsule-registry.d.ts +114 -0
- package/dist/collab/capsule-registry.d.ts.bak +114 -0
- package/dist/collab/capsule-registry.d.ts.map +1 -0
- package/dist/collab/capsule-registry.js +271 -0
- package/dist/collab/capsule-registry.js.bak +271 -0
- package/dist/collab/capsule-registry.js.map +1 -0
- package/dist/collab/index.d.ts +21 -0
- package/dist/collab/index.d.ts.bak +21 -0
- package/dist/collab/index.d.ts.map +1 -0
- package/dist/collab/index.js +32 -0
- package/dist/collab/index.js.bak +32 -0
- package/dist/collab/index.js.map +1 -0
- package/dist/collab/visual-editor.d.ts +199 -0
- package/dist/collab/visual-editor.d.ts.bak +199 -0
- package/dist/collab/visual-editor.d.ts.map +1 -0
- package/dist/collab/visual-editor.js +259 -0
- package/dist/collab/visual-editor.js.bak +259 -0
- package/dist/collab/visual-editor.js.map +1 -0
- package/dist/collab/yjs-adapter.d.ts +95 -0
- package/dist/collab/yjs-adapter.d.ts.bak +95 -0
- package/dist/collab/yjs-adapter.d.ts.map +1 -0
- package/dist/collab/yjs-adapter.js +282 -0
- package/dist/collab/yjs-adapter.js.bak +282 -0
- package/dist/collab/yjs-adapter.js.map +1 -0
- package/dist/collab/yjs-client.d.ts +101 -0
- package/dist/collab/yjs-client.d.ts.bak +101 -0
- package/dist/collab/yjs-client.d.ts.map +1 -0
- package/dist/collab/yjs-client.js +193 -0
- package/dist/collab/yjs-client.js.bak +193 -0
- package/dist/collab/yjs-client.js.map +1 -0
- package/dist/collab/yjs-protocols.d.ts +128 -0
- package/dist/collab/yjs-protocols.d.ts.bak +128 -0
- package/dist/collab/yjs-protocols.d.ts.map +1 -0
- package/dist/collab/yjs-protocols.js +245 -0
- package/dist/collab/yjs-protocols.js.bak +245 -0
- package/dist/collab/yjs-protocols.js.map +1 -0
- package/dist/collab/yjs-types.d.ts +201 -0
- package/dist/collab/yjs-types.d.ts.bak +201 -0
- package/dist/collab/yjs-types.d.ts.map +1 -0
- package/dist/collab/yjs-types.js +45 -0
- package/dist/collab/yjs-types.js.bak +45 -0
- package/dist/collab/yjs-types.js.map +1 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.d.ts.bak +38 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +48 -0
- package/dist/index.js.bak +48 -0
- package/dist/index.js.map +1 -0
- package/dist/pipeline/llm-to-ix.d.ts +249 -0
- package/dist/pipeline/llm-to-ix.d.ts.bak +249 -0
- package/dist/pipeline/llm-to-ix.d.ts.map +1 -0
- package/dist/pipeline/llm-to-ix.js +992 -0
- package/dist/pipeline/llm-to-ix.js.bak +992 -0
- package/dist/pipeline/llm-to-ix.js.map +1 -0
- package/dist/react/index.d.ts +18 -0
- package/dist/react/index.d.ts.bak +18 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +18 -0
- package/dist/react/index.js.bak +18 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/renderer.d.ts +47 -0
- package/dist/react/renderer.d.ts.bak +47 -0
- package/dist/react/renderer.d.ts.map +1 -0
- package/dist/react/renderer.js +420 -0
- package/dist/react/renderer.js.bak +420 -0
- package/dist/react/renderer.js.map +1 -0
- package/dist/renderer/renderer.d.ts +55 -0
- package/dist/renderer/renderer.d.ts.bak +55 -0
- package/dist/renderer/renderer.d.ts.map +1 -0
- package/dist/renderer/renderer.js +232 -0
- package/dist/renderer/renderer.js.bak +232 -0
- package/dist/renderer/renderer.js.map +1 -0
- package/dist/runtime/capsule-runtime.d.ts +227 -0
- package/dist/runtime/capsule-runtime.d.ts.bak +227 -0
- package/dist/runtime/capsule-runtime.d.ts.map +1 -0
- package/dist/runtime/capsule-runtime.js +563 -0
- package/dist/runtime/capsule-runtime.js.bak +563 -0
- package/dist/runtime/capsule-runtime.js.map +1 -0
- package/dist/runtime/policy-gates.d.ts +116 -0
- package/dist/runtime/policy-gates.d.ts.bak +116 -0
- package/dist/runtime/policy-gates.d.ts.map +1 -0
- package/dist/runtime/policy-gates.js +317 -0
- package/dist/runtime/policy-gates.js.bak +317 -0
- package/dist/runtime/policy-gates.js.map +1 -0
- package/dist/schema/ui-ir.d.ts +26 -0
- package/dist/schema/ui-ir.d.ts.bak +26 -0
- package/dist/schema/ui-ir.d.ts.map +1 -0
- package/dist/schema/ui-ir.js +51 -0
- package/dist/schema/ui-ir.js.bak +51 -0
- package/dist/schema/ui-ir.js.map +1 -0
- package/dist/sdk/api.d.ts +101 -0
- package/dist/sdk/api.d.ts.bak +101 -0
- package/dist/sdk/api.d.ts.map +1 -0
- package/dist/sdk/api.js +177 -0
- package/dist/sdk/api.js.bak +177 -0
- package/dist/sdk/api.js.map +1 -0
- package/dist/sdk/index.d.ts +9 -0
- package/dist/sdk/index.d.ts.bak +9 -0
- package/dist/sdk/index.d.ts.map +1 -0
- package/dist/sdk/index.js +10 -0
- package/dist/sdk/index.js.bak +10 -0
- package/dist/sdk/index.js.map +1 -0
- package/dist/sdk/react.d.ts +63 -0
- package/dist/sdk/react.d.ts.bak +63 -0
- package/dist/sdk/react.d.ts.map +1 -0
- package/dist/sdk/react.js +161 -0
- package/dist/sdk/react.js.bak +161 -0
- package/dist/sdk/react.js.map +1 -0
- package/dist/state/index.d.ts +8 -0
- package/dist/state/index.d.ts.bak +8 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +8 -0
- package/dist/state/index.js.bak +8 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/patch.d.ts +73 -0
- package/dist/state/patch.d.ts.bak +73 -0
- package/dist/state/patch.d.ts.map +1 -0
- package/dist/state/patch.js +437 -0
- package/dist/state/patch.js.bak +437 -0
- package/dist/state/patch.js.map +1 -0
- package/dist/state/store.d.ts +50 -0
- package/dist/state/store.d.ts.bak +50 -0
- package/dist/state/store.d.ts.map +1 -0
- package/dist/state/store.js +246 -0
- package/dist/state/store.js.bak +246 -0
- package/dist/state/store.js.map +1 -0
- package/dist/svelte/index.d.ts +15 -0
- package/dist/svelte/index.d.ts.bak +15 -0
- package/dist/svelte/index.d.ts.map +1 -0
- package/dist/svelte/index.js +15 -0
- package/dist/svelte/index.js.bak +15 -0
- package/dist/svelte/index.js.map +1 -0
- package/dist/svelte/renderer.d.ts +35 -0
- package/dist/svelte/renderer.d.ts.bak +35 -0
- package/dist/svelte/renderer.d.ts.map +1 -0
- package/dist/svelte/renderer.js +317 -0
- package/dist/svelte/renderer.js.bak +317 -0
- package/dist/svelte/renderer.js.map +1 -0
- package/dist/types/index.d.ts +349 -0
- package/dist/types/index.d.ts.bak +349 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +152 -0
- package/dist/types/index.js.bak +152 -0
- package/dist/types/index.js.map +1 -0
- package/dist/vue/index.d.ts +18 -0
- package/dist/vue/index.d.ts.bak +18 -0
- package/dist/vue/index.d.ts.map +1 -0
- package/dist/vue/index.js +18 -0
- package/dist/vue/index.js.bak +18 -0
- package/dist/vue/index.js.map +1 -0
- package/dist/vue/renderer.d.ts +46 -0
- package/dist/vue/renderer.d.ts.bak +46 -0
- package/dist/vue/renderer.d.ts.map +1 -0
- package/dist/vue/renderer.js +302 -0
- package/dist/vue/renderer.js.bak +302 -0
- package/dist/vue/renderer.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
// OWNER: T2-A5
|
|
2
|
+
/**
|
|
3
|
+
* Capsule Registry - GAP-69, 70, 71
|
|
4
|
+
*
|
|
5
|
+
* Track subscribers and broadcast capsule events
|
|
6
|
+
*/
|
|
7
|
+
import { EventEmitter } from 'events';
|
|
8
|
+
/**
|
|
9
|
+
* Capsule Registry - GAP-69, 70, 71
|
|
10
|
+
*
|
|
11
|
+
* Track subscribers and broadcast events
|
|
12
|
+
*/
|
|
13
|
+
export class CapsuleRegistry extends EventEmitter {
|
|
14
|
+
subscribers;
|
|
15
|
+
subscriberById;
|
|
16
|
+
capsuleSubscribers;
|
|
17
|
+
constructor() {
|
|
18
|
+
super();
|
|
19
|
+
this.subscribers = new Map();
|
|
20
|
+
this.subscriberById = new Map();
|
|
21
|
+
this.capsuleSubscribers = new Map();
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Subscribe to a capsule
|
|
25
|
+
*/
|
|
26
|
+
subscribe(capsuleId, ws, subscriberId) {
|
|
27
|
+
const id = subscriberId || this.generateSubscriberId();
|
|
28
|
+
const subscriber = {
|
|
29
|
+
id,
|
|
30
|
+
ws,
|
|
31
|
+
capsuleIds: new Set([capsuleId]),
|
|
32
|
+
connectedAt: new Date(),
|
|
33
|
+
lastActivity: new Date(),
|
|
34
|
+
};
|
|
35
|
+
// Add to subscriber map
|
|
36
|
+
this.subscriberById.set(id, subscriber);
|
|
37
|
+
// Add to capsule subscribers
|
|
38
|
+
if (!this.subscribers.has(capsuleId)) {
|
|
39
|
+
this.subscribers.set(capsuleId, new Set());
|
|
40
|
+
}
|
|
41
|
+
this.subscribers.get(capsuleId).add(subscriber);
|
|
42
|
+
// Track capsule subscription
|
|
43
|
+
if (!this.capsuleSubscribers.has(capsuleId)) {
|
|
44
|
+
this.capsuleSubscribers.set(capsuleId, new Set());
|
|
45
|
+
}
|
|
46
|
+
this.capsuleSubscribers.get(capsuleId).add(id);
|
|
47
|
+
// Setup WebSocket message handler
|
|
48
|
+
ws.addEventListener('message', (event) => {
|
|
49
|
+
this.handleSubscriberMessage(id, event);
|
|
50
|
+
});
|
|
51
|
+
// Setup close handler
|
|
52
|
+
ws.addEventListener('close', () => {
|
|
53
|
+
this.unsubscribe(id);
|
|
54
|
+
});
|
|
55
|
+
this.emit('subscribe', { subscriberId: id, capsuleId });
|
|
56
|
+
return id;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Unsubscribe from a capsule
|
|
60
|
+
*/
|
|
61
|
+
unsubscribe(subscriberId, capsuleId) {
|
|
62
|
+
const subscriber = this.subscriberById.get(subscriberId);
|
|
63
|
+
if (!subscriber)
|
|
64
|
+
return;
|
|
65
|
+
const capsules = capsuleId ? [capsuleId] : Array.from(subscriber.capsuleIds);
|
|
66
|
+
for (const capsule of capsules) {
|
|
67
|
+
const capsuleSubs = this.subscribers.get(capsule);
|
|
68
|
+
if (capsuleSubs) {
|
|
69
|
+
capsuleSubs.delete(subscriber);
|
|
70
|
+
if (capsuleSubs.size === 0) {
|
|
71
|
+
this.subscribers.delete(capsule);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const capSubs = this.capsuleSubscribers.get(capsule);
|
|
75
|
+
if (capSubs) {
|
|
76
|
+
capSubs.delete(subscriberId);
|
|
77
|
+
if (capSubs.size === 0) {
|
|
78
|
+
this.capsuleSubscribers.delete(capsule);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (!capsuleId) {
|
|
83
|
+
this.subscriberById.delete(subscriberId);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
subscriber.capsuleIds.delete(capsuleId);
|
|
87
|
+
if (subscriber.capsuleIds.size === 0) {
|
|
88
|
+
this.subscriberById.delete(subscriberId);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
this.emit('unsubscribe', { subscriberId, capsuleId });
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Broadcast event to all capsule subscribers
|
|
95
|
+
*/
|
|
96
|
+
broadcast(capsuleId, event) {
|
|
97
|
+
const capsuleSubs = this.subscribers.get(capsuleId);
|
|
98
|
+
if (!capsuleSubs || capsuleSubs.size === 0)
|
|
99
|
+
return;
|
|
100
|
+
const message = JSON.stringify({
|
|
101
|
+
type: 'capsule-event',
|
|
102
|
+
event,
|
|
103
|
+
});
|
|
104
|
+
const failed = [];
|
|
105
|
+
capsuleSubs.forEach(subscriber => {
|
|
106
|
+
try {
|
|
107
|
+
if (subscriber.ws.readyState === WebSocket.OPEN) {
|
|
108
|
+
subscriber.ws.send(message);
|
|
109
|
+
subscriber.lastActivity = new Date();
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
failed.push(subscriber.id);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
console.error('Failed to send to subscriber:', error);
|
|
117
|
+
failed.push(subscriber.id);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
// Remove failed subscribers
|
|
121
|
+
failed.forEach(id => this.unsubscribe(id, capsuleId));
|
|
122
|
+
this.emit('broadcast', { capsuleId, event, subscriberCount: capsuleSubs.size - failed.length });
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Broadcast to all capsules
|
|
126
|
+
*/
|
|
127
|
+
broadcastAll(event) {
|
|
128
|
+
const capsuleIds = Array.from(this.subscribers.keys());
|
|
129
|
+
for (const capsuleId of capsuleIds) {
|
|
130
|
+
this.broadcast(capsuleId, {
|
|
131
|
+
...event,
|
|
132
|
+
capsuleId,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Send event to specific subscriber
|
|
138
|
+
*/
|
|
139
|
+
sendToSubscriber(subscriberId, event) {
|
|
140
|
+
const subscriber = this.subscriberById.get(subscriberId);
|
|
141
|
+
if (!subscriber)
|
|
142
|
+
return false;
|
|
143
|
+
try {
|
|
144
|
+
if (subscriber.ws.readyState === WebSocket.OPEN) {
|
|
145
|
+
subscriber.ws.send(JSON.stringify({
|
|
146
|
+
type: 'capsule-event',
|
|
147
|
+
event,
|
|
148
|
+
}));
|
|
149
|
+
subscriber.lastActivity = new Date();
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
console.error('Failed to send to subscriber:', error);
|
|
155
|
+
}
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Get subscribers for a capsule
|
|
160
|
+
*/
|
|
161
|
+
getCapsuleSubscribers(capsuleId) {
|
|
162
|
+
const subs = this.subscribers.get(capsuleId);
|
|
163
|
+
return subs ? Array.from(subs) : [];
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Get subscriber count for a capsule
|
|
167
|
+
*/
|
|
168
|
+
getSubscriberCount(capsuleId) {
|
|
169
|
+
return this.subscribers.get(capsuleId)?.size || 0;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Get all capsules
|
|
173
|
+
*/
|
|
174
|
+
getAllCapsules() {
|
|
175
|
+
return Array.from(this.subscribers.keys());
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Get subscriber by ID
|
|
179
|
+
*/
|
|
180
|
+
getSubscriber(subscriberId) {
|
|
181
|
+
return this.subscriberById.get(subscriberId);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Get all subscribers
|
|
185
|
+
*/
|
|
186
|
+
getAllSubscribers() {
|
|
187
|
+
return Array.from(this.subscriberById.values());
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Get capsules for a subscriber
|
|
191
|
+
*/
|
|
192
|
+
getSubscriberCapsules(subscriberId) {
|
|
193
|
+
const subscriber = this.subscriberById.get(subscriberId);
|
|
194
|
+
return subscriber ? Array.from(subscriber.capsuleIds) : [];
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Handle message from subscriber
|
|
198
|
+
*/
|
|
199
|
+
handleSubscriberMessage(subscriberId, event) {
|
|
200
|
+
const subscriber = this.subscriberById.get(subscriberId);
|
|
201
|
+
if (!subscriber)
|
|
202
|
+
return;
|
|
203
|
+
subscriber.lastActivity = new Date();
|
|
204
|
+
try {
|
|
205
|
+
const data = JSON.parse(event.data);
|
|
206
|
+
this.emit('message', {
|
|
207
|
+
subscriberId,
|
|
208
|
+
data,
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
console.error('Failed to parse subscriber message:', error);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Generate unique subscriber ID
|
|
217
|
+
*/
|
|
218
|
+
generateSubscriberId() {
|
|
219
|
+
return `sub_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Get registry statistics
|
|
223
|
+
*/
|
|
224
|
+
getStats() {
|
|
225
|
+
const capsules = new Map();
|
|
226
|
+
this.subscribers.forEach((subs, id) => {
|
|
227
|
+
capsules.set(id, subs.size);
|
|
228
|
+
});
|
|
229
|
+
return {
|
|
230
|
+
totalSubscribers: this.subscriberById.size,
|
|
231
|
+
totalCapsules: this.subscribers.size,
|
|
232
|
+
capsules,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Clean up inactive subscribers
|
|
237
|
+
*/
|
|
238
|
+
cleanupInactive(timeoutMs = 60000) {
|
|
239
|
+
const now = Date.now();
|
|
240
|
+
let cleaned = 0;
|
|
241
|
+
this.subscriberById.forEach((subscriber, id) => {
|
|
242
|
+
const inactiveTime = now - subscriber.lastActivity.getTime();
|
|
243
|
+
if (inactiveTime > timeoutMs) {
|
|
244
|
+
this.unsubscribe(id);
|
|
245
|
+
cleaned++;
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
return cleaned;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Destroy registry
|
|
252
|
+
*/
|
|
253
|
+
destroy() {
|
|
254
|
+
this.subscribers.forEach((subs) => {
|
|
255
|
+
subs.forEach(sub => {
|
|
256
|
+
sub.ws.close();
|
|
257
|
+
});
|
|
258
|
+
});
|
|
259
|
+
this.subscribers.clear();
|
|
260
|
+
this.subscriberById.clear();
|
|
261
|
+
this.capsuleSubscribers.clear();
|
|
262
|
+
this.removeAllListeners();
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Create capsule registry
|
|
267
|
+
*/
|
|
268
|
+
export function createCapsuleRegistry() {
|
|
269
|
+
return new CapsuleRegistry();
|
|
270
|
+
}
|
|
271
|
+
//# sourceMappingURL=capsule-registry.js.map
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
// OWNER: T2-A5
|
|
2
|
+
/**
|
|
3
|
+
* Capsule Registry - GAP-69, 70, 71
|
|
4
|
+
*
|
|
5
|
+
* Track subscribers and broadcast capsule events
|
|
6
|
+
*/
|
|
7
|
+
import { EventEmitter } from 'events';
|
|
8
|
+
/**
|
|
9
|
+
* Capsule Registry - GAP-69, 70, 71
|
|
10
|
+
*
|
|
11
|
+
* Track subscribers and broadcast events
|
|
12
|
+
*/
|
|
13
|
+
export class CapsuleRegistry extends EventEmitter {
|
|
14
|
+
subscribers;
|
|
15
|
+
subscriberById;
|
|
16
|
+
capsuleSubscribers;
|
|
17
|
+
constructor() {
|
|
18
|
+
super();
|
|
19
|
+
this.subscribers = new Map();
|
|
20
|
+
this.subscriberById = new Map();
|
|
21
|
+
this.capsuleSubscribers = new Map();
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Subscribe to a capsule
|
|
25
|
+
*/
|
|
26
|
+
subscribe(capsuleId, ws, subscriberId) {
|
|
27
|
+
const id = subscriberId || this.generateSubscriberId();
|
|
28
|
+
const subscriber = {
|
|
29
|
+
id,
|
|
30
|
+
ws,
|
|
31
|
+
capsuleIds: new Set([capsuleId]),
|
|
32
|
+
connectedAt: new Date(),
|
|
33
|
+
lastActivity: new Date(),
|
|
34
|
+
};
|
|
35
|
+
// Add to subscriber map
|
|
36
|
+
this.subscriberById.set(id, subscriber);
|
|
37
|
+
// Add to capsule subscribers
|
|
38
|
+
if (!this.subscribers.has(capsuleId)) {
|
|
39
|
+
this.subscribers.set(capsuleId, new Set());
|
|
40
|
+
}
|
|
41
|
+
this.subscribers.get(capsuleId).add(subscriber);
|
|
42
|
+
// Track capsule subscription
|
|
43
|
+
if (!this.capsuleSubscribers.has(capsuleId)) {
|
|
44
|
+
this.capsuleSubscribers.set(capsuleId, new Set());
|
|
45
|
+
}
|
|
46
|
+
this.capsuleSubscribers.get(capsuleId).add(id);
|
|
47
|
+
// Setup WebSocket message handler
|
|
48
|
+
ws.addEventListener('message', (event) => {
|
|
49
|
+
this.handleSubscriberMessage(id, event);
|
|
50
|
+
});
|
|
51
|
+
// Setup close handler
|
|
52
|
+
ws.addEventListener('close', () => {
|
|
53
|
+
this.unsubscribe(id);
|
|
54
|
+
});
|
|
55
|
+
this.emit('subscribe', { subscriberId: id, capsuleId });
|
|
56
|
+
return id;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Unsubscribe from a capsule
|
|
60
|
+
*/
|
|
61
|
+
unsubscribe(subscriberId, capsuleId) {
|
|
62
|
+
const subscriber = this.subscriberById.get(subscriberId);
|
|
63
|
+
if (!subscriber)
|
|
64
|
+
return;
|
|
65
|
+
const capsules = capsuleId ? [capsuleId] : Array.from(subscriber.capsuleIds);
|
|
66
|
+
for (const capsule of capsules) {
|
|
67
|
+
const capsuleSubs = this.subscribers.get(capsule);
|
|
68
|
+
if (capsuleSubs) {
|
|
69
|
+
capsuleSubs.delete(subscriber);
|
|
70
|
+
if (capsuleSubs.size === 0) {
|
|
71
|
+
this.subscribers.delete(capsule);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const capSubs = this.capsuleSubscribers.get(capsule);
|
|
75
|
+
if (capSubs) {
|
|
76
|
+
capSubs.delete(subscriberId);
|
|
77
|
+
if (capSubs.size === 0) {
|
|
78
|
+
this.capsuleSubscribers.delete(capsule);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (!capsuleId) {
|
|
83
|
+
this.subscriberById.delete(subscriberId);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
subscriber.capsuleIds.delete(capsuleId);
|
|
87
|
+
if (subscriber.capsuleIds.size === 0) {
|
|
88
|
+
this.subscriberById.delete(subscriberId);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
this.emit('unsubscribe', { subscriberId, capsuleId });
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Broadcast event to all capsule subscribers
|
|
95
|
+
*/
|
|
96
|
+
broadcast(capsuleId, event) {
|
|
97
|
+
const capsuleSubs = this.subscribers.get(capsuleId);
|
|
98
|
+
if (!capsuleSubs || capsuleSubs.size === 0)
|
|
99
|
+
return;
|
|
100
|
+
const message = JSON.stringify({
|
|
101
|
+
type: 'capsule-event',
|
|
102
|
+
event,
|
|
103
|
+
});
|
|
104
|
+
const failed = [];
|
|
105
|
+
capsuleSubs.forEach(subscriber => {
|
|
106
|
+
try {
|
|
107
|
+
if (subscriber.ws.readyState === WebSocket.OPEN) {
|
|
108
|
+
subscriber.ws.send(message);
|
|
109
|
+
subscriber.lastActivity = new Date();
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
failed.push(subscriber.id);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
console.error('Failed to send to subscriber:', error);
|
|
117
|
+
failed.push(subscriber.id);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
// Remove failed subscribers
|
|
121
|
+
failed.forEach(id => this.unsubscribe(id, capsuleId));
|
|
122
|
+
this.emit('broadcast', { capsuleId, event, subscriberCount: capsuleSubs.size - failed.length });
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Broadcast to all capsules
|
|
126
|
+
*/
|
|
127
|
+
broadcastAll(event) {
|
|
128
|
+
const capsuleIds = Array.from(this.subscribers.keys());
|
|
129
|
+
for (const capsuleId of capsuleIds) {
|
|
130
|
+
this.broadcast(capsuleId, {
|
|
131
|
+
...event,
|
|
132
|
+
capsuleId,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Send event to specific subscriber
|
|
138
|
+
*/
|
|
139
|
+
sendToSubscriber(subscriberId, event) {
|
|
140
|
+
const subscriber = this.subscriberById.get(subscriberId);
|
|
141
|
+
if (!subscriber)
|
|
142
|
+
return false;
|
|
143
|
+
try {
|
|
144
|
+
if (subscriber.ws.readyState === WebSocket.OPEN) {
|
|
145
|
+
subscriber.ws.send(JSON.stringify({
|
|
146
|
+
type: 'capsule-event',
|
|
147
|
+
event,
|
|
148
|
+
}));
|
|
149
|
+
subscriber.lastActivity = new Date();
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
console.error('Failed to send to subscriber:', error);
|
|
155
|
+
}
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Get subscribers for a capsule
|
|
160
|
+
*/
|
|
161
|
+
getCapsuleSubscribers(capsuleId) {
|
|
162
|
+
const subs = this.subscribers.get(capsuleId);
|
|
163
|
+
return subs ? Array.from(subs) : [];
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Get subscriber count for a capsule
|
|
167
|
+
*/
|
|
168
|
+
getSubscriberCount(capsuleId) {
|
|
169
|
+
return this.subscribers.get(capsuleId)?.size || 0;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Get all capsules
|
|
173
|
+
*/
|
|
174
|
+
getAllCapsules() {
|
|
175
|
+
return Array.from(this.subscribers.keys());
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Get subscriber by ID
|
|
179
|
+
*/
|
|
180
|
+
getSubscriber(subscriberId) {
|
|
181
|
+
return this.subscriberById.get(subscriberId);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Get all subscribers
|
|
185
|
+
*/
|
|
186
|
+
getAllSubscribers() {
|
|
187
|
+
return Array.from(this.subscriberById.values());
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Get capsules for a subscriber
|
|
191
|
+
*/
|
|
192
|
+
getSubscriberCapsules(subscriberId) {
|
|
193
|
+
const subscriber = this.subscriberById.get(subscriberId);
|
|
194
|
+
return subscriber ? Array.from(subscriber.capsuleIds) : [];
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Handle message from subscriber
|
|
198
|
+
*/
|
|
199
|
+
handleSubscriberMessage(subscriberId, event) {
|
|
200
|
+
const subscriber = this.subscriberById.get(subscriberId);
|
|
201
|
+
if (!subscriber)
|
|
202
|
+
return;
|
|
203
|
+
subscriber.lastActivity = new Date();
|
|
204
|
+
try {
|
|
205
|
+
const data = JSON.parse(event.data);
|
|
206
|
+
this.emit('message', {
|
|
207
|
+
subscriberId,
|
|
208
|
+
data,
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
console.error('Failed to parse subscriber message:', error);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Generate unique subscriber ID
|
|
217
|
+
*/
|
|
218
|
+
generateSubscriberId() {
|
|
219
|
+
return `sub_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Get registry statistics
|
|
223
|
+
*/
|
|
224
|
+
getStats() {
|
|
225
|
+
const capsules = new Map();
|
|
226
|
+
this.subscribers.forEach((subs, id) => {
|
|
227
|
+
capsules.set(id, subs.size);
|
|
228
|
+
});
|
|
229
|
+
return {
|
|
230
|
+
totalSubscribers: this.subscriberById.size,
|
|
231
|
+
totalCapsules: this.subscribers.size,
|
|
232
|
+
capsules,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Clean up inactive subscribers
|
|
237
|
+
*/
|
|
238
|
+
cleanupInactive(timeoutMs = 60000) {
|
|
239
|
+
const now = Date.now();
|
|
240
|
+
let cleaned = 0;
|
|
241
|
+
this.subscriberById.forEach((subscriber, id) => {
|
|
242
|
+
const inactiveTime = now - subscriber.lastActivity.getTime();
|
|
243
|
+
if (inactiveTime > timeoutMs) {
|
|
244
|
+
this.unsubscribe(id);
|
|
245
|
+
cleaned++;
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
return cleaned;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Destroy registry
|
|
252
|
+
*/
|
|
253
|
+
destroy() {
|
|
254
|
+
this.subscribers.forEach((subs) => {
|
|
255
|
+
subs.forEach(sub => {
|
|
256
|
+
sub.ws.close();
|
|
257
|
+
});
|
|
258
|
+
});
|
|
259
|
+
this.subscribers.clear();
|
|
260
|
+
this.subscriberById.clear();
|
|
261
|
+
this.capsuleSubscribers.clear();
|
|
262
|
+
this.removeAllListeners();
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Create capsule registry
|
|
267
|
+
*/
|
|
268
|
+
export function createCapsuleRegistry() {
|
|
269
|
+
return new CapsuleRegistry();
|
|
270
|
+
}
|
|
271
|
+
//# sourceMappingURL=capsule-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capsule-registry.js","sourceRoot":"","sources":["../../src/collab/capsule-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Real-time Collaboration
|
|
3
|
+
*
|
|
4
|
+
* Yjs/CRDT integration for collaborative UI editing.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* import { YjsClient, AwarenessManager, CapsuleRegistry } from '@allternit/ix/collab';
|
|
9
|
+
*
|
|
10
|
+
* const client = new YjsClient('room-123', config);
|
|
11
|
+
* const text = client.getText('document');
|
|
12
|
+
* text.insert(0, 'Hello collaborative world!');
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export { type YjsConfig, type CollaborationSession, type Participant, type CursorPosition, type Range, type UserState, type AwarenessChanges, type DocType, type OperationType, type DocChangeEvent, type SyncState, type CursorStyle, type CollabConfig, defaultCollabConfig, } from './yjs-types';
|
|
16
|
+
export { YjsClient, createYjsClient, defaultConfig, } from './yjs-client';
|
|
17
|
+
export { BroadcastProtocol, SyncProtocol, AwarenessManager, createAwarenessManager, } from './yjs-protocols';
|
|
18
|
+
export { CapsuleRegistry, createCapsuleRegistry, type CapsuleEvent, type CapsuleSubscriber, } from './capsule-registry';
|
|
19
|
+
export { createYjsAdapter, createCollaborativeStore, type YjsAdapter, type YjsAdapterConfig, type AwarenessState, } from './yjs-adapter';
|
|
20
|
+
export { createVisualEditor, ui, type VisualEditor, type UIRootBuilder, type UIComponentBuilder, } from './visual-editor';
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Real-time Collaboration
|
|
3
|
+
*
|
|
4
|
+
* Yjs/CRDT integration for collaborative UI editing.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* import { YjsClient, AwarenessManager, CapsuleRegistry } from '@allternit/ix/collab';
|
|
9
|
+
*
|
|
10
|
+
* const client = new YjsClient('room-123', config);
|
|
11
|
+
* const text = client.getText('document');
|
|
12
|
+
* text.insert(0, 'Hello collaborative world!');
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export { type YjsConfig, type CollaborationSession, type Participant, type CursorPosition, type Range, type UserState, type AwarenessChanges, type DocType, type OperationType, type DocChangeEvent, type SyncState, type CursorStyle, type CollabConfig, defaultCollabConfig, } from './yjs-types';
|
|
16
|
+
export { YjsClient, createYjsClient, defaultConfig, } from './yjs-client';
|
|
17
|
+
export { BroadcastProtocol, SyncProtocol, AwarenessManager, createAwarenessManager, } from './yjs-protocols';
|
|
18
|
+
export { CapsuleRegistry, createCapsuleRegistry, type CapsuleEvent, type CapsuleSubscriber, } from './capsule-registry';
|
|
19
|
+
export { createYjsAdapter, createCollaborativeStore, type YjsAdapter, type YjsAdapterConfig, type AwarenessState, } from './yjs-adapter';
|
|
20
|
+
export { createVisualEditor, ui, type VisualEditor, type UIRootBuilder, type UIComponentBuilder, } from './visual-editor';
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/collab/index.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,oBAAoB,EACzB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,KAAK,EACV,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,KAAK,OAAO,EACZ,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,mBAAmB,GACpB,MAAM,aAAa,CAAC;AAErB,OAAO,EAEL,SAAS,EACT,eAAe,EACf,aAAa,GACd,MAAM,cAAc,CAAC;AAEtB,OAAO,EAEL,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAEL,eAAe,EACf,qBAAqB,EACrB,KAAK,YAAY,EACjB,KAAK,iBAAiB,GACvB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAEL,gBAAgB,EAChB,wBAAwB,EACxB,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,cAAc,GACpB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAEL,kBAAkB,EAClB,EAAE,EACF,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,kBAAkB,GACxB,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// OWNER: T2-A4
|
|
2
|
+
/**
|
|
3
|
+
* Real-time Collaboration
|
|
4
|
+
*
|
|
5
|
+
* Yjs/CRDT integration for collaborative UI editing.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { YjsClient, AwarenessManager, CapsuleRegistry } from '@allternit/ix/collab';
|
|
10
|
+
*
|
|
11
|
+
* const client = new YjsClient('room-123', config);
|
|
12
|
+
* const text = client.getText('document');
|
|
13
|
+
* text.insert(0, 'Hello collaborative world!');
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export { defaultCollabConfig, } from './yjs-types';
|
|
17
|
+
export {
|
|
18
|
+
// YJS Client
|
|
19
|
+
YjsClient, createYjsClient, defaultConfig, } from './yjs-client';
|
|
20
|
+
export {
|
|
21
|
+
// YJS Protocols
|
|
22
|
+
BroadcastProtocol, SyncProtocol, AwarenessManager, createAwarenessManager, } from './yjs-protocols';
|
|
23
|
+
export {
|
|
24
|
+
// Capsule Registry
|
|
25
|
+
CapsuleRegistry, createCapsuleRegistry, } from './capsule-registry';
|
|
26
|
+
export {
|
|
27
|
+
// YJS Adapter
|
|
28
|
+
createYjsAdapter, createCollaborativeStore, } from './yjs-adapter';
|
|
29
|
+
export {
|
|
30
|
+
// Visual Editor
|
|
31
|
+
createVisualEditor, ui, } from './visual-editor';
|
|
32
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// OWNER: T2-A4
|
|
2
|
+
/**
|
|
3
|
+
* Real-time Collaboration
|
|
4
|
+
*
|
|
5
|
+
* Yjs/CRDT integration for collaborative UI editing.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { YjsClient, AwarenessManager, CapsuleRegistry } from '@allternit/ix/collab';
|
|
10
|
+
*
|
|
11
|
+
* const client = new YjsClient('room-123', config);
|
|
12
|
+
* const text = client.getText('document');
|
|
13
|
+
* text.insert(0, 'Hello collaborative world!');
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export { defaultCollabConfig, } from './yjs-types';
|
|
17
|
+
export {
|
|
18
|
+
// YJS Client
|
|
19
|
+
YjsClient, createYjsClient, defaultConfig, } from './yjs-client';
|
|
20
|
+
export {
|
|
21
|
+
// YJS Protocols
|
|
22
|
+
BroadcastProtocol, SyncProtocol, AwarenessManager, createAwarenessManager, } from './yjs-protocols';
|
|
23
|
+
export {
|
|
24
|
+
// Capsule Registry
|
|
25
|
+
CapsuleRegistry, createCapsuleRegistry, } from './capsule-registry';
|
|
26
|
+
export {
|
|
27
|
+
// YJS Adapter
|
|
28
|
+
createYjsAdapter, createCollaborativeStore, } from './yjs-adapter';
|
|
29
|
+
export {
|
|
30
|
+
// Visual Editor
|
|
31
|
+
createVisualEditor, ui, } from './visual-editor';
|
|
32
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/collab/index.ts"],"names":[],"mappings":"AAAA,eAAe;AAEf;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAeL,mBAAmB,GACpB,MAAM,aAAa,CAAC;AAErB,OAAO;AACL,aAAa;AACb,SAAS,EACT,eAAe,EACf,aAAa,GACd,MAAM,cAAc,CAAC;AAEtB,OAAO;AACL,gBAAgB;AAChB,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AAEzB,OAAO;AACL,mBAAmB;AACnB,eAAe,EACf,qBAAqB,GAGtB,MAAM,oBAAoB,CAAC;AAE5B,OAAO;AACL,cAAc;AACd,gBAAgB,EAChB,wBAAwB,GAIzB,MAAM,eAAe,CAAC;AAEvB,OAAO;AACL,gBAAgB;AAChB,kBAAkB,EAClB,EAAE,GAIH,MAAM,iBAAiB,CAAC"}
|