* chore: fix lint * fix: constants check:lint command * chore(lint): permit unused vars which begin w/ _ * chore: rm dead code * fix(lint): more lint fixes to constants pkg * fix(lint): lint the live server - fix lint issues * chore: improve clean script * fix(lint): more lint * chore: set live server process title * chore(deps): update to turbo@2.5.5 * chore(live): target node22 * fix(dev): add missing ui pkg dependency * fix(dev): lint decorators * fix(dev): lint space app * fix(dev): address lint issues in types pkg * fix(dev): lint editor pkg * chore(dev): moar lint * fix(dev): live server exit code * chore: address PR feedback * fix(lint): better TPageExtended type * chore: refactor * chore: revert most live server changes * fix: few more lint issues * chore: enable ci checks Ensure we can build + confirm that lint is not getting worse. * chore: address PR feedback * fix: web lint warning added to package.json * fix: ci:lint command --------- Co-authored-by: sriram veeraghanta <veeraghanta.sriram@gmail.com>
69 lines
2.3 KiB
TypeScript
69 lines
2.3 KiB
TypeScript
import { Server } from "@hocuspocus/server";
|
|
import { v4 as uuidv4 } from "uuid";
|
|
// lib
|
|
import { handleAuthentication } from "@/core/lib/authentication.js";
|
|
// extensions
|
|
import { getExtensions } from "@/core/extensions/index.js";
|
|
import { DocumentCollaborativeEvents, TDocumentEventsServer } from "@plane/editor/lib";
|
|
// editor types
|
|
import { TUserDetails } from "@plane/editor";
|
|
// types
|
|
import { type HocusPocusServerContext } from "@/core/types/common.js";
|
|
|
|
export const getHocusPocusServer = async () => {
|
|
const extensions = await getExtensions();
|
|
const serverName = process.env.HOSTNAME || uuidv4();
|
|
return Server.configure({
|
|
name: serverName,
|
|
onAuthenticate: async ({
|
|
requestHeaders,
|
|
context,
|
|
// user id used as token for authentication
|
|
token,
|
|
}) => {
|
|
let cookie: string | undefined = undefined;
|
|
let userId: string | undefined = undefined;
|
|
|
|
// Extract cookie (fallback to request headers) and userId from token (for scenarios where
|
|
// the cookies are not passed in the request headers)
|
|
try {
|
|
const parsedToken = JSON.parse(token) as TUserDetails;
|
|
userId = parsedToken.id;
|
|
cookie = parsedToken.cookie;
|
|
} catch (error) {
|
|
// If token parsing fails, fallback to request headers
|
|
console.error("Token parsing failed, using request headers:", error);
|
|
} finally {
|
|
// If cookie is still not found, fallback to request headers
|
|
if (!cookie) {
|
|
cookie = requestHeaders.cookie?.toString();
|
|
}
|
|
}
|
|
|
|
if (!cookie || !userId) {
|
|
throw new Error("Credentials not provided");
|
|
}
|
|
|
|
// set cookie in context, so it can be used throughout the ws connection
|
|
(context as HocusPocusServerContext).cookie = cookie;
|
|
|
|
try {
|
|
await handleAuthentication({
|
|
cookie,
|
|
userId,
|
|
});
|
|
} catch (_error) {
|
|
throw Error("Authentication unsuccessful!");
|
|
}
|
|
},
|
|
async onStateless({ payload, document }) {
|
|
// broadcast the client event (derived from the server event) to all the clients so that they can update their state
|
|
const response = DocumentCollaborativeEvents[payload as TDocumentEventsServer].client;
|
|
if (response) {
|
|
document.broadcastStateless(response);
|
|
}
|
|
},
|
|
extensions,
|
|
debounce: 10000,
|
|
});
|
|
};
|