@pluv/crdt-yjs 5.0.0 → 5.0.1
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/CHANGELOG.md +9 -6
- package/package.json +11 -11
- package/.turbo/turbo-build.log +0 -19
- package/dist/index.d.mts +0 -210
- package/dist/index.d.mts.map +0 -1
- package/dist/index.mjs +0 -569
- package/dist/index.mjs.map +0 -1
- package/dist/rolldown-runtime-D7D4PA-g.mjs +0 -13
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# @pluv/crdt-yjs
|
|
2
2
|
|
|
3
|
+
## 5.0.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- @pluv/crdt@5.0.1
|
|
8
|
+
- @pluv/types@5.0.1
|
|
9
|
+
|
|
3
10
|
## 5.0.0
|
|
4
11
|
|
|
5
12
|
### Patch Changes
|
|
@@ -223,9 +230,7 @@
|
|
|
223
230
|
import { createClient } from "@pluv/client";
|
|
224
231
|
import { yjs } from "@pluv/crdt-yjs";
|
|
225
232
|
|
|
226
|
-
const client = createClient({
|
|
227
|
-
/* ... */
|
|
228
|
-
});
|
|
233
|
+
const client = createClient({/* ... */});
|
|
229
234
|
const room = client.createRoom("example-room");
|
|
230
235
|
|
|
231
236
|
// Yjs Provider
|
|
@@ -276,9 +281,7 @@
|
|
|
276
281
|
import { createClient } from "@pluv/client";
|
|
277
282
|
import { yjs } from "@pluv/crdt-yjs";
|
|
278
283
|
|
|
279
|
-
const client = createClient({
|
|
280
|
-
/* ... */
|
|
281
|
-
});
|
|
284
|
+
const client = createClient({/* ... */});
|
|
282
285
|
const room = client.createRoom("example-room");
|
|
283
286
|
|
|
284
287
|
// Yjs Awareness
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pluv/crdt-yjs",
|
|
3
|
-
"version": "5.0.
|
|
3
|
+
"version": "5.0.1",
|
|
4
4
|
"description": "yjs for @pluv/io",
|
|
5
5
|
"author": {
|
|
6
6
|
"email": "david@pluv.io",
|
|
@@ -20,22 +20,22 @@
|
|
|
20
20
|
"access": "public"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
23
|
+
"@pluv/crdt": "^5.0.1",
|
|
24
|
+
"@pluv/types": "^5.0.1",
|
|
25
|
+
"@types/node": "^26.2.0",
|
|
26
|
+
"js-base64": "^3.9.3",
|
|
27
|
+
"lib0": "^0.2.117"
|
|
28
28
|
},
|
|
29
29
|
"peerDependencies": {
|
|
30
30
|
"yjs": "^13.0.0"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
|
-
"
|
|
34
|
-
"
|
|
33
|
+
"@pluv/tsconfig": "^5.0.1",
|
|
34
|
+
"eslint": "^10.9.0",
|
|
35
|
+
"eslint-config-pluv": "^5.0.1",
|
|
36
|
+
"tsdown": "0.22.14",
|
|
35
37
|
"typescript": "^5.9.3",
|
|
36
|
-
"yjs": "^13.6.
|
|
37
|
-
"@pluv/tsconfig": "^5.0.0",
|
|
38
|
-
"eslint-config-pluv": "^5.0.0"
|
|
38
|
+
"yjs": "^13.6.32"
|
|
39
39
|
},
|
|
40
40
|
"exports": {
|
|
41
41
|
".": "./dist/index.mjs",
|
package/.turbo/turbo-build.log
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
$ tsdown
|
|
2
|
-
[34mℹ[39m [34mtsdown v0.22.3[39m powered by [38;2;255;126;23mrolldown v1.1.2[39m
|
|
3
|
-
[34mℹ[39m config file: [4m/home/runner/work/pluv/pluv/packages/crdt-yjs/tsdown.config.ts[24m
|
|
4
|
-
[34mℹ[39m entry: [34msrc/index.ts[39m
|
|
5
|
-
[34mℹ[39m target: [34mesnext[39m
|
|
6
|
-
[34mℹ[39m tsconfig: [34mtsconfig.json[39m
|
|
7
|
-
[34mℹ[39m Build start
|
|
8
|
-
[34mℹ[39m [2mdist/[22m[1mindex.mjs[22m [2m15.13 kB[22m [2m│ gzip: 4.07 kB[22m
|
|
9
|
-
[34mℹ[39m [2mdist/[22mindex.mjs.map [2m41.04 kB[22m [2m│ gzip: 8.87 kB[22m
|
|
10
|
-
[34mℹ[39m [2mdist/[22mindex.d.mts.map [2m 5.76 kB[22m [2m│ gzip: 1.58 kB[22m
|
|
11
|
-
[34mℹ[39m [2mdist/[22mrolldown-runtime-D7D4PA-g.mjs [2m 0.36 kB[22m [2m│ gzip: 0.26 kB[22m
|
|
12
|
-
[34mℹ[39m [2mdist/[22m[32m[1mindex.d.mts[22m[39m [2m10.91 kB[22m [2m│ gzip: 2.45 kB[22m
|
|
13
|
-
[34mℹ[39m 5 files, total: 73.20 kB
|
|
14
|
-
[33m[PLUGIN_TIMINGS] [0mYour build spent significant time in plugins. Here is a breakdown:
|
|
15
|
-
- rolldown-plugin-dts:generate (49%)
|
|
16
|
-
- rolldown-plugin-dts:fake-js (25%)
|
|
17
|
-
See https://rolldown.rs/reference/InputOptions.checks#plugintimings for more details.
|
|
18
|
-
|
|
19
|
-
[32m✔[39m Build complete in [32m3662ms[39m
|
package/dist/index.d.mts
DELETED
|
@@ -1,210 +0,0 @@
|
|
|
1
|
-
import { Array, Doc, Map as Map$1, Text, XmlElement, XmlFragment, XmlText } from "yjs";
|
|
2
|
-
import { ObservableV2 } from "lib0/observable";
|
|
3
|
-
import { AbstractCrdtDocFactory, CrdtType, DocApplyEncodedStateParams, DocBatchApplyEncodedStateParams, DocSubscribeCallbackParams, InferCrdtJson } from "@pluv/crdt";
|
|
4
|
-
import { CrdtDocLike, CrdtType as CrdtType$1, IOLike, PluvRouterEventConfig, RoomLike } from "@pluv/types";
|
|
5
|
-
|
|
6
|
-
//#region src/types.d.ts
|
|
7
|
-
type YjsType<TValue extends unknown, TJson extends unknown = any> = CrdtType<TValue, TJson> & {
|
|
8
|
-
initialValue?: any;
|
|
9
|
-
toJSON: () => any;
|
|
10
|
-
};
|
|
11
|
-
/**
|
|
12
|
-
* @description Type internally defined by Yjs.Awareness
|
|
13
|
-
* @see https://github.com/yjs/y-protocols/blob/master/awareness.js
|
|
14
|
-
*/
|
|
15
|
-
interface YjsAwarenessUpdate {
|
|
16
|
-
added: number[];
|
|
17
|
-
updated: number[];
|
|
18
|
-
removed: number[];
|
|
19
|
-
}
|
|
20
|
-
type YjsProviderStatus = "connecting" | "connected" | "disconnected";
|
|
21
|
-
/**
|
|
22
|
-
* @description Type internally defined by Yjs.Awareness
|
|
23
|
-
* @see https://github.com/yjs/y-protocols/blob/master/awareness.js
|
|
24
|
-
*/
|
|
25
|
-
interface MetaClientState {
|
|
26
|
-
clock: number;
|
|
27
|
-
lastUpdated: number;
|
|
28
|
-
}
|
|
29
|
-
type AwarenessPresence<TPresence extends Record<string, any>, TField extends keyof TPresence | null> = TField extends null ? TPresence : TField extends keyof TPresence ? TPresence[TField] : never;
|
|
30
|
-
//#endregion
|
|
31
|
-
//#region src/array/array.d.ts
|
|
32
|
-
declare const array: <T extends unknown>(value?: T[] | readonly T[]) => YjsType<Array<T>, T[]>;
|
|
33
|
-
//#endregion
|
|
34
|
-
//#region src/awareness/PluvYjsAwareness.d.ts
|
|
35
|
-
interface PluvYjsAwarenessParams<TIO extends IOLike<any, any, any>, TPresence extends Record<string, any>, TStorage extends Record<string, CrdtType$1<any, any>>, TEvents extends PluvRouterEventConfig, TField extends keyof TPresence | null = null> {
|
|
36
|
-
presenceField?: TField;
|
|
37
|
-
room: RoomLike<TIO, Doc, TPresence, TStorage, TEvents>;
|
|
38
|
-
}
|
|
39
|
-
declare class PluvYjsAwareness<TIO extends IOLike, TPresence extends Record<string, any>, TStorage extends Record<string, CrdtType$1<any, any>>, TEvents extends PluvRouterEventConfig, TField extends keyof TPresence | null = null> extends ObservableV2<{
|
|
40
|
-
change: (updates: YjsAwarenessUpdate, kind: "presence") => void;
|
|
41
|
-
destroy: (awareness: PluvYjsAwareness<TIO, TPresence, TStorage, TEvents, TField>) => void;
|
|
42
|
-
update: (updates: YjsAwarenessUpdate, kind: "local" | "presence") => void;
|
|
43
|
-
}> {
|
|
44
|
-
readonly doc: Doc;
|
|
45
|
-
private readonly _field;
|
|
46
|
-
private readonly _idMap;
|
|
47
|
-
private readonly _room;
|
|
48
|
-
private readonly _unsubscribe;
|
|
49
|
-
get clientID(): number;
|
|
50
|
-
get states(): Map<number, TPresence>;
|
|
51
|
-
constructor(params: PluvYjsAwarenessParams<TIO, TPresence, TStorage, TEvents, TField>);
|
|
52
|
-
destroy(): void;
|
|
53
|
-
getLocalState(): AwarenessPresence<TPresence, TField>;
|
|
54
|
-
setLocalState(state: AwarenessPresence<TPresence, TField>): void;
|
|
55
|
-
setLocalStateField<TLocalField extends keyof AwarenessPresence<TPresence, TField>>(field: TLocalField, value: AwarenessPresence<TPresence, TField>[TLocalField]): void;
|
|
56
|
-
/**
|
|
57
|
-
* !HACK
|
|
58
|
-
* @description We're building the awareness presences from the states stored on the room's
|
|
59
|
-
* presense instead of using the map defined in the awareness interface.
|
|
60
|
-
* @see https://github.com/yjs/y-protocols/blob/master/awareness.js
|
|
61
|
-
* @date May 13, 2025
|
|
62
|
-
*/
|
|
63
|
-
getStates(): Map<number, AwarenessPresence<TPresence, TField>>;
|
|
64
|
-
private _adaptPresence;
|
|
65
|
-
private _deriveUpdates;
|
|
66
|
-
private _resetIdMap;
|
|
67
|
-
/**
|
|
68
|
-
* !HACK
|
|
69
|
-
* @description We dgaf about these. We're just mirroring the fields that exist in the
|
|
70
|
-
* og awareness to make sure everything aligns.
|
|
71
|
-
* @see https://github.com/yjs/y-protocols/blob/master/awareness.js
|
|
72
|
-
* @date May 13, 2025
|
|
73
|
-
*/
|
|
74
|
-
readonly meta: Map<any, MetaClientState>;
|
|
75
|
-
readonly _checkInterval: number;
|
|
76
|
-
}
|
|
77
|
-
//#endregion
|
|
78
|
-
//#region src/awareness/awareness.d.ts
|
|
79
|
-
declare const awareness: <TIO extends IOLike<any, any, any>, TPresence extends Record<string, any>, TStorage extends Record<string, CrdtType$1<any, any>>, TEvents extends PluvRouterEventConfig, TField extends keyof TPresence | null = null>(params: PluvYjsAwarenessParams<TIO, TPresence, TStorage, TEvents, TField>) => PluvYjsAwareness<TIO, TPresence, TStorage, TEvents, TField>;
|
|
80
|
-
//#endregion
|
|
81
|
-
//#region src/doc/builder.d.ts
|
|
82
|
-
type YjsBuilder = ReturnType<typeof builder>;
|
|
83
|
-
declare const builder: (doc: Doc) => {
|
|
84
|
-
array<T extends unknown>(name: string, value?: T[] | readonly T[]): YjsType<Array<T>, T[]>;
|
|
85
|
-
map<T extends unknown>(name: string, value?: readonly (readonly [key: string, value: T])[]): YjsType<Map$1<T>, Record<string, T>>;
|
|
86
|
-
text(name: string, value?: string): YjsType<Text, string>;
|
|
87
|
-
xmlElement(name: string, children?: (XmlElement | XmlText)[] | readonly (XmlElement | XmlText)[]): YjsType<XmlElement, string>;
|
|
88
|
-
xmlFragment(name: string, children?: (XmlElement | XmlText)[] | readonly (XmlElement | XmlText)[]): YjsType<XmlFragment, string>;
|
|
89
|
-
xmlText(name: string): YjsType<XmlText, string>;
|
|
90
|
-
};
|
|
91
|
-
//#endregion
|
|
92
|
-
//#region src/doc/CrdtYjsDoc.d.ts
|
|
93
|
-
type CrdtYjsDocParams<TStorage extends Record<string, YjsType<any, any>>> = (builder: YjsBuilder) => TStorage;
|
|
94
|
-
declare class CrdtYjsDoc<TStorage extends Record<string, YjsType<any, any>>> implements CrdtDocLike<Doc, TStorage> {
|
|
95
|
-
#private;
|
|
96
|
-
value: Doc;
|
|
97
|
-
constructor(params?: CrdtYjsDocParams<TStorage>);
|
|
98
|
-
applyEncodedState(params: DocApplyEncodedStateParams): this;
|
|
99
|
-
batchApplyEncodedState(params: DocBatchApplyEncodedStateParams): this;
|
|
100
|
-
canRedo(): boolean;
|
|
101
|
-
canUndo(): boolean;
|
|
102
|
-
destroy(): void;
|
|
103
|
-
get(key?: undefined): TStorage;
|
|
104
|
-
get<TKey extends keyof TStorage>(type: TKey): TStorage[TKey];
|
|
105
|
-
getEncodedState(): string;
|
|
106
|
-
isEmpty(): boolean;
|
|
107
|
-
rebuildStorage(reference: TStorage): this;
|
|
108
|
-
redo(): this;
|
|
109
|
-
subscribe(listener: (params: DocSubscribeCallbackParams<Doc, TStorage>) => void): () => void;
|
|
110
|
-
track(): this;
|
|
111
|
-
transact(fn: () => void): this;
|
|
112
|
-
toJson(): InferCrdtJson<TStorage>;
|
|
113
|
-
toJson<TKey extends keyof TStorage>(type: TKey): InferCrdtJson<TStorage[TKey]>;
|
|
114
|
-
undo(): this;
|
|
115
|
-
}
|
|
116
|
-
//#endregion
|
|
117
|
-
//#region src/doc/CrdtYjsDocFactory.d.ts
|
|
118
|
-
declare class CrdtYjsDocFactory<TStorage extends Record<string, YjsType<any, any>> = {}> extends AbstractCrdtDocFactory<Doc, TStorage> {
|
|
119
|
-
readonly _initialStorage: (builder: YjsBuilder) => TStorage;
|
|
120
|
-
constructor(initialStorage?: (builder: YjsBuilder) => TStorage);
|
|
121
|
-
getEmpty(): CrdtYjsDoc<TStorage>;
|
|
122
|
-
getFactory(initialStorage: (builder: YjsBuilder) => TStorage): CrdtYjsDocFactory<TStorage>;
|
|
123
|
-
getInitialized(initialStorage?: (builder: YjsBuilder) => TStorage): CrdtYjsDoc<TStorage>;
|
|
124
|
-
}
|
|
125
|
-
//#endregion
|
|
126
|
-
//#region src/doc/doc.d.ts
|
|
127
|
-
declare const doc: <TStorage extends Record<string, YjsType<any, any>>>(value?: (buidler: YjsBuilder) => TStorage) => CrdtYjsDocFactory<TStorage>;
|
|
128
|
-
//#endregion
|
|
129
|
-
//#region src/map/map.d.ts
|
|
130
|
-
declare const map: <T extends unknown>(value?: readonly (readonly [key: string, value: T])[]) => YjsType<Map$1<T>, Record<string, T>>;
|
|
131
|
-
//#endregion
|
|
132
|
-
//#region src/provider/PluvYjsProvider.d.ts
|
|
133
|
-
interface PluvYjsProviderParams<TIO extends IOLike<any, any, any>, TPresence extends Record<string, any>, TStorage extends Record<string, CrdtType$1<any, any>>, TEvents extends PluvRouterEventConfig, TField extends keyof TPresence | null = null> {
|
|
134
|
-
presenceField?: TField;
|
|
135
|
-
room: RoomLike<TIO, Doc, TPresence, TStorage, TEvents>;
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* !HACK
|
|
139
|
-
* @description This doesn't really do anything but emit states in a Yjs.Provider compatible way.
|
|
140
|
-
* Connections and document syncing are handled by the PluvRoom already.
|
|
141
|
-
* @date May 13, 2025
|
|
142
|
-
*/
|
|
143
|
-
declare class PluvYjsProvider<TIO extends IOLike<any, any, any>, TPresence extends Record<string, any>, TStorage extends Record<string, CrdtType$1<any, any>>, TEvents extends PluvRouterEventConfig, TField extends keyof TPresence | null = null> extends ObservableV2<{
|
|
144
|
-
"connection-close": (event: CloseEvent | null, provider: PluvYjsProvider<TIO, TPresence, TStorage, TEvents, TField>) => void;
|
|
145
|
-
"connection-error": (event: Event, provider: PluvYjsProvider<TIO, TPresence, TStorage, TEvents, TField>) => void;
|
|
146
|
-
status: (event: {
|
|
147
|
-
status: YjsProviderStatus;
|
|
148
|
-
}) => void;
|
|
149
|
-
sync: (state: boolean) => void;
|
|
150
|
-
synced: (state: boolean) => void;
|
|
151
|
-
}> {
|
|
152
|
-
readonly awareness: PluvYjsAwareness<TIO, TPresence, TStorage, TEvents, TField>;
|
|
153
|
-
readonly doc: Doc;
|
|
154
|
-
private readonly _room;
|
|
155
|
-
private readonly _unsubscribe;
|
|
156
|
-
private _synced;
|
|
157
|
-
constructor(params: PluvYjsProviderParams<TIO, TPresence, TStorage, TEvents, TField>);
|
|
158
|
-
get synced(): boolean;
|
|
159
|
-
set synced(state: boolean);
|
|
160
|
-
destroy(): void;
|
|
161
|
-
private _toProviderStatus;
|
|
162
|
-
/**
|
|
163
|
-
* !HACK
|
|
164
|
-
* @description We dgaf about these, since the room manages these already. We're just mirroring
|
|
165
|
-
* the fields that exist in the og provider to make sure everything aligns.
|
|
166
|
-
* @see https://github.com/yjs/y-websocket/blob/master/src/y-websocket.js
|
|
167
|
-
* @date May 13, 2025
|
|
168
|
-
*/
|
|
169
|
-
connect(): void;
|
|
170
|
-
disconnect(): void;
|
|
171
|
-
}
|
|
172
|
-
//#endregion
|
|
173
|
-
//#region src/provider/provider.d.ts
|
|
174
|
-
declare const provider: <TIO extends IOLike<any, any, any>, TPresence extends Record<string, any>, TStorage extends Record<string, CrdtType$1<any, any>>, TEvents extends PluvRouterEventConfig, TField extends keyof TPresence | null = null>(params: PluvYjsProviderParams<TIO, TPresence, TStorage, TEvents, TField>) => PluvYjsProvider<TIO, TPresence, TStorage, TEvents, TField>;
|
|
175
|
-
//#endregion
|
|
176
|
-
//#region src/text/text.d.ts
|
|
177
|
-
declare const text: (value?: string) => YjsType<Text, string>;
|
|
178
|
-
//#endregion
|
|
179
|
-
//#region src/xmlElement/YjsXmlElement.d.ts
|
|
180
|
-
declare class YjsXmlElement<T extends Record<string, any> = Record<string, any>> extends XmlElement<T> implements YjsType<XmlElement, string> {
|
|
181
|
-
initialValue?: (XmlElement | XmlText)[] | readonly (XmlElement | XmlText)[];
|
|
182
|
-
constructor(name: string, value: (XmlElement | XmlText)[] | readonly (XmlElement | XmlText)[]);
|
|
183
|
-
__pluvType(): any;
|
|
184
|
-
}
|
|
185
|
-
//#endregion
|
|
186
|
-
//#region src/xmlElement/xmlElement.d.ts
|
|
187
|
-
declare const xmlElement: <T extends Record<string, any> = Record<string, any>>(name: string, children: (XmlElement | XmlText)[] | readonly (XmlElement | XmlText)[]) => YjsXmlElement<T>;
|
|
188
|
-
//#endregion
|
|
189
|
-
//#region src/xmlFragment/YjsXmlFragment.d.ts
|
|
190
|
-
declare class YjsXmlFragment extends XmlFragment implements YjsType<XmlFragment, string> {
|
|
191
|
-
initialValue?: (XmlElement | XmlText)[] | readonly (XmlElement | XmlText)[];
|
|
192
|
-
constructor(value: (XmlElement | XmlText)[] | readonly (XmlElement | XmlText)[]);
|
|
193
|
-
__pluvType(): any;
|
|
194
|
-
}
|
|
195
|
-
//#endregion
|
|
196
|
-
//#region src/xmlFragment/xmlFragment.d.ts
|
|
197
|
-
declare const xmlFragment: (children: (XmlElement | XmlText)[] | readonly (XmlElement | XmlText)[]) => YjsXmlFragment;
|
|
198
|
-
//#endregion
|
|
199
|
-
//#region src/xmlText/xmlText.d.ts
|
|
200
|
-
declare const xmlText: () => YjsType<XmlText, string>;
|
|
201
|
-
declare namespace yjs_d_exports {
|
|
202
|
-
export { YjsBuilder, YjsType, array, awareness, doc, kind, map, provider, text, xmlElement, xmlFragment, xmlText };
|
|
203
|
-
}
|
|
204
|
-
declare const kind: "yjs";
|
|
205
|
-
//#endregion
|
|
206
|
-
//#region src/index.d.ts
|
|
207
|
-
type YjsLibraryType = typeof yjs_d_exports;
|
|
208
|
-
//#endregion
|
|
209
|
-
export { YjsLibraryType, yjs_d_exports as yjs };
|
|
210
|
-
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/array/array.ts","../src/awareness/PluvYjsAwareness.ts","../src/awareness/awareness.ts","../src/doc/builder.ts","../src/doc/CrdtYjsDoc.ts","../src/doc/CrdtYjsDocFactory.ts","../src/doc/doc.ts","../src/map/map.ts","../src/provider/PluvYjsProvider.ts","../src/provider/provider.ts","../src/text/text.ts","../src/xmlElement/YjsXmlElement.ts","../src/xmlElement/xmlElement.ts","../src/xmlFragment/YjsXmlFragment.ts","../src/xmlFragment/xmlFragment.ts","../src/xmlText/xmlText.ts","../src/yjs.ts","../src/index.ts"],"mappings":"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"}
|
package/dist/index.mjs
DELETED
|
@@ -1,569 +0,0 @@
|
|
|
1
|
-
import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
|
|
2
|
-
import { Array, Doc, Map as Map$1, Text, UndoManager, XmlElement, XmlFragment, XmlText, applyUpdate, encodeStateAsUpdate, mergeUpdates } from "yjs";
|
|
3
|
-
import { ObservableV2 } from "lib0/observable";
|
|
4
|
-
import { fromUint8Array, toUint8Array } from "js-base64";
|
|
5
|
-
import { AbstractCrdtDocFactory } from "@pluv/crdt";
|
|
6
|
-
import { StorageState } from "@pluv/types";
|
|
7
|
-
//#region src/array/YjsArray.ts
|
|
8
|
-
var YjsArray = class extends Array {
|
|
9
|
-
initialValue;
|
|
10
|
-
constructor(value = []) {
|
|
11
|
-
super();
|
|
12
|
-
this.insert(0, value);
|
|
13
|
-
this.initialValue = value;
|
|
14
|
-
}
|
|
15
|
-
__pluvType() {
|
|
16
|
-
return {};
|
|
17
|
-
}
|
|
18
|
-
};
|
|
19
|
-
//#endregion
|
|
20
|
-
//#region src/array/array.ts
|
|
21
|
-
const array = (value = []) => {
|
|
22
|
-
return new YjsArray(value);
|
|
23
|
-
};
|
|
24
|
-
//#endregion
|
|
25
|
-
//#region src/constants.ts
|
|
26
|
-
const PLUV_PRESENCE_META_KEY = "__pluv";
|
|
27
|
-
const PLUV_PRESENCE_Y_ID_KEY = "__y_clientid";
|
|
28
|
-
//#endregion
|
|
29
|
-
//#region src/awareness/PluvYjsAwareness.ts
|
|
30
|
-
var PluvYjsAwareness = class extends ObservableV2 {
|
|
31
|
-
doc;
|
|
32
|
-
_field = null;
|
|
33
|
-
_idMap = /* @__PURE__ */ new Map();
|
|
34
|
-
_room;
|
|
35
|
-
_unsubscribe;
|
|
36
|
-
get clientID() {
|
|
37
|
-
return this.doc.clientID;
|
|
38
|
-
}
|
|
39
|
-
get states() {
|
|
40
|
-
return this.getStates();
|
|
41
|
-
}
|
|
42
|
-
constructor(params) {
|
|
43
|
-
super();
|
|
44
|
-
const { presenceField, room } = params;
|
|
45
|
-
this.doc = room.getDoc().value;
|
|
46
|
-
this._room = room;
|
|
47
|
-
if (!!presenceField) this._field = presenceField;
|
|
48
|
-
const myMeta = this._room.getMyPresence()?.["__pluv"] || {};
|
|
49
|
-
this._room.updateMyPresence({ [PLUV_PRESENCE_META_KEY]: {
|
|
50
|
-
...myMeta,
|
|
51
|
-
[PLUV_PRESENCE_Y_ID_KEY]: this.clientID
|
|
52
|
-
} });
|
|
53
|
-
this._unsubscribe = this._room.subscribe.others((others, event) => {
|
|
54
|
-
const updates = this._deriveUpdates(others, event);
|
|
55
|
-
if (!updates) return;
|
|
56
|
-
this.emit("change", [updates, "presence"]);
|
|
57
|
-
this.emit("update", [updates, "presence"]);
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
destroy() {
|
|
61
|
-
this.emit("destroy", [this]);
|
|
62
|
-
this._unsubscribe();
|
|
63
|
-
super.destroy();
|
|
64
|
-
}
|
|
65
|
-
getLocalState() {
|
|
66
|
-
return this._adaptPresence(this._room.getMyPresence());
|
|
67
|
-
}
|
|
68
|
-
setLocalState(state) {
|
|
69
|
-
const patch = !!this._field ? { [this._field]: state } : state;
|
|
70
|
-
this._room.updateMyPresence(patch);
|
|
71
|
-
this.emit("update", [{
|
|
72
|
-
added: [],
|
|
73
|
-
updated: [this.clientID],
|
|
74
|
-
removed: []
|
|
75
|
-
}, "local"]);
|
|
76
|
-
}
|
|
77
|
-
setLocalStateField(field, value) {
|
|
78
|
-
/**
|
|
79
|
-
* !HACK
|
|
80
|
-
* @description Cast to unknown first, because field loses its type of TField when set in
|
|
81
|
-
* an object.
|
|
82
|
-
* @date May 14, 2025
|
|
83
|
-
*/
|
|
84
|
-
const patch = !!this._field ? { [this._field]: {
|
|
85
|
-
...this.getLocalState(),
|
|
86
|
-
[field]: value
|
|
87
|
-
} } : { [field]: value };
|
|
88
|
-
this._room.updateMyPresence(patch);
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* !HACK
|
|
92
|
-
* @description We're building the awareness presences from the states stored on the room's
|
|
93
|
-
* presense instead of using the map defined in the awareness interface.
|
|
94
|
-
* @see https://github.com/yjs/y-protocols/blob/master/awareness.js
|
|
95
|
-
* @date May 13, 2025
|
|
96
|
-
*/
|
|
97
|
-
getStates() {
|
|
98
|
-
const states = this._room.getOthers().reduce((map, other) => {
|
|
99
|
-
const presence = this._adaptPresence(other.presence);
|
|
100
|
-
const clientID = (other.presence?.["__pluv"] || {})[PLUV_PRESENCE_Y_ID_KEY];
|
|
101
|
-
return typeof presence !== "undefined" && typeof clientID !== "undefined" ? map.set(clientID, presence) : map;
|
|
102
|
-
}, /* @__PURE__ */ new Map());
|
|
103
|
-
const myPresence = this.getLocalState();
|
|
104
|
-
if (typeof myPresence !== "undefined") states.set(this.clientID, myPresence);
|
|
105
|
-
return states;
|
|
106
|
-
}
|
|
107
|
-
_adaptPresence(presence) {
|
|
108
|
-
return !!this._field ? presence[this._field] : presence;
|
|
109
|
-
}
|
|
110
|
-
_deriveUpdates(others, event) {
|
|
111
|
-
switch (event.kind) {
|
|
112
|
-
case "clear":
|
|
113
|
-
this._idMap.clear();
|
|
114
|
-
return null;
|
|
115
|
-
case "enter": {
|
|
116
|
-
const clientID = this._resetIdMap(others).get(event.user.connectionId);
|
|
117
|
-
return {
|
|
118
|
-
added: typeof clientID !== "undefined" ? [clientID] : [],
|
|
119
|
-
updated: [],
|
|
120
|
-
removed: []
|
|
121
|
-
};
|
|
122
|
-
}
|
|
123
|
-
case "leave": {
|
|
124
|
-
const clientID = this._idMap.get(event.user.connectionId);
|
|
125
|
-
this._resetIdMap(others);
|
|
126
|
-
return {
|
|
127
|
-
added: [],
|
|
128
|
-
updated: [],
|
|
129
|
-
removed: typeof clientID !== "undefined" ? [clientID] : []
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
case "sync":
|
|
133
|
-
this._resetIdMap(others);
|
|
134
|
-
return null;
|
|
135
|
-
case "update": {
|
|
136
|
-
const clientID = this._resetIdMap(others).get(event.user.connectionId);
|
|
137
|
-
return {
|
|
138
|
-
added: [],
|
|
139
|
-
updated: typeof clientID !== "undefined" ? [clientID] : [],
|
|
140
|
-
removed: []
|
|
141
|
-
};
|
|
142
|
-
}
|
|
143
|
-
default: return null;
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
_resetIdMap(others) {
|
|
147
|
-
this._idMap.clear();
|
|
148
|
-
return others.reduce((map, other) => {
|
|
149
|
-
const clientID = other.presence[PLUV_PRESENCE_META_KEY]?.[PLUV_PRESENCE_Y_ID_KEY];
|
|
150
|
-
if (typeof clientID === "undefined") return map;
|
|
151
|
-
return map.set(other.connectionId, clientID);
|
|
152
|
-
}, this._idMap);
|
|
153
|
-
}
|
|
154
|
-
/**
|
|
155
|
-
* !HACK
|
|
156
|
-
* @description We dgaf about these. We're just mirroring the fields that exist in the
|
|
157
|
-
* og awareness to make sure everything aligns.
|
|
158
|
-
* @see https://github.com/yjs/y-protocols/blob/master/awareness.js
|
|
159
|
-
* @date May 13, 2025
|
|
160
|
-
*/
|
|
161
|
-
meta = /* @__PURE__ */ new Map();
|
|
162
|
-
_checkInterval = 0;
|
|
163
|
-
};
|
|
164
|
-
//#endregion
|
|
165
|
-
//#region src/awareness/awareness.ts
|
|
166
|
-
const awareness = (params) => {
|
|
167
|
-
return new PluvYjsAwareness(params);
|
|
168
|
-
};
|
|
169
|
-
//#endregion
|
|
170
|
-
//#region src/doc/builder.ts
|
|
171
|
-
const builder = (doc) => {
|
|
172
|
-
return {
|
|
173
|
-
array(name, value = []) {
|
|
174
|
-
const array = doc.getArray(name);
|
|
175
|
-
if (!!value.length) array.insert(0, value);
|
|
176
|
-
return array;
|
|
177
|
-
},
|
|
178
|
-
map(name, value = []) {
|
|
179
|
-
const map = doc.getMap(name);
|
|
180
|
-
value.forEach(([k, v]) => {
|
|
181
|
-
map.set(k, v);
|
|
182
|
-
});
|
|
183
|
-
return map;
|
|
184
|
-
},
|
|
185
|
-
text(name, value = "") {
|
|
186
|
-
const text = doc.getText(name);
|
|
187
|
-
if (!!value) text.insert(0, value);
|
|
188
|
-
return text;
|
|
189
|
-
},
|
|
190
|
-
xmlElement(name, children = []) {
|
|
191
|
-
const xmlElement = doc.getXmlElement(name);
|
|
192
|
-
if (!!children.length) xmlElement.insert(0, children);
|
|
193
|
-
return xmlElement;
|
|
194
|
-
},
|
|
195
|
-
xmlFragment(name, children = []) {
|
|
196
|
-
const xmlFragment = doc.getXmlFragment(name);
|
|
197
|
-
if (!!children.length) xmlFragment.insert(0, children);
|
|
198
|
-
return xmlFragment;
|
|
199
|
-
},
|
|
200
|
-
xmlText(name) {
|
|
201
|
-
return doc.get(name, XmlText);
|
|
202
|
-
}
|
|
203
|
-
};
|
|
204
|
-
};
|
|
205
|
-
//#endregion
|
|
206
|
-
//#region src/doc/CrdtYjsDoc.ts
|
|
207
|
-
const MERGE_INTERVAL_MS = 1e3;
|
|
208
|
-
const PLUV_ID_FIELD = "__$pluv";
|
|
209
|
-
var CrdtYjsDoc = class {
|
|
210
|
-
value = new Doc();
|
|
211
|
-
#_storage;
|
|
212
|
-
#_undoManager = null;
|
|
213
|
-
constructor(params = () => ({})) {
|
|
214
|
-
const storage = params(builder(this.value));
|
|
215
|
-
const keys = this.value.share.keys().reduce((set, key) => set.add(key), /* @__PURE__ */ new Set());
|
|
216
|
-
this.#_storage = Object.entries(storage).reduce((acc, [key, node]) => keys.has(key) ? {
|
|
217
|
-
...acc,
|
|
218
|
-
[key]: node
|
|
219
|
-
} : acc, {});
|
|
220
|
-
if (!!Object.keys(storage).length) this.#_setPluvId();
|
|
221
|
-
}
|
|
222
|
-
applyEncodedState(params) {
|
|
223
|
-
const { origin, update } = params;
|
|
224
|
-
if (update === null || typeof update === "undefined") return this;
|
|
225
|
-
const uint8Update = typeof update === "string" ? toUint8Array(update) : update;
|
|
226
|
-
applyUpdate(this.value, uint8Update, origin);
|
|
227
|
-
return this;
|
|
228
|
-
}
|
|
229
|
-
batchApplyEncodedState(params) {
|
|
230
|
-
const { origin } = params;
|
|
231
|
-
const filtered = (params.updates ?? []).reduce((acc, update) => {
|
|
232
|
-
if (!update) return acc;
|
|
233
|
-
if (typeof update === "string") {
|
|
234
|
-
acc.push(toUint8Array(update));
|
|
235
|
-
return acc;
|
|
236
|
-
}
|
|
237
|
-
if (typeof update === "object") {
|
|
238
|
-
acc.push(update);
|
|
239
|
-
return acc;
|
|
240
|
-
}
|
|
241
|
-
return acc;
|
|
242
|
-
}, []);
|
|
243
|
-
if (!filtered.length) return this;
|
|
244
|
-
const merged = mergeUpdates(filtered);
|
|
245
|
-
return this.applyEncodedState({
|
|
246
|
-
origin,
|
|
247
|
-
update: merged
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
canRedo() {
|
|
251
|
-
return !!this.#_undoManager?.canRedo();
|
|
252
|
-
}
|
|
253
|
-
canUndo() {
|
|
254
|
-
return !!this.#_undoManager?.canUndo();
|
|
255
|
-
}
|
|
256
|
-
destroy() {
|
|
257
|
-
this.#_undoManager?.destroy();
|
|
258
|
-
this.value.destroy();
|
|
259
|
-
}
|
|
260
|
-
get(type) {
|
|
261
|
-
if (typeof type === "undefined") return this.#_storage;
|
|
262
|
-
return this.#_storage[type];
|
|
263
|
-
}
|
|
264
|
-
getEncodedState() {
|
|
265
|
-
return fromUint8Array(encodeStateAsUpdate(this.value));
|
|
266
|
-
}
|
|
267
|
-
isEmpty() {
|
|
268
|
-
return !this.value.share.size;
|
|
269
|
-
}
|
|
270
|
-
rebuildStorage(reference) {
|
|
271
|
-
if (!!Object.keys(this.#_storage).length) {
|
|
272
|
-
console.warn("Attempted to rebuild storage multiple times");
|
|
273
|
-
return this;
|
|
274
|
-
}
|
|
275
|
-
this.#_storage = Object.entries(reference).reduce((acc, [key, node]) => {
|
|
276
|
-
/**
|
|
277
|
-
* @description It is important that the XML shared-types be checked before the others
|
|
278
|
-
* because they extend off the non-xml types (thereby you can mistakenly identify the
|
|
279
|
-
* wrong type if checked in the reverse order)
|
|
280
|
-
* @date May 9 ,2025
|
|
281
|
-
*/
|
|
282
|
-
if (node instanceof XmlElement) return {
|
|
283
|
-
...acc,
|
|
284
|
-
[key]: this.value.getXmlElement(key)
|
|
285
|
-
};
|
|
286
|
-
if (node instanceof XmlFragment) return {
|
|
287
|
-
...acc,
|
|
288
|
-
[key]: this.value.getXmlFragment(key)
|
|
289
|
-
};
|
|
290
|
-
if (node instanceof XmlText) return {
|
|
291
|
-
...acc,
|
|
292
|
-
[key]: this.value.get(key, XmlText)
|
|
293
|
-
};
|
|
294
|
-
if (node instanceof Array) return {
|
|
295
|
-
...acc,
|
|
296
|
-
[key]: this.value.getArray(key)
|
|
297
|
-
};
|
|
298
|
-
if (node instanceof Map$1) return {
|
|
299
|
-
...acc,
|
|
300
|
-
[key]: this.value.getMap(key)
|
|
301
|
-
};
|
|
302
|
-
if (node instanceof Text) return {
|
|
303
|
-
...acc,
|
|
304
|
-
[key]: this.value.getText(key)
|
|
305
|
-
};
|
|
306
|
-
return acc;
|
|
307
|
-
}, {});
|
|
308
|
-
return this.track();
|
|
309
|
-
}
|
|
310
|
-
redo() {
|
|
311
|
-
this.#_undoManager?.redo();
|
|
312
|
-
return this;
|
|
313
|
-
}
|
|
314
|
-
subscribe(listener) {
|
|
315
|
-
const fn = (update, origin, doc) => {
|
|
316
|
-
listener({
|
|
317
|
-
doc: this,
|
|
318
|
-
local: origin === null || typeof origin === "undefined",
|
|
319
|
-
origin: origin ? String(origin) : null,
|
|
320
|
-
update: fromUint8Array(update)
|
|
321
|
-
});
|
|
322
|
-
};
|
|
323
|
-
this.value.on("update", fn);
|
|
324
|
-
return () => {
|
|
325
|
-
this.value.off("update", fn);
|
|
326
|
-
};
|
|
327
|
-
}
|
|
328
|
-
track() {
|
|
329
|
-
if (this.#_undoManager) this.#_undoManager.destroy();
|
|
330
|
-
const sharedTypes = Object.values(this.#_storage).reduce((acc, type) => {
|
|
331
|
-
if (type instanceof Array || type instanceof Map$1 || type instanceof Text || type instanceof XmlElement || type instanceof XmlFragment || type instanceof XmlText) acc.push(type);
|
|
332
|
-
return acc;
|
|
333
|
-
}, []);
|
|
334
|
-
if (!sharedTypes.length) {
|
|
335
|
-
this.#_undoManager?.destroy();
|
|
336
|
-
this.#_undoManager = null;
|
|
337
|
-
return this;
|
|
338
|
-
}
|
|
339
|
-
this.#_undoManager = new UndoManager(sharedTypes, { captureTimeout: MERGE_INTERVAL_MS });
|
|
340
|
-
return this;
|
|
341
|
-
}
|
|
342
|
-
transact(fn) {
|
|
343
|
-
this.value.transact(fn);
|
|
344
|
-
return this;
|
|
345
|
-
}
|
|
346
|
-
toJson(type) {
|
|
347
|
-
if (typeof type === "string") return this.#_storage[type].toJSON();
|
|
348
|
-
return Object.entries(this.#_storage).reduce((acc, [key, value]) => ({
|
|
349
|
-
...acc,
|
|
350
|
-
[key]: value.toJSON()
|
|
351
|
-
}), {});
|
|
352
|
-
}
|
|
353
|
-
undo() {
|
|
354
|
-
this.#_undoManager?.undo();
|
|
355
|
-
return this;
|
|
356
|
-
}
|
|
357
|
-
#_setPluvId() {
|
|
358
|
-
const text = this.value.getText(PLUV_ID_FIELD);
|
|
359
|
-
const id = typeof crypto !== "undefined" ? crypto.randomUUID() : Math.random().toString();
|
|
360
|
-
text.insert(0, id);
|
|
361
|
-
}
|
|
362
|
-
};
|
|
363
|
-
//#endregion
|
|
364
|
-
//#region src/doc/CrdtYjsDocFactory.ts
|
|
365
|
-
var CrdtYjsDocFactory = class CrdtYjsDocFactory extends AbstractCrdtDocFactory {
|
|
366
|
-
_initialStorage;
|
|
367
|
-
constructor(initialStorage = () => ({})) {
|
|
368
|
-
super(initialStorage);
|
|
369
|
-
this._initialStorage = initialStorage;
|
|
370
|
-
}
|
|
371
|
-
getEmpty() {
|
|
372
|
-
return new CrdtYjsDoc();
|
|
373
|
-
}
|
|
374
|
-
getFactory(initialStorage) {
|
|
375
|
-
return new CrdtYjsDocFactory(initialStorage ?? this._initialStorage);
|
|
376
|
-
}
|
|
377
|
-
getInitialized(initialStorage) {
|
|
378
|
-
return new CrdtYjsDoc(initialStorage ?? this._initialStorage);
|
|
379
|
-
}
|
|
380
|
-
};
|
|
381
|
-
//#endregion
|
|
382
|
-
//#region src/doc/doc.ts
|
|
383
|
-
const doc = (value = () => ({})) => {
|
|
384
|
-
return new CrdtYjsDocFactory(value);
|
|
385
|
-
};
|
|
386
|
-
//#endregion
|
|
387
|
-
//#region src/map/YjsMap.ts
|
|
388
|
-
var YjsMap = class extends Map$1 {
|
|
389
|
-
initialValue;
|
|
390
|
-
constructor(value = []) {
|
|
391
|
-
super(value);
|
|
392
|
-
this.initialValue = value;
|
|
393
|
-
}
|
|
394
|
-
__pluvType() {
|
|
395
|
-
return {};
|
|
396
|
-
}
|
|
397
|
-
};
|
|
398
|
-
//#endregion
|
|
399
|
-
//#region src/map/map.ts
|
|
400
|
-
const map = (value = []) => {
|
|
401
|
-
return new YjsMap(value);
|
|
402
|
-
};
|
|
403
|
-
//#endregion
|
|
404
|
-
//#region src/provider/PluvYjsProvider.ts
|
|
405
|
-
/**
|
|
406
|
-
* !HACK
|
|
407
|
-
* @description This doesn't really do anything but emit states in a Yjs.Provider compatible way.
|
|
408
|
-
* Connections and document syncing are handled by the PluvRoom already.
|
|
409
|
-
* @date May 13, 2025
|
|
410
|
-
*/
|
|
411
|
-
var PluvYjsProvider = class extends ObservableV2 {
|
|
412
|
-
awareness;
|
|
413
|
-
doc;
|
|
414
|
-
_room;
|
|
415
|
-
_unsubscribe;
|
|
416
|
-
_synced = false;
|
|
417
|
-
constructor(params) {
|
|
418
|
-
super();
|
|
419
|
-
const { presenceField, room } = params;
|
|
420
|
-
this.awareness = awareness({
|
|
421
|
-
presenceField,
|
|
422
|
-
room
|
|
423
|
-
});
|
|
424
|
-
this.doc = room.getDoc().value;
|
|
425
|
-
this._room = room;
|
|
426
|
-
const subscriptions = [
|
|
427
|
-
this._room.subscribe.connection(({ storage }) => {
|
|
428
|
-
const status = this._toProviderStatus(storage.state);
|
|
429
|
-
if (!status) return;
|
|
430
|
-
this.emit("status", [{ status }]);
|
|
431
|
-
}),
|
|
432
|
-
this._room.addEventListener("close", (event) => {
|
|
433
|
-
this.emit("connection-close", [event, this]);
|
|
434
|
-
}),
|
|
435
|
-
this._room.addEventListener("error", (event) => {
|
|
436
|
-
this.emit("connection-error", [event, this]);
|
|
437
|
-
})
|
|
438
|
-
];
|
|
439
|
-
this._unsubscribe = subscriptions.reduce((fn, unsubscribe) => () => {
|
|
440
|
-
fn();
|
|
441
|
-
unsubscribe();
|
|
442
|
-
}, () => void 0);
|
|
443
|
-
}
|
|
444
|
-
get synced() {
|
|
445
|
-
return this._synced;
|
|
446
|
-
}
|
|
447
|
-
set synced(state) {
|
|
448
|
-
if (this._synced === state) return;
|
|
449
|
-
this._synced = state;
|
|
450
|
-
this.emit("sync", [state]);
|
|
451
|
-
this.emit("synced", [state]);
|
|
452
|
-
}
|
|
453
|
-
destroy() {
|
|
454
|
-
this.awareness.destroy();
|
|
455
|
-
this._unsubscribe();
|
|
456
|
-
super.destroy();
|
|
457
|
-
}
|
|
458
|
-
_toProviderStatus(state) {
|
|
459
|
-
switch (state) {
|
|
460
|
-
case StorageState.Loading: return "connecting";
|
|
461
|
-
case StorageState.Unavailable: return "disconnected";
|
|
462
|
-
case StorageState.Offline:
|
|
463
|
-
case StorageState.Synced: return "connected";
|
|
464
|
-
default: return null;
|
|
465
|
-
}
|
|
466
|
-
}
|
|
467
|
-
/**
|
|
468
|
-
* !HACK
|
|
469
|
-
* @description We dgaf about these, since the room manages these already. We're just mirroring
|
|
470
|
-
* the fields that exist in the og provider to make sure everything aligns.
|
|
471
|
-
* @see https://github.com/yjs/y-websocket/blob/master/src/y-websocket.js
|
|
472
|
-
* @date May 13, 2025
|
|
473
|
-
*/
|
|
474
|
-
connect() {}
|
|
475
|
-
disconnect() {}
|
|
476
|
-
};
|
|
477
|
-
//#endregion
|
|
478
|
-
//#region src/provider/provider.ts
|
|
479
|
-
const provider = (params) => {
|
|
480
|
-
return new PluvYjsProvider(params);
|
|
481
|
-
};
|
|
482
|
-
//#endregion
|
|
483
|
-
//#region src/text/YjsText.ts
|
|
484
|
-
var YjsText = class extends Text {
|
|
485
|
-
initialValue;
|
|
486
|
-
constructor(value = "") {
|
|
487
|
-
super();
|
|
488
|
-
this.initialValue = value;
|
|
489
|
-
}
|
|
490
|
-
__pluvType() {
|
|
491
|
-
return {};
|
|
492
|
-
}
|
|
493
|
-
};
|
|
494
|
-
//#endregion
|
|
495
|
-
//#region src/text/text.ts
|
|
496
|
-
const text = (value = "") => {
|
|
497
|
-
return new YjsText(value);
|
|
498
|
-
};
|
|
499
|
-
//#endregion
|
|
500
|
-
//#region src/xmlElement/YjsXmlElement.ts
|
|
501
|
-
var YjsXmlElement = class extends XmlElement {
|
|
502
|
-
initialValue;
|
|
503
|
-
constructor(name, value) {
|
|
504
|
-
super(name);
|
|
505
|
-
if (!!value.length) this.insert(0, value);
|
|
506
|
-
this.initialValue = value;
|
|
507
|
-
}
|
|
508
|
-
__pluvType() {
|
|
509
|
-
return {};
|
|
510
|
-
}
|
|
511
|
-
};
|
|
512
|
-
//#endregion
|
|
513
|
-
//#region src/xmlElement/xmlElement.ts
|
|
514
|
-
const xmlElement = (name, children) => {
|
|
515
|
-
return new YjsXmlElement(name, children);
|
|
516
|
-
};
|
|
517
|
-
//#endregion
|
|
518
|
-
//#region src/xmlFragment/YjsXmlFragment.ts
|
|
519
|
-
var YjsXmlFragment = class extends XmlFragment {
|
|
520
|
-
initialValue;
|
|
521
|
-
constructor(value) {
|
|
522
|
-
super();
|
|
523
|
-
if (!!value.length) this.insert(0, value);
|
|
524
|
-
this.initialValue = value;
|
|
525
|
-
}
|
|
526
|
-
__pluvType() {
|
|
527
|
-
return {};
|
|
528
|
-
}
|
|
529
|
-
};
|
|
530
|
-
//#endregion
|
|
531
|
-
//#region src/xmlFragment/xmlFragment.ts
|
|
532
|
-
const xmlFragment = (children) => {
|
|
533
|
-
return new YjsXmlFragment(children);
|
|
534
|
-
};
|
|
535
|
-
//#endregion
|
|
536
|
-
//#region src/xmlText/YjsXmlText.ts
|
|
537
|
-
var YjsXmlText = class extends XmlText {
|
|
538
|
-
initialValue;
|
|
539
|
-
constructor(value = "") {
|
|
540
|
-
super();
|
|
541
|
-
this.initialValue = value;
|
|
542
|
-
}
|
|
543
|
-
__pluvType() {
|
|
544
|
-
return {};
|
|
545
|
-
}
|
|
546
|
-
};
|
|
547
|
-
//#endregion
|
|
548
|
-
//#region src/xmlText/xmlText.ts
|
|
549
|
-
const xmlText = () => {
|
|
550
|
-
return new YjsXmlText();
|
|
551
|
-
};
|
|
552
|
-
//#endregion
|
|
553
|
-
//#region src/yjs.ts
|
|
554
|
-
var yjs_exports = /* @__PURE__ */ __exportAll({
|
|
555
|
-
array: () => array,
|
|
556
|
-
awareness: () => awareness,
|
|
557
|
-
doc: () => doc,
|
|
558
|
-
kind: () => "yjs",
|
|
559
|
-
map: () => map,
|
|
560
|
-
provider: () => provider,
|
|
561
|
-
text: () => text,
|
|
562
|
-
xmlElement: () => xmlElement,
|
|
563
|
-
xmlFragment: () => xmlFragment,
|
|
564
|
-
xmlText: () => xmlText
|
|
565
|
-
});
|
|
566
|
-
//#endregion
|
|
567
|
-
export { yjs_exports as yjs };
|
|
568
|
-
|
|
569
|
-
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["YArray","YXmlText","YDoc","#_storage","#_setPluvId","#_undoManager","YXmlElement","YXmlFragment","YXmlText","YArray","YMap","YText","YMap","YText","YXmlElement","YXmlFragment","YXmlText"],"sources":["../src/array/YjsArray.ts","../src/array/array.ts","../src/constants.ts","../src/awareness/PluvYjsAwareness.ts","../src/awareness/awareness.ts","../src/doc/builder.ts","../src/doc/CrdtYjsDoc.ts","../src/doc/CrdtYjsDocFactory.ts","../src/doc/doc.ts","../src/map/YjsMap.ts","../src/map/map.ts","../src/provider/PluvYjsProvider.ts","../src/provider/provider.ts","../src/text/YjsText.ts","../src/text/text.ts","../src/xmlElement/YjsXmlElement.ts","../src/xmlElement/xmlElement.ts","../src/xmlFragment/YjsXmlFragment.ts","../src/xmlFragment/xmlFragment.ts","../src/xmlText/YjsXmlText.ts","../src/xmlText/xmlText.ts","../src/yjs.ts"],"sourcesContent":["import { Array as YArray } from \"yjs\";\nimport type { YjsType } from \"../types\";\n\nexport class YjsArray<T extends unknown> extends YArray<T> implements YjsType<YArray<T>, T[]> {\n public initialValue?: T[] | readonly T[];\n\n constructor(value: T[] | readonly T[] = []) {\n super();\n\n this.insert(0, value as T[]);\n\n this.initialValue = value;\n }\n\n public __pluvType() {\n return {} as any;\n }\n}\n","import { Array as YArray } from \"yjs\";\nimport type { YjsType } from \"../types\";\nimport { YjsArray } from \"./YjsArray\";\n\nexport const array = <T extends unknown>(\n value: T[] | readonly T[] = [],\n): YjsType<YArray<T>, T[]> => {\n return new YjsArray(value);\n};\n","export const PLUV_PRESENCE_META_KEY = \"__pluv\";\nexport const PLUV_PRESENCE_Y_ID_KEY = \"__y_clientid\";\n","import type {\n CrdtType,\n IOLike,\n OthersSubscriptionEvent,\n PluvRouterEventConfig,\n RoomLike,\n UserInfo,\n} from \"@pluv/types\";\nimport { ObservableV2 } from \"lib0/observable\";\nimport type { Doc as YDoc } from \"yjs\";\nimport { PLUV_PRESENCE_META_KEY, PLUV_PRESENCE_Y_ID_KEY } from \"../constants\";\nimport type { AwarenessPresence, MetaClientState, YjsAwarenessUpdate } from \"../types\";\n\nexport interface PluvYjsAwarenessParams<\n TIO extends IOLike<any, any, any>,\n TPresence extends Record<string, any>,\n TStorage extends Record<string, CrdtType<any, any>>,\n TEvents extends PluvRouterEventConfig,\n TField extends keyof TPresence | null = null,\n> {\n presenceField?: TField;\n room: RoomLike<TIO, YDoc, TPresence, TStorage, TEvents>;\n}\n\nexport class PluvYjsAwareness<\n TIO extends IOLike,\n TPresence extends Record<string, any>,\n TStorage extends Record<string, CrdtType<any, any>>,\n TEvents extends PluvRouterEventConfig,\n TField extends keyof TPresence | null = null,\n> extends ObservableV2<{\n change: (updates: YjsAwarenessUpdate, kind: \"presence\") => void;\n destroy: (awareness: PluvYjsAwareness<TIO, TPresence, TStorage, TEvents, TField>) => void;\n update: (updates: YjsAwarenessUpdate, kind: \"local\" | \"presence\") => void;\n}> {\n public readonly doc: YDoc;\n\n private readonly _field: TField = null as TField;\n private readonly _idMap = new Map<[connectionId: string][0], [clientID: number][0]>();\n private readonly _room: RoomLike<TIO, YDoc, TPresence, TStorage, TEvents>;\n private readonly _unsubscribe: () => void;\n\n public get clientID(): number {\n return this.doc.clientID;\n }\n\n public get states(): Map<number, TPresence> {\n return this.getStates();\n }\n\n constructor(params: PluvYjsAwarenessParams<TIO, TPresence, TStorage, TEvents, TField>) {\n super();\n\n const { presenceField, room } = params;\n\n this.doc = room.getDoc().value;\n this._room = room;\n\n if (!!presenceField) this._field = presenceField;\n\n const myPresence: any = this._room.getMyPresence();\n const myMeta = myPresence?.[PLUV_PRESENCE_META_KEY] || {};\n\n this._room.updateMyPresence({\n [PLUV_PRESENCE_META_KEY]: {\n ...myMeta,\n [PLUV_PRESENCE_Y_ID_KEY]: this.clientID,\n },\n } as any);\n\n this._unsubscribe = this._room.subscribe.others((others, event) => {\n const updates = this._deriveUpdates(others, event);\n\n if (!updates) return;\n\n this.emit(\"change\", [updates, \"presence\"]);\n this.emit(\"update\", [updates, \"presence\"]);\n });\n }\n\n public destroy(): void {\n this.emit(\"destroy\", [this]);\n this._unsubscribe();\n super.destroy();\n }\n\n public getLocalState(): AwarenessPresence<TPresence, TField> {\n return this._adaptPresence(this._room.getMyPresence());\n }\n\n public setLocalState(state: AwarenessPresence<TPresence, TField>): void {\n const patch = (!!this._field\n ? { [this._field]: state }\n : state) as unknown as Partial<TPresence>;\n\n this._room.updateMyPresence(patch);\n\n this.emit(\"update\", [{ added: [], updated: [this.clientID], removed: [] }, \"local\"]);\n }\n\n public setLocalStateField<TLocalField extends keyof AwarenessPresence<TPresence, TField>>(\n field: TLocalField,\n value: AwarenessPresence<TPresence, TField>[TLocalField],\n ): void {\n /**\n * !HACK\n * @description Cast to unknown first, because field loses its type of TField when set in\n * an object.\n * @date May 14, 2025\n */\n const patch = (!!this._field\n ? { [this._field]: { ...this.getLocalState(), [field]: value } }\n : { [field]: value }) as unknown as Partial<TPresence>;\n\n this._room.updateMyPresence(patch);\n }\n\n /**\n * !HACK\n * @description We're building the awareness presences from the states stored on the room's\n * presense instead of using the map defined in the awareness interface.\n * @see https://github.com/yjs/y-protocols/blob/master/awareness.js\n * @date May 13, 2025\n */\n public getStates(): Map<number, AwarenessPresence<TPresence, TField>> {\n const others = this._room.getOthers();\n\n const states = others.reduce((map, other) => {\n const presence = this._adaptPresence(other.presence);\n const meta = other.presence?.[PLUV_PRESENCE_META_KEY] || {};\n const clientID: number | undefined = meta[PLUV_PRESENCE_Y_ID_KEY];\n\n return typeof presence !== \"undefined\" && typeof clientID !== \"undefined\"\n ? map.set(clientID, presence)\n : map;\n }, new Map<number, AwarenessPresence<TPresence, TField>>());\n\n const myPresence = this.getLocalState();\n\n if (typeof myPresence !== \"undefined\") states.set(this.clientID, myPresence);\n\n return states;\n }\n\n private _adaptPresence(presence: TPresence): AwarenessPresence<TPresence, TField> {\n return (!!this._field ? presence[this._field] : presence) as AwarenessPresence<\n TPresence,\n TField\n >;\n }\n\n private _deriveUpdates(\n others: readonly UserInfo<any, any>[],\n event: OthersSubscriptionEvent<any, any>,\n ): YjsAwarenessUpdate | null {\n switch (event.kind) {\n case \"clear\": {\n this._idMap.clear();\n return null;\n }\n case \"enter\": {\n const clientID = this._resetIdMap(others).get(event.user.connectionId);\n\n return {\n added: typeof clientID !== \"undefined\" ? [clientID] : [],\n updated: [],\n removed: [],\n };\n }\n case \"leave\": {\n const clientID = this._idMap.get(event.user.connectionId);\n\n this._resetIdMap(others);\n\n return {\n added: [],\n updated: [],\n removed: typeof clientID !== \"undefined\" ? [clientID] : [],\n };\n }\n case \"sync\": {\n this._resetIdMap(others);\n return null;\n }\n case \"update\": {\n const clientID = this._resetIdMap(others).get(event.user.connectionId);\n\n return {\n added: [],\n updated: typeof clientID !== \"undefined\" ? [clientID] : [],\n removed: [],\n };\n }\n default:\n return null;\n }\n }\n\n private _resetIdMap(others: readonly UserInfo<any, any>[]): Map<string, number> {\n this._idMap.clear();\n\n return others.reduce((map, other) => {\n const clientID = other.presence[PLUV_PRESENCE_META_KEY]?.[PLUV_PRESENCE_Y_ID_KEY];\n\n if (typeof clientID === \"undefined\") return map;\n\n return map.set(other.connectionId, clientID);\n }, this._idMap);\n }\n\n /**\n * !HACK\n * @description We dgaf about these. We're just mirroring the fields that exist in the\n * og awareness to make sure everything aligns.\n * @see https://github.com/yjs/y-protocols/blob/master/awareness.js\n * @date May 13, 2025\n */\n public readonly meta = new Map<any, MetaClientState>();\n public readonly _checkInterval: number = 0;\n}\n","import type { CrdtType, IOLike, PluvRouterEventConfig } from \"@pluv/types\";\nimport type { PluvYjsAwarenessParams } from \"./PluvYjsAwareness\";\nimport { PluvYjsAwareness } from \"./PluvYjsAwareness\";\n\nexport const awareness = <\n TIO extends IOLike<any, any, any>,\n TPresence extends Record<string, any>,\n TStorage extends Record<string, CrdtType<any, any>>,\n TEvents extends PluvRouterEventConfig,\n TField extends keyof TPresence | null = null,\n>(\n params: PluvYjsAwarenessParams<TIO, TPresence, TStorage, TEvents, TField>,\n): PluvYjsAwareness<TIO, TPresence, TStorage, TEvents, TField> => {\n return new PluvYjsAwareness(params);\n};\n","import {\n Array as YArray,\n Doc as YDoc,\n Map as YMap,\n Text as YText,\n XmlElement as YXmlElement,\n XmlFragment as YXmlFragment,\n XmlText as YXmlText,\n} from \"yjs\";\nimport { YjsType } from \"../types\";\n\nexport type YjsBuilder = ReturnType<typeof builder>;\n\nexport const builder = (doc: YDoc) => {\n return {\n array<T extends unknown>(\n name: string,\n value: T[] | readonly T[] = [],\n ): YjsType<YArray<T>, T[]> {\n const array = doc.getArray<T>(name);\n\n if (!!value.length) array.insert(0, value as T[]);\n\n return array as unknown as YjsType<YArray<T>, T[]>;\n },\n map<T extends unknown>(\n name: string,\n value: readonly (readonly [key: string, value: T])[] = [],\n ): YjsType<YMap<T>, Record<string, T>> {\n const map = doc.getMap(name);\n\n value.forEach(([k, v]) => {\n map.set(k, v);\n });\n\n return map as unknown as YjsType<YMap<T>, Record<string, T>>;\n },\n text(name: string, value: string = \"\"): YjsType<YText, string> {\n const text = doc.getText(name);\n\n if (!!value) text.insert(0, value);\n\n return text as unknown as YjsType<YText, string>;\n },\n xmlElement(\n name: string,\n children: (YXmlElement | YXmlText)[] | readonly (YXmlElement | YXmlText)[] = [],\n ): YjsType<YXmlElement, string> {\n const xmlElement = doc.getXmlElement(name);\n\n if (!!children.length) xmlElement.insert(0, children as (YXmlElement | YXmlText)[]);\n\n return xmlElement as unknown as YjsType<YXmlElement, string>;\n },\n xmlFragment(\n name: string,\n children: (YXmlElement | YXmlText)[] | readonly (YXmlElement | YXmlText)[] = [],\n ): YjsType<YXmlFragment, string> {\n const xmlFragment = doc.getXmlFragment(name);\n\n if (!!children.length) xmlFragment.insert(0, children as (YXmlElement | YXmlText)[]);\n\n return xmlFragment as unknown as YjsType<YXmlFragment, string>;\n },\n xmlText(name: string): YjsType<YXmlText, string> {\n const xmlText = doc.get(name, YXmlText);\n\n return xmlText as unknown as YjsType<YXmlText, string>;\n },\n };\n};\n","import type {\n DocApplyEncodedStateParams,\n DocBatchApplyEncodedStateParams,\n DocSubscribeCallbackParams,\n InferCrdtJson,\n} from \"@pluv/crdt\";\nimport type { CrdtDocLike } from \"@pluv/types\";\nimport { fromUint8Array, toUint8Array } from \"js-base64\";\nimport {\n AbstractType,\n UndoManager,\n Array as YArray,\n Doc as YDoc,\n Map as YMap,\n Text as YText,\n XmlElement as YXmlElement,\n XmlFragment as YXmlFragment,\n XmlText as YXmlText,\n applyUpdate,\n encodeStateAsUpdate,\n mergeUpdates,\n} from \"yjs\";\nimport type { YjsType } from \"../types\";\nimport type { YjsBuilder } from \"./builder\";\nimport { builder } from \"./builder\";\n\nconst MERGE_INTERVAL_MS = 1_000;\nconst PLUV_ID_FIELD = \"__$pluv\";\n\nexport type CrdtYjsDocParams<TStorage extends Record<string, YjsType<any, any>>> = (\n builder: YjsBuilder,\n) => TStorage;\n\nexport class CrdtYjsDoc<TStorage extends Record<string, YjsType<any, any>>> implements CrdtDocLike<\n YDoc,\n TStorage\n> {\n public value: YDoc = new YDoc();\n\n #_storage: TStorage;\n #_undoManager: UndoManager | null = null;\n\n constructor(params: CrdtYjsDocParams<TStorage> = () => ({}) as TStorage) {\n const storage = params(builder(this.value));\n const keys = this.value.share.keys().reduce((set, key) => set.add(key), new Set<string>());\n\n this.#_storage = Object.entries(storage).reduce(\n (acc, [key, node]) => (keys.has(key) ? { ...acc, [key]: node } : acc),\n {} as TStorage,\n );\n if (!!Object.keys(storage).length) this.#_setPluvId();\n }\n\n public applyEncodedState(params: DocApplyEncodedStateParams): this {\n const { origin, update } = params;\n\n if (update === null || typeof update === \"undefined\") return this;\n\n const uint8Update = typeof update === \"string\" ? toUint8Array(update) : update;\n\n applyUpdate(this.value, uint8Update, origin);\n\n return this;\n }\n\n public batchApplyEncodedState(params: DocBatchApplyEncodedStateParams): this {\n const { origin } = params;\n const updates = params.updates ?? [];\n\n const filtered = updates.reduce<Uint8Array[]>((acc, update) => {\n if (!update) return acc;\n\n if (typeof update === \"string\") {\n acc.push(toUint8Array(update));\n return acc;\n }\n\n if (typeof update === \"object\") {\n acc.push(update);\n return acc;\n }\n\n return acc;\n }, []);\n\n if (!filtered.length) return this;\n\n const merged = mergeUpdates(filtered);\n\n return this.applyEncodedState({ origin, update: merged });\n }\n\n public canRedo(): boolean {\n return !!this.#_undoManager?.canRedo();\n }\n\n public canUndo(): boolean {\n return !!this.#_undoManager?.canUndo();\n }\n\n public destroy(): void {\n this.#_undoManager?.destroy();\n this.value.destroy();\n }\n\n public get(key?: undefined): TStorage;\n public get<TKey extends keyof TStorage>(type: TKey): TStorage[TKey];\n public get<TKey extends keyof TStorage>(type?: TKey): TStorage | TStorage[TKey] {\n if (typeof type === \"undefined\") return this.#_storage;\n\n return this.#_storage[type as TKey];\n }\n\n public getEncodedState(): string {\n return fromUint8Array(encodeStateAsUpdate(this.value));\n }\n\n public isEmpty(): boolean {\n return !this.value.share.size;\n }\n\n public rebuildStorage(reference: TStorage): this {\n const isBuilt = !!Object.keys(this.#_storage).length;\n\n if (isBuilt) {\n console.warn(\"Attempted to rebuild storage multiple times\");\n return this;\n }\n\n this.#_storage = Object.entries(reference).reduce((acc, [key, node]) => {\n /**\n * @description It is important that the XML shared-types be checked before the others\n * because they extend off the non-xml types (thereby you can mistakenly identify the\n * wrong type if checked in the reverse order)\n * @date May 9 ,2025\n */\n if (node instanceof YXmlElement) {\n return { ...acc, [key]: this.value.getXmlElement(key) };\n }\n if (node instanceof YXmlFragment) {\n return { ...acc, [key]: this.value.getXmlFragment(key) };\n }\n if (node instanceof YXmlText) return { ...acc, [key]: this.value.get(key, YXmlText) };\n if (node instanceof YArray) return { ...acc, [key]: this.value.getArray(key) };\n if (node instanceof YMap) return { ...acc, [key]: this.value.getMap(key) };\n if (node instanceof YText) return { ...acc, [key]: this.value.getText(key) };\n\n return acc;\n }, {} as TStorage);\n\n return this.track();\n }\n\n public redo(): this {\n this.#_undoManager?.redo();\n\n return this;\n }\n\n public subscribe(\n listener: (params: DocSubscribeCallbackParams<YDoc, TStorage>) => void,\n ): () => void {\n const fn = (update: Uint8Array, origin: any, doc: YDoc) => {\n listener({\n doc: this,\n local: origin === null || typeof origin === \"undefined\",\n origin: origin ? String(origin) : null,\n update: fromUint8Array(update),\n });\n };\n\n this.value.on(\"update\", fn);\n\n return () => {\n this.value.off(\"update\", fn);\n };\n }\n\n public track(): this {\n if (this.#_undoManager) this.#_undoManager.destroy();\n\n const sharedTypes = Object.values(this.#_storage).reduce<YjsType<AbstractType<any>, any>[]>(\n (acc, type) => {\n if (\n type instanceof YArray ||\n type instanceof YMap ||\n type instanceof YText ||\n type instanceof YXmlElement ||\n type instanceof YXmlFragment ||\n type instanceof YXmlText\n ) {\n acc.push(type as YjsType<AbstractType<any>, any>);\n }\n\n return acc;\n },\n [],\n );\n\n if (!sharedTypes.length) {\n this.#_undoManager?.destroy();\n this.#_undoManager = null;\n\n return this;\n }\n\n this.#_undoManager = new UndoManager(sharedTypes, { captureTimeout: MERGE_INTERVAL_MS });\n\n return this;\n }\n\n public transact(fn: () => void): this {\n this.value.transact(fn);\n\n return this;\n }\n\n public toJson(): InferCrdtJson<TStorage>;\n public toJson<TKey extends keyof TStorage>(type: TKey): InferCrdtJson<TStorage[TKey]>;\n public toJson<TKey extends keyof TStorage>(type?: TKey) {\n if (typeof type === \"string\") return this.#_storage[type].toJSON();\n\n return Object.entries(this.#_storage).reduce(\n (acc, [key, value]) => ({ ...(acc as any), [key]: value.toJSON() }),\n {} as InferCrdtJson<TStorage>,\n );\n }\n\n public undo(): this {\n this.#_undoManager?.undo();\n\n return this;\n }\n\n #_setPluvId() {\n const text = this.value.getText(PLUV_ID_FIELD);\n const id = typeof crypto !== \"undefined\" ? crypto.randomUUID() : Math.random().toString();\n\n text.insert(0, id);\n }\n}\n","import { AbstractCrdtDocFactory } from \"@pluv/crdt\";\nimport type { Doc as YDoc } from \"yjs\";\nimport type { YjsType } from \"../types\";\nimport { CrdtYjsDoc } from \"./CrdtYjsDoc\";\nimport type { YjsBuilder } from \"./builder\";\n\nexport class CrdtYjsDocFactory<\n TStorage extends Record<string, YjsType<any, any>> = {},\n> extends AbstractCrdtDocFactory<YDoc, TStorage> {\n public readonly _initialStorage: (builder: YjsBuilder) => TStorage;\n\n constructor(initialStorage: (builder: YjsBuilder) => TStorage = () => ({}) as TStorage) {\n super(initialStorage);\n\n this._initialStorage = initialStorage;\n }\n\n public getEmpty(): CrdtYjsDoc<TStorage> {\n return new CrdtYjsDoc<TStorage>();\n }\n\n public getFactory(\n initialStorage: (builder: YjsBuilder) => TStorage,\n ): CrdtYjsDocFactory<TStorage> {\n return new CrdtYjsDocFactory<TStorage>(initialStorage ?? this._initialStorage);\n }\n\n public getInitialized(\n initialStorage?: (builder: YjsBuilder) => TStorage,\n ): CrdtYjsDoc<TStorage> {\n return new CrdtYjsDoc<TStorage>(initialStorage ?? this._initialStorage);\n }\n}\n","import type { YjsType } from \"../types\";\nimport type { YjsBuilder } from \"./builder\";\nimport { CrdtYjsDocFactory } from \"./CrdtYjsDocFactory\";\n\nexport const doc = <TStorage extends Record<string, YjsType<any, any>>>(\n value: (buidler: YjsBuilder) => TStorage = () => ({}) as TStorage,\n): CrdtYjsDocFactory<TStorage> => {\n return new CrdtYjsDocFactory<TStorage>(value);\n};\n","import { Map as YMap } from \"yjs\";\nimport type { YjsType } from \"../types\";\n\nexport class YjsMap<T extends unknown>\n extends YMap<T>\n implements YjsType<YMap<T>, Record<string, T>>\n{\n public initialValue?: readonly (readonly [key: string, value: T])[];\n\n constructor(value: readonly (readonly [key: string, value: T])[] = []) {\n super(value);\n\n this.initialValue = value;\n }\n\n public __pluvType(): any {\n return {} as any;\n }\n}\n","import type { Map as YMap } from \"yjs\";\nimport type { YjsType } from \"../types\";\nimport { YjsMap } from \"./YjsMap\";\n\nexport const map = <T extends unknown>(\n value: readonly (readonly [key: string, value: T])[] = [],\n): YjsType<YMap<T>, Record<string, T>> => {\n return new YjsMap<T>(value) as YjsType<YMap<T>, Record<string, T>>;\n};\n","import type { CrdtType, IOLike, PluvRouterEventConfig, RoomLike } from \"@pluv/types\";\nimport { StorageState } from \"@pluv/types\";\nimport { ObservableV2 } from \"lib0/observable\";\nimport type { Doc as YDoc } from \"yjs\";\nimport type { PluvYjsAwareness } from \"../awareness\";\nimport { awareness } from \"../awareness\";\nimport type { YjsProviderStatus } from \"../types\";\n\nexport interface PluvYjsProviderParams<\n TIO extends IOLike<any, any, any>,\n TPresence extends Record<string, any>,\n TStorage extends Record<string, CrdtType<any, any>>,\n TEvents extends PluvRouterEventConfig,\n TField extends keyof TPresence | null = null,\n> {\n presenceField?: TField;\n room: RoomLike<TIO, YDoc, TPresence, TStorage, TEvents>;\n}\n\n/**\n * !HACK\n * @description This doesn't really do anything but emit states in a Yjs.Provider compatible way.\n * Connections and document syncing are handled by the PluvRoom already.\n * @date May 13, 2025\n */\nexport class PluvYjsProvider<\n TIO extends IOLike<any, any, any>,\n TPresence extends Record<string, any>,\n TStorage extends Record<string, CrdtType<any, any>>,\n TEvents extends PluvRouterEventConfig,\n TField extends keyof TPresence | null = null,\n> extends ObservableV2<{\n \"connection-close\": (\n event: CloseEvent | null,\n provider: PluvYjsProvider<TIO, TPresence, TStorage, TEvents, TField>,\n ) => void;\n \"connection-error\": (\n event: Event,\n provider: PluvYjsProvider<TIO, TPresence, TStorage, TEvents, TField>,\n ) => void;\n status: (event: { status: YjsProviderStatus }) => void;\n sync: (state: boolean) => void;\n synced: (state: boolean) => void;\n}> {\n public readonly awareness: PluvYjsAwareness<TIO, TPresence, TStorage, TEvents, TField>;\n public readonly doc: YDoc;\n\n private readonly _room: RoomLike<TIO, YDoc, TPresence, TStorage, TEvents>;\n private readonly _unsubscribe: () => void;\n\n private _synced: boolean = false;\n\n constructor(params: PluvYjsProviderParams<TIO, TPresence, TStorage, TEvents, TField>) {\n super();\n\n const { presenceField, room } = params;\n\n this.awareness = awareness({ presenceField, room });\n this.doc = room.getDoc().value;\n\n this._room = room;\n\n const subscriptions = [\n this._room.subscribe.connection(({ storage }) => {\n const status = this._toProviderStatus(storage.state);\n\n if (!status) return;\n\n this.emit(\"status\", [{ status }]);\n }),\n this._room.addEventListener(\"close\", (event) => {\n this.emit(\"connection-close\", [event, this]);\n }),\n this._room.addEventListener(\"error\", (event) => {\n this.emit(\"connection-error\", [event, this]);\n }),\n ];\n\n this._unsubscribe = subscriptions.reduce(\n (fn, unsubscribe) => () => {\n fn();\n unsubscribe();\n },\n () => undefined,\n );\n }\n\n public get synced(): boolean {\n return this._synced;\n }\n\n public set synced(state: boolean) {\n if (this._synced === state) return;\n\n this._synced = state;\n this.emit(\"sync\", [state]);\n this.emit(\"synced\", [state]);\n }\n\n public destroy(): void {\n this.awareness.destroy();\n this._unsubscribe();\n super.destroy();\n }\n\n private _toProviderStatus(state: StorageState): YjsProviderStatus | null {\n switch (state) {\n case StorageState.Loading: {\n return \"connecting\";\n }\n case StorageState.Unavailable: {\n return \"disconnected\";\n }\n case StorageState.Offline:\n case StorageState.Synced: {\n return \"connected\";\n }\n default:\n return null;\n }\n }\n\n /**\n * !HACK\n * @description We dgaf about these, since the room manages these already. We're just mirroring\n * the fields that exist in the og provider to make sure everything aligns.\n * @see https://github.com/yjs/y-websocket/blob/master/src/y-websocket.js\n * @date May 13, 2025\n */\n public connect(): void {}\n public disconnect(): void {}\n}\n","import type { CrdtType, IOLike, PluvRouterEventConfig } from \"@pluv/types\";\nimport type { PluvYjsProviderParams } from \"./PluvYjsProvider\";\nimport { PluvYjsProvider } from \"./PluvYjsProvider\";\n\nexport const provider = <\n TIO extends IOLike<any, any, any>,\n TPresence extends Record<string, any>,\n TStorage extends Record<string, CrdtType<any, any>>,\n TEvents extends PluvRouterEventConfig,\n TField extends keyof TPresence | null = null,\n>(\n params: PluvYjsProviderParams<TIO, TPresence, TStorage, TEvents, TField>,\n) => {\n return new PluvYjsProvider(params);\n};\n","import { Text as YText } from \"yjs\";\nimport type { YjsType } from \"../types\";\n\nexport class YjsText extends YText implements YjsType<YText, string> {\n public initialValue?: string;\n\n constructor(value: string = \"\") {\n super();\n\n this.initialValue = value;\n }\n\n public __pluvType() {\n return {} as unknown as any;\n }\n}\n","import type { Text as YText } from \"yjs\";\nimport type { YjsType } from \"../types\";\nimport { YjsText } from \"./YjsText\";\n\nexport const text = (value: string = \"\"): YjsType<YText, string> => {\n return new YjsText(value);\n};\n","import type { XmlText as YXmlText } from \"yjs\";\nimport { XmlElement as YXmlElement } from \"yjs\";\nimport type { YjsType } from \"../types\";\n\nexport class YjsXmlElement<T extends Record<string, any> = Record<string, any>>\n extends YXmlElement<T>\n implements YjsType<YXmlElement, string>\n{\n public initialValue?: (YXmlElement | YXmlText)[] | readonly (YXmlElement | YXmlText)[];\n\n constructor(\n name: string,\n value: (YXmlElement | YXmlText)[] | readonly (YXmlElement | YXmlText)[],\n ) {\n super(name);\n\n if (!!value.length) this.insert(0, value as (YXmlElement | YXmlText)[]);\n\n this.initialValue = value;\n }\n\n public __pluvType() {\n return {} as unknown as any;\n }\n}\n","import type { XmlText as YXmlText, XmlElement as YXmlElement } from \"yjs\";\nimport { YjsXmlElement } from \"./YjsXmlElement\";\n\nexport const xmlElement = <T extends Record<string, any> = Record<string, any>>(\n name: string,\n children: (YXmlElement | YXmlText)[] | readonly (YXmlElement | YXmlText)[],\n): YjsXmlElement<T> => {\n return new YjsXmlElement<T>(name, children);\n};\n","import type { XmlText as YXmlText, XmlElement as YXmlElement } from \"yjs\";\nimport { XmlFragment as YXmlFragment } from \"yjs\";\nimport type { YjsType } from \"../types\";\n\nexport class YjsXmlFragment extends YXmlFragment implements YjsType<YXmlFragment, string> {\n public initialValue?: (YXmlElement | YXmlText)[] | readonly (YXmlElement | YXmlText)[];\n\n constructor(value: (YXmlElement | YXmlText)[] | readonly (YXmlElement | YXmlText)[]) {\n super();\n\n if (!!value.length) this.insert(0, value as (YXmlElement | YXmlText)[]);\n\n this.initialValue = value;\n }\n\n public __pluvType() {\n return {} as unknown as any;\n }\n}\n","import type { XmlElement as YXmlElement, XmlText as YXmlText } from \"yjs\";\nimport { YjsXmlFragment } from \"./YjsXmlFragment\";\n\nexport const xmlFragment = (\n children: (YXmlElement | YXmlText)[] | readonly (YXmlElement | YXmlText)[],\n): YjsXmlFragment => {\n return new YjsXmlFragment(children);\n};\n","import { XmlText as YXmlText } from \"yjs\";\nimport type { YjsType } from \"../types\";\n\nexport class YjsXmlText extends YXmlText implements YjsType<YXmlText, string> {\n public initialValue?: string;\n\n constructor(value: string = \"\") {\n super();\n\n this.initialValue = value;\n }\n\n public __pluvType() {\n return {} as unknown as any;\n }\n}\n","import type { XmlText as YXmlText } from \"yjs\";\nimport { YjsType } from \"../types\";\nimport { YjsXmlText } from \"./YjsXmlText\";\n\nexport const xmlText = (): YjsType<YXmlText, string> => {\n return new YjsXmlText();\n};\n","export { array } from \"./array\";\nexport { awareness } from \"./awareness\";\nexport { doc } from \"./doc\";\nexport type { YjsBuilder } from \"./doc\";\nexport { map } from \"./map\";\nexport { provider } from \"./provider\";\nexport { text } from \"./text\";\nexport type { YjsType } from \"./types\";\nexport { xmlElement } from \"./xmlElement\";\nexport { xmlFragment } from \"./xmlFragment\";\nexport { xmlText } from \"./xmlText\";\nexport const kind = \"yjs\" as const;\n"],"mappings":"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"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
//#region \0rolldown/runtime.js
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __exportAll = (all, no_symbols) => {
|
|
4
|
-
let target = {};
|
|
5
|
-
for (var name in all) __defProp(target, name, {
|
|
6
|
-
get: all[name],
|
|
7
|
-
enumerable: true
|
|
8
|
-
});
|
|
9
|
-
if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
|
|
10
|
-
return target;
|
|
11
|
-
};
|
|
12
|
-
//#endregion
|
|
13
|
-
export { __exportAll as t };
|