diff --git a/package-lock.json b/package-lock.json index 426cc09..dc58615 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "y-webrtc", - "version": "10.2.6", + "version": "10.3.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "y-webrtc", - "version": "10.2.6", + "version": "10.3.0", "license": "MIT", "dependencies": { "lib0": "^0.2.42", diff --git a/package.json b/package.json index 84b16aa..e820186 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "y-webrtc", - "version": "10.2.6", + "version": "10.3.0", "description": "WebRTC provider for Yjs", "type": "module", "main": "./dist/y-webrtc.cjs", diff --git a/src/y-webrtc.js b/src/y-webrtc.js index 91a77c3..ca4b1f8 100644 --- a/src/y-webrtc.js +++ b/src/y-webrtc.js @@ -4,7 +4,7 @@ import * as error from 'lib0/error' import * as random from 'lib0/random' import * as encoding from 'lib0/encoding' import * as decoding from 'lib0/decoding' -import { Observable } from 'lib0/observable' +import { ObservableV2 } from 'lib0/observable' import * as logging from 'lib0/logging' import * as promise from 'lib0/promise' import * as bc from 'lib0/broadcastchannel' @@ -179,7 +179,7 @@ export class WebrtcConn { this.connected = false this.synced = false /** - * @type {any} + * @type {import('simple-peer').Instance} */ this.peer = new Peer({ initiator, ...room.provider.peerOpts }) this.peer.on('signal', signal => { @@ -342,9 +342,9 @@ export class Room { * Listens to Yjs updates and sends them to remote peers * * @param {Uint8Array} update - * @param {any} origin + * @param {any} _origin */ - this._docUpdateHandler = (update, origin) => { + this._docUpdateHandler = (update, _origin) => { const encoder = encoding.createEncoder() encoding.writeVarUint(encoder, messageSync) syncProtocol.writeUpdate(encoder, update) @@ -354,9 +354,9 @@ export class Room { * Listens to Awareness updates and sends them to remote peers * * @param {any} changed - * @param {any} origin + * @param {any} _origin */ - this._awarenessUpdateHandler = ({ added, updated, removed }, origin) => { + this._awarenessUpdateHandler = ({ added, updated, removed }, _origin) => { const changedClients = added.concat(updated).concat(removed) const encoderAwareness = encoding.createEncoder() encoding.writeVarUint(encoderAwareness, messageAwareness) @@ -566,13 +566,29 @@ export class SignalingConn extends ws.WebsocketClient { * @property {awarenessProtocol.Awareness} [awareness] * @property {number} [maxConns] * @property {boolean} [filterBcConns] - * @property {any} [peerOpts] + * @property {import('simple-peer').SimplePeer['config']} [peerOpts] */ /** - * @extends Observable + * @param {WebrtcProvider} provider + */ +const emitStatus = provider => { + provider.emit('status', [{ + connected: provider.connected + }]) +} + +/** + * @typedef {Object} WebrtcProviderEvents + * @property {function({connected:boolean}):void} WebrtcProviderEvent.status + * @property {function({synced:boolean}):void} WebrtcProviderEvent.synced + * @property {function({added:Array,removed:Array,webrtcPeers:Array,bcPeers:Array}):void} WebrtcProviderEvent.peers + */ + +/** + * @extends ObservableV2 */ -export class WebrtcProvider extends Observable { +export class WebrtcProvider extends ObservableV2 { /** * @param {string} roomName * @param {Y.Doc} doc @@ -618,6 +634,7 @@ export class WebrtcProvider extends Observable { } else { this.room.disconnect() } + emitStatus(this) }) this.connect() this.destroy = this.destroy.bind(this) @@ -625,6 +642,15 @@ export class WebrtcProvider extends Observable { } /** + * Indicates whether the provider is looking for other peers. + * + * Other peers can be found via signaling servers or via broadcastchannel (cross browser-tab + * communication). You never know when you are connected to all peers. You also don't know if + * there are other peers. connected doesn't mean that you are connected to any physical peers + * working on the same resource as you. It does not change unless you call provider.disconnect() + * + * `this.on('status', (event) => { console.log(event.connected) })` + * * @type {boolean} */ get connected () { @@ -640,6 +666,7 @@ export class WebrtcProvider extends Observable { }) if (this.room) { this.room.connect() + emitStatus(this) } } @@ -654,6 +681,7 @@ export class WebrtcProvider extends Observable { }) if (this.room) { this.room.disconnect() + emitStatus(this) } }