y-rb 0.2.0-x86_64-darwin → 0.3.1-x86_64-darwin
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.
- checksums.yaml +4 -4
- data/ext/yrb/Cargo.toml +1 -1
- data/ext/yrb/src/awareness.rs +26 -41
- data/ext/yrb/src/lib.rs +87 -162
- data/ext/yrb/src/utils.rs +1 -3
- data/ext/yrb/src/yany.rs +1 -1
- data/ext/yrb/src/yarray.rs +24 -54
- data/ext/yrb/src/yawareness.rs +16 -48
- data/ext/yrb/src/ydoc.rs +2 -6
- data/ext/yrb/src/ymap.rs +18 -35
- data/ext/yrb/src/ytext.rs +29 -56
- data/ext/yrb/src/ytransaction.rs +2 -8
- data/ext/yrb/src/yvalue.rs +5 -11
- data/ext/yrb/src/yxml_element.rs +44 -65
- data/ext/yrb/src/yxml_text.rs +26 -47
- data/lib/2.7/yrb.bundle +0 -0
- data/lib/3.0/yrb.bundle +0 -0
- data/lib/3.1/yrb.bundle +0 -0
- data/lib/y/array.rb +2 -0
- data/lib/y/awareness.rb +139 -25
- data/lib/y/doc.rb +1 -1
- data/lib/y/map.rb +2 -0
- data/lib/y/text.rb +1 -1
- data/lib/y/version.rb +1 -1
- data/lib/y/xml.rb +5 -2
- data/lib/y-rb.rb +2 -0
- metadata +5 -5
data/ext/yrb/src/yxml_element.rs
CHANGED
@@ -23,45 +23,39 @@ impl YXmlElement {
|
|
23
23
|
pub(crate) fn yxml_element_get(&self, index: u32) -> Option<Value> {
|
24
24
|
self.0.borrow().get(index).map(|node| match node {
|
25
25
|
Xml::Element(el) => Value::from(YXmlElement(RefCell::from(el))),
|
26
|
-
Xml::Text(text) => Value::from(YXmlText(RefCell::from(text)))
|
26
|
+
Xml::Text(text) => Value::from(YXmlText(RefCell::from(text))),
|
27
27
|
})
|
28
28
|
}
|
29
|
-
pub(crate) fn yxml_element_get_attribute(
|
30
|
-
&self,
|
31
|
-
name: String
|
32
|
-
) -> Option<String> {
|
29
|
+
pub(crate) fn yxml_element_get_attribute(&self, name: String) -> Option<String> {
|
33
30
|
self.0.borrow().get_attribute(&*name)
|
34
31
|
}
|
35
32
|
pub(crate) fn yxml_element_insert_attribute(
|
36
33
|
&self,
|
37
34
|
transaction: &YTransaction,
|
38
35
|
name: String,
|
39
|
-
value: String
|
36
|
+
value: String,
|
40
37
|
) {
|
41
|
-
self.0
|
42
|
-
|
43
|
-
name,
|
44
|
-
value
|
45
|
-
);
|
38
|
+
self.0
|
39
|
+
.borrow_mut()
|
40
|
+
.insert_attribute(&mut *transaction.0.borrow_mut(), name, value);
|
46
41
|
}
|
47
42
|
pub(crate) fn yxml_element_insert_element(
|
48
43
|
&self,
|
49
44
|
transaction: &YTransaction,
|
50
45
|
index: u32,
|
51
|
-
name: String
|
46
|
+
name: String,
|
52
47
|
) -> YXmlElement {
|
53
|
-
let element =
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
);
|
48
|
+
let element =
|
49
|
+
self.0
|
50
|
+
.borrow_mut()
|
51
|
+
.insert_elem(&mut *transaction.0.borrow_mut(), index, name);
|
58
52
|
|
59
53
|
YXmlElement(RefCell::from(element))
|
60
54
|
}
|
61
55
|
pub(crate) fn yxml_element_insert_text(
|
62
56
|
&self,
|
63
57
|
transaction: &YTransaction,
|
64
|
-
index: u32
|
58
|
+
index: u32,
|
65
59
|
) -> YXmlText {
|
66
60
|
let text = self
|
67
61
|
.0
|
@@ -73,19 +67,18 @@ impl YXmlElement {
|
|
73
67
|
pub(crate) fn yxml_element_next_sibling(&self) -> Option<Value> {
|
74
68
|
self.0.borrow().next_sibling().map(|item| match item {
|
75
69
|
Xml::Element(el) => Value::from(YXmlElement(RefCell::from(el))),
|
76
|
-
Xml::Text(text) => Value::from(YXmlText(RefCell::from(text)))
|
70
|
+
Xml::Text(text) => Value::from(YXmlText(RefCell::from(text))),
|
77
71
|
})
|
78
72
|
}
|
79
|
-
pub(crate) fn yxml_element_observe(
|
80
|
-
&self,
|
81
|
-
block: Proc
|
82
|
-
) -> Result<u32, Error> {
|
73
|
+
pub(crate) fn yxml_element_observe(&self, block: Proc) -> Result<u32, Error> {
|
83
74
|
let change_added = Symbol::new("added").to_static();
|
84
75
|
let change_retain = Symbol::new("retain").to_static();
|
85
76
|
let change_removed = Symbol::new("removed").to_static();
|
86
77
|
|
87
|
-
let subscription_id = self
|
88
|
-
|
78
|
+
let subscription_id = self
|
79
|
+
.0
|
80
|
+
.borrow_mut()
|
81
|
+
.observe(move |transaction, xml_element_event| {
|
89
82
|
let delta = xml_element_event.delta(transaction);
|
90
83
|
let changes = RArray::with_capacity(delta.len());
|
91
84
|
|
@@ -103,9 +96,9 @@ impl YXmlElement {
|
|
103
96
|
.aset(change_added, RArray::from_vec(values))
|
104
97
|
.expect("cannot create change::added payload");
|
105
98
|
|
106
|
-
changes
|
107
|
-
|
108
|
-
|
99
|
+
changes
|
100
|
+
.push(payload)
|
101
|
+
.expect("cannot push payload to list of changes");
|
109
102
|
}
|
110
103
|
Change::Retain(position) => {
|
111
104
|
let payload = RHash::new();
|
@@ -113,19 +106,19 @@ impl YXmlElement {
|
|
113
106
|
.aset(change_retain, *position)
|
114
107
|
.expect("cannot create change::retain payload");
|
115
108
|
|
116
|
-
changes
|
117
|
-
|
118
|
-
|
109
|
+
changes
|
110
|
+
.push(payload)
|
111
|
+
.expect("cannot push payload to list of changes");
|
119
112
|
}
|
120
113
|
Change::Removed(position) => {
|
121
114
|
let payload = RHash::new();
|
122
|
-
payload
|
123
|
-
|
124
|
-
|
115
|
+
payload
|
116
|
+
.aset(change_removed, *position)
|
117
|
+
.expect("cannot create change::removed payload");
|
125
118
|
|
126
|
-
changes
|
127
|
-
|
128
|
-
|
119
|
+
changes
|
120
|
+
.push(payload)
|
121
|
+
.expect("cannot push payload to list of changes");
|
129
122
|
}
|
130
123
|
}
|
131
124
|
}
|
@@ -133,8 +126,7 @@ impl YXmlElement {
|
|
133
126
|
block
|
134
127
|
.call::<(RArray,), Value>((changes,))
|
135
128
|
.expect("cannot call block");
|
136
|
-
}
|
137
|
-
);
|
129
|
+
});
|
138
130
|
|
139
131
|
Ok(subscription_id.into())
|
140
132
|
}
|
@@ -147,13 +139,13 @@ impl YXmlElement {
|
|
147
139
|
pub(crate) fn yxml_element_prev_sibling(&self) -> Option<Value> {
|
148
140
|
self.0.borrow().prev_sibling().map(|item| match item {
|
149
141
|
Xml::Element(el) => Value::from(YXmlElement(RefCell::from(el))),
|
150
|
-
Xml::Text(text) => Value::from(YXmlText(RefCell::from(text)))
|
142
|
+
Xml::Text(text) => Value::from(YXmlText(RefCell::from(text))),
|
151
143
|
})
|
152
144
|
}
|
153
145
|
pub(crate) fn yxml_element_push_element_back(
|
154
146
|
&self,
|
155
147
|
transaction: &YTransaction,
|
156
|
-
name: String
|
148
|
+
name: String,
|
157
149
|
) -> YXmlElement {
|
158
150
|
let xml_element = self
|
159
151
|
.0
|
@@ -165,7 +157,7 @@ impl YXmlElement {
|
|
165
157
|
pub(crate) fn yxml_element_push_element_front(
|
166
158
|
&self,
|
167
159
|
transaction: &YTransaction,
|
168
|
-
name: String
|
160
|
+
name: String,
|
169
161
|
) -> YXmlElement {
|
170
162
|
let xml_element = self
|
171
163
|
.0
|
@@ -174,10 +166,7 @@ impl YXmlElement {
|
|
174
166
|
|
175
167
|
YXmlElement(RefCell::from(xml_element))
|
176
168
|
}
|
177
|
-
pub(crate) fn yxml_element_push_text_back(
|
178
|
-
&self,
|
179
|
-
transaction: &YTransaction
|
180
|
-
) -> YXmlText {
|
169
|
+
pub(crate) fn yxml_element_push_text_back(&self, transaction: &YTransaction) -> YXmlText {
|
181
170
|
let xml_text = self
|
182
171
|
.0
|
183
172
|
.borrow_mut()
|
@@ -185,10 +174,7 @@ impl YXmlElement {
|
|
185
174
|
|
186
175
|
YXmlText(RefCell::from(xml_text))
|
187
176
|
}
|
188
|
-
pub(crate) fn yxml_element_push_text_front(
|
189
|
-
&self,
|
190
|
-
transaction: &YTransaction
|
191
|
-
) -> YXmlText {
|
177
|
+
pub(crate) fn yxml_element_push_text_front(&self, transaction: &YTransaction) -> YXmlText {
|
192
178
|
let xml_text = self
|
193
179
|
.0
|
194
180
|
.borrow_mut()
|
@@ -196,27 +182,20 @@ impl YXmlElement {
|
|
196
182
|
|
197
183
|
YXmlText(RefCell::from(xml_text))
|
198
184
|
}
|
199
|
-
pub(crate) fn yxml_element_remove_attribute(
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
) {
|
204
|
-
self.0.borrow_mut().remove_attribute::<&str>(
|
205
|
-
&mut *transaction.0.borrow_mut(),
|
206
|
-
&name.as_str()
|
207
|
-
);
|
185
|
+
pub(crate) fn yxml_element_remove_attribute(&self, transaction: &YTransaction, name: String) {
|
186
|
+
self.0
|
187
|
+
.borrow_mut()
|
188
|
+
.remove_attribute::<&str>(&mut *transaction.0.borrow_mut(), &name.as_str());
|
208
189
|
}
|
209
190
|
pub(crate) fn yxml_element_remove_range(
|
210
191
|
&self,
|
211
192
|
transaction: &YTransaction,
|
212
193
|
index: u32,
|
213
|
-
length: u32
|
194
|
+
length: u32,
|
214
195
|
) {
|
215
|
-
self.0
|
216
|
-
|
217
|
-
index,
|
218
|
-
length
|
219
|
-
);
|
196
|
+
self.0
|
197
|
+
.borrow_mut()
|
198
|
+
.remove_range(&mut *transaction.0.borrow_mut(), index, length);
|
220
199
|
}
|
221
200
|
pub(crate) fn yxml_element_size(&self) -> u32 {
|
222
201
|
self.0.borrow().len()
|
data/ext/yrb/src/yxml_text.rs
CHANGED
@@ -21,53 +21,38 @@ impl YXmlText {
|
|
21
21
|
transaction: &YTransaction,
|
22
22
|
index: u32,
|
23
23
|
length: u32,
|
24
|
-
attrs: RHash
|
24
|
+
attrs: RHash,
|
25
25
|
) -> Result<(), Error> {
|
26
26
|
map_rhash_to_attrs(attrs).map(|a| {
|
27
|
-
self.0
|
28
|
-
|
29
|
-
index,
|
30
|
-
length,
|
31
|
-
a
|
32
|
-
);
|
27
|
+
self.0
|
28
|
+
.borrow_mut()
|
29
|
+
.format(&mut *transaction.0.borrow_mut(), index, length, a);
|
33
30
|
})
|
34
31
|
}
|
35
|
-
pub(crate) fn yxml_text_get_attribute(
|
36
|
-
&self,
|
37
|
-
name: String
|
38
|
-
) -> Option<String> {
|
32
|
+
pub(crate) fn yxml_text_get_attribute(&self, name: String) -> Option<String> {
|
39
33
|
self.0.borrow().get_attribute(&*name)
|
40
34
|
}
|
41
|
-
pub(crate) fn yxml_text_insert(
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
content: String
|
46
|
-
) {
|
47
|
-
self.0.borrow_mut().insert(
|
48
|
-
&mut *transaction.0.borrow_mut(),
|
49
|
-
index,
|
50
|
-
&*content
|
51
|
-
)
|
35
|
+
pub(crate) fn yxml_text_insert(&self, transaction: &YTransaction, index: u32, content: String) {
|
36
|
+
self.0
|
37
|
+
.borrow_mut()
|
38
|
+
.insert(&mut *transaction.0.borrow_mut(), index, &*content)
|
52
39
|
}
|
53
40
|
pub(crate) fn yxml_text_insert_attribute(
|
54
41
|
&self,
|
55
42
|
transaction: &YTransaction,
|
56
43
|
name: String,
|
57
|
-
value: String
|
44
|
+
value: String,
|
58
45
|
) {
|
59
|
-
self.0
|
60
|
-
|
61
|
-
name,
|
62
|
-
value
|
63
|
-
)
|
46
|
+
self.0
|
47
|
+
.borrow_mut()
|
48
|
+
.insert_attribute(&mut *transaction.0.borrow_mut(), name, value)
|
64
49
|
}
|
65
50
|
pub(crate) fn yxml_text_insert_embed_with_attributes(
|
66
51
|
&self,
|
67
52
|
transaction: &YTransaction,
|
68
53
|
index: u32,
|
69
54
|
content: Value,
|
70
|
-
attrs: RHash
|
55
|
+
attrs: RHash,
|
71
56
|
) -> Result<(), Error> {
|
72
57
|
let yvalue = YValue::from(content);
|
73
58
|
let avalue = Any::from(yvalue);
|
@@ -77,7 +62,7 @@ impl YXmlText {
|
|
77
62
|
&mut *transaction.0.borrow_mut(),
|
78
63
|
index,
|
79
64
|
avalue,
|
80
|
-
a
|
65
|
+
a,
|
81
66
|
);
|
82
67
|
})
|
83
68
|
}
|
@@ -85,12 +70,12 @@ impl YXmlText {
|
|
85
70
|
&self,
|
86
71
|
transaction: &YTransaction,
|
87
72
|
index: u32,
|
88
|
-
embed: Value
|
73
|
+
embed: Value,
|
89
74
|
) {
|
90
75
|
self.0.borrow_mut().insert_embed(
|
91
76
|
&mut *transaction.0.borrow_mut(),
|
92
77
|
index,
|
93
|
-
Any::from(YValue::from(embed))
|
78
|
+
Any::from(YValue::from(embed)),
|
94
79
|
)
|
95
80
|
}
|
96
81
|
pub(crate) fn yxml_text_insert_with_attributes(
|
@@ -98,14 +83,14 @@ impl YXmlText {
|
|
98
83
|
transaction: &YTransaction,
|
99
84
|
index: u32,
|
100
85
|
content: String,
|
101
|
-
attrs: RHash
|
86
|
+
attrs: RHash,
|
102
87
|
) -> Result<(), Error> {
|
103
88
|
map_rhash_to_attrs(attrs).map(|a| {
|
104
89
|
self.0.borrow_mut().insert_with_attributes(
|
105
90
|
&mut *transaction.0.borrow_mut(),
|
106
91
|
index,
|
107
92
|
&*content,
|
108
|
-
a
|
93
|
+
a,
|
109
94
|
);
|
110
95
|
})
|
111
96
|
}
|
@@ -115,7 +100,7 @@ impl YXmlText {
|
|
115
100
|
pub(crate) fn yxml_text_next_sibling(&self) -> Option<Value> {
|
116
101
|
self.0.borrow().next_sibling().map(|item| match item {
|
117
102
|
Xml::Element(el) => Value::from(YXmlElement(RefCell::from(el))),
|
118
|
-
Xml::Text(text) => Value::from(YXmlText(RefCell::from(text)))
|
103
|
+
Xml::Text(text) => Value::from(YXmlText(RefCell::from(text))),
|
119
104
|
})
|
120
105
|
}
|
121
106
|
pub(crate) fn yxml_text_parent(&self) -> Option<Value> {
|
@@ -127,14 +112,10 @@ impl YXmlText {
|
|
127
112
|
pub(crate) fn yxml_text_prev_sibling(&self) -> Option<Value> {
|
128
113
|
self.0.borrow().prev_sibling().map(|item| match item {
|
129
114
|
Xml::Element(el) => Value::from(YXmlElement(RefCell::from(el))),
|
130
|
-
Xml::Text(text) => Value::from(YXmlText(RefCell::from(text)))
|
115
|
+
Xml::Text(text) => Value::from(YXmlText(RefCell::from(text))),
|
131
116
|
})
|
132
117
|
}
|
133
|
-
pub(crate) fn yxml_text_push(
|
134
|
-
&self,
|
135
|
-
transaction: &YTransaction,
|
136
|
-
content: String
|
137
|
-
) {
|
118
|
+
pub(crate) fn yxml_text_push(&self, transaction: &YTransaction, content: String) {
|
138
119
|
self.0
|
139
120
|
.borrow_mut()
|
140
121
|
.push(&mut *transaction.0.borrow_mut(), &*content)
|
@@ -143,13 +124,11 @@ impl YXmlText {
|
|
143
124
|
&self,
|
144
125
|
transaction: &YTransaction,
|
145
126
|
index: u32,
|
146
|
-
length: u32
|
127
|
+
length: u32,
|
147
128
|
) {
|
148
|
-
self.0
|
149
|
-
|
150
|
-
index,
|
151
|
-
length
|
152
|
-
);
|
129
|
+
self.0
|
130
|
+
.borrow_mut()
|
131
|
+
.remove_range(&mut *transaction.0.borrow_mut(), index, length);
|
153
132
|
}
|
154
133
|
pub(crate) fn yxml_text_to_s(&self) -> String {
|
155
134
|
self.0.borrow().to_string()
|
data/lib/2.7/yrb.bundle
CHANGED
Binary file
|
data/lib/3.0/yrb.bundle
CHANGED
Binary file
|
data/lib/3.1/yrb.bundle
CHANGED
Binary file
|
data/lib/y/array.rb
CHANGED
data/lib/y/awareness.rb
CHANGED
@@ -1,53 +1,172 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Y
|
4
|
+
# The Awareness class implements a simple shared state protocol that can be
|
5
|
+
# used for non-persistent data like awareness information (cursor, username,
|
6
|
+
# status, ..). Each client can update its own local state and listen to state
|
7
|
+
# changes of remote clients.
|
8
|
+
#
|
9
|
+
# Each client is identified by a unique client id (something we borrow from
|
10
|
+
# doc.client_id). A client can override its own state by propagating a message
|
11
|
+
# with an increasing timestamp (clock). If such a message is received, it is
|
12
|
+
# applied if the known state of that client is older than the new state
|
13
|
+
# (`clock < new_clock`). If a client thinks that a remote client is offline,
|
14
|
+
# it may propagate a message with `{ clock, state: null, client }`. If such a
|
15
|
+
# message is received, and the known clock of that client equals the received
|
16
|
+
# clock, it will clean the state.
|
17
|
+
#
|
18
|
+
# Before a client disconnects, it should propagate a null state with an
|
19
|
+
# updated clock.
|
20
|
+
#
|
21
|
+
# Awareness is an integral part of collaborative applications, you can read
|
22
|
+
# more about the concept here: https://docs.yjs.dev/getting-started/adding-awareness
|
23
|
+
#
|
24
|
+
# @example Instantiate awareness instance and encode update for broadcast
|
25
|
+
# local_state = {
|
26
|
+
# editing: { field: "description", pos: 0 },
|
27
|
+
# name: "Hannes Moser"
|
28
|
+
# }.to_json
|
29
|
+
#
|
30
|
+
# awareness = Y::Awareness.new
|
31
|
+
# awareness.local_state = local_state
|
32
|
+
# awareness.diff # [1,227,245,175,195,11,1,65,123, …]
|
33
|
+
#
|
34
|
+
#
|
4
35
|
class Awareness
|
5
|
-
|
6
|
-
|
36
|
+
# Applies an incoming update. This gets the local awareness instance in
|
37
|
+
# sync with changes from another client. i.e., updates the state of another
|
38
|
+
# user in the local awareness instance.
|
39
|
+
#
|
40
|
+
# @example Apply an incoming update
|
41
|
+
# update = [1,227,245,175,195,11,1,65,123, …]
|
42
|
+
#
|
43
|
+
# awareness = Y::Awareness.new
|
44
|
+
# awareness.sync(update)
|
45
|
+
#
|
46
|
+
# @param [Array<Integer>] diff A binary encoded update
|
47
|
+
# @return [void]
|
48
|
+
def sync(diff)
|
49
|
+
yawareness_apply_update(diff)
|
7
50
|
end
|
8
51
|
|
52
|
+
# Clears out a state of a current client, effectively marking it as
|
53
|
+
# disconnected.
|
54
|
+
#
|
55
|
+
# @return [void]
|
9
56
|
def clean_local_state
|
10
57
|
yawareness_clean_local_state
|
11
58
|
end
|
12
59
|
|
60
|
+
# Returns a globally unique client ID of an underlying Doc.
|
61
|
+
#
|
62
|
+
# @return [Integer] Returns the client_id of the local user
|
13
63
|
def client_id
|
14
64
|
yawareness_client_id
|
15
65
|
end
|
16
66
|
|
67
|
+
# Returns a state map of all of the clients tracked by current Awareness
|
68
|
+
# instance. Those states are identified by their corresponding ClientIDs.
|
69
|
+
# The associated state is represented and replicated to other clients as a
|
70
|
+
# JSON string.
|
71
|
+
#
|
72
|
+
# @example Instantiate awareness instance and encode update for broadcast
|
73
|
+
# local_state = {
|
74
|
+
# editing: { field: "description", pos: 0 },
|
75
|
+
# name: "Hannes Moser"
|
76
|
+
# }.to_json
|
77
|
+
#
|
78
|
+
# awareness = Y::Awareness.new
|
79
|
+
# awareness.local_state = local_state
|
80
|
+
# awareness.clients # {312134501=>"{\"editing\":{\"field\":\"descriptio …
|
81
|
+
#
|
82
|
+
# @return [Hash] All clients and their current state
|
17
83
|
def clients
|
18
84
|
yawareness_clients
|
19
85
|
end
|
20
86
|
|
87
|
+
# Returns a JSON string state representation of a current Awareness
|
88
|
+
# instance.
|
89
|
+
#
|
90
|
+
# @example Create local state and inspect it
|
91
|
+
# local_state = {
|
92
|
+
# editing: { field: "description", pos: 0 },
|
93
|
+
# name: "Hannes Moser"
|
94
|
+
# }.to_json
|
95
|
+
#
|
96
|
+
# awareness = Y::Awareness.new
|
97
|
+
# awareness.local_state = local_state
|
98
|
+
# local_state # "{\"editing\":{\"field\":\"description\",\"pos\":0}, …
|
99
|
+
#
|
100
|
+
# @return [String] The current state of the local client
|
21
101
|
def local_state
|
22
102
|
yawareness_local_state
|
23
103
|
end
|
24
104
|
|
105
|
+
# Sets a current Awareness instance state to a corresponding JSON string.
|
106
|
+
# This state will be replicated to other clients as part of the
|
107
|
+
# AwarenessUpdate.
|
108
|
+
#
|
109
|
+
# @example Set local state
|
110
|
+
# local_state = {
|
111
|
+
# editing: { field: "description", pos: 0 },
|
112
|
+
# name: "Hannes Moser"
|
113
|
+
# }.to_json
|
114
|
+
#
|
115
|
+
# awareness = Y::Awareness.new
|
116
|
+
# awareness.local_state = local_state
|
117
|
+
#
|
118
|
+
# @return [void]
|
25
119
|
def local_state=(json)
|
26
120
|
yawareness_set_local_state(json)
|
27
121
|
end
|
28
122
|
|
123
|
+
# Subscribes to changes
|
124
|
+
#
|
125
|
+
# @return [Integer] The subscription ID
|
29
126
|
def attach(callback, &block)
|
30
127
|
return yawareness_on_update(callback) unless callback.nil?
|
31
128
|
|
32
129
|
yawareness_on_update(block.to_proc) unless block.nil?
|
33
130
|
end
|
34
131
|
|
132
|
+
# Unsubscribe from changes
|
133
|
+
#
|
134
|
+
# @param [Integer] subscription_id
|
135
|
+
# @return [void]
|
35
136
|
def detach(subscription_id)
|
36
137
|
yawareness_remove_on_update(subscription_id)
|
37
138
|
end
|
38
139
|
|
140
|
+
# Clears out a state of a given client, effectively marking it as
|
141
|
+
# disconnected.
|
142
|
+
#
|
143
|
+
# @param [Integer] client_id Clears the state for given client_id
|
144
|
+
# @return [void]
|
39
145
|
def remove_state(client_id)
|
40
146
|
yawareness_remove_state(client_id)
|
41
147
|
end
|
42
148
|
|
43
|
-
|
149
|
+
# Returns a serializable update object which is representation of a current
|
150
|
+
# Awareness state.
|
151
|
+
#
|
152
|
+
# @return [::Array<Integer>] Binary encoded update of the local instance
|
153
|
+
def diff
|
44
154
|
yawareness_update
|
45
155
|
end
|
46
156
|
|
47
|
-
|
157
|
+
# Returns a serializable update object which is representation of a current
|
158
|
+
# Awareness state. Unlike Awareness::update, this method variant allows to
|
159
|
+
# prepare update only for a subset of known clients. These clients must all
|
160
|
+
# be known to a current Awareness instance, otherwise a
|
161
|
+
# Error::ClientNotFound error will be returned.
|
162
|
+
#
|
163
|
+
# @param [::Array<Integer>] clients A list of client IDs
|
164
|
+
# @return [String] Binary encoded update including all given client IDs
|
165
|
+
def diff_with_clients(*clients)
|
48
166
|
yawareness_update_with_clients(clients)
|
49
167
|
end
|
50
168
|
|
169
|
+
# rubocop:disable Lint/UselessAccessModifier
|
51
170
|
private
|
52
171
|
|
53
172
|
# @!method yawareness_apply_update(update)
|
@@ -56,6 +175,12 @@ module Y
|
|
56
175
|
# @param [Y::AwarenessUpdate] A structure that represents an encodable state
|
57
176
|
# of an Awareness struct.
|
58
177
|
|
178
|
+
# @!method yawareness_apply_update(update)
|
179
|
+
# Applies an update
|
180
|
+
#
|
181
|
+
# @param [Y::AwarenessUpdate] A structure that represents an encodable state
|
182
|
+
# of an Awareness struct.
|
183
|
+
|
59
184
|
# @!method yawareness_clean_local_state
|
60
185
|
# Clears out a state of a current client , effectively marking it as
|
61
186
|
# disconnected.
|
@@ -90,7 +215,7 @@ module Y
|
|
90
215
|
# Clears out a state of a given client, effectively marking it as
|
91
216
|
# disconnected.
|
92
217
|
#
|
93
|
-
# @param [Integer] A Client ID
|
218
|
+
# @param [Integer] client_id A Client ID
|
94
219
|
# @return [String|nil] Returns a JSON string state representation of a
|
95
220
|
# current Awareness instance.
|
96
221
|
|
@@ -118,35 +243,24 @@ module Y
|
|
118
243
|
# These clients must all be known to a current Awareness instance,
|
119
244
|
# otherwise an error will be returned.
|
120
245
|
#
|
121
|
-
# @param [Array<Integer>]
|
122
|
-
# @return [
|
246
|
+
# @param [::Array<Integer>] clients
|
247
|
+
# @return [::Array<Integer>] A serialized (binary encoded) update object
|
248
|
+
|
249
|
+
# rubocop:enable Lint/UselessAccessModifier
|
123
250
|
end
|
124
251
|
|
125
|
-
# rubocop:disable Lint/
|
252
|
+
# rubocop:disable Lint/UselessAccessModifier
|
126
253
|
class AwarenessEvent
|
127
254
|
private
|
128
255
|
|
129
256
|
# @!method added
|
130
|
-
# @return [Array<Integer>] Added clients
|
257
|
+
# @return [::Array<Integer>] Added clients
|
131
258
|
|
132
259
|
# @!method updated
|
133
|
-
# @return [Array<Integer>] Updated clients
|
260
|
+
# @return [::Array<Integer>] Updated clients
|
134
261
|
|
135
262
|
# @!method removed
|
136
|
-
# @return [Array<Integer>] Removed clients
|
137
|
-
end
|
138
|
-
# rubocop:enable Lint/EmptyClass
|
139
|
-
|
140
|
-
class AwarenessUpdate
|
141
|
-
def encode
|
142
|
-
yawareness_update_encode
|
143
|
-
end
|
144
|
-
|
145
|
-
private
|
146
|
-
|
147
|
-
# @!method yawareness_update_encode
|
148
|
-
# Encode the awareness state for simple transport
|
149
|
-
#
|
150
|
-
# @return [Array<Integer>] Encoded update
|
263
|
+
# @return [::Array<Integer>] Removed clients
|
151
264
|
end
|
265
|
+
# rubocop:enable Lint/UselessAccessModifier
|
152
266
|
end
|
data/lib/y/doc.rb
CHANGED
data/lib/y/map.rb
CHANGED
data/lib/y/text.rb
CHANGED
@@ -115,7 +115,7 @@ module Y
|
|
115
115
|
# - Hash (where the the types of key and values must be supported)
|
116
116
|
#
|
117
117
|
# @param [Integer] index
|
118
|
-
# @param [String,
|
118
|
+
# @param [String, Numeric, Array, Hash] value
|
119
119
|
# @param [Hash|nil] attrs
|
120
120
|
# @return [void]
|
121
121
|
def insert(index, value, attrs = nil)
|
data/lib/y/version.rb
CHANGED