open-collaboration-service-process
Version:
A service process for integrating non Typescript projects with the Open Collaboration Tools project
144 lines (116 loc) • 5.13 kB
text/typescript
// ******************************************************************************
// Copyright 2024 TypeFox GmbH
// This program and the accompanying materials are made available under the
// terms of the MIT License, which is available in the project root.
// ******************************************************************************
import * as types from 'open-collaboration-protocol';
import { Encoding } from 'open-collaboration-protocol';
import { NotificationType, NotificationType2, NotificationType3, RequestType } from 'vscode-jsonrpc';
export function isOCPMessage(message: unknown): message is OCPMessage {
return types.isObject<OCPMessage>(message) && types.isString(message.method) && types.isArray(message.params);
}
export interface OCPMessage {
method: string
params: unknown[]
target?: string
}
// ***************************** generic messages *****************************
// all params can be either msgpack encoded base64 strings of OCPMessages or just directly OCPMessages
export const OCPRequest = new RequestType<string | OCPMessage, any, string>('request');
export const OCPNotification = new NotificationType<string | OCPMessage>('notification');
export const OCPBroadCast = new NotificationType<string | OCPMessage>('broadcast');
export function fromEncodedOCPMessage(encoded: string): OCPMessage {
return Encoding.decode(Uint8Array.from(Buffer.from(encoded, 'base64'))) as OCPMessage;
}
export function toEncodedOCPMessage(message: OCPMessage): string {
return Buffer.from(Encoding.encode(message)).toString('base64');
}
// ***************************** To service process *****************************
export namespace ToServiceMessages {
export const LOGIN = 'login';
export const JOIN_ROOM = 'room/joinRoom';
export const JOIN_SESSION_REQUEST = 'room/joinSessionRequest';
export const CREATE_ROOM = 'room/createRoom';
export const CLOSE_SESSION = 'room/closeSession';
export const OPEN_DOCUMENT = 'awareness/openDocument';
export const UPDATE_TEXT_SELECTION = 'awareness/updateTextSelection';
export const UPDATE_DOCUMENT_CONTENT = 'awareness/updateDocument';
}
/**
* resp params: [token]
*/
export const LoginRequest = new RequestType<void, string, void>(ToServiceMessages.LOGIN);
export interface SessionData {
roomId: string,
roomToken: string
authToken?: string,
workspace: types.Workspace
}
/**
* params: [roomId]
* resp params: [roomToken, roomId]
*/
export const JoinRoomRequest = new RequestType<string, SessionData, void>(ToServiceMessages.JOIN_ROOM);
/**
* params: [workspace]
* resp params: [roomId, roomToken]
*/
export const CreateRoomRequest = new RequestType<types.Workspace, SessionData, void>(ToServiceMessages.CREATE_ROOM);
export const CloseSessionRequest = new RequestType<void, void, void>(ToServiceMessages.CLOSE_SESSION);
// YJS Awareness
export interface TextDocumentInsert {
startOffset: number,
endOffset?: number,
text: string
}
export interface ClientTextSelection {
start: number,
end: number,
isReversed: boolean
peer?: string
}
/**
* params: [type, documentUri, text]
* Todo: add more types for other awarness object types
*/
export const OpenDocument = new NotificationType3<string, string, string>(ToServiceMessages.OPEN_DOCUMENT);
/**
* params: [documentPath, selections]
*/
export const UpdateTextSelection = new NotificationType2<string, ClientTextSelection[]>(ToServiceMessages.UPDATE_TEXT_SELECTION);
/**
* params: [documentPath, changes]
* Todo: add more types for other awarness object types
*/
export const UpdateDocumentContent = new NotificationType2<string, TextDocumentInsert[]>(ToServiceMessages.UPDATE_DOCUMENT_CONTENT);
// ***************************** From service process ********************************
/**
* A request to the application to open the provided URL
* the token can be used to authenticate the user
* params: [token]
*/
export const Authentication = new NotificationType2<string, types.AuthMetadata>('authentication');
/**
* A notification to the application when a session has been joined or created
* params: [init data of the session]
*/
export const OnInitNotification = new NotificationType<types.InitData>('init');
/**
* A request to the application to allow a user to join the current session
* params: [user]
* resp params: [join accepted]
*/
export const JoinSessionRequest = new RequestType<types.User, boolean, void>(ToServiceMessages.JOIN_SESSION_REQUEST);
/**
* params: [error message, stack trace]
*/
export const InternalError = new NotificationType<{message: string, stack?: string}>('error');
export namespace BinaryResponse {
export function is(message: unknown): message is BinaryResponse {
return types.isObject<BinaryResponse>(message) && types.isString(message.data) && message.type === 'binaryResponse';
}
}
export interface BinaryResponse {
type: 'binaryResponse'
data: string
}