Skip to content
This repository has been archived by the owner on Jul 9, 2018. It is now read-only.
/ context Public archive

Async-aware state management, maintaining context across asynchronous calls.

Notifications You must be signed in to change notification settings

travetto/context

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

travetto: Context

This module provides a wrapper around nodejss async_hooks to maintain context across async calls. This is generally used for retaining contextual user information at various levels of async flow.

The most common way of utilizing the context, is via the @WithContext decorator. The decorator requires the class it's being used in, to have a Context member, as it is the source of the contextual information.

The decorator will load the context on invocation, and will keep the context active during the entire asynchronous call chain.

class ContextAwareService {

   constructor(public context:Context){}

   @WithContext()
   async complexOperator(name: string) {
     this.context.set({ name })
     await this.additionalOp(name);

     assert(this.context.get().name === 'finished');
   }

   async additionalOp(check:string) {
     assert(this.context.get().name === check);
     this.context.get().name = `finished`;
   }
}

The decorator also allows for a priming of the contextual information. This is generally useful for system generated operations that are not initiated by a user.

class SystemInitiatedContext {

   constructor(public context:Context){}

   @WithContext({
     user: 'system',
     uid: 20
   })
   async runJob(name: string) {
     console.log(`User=${this.context.get().user}, jobName=${name}`);
   }
}