@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.
@@ -0,0 +1,113 @@
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
+ export class DisposablePeer {
7
+ peer;
8
+ color;
9
+ yjsAwareness;
10
+ decoration;
11
+ get clientId() {
12
+ const states = this.yjsAwareness.getStates();
13
+ for (const [clientID, state] of states.entries()) {
14
+ if (state.peer === this.peer.id) {
15
+ return clientID;
16
+ }
17
+ }
18
+ return undefined;
19
+ }
20
+ get lastUpdated() {
21
+ const clientId = this.clientId;
22
+ if (clientId !== undefined) {
23
+ const meta = this.yjsAwareness.meta.get(clientId);
24
+ if (meta) {
25
+ return meta.lastUpdated;
26
+ }
27
+ }
28
+ return undefined;
29
+ }
30
+ constructor(yAwareness, peer) {
31
+ this.peer = peer;
32
+ this.yjsAwareness = yAwareness;
33
+ this.decoration = this.createDecorations();
34
+ }
35
+ createDecorations() {
36
+ const color = createColor();
37
+ const colorCss = typeof color === 'string' ? color : `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
38
+ this.color = colorCss;
39
+ const className = `peer-${this.peer.id}`;
40
+ const cursorClassName = `${className}-cursor`;
41
+ const cursorInvertedClassName = `${className}-cursor-inverted`;
42
+ const selectionClassName = `${className}-selection`;
43
+ const cursorCss = `.${cursorClassName} {
44
+ background-color: ${colorCss} !important;
45
+ border-color: ${colorCss} !important;
46
+ position: absolute;
47
+ border-right: solid 2px;
48
+ border-top: solid 2px;
49
+ border-bottom: solid 2px;
50
+ height: 100%;
51
+ box-sizing: border-box;
52
+ }`;
53
+ generateCSS(cursorCss);
54
+ const cursorAfterCss = `.${cursorClassName}::after {
55
+ content: "${this.peer.name}";
56
+ position: absolute;
57
+ transform: translateY(-100%);
58
+ padding: 0 4px;
59
+ border-radius: 4px 4px 4px 0px;
60
+ background-color: ${colorCss};
61
+ }`;
62
+ generateCSS(cursorAfterCss);
63
+ const cursorAfterInvertedCss = `.${cursorClassName}.${cursorInvertedClassName}::after {
64
+ transform: translateY(100%);
65
+ margin-top: -2px;
66
+ border-radius: 0px 4px 4px 4px;
67
+ z-index: 1;
68
+ }`;
69
+ generateCSS(cursorAfterInvertedCss);
70
+ const selectionCss = `.${selectionClassName} {
71
+ background: ${colorCss} !important;
72
+ opacity: 0.25;
73
+ }`;
74
+ generateCSS(selectionCss);
75
+ return {
76
+ cursorClassName,
77
+ cursorInvertedClassName,
78
+ selectionClassName
79
+ };
80
+ }
81
+ }
82
+ let colorIndex = 0;
83
+ const defaultColors = [
84
+ 'yellow', // Yellow
85
+ 'green', // Green
86
+ 'magenta', // Magenta
87
+ 'lightGreen', // Light green
88
+ [255, 178, 123], // Light orange
89
+ [255, 157, 242], // Light magenta
90
+ [92, 45, 145], // Purple
91
+ [0, 178, 148], // Light teal
92
+ [255, 241, 0], // Light yellow
93
+ [180, 160, 255] // Light purple
94
+ ];
95
+ const knownColors = new Set();
96
+ function createColor() {
97
+ if (colorIndex < defaultColors.length) {
98
+ return defaultColors[colorIndex++];
99
+ }
100
+ const o = Math.round, r = Math.random, s = 255;
101
+ let color;
102
+ do {
103
+ color = [o(r() * s), o(r() * s), o(r() * s)];
104
+ } while (knownColors.has(JSON.stringify(color)));
105
+ knownColors.add(JSON.stringify(color));
106
+ return color;
107
+ }
108
+ function generateCSS(cssText) {
109
+ const style = document.createElement('style');
110
+ style.textContent = cssText;
111
+ document.head.appendChild(style);
112
+ }
113
+ //# sourceMappingURL=collaboration-peer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collaboration-peer.js","sourceRoot":"","sources":["../src/collaboration-peer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export type WorkerLoader = () => Worker;
2
+ //# sourceMappingURL=example.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"example.d.ts","sourceRoot":"","sources":["../src/example.ts"],"names":[],"mappings":"AAcA,MAAM,MAAM,YAAY,GAAG,MAAM,MAAM,CAAA"}
package/lib/example.js ADDED
@@ -0,0 +1,84 @@
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 * as monaco from 'monaco-editor';
7
+ import { monacoCollab } from './monaco-api.js';
8
+ const value = `function sayHello(): string {
9
+ return "Hello";
10
+ };`;
11
+ const workerLoaders = {
12
+ editorWorkerService: () => new Worker(new URL('monaco-editor/esm/vs/editor/editor.worker.js', import.meta.url), {
13
+ type: 'module'
14
+ }),
15
+ typescript: () => new Worker(new URL('monaco-editor/esm/vs/language/typescript/ts.worker.js', import.meta.url), {
16
+ type: 'module'
17
+ })
18
+ };
19
+ window.MonacoEnvironment = {
20
+ getWorker: function (moduleId, label) {
21
+ const workerFactory = workerLoaders[label];
22
+ if (workerFactory !== undefined && workerFactory !== null) {
23
+ return workerFactory();
24
+ }
25
+ throw new Error(`Unimplemented worker ${label} (${moduleId})`);
26
+ }
27
+ };
28
+ const container = document.getElementById('container');
29
+ if (container) {
30
+ const myEditor = monaco.editor.create(container, {
31
+ value,
32
+ language: 'typescript'
33
+ });
34
+ const monacoCollabApi = monacoCollab({
35
+ serverUrl: 'http://localhost:8100',
36
+ callbacks: {
37
+ onUserRequestsAccess: (user) => {
38
+ console.log('User requests access', user);
39
+ return Promise.resolve(true);
40
+ }
41
+ }
42
+ });
43
+ // on click of button with id create create room, call createRoom, take the value from response and set it in textfield with id token
44
+ const createRoomButton = document.getElementById('create');
45
+ createRoomButton?.addEventListener('click', () => {
46
+ monacoCollabApi.createRoom().then(token => {
47
+ if (token) {
48
+ monacoCollabApi.setEditor(myEditor);
49
+ document.getElementById('token').value = token ?? '';
50
+ }
51
+ });
52
+ });
53
+ // on click of join room button take value from textfield with id room and call joinRoom
54
+ const joinRoomButton = document.getElementById('join');
55
+ joinRoomButton?.addEventListener('click', () => {
56
+ const roomToken = document.getElementById('room').value;
57
+ monacoCollabApi.joinRoom(roomToken).then(state => {
58
+ if (state) {
59
+ monacoCollabApi.setEditor(myEditor);
60
+ monacoCollabApi.onUsersChanged(() => {
61
+ monacoCollabApi.getUserData().then(userData => {
62
+ const host = userData?.others.find(u => u.peer.host);
63
+ if (host && monacoCollabApi.getFollowedUser() === undefined) {
64
+ monacoCollabApi.followUser(host.peer.id);
65
+ }
66
+ });
67
+ });
68
+ }
69
+ console.log('Joined room');
70
+ });
71
+ });
72
+ // on click of button with id login call login
73
+ const loginButton = document.getElementById('login');
74
+ loginButton?.addEventListener('click', () => {
75
+ monacoCollabApi.login().then((userAuthToken) => {
76
+ let loginText = 'Failed to login';
77
+ if (userAuthToken) {
78
+ loginText = 'Successfully logged in';
79
+ }
80
+ document.getElementById('user').innerText = loginText;
81
+ });
82
+ });
83
+ }
84
+ //# sourceMappingURL=example.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"example.js","sourceRoot":"","sources":["../src/example.ts"],"names":[],"mappings":"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"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ export * from './collaboration-connection.js';
2
+ export * from './collaboration-instance.js';
3
+ export * from './collaboration-peer.js';
4
+ export * from './types.js';
5
+ export * from './monaco-api.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC"}
package/lib/index.js ADDED
@@ -0,0 +1,11 @@
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
+ export * from './collaboration-connection.js';
7
+ export * from './collaboration-instance.js';
8
+ export * from './collaboration-peer.js';
9
+ export * from './types.js';
10
+ export * from './monaco-api.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,8BAA8B;AAC9B,2EAA2E;AAC3E,oEAAoE;AACpE,iFAAiF;AAEjF,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { UsersChangeEvent, FileNameChangeEvent } from './collaboration-instance.js';
2
+ import * as types from '@hereugo/open-collaboration-protocol';
3
+ import * as monaco from 'monaco-editor';
4
+ export type MonacoCollabCallbacks = {
5
+ onUserRequestsAccess: (user: types.User) => Promise<boolean>;
6
+ /**
7
+ * reports the status when joining or creating a room
8
+ * @param info information about the changed status
9
+ */
10
+ statusReporter?: (info: types.Info) => void;
11
+ };
12
+ export type MonacoCollabOptions = {
13
+ serverUrl: string;
14
+ callbacks: MonacoCollabCallbacks;
15
+ userToken?: string;
16
+ roomToken?: string;
17
+ useCookieAuth?: boolean;
18
+ loginPageOpener?: (token: string, authenticationMetadata: types.AuthMetadata) => Promise<boolean>;
19
+ };
20
+ export type OtherUserData = {
21
+ peer: types.Peer;
22
+ color: string;
23
+ };
24
+ export type UserData = {
25
+ me: types.Peer;
26
+ others: OtherUserData[];
27
+ };
28
+ export type MonacoCollabApi = {
29
+ createRoom: () => Promise<string | undefined>;
30
+ joinRoom: (roomToken: string) => Promise<string | undefined>;
31
+ leaveRoom: () => void;
32
+ login: () => Promise<string | undefined>;
33
+ logout: () => Promise<void | undefined>;
34
+ isLoggedIn: () => Promise<boolean>;
35
+ setEditor: (editor: monaco.editor.IStandaloneCodeEditor) => void;
36
+ getUserData: () => Promise<UserData | undefined>;
37
+ onUsersChanged: (evt: UsersChangeEvent) => void;
38
+ onFileNameChange: (callback: FileNameChangeEvent) => void;
39
+ getCurrentConnection: () => types.ProtocolBroadcastConnection | undefined;
40
+ followUser: (id?: string) => void;
41
+ getFollowedUser: () => string | undefined;
42
+ setFileName: (fileName: string) => void;
43
+ getFileName: () => string | undefined;
44
+ setWorkspaceName: (workspaceName: string) => void;
45
+ getWorkspaceName: () => string | undefined;
46
+ };
47
+ export declare function monacoCollab(options: MonacoCollabOptions): MonacoCollabApi;
48
+ export declare function deactivate(): void;
49
+ //# sourceMappingURL=monaco-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monaco-api.d.ts","sourceRoot":"","sources":["../src/monaco-api.ts"],"names":[],"mappings":"AAOA,OAAO,EAAyB,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAC3G,OAAO,KAAK,KAAK,MAAM,sCAAsC,CAAC;AAE9D,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AASxC,MAAM,MAAM,qBAAqB,GAAG;IAChC,oBAAoB,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7D;;;OAGG;IACH,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;CAC/C,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,qBAAqB,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,sBAAsB,EAAE,KAAK,CAAC,YAAY,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACrG,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CAAC;AAC9D,MAAM,MAAM,QAAQ,GAAG;IAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC;IAAC,MAAM,EAAE,aAAa,EAAE,CAAA;CAAC,CAAC;AAEjE,MAAM,MAAM,eAAe,GAAG;IAC1B,UAAU,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IAC7C,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IAC5D,SAAS,EAAE,MAAM,IAAI,CAAA;IACrB,KAAK,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IACxC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,CAAA;IACvC,UAAU,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;IAClC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,qBAAqB,KAAK,IAAI,CAAA;IAChE,WAAW,EAAE,MAAM,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAA;IAChD,cAAc,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,IAAI,CAAA;IAC/C,gBAAgB,EAAE,CAAC,QAAQ,EAAE,mBAAmB,KAAK,IAAI,CAAA;IACzD,oBAAoB,EAAE,MAAM,KAAK,CAAC,2BAA2B,GAAG,SAAS,CAAA;IACzE,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,eAAe,EAAE,MAAM,MAAM,GAAG,SAAS,CAAA;IACzC,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAA;IACvC,WAAW,EAAE,MAAM,MAAM,GAAG,SAAS,CAAA;IACrC,gBAAgB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,IAAI,CAAA;IACjD,gBAAgB,EAAE,MAAM,MAAM,GAAG,SAAS,CAAA;CAC7C,CAAA;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,eAAe,CA0K1E;AAED,wBAAgB,UAAU,SAEzB"}
@@ -0,0 +1,168 @@
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 { ConnectionProvider, SocketIoTransportProvider } from '@hereugo/open-collaboration-protocol';
7
+ import * as types from '@hereugo/open-collaboration-protocol';
8
+ import { createRoom, joinRoom, login } from './collaboration-connection.js';
9
+ let connectionProvider;
10
+ let instance;
11
+ types.initializeProtocol({
12
+ cryptoModule: globalThis.crypto
13
+ });
14
+ export function monacoCollab(options) {
15
+ connectionProvider = new ConnectionProvider({
16
+ url: options.serverUrl,
17
+ authenticationHandler: options.loginPageOpener ?? (async (_token, metaData) => {
18
+ // If this returns null, it means the window could not be opened and the authentication failed
19
+ return window.open(metaData.loginPageUrl, '_blank') !== null;
20
+ }),
21
+ transports: [SocketIoTransportProvider],
22
+ userToken: options.userToken,
23
+ useCookieAuth: options.useCookieAuth,
24
+ fetch: async (url, options) => {
25
+ const response = await fetch(url, options);
26
+ return {
27
+ ok: response.ok,
28
+ status: response.status,
29
+ json: async () => response.json(),
30
+ text: async () => response.text()
31
+ };
32
+ }
33
+ });
34
+ const doCreateRoom = async () => {
35
+ console.log('Creating room');
36
+ if (!connectionProvider) {
37
+ console.log('No OCT Server configured.');
38
+ throw new Error('No OCT Server configured.');
39
+ }
40
+ instance = await createRoom(connectionProvider, options.callbacks);
41
+ if (instance) {
42
+ return instance.roomId;
43
+ }
44
+ throw new Error('Failed to create room');
45
+ };
46
+ const doJoinRoom = async (roomToken) => {
47
+ console.log('Joining room', roomToken);
48
+ if (!connectionProvider) {
49
+ console.log('No OCT Server configured.');
50
+ throw new Error('No OCT Server configured.');
51
+ }
52
+ const res = await joinRoom(connectionProvider, options.callbacks, roomToken);
53
+ if (res && 'message' in res) {
54
+ console.log('Failed to join room: ', res.message);
55
+ throw new Error('Failed to join room: ' + res.message);
56
+ }
57
+ else {
58
+ instance = res;
59
+ return instance.roomId;
60
+ }
61
+ };
62
+ const doLogin = async () => {
63
+ if (!connectionProvider) {
64
+ console.log('No OCT Server configured.');
65
+ throw new Error('No OCT Server configured.');
66
+ }
67
+ await login(connectionProvider);
68
+ return connectionProvider.authToken;
69
+ };
70
+ const doSetEditor = (editor) => {
71
+ if (instance) {
72
+ instance.setEditor(editor);
73
+ }
74
+ };
75
+ const doGetUserData = async () => {
76
+ let data;
77
+ if (instance) {
78
+ const me = await instance.ownUserData;
79
+ const others = instance.connectedUsers.map(user => ({
80
+ peer: user.peer,
81
+ color: user.color ?? 'rgba(0, 0, 0, 0.5)'
82
+ }));
83
+ data = { me, others };
84
+ }
85
+ return data;
86
+ };
87
+ const registerUserChangeHandler = (evt) => {
88
+ if (instance) {
89
+ instance.onUsersChanged(evt);
90
+ }
91
+ };
92
+ const doFollowUser = (id) => {
93
+ if (instance) {
94
+ instance.followUser(id);
95
+ }
96
+ };
97
+ const doGetFollowedUser = () => {
98
+ if (instance) {
99
+ return instance.following;
100
+ }
101
+ return undefined;
102
+ };
103
+ const doSetFileName = (fileName) => {
104
+ if (instance) {
105
+ instance.setFileName(fileName);
106
+ }
107
+ };
108
+ const doGetWorkspaceName = () => {
109
+ if (instance) {
110
+ return instance.workspaceName;
111
+ }
112
+ return undefined;
113
+ };
114
+ const doGetFileName = () => {
115
+ if (instance) {
116
+ return instance.fileName;
117
+ }
118
+ return undefined;
119
+ };
120
+ const registerFileNameChangeHandler = (callback) => {
121
+ if (instance) {
122
+ instance.onFileNameChange(callback);
123
+ }
124
+ };
125
+ const doSetWorkspaceName = (workspaceName) => {
126
+ if (instance) {
127
+ instance.workspaceName = workspaceName;
128
+ }
129
+ };
130
+ const isLoggedIn = async () => {
131
+ if (!connectionProvider) {
132
+ return false;
133
+ }
134
+ if (options.useCookieAuth) {
135
+ const valid = await fetch(options.serverUrl + '/api/login/validate', {
136
+ credentials: 'include',
137
+ method: 'POST',
138
+ });
139
+ return valid.ok && (await valid.json())?.valid;
140
+ }
141
+ else {
142
+ return !!connectionProvider.authToken;
143
+ }
144
+ };
145
+ return {
146
+ createRoom: doCreateRoom,
147
+ joinRoom: doJoinRoom,
148
+ leaveRoom: () => instance?.leaveRoom(),
149
+ login: doLogin,
150
+ logout: async () => connectionProvider?.logout(),
151
+ isLoggedIn: isLoggedIn,
152
+ setEditor: doSetEditor,
153
+ getUserData: doGetUserData,
154
+ onUsersChanged: registerUserChangeHandler,
155
+ onFileNameChange: registerFileNameChangeHandler,
156
+ followUser: doFollowUser,
157
+ getFollowedUser: doGetFollowedUser,
158
+ getCurrentConnection: () => instance?.getCurrentConnection(),
159
+ setFileName: doSetFileName,
160
+ getFileName: doGetFileName,
161
+ getWorkspaceName: doGetWorkspaceName,
162
+ setWorkspaceName: doSetWorkspaceName
163
+ };
164
+ }
165
+ export function deactivate() {
166
+ instance?.dispose();
167
+ }
168
+ //# sourceMappingURL=monaco-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monaco-api.js","sourceRoot":"","sources":["../src/monaco-api.ts"],"names":[],"mappings":"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"}
package/lib/types.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ export type { Peer } from '@hereugo/open-collaboration-protocol';
2
+ export type { User } from '@hereugo/open-collaboration-protocol';
3
+ export type { AuthMetadata } from '@hereugo/open-collaboration-protocol';
4
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAMA,YAAY,EAAE,IAAI,EAAE,MAAM,sCAAsC,CAAC;AACjE,YAAY,EAAE,IAAI,EAAE,MAAM,sCAAsC,CAAC;AACjE,YAAY,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC"}
package/lib/types.js ADDED
@@ -0,0 +1,7 @@
1
+ // ******************************************************************************
2
+ // Copyright 2025 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
+ export {};
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,8BAA8B;AAC9B,2EAA2E;AAC3E,oEAAoE;AACpE,iFAAiF"}
package/package.json ADDED
@@ -0,0 +1,75 @@
1
+ {
2
+ "name": "@hereugo/open-collaboration-monaco",
3
+ "version": "0.3.3",
4
+ "license": "MIT",
5
+ "description": "Connect a single Monaco Editor to an Open Collaboration Tools session",
6
+ "files": [
7
+ "lib",
8
+ "src"
9
+ ],
10
+ "type": "module",
11
+ "main": "./lib/index.js",
12
+ "module": "./lib/index.js",
13
+ "exports": {
14
+ ".": {
15
+ "types": "./lib/index.d.ts",
16
+ "default": "./lib/index.js"
17
+ },
18
+ "./example": {
19
+ "types": "./lib/example.d.ts",
20
+ "default": "./lib/example.js"
21
+ }
22
+ },
23
+ "typesVersions": {
24
+ "*": {
25
+ ".": [
26
+ "lib/index.d.ts"
27
+ ],
28
+ "example": [
29
+ "lib/example.d.ts"
30
+ ]
31
+ }
32
+ },
33
+ "scripts": {
34
+ "build": "echo 'open-collaboration-protocol: Nothing extra to build.'"
35
+ },
36
+ "dependencies": {
37
+ "lodash": "~4.17.21",
38
+ "@hereugo/open-collaboration-protocol": "~0.3.1",
39
+ "@hereugo/open-collaboration-yjs": "~0.3.0"
40
+ },
41
+ "devDependencies": {
42
+ "@types/vscode": "^1.89.0"
43
+ },
44
+ "peerDependencies": {
45
+ "monaco-editor": ">= 0.44.0"
46
+ },
47
+ "keywords": [
48
+ "collaboration",
49
+ "live-share",
50
+ "real-time",
51
+ "pair-programming",
52
+ "monaco-editor"
53
+ ],
54
+ "repository": {
55
+ "type": "git",
56
+ "url": "https://github.com/eclipse-oct/open-collaboration-tools",
57
+ "directory": "packages/open-collaboration-monaco"
58
+ },
59
+ "bugs": {
60
+ "url": "https://github.com/eclipse-oct/open-collaboration-tools/issues"
61
+ },
62
+ "homepage": "https://www.open-collab.tools/",
63
+ "author": {
64
+ "name": "TypeFox",
65
+ "url": "https://www.typefox.io/"
66
+ },
67
+ "volta": {
68
+ "node": "22.14.0",
69
+ "npm": "10.9.2"
70
+ },
71
+ "engines": {
72
+ "node": ">=20.10.0",
73
+ "npm": ">=10.2.3"
74
+ }
75
+ }
@@ -0,0 +1,69 @@
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
+
7
+ import { ConnectionProvider, CreateRoomResponse, JoinRoomResponse, stringifyError } from '@hereugo/open-collaboration-protocol';
8
+ import { CollaborationInstance } from './collaboration-instance.js';
9
+ import { MonacoCollabCallbacks } from './monaco-api.js';
10
+
11
+ export async function login(connectionProvider: ConnectionProvider): Promise<void> {
12
+ const valid = await connectionProvider.validate();
13
+ if (!valid) {
14
+ await connectionProvider.login({});
15
+ }
16
+ }
17
+
18
+ export async function createRoom(connectionProvider: ConnectionProvider, callbacks: MonacoCollabCallbacks): Promise<CollaborationInstance | undefined> {
19
+ if (!connectionProvider) {
20
+ return undefined;
21
+ }
22
+ const roomClaim = await connectionProvider.createRoom({reporter: callbacks.statusReporter});
23
+ if (roomClaim.loginToken) {
24
+ const userToken = roomClaim.loginToken;
25
+ console.log('User Token:', userToken);
26
+ }
27
+
28
+ console.log('Room ID:', roomClaim.roomId);
29
+ return await connectToRoom(connectionProvider, roomClaim, true, callbacks);
30
+ }
31
+
32
+ export async function joinRoom(connectionProvider: ConnectionProvider, callbacks: MonacoCollabCallbacks, roomId?: string): Promise<CollaborationInstance | {message: string}> {
33
+ if (!roomId) {
34
+ console.log('No room ID provided');
35
+ // TODO show input box to enter the room ID
36
+ // roomId = await vscode.window.showInputBox({ placeHolder: 'Enter the room ID' })
37
+ }
38
+ if (roomId && connectionProvider) {
39
+ try {
40
+ const roomClaim = await connectionProvider.joinRoom({roomId, reporter: callbacks.statusReporter});
41
+ const instance = await connectToRoom(connectionProvider, roomClaim, false, callbacks);
42
+ if (!instance) {
43
+ console.log('No collaboration instance found');
44
+ return {message: 'Joining room failed'};
45
+ }
46
+ const workspace = roomClaim.workspace;
47
+ console.log('Workspace:', workspace);
48
+ return instance;
49
+ } catch (error) {
50
+ return {message: stringifyError(error)};
51
+ }
52
+ }
53
+ return {message: 'No room ID provided'};
54
+ }
55
+
56
+ export async function connectToRoom(connectionProvider: ConnectionProvider, roomClaim: CreateRoomResponse | JoinRoomResponse, isHost: boolean, callbacks: MonacoCollabCallbacks) {
57
+ const host = 'host' in roomClaim ? roomClaim.host : undefined;
58
+ const connection = await connectionProvider.connect(roomClaim.roomToken, host);
59
+ const instance = new CollaborationInstance({
60
+ connection,
61
+ host: isHost,
62
+ callbacks,
63
+ roomClaim
64
+ });
65
+ connection.onDisconnect(() => {
66
+ instance?.dispose();
67
+ });
68
+ return instance;
69
+ }