0x9 Long Connections (Sockets)

Definition

ROOM: An independent collaborative workspace (room).

RESOURCE: A data resource unit that participates in collaboration in ROOM, which can be a datasheet, widget, etc. Relationship:

  • Each ROOM is unique and includes one or more collaborators and RESOURCEs.

  • The same RESOURCE can be in different ROOMs, and the relationship between the two is many-to-many.

  • Users can open multiple clients and be in multiple ROOMs.


Message Types

Client Actively Pushes

  • User establishes a collaborative ROOM long connection channel. (WATCH_ROOM)

  • Each datasheet (form/dashboard, etc.) opened by the user can create an independent ROOM.

  • The ROOM identifier is a node ID or resource unit ID (such as: a separately opened widget).

  • Request message body structure:

    {
        "roomId": string;
        "shareId": string;
    }
  • Web Socket pushes events to Nest server to obtain collaborator information and the latest revision numbers of various resources within the ROOM.

  • Data structure returned to client:

    {
        "collaborators": {
            "socketId": string;
            "createTime": number;
            "userId": string;
            "avatar": string;
            "userName" : string;
            "memberName": string;
        }[];
        "resourceRevisions":{
            "resourceId": string;
            "revision": number;
        }[]
    }
  • Data structure broadcasted to collaborators: (ACTIVATE_COLLABORATOR)

    {
            "socketId": string;
            "createTime": number;
            "userId": string;
            "avatar": string;
            "userName": string;
            "memberName": string;
    }
  • User leaves collaboration room (LEAVE_ROOM):

    {
            "roomId": string;
    }
  • Data structure broadcasted to collaborators: (DEACTIVATE_COLLABORATOR)

    {
            "roomId": string;
            "socketId": string;
    }
  • ROOM sends changesets (CLIENT_ROOM_CHANGE):

    {
        "roomId": string;
        "changesets": ILocalChangeset[];
    }
    
    interface ILocalChangeset {
        "messageId": string;
        "baseRevision": number;
        "resourceId": string;
        "resourceType": ResourceType;
        "operations": IOperation[];
    }
  • Web Socket pushes evnets to Nest server

  • Nest server: Process changesets transactionally

  • Data structure returned to Socket server:

    {
            "changeset": IRemoteChangeset;
            "roomIds": string[];
    }[]
  • Every Changeset of a RESOURCE is broadcasted to all ROOMs that contain that RESOURCE.

  • Data structure broadcasted to collaborators (SERVER_ROOM_CHANGE):

    {
            "success": boolean;
            "code": number;
            "message": string;
            "data": IRemoteChangeset[];
    }
  • collaborate the cursor (ENGAGEMENT_CURSOR)

  • Send data about the activated cell:

    {
            "datasheetId": string;
            "viewId": string;
            "fieldId": string;
            "recordId": string;
            "time": number;
    }
  • Web Socket broadcasts to collaborators (ENGAGEMENT_CURSOR), the data structure is the same as above ENGAGEMENT_CURSOR.

Client Passively Receives

  • A new collaborator enters the room. (ACTIVATE_COLLABORATOR)

  • A collaborator leaves the room. (DEACTIVATE_COLLABORATOR)

  • Collaborative changesets in the room. (SERVER_ROOM_CHANGE)

  • The collaborative cursor of other collaborators in the room. (ENGAGEMENT_CURSOR)


ROOM-RESOURCE two-way relation

Nest server is responsible for maintaining ROOM-RESOURCE two-way relations.

Maintain update points:

  • Load resource data

  • Room Changeset involving the addition or deletion of resources.