@hereugo/open-collaboration-monaco 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,87 @@
1
+ # open-collaboration-monaco
2
+
3
+ A TypeScript library that enables real-time collaborative editing in Monaco Editor.
4
+
5
+ ## Overview
6
+
7
+ This package provides a seamless integration between Monaco Editor and real-time collaboration features, allowing multiple users to edit code simultaneously with features like:
8
+ - Real-time cursor and selection sharing
9
+ - User presence indicators
10
+ - User following
11
+ - Room-based collaboration
12
+
13
+ ## Installation
14
+
15
+ ```bash
16
+ npm install open-collaboration-monaco
17
+ ```
18
+
19
+ ## API Reference
20
+
21
+ ### Methods
22
+
23
+ #### Room Management
24
+ - `createRoom()`: Creates a new collaboration room and returns the room token
25
+ - `joinRoom(roomToken)`: Joins an existing room using the provided token
26
+
27
+ #### User Management
28
+ - `login()`: Authenticates the user and returns the user token
29
+ - `isLoggedIn()`: Checks if the user is currently authenticated
30
+ - `getUserData()`: Retrieves the current user's data
31
+
32
+ #### Editor Integration
33
+ - `setEditor(editor)`: Connects a Monaco Editor instance to the collaboration features
34
+
35
+ #### Collaboration Features
36
+ - `onUsersChanged(evt)`: Registers a callback for user presence changes
37
+ - `followUser(id?)`: Sets the user to follow (pass undefined to stop following)
38
+ - `getFollowedUser()`: Returns the ID of the currently followed user
39
+
40
+ ## Configuration Options
41
+
42
+ The `MonacoCollabApi` constructor accepts the following options:
43
+
44
+ ### Required Options
45
+
46
+ - `serverUrl`: The URL of your collaboration server. This is where the API will connect to for real-time communication.
47
+ - `callbacks`: An object containing callback functions for various events. See the Callbacks section below for details.
48
+
49
+ ### Optional Options
50
+
51
+ - `userToken`: If you already have a user authentication token, you can provide it here to skip the login process.
52
+ - `roomToken`: If you want to join a specific room immediately, provide the room token here.
53
+ - `loginPageOpener`: A custom function to handle the opening of the login page. This is useful if you need to customize how the login flow works in your application.
54
+
55
+ ## Usage Example
56
+
57
+ ```typescript
58
+ import { MonacoCollabApi } from 'open-collaboration-monaco';
59
+
60
+ // Initialize the API
61
+ const collabApi = new MonacoCollabApi({
62
+ serverUrl: 'https://your-collab-server.com',
63
+ callbacks: {
64
+ onUserRequestsAccess: ...
65
+ },
66
+ loginPageOpener: (url, token) => {
67
+ // Custom login page handling
68
+ window.open(url, '_blank');
69
+ }
70
+ });
71
+
72
+ // Create or join a room
73
+ const roomToken = await collabApi.createRoom();
74
+
75
+ // Set up your Monaco editor
76
+ const editor = monaco.editor.create(/* ... */);
77
+ collabApi.setEditor(editor);
78
+
79
+ // Handle user changes
80
+ collabApi.onUsersChanged((event) => {
81
+ console.log('Users in room:', event.users);
82
+ });
83
+ ```
84
+
85
+ ## License
86
+
87
+ MIT License - see LICENSE file for details
@@ -0,0 +1,10 @@
1
+ import { ConnectionProvider, CreateRoomResponse, JoinRoomResponse } from '@hereugo/open-collaboration-protocol';
2
+ import { CollaborationInstance } from './collaboration-instance.js';
3
+ import { MonacoCollabCallbacks } from './monaco-api.js';
4
+ export declare function login(connectionProvider: ConnectionProvider): Promise<void>;
5
+ export declare function createRoom(connectionProvider: ConnectionProvider, callbacks: MonacoCollabCallbacks): Promise<CollaborationInstance | undefined>;
6
+ export declare function joinRoom(connectionProvider: ConnectionProvider, callbacks: MonacoCollabCallbacks, roomId?: string): Promise<CollaborationInstance | {
7
+ message: string;
8
+ }>;
9
+ export declare function connectToRoom(connectionProvider: ConnectionProvider, roomClaim: CreateRoomResponse | JoinRoomResponse, isHost: boolean, callbacks: MonacoCollabCallbacks): Promise<CollaborationInstance>;
10
+ //# sourceMappingURL=collaboration-connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collaboration-connection.d.ts","sourceRoot":"","sources":["../src/collaboration-connection.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,gBAAgB,EAAkB,MAAM,sCAAsC,CAAC;AAChI,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAExD,wBAAsB,KAAK,CAAC,kBAAkB,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAKjF;AAED,wBAAsB,UAAU,CAAC,kBAAkB,EAAE,kBAAkB,EAAE,SAAS,EAAE,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CAYrJ;AAED,wBAAsB,QAAQ,CAAC,kBAAkB,EAAE,kBAAkB,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,GAAG;IAAC,OAAO,EAAE,MAAM,CAAA;CAAC,CAAC,CAsB5K;AAED,wBAAsB,aAAa,CAAC,kBAAkB,EAAE,kBAAkB,EAAE,SAAS,EAAE,kBAAkB,GAAG,gBAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,qBAAqB,kCAa9K"}
@@ -0,0 +1,64 @@
1
+ // ******************************************************************************
2
+ // Copyright 2024 TypeFox GmbH
3
+ // This program and the accompanying materials are made available under the
4
+ // terms of the MIT License, which is available in the project root.
5
+ // ******************************************************************************
6
+ import { stringifyError } from '@hereugo/open-collaboration-protocol';
7
+ import { CollaborationInstance } from './collaboration-instance.js';
8
+ export async function login(connectionProvider) {
9
+ const valid = await connectionProvider.validate();
10
+ if (!valid) {
11
+ await connectionProvider.login({});
12
+ }
13
+ }
14
+ export async function createRoom(connectionProvider, callbacks) {
15
+ if (!connectionProvider) {
16
+ return undefined;
17
+ }
18
+ const roomClaim = await connectionProvider.createRoom({ reporter: callbacks.statusReporter });
19
+ if (roomClaim.loginToken) {
20
+ const userToken = roomClaim.loginToken;
21
+ console.log('User Token:', userToken);
22
+ }
23
+ console.log('Room ID:', roomClaim.roomId);
24
+ return await connectToRoom(connectionProvider, roomClaim, true, callbacks);
25
+ }
26
+ export async function joinRoom(connectionProvider, callbacks, roomId) {
27
+ if (!roomId) {
28
+ console.log('No room ID provided');
29
+ // TODO show input box to enter the room ID
30
+ // roomId = await vscode.window.showInputBox({ placeHolder: 'Enter the room ID' })
31
+ }
32
+ if (roomId && connectionProvider) {
33
+ try {
34
+ const roomClaim = await connectionProvider.joinRoom({ roomId, reporter: callbacks.statusReporter });
35
+ const instance = await connectToRoom(connectionProvider, roomClaim, false, callbacks);
36
+ if (!instance) {
37
+ console.log('No collaboration instance found');
38
+ return { message: 'Joining room failed' };
39
+ }
40
+ const workspace = roomClaim.workspace;
41
+ console.log('Workspace:', workspace);
42
+ return instance;
43
+ }
44
+ catch (error) {
45
+ return { message: stringifyError(error) };
46
+ }
47
+ }
48
+ return { message: 'No room ID provided' };
49
+ }
50
+ export async function connectToRoom(connectionProvider, roomClaim, isHost, callbacks) {
51
+ const host = 'host' in roomClaim ? roomClaim.host : undefined;
52
+ const connection = await connectionProvider.connect(roomClaim.roomToken, host);
53
+ const instance = new CollaborationInstance({
54
+ connection,
55
+ host: isHost,
56
+ callbacks,
57
+ roomClaim
58
+ });
59
+ connection.onDisconnect(() => {
60
+ instance?.dispose();
61
+ });
62
+ return instance;
63
+ }
64
+ //# sourceMappingURL=collaboration-connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collaboration-connection.js","sourceRoot":"","sources":["../src/collaboration-connection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ import { Deferred, DisposableCollection, ProtocolBroadcastConnection } from '@hereugo/open-collaboration-protocol';
2
+ import * as Y from 'yjs';
3
+ import * as monaco from 'monaco-editor';
4
+ import * as awarenessProtocol from 'y-protocols/awareness';
5
+ import * as types from '@hereugo/open-collaboration-protocol';
6
+ import { OpenCollaborationYjsProvider } from '@hereugo/open-collaboration-yjs';
7
+ import { MonacoCollabCallbacks } from './monaco-api.js';
8
+ import { DisposablePeer } from './collaboration-peer.js';
9
+ export type UsersChangeEvent = () => void;
10
+ export type FileNameChangeEvent = (fileName: string) => void;
11
+ export interface Disposable {
12
+ dispose(): void;
13
+ }
14
+ export interface CollaborationInstanceOptions {
15
+ connection: ProtocolBroadcastConnection;
16
+ host: boolean;
17
+ callbacks: MonacoCollabCallbacks;
18
+ editor?: monaco.editor.IStandaloneCodeEditor;
19
+ roomClaim: types.CreateRoomResponse | types.JoinRoomResponse;
20
+ }
21
+ export declare class CollaborationInstance implements Disposable {
22
+ protected options: CollaborationInstanceOptions;
23
+ protected readonly yjs: Y.Doc;
24
+ protected readonly yjsAwareness: awarenessProtocol.Awareness;
25
+ protected readonly yjsProvider: OpenCollaborationYjsProvider;
26
+ protected readonly yjsMutex: import("lib0/mutex").mutex;
27
+ protected readonly identity: Deferred<types.Peer>;
28
+ protected readonly documentDisposables: Map<string, DisposableCollection>;
29
+ protected readonly peers: Map<string, DisposablePeer>;
30
+ protected readonly throttles: Map<string, () => void>;
31
+ protected readonly decorations: Map<DisposablePeer, monaco.editor.IEditorDecorationsCollection>;
32
+ protected readonly usersChangedCallbacks: UsersChangeEvent[];
33
+ protected readonly fileNameChangeCallbacks: FileNameChangeEvent[];
34
+ protected _permissions: types.Permissions;
35
+ protected effectiveReadonly: boolean;
36
+ protected currentPath?: string;
37
+ protected stopPropagation: boolean;
38
+ protected _following?: string;
39
+ protected _fileName: string;
40
+ protected previousFileName?: string;
41
+ protected _workspaceName: string;
42
+ protected connection: ProtocolBroadcastConnection;
43
+ get following(): string | undefined;
44
+ get connectedUsers(): DisposablePeer[];
45
+ get ownUserData(): Promise<types.Peer>;
46
+ get isHost(): boolean;
47
+ get host(): types.Peer | undefined;
48
+ get roomId(): string;
49
+ get fileName(): string;
50
+ get workspaceName(): string;
51
+ set workspaceName(_workspaceName: string);
52
+ /**
53
+ * access token for the room. allow to join or reconnect as host
54
+ */
55
+ get roomToken(): string;
56
+ onUsersChanged(callback: UsersChangeEvent): void;
57
+ onFileNameChange(callback: FileNameChangeEvent): void;
58
+ constructor(options: CollaborationInstanceOptions);
59
+ private setupConnectionHandlers;
60
+ private applyPermissionsUpdate;
61
+ private updateEditorReadonly;
62
+ private setupFileSystemHandlers;
63
+ private handleReadFile;
64
+ private handleStat;
65
+ private handleReaddir;
66
+ private handleFileChange;
67
+ private notifyUsersChanged;
68
+ private notifyFileNameChanged;
69
+ setEditor(editor: monaco.editor.IStandaloneCodeEditor): void;
70
+ setFileName(fileName: string): Promise<void>;
71
+ dispose(): void;
72
+ leaveRoom(): void;
73
+ getCurrentConnection(): ProtocolBroadcastConnection;
74
+ protected pushDocumentDisposable(path: string, disposable: Disposable): void;
75
+ protected registerEditorEvents(): void;
76
+ followUser(id?: string): void;
77
+ protected updateFollow(): void;
78
+ protected followSelection(selection: types.ClientTextSelection): Promise<void>;
79
+ protected updateTextSelection(editor: monaco.editor.IStandaloneCodeEditor): void;
80
+ protected registerTextDocument(document: monaco.editor.ITextModel): Promise<void>;
81
+ protected registerTextObserver(path: string, document: monaco.editor.ITextModel, yjsText: Y.Text): void;
82
+ protected updateDocument(document: monaco.editor.ITextModel, edits: monaco.editor.IIdentifiedSingleEditOperation[]): void;
83
+ private createEditsFromTextEvent;
84
+ protected updateTextDocument(event: monaco.editor.IModelContentChangedEvent, document: monaco.editor.ITextModel): void;
85
+ protected getOrCreateThrottle(path: string, document: monaco.editor.ITextModel): () => void;
86
+ private updateDocumentContent;
87
+ protected rerenderPresence(): void;
88
+ protected setDecorations(peer: DisposablePeer, decorations: monaco.editor.IModelDeltaDecoration[]): void;
89
+ protected setSharedSelection(selection?: types.ClientSelection): void;
90
+ protected updateSelectionPath(newPath: string): void;
91
+ protected createSelectionFromRelative(selection: types.RelativeTextSelection, model: monaco.editor.ITextModel): monaco.Selection | undefined;
92
+ protected getHostPath(path: string): string;
93
+ initialize(data: types.InitData): Promise<void>;
94
+ getProtocolPath(uri?: monaco.Uri): string | undefined;
95
+ getResourceUri(path?: string): monaco.Uri | undefined;
96
+ readFile(): Promise<string>;
97
+ }
98
+ //# sourceMappingURL=collaboration-instance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collaboration-instance.d.ts","sourceRoot":"","sources":["../src/collaboration-instance.ts"],"names":[],"mappings":"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"}