Compare commits
1 Commits
v13.0.0-10
...
v13.0.0-9
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c9634da316 |
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "yjs",
|
||||
"version": "13.0.0-10",
|
||||
"version": "13.0.0-9",
|
||||
"description": "A framework for real-time p2p shared editing on any data",
|
||||
"main": "./y.node.js",
|
||||
"browser": "./y.js",
|
||||
|
||||
@@ -156,24 +156,22 @@ export default function extendConnector (Y/* :any */) {
|
||||
sendSyncStep1(this, syncUser)
|
||||
} else {
|
||||
if (!conn.isSynced) {
|
||||
conn._fireIsSyncedListeners()
|
||||
this.y.db.requestTransaction(function * () {
|
||||
if (!conn.isSynced) {
|
||||
// it is crucial that isSynced is set at the time garbageCollectAfterSync is called
|
||||
conn.isSynced = true
|
||||
// It is safer to remove this!
|
||||
// TODO: remove: yield * this.garbageCollectAfterSync()
|
||||
// call whensynced listeners
|
||||
for (var f of conn.whenSyncedListeners) {
|
||||
f()
|
||||
}
|
||||
conn.whenSyncedListeners = []
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
_fireIsSyncedListeners () {
|
||||
this.y.db.whenTransactionsFinished().then(() => {
|
||||
if (!this.isSynced) {
|
||||
this.isSynced = true
|
||||
// It is safer to remove this!
|
||||
// TODO: remove: yield * this.garbageCollectAfterSync()
|
||||
// call whensynced listeners
|
||||
for (var f of this.whenSyncedListeners) {
|
||||
f()
|
||||
}
|
||||
this.whenSyncedListeners = []
|
||||
}
|
||||
})
|
||||
}
|
||||
send (uid, buffer) {
|
||||
if (!(buffer instanceof ArrayBuffer || buffer instanceof Uint8Array)) {
|
||||
throw new Error('Expected Message to be an ArrayBuffer or Uint8Array - please don\'t use this method to send custom messages')
|
||||
@@ -224,10 +222,10 @@ export default function extendConnector (Y/* :any */) {
|
||||
*/
|
||||
receiveMessage (sender, buffer) {
|
||||
if (!(buffer instanceof ArrayBuffer || buffer instanceof Uint8Array)) {
|
||||
return Promise.reject(new Error('Expected Message to be an ArrayBuffer or Uint8Array!'))
|
||||
throw new Error('Expected Message to be an ArrayBuffer or Uint8Array!')
|
||||
}
|
||||
if (sender === this.userId) {
|
||||
return Promise.resolve()
|
||||
return
|
||||
}
|
||||
let decoder = new BinaryDecoder(buffer)
|
||||
let encoder = new BinaryEncoder()
|
||||
@@ -246,32 +244,29 @@ export default function extendConnector (Y/* :any */) {
|
||||
if (messageType === 'sync step 1' || messageType === 'sync step 2') {
|
||||
let auth = decoder.readVarUint()
|
||||
if (senderConn.auth == null) {
|
||||
senderConn.processAfterAuth.push([messageType, senderConn, decoder, encoder, sender])
|
||||
senderConn.processAfterAuth.push([sender, buffer])
|
||||
|
||||
// check auth
|
||||
return this.checkAuth(auth, this.y, sender).then(authPermissions => {
|
||||
if (senderConn.auth == null) {
|
||||
senderConn.auth = authPermissions
|
||||
this.y.emit('userAuthenticated', {
|
||||
user: senderConn.uid,
|
||||
auth: authPermissions
|
||||
})
|
||||
senderConn.auth = authPermissions
|
||||
this.y.emit('userAuthenticated', {
|
||||
user: senderConn.uid,
|
||||
auth: authPermissions
|
||||
})
|
||||
return senderConn.syncStep2.promise
|
||||
}).then(() => {
|
||||
if (senderConn.processAfterAuth == null) {
|
||||
return Promise.resolve()
|
||||
}
|
||||
let messages = senderConn.processAfterAuth
|
||||
senderConn.processAfterAuth = []
|
||||
|
||||
return messages.reduce((p, m) =>
|
||||
p.then(() => this.computeMessage(m[0], m[1], m[2], m[3], m[4]))
|
||||
, Promise.resolve())
|
||||
senderConn.processAfterAuth = null
|
||||
return Promise.all(messages.map(m =>
|
||||
this.receiveMessage(m[0], m[1])
|
||||
))
|
||||
})
|
||||
}
|
||||
}
|
||||
if (senderConn.auth != null) {
|
||||
return this.computeMessage(messageType, senderConn, decoder, encoder, sender)
|
||||
} else {
|
||||
senderConn.processAfterAuth.push([messageType, senderConn, decoder, encoder, sender])
|
||||
}
|
||||
}
|
||||
computeMessage (messageType, senderConn, decoder, encoder, sender) {
|
||||
|
||||
if (messageType === 'sync step 1' && (senderConn.auth === 'write' || senderConn.auth === 'read')) {
|
||||
// cannot wait for sync step 1 to finish, because we may wait for sync step 2 in sync step 1 (->lock)
|
||||
computeMessageSyncStep1(decoder, encoder, this, senderConn, sender)
|
||||
@@ -281,7 +276,7 @@ export default function extendConnector (Y/* :any */) {
|
||||
} else if (messageType === 'update' && senderConn.auth === 'write') {
|
||||
return computeMessageUpdate(decoder, encoder, this, senderConn, sender)
|
||||
} else {
|
||||
return Promise.reject(new Error('Unable to receive message'))
|
||||
Promise.reject(new Error('Unable to receive message'))
|
||||
}
|
||||
}
|
||||
_setSyncedWith (user) {
|
||||
@@ -293,9 +288,6 @@ export default function extendConnector (Y/* :any */) {
|
||||
this.currentSyncTarget = null
|
||||
this.findNextSyncTarget()
|
||||
}
|
||||
if (this.role === 'slave' && conn.role === 'master') {
|
||||
this._fireIsSyncedListeners()
|
||||
}
|
||||
}
|
||||
/*
|
||||
Currently, the HB encodes operations as JSON. For the moment I want to keep it
|
||||
|
||||
74
y.node.js
74
y.node.js
@@ -1,7 +1,7 @@
|
||||
|
||||
/**
|
||||
* yjs - A framework for real-time p2p shared editing on any data
|
||||
* @version v13.0.0-10
|
||||
* @version v13.0.0-9
|
||||
* @license MIT
|
||||
*/
|
||||
|
||||
@@ -753,24 +753,22 @@ function extendConnector (Y/* :any */) {
|
||||
sendSyncStep1(this, syncUser);
|
||||
} else {
|
||||
if (!conn.isSynced) {
|
||||
conn._fireIsSyncedListeners();
|
||||
this.y.db.requestTransaction(function * () {
|
||||
if (!conn.isSynced) {
|
||||
// it is crucial that isSynced is set at the time garbageCollectAfterSync is called
|
||||
conn.isSynced = true;
|
||||
// It is safer to remove this!
|
||||
// TODO: remove: yield * this.garbageCollectAfterSync()
|
||||
// call whensynced listeners
|
||||
for (var f of conn.whenSyncedListeners) {
|
||||
f();
|
||||
}
|
||||
conn.whenSyncedListeners = [];
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
_fireIsSyncedListeners () {
|
||||
this.y.db.whenTransactionsFinished().then(() => {
|
||||
if (!this.isSynced) {
|
||||
this.isSynced = true;
|
||||
// It is safer to remove this!
|
||||
// TODO: remove: yield * this.garbageCollectAfterSync()
|
||||
// call whensynced listeners
|
||||
for (var f of this.whenSyncedListeners) {
|
||||
f();
|
||||
}
|
||||
this.whenSyncedListeners = [];
|
||||
}
|
||||
});
|
||||
}
|
||||
send (uid, buffer) {
|
||||
if (!(buffer instanceof ArrayBuffer || buffer instanceof Uint8Array)) {
|
||||
throw new Error('Expected Message to be an ArrayBuffer or Uint8Array - please don\'t use this method to send custom messages')
|
||||
@@ -821,10 +819,10 @@ function extendConnector (Y/* :any */) {
|
||||
*/
|
||||
receiveMessage (sender, buffer) {
|
||||
if (!(buffer instanceof ArrayBuffer || buffer instanceof Uint8Array)) {
|
||||
return Promise.reject(new Error('Expected Message to be an ArrayBuffer or Uint8Array!'))
|
||||
throw new Error('Expected Message to be an ArrayBuffer or Uint8Array!')
|
||||
}
|
||||
if (sender === this.userId) {
|
||||
return Promise.resolve()
|
||||
return
|
||||
}
|
||||
let decoder = new BinaryDecoder(buffer);
|
||||
let encoder = new BinaryEncoder();
|
||||
@@ -843,32 +841,29 @@ function extendConnector (Y/* :any */) {
|
||||
if (messageType === 'sync step 1' || messageType === 'sync step 2') {
|
||||
let auth = decoder.readVarUint();
|
||||
if (senderConn.auth == null) {
|
||||
senderConn.processAfterAuth.push([messageType, senderConn, decoder, encoder, sender]);
|
||||
senderConn.processAfterAuth.push([sender, buffer]);
|
||||
|
||||
// check auth
|
||||
return this.checkAuth(auth, this.y, sender).then(authPermissions => {
|
||||
if (senderConn.auth == null) {
|
||||
senderConn.auth = authPermissions;
|
||||
this.y.emit('userAuthenticated', {
|
||||
user: senderConn.uid,
|
||||
auth: authPermissions
|
||||
});
|
||||
senderConn.auth = authPermissions;
|
||||
this.y.emit('userAuthenticated', {
|
||||
user: senderConn.uid,
|
||||
auth: authPermissions
|
||||
});
|
||||
return senderConn.syncStep2.promise
|
||||
}).then(() => {
|
||||
if (senderConn.processAfterAuth == null) {
|
||||
return Promise.resolve()
|
||||
}
|
||||
let messages = senderConn.processAfterAuth;
|
||||
senderConn.processAfterAuth = [];
|
||||
|
||||
return messages.reduce((p, m) =>
|
||||
p.then(() => this.computeMessage(m[0], m[1], m[2], m[3], m[4]))
|
||||
, Promise.resolve())
|
||||
senderConn.processAfterAuth = null;
|
||||
return Promise.all(messages.map(m =>
|
||||
this.receiveMessage(m[0], m[1])
|
||||
))
|
||||
})
|
||||
}
|
||||
}
|
||||
if (senderConn.auth != null) {
|
||||
return this.computeMessage(messageType, senderConn, decoder, encoder, sender)
|
||||
} else {
|
||||
senderConn.processAfterAuth.push([messageType, senderConn, decoder, encoder, sender]);
|
||||
}
|
||||
}
|
||||
computeMessage (messageType, senderConn, decoder, encoder, sender) {
|
||||
|
||||
if (messageType === 'sync step 1' && (senderConn.auth === 'write' || senderConn.auth === 'read')) {
|
||||
// cannot wait for sync step 1 to finish, because we may wait for sync step 2 in sync step 1 (->lock)
|
||||
computeMessageSyncStep1(decoder, encoder, this, senderConn, sender);
|
||||
@@ -878,7 +873,7 @@ function extendConnector (Y/* :any */) {
|
||||
} else if (messageType === 'update' && senderConn.auth === 'write') {
|
||||
return computeMessageUpdate(decoder, encoder, this, senderConn, sender)
|
||||
} else {
|
||||
return Promise.reject(new Error('Unable to receive message'))
|
||||
Promise.reject(new Error('Unable to receive message'));
|
||||
}
|
||||
}
|
||||
_setSyncedWith (user) {
|
||||
@@ -890,9 +885,6 @@ function extendConnector (Y/* :any */) {
|
||||
this.currentSyncTarget = null;
|
||||
this.findNextSyncTarget();
|
||||
}
|
||||
if (this.role === 'slave' && conn.role === 'master') {
|
||||
this._fireIsSyncedListeners();
|
||||
}
|
||||
}
|
||||
/*
|
||||
Currently, the HB encodes operations as JSON. For the moment I want to keep it
|
||||
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user