diff --git a/server/core/src/types.ts b/server/core/src/types.ts index 6233c93adf..dca17b3c01 100644 --- a/server/core/src/types.ts +++ b/server/core/src/types.ts @@ -553,6 +553,13 @@ export interface Session { query: DocumentQuery, options?: FindOptions ) => Promise + findAllRaw: ( + ctx: MeasureContext, + pipeline: Pipeline, + _class: Ref>, + query: DocumentQuery, + options?: FindOptions + ) => Promise> searchFulltext: (ctx: ClientSessionCtx, query: SearchQuery, options: SearchOptions) => Promise tx: (ctx: ClientSessionCtx, tx: Tx) => Promise loadChunk: (ctx: ClientSessionCtx, domain: Domain, idx?: number) => Promise diff --git a/server/server/src/sessionManager.ts b/server/server/src/sessionManager.ts index 7a00401bd0..d551af9721 100644 --- a/server/server/src/sessionManager.ts +++ b/server/server/src/sessionManager.ts @@ -716,21 +716,38 @@ class TSessionManager implements SessionManager { const user = pipeline.context.modelDb.getAccountByEmail(session.getUser()) if (user === undefined) return - const status = (await pipeline.findAll(ctx, core.class.UserStatus, { user: user._id }, { limit: 1 }))[0] + const clientCtx: ClientSessionCtx = { + requestId: undefined, + pipeline, + sendResponse: async (msg) => { + // No response + }, + ctx, + sendError: async (msg, error: Status) => { + // Assume no error send + }, + sendPong: () => {} + } + const status = ( + await session.findAllRaw(ctx, pipeline, core.class.UserStatus, { user: user._id }, { limit: 1 }) + )[0] const txFactory = new TxFactory(user._id, true) if (status === undefined) { const tx = txFactory.createTxCreateDoc(core.class.UserStatus, core.space.Space, { online, user: user._id }) - await pipeline.tx(ctx, [tx]) + await session.tx(clientCtx, tx) } else if (status.online !== online) { const tx = txFactory.createTxUpdateDoc(status._class, status.space, status._id, { online }) - await pipeline.tx(ctx, [tx]) + await session.tx(clientCtx, tx) } - } catch {} + } catch (err: any) { + ctx.error('failed to set status', { err }) + Analytics.handleError(err) + } } async close (ctx: MeasureContext, ws: ConnectionSocket, wsid: string): Promise {