github.com/Tyktechnologies/tyk@v2.9.5+incompatible/gateway/coprocess_events.go (about) 1 package gateway 2 3 import ( 4 "encoding/json" 5 "fmt" 6 7 "github.com/TykTechnologies/tyk/apidef" 8 "github.com/TykTechnologies/tyk/config" 9 ) 10 11 // Constant for event system. 12 const EH_CoProcessHandler apidef.TykEventHandlerName = "cp_dynamic_handler" 13 14 type CoProcessEventHandler struct { 15 methodName string 16 Spec *APISpec 17 SpecJSON json.RawMessage 18 } 19 20 type CoProcessEventWrapper struct { 21 Event config.EventMessage `json:"message"` 22 Handler string `json:"handler_name"` 23 SpecJSON *json.RawMessage `json:"spec"` 24 } 25 26 func (l *CoProcessEventHandler) Init(handlerConf interface{}) error { 27 l.methodName = handlerConf.(map[string]interface{})["name"].(string) 28 29 // Set the VM globals 30 globalVals := JSVMContextGlobal{ 31 APIID: l.Spec.APIID, 32 OrgID: l.Spec.OrgID, 33 } 34 35 gValAsJSON, err := json.Marshal(globalVals) 36 if err != nil { 37 return fmt.Errorf("failed to marshal globals: %v", err) 38 } 39 40 l.SpecJSON = json.RawMessage(gValAsJSON) 41 return nil 42 } 43 44 func (l *CoProcessEventHandler) HandleEvent(em config.EventMessage) { 45 dispatcher := loadedDrivers[l.Spec.CustomMiddleware.Driver] 46 if dispatcher == nil { 47 return 48 } 49 eventWrapper := CoProcessEventWrapper{ 50 Event: em, 51 Handler: l.methodName, 52 SpecJSON: &l.SpecJSON, 53 } 54 55 // JSON-encode the event data object 56 msgAsJSON, err := json.Marshal(eventWrapper) 57 if err != nil { 58 log.Error("Failed to encode event data: ", err) 59 return 60 } 61 dispatcher.DispatchEvent(msgAsJSON) 62 }