snapshot of https://github.com/raimohanska/ourboard.git (master, 2026-09-23; blobs > 131072B omitted)
Some checks failed
build / test (18.x) (push) Failing after 10s
build / lint (18.x) (push) Failing after 0s
build / docker-image (push) Has been skipped

This commit is contained in:
upstream-mirror
2026-09-23 16:16:17 +05:00
commit d57328655f
233 changed files with 21282 additions and 0 deletions

View File

@@ -0,0 +1,68 @@
import { AppEvent, Id, Serial, EventWrapper } from "../../common/src/domain"
import { getActiveBoards } from "./board-state"
import { getConfig } from "./config"
import { releaseLocksFor } from "./locker"
import { broadcastCursorPositions, endSession, startSession } from "./websocket-sessions"
import { WsWrapper, toBuffer } from "./ws-wrapper"
export type ConnectionHandlerParams = Readonly<{
getSignedPutUrl: (key: string) => string
}>
export const connectionHandler = (socket: WsWrapper, handleMessage: MessageHandler) => {
startSession(socket)
const config = getConfig()
socket.send(
toBuffer({
action: "server.config",
assetStorageURL: config.storageBackend.assetStorageURL,
authSupported: config.authSupported,
crdt: config.crdt,
}),
)
socket.onError(() => {
socket.close()
})
socket.onMessage(async (o: object) => {
try {
let event = o as EventWrapper
let serialsToAck: Record<Id, Serial> = {}
for (const e of event.events) {
const serialAck = await handleMessage(socket, e)
if (serialAck === true) {
} else if (serialAck === false) {
console.warn("Unhandled app-event message", e)
} else {
serialsToAck[serialAck.boardId] = serialAck.serial
}
}
if (event.ackId) {
socket.send(toBuffer({ action: "ack", ackId: event.ackId, serials: serialsToAck }))
}
} catch (e) {
console.error("Error while handling event from client. Closing connection.", e)
socket.close()
}
})
socket.onClose(() => {
endSession(socket)
getActiveBoards().forEach((state) => {
delete state.cursorPositions[socket.id]
state.cursorsMoved = true
})
releaseLocksFor(socket)
})
}
setInterval(() => {
getActiveBoards().forEach((bh) => {
if (bh.cursorsMoved) {
broadcastCursorPositions(bh.board.id, bh.cursorPositions)
bh.cursorsMoved = false
}
})
}, 100)
export type MessageHandler = (socket: WsWrapper, appEvent: AppEvent) => Promise<MessageHandlerResult>
export type MessageHandlerResult = { boardId: Id; serial: Serial } | boolean