UNPKG

sflow

Version:

sflow is a powerful and highly-extensible library designed for processing and manipulating streams of data effortlessly. Inspired by the functional programming paradigm, it provides a rich set of utilities for transforming streams, including chunking, fil

172 lines (111 loc) โ€ข 4.99 kB
# sflow - Stream Flow ๐Ÿš€ sflow is a powerful and highly-extensible library designed for processing and manipulating streams of data effortlessly based on WebStream. Inspired by the functional programming paradigm, it provides a rich set of utilities for transforming streams, including chunking, filtering, mapping, reducing, among many others. It's a perfect companion for those who work extensively with streams and want to make their data processing pipelines more efficient and concise. ONLINE DEMO avaliable here! - [sflow online Examples and Use Cases](https://sflow-examples.vercel.app/) ## Features - **Chunking and buffering**: Easily divide your stream into chunks based on different criteria such as count, intervals, custom conditions, etc. - **Transformations**: Map, filter, reduce, and various other transformations to process your stream data. - **Stream utilities**: Merge, throttle, debounce, and more utilities for advanced stream controls. - **Error handling**: Prevent or handle errors during stream processing, ensuring robustness. - **Integration with other libraries**: Seamlessly integrates with tools like `web-streams-extensions`, making it versatile for different streaming needs. - **TypeScript support**: Fully typed for a richer developer experience and better code quality. ## Get Started ### Installation Install sflow using npm or bun: ```sh npm install sflow # or if you are using bun bun add sflow ``` ### Basic Usage Here's a basic example of how to use sflow to process a stream: ```typescript import { sflow } from "sflow"; async function run() { let result = await sflow([1, 2, 3, 4]) .map((n) => n * 2) .log() // this stage prints 2, 4, 6, 8 .filter((n) => n > 4) .log() // this stage prints 6, 8 .reduce((a, b) => a + b, 0) // first emit 0+6=6, second emit 0+6+8=14 .log() // this stage prints 6, 14 .toArray(); console.log(result); // Outputs: [6, 14] } await run(); ``` ## API Overview ### Initialization Initialize a flow from various types of data sources: ```typescript import { sflow } from "sflow"; // From an array const flow1 = sflow([1, 2, 3, 4]); // From a promise const flow2 = sflow(Promise.resolve([1, 2, 3, 4])); // From an async iterable async function* asyncGenerator() { yield 1; yield 2; yield 3; } const flow3 = sflow(asyncGenerator()); ``` ### Transformations Transform your flow with various transformation methods: ```typescript // Mapping flow1.map((n) => n * 2); // Filtering flow1.filter((n) => n % 2 === 0); // Reducing flow1.reduce((a, b) => a + b, 0); ``` ### Chunking, Buffering, and Grouping sflow provides methods for chunking, buffering, and grouping data: ```typescript // Chunking by count flow1.chunk(2); // [[1, 2], [3, 4]] // Buffering within a time interval flow1.chunkByInterval(1000); // Custom chunking flow1.chunkBy((x) => Math.floor(x / 2)); ``` ### Advanced Utilities sflow comes with a plethora of utilities to manipulate streams efficiently: ```typescript // Throttling flow1.throttle(100); // Debouncing flow1.debounce(200); // Converting to array flow1.toArray(); // Merging multiple streams const mergedFlow = sflow([flow1, flow2]).merge(); // Use chunkIf to split tokens by line await sflow("a,b,c\n\n1,2,3\nd,s,f".split("")) .through(chunkIfs((e: string) => e.indexOf("\n") === -1)) .map((chars) => chars.join("")) .toArray(); // ["a,b,c\n",'\n', "1,2,3\n", "d,s,f"] ``` ### Type-Safe Enhancements With TypeScript, sflow ensures your transformations are type-safe: ```typescript import { sflow } from "sflow"; const typedFlow = sflow([{ a: 1, b: [1, 2, 3] }]) .unwind("b") // Use `unwind` for objects with nested arrays .mapAddField("newField", (item) => item.a + item.b); ``` ## Contributing Contributions to sflow are always welcome! If you have any ideas, suggestions, or bug reports, feel free to open an issue on GitHub or submit a pull request. Try to create your first PR start from here! https://github.dev/snomiao/sflow 2. Join sflow Community by Post Comments here: - [Welcome to sflow Discussions! ยท snomiao/sflow ยท Discussion #2](https://github.com/snomiao/sflow/discussions/2) ## References - [Infinite Streams with Elixir](https://gist.github.com/mgwidmann/5e0cb590f12e2ca239564d07d7c2a572) - [web-streams-extensions - npm](https://www.npmjs.com/package/web-streams-extensions) - [$unwind (aggregation) - MongoDB Manual v7.0](https://www.mongodb.com/docs/manual/reference/operator/aggregation/unwind/) - [Introducing sflow: A New Era of Web Stream Processing for TypeScript/JavaScript Developers! : r/javascript](https://www.reddit.com/r/javascript/comments/1exv4we/introducing_sflow_a_new_era_of_web_stream/) ## License sflow is released under the MIT License. See the [LICENSE](./LICENSE) file for more details. --- sflow aims to simplify stream processing and bring functional programming paradigms to modern JavaScript and TypeScript development. Happy streaming! ๐Ÿš€