Websockets provider for Yjs
npm install y-websocketThe Websocket Provider implements a classical client server model. Clients
connect to a single endpoint over Websocket. The server distributes awareness
information and document updates among clients.
This repository contains a simple in-memory backend that can persist to
databases, but it can't be scaled easily. The
y-redis repository contains an alternative
backend that is scalable, provides auth*, and can persist to different backends.
The Websocket Provider is a solid choice if you want a central source that
handles authentication and authorization. Websockets also send header
information and cookies, so you can use existing authentication mechanisms with
this server.
* Supports cross-tab communication. When you open the same document in the same
browser, changes on the document are exchanged via cross-tab communication
(Broadcast
Channel
and
localStorage
as fallback).
* Supports exchange of awareness information (e.g. cursors).
``sh`
npm i y-websocket
There are multiple y-websocket compatible backends for y-websocket:
* @y/websocket-server
* hocuspocus
- y-sweet
- y-redis
- ypy-websocket
- pycrdt-websocket
- yrs-warp
- ...
The fastest way to get started is to run the @y/websocket-server
backend. This package was previously included in y-websocket and now lives in a
forkable repository.
Install and start y-websocket-server:
`sh`
npm install @y/y-websocket-server
HOST=localhost PORT=1234 npx y-websocket
`js
import * as Y from 'yjs'
import { WebsocketProvider } from 'y-websocket'
const doc = new Y.Doc()
const wsProvider = new WebsocketProvider('ws://localhost:1234', 'my-roomname', doc)
wsProvider.on('status', event => {
console.log(event.status) // logs "connected" or "disconnected"
})
`
#### Client Code in Node.js
The WebSocket provider requires a WebSocket object to create connection to a server. You can polyfill WebSocket support in Node.js using the ws package.
`js`
const wsProvider = new WebsocketProvider('ws://localhost:1234', 'my-roomname', doc, { WebSocketPolyfill: require('ws') })
`js`
import { WebsocketProvider } from 'y-websocket'
wsProvider = new WebsocketProvider(serverUrl: string, room: string, ydoc: Y.Doc [, wsOpts: WsOpts])`jsfalse
wsOpts = {
// Set this to if you want to connect manually using wsProvider.connect()serverUrl
connect: true,
// Specify a query-string / url parameters that will be url-encoded and attached to the ``
// I.e. params = { auth: "bearer" } will be transformed to "?auth=bearer"
params: {}, // Object
// You may polyill the Websocket object (https://developer.mozilla.org/en-US/docs/Web/API/WebSocket).
// E.g. In nodejs, you could specify WebsocketPolyfill = require('ws')
WebsocketPolyfill: Websocket,
// Specify an existing Awareness instance - see https://github.com/yjs/y-protocols
awareness: new awarenessProtocol.Awareness(ydoc),
// Specify the maximum amount to wait between reconnects (we use exponential backoff).
maxBackoffTime: 2500
}
wsProvider.wsconnected: booleanwsProvider.wsconnecting: booleanwsProvider.shouldConnect: booleanwsProvider.bcconnected: booleanwsProvider.synced: booleanwsProvider.params : booleanwsProvider.disconnect()wsProvider.connect()wsProvider.destroy()wsProvider.on('sync', function(isSynced: boolean))wsProvider.on('status', function({ status: 'disconnected' | 'connecting' | 'connected' }))wsProvider.on('connection-close', function(WSClosedEvent))wsProvider.on('connection-error', function(WSErrorEvent))The MIT License © Kevin Jahns