From 28605c1307e1c1e4ba65c83d615c277b34ca8937 Mon Sep 17 00:00:00 2001 From: Byron Duvall Date: Tue, 21 Nov 2023 12:00:17 -0500 Subject: [PATCH 01/12] add a web pubsub client that extends SignalingConn --- ...webrtc-azure-webpubsub-signaling-client.js | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 src/y-webrtc-azure-webpubsub-signaling-client.js diff --git a/src/y-webrtc-azure-webpubsub-signaling-client.js b/src/y-webrtc-azure-webpubsub-signaling-client.js new file mode 100644 index 0000000..d831fc6 --- /dev/null +++ b/src/y-webrtc-azure-webpubsub-signaling-client.js @@ -0,0 +1,71 @@ +import { WebrtcProvider, SignalingConn, publishSignalingMessage } from 'y-webrtc' +import { WebPubSubClient } from "@azure/web-pubsub-client" + +export class AzureWebPubSubSignalingConn extends SignalingConn { + constructor (url) { + super(url) + this.connected = false + } + + setupClient() { + this.client = new WebPubSubClient(this.url) + this.client.on('connected', e => { + this.connected = true + log(`connected (${url}) with ID ${e.connectionId}`) + // Join all the groups. + const groups = Array.from(rooms.keys()) + groups.forEach(group => + this.subscribe(group) + ) + rooms.forEach(room => + publishSignalingMessage(this, room, { type: 'announce', from: room.peerId }) + ) + }) + this.client.on('disconnected', e => log(`disconnect (${url}): ${e.message}`)) + this.client.on('stopped', () => log(`stopped (${url})`)) + // Set an event handler for group messages before connecting, so we don't miss any. + this.client.on('group-message', e => { + this.handleMessage(e.message.group, e.message.data) + }) + // Connect to the signaling server. + this.client.start() + } + + connected () { + return this.connected + } + + subscribe (roomName) { + this.client.joinGroup(roomName) + } + + unsubscribe (roomName) { + this.client.leaveGroup(roomName) + } + + publish (roomName, message) { + let messageType = "json" + if (typeof message === 'string') { + messageType = "text" + } + this.client.sendToGroup(roomName, message, messageType) + } + + destroy () { + this.client.stop() + } +} + +export class AzureWebPubSubSignalingWebrtcProvider extends WebrtcProvider { + connect () { + this.shouldConnect = true + this.signalingUrls.forEach(url => { + const signalingConn = map.setIfUndefined(signalingConns, url, () => new SignalingConn(url)) + this.signalingConns.push(signalingConn) + signalingConn.providers.add(this) + }) + if (this.room) { + this.room.connect() + } + } +} \ No newline at end of file From 2c804af4f39dc46a8511cb039933ac00893e09e6 Mon Sep 17 00:00:00 2001 From: Byron Duvall Date: Tue, 21 Nov 2023 12:05:26 -0500 Subject: [PATCH 02/12] change signaling conn class name --- src/y-webrtc-azure-webpubsub-signaling-client.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/y-webrtc-azure-webpubsub-signaling-client.js b/src/y-webrtc-azure-webpubsub-signaling-client.js index d831fc6..3ee2af9 100644 --- a/src/y-webrtc-azure-webpubsub-signaling-client.js +++ b/src/y-webrtc-azure-webpubsub-signaling-client.js @@ -60,7 +60,7 @@ export class AzureWebPubSubSignalingWebrtcProvider extends WebrtcProvider { connect () { this.shouldConnect = true this.signalingUrls.forEach(url => { - const signalingConn = map.setIfUndefined(signalingConns, url, () => new SignalingConn(url)) + const signalingConn = map.setIfUndefined(signalingConns, url, () => new AzureWebPubSubSignalingConn(url)) this.signalingConns.push(signalingConn) signalingConn.providers.add(this) }) From 8c47d0f1ce96030f3be90858d0c0dee09bd687d4 Mon Sep 17 00:00:00 2001 From: Byron Duvall Date: Tue, 21 Nov 2023 12:22:53 -0500 Subject: [PATCH 03/12] add azure web pubsub client back --- package-lock.json | 91 +++++++++++++++++++++++++++++++++++++++++++++++ package.json | 1 + 2 files changed, 92 insertions(+) diff --git a/package-lock.json b/package-lock.json index 426cc09..cf29580 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "10.2.6", "license": "MIT", "dependencies": { + "@azure/web-pubsub-client": "^1.0.0-beta.3", "lib0": "^0.2.42", "simple-peer": "^9.11.0", "y-protocols": "^1.0.6" @@ -43,6 +44,96 @@ "yjs": "^13.6.8" } }, + "node_modules/@azure/abort-controller": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz", + "integrity": "sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==", + "dependencies": { + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@azure/abort-controller/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@azure/core-util": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.6.1.tgz", + "integrity": "sha512-h5taHeySlsV9qxuK64KZxy4iln1BtMYlNt5jbuEFN3UFSAd1EwKg/Gjl5a6tZ/W8t6li3xPnutOx7zbDyXnPmQ==", + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@azure/core-util/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@azure/logger": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.0.4.tgz", + "integrity": "sha512-ustrPY8MryhloQj7OWGe+HrYx+aoiOxzbXTtgblbV3xwCqpzUK36phH3XNHQKj3EPonyFUuDTfR3qFhTEAuZEg==", + "dependencies": { + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@azure/logger/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@azure/web-pubsub-client": { + "version": "1.0.0-beta.3", + "resolved": "https://registry.npmjs.org/@azure/web-pubsub-client/-/web-pubsub-client-1.0.0-beta.3.tgz", + "integrity": "sha512-Vp/WOvXU2dbTP49TfPogWJKhYmZYq3rfyeS5mpysAvTaBkkYyu6IjEavsnpx9+tbDNuv1hucjhfhH1zdpS0PAQ==", + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-util": "^1.1.1", + "@azure/logger": "^1.0.0", + "buffer": "^6.0.0", + "tslib": "^2.2.0", + "ws": "^7.4.5" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@azure/web-pubsub-client/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/@azure/web-pubsub-client/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/@babel/code-frame": { "version": "7.22.13", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", diff --git a/package.json b/package.json index 84b16aa..1b93541 100644 --- a/package.json +++ b/package.json @@ -58,6 +58,7 @@ ] }, "dependencies": { + "@azure/web-pubsub-client": "^1.0.0-beta.3", "lib0": "^0.2.42", "simple-peer": "^9.11.0", "y-protocols": "^1.0.6" From ab02bf84d2680486a70a8804fd4798573b530f88 Mon Sep 17 00:00:00 2001 From: Byron Duvall Date: Wed, 22 Nov 2023 09:30:58 -0500 Subject: [PATCH 04/12] update lib0 --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index cf29580..aa89486 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2467,9 +2467,9 @@ } }, "node_modules/lib0": { - "version": "0.2.87", - "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.87.tgz", - "integrity": "sha512-TbB63XJixvNToW2IHWAFsCJj9tVnajmwjE14p69i51Rx8byOQd2IP4ourE8v4d7vhyO++nVm1sQk3ePslfbucg==", + "version": "0.2.88", + "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.88.tgz", + "integrity": "sha512-KyroiEvCeZcZEMx5Ys+b4u4eEBbA1ch7XUaBhYpwa/nPMrzTjUhI4RfcytmQfYoTBPcdyx+FX6WFNIoNuJzJfQ==", "dependencies": { "isomorphic.js": "^0.2.4" }, From eaac2cc176113d2d07bf5062abce427b0c8c123e Mon Sep 17 00:00:00 2001 From: Byron Duvall Date: Wed, 22 Nov 2023 09:58:20 -0500 Subject: [PATCH 05/12] add AzureWebPubSubSignalingWebrtcProvider and AzureWebPubSubSignalingConn --- src/y-webrtc.js | 76 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/src/y-webrtc.js b/src/y-webrtc.js index 5b6ed9f..ffc1387 100644 --- a/src/y-webrtc.js +++ b/src/y-webrtc.js @@ -20,6 +20,10 @@ import * as awarenessProtocol from 'y-protocols/awareness' import * as cryptoutils from './crypto.js' +import { WebPubSubClient } from "@azure/web-pubsub-client" + +/** @typedef {import("@azure/web-pubsub-client").WebPubSubDataType} WebPubSubDataType */ + const log = logging.createModuleLogger('y-webrtc') const messageSync = 0 @@ -699,3 +703,75 @@ export class WebrtcProvider extends Observable { super.destroy() } } + +export class AzureWebPubSubSignalingConn extends SignalingConn { + constructor (url) { + super(url) + /** @private */ + this.clientConnected = false + } + + setupClient() { + /** @private */ + this.webPubSubClient = new WebPubSubClient(this.url) + this.webPubSubClient.on('connected', e => { + this.clientConnected = true + log(`connected (${this.url}) with ID ${e.connectionId}`) + // Join all the groups. + const groups = Array.from(rooms.keys()) + groups.forEach(group => + this.subscribe(group) + ) + rooms.forEach(room => + publishSignalingMessage(this, room, { type: 'announce', from: room.peerId }) + ) + }) + this.webPubSubClient.on('disconnected', e => log(`disconnect (${this.url}): ${e.message}`)) + this.webPubSubClient.on('stopped', () => log(`stopped (${this.url})`)) + // Set an event handler for group messages before connecting, so we don't miss any. + this.webPubSubClient.on('group-message', e => { + this.handleMessage(e.message.group, e.message.data) + }) + // Connect to the signaling server. + this.webPubSubClient.start() + } + + connected () { + return this.clientConnected + } + + subscribe (roomName) { + this.webPubSubClient.joinGroup(roomName) + } + + unsubscribe (roomName) { + this.webPubSubClient.leaveGroup(roomName) + } + + publish (roomName, message) { + /** @type {WebPubSubDataType} */ + let messageType = "json" + if (typeof message === 'string') { + messageType = "text" + } + this.webPubSubClient.sendToGroup(roomName, message, messageType) + } + + destroy () { + this.webPubSubClient.stop() + } +} + +export class AzureWebPubSubSignalingWebrtcProvider extends WebrtcProvider { + connect () { + this.shouldConnect = true + this.signalingUrls.forEach(url => { + const signalingConn = map.setIfUndefined(signalingConns, url, () => new AzureWebPubSubSignalingConn(url)) + this.signalingConns.push(signalingConn) + signalingConn.providers.add(this) + }) + if (this.room) { + this.room.connect() + } + } +} From 7d6a619ed020933b88d835b99ae9b1eebb9c5de1 Mon Sep 17 00:00:00 2001 From: Byron Duvall Date: Wed, 22 Nov 2023 10:23:48 -0500 Subject: [PATCH 06/12] remove old js file for azure client --- ...webrtc-azure-webpubsub-signaling-client.js | 71 ------------------- 1 file changed, 71 deletions(-) delete mode 100644 src/y-webrtc-azure-webpubsub-signaling-client.js diff --git a/src/y-webrtc-azure-webpubsub-signaling-client.js b/src/y-webrtc-azure-webpubsub-signaling-client.js deleted file mode 100644 index 3ee2af9..0000000 --- a/src/y-webrtc-azure-webpubsub-signaling-client.js +++ /dev/null @@ -1,71 +0,0 @@ -import { WebrtcProvider, SignalingConn, publishSignalingMessage } from 'y-webrtc' -import { WebPubSubClient } from "@azure/web-pubsub-client" - -export class AzureWebPubSubSignalingConn extends SignalingConn { - constructor (url) { - super(url) - this.connected = false - } - - setupClient() { - this.client = new WebPubSubClient(this.url) - this.client.on('connected', e => { - this.connected = true - log(`connected (${url}) with ID ${e.connectionId}`) - // Join all the groups. - const groups = Array.from(rooms.keys()) - groups.forEach(group => - this.subscribe(group) - ) - rooms.forEach(room => - publishSignalingMessage(this, room, { type: 'announce', from: room.peerId }) - ) - }) - this.client.on('disconnected', e => log(`disconnect (${url}): ${e.message}`)) - this.client.on('stopped', () => log(`stopped (${url})`)) - // Set an event handler for group messages before connecting, so we don't miss any. - this.client.on('group-message', e => { - this.handleMessage(e.message.group, e.message.data) - }) - // Connect to the signaling server. - this.client.start() - } - - connected () { - return this.connected - } - - subscribe (roomName) { - this.client.joinGroup(roomName) - } - - unsubscribe (roomName) { - this.client.leaveGroup(roomName) - } - - publish (roomName, message) { - let messageType = "json" - if (typeof message === 'string') { - messageType = "text" - } - this.client.sendToGroup(roomName, message, messageType) - } - - destroy () { - this.client.stop() - } -} - -export class AzureWebPubSubSignalingWebrtcProvider extends WebrtcProvider { - connect () { - this.shouldConnect = true - this.signalingUrls.forEach(url => { - const signalingConn = map.setIfUndefined(signalingConns, url, () => new AzureWebPubSubSignalingConn(url)) - this.signalingConns.push(signalingConn) - signalingConn.providers.add(this) - }) - if (this.room) { - this.room.connect() - } - } -} \ No newline at end of file From a42aa09b27ad44b36663dd32cd8fd7447e005a6f Mon Sep 17 00:00:00 2001 From: Byron Duvall Date: Wed, 22 Nov 2023 17:17:33 -0500 Subject: [PATCH 07/12] don't export publishSignalingMessage --- src/y-webrtc.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/y-webrtc.js b/src/y-webrtc.js index ffc1387..ca1220f 100644 --- a/src/y-webrtc.js +++ b/src/y-webrtc.js @@ -467,7 +467,7 @@ const openRoom = (doc, provider, name, key) => { * @param {Room} room * @param {any} data */ -export const publishSignalingMessage = (conn, room, data) => { +const publishSignalingMessage = (conn, room, data) => { if (room.key) { cryptoutils.encryptJson(data, room.key).then(data => { conn.publish(room.name, buffer.toBase64(data)) From 8c42918be2956aed6812221dbb5528d72713f7fa Mon Sep 17 00:00:00 2001 From: Byron Duvall Date: Wed, 22 Nov 2023 17:18:48 -0500 Subject: [PATCH 08/12] wrap client creation in undefined check --- src/y-webrtc.js | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/src/y-webrtc.js b/src/y-webrtc.js index ca1220f..7978207 100644 --- a/src/y-webrtc.js +++ b/src/y-webrtc.js @@ -488,21 +488,23 @@ export class SignalingConn { } setupClient() { - this.client = new ws.WebsocketClient(this.url) - this.client.on('connect', () => { - log(`connected (${this.url})`) - const topics = Array.from(rooms.keys()) - this.client.send({ type: 'subscribe', topics }) - this.handleConnect() - }) - this.client.on('message', m => { - switch (m.type) { - case 'publish': { - this.handleMessage(m.topic, m.data) + if (this.client === undefined) { + this.client = new ws.WebsocketClient(this.url) + this.client.on('connect', () => { + log(`connected (${this.url})`) + const topics = Array.from(rooms.keys()) + this.client.send({ type: 'subscribe', topics }) + this.handleConnect() + }) + this.client.on('message', m => { + switch (m.type) { + case 'publish': { + this.handleMessage(m.topic, m.data) + } } - } - }) - this.client.on('disconnect', () => log(`disconnect (${this.url})`)) + }) + this.client.on('disconnect', () => log(`disconnect (${this.url})`)) + } } handleConnect() { From ee548b09b92a7b29d4972cf8bb7bb4d7cbc26a9f Mon Sep 17 00:00:00 2001 From: Byron Duvall Date: Wed, 22 Nov 2023 17:19:25 -0500 Subject: [PATCH 09/12] call handleConnect in child class --- src/y-webrtc.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/y-webrtc.js b/src/y-webrtc.js index 7978207..62c7575 100644 --- a/src/y-webrtc.js +++ b/src/y-webrtc.js @@ -724,9 +724,7 @@ export class AzureWebPubSubSignalingConn extends SignalingConn { groups.forEach(group => this.subscribe(group) ) - rooms.forEach(room => - publishSignalingMessage(this, room, { type: 'announce', from: room.peerId }) - ) + this.handleConnect() }) this.webPubSubClient.on('disconnected', e => log(`disconnect (${this.url}): ${e.message}`)) this.webPubSubClient.on('stopped', () => log(`stopped (${this.url})`)) From 197fdf3455cc547a844dfd0181811fe84413b795 Mon Sep 17 00:00:00 2001 From: Byron Duvall Date: Tue, 28 Nov 2023 15:27:02 -0500 Subject: [PATCH 10/12] bring over changes from ET --- package-lock.json | 126 +++++++++------------------------------- package.json | 5 +- src/y-webrtc.js | 145 +++++++++++++++++++++++----------------------- 3 files changed, 101 insertions(+), 175 deletions(-) diff --git a/package-lock.json b/package-lock.json index aa89486..44dbca2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,6 @@ "version": "10.2.6", "license": "MIT", "dependencies": { - "@azure/web-pubsub-client": "^1.0.0-beta.3", "lib0": "^0.2.42", "simple-peer": "^9.11.0", "y-protocols": "^1.0.6" @@ -28,7 +27,7 @@ "rollup-plugin-terser": "^5.3.1", "standard": "^14.3.4", "typescript": "^4.4.4", - "yjs": "^13.6.8" + "yjs": "file:../prosemirror-base/node_modules/yjs" }, "engines": { "node": ">=12" @@ -41,97 +40,36 @@ "ws": "^8.14.2" }, "peerDependencies": { - "yjs": "^13.6.8" + "yjs": "file:../prosemirror-base/node_modules/yjs" } }, - "node_modules/@azure/abort-controller": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz", - "integrity": "sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==", - "dependencies": { - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@azure/abort-controller/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/@azure/core-util": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.6.1.tgz", - "integrity": "sha512-h5taHeySlsV9qxuK64KZxy4iln1BtMYlNt5jbuEFN3UFSAd1EwKg/Gjl5a6tZ/W8t6li3xPnutOx7zbDyXnPmQ==", - "dependencies": { - "@azure/abort-controller": "^1.0.0", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@azure/core-util/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/@azure/logger": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.0.4.tgz", - "integrity": "sha512-ustrPY8MryhloQj7OWGe+HrYx+aoiOxzbXTtgblbV3xwCqpzUK36phH3XNHQKj3EPonyFUuDTfR3qFhTEAuZEg==", + "../prosemirror-base/node_modules/yjs": { + "version": "13.6.8", + "license": "MIT", "dependencies": { - "tslib": "^2.2.0" + "lib0": "^0.2.74" }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@azure/logger/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/@azure/web-pubsub-client": { - "version": "1.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@azure/web-pubsub-client/-/web-pubsub-client-1.0.0-beta.3.tgz", - "integrity": "sha512-Vp/WOvXU2dbTP49TfPogWJKhYmZYq3rfyeS5mpysAvTaBkkYyu6IjEavsnpx9+tbDNuv1hucjhfhH1zdpS0PAQ==", - "dependencies": { - "@azure/abort-controller": "^1.0.0", - "@azure/core-util": "^1.1.1", - "@azure/logger": "^1.0.0", - "buffer": "^6.0.0", - "tslib": "^2.2.0", - "ws": "^7.4.5" + "devDependencies": { + "@rollup/plugin-commonjs": "^24.0.1", + "@rollup/plugin-node-resolve": "^15.0.1", + "@types/node": "^18.15.5", + "concurrently": "^3.6.1", + "http-server": "^0.12.3", + "jsdoc": "^3.6.7", + "markdownlint-cli": "^0.23.2", + "rollup": "^3.20.0", + "standard": "^16.0.4", + "tui-jsdoc-template": "^1.2.2", + "typescript": "^4.9.5", + "y-protocols": "^1.0.5" }, "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@azure/web-pubsub-client/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/@azure/web-pubsub-client/node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "node": ">=16.0.0", + "npm": ">=8.0.0" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" } }, "node_modules/@babel/code-frame": { @@ -4478,20 +4416,8 @@ } }, "node_modules/yjs": { - "version": "13.6.8", - "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.8.tgz", - "integrity": "sha512-ZPq0hpJQb6f59B++Ngg4cKexDJTvfOgeiv0sBc4sUm8CaBWH7OQC4kcCgrqbjJ/B2+6vO49exvTmYfdlPtcjbg==", - "dependencies": { - "lib0": "^0.2.74" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=8.0.0" - }, - "funding": { - "type": "GitHub Sponsors ❤", - "url": "https://github.com/sponsors/dmonad" - } + "resolved": "../prosemirror-base/node_modules/yjs", + "link": true } } } diff --git a/package.json b/package.json index 1b93541..72b20c3 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,6 @@ ] }, "dependencies": { - "@azure/web-pubsub-client": "^1.0.0-beta.3", "lib0": "^0.2.42", "simple-peer": "^9.11.0", "y-protocols": "^1.0.6" @@ -74,10 +73,10 @@ "rollup-plugin-terser": "^5.3.1", "standard": "^14.3.4", "typescript": "^4.4.4", - "yjs": "^13.6.8" + "yjs": "file:../prosemirror-base/node_modules/yjs" }, "peerDependencies": { - "yjs": "^13.6.8" + "yjs": "file:../prosemirror-base/node_modules/yjs" }, "optionalDependencies": { "ws": "^8.14.2" diff --git a/src/y-webrtc.js b/src/y-webrtc.js index 62c7575..f7af45e 100644 --- a/src/y-webrtc.js +++ b/src/y-webrtc.js @@ -20,9 +20,9 @@ import * as awarenessProtocol from 'y-protocols/awareness' import * as cryptoutils from './crypto.js' -import { WebPubSubClient } from "@azure/web-pubsub-client" +// import { WebPubSubClient } from "@azure/web-pubsub-client" -/** @typedef {import("@azure/web-pubsub-client").WebPubSubDataType} WebPubSubDataType */ +// /** @typedef {import("@azure/web-pubsub-client").WebPubSubDataType} WebPubSubDataType */ const log = logging.createModuleLogger('y-webrtc') @@ -575,7 +575,7 @@ export class SignalingConn { execMessage(data) } } - + connected () { return this.client.connected } @@ -629,6 +629,7 @@ export class WebrtcProvider extends Observable { } = {} ) { super() + console.log('WebrtcProvider instantiated from local y-webrtc package.'); this.roomName = roomName this.doc = doc this.filterBcConns = filterBcConns @@ -706,72 +707,72 @@ export class WebrtcProvider extends Observable { } } -export class AzureWebPubSubSignalingConn extends SignalingConn { - constructor (url) { - super(url) - /** @private */ - this.clientConnected = false - } - - setupClient() { - /** @private */ - this.webPubSubClient = new WebPubSubClient(this.url) - this.webPubSubClient.on('connected', e => { - this.clientConnected = true - log(`connected (${this.url}) with ID ${e.connectionId}`) - // Join all the groups. - const groups = Array.from(rooms.keys()) - groups.forEach(group => - this.subscribe(group) - ) - this.handleConnect() - }) - this.webPubSubClient.on('disconnected', e => log(`disconnect (${this.url}): ${e.message}`)) - this.webPubSubClient.on('stopped', () => log(`stopped (${this.url})`)) - // Set an event handler for group messages before connecting, so we don't miss any. - this.webPubSubClient.on('group-message', e => { - this.handleMessage(e.message.group, e.message.data) - }) - // Connect to the signaling server. - this.webPubSubClient.start() - } - - connected () { - return this.clientConnected - } - - subscribe (roomName) { - this.webPubSubClient.joinGroup(roomName) - } - - unsubscribe (roomName) { - this.webPubSubClient.leaveGroup(roomName) - } - - publish (roomName, message) { - /** @type {WebPubSubDataType} */ - let messageType = "json" - if (typeof message === 'string') { - messageType = "text" - } - this.webPubSubClient.sendToGroup(roomName, message, messageType) - } - - destroy () { - this.webPubSubClient.stop() - } -} - -export class AzureWebPubSubSignalingWebrtcProvider extends WebrtcProvider { - connect () { - this.shouldConnect = true - this.signalingUrls.forEach(url => { - const signalingConn = map.setIfUndefined(signalingConns, url, () => new AzureWebPubSubSignalingConn(url)) - this.signalingConns.push(signalingConn) - signalingConn.providers.add(this) - }) - if (this.room) { - this.room.connect() - } - } -} +// export class AzureWebPubSubSignalingConn extends SignalingConn { +// constructor (url) { +// super(url) +// /** @private */ +// this.clientConnected = false +// } + +// setupClient() { +// /** @private */ +// this.webPubSubClient = new WebPubSubClient(this.url) +// this.webPubSubClient.on('connected', e => { +// this.clientConnected = true +// log(`connected (${this.url}) with ID ${e.connectionId}`) +// // Join all the groups. +// const groups = Array.from(rooms.keys()) +// groups.forEach(group => +// this.subscribe(group) +// ) +// this.handleConnect() +// }) +// this.webPubSubClient.on('disconnected', e => log(`disconnect (${this.url}): ${e.message}`)) +// this.webPubSubClient.on('stopped', () => log(`stopped (${this.url})`)) +// // Set an event handler for group messages before connecting, so we don't miss any. +// this.webPubSubClient.on('group-message', e => { +// this.handleMessage(e.message.group, e.message.data) +// }) +// // Connect to the signaling server. +// this.webPubSubClient.start() +// } + +// connected () { +// return this.clientConnected +// } + +// subscribe (roomName) { +// this.webPubSubClient.joinGroup(roomName) +// } + +// unsubscribe (roomName) { +// this.webPubSubClient.leaveGroup(roomName) +// } + +// publish (roomName, message) { +// /** @type {WebPubSubDataType} */ +// let messageType = "json" +// if (typeof message === 'string') { +// messageType = "text" +// } +// this.webPubSubClient.sendToGroup(roomName, message, messageType) +// } + +// destroy () { +// this.webPubSubClient.stop() +// } +// } + +// export class AzureWebPubSubSignalingWebrtcProvider extends WebrtcProvider { +// connect () { +// this.shouldConnect = true +// this.signalingUrls.forEach(url => { +// const signalingConn = map.setIfUndefined(signalingConns, url, () => new AzureWebPubSubSignalingConn(url)) +// this.signalingConns.push(signalingConn) +// signalingConn.providers.add(this) +// }) +// if (this.room) { +// this.room.connect() +// } +// } +// } From 20bb93b7f2447e4eb393491525282e0359430736 Mon Sep 17 00:00:00 2001 From: Byron Duvall Date: Tue, 28 Nov 2023 17:00:02 -0500 Subject: [PATCH 11/12] uncomment azure client code --- src/y-webrtc.js | 142 ++++++++++++++++++++++++------------------------ 1 file changed, 71 insertions(+), 71 deletions(-) diff --git a/src/y-webrtc.js b/src/y-webrtc.js index f7af45e..024db54 100644 --- a/src/y-webrtc.js +++ b/src/y-webrtc.js @@ -20,9 +20,9 @@ import * as awarenessProtocol from 'y-protocols/awareness' import * as cryptoutils from './crypto.js' -// import { WebPubSubClient } from "@azure/web-pubsub-client" +import { WebPubSubClient } from "@azure/web-pubsub-client" -// /** @typedef {import("@azure/web-pubsub-client").WebPubSubDataType} WebPubSubDataType */ +/** @typedef {import("@azure/web-pubsub-client").WebPubSubDataType} WebPubSubDataType */ const log = logging.createModuleLogger('y-webrtc') @@ -707,72 +707,72 @@ export class WebrtcProvider extends Observable { } } -// export class AzureWebPubSubSignalingConn extends SignalingConn { -// constructor (url) { -// super(url) -// /** @private */ -// this.clientConnected = false -// } - -// setupClient() { -// /** @private */ -// this.webPubSubClient = new WebPubSubClient(this.url) -// this.webPubSubClient.on('connected', e => { -// this.clientConnected = true -// log(`connected (${this.url}) with ID ${e.connectionId}`) -// // Join all the groups. -// const groups = Array.from(rooms.keys()) -// groups.forEach(group => -// this.subscribe(group) -// ) -// this.handleConnect() -// }) -// this.webPubSubClient.on('disconnected', e => log(`disconnect (${this.url}): ${e.message}`)) -// this.webPubSubClient.on('stopped', () => log(`stopped (${this.url})`)) -// // Set an event handler for group messages before connecting, so we don't miss any. -// this.webPubSubClient.on('group-message', e => { -// this.handleMessage(e.message.group, e.message.data) -// }) -// // Connect to the signaling server. -// this.webPubSubClient.start() -// } - -// connected () { -// return this.clientConnected -// } - -// subscribe (roomName) { -// this.webPubSubClient.joinGroup(roomName) -// } - -// unsubscribe (roomName) { -// this.webPubSubClient.leaveGroup(roomName) -// } - -// publish (roomName, message) { -// /** @type {WebPubSubDataType} */ -// let messageType = "json" -// if (typeof message === 'string') { -// messageType = "text" -// } -// this.webPubSubClient.sendToGroup(roomName, message, messageType) -// } - -// destroy () { -// this.webPubSubClient.stop() -// } -// } - -// export class AzureWebPubSubSignalingWebrtcProvider extends WebrtcProvider { -// connect () { -// this.shouldConnect = true -// this.signalingUrls.forEach(url => { -// const signalingConn = map.setIfUndefined(signalingConns, url, () => new AzureWebPubSubSignalingConn(url)) -// this.signalingConns.push(signalingConn) -// signalingConn.providers.add(this) -// }) -// if (this.room) { -// this.room.connect() -// } -// } -// } +export class AzureWebPubSubSignalingConn extends SignalingConn { + constructor (url) { + super(url) + /** @private */ + this.clientConnected = false + } + + setupClient() { + /** @private */ + this.webPubSubClient = new WebPubSubClient(this.url) + this.webPubSubClient.on('connected', e => { + this.clientConnected = true + log(`connected (${this.url}) with ID ${e.connectionId}`) + // Join all the groups. + const groups = Array.from(rooms.keys()) + groups.forEach(group => + this.subscribe(group) + ) + this.handleConnect() + }) + this.webPubSubClient.on('disconnected', e => log(`disconnect (${this.url}): ${e.message}`)) + this.webPubSubClient.on('stopped', () => log(`stopped (${this.url})`)) + // Set an event handler for group messages before connecting, so we don't miss any. + this.webPubSubClient.on('group-message', e => { + this.handleMessage(e.message.group, e.message.data) + }) + // Connect to the signaling server. + this.webPubSubClient.start() + } + + connected () { + return this.clientConnected + } + + subscribe (roomName) { + this.webPubSubClient.joinGroup(roomName) + } + + unsubscribe (roomName) { + this.webPubSubClient.leaveGroup(roomName) + } + + publish (roomName, message) { + /** @type {WebPubSubDataType} */ + let messageType = "json" + if (typeof message === 'string') { + messageType = "text" + } + this.webPubSubClient.sendToGroup(roomName, message, messageType) + } + + destroy () { + this.webPubSubClient.stop() + } +} + +export class AzureWebPubSubSignalingWebrtcProvider extends WebrtcProvider { + connect () { + this.shouldConnect = true + this.signalingUrls.forEach(url => { + const signalingConn = map.setIfUndefined(signalingConns, url, () => new AzureWebPubSubSignalingConn(url)) + this.signalingConns.push(signalingConn) + signalingConn.providers.add(this) + }) + if (this.room) { + this.room.connect() + } + } +} From 2a78e957f33600b31ddc0974bde94ef9e5e0d142 Mon Sep 17 00:00:00 2001 From: Byron Duvall Date: Tue, 5 Dec 2023 10:21:35 -0500 Subject: [PATCH 12/12] remove azure signaling code and add joinAllRooms and addSignalingConn methods --- src/y-webrtc.js | 92 +++++++------------------------------------------ 1 file changed, 13 insertions(+), 79 deletions(-) diff --git a/src/y-webrtc.js b/src/y-webrtc.js index 024db54..323b908 100644 --- a/src/y-webrtc.js +++ b/src/y-webrtc.js @@ -20,10 +20,6 @@ import * as awarenessProtocol from 'y-protocols/awareness' import * as cryptoutils from './crypto.js' -import { WebPubSubClient } from "@azure/web-pubsub-client" - -/** @typedef {import("@azure/web-pubsub-client").WebPubSubDataType} WebPubSubDataType */ - const log = logging.createModuleLogger('y-webrtc') const messageSync = 0 @@ -492,8 +488,7 @@ export class SignalingConn { this.client = new ws.WebsocketClient(this.url) this.client.on('connect', () => { log(`connected (${this.url})`) - const topics = Array.from(rooms.keys()) - this.client.send({ type: 'subscribe', topics }) + this.joinAllRooms() this.handleConnect() }) this.client.on('message', m => { @@ -595,6 +590,13 @@ export class SignalingConn { destroy () { this.client.destroy() } + + joinAllRooms() { + const topics = Array.from(rooms.keys()) + topics.forEach(topic => + this.subscribe(topic) + ) + } } /** @@ -672,11 +674,7 @@ export class WebrtcProvider extends Observable { connect () { this.shouldConnect = true - this.signalingUrls.forEach(url => { - const signalingConn = map.setIfUndefined(signalingConns, url, () => new SignalingConn(url)) - this.signalingConns.push(signalingConn) - signalingConn.providers.add(this) - }) + this.signalingUrls.forEach(url => this.addSignalingConn(url, () => new SignalingConn(url))) if (this.room) { this.room.connect() } @@ -705,74 +703,10 @@ export class WebrtcProvider extends Observable { }) super.destroy() } -} - -export class AzureWebPubSubSignalingConn extends SignalingConn { - constructor (url) { - super(url) - /** @private */ - this.clientConnected = false - } - setupClient() { - /** @private */ - this.webPubSubClient = new WebPubSubClient(this.url) - this.webPubSubClient.on('connected', e => { - this.clientConnected = true - log(`connected (${this.url}) with ID ${e.connectionId}`) - // Join all the groups. - const groups = Array.from(rooms.keys()) - groups.forEach(group => - this.subscribe(group) - ) - this.handleConnect() - }) - this.webPubSubClient.on('disconnected', e => log(`disconnect (${this.url}): ${e.message}`)) - this.webPubSubClient.on('stopped', () => log(`stopped (${this.url})`)) - // Set an event handler for group messages before connecting, so we don't miss any. - this.webPubSubClient.on('group-message', e => { - this.handleMessage(e.message.group, e.message.data) - }) - // Connect to the signaling server. - this.webPubSubClient.start() - } - - connected () { - return this.clientConnected - } - - subscribe (roomName) { - this.webPubSubClient.joinGroup(roomName) - } - - unsubscribe (roomName) { - this.webPubSubClient.leaveGroup(roomName) - } - - publish (roomName, message) { - /** @type {WebPubSubDataType} */ - let messageType = "json" - if (typeof message === 'string') { - messageType = "text" - } - this.webPubSubClient.sendToGroup(roomName, message, messageType) - } - - destroy () { - this.webPubSubClient.stop() - } -} - -export class AzureWebPubSubSignalingWebrtcProvider extends WebrtcProvider { - connect () { - this.shouldConnect = true - this.signalingUrls.forEach(url => { - const signalingConn = map.setIfUndefined(signalingConns, url, () => new AzureWebPubSubSignalingConn(url)) - this.signalingConns.push(signalingConn) - signalingConn.providers.add(this) - }) - if (this.room) { - this.room.connect() - } + addSignalingConn(url, conn) { + const signalingConn = map.setIfUndefined(signalingConns, url, conn) + this.signalingConns.push(signalingConn) + signalingConn.providers.add(this) } }