npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

botbuilder-filter-middleware

v0.0.3

Published

A BotBuilder v4 extension for filtering middleware using a developer-defined predicate

Downloads

4

Readme

Filtering Middleware

Getting Started

Install from npm:

npm install botbuilder-filter-middleware --save

Import the package:

import { filterMiddleware } from 'botbuilder-filter-middleware';

See sample for full implementation.

Background

When we .use middleware, every message we receive gets passed through it. We use middleware to gather things like intent or sentiment, or to log telemetry, or to transform messages (e.g. translation), or to intercept a message. However, we don't always want our middleware to run. For instance, sentiment analysis on text is only useful if that text is fairly long. "No" registers as having incredibly low sentiment, though it doesn't necessarily indicate a disgruntled user. In this case, we would only want to call our sentiment analysis service if our incoming message is over a specific length.

Enter middleware filtering. filterMiddleware is just a function that only runs middleware if a predicate is true.

If we want our bot to pass route messages through a piece of middleware, we .use use that middleware:

const bot = new Bot(connector)
    .use(
        new TestMiddleware()
    )

If we only want that middleware to run based on custom logic we pass in our filterMiddleware function, which takes a predicate and middleware:

const bot = new Bot(connector)
    .use(filterMiddleware(
        lengthPredicate,
        new TestMiddleware()
    ))

A predicate is just a boolean function. In the above case, our lengthPredicate is checks whether the length of the message in context.request.text is over 5 characters:

const lengthPredicate = (context: BotContext) => {
    return (context.request.type === "message" && context.request.text && context.request.text.length > 5);
}

For the sake of demonstration, our TestMiddleware replies to the user if it runs:

    public receiveActivity(context: BotContext, next: () => Promise<void>): Promise<void> {
        context.reply('called receiveActivity');
        return next();
    }

So, the sample will only reply from middleware if the incoming message is at least 5 characters long! Of course, you can define any predicate.

Note, we can pass an arbitrary number of middlewares into the filter:

const bot = new Bot(connector)
    .use(filterMiddleware(
        lengthPredicate,
        new LuisRecognizer(env.LUIS_APP_ID, env.LUIS_PASSWORD)
        new TestMiddleware()
    ))

Neither of the above pieces of middleware will run if the length predicate is not met.