2.0.4 • Published 11 months ago

y-websocket v2.0.4

Weekly downloads
4,013
License
MIT
Repository
github
Last release
11 months ago

y-websocket :tophat:

WebSocket Provider for Yjs

The 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).

Quick Start

Install dependencies

npm i y-websocket

Start a y-websocket server

This repository implements a basic server that you can adopt to your specific use-case. (source code)

Start a y-websocket server:

HOST=localhost PORT=1234 npx y-websocket

Client Code:

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.

const wsProvider = new WebsocketProvider('ws://localhost:1234', 'my-roomname', doc, { WebSocketPolyfill: require('ws') })

API

import { WebsocketProvider } from 'y-websocket'
wsOpts = {
  // Set this to `false` if you want to connect manually using wsProvider.connect()
  connect: true,
  // Specify a query-string / url parameters that will be url-encoded and attached to the `serverUrl`
  // I.e. params = { auth: "bearer" } will be transformed to "?auth=bearer"
  params: {}, // Object<string,string>
  // 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
}

Websocket Server

Start a y-websocket server:

HOST=localhost PORT=1234 npx y-websocket

Since npm symlinks the y-websocket executable from your local ./node_modules/.bin folder, you can simply run npx. The PORT environment variable already defaults to 1234, and HOST defaults to localhost.

Websocket Server with Persistence

Persist document updates in a LevelDB database.

See LevelDB Persistence for more info.

HOST=localhost PORT=1234 YPERSISTENCE=./dbDir node ./node_modules/y-websocket/bin/server.js

Websocket Server with HTTP callback

Send a debounced callback to an HTTP server (POST) on document update. Note that this implementation doesn't implement a retry logic in case the CALLBACK_URL does not work.

Can take the following ENV variables:

  • CALLBACK_URL : Callback server URL
  • CALLBACK_DEBOUNCE_WAIT : Debounce time between callbacks (in ms). Defaults to 2000 ms
  • CALLBACK_DEBOUNCE_MAXWAIT : Maximum time to wait before callback. Defaults to 10 seconds
  • CALLBACK_TIMEOUT : Timeout for the HTTP call. Defaults to 5 seconds
  • CALLBACK_OBJECTS : JSON of shared objects to get data ('{"SHARED_OBJECT_NAME":"SHARED_OBJECT_TYPE}')
CALLBACK_URL=http://localhost:3000/ CALLBACK_OBJECTS='{"prosemirror":"XmlFragment"}' npm start

This sends a debounced callback to localhost:3000 2 seconds after receiving an update (default DEBOUNCE_WAIT) with the data of an XmlFragment named "prosemirror" in the body.

License

The MIT License © Kevin Jahns

@infinitebrahmanuniverse/nolb-y-demotestpublishtiptap-liblexical-toolbar-verbum@everything-registry/sub-chunk-3195@paiondata/lexical-playgroundeditor-dsdsynced-storesvelte-lexicaltest-package-deploy-from-organizationwindmill-componentswp-servicesworroierwritlytextbus_lfvc-editor@drcpythonmfe/lexical-playground@cocreate/quill@cpchain-foundation/editor@blocklet/prompt-editorjotai-yjslc-svelte-lexicalregere-iconstldrawlignintripdocstripdocs-js-sdk@alkuip/forms@jupyter/collaboration-extension@jupyter/docprovider@jupyter/docprovider-extension@coinvoice/lexical-playground@denindka/editor-dsd@difizen/weave-collaborationyl_textbusyjs-bundley-workerwax-prosemirror-servicesvue3-free-layoutuni-pptxuse-y-jsverbumverbum-deploy-testverbum-refined@howyi/foil@flozy/editor@funk-team/elm-interreactor@iserp/verbum@nextcloud/text@nexteditorjs/nexteditor-yjs@nextjournal/blank@nitrolab/lexical-playground@malda/rich-text-editor@joebobmiles/y-react@joshcena/lexical-editor@jupyterlab/docprovider@jupyterlab/collaboration-extension@ohs/lexical-playground@rwth-acis/syncmeta-widgets@processmaker/modeler@reactivepad/use-yjs-prosemirror@onivoro/verbum@nutriadoc/nutriadoc@opensumi/ide-collaboration@paddim8/svelte-lexical@robothoustra21/texteditor@reusejs/documentormo2frontnutriarti-tek-helperrdy-websocketreact-markdown-markossamaelnpmreportcsreal-time-monaconew-lexical-rteneural_compressor_ext_lab_customizedneural_compressor_ext_lab_customized_2nextjs-wysiwygpressumpoli-editreport-publishreportelabrexicalrex-editorrhine-varquill_yjsshepherd-editorslateboxjssofty-editorskyp-test-toolgibberhaprog-editorlexical-playgroundlexical-playground-wllexical-readylexical-softy-editorlexical-svelte-runeslexical-test-1lexitorlex-sample@workerhive/server
2.0.4

11 months ago

2.0.3

1 year ago

2.0.2

1 year ago

2.0.1

1 year ago

2.0.0

1 year ago

1.5.4

1 year ago

1.5.3

1 year ago

1.5.2

1 year ago

1.5.1

2 years ago

1.4.6

2 years ago

1.5.0

2 years ago

1.4.5

3 years ago

1.4.4

3 years ago

1.4.3

3 years ago

1.4.2

3 years ago

1.4.1

3 years ago

1.4.0

3 years ago

1.3.18

4 years ago

1.3.17

4 years ago

1.3.16

4 years ago

1.3.13

4 years ago

1.3.14

4 years ago

1.3.12

4 years ago

1.3.15

4 years ago

1.3.11

4 years ago

1.3.10

4 years ago

1.3.9

4 years ago

1.3.8

5 years ago

1.3.7

5 years ago

1.3.6

5 years ago

1.3.5

5 years ago

1.3.4

5 years ago

1.3.3

5 years ago

1.3.2

5 years ago

1.3.1

5 years ago

1.3.0

5 years ago

1.2.5

5 years ago

1.2.4

5 years ago

1.2.3

5 years ago

1.2.2

5 years ago

1.2.1

5 years ago

1.2.0

5 years ago

1.1.1

5 years ago

1.1.0

5 years ago

1.0.7

6 years ago

1.0.6

6 years ago

1.0.5

6 years ago

1.0.4

6 years ago

1.0.3

6 years ago

1.0.2

6 years ago

1.0.1

6 years ago

1.0.0

6 years ago

1.0.0-6

6 years ago

1.0.0-5

6 years ago

1.0.0-4

6 years ago

1.0.0-3

6 years ago

1.0.0-2

6 years ago

1.0.0-1

6 years ago

1.0.0-0

6 years ago

0.0.0

6 years ago