@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,282 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Yjs/CRDT Adapter for A2R-IX
|
|
3
|
+
*
|
|
4
|
+
* Real-time collaborative state synchronization using Yjs.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Create Yjs adapter for collaborative state
|
|
8
|
+
*/
|
|
9
|
+
export function createYjsAdapter(config) {
|
|
10
|
+
const { doc, provider, mapName = 'a2r-ix-state' } = config;
|
|
11
|
+
const ymap = doc.getMap(mapName);
|
|
12
|
+
// Local state store wrapper
|
|
13
|
+
let localState = {};
|
|
14
|
+
const subscribers = new Map();
|
|
15
|
+
const syncStatusSubscribers = new Set();
|
|
16
|
+
const awarenessSubscribers = new Set();
|
|
17
|
+
let syncStatus = 'syncing';
|
|
18
|
+
const awarenessMap = new Map();
|
|
19
|
+
const clientId = 0;
|
|
20
|
+
/**
|
|
21
|
+
* Initialize from Yjs map
|
|
22
|
+
*/
|
|
23
|
+
function initialize() {
|
|
24
|
+
// Load initial state
|
|
25
|
+
localState = { ...ymap.toJSON() };
|
|
26
|
+
// Observe Yjs changes
|
|
27
|
+
ymap.observe((event) => {
|
|
28
|
+
doc.transact(() => {
|
|
29
|
+
event.changes.keys.forEach((change, key) => {
|
|
30
|
+
const newValue = ymap.get(key);
|
|
31
|
+
if (change.action === 'delete') {
|
|
32
|
+
delete localState[key];
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
localState[key] = newValue;
|
|
36
|
+
}
|
|
37
|
+
// Notify local subscribers
|
|
38
|
+
notifySubscribers(key, newValue);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
// Set up provider sync status
|
|
43
|
+
if (provider) {
|
|
44
|
+
provider.on('sync', () => {
|
|
45
|
+
updateSyncStatus('synced');
|
|
46
|
+
});
|
|
47
|
+
provider.on('disconnect', () => {
|
|
48
|
+
updateSyncStatus('disconnected');
|
|
49
|
+
});
|
|
50
|
+
provider.on('connect', () => {
|
|
51
|
+
updateSyncStatus('syncing');
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Update sync status
|
|
57
|
+
*/
|
|
58
|
+
function updateSyncStatus(status) {
|
|
59
|
+
syncStatus = status;
|
|
60
|
+
syncStatusSubscribers.forEach((cb) => cb(status));
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Notify subscribers
|
|
64
|
+
*/
|
|
65
|
+
function notifySubscribers(path, value) {
|
|
66
|
+
const pathSubscribers = subscribers.get(path);
|
|
67
|
+
if (pathSubscribers) {
|
|
68
|
+
pathSubscribers.forEach((cb) => cb(value));
|
|
69
|
+
}
|
|
70
|
+
// Notify parent path subscribers
|
|
71
|
+
const parts = path.split('.');
|
|
72
|
+
while (parts.length > 1) {
|
|
73
|
+
parts.pop();
|
|
74
|
+
const parentPath = parts.join('.');
|
|
75
|
+
const parentSubscribers = subscribers.get(parentPath);
|
|
76
|
+
if (parentSubscribers) {
|
|
77
|
+
const parentValue = getValue(parentPath);
|
|
78
|
+
parentSubscribers.forEach((cb) => cb(parentValue));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Get value at path
|
|
84
|
+
*/
|
|
85
|
+
function getValue(path) {
|
|
86
|
+
const parts = path.split('.');
|
|
87
|
+
let current = localState;
|
|
88
|
+
for (const part of parts) {
|
|
89
|
+
if (current && typeof current === 'object') {
|
|
90
|
+
current = current[part];
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
return undefined;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return current;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Set value at path
|
|
100
|
+
*/
|
|
101
|
+
function setValue(path, value) {
|
|
102
|
+
const parts = path.split('.');
|
|
103
|
+
doc.transact(() => {
|
|
104
|
+
if (parts.length === 1) {
|
|
105
|
+
if (value === undefined) {
|
|
106
|
+
ymap.delete(path);
|
|
107
|
+
delete localState[path];
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
ymap.set(path, value);
|
|
111
|
+
localState[path] = value;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
// Handle nested paths
|
|
116
|
+
const rootKey = parts[0];
|
|
117
|
+
let root = ymap.get(rootKey) || {};
|
|
118
|
+
// Clone to avoid modifying shared Yjs object directly
|
|
119
|
+
root = { ...root };
|
|
120
|
+
let current = root;
|
|
121
|
+
for (let i = 1; i < parts.length - 1; i++) {
|
|
122
|
+
const part = parts[i];
|
|
123
|
+
if (!current[part] || typeof current[part] !== 'object') {
|
|
124
|
+
current[part] = {};
|
|
125
|
+
}
|
|
126
|
+
current = current[part];
|
|
127
|
+
}
|
|
128
|
+
if (value === undefined) {
|
|
129
|
+
delete current[parts[parts.length - 1]];
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
current[parts[parts.length - 1]] = value;
|
|
133
|
+
}
|
|
134
|
+
ymap.set(rootKey, root);
|
|
135
|
+
localState[rootKey] = root;
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
notifySubscribers(path, value);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Apply JSON Patch
|
|
142
|
+
*/
|
|
143
|
+
function applyPatch(patch) {
|
|
144
|
+
doc.transact(() => {
|
|
145
|
+
patch.forEach((op) => {
|
|
146
|
+
const path = op.path.slice(1).replace(/\//g, '.');
|
|
147
|
+
switch (op.op) {
|
|
148
|
+
case 'add':
|
|
149
|
+
case 'replace':
|
|
150
|
+
setValue(path, op.value);
|
|
151
|
+
break;
|
|
152
|
+
case 'remove':
|
|
153
|
+
setValue(path, undefined);
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Create state store interface
|
|
161
|
+
*/
|
|
162
|
+
function getStore() {
|
|
163
|
+
return {
|
|
164
|
+
get: (path) => getValue(path),
|
|
165
|
+
set: (path, value) => setValue(path, value),
|
|
166
|
+
subscribe: (path, callback) => {
|
|
167
|
+
if (!subscribers.has(path)) {
|
|
168
|
+
subscribers.set(path, new Set());
|
|
169
|
+
}
|
|
170
|
+
subscribers.get(path).add(callback);
|
|
171
|
+
return () => {
|
|
172
|
+
subscribers.get(path)?.delete(callback);
|
|
173
|
+
};
|
|
174
|
+
},
|
|
175
|
+
batch: (updates) => {
|
|
176
|
+
doc.transact(() => {
|
|
177
|
+
Object.entries(updates).forEach(([path, value]) => {
|
|
178
|
+
setValue(path, value);
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
},
|
|
182
|
+
snapshot: () => ({ ...localState }),
|
|
183
|
+
restore: (snapshot) => {
|
|
184
|
+
doc.transact(() => {
|
|
185
|
+
Object.entries(snapshot).forEach(([key, value]) => {
|
|
186
|
+
ymap.set(key, value);
|
|
187
|
+
localState[key] = value;
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
},
|
|
191
|
+
reset: () => {
|
|
192
|
+
doc.transact(() => {
|
|
193
|
+
Object.keys(ymap.toJSON()).forEach((key) => {
|
|
194
|
+
ymap.delete(key);
|
|
195
|
+
});
|
|
196
|
+
localState = {};
|
|
197
|
+
});
|
|
198
|
+
},
|
|
199
|
+
compute: () => { },
|
|
200
|
+
bind: () => { },
|
|
201
|
+
getBindings: () => [],
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Get awareness state
|
|
206
|
+
*/
|
|
207
|
+
function getAwareness() {
|
|
208
|
+
return new Map(awarenessMap);
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Set awareness state
|
|
212
|
+
*/
|
|
213
|
+
function setAwareness(state) {
|
|
214
|
+
const current = awarenessMap.get(clientId) || {};
|
|
215
|
+
awarenessMap.set(clientId, { ...current, ...state });
|
|
216
|
+
// Broadcast to others (would use y-protocols in production)
|
|
217
|
+
awarenessSubscribers.forEach((cb) => cb(new Map(awarenessMap)));
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Subscribe to awareness changes
|
|
221
|
+
*/
|
|
222
|
+
function subscribeAwareness(callback) {
|
|
223
|
+
awarenessSubscribers.add(callback);
|
|
224
|
+
return () => awarenessSubscribers.delete(callback);
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Get sync status
|
|
228
|
+
*/
|
|
229
|
+
function getSyncStatus() {
|
|
230
|
+
return syncStatus;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Subscribe to sync status
|
|
234
|
+
*/
|
|
235
|
+
function subscribeSyncStatus(callback) {
|
|
236
|
+
syncStatusSubscribers.add(callback);
|
|
237
|
+
return () => syncStatusSubscribers.delete(callback);
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Destroy adapter
|
|
241
|
+
*/
|
|
242
|
+
function destroy() {
|
|
243
|
+
subscribers.clear();
|
|
244
|
+
syncStatusSubscribers.clear();
|
|
245
|
+
awarenessSubscribers.clear();
|
|
246
|
+
if (provider) {
|
|
247
|
+
provider.destroy();
|
|
248
|
+
}
|
|
249
|
+
// Clear all keys from ymap
|
|
250
|
+
const keys = Object.keys(ymap.toJSON());
|
|
251
|
+
keys.forEach((key) => ymap.delete(key));
|
|
252
|
+
}
|
|
253
|
+
// Initialize
|
|
254
|
+
initialize();
|
|
255
|
+
// Set initial user awareness
|
|
256
|
+
if (config.userId) {
|
|
257
|
+
setAwareness({
|
|
258
|
+
user: {
|
|
259
|
+
id: config.userId,
|
|
260
|
+
...config.userInfo,
|
|
261
|
+
},
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
return {
|
|
265
|
+
getStore,
|
|
266
|
+
applyPatch,
|
|
267
|
+
getAwareness,
|
|
268
|
+
setAwareness,
|
|
269
|
+
subscribeAwareness,
|
|
270
|
+
getSyncStatus,
|
|
271
|
+
subscribeSyncStatus,
|
|
272
|
+
destroy,
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Create collaborative state store
|
|
277
|
+
*/
|
|
278
|
+
export function createCollaborativeStore(yjsConfig, localConfig = {}) {
|
|
279
|
+
const adapter = createYjsAdapter(yjsConfig);
|
|
280
|
+
return adapter.getStore();
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=yjs-adapter.js.map
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Yjs/CRDT Adapter for A2R-IX
|
|
3
|
+
*
|
|
4
|
+
* Real-time collaborative state synchronization using Yjs.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Create Yjs adapter for collaborative state
|
|
8
|
+
*/
|
|
9
|
+
export function createYjsAdapter(config) {
|
|
10
|
+
const { doc, provider, mapName = 'a2r-ix-state' } = config;
|
|
11
|
+
const ymap = doc.getMap(mapName);
|
|
12
|
+
// Local state store wrapper
|
|
13
|
+
let localState = {};
|
|
14
|
+
const subscribers = new Map();
|
|
15
|
+
const syncStatusSubscribers = new Set();
|
|
16
|
+
const awarenessSubscribers = new Set();
|
|
17
|
+
let syncStatus = 'syncing';
|
|
18
|
+
const awarenessMap = new Map();
|
|
19
|
+
const clientId = 0;
|
|
20
|
+
/**
|
|
21
|
+
* Initialize from Yjs map
|
|
22
|
+
*/
|
|
23
|
+
function initialize() {
|
|
24
|
+
// Load initial state
|
|
25
|
+
localState = { ...ymap.toJSON() };
|
|
26
|
+
// Observe Yjs changes
|
|
27
|
+
ymap.observe((event) => {
|
|
28
|
+
doc.transact(() => {
|
|
29
|
+
event.changes.keys.forEach((change, key) => {
|
|
30
|
+
const newValue = ymap.get(key);
|
|
31
|
+
if (change.action === 'delete') {
|
|
32
|
+
delete localState[key];
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
localState[key] = newValue;
|
|
36
|
+
}
|
|
37
|
+
// Notify local subscribers
|
|
38
|
+
notifySubscribers(key, newValue);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
// Set up provider sync status
|
|
43
|
+
if (provider) {
|
|
44
|
+
provider.on('sync', () => {
|
|
45
|
+
updateSyncStatus('synced');
|
|
46
|
+
});
|
|
47
|
+
provider.on('disconnect', () => {
|
|
48
|
+
updateSyncStatus('disconnected');
|
|
49
|
+
});
|
|
50
|
+
provider.on('connect', () => {
|
|
51
|
+
updateSyncStatus('syncing');
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Update sync status
|
|
57
|
+
*/
|
|
58
|
+
function updateSyncStatus(status) {
|
|
59
|
+
syncStatus = status;
|
|
60
|
+
syncStatusSubscribers.forEach((cb) => cb(status));
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Notify subscribers
|
|
64
|
+
*/
|
|
65
|
+
function notifySubscribers(path, value) {
|
|
66
|
+
const pathSubscribers = subscribers.get(path);
|
|
67
|
+
if (pathSubscribers) {
|
|
68
|
+
pathSubscribers.forEach((cb) => cb(value));
|
|
69
|
+
}
|
|
70
|
+
// Notify parent path subscribers
|
|
71
|
+
const parts = path.split('.');
|
|
72
|
+
while (parts.length > 1) {
|
|
73
|
+
parts.pop();
|
|
74
|
+
const parentPath = parts.join('.');
|
|
75
|
+
const parentSubscribers = subscribers.get(parentPath);
|
|
76
|
+
if (parentSubscribers) {
|
|
77
|
+
const parentValue = getValue(parentPath);
|
|
78
|
+
parentSubscribers.forEach((cb) => cb(parentValue));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Get value at path
|
|
84
|
+
*/
|
|
85
|
+
function getValue(path) {
|
|
86
|
+
const parts = path.split('.');
|
|
87
|
+
let current = localState;
|
|
88
|
+
for (const part of parts) {
|
|
89
|
+
if (current && typeof current === 'object') {
|
|
90
|
+
current = current[part];
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
return undefined;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return current;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Set value at path
|
|
100
|
+
*/
|
|
101
|
+
function setValue(path, value) {
|
|
102
|
+
const parts = path.split('.');
|
|
103
|
+
doc.transact(() => {
|
|
104
|
+
if (parts.length === 1) {
|
|
105
|
+
if (value === undefined) {
|
|
106
|
+
ymap.delete(path);
|
|
107
|
+
delete localState[path];
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
ymap.set(path, value);
|
|
111
|
+
localState[path] = value;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
// Handle nested paths
|
|
116
|
+
const rootKey = parts[0];
|
|
117
|
+
let root = ymap.get(rootKey) || {};
|
|
118
|
+
// Clone to avoid modifying shared Yjs object directly
|
|
119
|
+
root = { ...root };
|
|
120
|
+
let current = root;
|
|
121
|
+
for (let i = 1; i < parts.length - 1; i++) {
|
|
122
|
+
const part = parts[i];
|
|
123
|
+
if (!current[part] || typeof current[part] !== 'object') {
|
|
124
|
+
current[part] = {};
|
|
125
|
+
}
|
|
126
|
+
current = current[part];
|
|
127
|
+
}
|
|
128
|
+
if (value === undefined) {
|
|
129
|
+
delete current[parts[parts.length - 1]];
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
current[parts[parts.length - 1]] = value;
|
|
133
|
+
}
|
|
134
|
+
ymap.set(rootKey, root);
|
|
135
|
+
localState[rootKey] = root;
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
notifySubscribers(path, value);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Apply JSON Patch
|
|
142
|
+
*/
|
|
143
|
+
function applyPatch(patch) {
|
|
144
|
+
doc.transact(() => {
|
|
145
|
+
patch.forEach((op) => {
|
|
146
|
+
const path = op.path.slice(1).replace(/\//g, '.');
|
|
147
|
+
switch (op.op) {
|
|
148
|
+
case 'add':
|
|
149
|
+
case 'replace':
|
|
150
|
+
setValue(path, op.value);
|
|
151
|
+
break;
|
|
152
|
+
case 'remove':
|
|
153
|
+
setValue(path, undefined);
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Create state store interface
|
|
161
|
+
*/
|
|
162
|
+
function getStore() {
|
|
163
|
+
return {
|
|
164
|
+
get: (path) => getValue(path),
|
|
165
|
+
set: (path, value) => setValue(path, value),
|
|
166
|
+
subscribe: (path, callback) => {
|
|
167
|
+
if (!subscribers.has(path)) {
|
|
168
|
+
subscribers.set(path, new Set());
|
|
169
|
+
}
|
|
170
|
+
subscribers.get(path).add(callback);
|
|
171
|
+
return () => {
|
|
172
|
+
subscribers.get(path)?.delete(callback);
|
|
173
|
+
};
|
|
174
|
+
},
|
|
175
|
+
batch: (updates) => {
|
|
176
|
+
doc.transact(() => {
|
|
177
|
+
Object.entries(updates).forEach(([path, value]) => {
|
|
178
|
+
setValue(path, value);
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
},
|
|
182
|
+
snapshot: () => ({ ...localState }),
|
|
183
|
+
restore: (snapshot) => {
|
|
184
|
+
doc.transact(() => {
|
|
185
|
+
Object.entries(snapshot).forEach(([key, value]) => {
|
|
186
|
+
ymap.set(key, value);
|
|
187
|
+
localState[key] = value;
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
},
|
|
191
|
+
reset: () => {
|
|
192
|
+
doc.transact(() => {
|
|
193
|
+
Object.keys(ymap.toJSON()).forEach((key) => {
|
|
194
|
+
ymap.delete(key);
|
|
195
|
+
});
|
|
196
|
+
localState = {};
|
|
197
|
+
});
|
|
198
|
+
},
|
|
199
|
+
compute: () => { },
|
|
200
|
+
bind: () => { },
|
|
201
|
+
getBindings: () => [],
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Get awareness state
|
|
206
|
+
*/
|
|
207
|
+
function getAwareness() {
|
|
208
|
+
return new Map(awarenessMap);
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Set awareness state
|
|
212
|
+
*/
|
|
213
|
+
function setAwareness(state) {
|
|
214
|
+
const current = awarenessMap.get(clientId) || {};
|
|
215
|
+
awarenessMap.set(clientId, { ...current, ...state });
|
|
216
|
+
// Broadcast to others (would use y-protocols in production)
|
|
217
|
+
awarenessSubscribers.forEach((cb) => cb(new Map(awarenessMap)));
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Subscribe to awareness changes
|
|
221
|
+
*/
|
|
222
|
+
function subscribeAwareness(callback) {
|
|
223
|
+
awarenessSubscribers.add(callback);
|
|
224
|
+
return () => awarenessSubscribers.delete(callback);
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Get sync status
|
|
228
|
+
*/
|
|
229
|
+
function getSyncStatus() {
|
|
230
|
+
return syncStatus;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Subscribe to sync status
|
|
234
|
+
*/
|
|
235
|
+
function subscribeSyncStatus(callback) {
|
|
236
|
+
syncStatusSubscribers.add(callback);
|
|
237
|
+
return () => syncStatusSubscribers.delete(callback);
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Destroy adapter
|
|
241
|
+
*/
|
|
242
|
+
function destroy() {
|
|
243
|
+
subscribers.clear();
|
|
244
|
+
syncStatusSubscribers.clear();
|
|
245
|
+
awarenessSubscribers.clear();
|
|
246
|
+
if (provider) {
|
|
247
|
+
provider.destroy();
|
|
248
|
+
}
|
|
249
|
+
// Clear all keys from ymap
|
|
250
|
+
const keys = Object.keys(ymap.toJSON());
|
|
251
|
+
keys.forEach((key) => ymap.delete(key));
|
|
252
|
+
}
|
|
253
|
+
// Initialize
|
|
254
|
+
initialize();
|
|
255
|
+
// Set initial user awareness
|
|
256
|
+
if (config.userId) {
|
|
257
|
+
setAwareness({
|
|
258
|
+
user: {
|
|
259
|
+
id: config.userId,
|
|
260
|
+
...config.userInfo,
|
|
261
|
+
},
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
return {
|
|
265
|
+
getStore,
|
|
266
|
+
applyPatch,
|
|
267
|
+
getAwareness,
|
|
268
|
+
setAwareness,
|
|
269
|
+
subscribeAwareness,
|
|
270
|
+
getSyncStatus,
|
|
271
|
+
subscribeSyncStatus,
|
|
272
|
+
destroy,
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Create collaborative state store
|
|
277
|
+
*/
|
|
278
|
+
export function createCollaborativeStore(yjsConfig, localConfig = {}) {
|
|
279
|
+
const adapter = createYjsAdapter(yjsConfig);
|
|
280
|
+
return adapter.getStore();
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=yjs-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yjs-adapter.js","sourceRoot":"","sources":["../../src/collab/yjs-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YJS Client Setup - GAP-65
|
|
3
|
+
*
|
|
4
|
+
* Collaborative editing client using YJS CRDTs
|
|
5
|
+
*/
|
|
6
|
+
import * as Y from 'yjs';
|
|
7
|
+
import { WebrtcProvider } from 'y-webrtc';
|
|
8
|
+
import { Awareness } from 'y-protocols/awareness';
|
|
9
|
+
export interface YjsConfig {
|
|
10
|
+
signalingUrls: string[];
|
|
11
|
+
iceServers: RTCIceServer[];
|
|
12
|
+
roomPrefix: string;
|
|
13
|
+
maxPeers?: number;
|
|
14
|
+
}
|
|
15
|
+
export interface CollaborationSession {
|
|
16
|
+
roomId: string;
|
|
17
|
+
participants: Participant[];
|
|
18
|
+
doc: Y.Doc;
|
|
19
|
+
provider: WebrtcProvider;
|
|
20
|
+
awareness: Awareness;
|
|
21
|
+
}
|
|
22
|
+
export interface Participant {
|
|
23
|
+
id: string;
|
|
24
|
+
name: string;
|
|
25
|
+
color: string;
|
|
26
|
+
cursor?: CursorPosition;
|
|
27
|
+
selection?: Range;
|
|
28
|
+
}
|
|
29
|
+
export interface CursorPosition {
|
|
30
|
+
x: number;
|
|
31
|
+
y: number;
|
|
32
|
+
line?: number;
|
|
33
|
+
ch?: number;
|
|
34
|
+
}
|
|
35
|
+
export interface Range {
|
|
36
|
+
anchor: CursorPosition;
|
|
37
|
+
head: CursorPosition;
|
|
38
|
+
}
|
|
39
|
+
export declare class YjsClient {
|
|
40
|
+
private doc;
|
|
41
|
+
private provider;
|
|
42
|
+
private awareness;
|
|
43
|
+
private config;
|
|
44
|
+
private roomId;
|
|
45
|
+
private session;
|
|
46
|
+
constructor(roomId: string, config: YjsConfig);
|
|
47
|
+
private setupProvider;
|
|
48
|
+
private setupAwareness;
|
|
49
|
+
private handleAwarenessChange;
|
|
50
|
+
private generateUserId;
|
|
51
|
+
private generateColor;
|
|
52
|
+
/**
|
|
53
|
+
* Get shared text for collaborative editing
|
|
54
|
+
*/
|
|
55
|
+
getText(name?: string): Y.Text;
|
|
56
|
+
/**
|
|
57
|
+
* Get shared array
|
|
58
|
+
*/
|
|
59
|
+
getArray<T>(name: string): Y.Array<T>;
|
|
60
|
+
/**
|
|
61
|
+
* Get shared map
|
|
62
|
+
*/
|
|
63
|
+
getMap<T>(name: string): Y.Map<T>;
|
|
64
|
+
/**
|
|
65
|
+
* Get the underlying Y.Doc
|
|
66
|
+
*/
|
|
67
|
+
getDoc(): Y.Doc;
|
|
68
|
+
/**
|
|
69
|
+
* Get current session
|
|
70
|
+
*/
|
|
71
|
+
getSession(): CollaborationSession | null;
|
|
72
|
+
/**
|
|
73
|
+
* Get all participants
|
|
74
|
+
*/
|
|
75
|
+
getParticipants(): Participant[];
|
|
76
|
+
/**
|
|
77
|
+
* Update local user state
|
|
78
|
+
*/
|
|
79
|
+
updateLocalState(state: Partial<Participant>): void;
|
|
80
|
+
/**
|
|
81
|
+
* Update cursor position
|
|
82
|
+
*/
|
|
83
|
+
updateCursor(cursor: CursorPosition): void;
|
|
84
|
+
/**
|
|
85
|
+
* Update selection range
|
|
86
|
+
*/
|
|
87
|
+
updateSelection(selection: Range): void;
|
|
88
|
+
/**
|
|
89
|
+
* Disconnect from the room
|
|
90
|
+
*/
|
|
91
|
+
disconnect(): void;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Create a new YJS client
|
|
95
|
+
*/
|
|
96
|
+
export declare function createYjsClient(roomId: string, config: YjsConfig): YjsClient;
|
|
97
|
+
/**
|
|
98
|
+
* Default configuration for common use cases
|
|
99
|
+
*/
|
|
100
|
+
export declare const defaultConfig: YjsConfig;
|
|
101
|
+
//# sourceMappingURL=yjs-client.d.ts.map
|