diff --git a/README.md b/README.md index 9b9dc22..ceaf98e 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,24 @@ Peers using the same signalling server will find each other. You can specify sev const provider = new WebrtcProvider('prosemirror', ydoc, { signalling: ['wss://y-webrtc-ckynwnzncc.now.sh', 'ws://localhost:4444'] }) ``` +### Logging + +`y-webrtc` uses the `lib0/logging.js` logging library. By default this library disables logging. You can enable it by specifying the `log` environment / localStorage variable: + +```js +// enable logging for all modules +localStorage.log = 'true' +// enable logging only for y-webrtc +localStorage.log = 'y-webrtc' +// by specifying a regex variables +localStorage.log = '^y.*' +``` + +```sh +# enable y-webrtc logging in nodejs +DEBUG='y-webrtc' node index.js +``` + ## License Yjs is licensed under the [MIT License](./LICENSE). diff --git a/package-lock.json b/package-lock.json index 9b11ae1..cd0a2cc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -789,8 +789,7 @@ "get-browser-rtc": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/get-browser-rtc/-/get-browser-rtc-1.0.2.tgz", - "integrity": "sha1-u81AyEUaftTvXDc7gWmkCd0dEdk=", - "dev": true + "integrity": "sha1-u81AyEUaftTvXDc7gWmkCd0dEdk=" }, "get-stdin": { "version": "6.0.0", @@ -894,8 +893,7 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "inquirer": { "version": "5.2.0", @@ -1074,10 +1072,9 @@ } }, "lib0": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.1.4.tgz", - "integrity": "sha512-SYuWdjePgd59jd24BdRZeJ9mA/82InL2lE6ED2os+n5LUE6NoWmMxeAlNRTYahHBbJakdcpf/d0wULC4oFAX1w==", - "dev": true + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.1.5.tgz", + "integrity": "sha512-BsbgxGUp38sPqD+OmmmAVSuWh8f9EQ3RXVa7oGOlW8ux+UtPeKT5uSKvyFM3ufD2DDUk/epYxM5cc//zwYBE9Q==" }, "load-json-file": { "version": "2.0.0", @@ -1164,8 +1161,7 @@ "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" }, "mute-stream": { "version": "0.0.7", @@ -1423,14 +1419,12 @@ "queue-microtask": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.1.2.tgz", - "integrity": "sha512-F9wwNePtXrzZenAB3ax0Y8TSKGvuB7Qw16J30hspEUTbfUM+H827XyN3rlpwhVmtm5wuZtbKIHjOnwDn7MUxWQ==", - "dev": true + "integrity": "sha512-F9wwNePtXrzZenAB3ax0Y8TSKGvuB7Qw16J30hspEUTbfUM+H827XyN3rlpwhVmtm5wuZtbKIHjOnwDn7MUxWQ==" }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, "requires": { "safe-buffer": "^5.1.0" } @@ -1466,7 +1460,6 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", - "dev": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -1645,8 +1638,7 @@ "safe-buffer": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", - "dev": true + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" }, "safer-buffer": { "version": "2.1.2", @@ -1691,7 +1683,6 @@ "version": "9.6.2", "resolved": "https://registry.npmjs.org/simple-peer/-/simple-peer-9.6.2.tgz", "integrity": "sha512-EOKoImCaqtNvXIntxT1CBBK/3pVi7tMAoJ3shdyd9qk3zLm3QPiRLb/sPC1G2xvKJkJc5fkQjCXqRZ0AknwTig==", - "dev": true, "requires": { "debug": "^4.0.1", "get-browser-rtc": "^1.0.0", @@ -1704,7 +1695,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, "requires": { "ms": "^2.1.1" } @@ -1831,7 +1821,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, "requires": { "safe-buffer": "~5.2.0" } @@ -1950,8 +1939,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "validate-npm-package-license": { "version": "3.0.4", diff --git a/package.json b/package.json index e12ec2f..79023ba 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ }, "dependencies": { "simple-peer": "^9.6.2", - "lib0": "^0.1.4" + "lib0": "^0.1.5" }, "devDependencies": { "rollup": "^1.27.8", @@ -50,7 +50,7 @@ "rollup-plugin-terser": "^5.1.2", "standard": "^12.0.1", "y-protocols": "^0.1.0", - "lib0": "^0.1.4", + "lib0": "^0.1.5", "yjs": "13.0.0-102" }, "peerDependenies": { diff --git a/src/y-webrtc.js b/src/y-webrtc.js index e45cdd3..4200692 100644 --- a/src/y-webrtc.js +++ b/src/y-webrtc.js @@ -11,6 +11,10 @@ import Peer from 'simple-peer/simplepeer.min.js' import * as syncProtocol from 'y-protocols/sync.js' import * as awarenessProtocol from 'y-protocols/awareness.js' +import * as logging from 'lib0/logging.js' + +const log = logging.createModuleLogger('y-webrtc') + const messageSync = 0 const messageQueryAwareness = 3 const messageAwareness = 1 @@ -44,6 +48,7 @@ const checkIsSynced = webrtcRoom => { if ((!synced && webrtcRoom.synced) || (synced && !webrtcRoom.synced)) { webrtcRoom.synced = synced webrtcRoom.provider.emit('synced', [{ synced }]) + log('synced ', logging.BOLD, webrtcRoom.name, logging.UNBOLD, ' with all peers') } } @@ -71,6 +76,7 @@ const readPeerMessage = (peerConn, buf) => { const syncMessageType = syncProtocol.readSyncMessage(decoder, encoder, doc, webrtcRoom.provider) if (syncMessageType === syncProtocol.messageYjsSyncStep2 && !webrtcRoom.synced) { peerConn.syncedRooms.add(roomName) + log('synced ', logging.BOLD, roomName, logging.UNBOLD, ' with ', logging.BOLD, peerConn.remotePeerId) checkIsSynced(webrtcRoom) } if (syncMessageType === syncProtocol.messageYjsSyncStep1) { @@ -122,6 +128,7 @@ export class WebrtcConn { * @param {Array} announcedTopics */ constructor (signalingConn, initiator, remotePeerId, announcedTopics) { + log('establishing connection to ', logging.BOLD, remotePeerId) this.remotePeerId = remotePeerId this.closed = false this.connected = false @@ -137,6 +144,7 @@ export class WebrtcConn { signalingConn.send({ type: 'publish', topics: announcedTopics, to: remotePeerId, from: peerId, messageType: 'signal', data }) }) this.peer.on('connect', () => { + log('connected to ', logging.BOLD, remotePeerId) this.connected = true announcedTopics.forEach(roomName => { const room = webrtcRooms.get(roomName) @@ -172,8 +180,10 @@ export class WebrtcConn { checkIsSynced(room) }) this.peer.destroy() + log('closed connection to ', logging.BOLD, remotePeerId) }) - this.peer.on('error', () => { + this.peer.on('error', err => { + log('error in connection to ', logging.BOLD, remotePeerId, ': ', err) this.connected = false this.closed = true }) @@ -232,6 +242,8 @@ export class SignallingConn extends ws.WebsocketClient { } } }) + this.on('connect', () => log(`connected (${url})`)) + this.on('disconnect', () => log(`disconnect (${url})`)) } /** * @param {Array} rooms @@ -255,7 +267,7 @@ export class WebrtcProvider extends Observable { * @param {Object} [opts] * @param {Array} [opts.signalling] */ - constructor (room, doc, { signalling = ['wss://y-webrtc-hrxsloqrim.now.sh'] } = {}) { + constructor (room, doc, { signalling = ['wss://y-webrtc-hrxsloqrim.now.sh', 'wss://y-webrtc-signalling-eu.herokuapp.com', 'wss://y-webrtc-signalling-us.herokuapp.com/'] } = {}) { super() this.room = room this.doc = doc