Skip to content

amirrezasalimi/collabjs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

25 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

CollabJS - Realtime Collaboration Made Easy

CollabJS is a comprehensive backend and frontend package designed to simplify the development of real-time collaboration applications. Powered by the Yjs (CRDT - Conflict-free replicated data type) framework, CollabJS is fully written in TypeScript and offers a range of tools to streamline your collaborative app development process.

Demo

alt text

Check out our demo app here.

Features

  • leveldb, pocketbase (persistence storage)
  • server-side auth middleware (edit , view permission)
  • multi room support
  • undo manager
  • default storage schema
  • useful react hooks (room,storage,self,clients,connection,sync,...)
  • immer based storage update
  • support syncing client data with each others , (mouse position , color)

Roadmap

  • broadcastMessage
  • clear
  • support text type
  • add e2e tests

Installation

To get started with CollabJS in your project, you can install the React library like so:

npm install @collabjs/react

For the backend with LevelDB support:

npm install @collabjs/core

Usage

React Components and Hooks

To use CollabJS in your React application, wrap your components with the RoomProvider and configure it with the necessary options:

import React from 'react';
import { RoomProvider } from '@collabjs/react';

const App = () => {
  return (
    <RoomProvider id='room-id'
      config={{
        url: "wss://localhost:3000",
        auth: {
          token: "..."
        }
      }}
      storage={{
        todos: []
      }}
    >
      {/* Your components here */}
    </RoomProvider>
  );
};

export default App;

Hooks and APIs

CollabJS provides various hooks and APIs to interact with your real-time data:

  • useRoom: Access room information, Yjs doc instance, and more.
  • useStorage: Store real-time data and access it, triggering component re-renders on updates.
  • useStaticStorage: Similar to useStorage but without triggering re-renders.
  • useClients: Retrieve information about online clients (excluding yourself).
  • useSelf: Get the current client's data and a function to update it.
  • useIsConnected: Check the connection status (boolean).
  • useIsSynced: Check the sync status (boolean).
  • useUndo: undo , redo manager.

Example usage:

import React from 'react';
import { useStorage, useClients, useSelf, useIsConnected, useIsSynced } from '@collabjs/react';

const MyComponent = () => {
  const [count, update] = useStorage(data => data);

  // Update data
  update(draft => {
    draft.count++;
  });

  const { clients } = useClients();
  const [data, updateData] = useSelf();
  const isConnected = useIsConnected();
  const isSynced = useIsSynced();

  // Your component logic here
};

Backend with LevelDB

To use the core package of CollabJS with LevelDB support in your Node.js project, install it like this:

npm install @collabjs/core

Example

import express from 'express';
import { Server } from 'socket.io';
import http from "http"
import { CollabCore, LevelDbProvider, PocketbaseProvider } from '@collabjs/core';

const app = express();
const server = http.createServer(app);

// Set up your Express app here

const lvldb = new LevelDbProvider('./level-storage');
const pbdb = new PocketbaseProvider({
  url: "http://127.0.0.1:8090",
  admin: {
    email: "...",
    password: "..."
  }
});

const io = new Server(server);
const collab = new CollabCore(io, {
  db: lvldb, // Use LevelDB for storage
  authenticate: (handshake) => {
    // Authenticate the client based on the provided token
    return new Promise(resolve => {
      if (handshake.auth.token === "valid-token") {
        resolve("edit"); // Grant edit access
      } else {
        resolve("view"); // Grant view-only access
      }
    });
  },
});

collab.registerEvents({
  onClientJoined(roomName, doc, socket) {
    console.log(`Client ${socket.id} joined room ${roomName}`)
  },
  onClientLeft(roomName, doc, socket) {
    console.log(`Client ${socket.id} left room ${roomName}`)
  },
});

// Execute initialize method
collab.initialize();

server.listen(3000, () => {
  console.log('Application started on port 3000!');
});

Supported Backends

CollabJS currently supports two backend data providers:

  • LevelDB
  • Pocketbase

Acknowledgments

CollabJS wouldn't be possible without the following repositories:

License

CollabJS is released under the MIT License. Feel free to use it in your projects and customize it to your needs.

Happy coding with CollabJS! 🚀

About

easy realtime collaboration tool for nodejs / react

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published