Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
objectsToScanForHandlers.forEach(objectToScanForHandlers => {
// create a new handler map which has the eventType as the key
// we could just omit the decorator and just use function names, but there can be more than one decorators on a function
let events: EventObservationMetadata[] = EspDecoratorUtil.getAllEvents(objectToScanForHandlers);
events.forEach(metadata => {
// copy the decorated function to our new map
const handler = objectToScanForHandlers[metadata.functionName].bind(objectToScanForHandlers);
handlerMap[metadata.eventType] = (state: any, event: any, store: any) => {
if (!metadata.predicate || metadata.predicate(state, event, store)) {
return handler(state, event, store);
}
};
});
});
this._stateHandlerMaps.set(stateName, handlerMap);
this._eventStreamHandlerObjects.forEach(objectToScanForObservables => {
const metadata: EventObservationMetadata[] = EspDecoratorUtil.getAllEvents(objectToScanForObservables);
// group by the function name as there may be multiple events being observed by 1 function
let metadataGroupedByFunction: { [functionName: string]: EventObservationMetadata[] } = metadata.reduce(
(result, m) => {
(result[m.functionName] = result[m.functionName] || []).push(m);
return result;
},
{}
);
Object.keys(metadataGroupedByFunction).forEach(functionName => {
const metadataForFunction: EventObservationMetadata[] = metadataGroupedByFunction[functionName];
// When using decorators the function may declare multiple decorators,
// they may use a different observation stage. Given that, we subscribe to the router separately
// and pump the final observable into our handling function to subscribe to.
const inputEventStream = Rx.Observable.merge(metadataForFunction.map(m => this._observeEvent(m.eventType, m.observationStage)));
const outputEventStream = objectToScanForObservables[functionName](inputEventStream);