fix: Cannot read properties of undefined (reading 'id')

This commit is contained in:
Tom Moor
2023-09-20 20:27:50 -04:00
parent 67b1fe5514
commit 5aa7b42f8b
6 changed files with 45 additions and 18 deletions

View File

@@ -7,6 +7,7 @@ import env from "@server/env";
import Logger from "@server/logging/Logger";
import { trace } from "@server/logging/tracing";
import { TooManyConnections } from "./CloseEvents";
import { withContext } from "./types";
@trace()
export class ConnectionLimitExtension implements Extension {
@@ -19,9 +20,7 @@ export class ConnectionLimitExtension implements Extension {
* onDisconnect hook
* @param data The disconnect payload
*/
onDisconnect(data: onDisconnectPayload) {
const { documentName, socketId } = data;
onDisconnect({ documentName, socketId }: withContext<onDisconnectPayload>) {
const connections = this.connectionsByDocument.get(documentName);
if (connections) {
connections.delete(socketId);
@@ -45,9 +44,7 @@ export class ConnectionLimitExtension implements Extension {
* onConnect hook
* @param data The connect payload
*/
onConnect(data: onConnectPayload) {
const { documentName } = data;
onConnect({ documentName, socketId }: withContext<onConnectPayload>) {
const connections =
this.connectionsByDocument.get(documentName) || new Set();
if (connections?.size >= env.COLLABORATION_MAX_CLIENTS_PER_DOCUMENT) {
@@ -60,7 +57,7 @@ export class ConnectionLimitExtension implements Extension {
return Promise.reject(TooManyConnections);
}
connections.add(data.socketId);
connections.add(socketId);
this.connectionsByDocument.set(documentName, connections);
Logger.debug(

View File

@@ -5,19 +5,20 @@ import {
Extension,
} from "@hocuspocus/server";
import Logger from "@server/logging/Logger";
import { withContext } from "./types";
export default class LoggerExtension implements Extension {
async onLoadDocument(data: onLoadDocumentPayload) {
async onLoadDocument(data: withContext<onLoadDocumentPayload>) {
Logger.info("multiplayer", `Loaded document "${data.documentName}"`, {
userId: data.context.user?.id,
});
}
async onConnect(data: onConnectPayload) {
async onConnect(data: withContext<onConnectPayload>) {
Logger.info("multiplayer", `New connection to "${data.documentName}"`);
}
async onDisconnect(data: onDisconnectPayload) {
async onDisconnect(data: withContext<onDisconnectPayload>) {
Logger.info("multiplayer", `Closed connection to "${data.documentName}"`, {
userId: data.context.user?.id,
});

View File

@@ -6,9 +6,13 @@ import {
Extension,
} from "@hocuspocus/server";
import Metrics from "@server/logging/Metrics";
import { withContext } from "./types";
export default class MetricsExtension implements Extension {
async onLoadDocument({ documentName, instance }: onLoadDocumentPayload) {
async onLoadDocument({
documentName,
instance,
}: withContext<onLoadDocumentPayload>) {
Metrics.increment("collaboration.load_document", {
documentName,
});
@@ -24,7 +28,7 @@ export default class MetricsExtension implements Extension {
});
}
async onConnect({ documentName, instance }: onConnectPayload) {
async onConnect({ documentName, instance }: withContext<onConnectPayload>) {
Metrics.increment("collaboration.connect", {
documentName,
});
@@ -38,7 +42,10 @@ export default class MetricsExtension implements Extension {
);
}
async onDisconnect({ documentName, instance }: onDisconnectPayload) {
async onDisconnect({
documentName,
instance,
}: withContext<onDisconnectPayload>) {
Metrics.increment("collaboration.disconnect", {
documentName,
});
@@ -52,7 +59,7 @@ export default class MetricsExtension implements Extension {
);
}
async onStoreDocument({ documentName }: onChangePayload) {
async onStoreDocument({ documentName }: withContext<onChangePayload>) {
Metrics.increment("collaboration.change", {
documentName,
});

View File

@@ -11,6 +11,7 @@ import Document from "@server/models/Document";
import ProsemirrorHelper from "@server/models/helpers/ProsemirrorHelper";
import { sequelize } from "@server/storage/database";
import documentCollaborativeUpdater from "../commands/documentCollaborativeUpdater";
import { withContext } from "./types";
@trace()
export default class PersistenceExtension implements Extension {
@@ -20,7 +21,10 @@ export default class PersistenceExtension implements Extension {
*/
documentCollaboratorIds = new Map<string, Set<string>>();
async onLoadDocument({ documentName, ...data }: onLoadDocumentPayload) {
async onLoadDocument({
documentName,
...data
}: withContext<onLoadDocumentPayload>) {
const [, documentId] = documentName.split(".");
const fieldName = "default";
@@ -67,14 +71,16 @@ export default class PersistenceExtension implements Extension {
});
}
async onChange({ context, documentName }: onChangePayload) {
async onChange({ context, documentName }: withContext<onChangePayload>) {
Logger.debug(
"multiplayer",
`${context.user?.name} changed ${documentName}`
);
const state = this.documentCollaboratorIds.get(documentName) ?? new Set();
state.add(context.user?.id);
if (context.user) {
state.add(context.user.id);
}
this.documentCollaboratorIds.set(documentName, state);
}

View File

@@ -7,6 +7,7 @@ import { Minute } from "@shared/utils/time";
import Logger from "@server/logging/Logger";
import { trace } from "@server/logging/tracing";
import { View } from "@server/models";
import { withContext } from "./types";
@trace()
export class ViewsExtension implements Extension {
@@ -21,7 +22,15 @@ export class ViewsExtension implements Extension {
*
* @param data The change payload
*/
async onChange({ documentName, context, socketId }: onChangePayload) {
async onChange({
documentName,
context,
socketId,
}: withContext<onChangePayload>) {
if (!context.user) {
return;
}
const lastUpdate = this.lastViewBySocket.get(socketId);
const [, documentId] = documentName.split(".");

View File

@@ -0,0 +1,7 @@
import type { User } from "@server/models";
export type withContext<T> = Omit<T, "context"> & {
context: {
user?: User;
};
};