Search code examples
trpc.io

Why does tRPC's context get reset on every procedure (websockets)?


I'm trying to store state in the tRPC context between different procedures called by the same user. I use websockets/wsLink, so context is created once when the user first connects. This context mutation should only happen when a user calls a specific procedure.

However, It looks like the context properties are reset whenever a procedure is called by the user.

However, mutating properties of properties works to share state between procedures.


Solution

  • I followed the code and found that it's a limitation caused by spreading:

                  ctx:
                    nextOpts && 'ctx' in nextOpts
                      ? { ...callOpts.ctx, ...nextOpts.ctx }
                      : callOpts.ctx,
    

    It's an implementation detail of tRPC, where 2 contexts are merged together to support middlewares adding properties to the context.

    My recommendation would be avoid changing properties on context directly, because you would be editing a temporarily generated context for the last middleware called. If you edit anything inside specific properties, these will exist because these were just copied from the original context.