SYMBOL INDEX (752 symbols across 147 files) FILE: backend/migrations/003_refactor_access.sql type board_access (line 3) | create table board_access ( FILE: backend/migrations/009_drop_board_event_primary_key.sql type board_event_board_index (line 2) | CREATE INDEX board_event_board_index ON board_event (board_id) FILE: backend/src/api/board-csv-get.ts type Row (line 49) | type Row = { parents: Container[]; rowContainer: Container; textItems: T... function csv (line 59) | function csv(board: Board, rows: string[][]) { FILE: backend/src/api/board-hierarchy-get.ts type ItemHierarchy (line 25) | type ItemHierarchy = Item & { children: ItemHierarchy[] } function getBoardHierarchy (line 26) | function getBoardHierarchy(board: Board) { FILE: backend/src/api/board-history-get.ts function streamingJSONBody (line 27) | function streamingJSONBody(fieldName: string, generator: (callback: (ite... FILE: backend/src/api/item-create-or-update.ts function updateItem (line 88) | function updateItem( FILE: backend/src/api/utils.ts function checkBoardAPIAccess (line 26) | async function checkBoardAPIAccess( function findContainer (line 55) | function findContainer(container: string | undefined, board: Board): Con... function getItemAttributesForContainer (line 72) | function getItemAttributesForContainer(container: string | undefined, bo... function dispatchSystemAppEvent (line 84) | function dispatchSystemAppEvent(board: ServerSideBoardState, appEvent: P... function addItem (line 94) | function addItem( class InvalidRequest (line 120) | class InvalidRequest extends Error { method constructor (line 121) | constructor(message: string) { FILE: backend/src/board-state.ts type ServerSideBoardState (line 13) | type ServerSideBoardState = { type ServerSideBoardStateInternal (line 29) | type ServerSideBoardStateInternal = function getBoard (line 38) | async function getBoard(id: Id): Promise { function maybeGetBoard (line 88) | function maybeGetBoard(id: Id): ServerSideBoardState | undefined { function updateBoards (line 93) | function updateBoards(boardState: ServerSideBoardState, appEvent: BoardH... function updateBoardCrdt (line 108) | function updateBoardCrdt(id: Id, crdtUpdate: Uint8Array) { function addBoard (line 118) | async function addBoard(board: Board, createToken?: boolean): Promise { function fetchBoard (line 45) | async function fetchBoard(id: Id): Promise { function createBoard (line 127) | async function createBoard(board: Board): Promise { function updateAccessPolicy (line 147) | async function updateAccessPolicy(boardId: string, accessPolicy: BoardAc... function renameBoardConvenienceColumnOnly (line 171) | async function renameBoardConvenienceColumnOnly(boardId: Id, name: strin... function updateBoardAccessPolicy (line 179) | async function updateBoardAccessPolicy(boardId: Id, accessPolicy: BoardA... function createAccessToken (line 187) | async function createAccessToken(board: Board): Promise { type StreamingBoardEventCallback (line 195) | type StreamingBoardEventCallback = (chunk: BoardHistoryEntry[]) => void function streamingBoardEventsQuery (line 199) | function streamingBoardEventsQuery(text: string, values: any[], client: ... function getFullBoardHistory (line 223) | function getFullBoardHistory(id: Id, client: PoolClient, cb: StreamingBo... function getBoardHistory (line 237) | async function getBoardHistory(id: Id, afterSerial: Serial, cb: Streamin... function verifyContinuity (line 302) | function verifyContinuity(boardId: Id, init: Serial, ...histories: Board... function verifyEventArrayContinuity (line 314) | function verifyEventArrayContinuity(boardId: Id, init: Serial, events: B... function verifyTwoPoints (line 324) | function verifyTwoPoints(boardId: Id, a: Serial, b: Serial) { function mkSnapshot (line 332) | function mkSnapshot(board: Board, serial: Serial) { function saveBoardSnapshot (line 337) | async function saveBoardSnapshot(board: Board, client: PoolClient) { function storeEventHistoryBundle (line 348) | async function storeEventHistoryBundle( function storeCRDTOnlyEventHistoryBundle (line 375) | async function storeCRDTOnlyEventHistoryBundle( type BoardHistoryBundle (line 391) | type BoardHistoryBundle = { function getBoardHistoryBundlesWithLastSerialsBetween (line 400) | async function getBoardHistoryBundlesWithLastSerialsBetween( function getBoardHistoryCrdtUpdates (line 419) | async function getBoardHistoryCrdtUpdates(client: PoolClient, id: Id): P... function migrateBundle (line 433) | function migrateBundle(b: BoardHistoryBundle): BoardHistoryBundle { type BoardHistoryBundleMeta (line 437) | type BoardHistoryBundleMeta = { function getBoardHistoryBundleMetas (line 444) | async function getBoardHistoryBundleMetas(client: PoolClient, id: Id): P... function verifyContinuityFromMetas (line 458) | function verifyContinuityFromMetas(boardId: Id, init: Serial, bundles: B... function findAllBoards (line 478) | async function findAllBoards(client: PoolClient): Promise { FILE: backend/src/board-yjs-server.ts function closeYjsSocketsBySessionId (line 14) | function closeYjsSocketsBySessionId(sessionId: string) { function BoardYJSServer (line 56) | function BoardYJSServer(ws: expressWs.Instance, path: string) { FILE: backend/src/common-event-handler.ts function handleCommonEvent (line 17) | async function handleCommonEvent(socket: WsWrapper, appEvent: AppEvent):... FILE: backend/src/compact-history.ts function chunkBy (line 16) | function chunkBy(arr: T[], shouldSplit: (a: T, b: T) => boolean) { function getHour (line 29) | function getHour(b: BoardHistoryBundleMeta) { function quickCompactBoardHistory (line 33) | async function quickCompactBoardHistory(id: Id): Promise { FILE: backend/src/config.ts type StorageBackend (line 8) | type StorageBackend = Readonly< type Config (line 11) | type Config = Readonly<{ storageBackend: StorageBackend; authSupported: ... type CrdtConfigString (line 19) | type CrdtConfigString = t.TypeOf FILE: backend/src/connection-handler.ts type ConnectionHandlerParams (line 8) | type ConnectionHandlerParams = Readonly<{ type MessageHandler (line 67) | type MessageHandler = (socket: WsWrapper, appEvent: AppEvent) => Promise... type MessageHandlerResult (line 68) | type MessageHandlerResult = { boardId: Id; serial: Serial } | boolean FILE: backend/src/db.ts constant DATABASE_URL (line 5) | const DATABASE_URL = process.env.DATABASE_URL ?? "postgres://r-board:sec... constant DATABASE_SSL_ENABLED (line 6) | const DATABASE_SSL_ENABLED = process.env.DATABASE_SSL_ENABLED === "true" function closeConnectionPool (line 18) | function closeConnectionPool() { function initDB (line 22) | async function initDB(backendDir: string = ".") { function withDBClient (line 45) | async function withDBClient(f: (client: PoolClient) => Promise): P... function inTransaction (line 56) | async function inTransaction(f: (client: PoolClient) => Promise): ... FILE: backend/src/decodeOrThrow.ts function decodeOrThrow (line 5) | function decodeOrThrow(codec: t.Type, input: any): T { class ValidationError (line 13) | class ValidationError extends Error { method constructor (line 14) | constructor(errors: Left) { function report_ (line 19) | function report_(errors: t.Errors) { FILE: backend/src/env.ts function getEnv (line 3) | function getEnv(name: string): string { FILE: backend/src/expiring-map.ts function AutoExpiringMap (line 1) | function AutoExpiringMap(ttlSeconds: number) { FILE: backend/src/express-server.ts function startWs (line 143) | function startWs(http: any, app: express.Express) { FILE: backend/src/generic-oidc-auth.ts type GenericOAuthConfig (line 12) | type GenericOAuthConfig = { function GenericOIDCAuthProvider (line 28) | function GenericOIDCAuthProvider(config: GenericOAuthConfig): AuthProvid... FILE: backend/src/google-auth.ts type GoogleConfig (line 12) | type GoogleConfig = { function googleOAUTH2 (line 31) | function googleOAUTH2() { function getAuthPageURL (line 37) | async function getAuthPageURL() { function getAccountFromCode (line 52) | async function getAccountFromCode(code: string): Promise any) { function obtainLock (line 32) | function obtainLock(locks: ServerSideBoardState["locks"], e: BoardItemEv... function releaseLocksFor (line 49) | function releaseLocksFor(socket: WsWrapper) { FILE: backend/src/oauth.ts type AuthProvider (line 8) | interface AuthProvider { function setupAuth (line 14) | function setupAuth(app: Express, provider: AuthProvider) { FILE: backend/src/professions.ts function randomProfession (line 70) | function randomProfession() { FILE: backend/src/require-auth.ts constant REQUIRE_AUTH (line 4) | const REQUIRE_AUTH = process.env.REQUIRE_AUTH === "true" function possiblyRequireAuth (line 6) | function possiblyRequireAuth(app: Express) { FILE: backend/src/s3.ts function getSignedPutUrl (line 16) | function getSignedPutUrl(Key: string) { FILE: backend/src/server.ts function shutdown (line 14) | async function shutdown() { constant PORT (line 29) | const PORT = parseInt(process.env.PORT || "1337") constant HTTPS_PORT (line 30) | const HTTPS_PORT = process.env.HTTPS_PORT ? parseInt(process.env.HTTPS_P... constant BIND_UWEBSOCKETS_TO_PORT (line 31) | const BIND_UWEBSOCKETS_TO_PORT = process.env.BIND_UWEBSOCKETS_TO_PORT ==... constant HTTP_PORT (line 35) | const HTTP_PORT = BIND_UWEBSOCKETS_TO_PORT ? null : PORT constant UWEBSOCKETS_PORT (line 36) | const UWEBSOCKETS_PORT = BIND_UWEBSOCKETS_TO_PORT FILE: backend/src/storage.ts function localFSGetSignedPutUrl (line 4) | function localFSGetSignedPutUrl(Key: string): string { FILE: backend/src/user-store.ts function getUserIdForEmail (line 6) | function getUserIdForEmail(email: string): Promise { function associateUserWithBoard (line 17) | async function associateUserWithBoard( function dissociateUserWithBoard (line 35) | async function dissociateUserWithBoard(userId: string, boardId: Id) { function getUserAssociatedBoards (line 45) | async function getUserAssociatedBoards(user: EventUserInfoAuthenticated)... FILE: backend/src/uwebsockets-server.ts type WsWrapper (line 46) | type WsWrapper = ReturnType type WsUserData (line 48) | type WsUserData = { function startUWebSocketsServer (line 52) | function startUWebSocketsServer(port: number) { FILE: backend/src/websocket-sessions.ts type UserSession (line 29) | type UserSession = { type UserSessionBoardEntry (line 38) | type UserSessionBoardEntry = { type SocketId (line 50) | type SocketId = string function startSession (line 68) | function startSession(socket: WsWrapper) { function userSession (line 72) | function userSession(socket: WsWrapper): UserSession { function anonymousUser (line 98) | function anonymousUser(nickname: string): UnidentifiedUserInfo { function endSession (line 102) | function endSession(socket: WsWrapper) { function getBoardSessionCount (line 121) | function getBoardSessionCount(id: Id) { function getSession (line 124) | function getSession(socket: WsWrapper): UserSession | undefined { function getSessionById (line 128) | function getSessionById(sessionId: string): UserSession | undefined { function terminateSessions (line 132) | function terminateSessions() { function addSessionToBoard (line 136) | async function addSessionToBoard( function initAsNew (line 241) | function initAsNew(session: UserSession, boardId: string, accessLevel: A... function setNicknameForSession (line 250) | function setNicknameForSession(event: SetNickname, origin: WsWrapper) { function setVerifiedUserForSession (line 271) | async function setVerifiedUserForSession( function logoutUser (line 297) | function logoutUser(event: AuthLogout, origin: WsWrapper) { function broadcastBoardEvent (line 306) | function broadcastBoardEvent(event: EventFromServer & { boardId: string ... function broadcastJoinEvent (line 311) | function broadcastJoinEvent(boardId: Id, session: UserSession) { function broadcastCursorPositions (line 320) | function broadcastCursorPositions(boardId: Id, positions: Record type CachedBuffer (line 39) | type CachedBuffer = { msg: EventFromServer; buffer: Buffer } function toBuffer (line 41) | function toBuffer(msg: EventFromServer) { FILE: backend/src/y-websocket-server/Docs.ts type DocsOptions (line 4) | interface DocsOptions { type DocState (line 9) | interface DocState { class Docs (line 14) | class Docs { method constructor (line 19) | constructor(options: DocsOptions = {}) { method getYDoc (line 27) | getYDoc(docname: string): WSSharedDoc { method getYDocAndWaitForFetch (line 31) | async getYDocAndWaitForFetch(docname: string): Promise { method getDocState (line 37) | private getDocState(docname: string): DocState { method deleteYDoc (line 54) | deleteYDoc(doc: WSSharedDoc) { FILE: backend/src/y-websocket-server/Persistence.ts type Persistence (line 3) | interface Persistence { function createLevelDbPersistence (line 8) | function createLevelDbPersistence(persistenceDir: string): Persistence { FILE: backend/src/y-websocket-server/WSSharedDoc.ts class WSSharedDoc (line 16) | class WSSharedDoc extends Y.Doc { method constructor (line 22) | constructor(docs: Docs, name: string) { method send (line 68) | send(conn: WebSocket, m: Uint8Array) { method closeConn (line 82) | closeConn(conn: WebSocket) { method addConnection (line 98) | addConnection(conn: WebSocket) { method hasConnection (line 102) | hasConnection(conn: WebSocket) { FILE: backend/src/y-websocket-server/YWebSocketServer.ts class YWebSocketServer (line 13) | class YWebSocketServer { method constructor (line 15) | constructor(options?: DocsOptions) { method setupWSConnection (line 19) | async setupWSConnection(conn: WebSocket, docName: string, readOnly: bo... FILE: benchmark/benchmark.ts type Foo (line 6) | type Foo = Board function createRandomItems (line 8) | function createRandomItems(count: number): Item[] { function createTestBoard (line 27) | function createTestBoard(size = 1000): Board { FILE: common/src/action-folding.ts type FoldOptions (line 11) | type FoldOptions = { constant CURSORS_ONLY (line 20) | const CURSORS_ONLY: FoldOptions = { cursorsOnly: true } function foldActions (line 22) | function foldActions(a: AppEvent, b: AppEvent, options: FoldOptions = de... function foldActions_ (line 39) | function foldActions_(a: AppEvent, b: AppEvent, options: FoldOptions = d... function everyMovedItemMatches (line 74) | function everyMovedItemMatches(evt: MoveItem, evt2: MoveItem) { function addOrReplaceEvent (line 78) | function addOrReplaceEvent(event: E, q: E[], options... FILE: common/src/arrays.ts function toArray (line 3) | function toArray(x: T | T[]) { function arrayIdMatch (line 8) | function arrayIdMatch(a: T[] | T, b: T[] | T) { function arrayObjectKeysMatch (line 12) | function arrayObjectKeysMatch(a: T[] | T, b: T[] | T) { function arrayIdAndKeysMatch (line 16) | function arrayIdAndKeysMatch(a: T[] | T, b: T[... function idsOf (line 20) | function idsOf(a: T[] | T): string[] { function keysOf (line 24) | function keysOf(a: T[] | T): string[][] { function arrayEquals (line 28) | function arrayEquals(a: T[] | T, b: T[] | T) { function arrayToRecordById (line 32) | function arrayToRecordById(arr: T[], init: Rec... FILE: common/src/assertNotNull.ts function assertNotNull (line 1) | function assertNotNull(x: T | null | undefined): T { FILE: common/src/authenticated-user.ts type OAuthAuthenticatedUser (line 1) | type OAuthAuthenticatedUser = { FILE: common/src/board-crdt-helper.ts function getCRDTField (line 4) | function getCRDTField(doc: Y.Doc, itemId: Id, fieldName: string) { function augmentBoardWithCRDT (line 8) | function augmentBoardWithCRDT(doc: Y.Doc, board: Board): Board { function augmentItemsWithCRDT (line 16) | function augmentItemsWithCRDT(doc: Y.Doc, items: Item[]): Item[] { function importItemsIntoCRDT (line 28) | function importItemsIntoCRDT(doc: Y.Doc, items: Item[], options?: { fall... FILE: common/src/board-reducer.benchmark.ts function createBoard (line 8) | function createBoard(): Board { FILE: common/src/board-reducer.ts type BoardReducerOptions (line 47) | type BoardReducerOptions = { function boardReducer (line 52) | function boardReducer( function copyMatchingKeysFromOriginal (line 349) | function copyMatchingKeysFromOriginal(update: Upda... function validateConnection (line 355) | function validateConnection(board: Board, connection: Connection) { function validateEndPoint (line 360) | function validateEndPoint(board: Board, connection: Connection, key: "to... function updateConnections (line 370) | function updateConnections(board: Board, updates: ConnectionUpdate[]): C... function updateItems (line 388) | function updateItems( function applyModification (line 469) | function applyModification( function applyListModification (line 479) | function applyListModification(list: T[], modification: (list: T[]) =... function replaceById (line 485) | function replaceById(list: T[], replacements: T[]) { function applyFontSize (line 495) | function applyFontSize(items: Record, factor: number, item... function filterItemIdsByPermissions (line 513) | function filterItemIdsByPermissions(itemIds: Id[], board: Board, permiss... function filterConnectionIdsByPermissions (line 517) | function filterConnectionIdsByPermissions(connectionIds: Id[], board: Bo... function filterMoveByPermissions (line 521) | function filterMoveByPermissions(event: MoveItem, board: Board) { function filterItemUpdatesByPermissions (line 529) | function filterItemUpdatesByPermissions(updates: ItemUpdate[], board: Bo... function filterConnectionUpdatesByPermissions (line 556) | function filterConnectionUpdatesByPermissions(updates: ConnectionUpdate[... function moveItems (line 578) | function moveItems(board: Board, event: MoveItem, inplace: boolean) { type Move (line 664) | type Move = { xDiff: number; yDiff: number } type ItemMove (line 665) | type ItemMove = Move & { containerChanged: boolean; containerId: Id | un... type ConnectionMove (line 666) | type ConnectionMove = (Move & { ends: "both" }) | { ends: "one" } function findConnectionMove (line 668) | function findConnectionMove( function moveEndPoint (line 697) | function moveEndPoint(endPoint: ConnectionEndPoint, move: Move) { function containedBy (line 706) | function containedBy(a: Point, b: Rect) { FILE: common/src/colors.ts constant LIGHT_BLUE (line 1) | const LIGHT_BLUE = "#9FECFC" constant LIGHT_GREEN (line 2) | const LIGHT_GREEN = "#C8FC87" constant YELLOW (line 3) | const YELLOW = "#FBFC86" constant ORANGE (line 4) | const ORANGE = "#FDDF90" constant PINK (line 5) | const PINK = "#FDC4E7" constant LIGHT_PURPLE (line 6) | const LIGHT_PURPLE = "#E0BDFA" constant RED (line 7) | const RED = "#F62A5C" constant BLACK (line 8) | const BLACK = "#000000" constant LIGHT_GRAY (line 9) | const LIGHT_GRAY = "#f4f4f6" constant WHITE (line 10) | const WHITE = "#ffffff" constant TRANSPARENT (line 11) | const TRANSPARENT = "#ffffff00" constant DEFAULT_NOTE_COLOR (line 12) | const DEFAULT_NOTE_COLOR = YELLOW constant NOTE_COLORS (line 14) | const NOTE_COLORS = [ FILE: common/src/connection-utils.ts function resolveEndpoint (line 21) | function resolveEndpoint(e: Point | Item | ConnectionEndPoint, b: Board ... function resolveItemEndpoint (line 28) | function resolveItemEndpoint(e: ConnectionEndPointToItem, b: Board | Rec... function findNearestAttachmentLocationForConnectionNode (line 32) | function findNearestAttachmentLocationForConnectionNode( function angleDiff (line 42) | function angleDiff(option: ItemAttachmentLocation, from: Point) { function withStraightestAngle (line 50) | function withStraightestAngle(options: ItemAttachmentLocation[], to: Poi... function getEndPointDirection (line 54) | function getEndPointDirection(side: AttachmentSide): Vector2 { function findItemAttachmentLocations (line 69) | function findItemAttachmentLocations(i: Item): ItemAttachmentLocation[] { function p (line 73) | function p(x: number, y: number) { function findAttachmentLocation (line 77) | function findAttachmentLocation(i: Item, side: AttachmentSide): ItemAtta... function findMidpoint (line 91) | function findMidpoint(fromCoords: AttachmentLocation, toCoords: Attachme... function attachmentLocation2EndPoint (line 123) | function attachmentLocation2EndPoint(l: AttachmentLocation): ConnectionE... function rerouteConnection (line 130) | function rerouteConnection(c: Connection, b: Board): Connection { function rerouteEndPoint (line 150) | function rerouteEndPoint(e: ConnectionEndPoint, from: ConnectionEndPoint... function rerouteByNewControlPoints (line 156) | function rerouteByNewControlPoints(c: Connection, controlPoints: Point[]... function mid (line 167) | function mid(x: number, y: number) { function isFullyContainedConnection (line 189) | function isFullyContainedConnection(connection: Connection, item: Item, ... FILE: common/src/domain.ts type Id (line 8) | type Id = string type ISOTimeStamp (line 9) | type ISOTimeStamp = string function newISOTimeStamp (line 11) | function newISOTimeStamp(): ISOTimeStamp { function optional (line 15) | function optional>(c: T) { type CrdtMode (line 21) | type CrdtMode = typeof CrdtDisabled | typeof CrdtEnabled type BoardAttributes (line 23) | type BoardAttributes = { type BoardContents (line 32) | type BoardContents = { type Board (line 37) | type Board = BoardAttributes & type BoardStub (line 42) | type BoardStub = Pick & ... type AccessLevel (line 50) | type AccessLevel = t.TypeOf type AccessListEntry (line 61) | type AccessListEntry = t.TypeOf type BoardAccessPolicyDefined (line 67) | type BoardAccessPolicyDefined = t.TypeOf type EventUserInfo (line 71) | type EventUserInfo = UnidentifiedUserInfo | SystemUserInfo | EventUserIn... type UnidentifiedUserInfo (line 73) | type UnidentifiedUserInfo = { nickname: string; userType: "unidentified" } type SystemUserInfo (line 74) | type SystemUserInfo = { nickname: string; userType: "system" } type EventUserInfoAuthenticated (line 76) | type EventUserInfoAuthenticated = { type SessionUserInfo (line 84) | type SessionUserInfo = UnidentifiedUserInfo | SystemUserInfo | SessionUs... type SessionUserInfoAuthenticated (line 86) | type SessionUserInfoAuthenticated = { type UserSessionInfo (line 96) | type UserSessionInfo = SessionUserInfo & { type BoardHistoryEntry (line 100) | type BoardHistoryEntry = { type BoardWithHistory (line 106) | type BoardWithHistory = { board: Board; history: BoardHistoryEntry[] } type CompactBoardHistory (line 107) | type CompactBoardHistory = { boardAttributes: BoardAttributes; history: ... type CursorPosition (line 111) | interface CursorPosition { type UserCursorPosition (line 116) | type UserCursorPosition = CursorPosition & { type BoardCursorPositions (line 120) | type BoardCursorPositions = Record type Color (line 122) | type Color = string type ItemBounds (line 124) | type ItemBounds = { x: number; y: number; width: number; height: number;... type LockState (line 125) | type LockState = false | "locked" | "read-only" type ItemProperties (line 126) | type ItemProperties = { id: string; containerId?: string; locked: LockSt... constant ITEM_TYPES (line 128) | const ITEM_TYPES = { type ItemType (line 135) | type ItemType = typeof ITEM_TYPES[keyof typeof ITEM_TYPES] type QuillDelta (line 136) | type QuillDelta = any // TODO: define this properly type TextItemProperties (line 137) | type TextItemProperties = ItemProperties & { type NoteShape (line 144) | type NoteShape = "round" | "square" | "rect" | "diamond" type Note (line 145) | type Note = TextItemProperties & { type Text (line 150) | type Text = TextItemProperties & { type: typeof ITEM_TYPES.TEXT; color: ... type Image (line 151) | type Image = ItemProperties & { type: typeof ITEM_TYPES.IMAGE; assetId: ... type Video (line 152) | type Video = ItemProperties & { type: typeof ITEM_TYPES.VIDEO; assetId: ... type Container (line 153) | type Container = TextItemProperties & { type Point (line 159) | type Point = { x: number; y: number } function Point (line 160) | function Point(x: number, y: number) { type ConnectionEndStyle (line 164) | type ConnectionEndStyle = "none" | "arrow" | "black-dot" type Connection (line 165) | type Connection = { type ConnectionEndPoint (line 178) | type ConnectionEndPoint = Point | ConnectionEndPointToItem type ConnectionEndPointToItem (line 179) | type ConnectionEndPointToItem = Id | ConectionEndPointDirectedToItem type ConectionEndPointDirectedToItem (line 180) | type ConectionEndPointDirectedToItem = { id: Id; side: AttachmentSide } function getEndPointItemId (line 181) | function getEndPointItemId(e: ConnectionEndPointToItem) { function isItemEndPoint (line 185) | function isItemEndPoint(e: ConnectionEndPoint): e is ConnectionEndPointT... function isDirectedItemEndPoint (line 190) | function isDirectedItemEndPoint(e: ConnectionEndPoint): e is ConectionEn... type AttachmentSide (line 193) | type AttachmentSide = "left" | "right" | "top" | "bottom" type AttachmentLocation (line 194) | type AttachmentLocation = { side: "none"; point: Point } | ItemAttachmen... type ItemAttachmentLocation (line 195) | type ItemAttachmentLocation = { side: AttachmentSide; point: Point; item... type RenderableConnection (line 197) | type RenderableConnection = Omit & { type TextItem (line 202) | type TextItem = Note | Text | Container type ColoredItem (line 203) | type ColoredItem = Item & { color: Color } type ShapedItem (line 204) | type ShapedItem = Note type Item (line 205) | type Item = TextItem | Image | Video type ItemLocks (line 206) | type ItemLocks = Record type RecentBoardAttributes (line 208) | type RecentBoardAttributes = { id: Id; name: string } type RecentBoard (line 209) | type RecentBoard = RecentBoardAttributes & { opened: ISOTimeStamp; userE... type BoardEvent (line 211) | type BoardEvent = { boardId: Id } type UIEvent (line 212) | type UIEvent = BoardItemEvent | ClientToServerRequest | LocalUIEvent type LocalUIEvent (line 213) | type LocalUIEvent = Undo | Redo | SetLocalBoard | GoOnline | BoardLogged... type EventFromServer (line 214) | type EventFromServer = BoardHistoryEntry | BoardStateSyncEvent | LoginRe... type ServerConfig (line 215) | type ServerConfig = { type Serial (line 221) | type Serial = number type AppEvent (line 222) | type AppEvent = type EventWrapper (line 230) | type EventWrapper = { type PersistableBoardItemEvent (line 234) | type PersistableBoardItemEvent = type BoardInit (line 248) | type BoardInit = InitBoardNew | InitBoardDiff type TransientBoardItemEvent (line 249) | type TransientBoardItemEvent = LockItem | UnlockItem type BoardItemEvent (line 250) | type BoardItemEvent = PersistableBoardItemEvent | TransientBoardItemEvent type BoardStateSyncEvent (line 251) | type BoardStateSyncEvent = type ClientToServerRequest (line 267) | type ClientToServerRequest = type LoginResponse (line 283) | type LoginResponse = type AddConnection (line 286) | type AddConnection = { action: "connection.add"; boardId: Id; connection... type ModifyConnection (line 287) | type ModifyConnection = { action: "connection.modify"; boardId: Id; conn... type DeleteConnection (line 288) | type DeleteConnection = { action: "connection.delete"; boardId: Id; conn... type UserLoggedIn (line 289) | type UserLoggedIn = { type AuthJWTLogin (line 295) | type AuthJWTLogin = { type AuthLogout (line 299) | type AuthLogout = { action: "auth.logout" } type Ping (line 300) | type Ping = { action: "ping" } type AddItem (line 301) | type AddItem = { action: "item.add"; boardId: Id; items: Item[]; connect... type UpdateItem (line 302) | type UpdateItem = { action: "item.update"; boardId: Id; items: ItemUpdat... type Update (line 303) | type Update = Partial & { id: Id } type ItemUpdate (line 304) | type ItemUpdate = Update type ConnectionUpdate (line 305) | type ConnectionUpdate = Update type MoveItem (line 306) | type MoveItem = { type IncreaseItemFont (line 312) | type IncreaseItemFont = { action: "item.font.increase"; boardId: Id; ite... type DecreaseItemFont (line 313) | type DecreaseItemFont = { action: "item.font.decrease"; boardId: Id; ite... type BringItemToFront (line 314) | type BringItemToFront = { action: "item.front"; boardId: Id; itemIds: Id... type DeleteItem (line 315) | type DeleteItem = { action: "item.delete"; boardId: Id; itemIds: Id[]; c... type BootstrapBoard (line 316) | type BootstrapBoard = { action: "item.bootstrap"; boardId: Id } & BoardC... type LockItem (line 317) | type LockItem = { action: "item.lock"; boardId: Id; itemId: Id } type UnlockItem (line 318) | type UnlockItem = { action: "item.unlock"; boardId: Id; itemId: Id } type GotBoardLocks (line 319) | type GotBoardLocks = { action: "board.locks"; boardId: Id; locks: ItemLo... type AddBoard (line 320) | type AddBoard = { action: "board.add"; payload: Board | BoardStub } type AckAddBoard (line 321) | type AckAddBoard = { action: "board.add.ack"; boardId: Id } type JoinBoard (line 322) | type JoinBoard = { action: "board.join"; boardId: Id; initAtSerial?: Ser... type BringAllToMe (line 323) | type BringAllToMe = { action: "user.bringAllToMe"; boardId: Id; sessionI... type AssociateBoard (line 324) | type AssociateBoard = { action: "board.associate"; boardId: Id; lastOpen... type DissociateBoard (line 325) | type DissociateBoard = { action: "board.dissociate"; boardId: Id } type SetBoardAccessPolicy (line 326) | type SetBoardAccessPolicy = { type AckJoinBoard (line 331) | type AckJoinBoard = { action: "board.join.ack"; boardId: Id } & UserSess... type DeniedJoinBoard (line 332) | type DeniedJoinBoard = type RecentBoardsFromServer (line 344) | type RecentBoardsFromServer = { action: "user.boards"; email: string; bo... type Ack (line 345) | type Ack = { action: "ack"; ackId: string; serials: Record } type ActionApplyFailed (line 346) | type ActionApplyFailed = { action: "board.action.apply.failed" } type JoinedBoard (line 347) | type JoinedBoard = { action: "board.joined"; boardId: Id } & UserSession... type LeftBoard (line 348) | type LeftBoard = { action: "board.left"; boardId: Id; sessionId: Id } type UserInfoUpdate (line 349) | type UserInfoUpdate = { action: "userinfo.set" } & UserSessionInfo type InitBoardNew (line 350) | type InitBoardNew = { action: "board.init"; board: Board; accessLevel: A... type InitBoardDiff (line 351) | type InitBoardDiff = { type RenameBoard (line 360) | type RenameBoard = { action: "board.rename"; boardId: Id; name: string } type CursorMove (line 361) | type CursorMove = { action: "cursor.move"; position: CursorPosition; boa... type SetNickname (line 362) | type SetNickname = { action: "nickname.set"; nickname: string } type AssetPutUrlRequest (line 363) | type AssetPutUrlRequest = { action: "asset.put.request"; assetId: string } type AssetPutUrlResponse (line 364) | type AssetPutUrlResponse = { action: "asset.put.response"; assetId: stri... type Undo (line 365) | type Undo = { action: "ui.undo" } type Redo (line 366) | type Redo = { action: "ui.redo" } type TextFormat (line 367) | type TextFormat = { action: "ui.text.format"; itemIds: Id[]; format: "bo... type SetLocalBoard (line 369) | type SetLocalBoard = { type BoardLoggedOut (line 374) | type BoardLoggedOut = { action: "ui.board.logged.out"; boardId: Id } type GoOffline (line 375) | type GoOffline = { action: "ui.offline" } type GoOnline (line 376) | type GoOnline = { action: "ui.online" } constant CURSOR_POSITIONS_ACTION_TYPE (line 378) | const CURSOR_POSITIONS_ACTION_TYPE = "c" as const type CursorPositions (line 379) | type CursorPositions = { action: typeof CURSOR_POSITIONS_ACTION_TYPE; p:... function newBoard (line 394) | function newBoard(name: string, crdt?: CrdtMode, accessPolicy?: BoardAcc... function newNote (line 398) | function newNote( function newSimilarNote (line 411) | function newSimilarNote(note: Note) { function newText (line 415) | function newText( function newContainer (line 439) | function newContainer( function newImage (line 462) | function newImage( function newVideo (line 473) | function newVideo( function isSameUser (line 497) | function isSameUser(a: EventUserInfo, b: EventUserInfo) { function isColoredItem (line 501) | function isColoredItem(i: Item): i is ColoredItem { function isShapedItem (line 505) | function isShapedItem(i: Item): i is ShapedItem { function isTextItem (line 509) | function isTextItem(i: Item): i is TextItem { function isNote (line 513) | function isNote(i: Item): i is Note { function isContainer (line 517) | function isContainer(i: Item): i is Container { function isText (line 521) | function isText(i: Item): i is Text { function isItem (line 525) | function isItem(i: Item | Point | Connection): i is Item { function getItemText (line 529) | function getItemText(i: Item) { function getItemBackground (line 534) | function getItemBackground(i: Item) { function getItemShape (line 541) | function getItemShape(i: Item) { type NamespacedEvent (line 545) | type NamespacedEvent = T extends... function actionNamespaceIs (line 549) | function actionNamespaceIs( function getItemIds (line 556) | function getItemIds(e: BoardHistoryEntry | PersistableBoardItemEvent): I... function findItemIdsRecursively (line 603) | function findItemIdsRecursively(ids: Id[], board: Board): Set { function findItemsRecursively (line 613) | function findItemsRecursively(ids: Id[], board: Board): Item[] { function isBoardEmpty (line 636) | function isBoardEmpty(board: Board) { function getBoardAttributes (line 640) | function getBoardAttributes(board: Board, userInfo?: EventUserInfo): Boa... constant BOARD_ITEM_BORDER_MARGIN (line 655) | const BOARD_ITEM_BORDER_MARGIN = 0.5 function checkBoardAccess (line 657) | function checkBoardAccess(accessPolicy: BoardAccessPolicy | undefined, u... function combineAccessLevels (line 683) | function combineAccessLevels(a: AccessLevel, b: AccessLevel): AccessLevel { function canRead (line 690) | function canRead(a: AccessLevel) { function canWrite (line 694) | function canWrite(a: AccessLevel) { type Align (line 698) | type Align = "TL" | "TC" | "TR" | "ML" | "MC" | "MR" | "BL" | "BC" | "BR" function getAlign (line 700) | function getAlign(item: TextItem) { type HorizontalAlign (line 704) | type HorizontalAlign = "left" | "center" | "right" function getHorizontalAlign (line 706) | function getHorizontalAlign(align: Align): HorizontalAlign { type VerticalAlign (line 725) | type VerticalAlign = "top" | "middle" | "bottom" function getVerticalAlign (line 727) | function getVerticalAlign(align: Align): VerticalAlign { function setHorizontalAlign (line 746) | function setHorizontalAlign(item: I, a: HorizontalAl... function setVerticalAlign (line 752) | function setVerticalAlign(item: I, a: VerticalAlign)... FILE: common/src/geometry.ts type Coordinates (line 3) | type Coordinates = { x: number; y: number } type Dimensions (line 4) | type Dimensions = { width: number; height: number } type Rect (line 5) | type Rect = { x: number; y: number; width: number; height: number } constant ZERO_RECT (line 6) | const ZERO_RECT = { x: 0, y: 0, height: 0, width: 0 } function add (line 7) | function add(a: Coordinates, b: Coordinates) { function subtract (line 11) | function subtract(a: Coordinates, b: Coordinates) { function negate (line 15) | function negate(a: Coordinates) { function multiply (line 19) | function multiply(a: Coordinates, factor: number) { function overlaps (line 23) | function overlaps(a: Rect, b: Rect) { function equalRect (line 31) | function equalRect(a: Rect, b: Rect) { function distance (line 35) | function distance(a: Coordinates, b: Coordinates) { function containedBy (line 41) | function containedBy(a: Rect | Point, b: Rect) { function rectFromPoints (line 49) | function rectFromPoints(a: Coordinates, b: Coordinates) { function isRect (line 59) | function isRect(i: Point | Rect): i is Rect { function centerPoint (line 63) | function centerPoint(i: Point | Rect) { FILE: common/src/migration.ts function mkBootStrapEvent (line 6) | function mkBootStrapEvent(boardId: Id, snapshot: Board, serial: Serial =... function migrateBoard (line 18) | function migrateBoard(origBoard: Board) { function migrateConnection (line 56) | function migrateConnection(c: Connection): Connection { function migrateItem (line 66) | function migrateItem(item: Item, migratedItems: Item[], boardItems: Reco... function migrateEvent (line 99) | function migrateEvent(event: BoardHistoryEntry): BoardHistoryEntry { FILE: common/src/sets.ts function toggleInSet (line 1) | function toggleInSet(item: T, set: Set) { function difference (line 8) | function difference(setA: Set, setB: Set) { FILE: common/src/sleep.ts function sleep (line 1) | function sleep(ms: number): Promise { FILE: common/src/vector2.ts type Vector2 (line 1) | type Vector2 = { x: number; y: number } function Vector2 (line 3) | function Vector2(x: number, y: number) { function getAngleRad (line 7) | function getAngleRad(v: Vector2) { function getAngleDeg (line 12) | function getAngleDeg(v: Vector2) { function getLength (line 16) | function getLength(v: Vector2) { function withLength (line 20) | function withLength(v: Vector2, newLength: number) { function multiply (line 24) | function multiply(v: Vector2, multiplier: number) { function add (line 28) | function add(v: Vector2, other: Vector2) { function rotateRad (line 32) | function rotateRad(v: Vector2, radians: number) { function rotateDeg (line 40) | function rotateDeg(v: Vector2, degrees: number) { function degToRad (line 44) | function degToRad(degrees: number) { function radToDeg (line 48) | function radToDeg(rad: number) { FILE: frontend/esbuild.js method setup (line 18) | setup(build) { method setup (line 34) | setup(build) { constant CWD (line 56) | const CWD = process.cwd() constant DIST_FOLDER (line 57) | const DIST_FOLDER = path.resolve(CWD, "dist") function build (line 61) | async function build() { FILE: frontend/src/board-navigation.ts constant BOARD_PATH (line 7) | const BOARD_PATH = "/b/:boardId" constant ROOT_PATH (line 8) | const ROOT_PATH = "/" type Routes (line 15) | type Routes = typeof Routes function BoardNavigation (line 17) | function BoardNavigation() { function createBoardAndNavigate (line 36) | function createBoardAndNavigate( FILE: frontend/src/board/BoardView.tsx function onURL (line 137) | function onURL(assetId: string, url: string) { function onClick (line 198) | function onClick(e: JSX.UIEvent) { function onAdd (line 223) | function onAdd(item: Item) { function renderSelectionBorder (line 362) | function renderSelectionBorder(id: string, item: L.Property) { function renderItem (line 366) | function renderItem(id: string, item: L.Property) { FILE: frontend/src/board/CollaborativeTextView.tsx type CollaborativeTextViewProps (line 28) | interface CollaborativeTextViewProps { function CollaborativeTextView (line 39) | function CollaborativeTextView({ FILE: frontend/src/board/ConnectionsView.tsx function determineAttachmenLocation (line 36) | function determineAttachmenLocation( type ConnectionNodeProps (line 144) | type ConnectionNodeProps = { function ConnectionNode (line 151) | function ConnectionNode(key: string, cNode: L.Property function boardCoordinateHelper (line 19) | function boardCoordinateHelper( FILE: frontend/src/board/board-drag.ts type DragAction (line 15) | type DragAction = function boardDragHandler (line 21) | function boardDragHandler({ FILE: frontend/src/board/board-focus.ts type BoardFocus (line 5) | type BoardFocus = function getSelectedItemIds (line 13) | function getSelectedItemIds(f: BoardFocus): Set { function getSelectedConnectionIds (line 27) | function getSelectedConnectionIds(f: BoardFocus): Set { function removeFromSelection (line 55) | function removeFromSelection( function removeNonExistingFromSelection (line 78) | function removeNonExistingFromSelection(selection: BoardFocus, board: Bo... FILE: frontend/src/board/board-permissions.ts type BoardPermission (line 14) | type BoardPermission = (item: Item | Connection) => boolean FILE: frontend/src/board/board-scroll-and-zoom.ts type BoardZoom (line 11) | type BoardZoom = { zoom: number; quickZoom: number } type ZoomAdjustMode (line 12) | type ZoomAdjustMode = "preserveCursor" | "preserveCenter" function nonNull (line 14) | function nonNull(x: A | null | undefined): x is A { type ZoomAndScrollControls (line 18) | type ZoomAndScrollControls = ReturnType function boardScrollAndZoomHandler (line 20) | function boardScrollAndZoomHandler( FILE: frontend/src/board/boardContentArea.ts function combineRects (line 5) | function combineRects(r1: Rect, r2: Rect): Rect { function itemToRect (line 13) | function itemToRect(item: Rect): Rect { function addMargin (line 17) | function addMargin(rect: Rect, margin: number): Rect { function setMinimumSizeKeepingCenter (line 26) | function setMinimumSizeKeepingCenter(rect: Rect, minimumSize: { width: n... function clampIntoKeepingSize (line 38) | function clampIntoKeepingSize(rect: Rect, bounds: Rect) { function growToProportions (line 48) | function growToProportions(rect: Rect, proportions: { width: number; hei... function boardContentArea (line 65) | function boardContentArea(b: Board, viewPortDimensions: { width: number;... FILE: frontend/src/board/contextmenu/ContextMenuView.tsx type SubmenuProps (line 20) | type SubmenuProps = { type SubMenuCreator (line 27) | type SubMenuCreator = (props: SubmenuProps) => HarmajaOutput type ItemsAndConnections (line 39) | type ItemsAndConnections = { items: Item[]; connections: Connection[] } type Bounds (line 40) | type Bounds = { minX: number; maxX: number; minY: number; maxY: number }... FILE: frontend/src/board/contextmenu/alignments.tsx function alignmentsMenu (line 22) | function alignmentsMenu(axis: Axis, props: SubmenuProps) { type Axis (line 47) | type Axis = "x" | "y" type GetCoordinate (line 48) | type GetCoordinate = ( function getItemSize (line 59) | function getItemSize(item: Item, axis: Axis) { function moveFocusedItems (line 63) | function moveFocusedItems( function alignmentsSubMenu (line 99) | function alignmentsSubMenu(axis: Axis, props: SubmenuProps) { FILE: frontend/src/board/contextmenu/areaTiling.tsx function areaTilingMenu (line 10) | function areaTilingMenu({ board, focusedItems, dispatch }: SubmenuProps) { FILE: frontend/src/board/contextmenu/colors.tsx function colorsSubMenu (line 7) | function colorsSubMenu({ board, focusedItems, dispatch }: SubmenuProps) { function itemColorOrDefault (line 43) | function itemColorOrDefault(items: Item[]) { FILE: frontend/src/board/contextmenu/colorsAndShapes.tsx function createSubMenu (line 11) | function createSubMenu(props: SubmenuProps) { function colorsAndShapesMenu (line 20) | function colorsAndShapesMenu(props: SubmenuProps) { FILE: frontend/src/board/contextmenu/connection-ends.tsx function nextStyle (line 19) | function nextStyle(style: ConnectionEndStyle) { function connectionEndsMenu (line 24) | function connectionEndsMenu({ board, focusedItems, dispatch }: SubmenuPr... FILE: frontend/src/board/contextmenu/fontSizes.tsx type MenuIconProps (line 9) | type MenuIconProps = { function fontSizesMenu (line 28) | function fontSizesMenu({ board, focusedItems, dispatch }: SubmenuProps) { FILE: frontend/src/board/contextmenu/hideContents.tsx function hideContentsMenu (line 9) | function hideContentsMenu({ board, focusedItems, dispatch }: SubmenuProp... FILE: frontend/src/board/contextmenu/lock.tsx function lockMenu (line 8) | function lockMenu({ board, focusedItems, dispatch }: SubmenuProps) { FILE: frontend/src/board/contextmenu/shapes.tsx type ShapeIcon (line 16) | type ShapeIcon = (c: Color, f?: Color) => HarmajaOutput type ShapeIconAndId (line 17) | type ShapeIconAndId = { id: NoteShape; svg: ShapeIcon } function getShapeIcon (line 20) | function getShapeIcon(item: Item): ShapeIcon { function shapesSubMenu (line 24) | function shapesSubMenu({ board, focusedItems, dispatch }: SubmenuProps) { FILE: frontend/src/board/contextmenu/textAlignments.tsx function textAlignmentsMenu (line 30) | function textAlignmentsMenu({ board, focusedItems, dispatch }: SubmenuPr... function getIfSame (line 101) | function getIfSame(items: I[], get: (item: I) => P | null, default... FILE: frontend/src/board/contextmenu/textFormats.tsx function textFormatsMenu (line 8) | function textFormatsMenu({ board, focusedItems, dispatch }: SubmenuProps) { FILE: frontend/src/board/contrasting-color.ts type RGB (line 1) | interface RGB { function rgbToYIQ (line 6) | function rgbToYIQ({ r, g, b }: RGB): number { function hexToRgb (line 9) | function hexToRgb(hex: string): RGB | undefined { function contrastingColor (line 25) | function contrastingColor(colorNameOrHex: string | undefined, threshold:... function colorNameToHex (line 184) | function colorNameToHex(c: string) { FILE: frontend/src/board/double-click.ts function installDoubleClickHandler (line 5) | function installDoubleClickHandler(action: (e: JSX.UIEvent) => void) { function preventDoubleClick (line 32) | function preventDoubleClick(e: JSX.TouchEvent) { FILE: frontend/src/board/header/BoardViewHeader.tsx function BoardViewHeader (line 17) | function BoardViewHeader({ FILE: frontend/src/board/header/OtherUsersView.tsx type OtherUsersViewProps (line 9) | type OtherUsersViewProps = { FILE: frontend/src/board/header/SharingModalDialog.tsx function copyToClipboard (line 23) | function copyToClipboard() { function saveChanges (line 28) | function saveChanges() { FILE: frontend/src/board/header/UserInfoView.tsx function dismiss (line 36) | function dismiss() { function showDialog (line 39) | function showDialog() { FILE: frontend/src/board/image-upload.ts function imageDropHandler (line 7) | function imageDropHandler( type ImageUploadFunction (line 52) | type ImageUploadFunction = (file: File) => Promise function imageUploadHandler (line 53) | function imageUploadHandler( type ImageInfo (line 78) | type ImageInfo = { type: "image"; width: number; height: number } function imageDimensions (line 80) | function imageDimensions(file: File): Promise { FILE: frontend/src/board/item-connect.ts constant DND_GHOST_HIDING_IMAGE (line 27) | const DND_GHOST_HIDING_IMAGE = new Image() function startConnecting (line 34) | function startConnecting( type ConnectionHandler (line 71) | type ConnectionHandler = ReturnType function newConnectionCreator (line 73) | function newConnectionCreator( function shouldPreventAttach (line 164) | function shouldPreventAttach(e: DragEvent) { function existingConnectionHandler (line 168) | function existingConnectionHandler( function getFindTargetOptions (line 229) | function getFindTargetOptions(action: "line" | "connect", preventAttach ... type FindTargetOptions (line 236) | type FindTargetOptions = { allowConnect: boolean; allowSnap: boolean } function findTarget (line 237) | function findTarget( function isConnected (line 278) | function isConnected(b: Board, x: Item, y: Item, connectionToIgnore: Con... function isConnectionRelated (line 282) | function isConnectionRelated(i: Item, c: Connection) { function isEndPointRelated (line 286) | function isEndPointRelated(i: Item, c: ConnectionEndPoint) { function isConnectionAttachmentPoint (line 290) | function isConnectionAttachmentPoint(point: Point, item: Item) { FILE: frontend/src/board/item-create.ts function itemCreateHandler (line 7) | function itemCreateHandler( FILE: frontend/src/board/item-cut-copy-paste.ts constant CLIPBOARD_EVENTS (line 28) | const CLIPBOARD_EVENTS = ["cut", "copy", "paste"] as const type ItemsAndConnections (line 30) | type ItemsAndConnections = { function augmentWithCRDT (line 35) | function augmentWithCRDT( function findSelectedItemsAndConnections (line 46) | function findSelectedItemsAndConnections(currentFocus: BoardFocus, curre... function detachEndPointIfItemNotFound (line 74) | function detachEndPointIfItemNotFound(ep: ConnectionEndPoint, itemIds: S... function connectedIds (line 82) | function connectedIds(connection: Connection) { function makeCopies (line 87) | function makeCopies( function cutCopyPasteHandler (line 146) | function cutCopyPasteHandler( FILE: frontend/src/board/item-delete.ts function itemDeleteHandler (line 7) | function itemDeleteHandler(boardId: Id, dispatch: Dispatch, focus: L.Pro... function dispatchDeletion (line 14) | function dispatchDeletion(boardId: Id, f: BoardFocus, dispatch: Dispatch) { FILE: frontend/src/board/item-drag.ts constant DND_GHOST_HIDING_IMAGE (line 8) | const DND_GHOST_HIDING_IMAGE = new Image() function onBoardItemDrag (line 13) | function onBoardItemDrag( FILE: frontend/src/board/item-dragmove.ts function itemDragToMove (line 12) | function itemDragToMove( FILE: frontend/src/board/item-duplicate.ts function itemDuplicateHandler (line 10) | function itemDuplicateHandler( function dispatchDuplication (line 21) | function dispatchDuplication( FILE: frontend/src/board/item-hide-contents.ts function itemHideContentsHandler (line 8) | function itemHideContentsHandler(board: L.Property, focus: L.Prop... function hasContentHidden (line 14) | function hasContentHidden(items: Item[]) { function toggleContentsHidden (line 18) | function toggleContentsHidden(items: Item[], board: Board, dispatch: Dis... function findContainers (line 31) | function findContainers(items: Item[], board: Board): Item[] { FILE: frontend/src/board/item-move-with-arrow-keys.ts function updatePosition (line 10) | function updatePosition(board: Board, item: T, dx: numbe... function moveItem (line 19) | function moveItem(board: Board, item: T, key: string, sh... function itemMoveWithArrowKeysHandler (line 34) | function itemMoveWithArrowKeysHandler(board: L.Property, dispatch... FILE: frontend/src/board/item-organizer.ts constant ITEM_MARGIN (line 6) | const ITEM_MARGIN = 1 constant CONTAINER_MARGIN (line 7) | const CONTAINER_MARGIN = 1 function contentRect (line 10) | function contentRect(cont: Container): G.Rect { function packableItems (line 25) | function packableItems(cont: Container, board: Board): Item[] { function organizeItems (line 34) | function organizeItems(itemsToPack: Item[], itemsToAvoid: Item[], rect: ... function placeItem (line 54) | function placeItem( function marginRect (line 86) | function marginRect(margin: number, r: G.Rect): G.Rect { FILE: frontend/src/board/item-packer.ts type PackItemsResult (line 8) | type PackItemsResult = constant PACK_BINARY_SEARCH_DEFAULT (line 18) | const PACK_BINARY_SEARCH_DEFAULT: { function packItems (line 35) | function packItems(targetRect: Rect, items: Item[], binarySearch = PACK_... FILE: frontend/src/board/item-select-all.ts function itemSelectAllHandler (line 6) | function itemSelectAllHandler(board: L.Property, focus: L.Atom... function maybeChangeContainerForConnection (line 13) | function maybeChangeContainerForConnection(connection: Connection, items... function withCurrentContainer (line 21) | function withCurrentContainer(item: Item, b: Board): Item { FILE: frontend/src/board/item-undo-redo.ts function itemUndoHandler (line 4) | function itemUndoHandler(dispatch: Dispatch) { FILE: frontend/src/board/keyboard-shortcuts.ts function installKeyboardShortcut (line 4) | function installKeyboardShortcut( FILE: frontend/src/board/local-storage-atom.ts function localStorageAtom (line 3) | function localStorageAtom(key: string, defaultValue: T) { FILE: frontend/src/board/quillClickableLink.ts class ClickableLink (line 4) | class ClickableLink extends Link { method create (line 5) | static create(href: any) { FILE: frontend/src/board/quillPasteLinkOverText.ts class PasteLinkOverText (line 4) | class PasteLinkOverText { method constructor (line 5) | constructor(quill: Quill) { FILE: frontend/src/board/synchronize-focus-with-server.ts function synchronizeFocusWithServer (line 29) | function synchronizeFocusWithServer( FILE: frontend/src/board/tool-selection.ts type Tool (line 4) | type Tool = "pan" | "select" | "connect" | "note" | "container" | "text"... type ControlSettings (line 5) | type ControlSettings = { type ToolController (line 10) | type ToolController = ReturnType function ToolController (line 12) | function ToolController() { FILE: frontend/src/board/toolbars/BackToAllBoardsLink.tsx function BackToAllBoardsLink (line 5) | function BackToAllBoardsLink() { FILE: frontend/src/board/toolbars/MainToolBar.tsx type ToolbarPosition (line 42) | type ToolbarPosition = { x?: number; y?: number; orientation: "vertical"... type UndoProps (line 123) | type UndoProps = { type DeleteProps (line 151) | type DeleteProps = { type DuplicateProps (line 175) | type DuplicateProps = { FILE: frontend/src/board/toolbars/MiniMapView.tsx function onDragEnd (line 37) | function onDragEnd(e: JSX.DragEvent) { function onDragStart (line 40) | function onDragStart(e: JSX.DragEvent) { function onDragOver (line 45) | function onDragOver(e: JSX.DragEvent) { function onClick (line 55) | function onClick(e: JSX.MouseEvent | Touch) { function onTouchStart (line 67) | function onTouchStart(e: JSX.TouchEvent) { function onTouchMove (line 71) | function onTouchMove(e: JSX.TouchEvent) { function onTouchEnd (line 75) | function onTouchEnd(e: JSX.TouchEvent) { function renderItem (line 110) | function renderItem(id: string, item: L.Property) { FILE: frontend/src/board/toolbars/PaletteView.tsx function lightenDarkenColor (line 67) | function lightenDarkenColor(col: string, amt: number) { FILE: frontend/src/board/toolbars/UndoRedo.tsx function UndoRedo (line 5) | function UndoRedo({ dispatch, boardStore }: { dispatch: Dispatch; boardS... FILE: frontend/src/board/toolbars/ZoomControls.tsx function ZoomControls (line 5) | function ZoomControls({ FILE: frontend/src/board/touchScreen.ts constant IS_TOUCHSCREEN (line 1) | const IS_TOUCHSCREEN = "ontouchstart" in window function getSingleTouch (line 3) | function getSingleTouch(e: TouchEvent | JSX.TouchEvent) { function isSingleTouch (line 8) | function isSingleTouch(e: TouchEvent | JSX.TouchEvent) { function onSingleTouch (line 12) | function onSingleTouch(e: TouchEvent | JSX.TouchEvent, callback: (touch:... FILE: frontend/src/board/zIndices.ts constant Z_CONTAINERS_UP_TO (line 3) | const Z_CONTAINERS_UP_TO = 1000000 constant Z_CONNECTIONS (line 4) | const Z_CONNECTIONS = 200000000 constant Z_ITEMS_FROM (line 5) | const Z_ITEMS_FROM = Z_CONTAINERS_UP_TO + 10 function itemZIndex (line 7) | function itemZIndex(item: Item) { FILE: frontend/src/board/zoom-shortcuts.ts function installZoomKeyboardShortcuts (line 5) | function installZoomKeyboardShortcuts({ resetZoom, increaseZoom, decreas... FILE: frontend/src/components/BoardAccessPolicyEditor.tsx type BoardAccessPolicyEditorProps (line 7) | type BoardAccessPolicyEditorProps = { function parseAccessListEntry (line 59) | function parseAccessListEntry(input: string): AccessListEntry | null { function addToAllowListIfValid (line 75) | function addToAllowListIfValid(input: string) { FILE: frontend/src/components/BoardCrdtModeSelector.tsx type BoardCrdtModeSelectorProps (line 5) | type BoardCrdtModeSelectorProps = { FILE: frontend/src/components/EditableSpan.tsx type EditableSpanProps (line 6) | type EditableSpanProps = { function clearSelection (line 14) | function clearSelection() { FILE: frontend/src/components/HTMLEditableSpan.tsx type EditableSpanProps (line 7) | type EditableSpanProps = { function clearSelection (line 14) | function clearSelection() { FILE: frontend/src/components/ModalContainer.tsx function ModalContainer (line 4) | function ModalContainer({ content }: { content: L.Atom }) { FILE: frontend/src/components/onClickOutside.tsx function onClickOutside (line 4) | function onClickOutside(elem: L.Property, handler: (... FILE: frontend/src/components/sanitizeHTML.ts function isURL (line 37) | function isURL(str: string) { constant MAX_LINK_LENGTH (line 44) | const MAX_LINK_LENGTH = 30 function createLinkHTML (line 46) | function createLinkHTML(url: string, text?: string) { function createAnchorElement (line 50) | function createAnchorElement(url: string, text?: string) { function linkify (line 60) | function linkify(htmlText: string) { function sanitizeHTML (line 76) | function sanitizeHTML(html: string, shouldLinkify?: boolean) { function toPlainText (line 85) | function toPlainText(html: string) { FILE: frontend/src/dashboard/DashboardView.tsx function createTutorial (line 227) | function createTutorial() { function onSubmit (line 330) | function onSubmit(e: JSX.FormEvent) { FILE: frontend/src/google-auth.ts function signIn (line 3) | function signIn() { function signOut (line 7) | async function signOut() { function getReturnPath (line 12) | function getReturnPath() { FILE: frontend/src/store/asset-store.ts type AssetId (line 6) | type AssetId = string type AssetURL (line 7) | type AssetURL = string function assetStore (line 9) | function assetStore( function isAssetPut (line 111) | function isAssetPut(e: AppEvent): e is AssetPutUrlResponse { function getAssetPutResponse (line 115) | function getAssetPutResponse(assetId: string, events: L.EventStream FILE: frontend/src/store/board-local-store.ts type LocalStorageBoard (line 6) | type LocalStorageBoard = { constant BOARD_STORAGE_KEY_PREFIX (line 11) | const BOARD_STORAGE_KEY_PREFIX = "board_" function getInitialBoardState (line 15) | async function getInitialBoardState(boardId: Id) { function getStoredState (line 23) | async function getStoredState(localStorageKey: string): Promise { type BoardLocalStore (line 90) | type BoardLocalStore = { FILE: frontend/src/store/board-store.test.ts function waitForBackgroundJobs (line 264) | async function waitForBackgroundJobs() { function initBoardStore (line 268) | async function initBoardStore({ FILE: frontend/src/store/board-store.ts type Dispatch (line 42) | type Dispatch = (e: UIEvent) => void type BoardStore (line 43) | type BoardStore = ReturnType type BoardAccessStatus (line 44) | type BoardAccessStatus = type BoardState (line 54) | type BoardState = { function emptyBoard (line 65) | function emptyBoard(boardId: Id) { function BoardStore (line 69) | function BoardStore( function sessionState2UserInfo (line 587) | function sessionState2UserInfo(state: UserSessionState): SessionUserInfo { FILE: frontend/src/store/crdt-store.ts type BoardCRDT (line 10) | type BoardCRDT = ReturnType type WebSocketPolyfill (line 11) | type WebSocketPolyfill = function BoardCRDT (line 22) | function BoardCRDT( type CRDTStore (line 85) | type CRDTStore = ReturnType function CRDTStore (line 87) | function CRDTStore( FILE: frontend/src/store/cursors-store.ts function CursorsStore (line 7) | function CursorsStore(connection: ServerConnection, sessionStore: UserSe... type CursorsStore (line 40) | type CursorsStore = ReturnType function isCursors (line 42) | function isCursors(e: AppEvent): e is CursorPositions { FILE: frontend/src/store/recent-boards.ts function RecentBoards (line 6) | function RecentBoards(connection: ServerConnection, sessionStore: UserSe... type RecentBoards (line 50) | type RecentBoards = ReturnType FILE: frontend/src/store/server-connection.ts type Dispatch (line 7) | type Dispatch = (e: UIEvent) => void constant SERVER_EVENTS_BUFFERING_MILLIS (line 9) | const SERVER_EVENTS_BUFFERING_MILLIS = 20 type ServerConnection (line 11) | type ServerConnection = ReturnType type ConnectionStatus (line 13) | type ConnectionStatus = "connecting" | "connected" | "sleeping" | "recon... function getWebSocketRootUrl (line 15) | function getWebSocketRootUrl() { function BrowserSideServerConnection (line 20) | function BrowserSideServerConnection(boardId: L.Property function UserSessionStore (line 51) | function UserSessionStore(connection: ServerConnection, localStorage: St... function getAuthenticatedUserFromCookie (line 144) | function getAuthenticatedUserFromCookie(): OAuthAuthenticatedUser | null { function getUserJWT (line 156) | function getUserJWT() { function canLogin (line 160) | function canLogin(state: UserSessionState): boolean { function isLoginInProgress (line 166) | function isLoginInProgress(state: StateId): boolean { function getAuthenticatedUser (line 170) | function getAuthenticatedUser(state: UserSessionState): OAuthAuthenticat... function defaultAccessPolicy (line 178) | function defaultAccessPolicy(sessionState: UserSessionState, restrictAcc... FILE: integration/src/compact-history.test.ts type BundleDesc (line 8) | type BundleDesc = [Date, Serial, Serial] function storeBundles (line 100) | async function storeBundles(boardId: Id, bundles: BundleDesc[]) { function getBundles (line 106) | async function getBundles(boardId: Id) { function addItems (line 112) | async function addItems(boardId: Id, firstSerial: Serial, lastSerial: Se... FILE: perf-tester/src/create-boards.ts constant BOARD_COUNT (line 4) | const BOARD_COUNT = parseInt(process.env.BOARD_COUNT || "1") constant DOMAIN (line 5) | const DOMAIN = process.env.DOMAIN constant API_ROOT (line 6) | const API_ROOT = `${DOMAIN ? "https" : "http"}://${DOMAIN ?? "localhost:... constant CREATE_BOARD_API (line 7) | const CREATE_BOARD_API = `${API_ROOT}/api/v1/board` function createBoardAndReturnId (line 9) | async function createBoardAndReturnId(n: number) { FILE: perf-tester/src/index.ts function add (line 26) | function add(a: Point, b: Point) { function createTester (line 30) | function createTester(nickname: string, boardId: string) { constant USER_COUNT (line 144) | const USER_COUNT = parseInt(process.env.USER_COUNT ?? "10") constant BOARD_ID (line 145) | const BOARD_ID = process.env.BOARD_ID constant BOARD_IDS (line 149) | const BOARD_IDS = BOARD_ID.split(",") constant DOMAIN (line 150) | const DOMAIN = process.env.DOMAIN constant NOTES_PER_SEC (line 152) | const NOTES_PER_SEC = parseFloat(process.env.NOTES_PER_SEC ?? "0.1") constant TEXTS_PER_SEC (line 153) | const TEXTS_PER_SEC = parseFloat(process.env.TEXTS_PER_SEC ?? "0.0") constant EDITS_PER_SEC (line 154) | const EDITS_PER_SEC = parseFloat(process.env.EDITS_PER_SEC ?? "0") constant CURSOR_MOVES_PER_SEC (line 155) | const CURSOR_MOVES_PER_SEC = parseFloat(process.env.CURSOR_MOVES_PER_SEC... FILE: playwright/src/pages/BoardApi.ts function BoardApi (line 3) | function BoardApi(page: Page) { FILE: playwright/src/pages/BoardPage.ts function navigateToBoard (line 6) | async function navigateToBoard(page: Page, browser: Browser, boardId: st... type NewBoardOptions (line 12) | type NewBoardOptions = Partial<{ type BoardPage (line 28) | type BoardPage = ReturnType function BoardPage (line 29) | function BoardPage(page: Page, browser: Browser) { function ContextMenu (line 342) | function ContextMenu(page: Page) { FILE: playwright/src/pages/DashboardPage.ts function navigateToDashboard (line 4) | async function navigateToDashboard(page: Page, browser: Browser) { function DashboardPage (line 10) | function DashboardPage(page: Page, browser: Browser) { FILE: playwright/src/tests/accessPolicy.spec.ts function loginAsTester (line 5) | async function loginAsTester(page: Page) { function logout (line 11) | async function logout(page: Page) { FILE: playwright/src/tests/board.spec.ts function resetSelection (line 280) | async function resetSelection() { function testWithBothBoardTypes (line 321) | function testWithBothBoardTypes( FILE: playwright/src/tests/collaboration.spec.ts function createBoardWithTwoUsers (line 134) | async function createBoardWithTwoUsers(page: Page, browser: Browser) {