Skip to content
Snippets Groups Projects
YjsService.js 1.64 KiB
Newer Older
/* eslint-disable no-console */
chris's avatar
chris committed
import { Service } from 'wax-prosemirror-core';
chris's avatar
chris committed
import { yCursorPlugin, ySyncPlugin, yUndoPlugin } from 'y-prosemirror';
import { WebsocketProvider } from 'y-websocket';
import * as Y from 'yjs';
import './yjs.css';
chris's avatar
chris committed

class YjsService extends Service {
chris's avatar
chris committed
  name = 'YjsService';
  boot() {
    const {
      connectionUrl,
      docIdentifier,
chris's avatar
chris committed
      YjsType,
      cursorBuilder,
      provider: configProvider,
      ydoc: configYdoc,
    } = this.config;

    let provider = configProvider ? configProvider() : null;
    let ydoc = configYdoc ? configYdoc() : null;

    if (!configProvider || !configYdoc) {
      ydoc = new Y.Doc();
      provider = new WebsocketProvider(connectionUrl, docIdentifier, ydoc);
    }
chris's avatar
chris committed
    this.app.context.setOption({ currentYdoc: ydoc });
chris's avatar
chris committed
    provider.on('sync', args => {
      console.log({ sync: args });
    });
    provider.on('status', args => {
      console.log({ status: args });
    });
    provider.on('connection-close', args => {
      console.log({ connectioClose: args });
    });
    provider.on('connection-error', args => {
      console.log({ connectioError: args });
    });
chris's avatar
chris committed
    const type = ydoc.getXmlFragment(YjsType || 'prosemirror');
chris's avatar
chris committed
    console.log('dsf');
chris's avatar
chris committed

chris's avatar
chris committed
    this.app.PmPlugins.add('ySyncPlugin', ySyncPlugin(type));
    if (cursorBuilder) {
      this.app.PmPlugins.add(
        'yCursorPlugin',
        yCursorPlugin(provider.awareness, { cursorBuilder }),
      );
    } else {
      this.app.PmPlugins.add(
        'yCursorPlugin',
        yCursorPlugin(provider.awareness),
      );
    }
chris's avatar
chris committed
    this.app.PmPlugins.add('yUndoPlugin', yUndoPlugin());
chris's avatar
chris committed
  }
chris's avatar
chris committed
}

export default YjsService;