{"id":19538074,"url":"https://github.com/archetypicalsoftware/spigot","last_synced_at":"2025-08-22T16:12:23.096Z","repository":{"id":97491713,"uuid":"150982492","full_name":"ArchetypicalSoftware/Spigot","owner":"ArchetypicalSoftware","description":"Spigot allows you to simply connect into any event stream to pull in and publish strongly typed objects rather than simple strings","archived":false,"fork":false,"pushed_at":"2021-01-26T23:12:11.000Z","size":2813,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-01-08T18:15:59.253Z","etag":null,"topics":["cloudevents","event-driven","event-driven-architecture","event-driven-architectures","event-stream","pub-sub","publish-subscribe","spigot"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"lgpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ArchetypicalSoftware.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-09-30T16:05:12.000Z","updated_at":"2023-09-08T17:45:37.000Z","dependencies_parsed_at":"2024-02-25T22:15:12.765Z","dependency_job_id":null,"html_url":"https://github.com/ArchetypicalSoftware/Spigot","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ArchetypicalSoftware%2FSpigot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ArchetypicalSoftware%2FSpigot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ArchetypicalSoftware%2FSpigot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ArchetypicalSoftware%2FSpigot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ArchetypicalSoftware","download_url":"https://codeload.github.com/ArchetypicalSoftware/Spigot/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240793184,"owners_count":19858620,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cloudevents","event-driven","event-driven-architecture","event-driven-architectures","event-stream","pub-sub","publish-subscribe","spigot"],"created_at":"2024-11-11T02:31:11.353Z","updated_at":"2025-02-26T04:29:06.119Z","avatar_url":"https://github.com/ArchetypicalSoftware.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Spigot\n### Your tap into custom event streams from any source\n \n[![Build status](https://ci.appveyor.com/api/projects/status/xm19400akpjdb0uy/branch/master?svg=true)](https://ci.appveyor.com/project/ArchetypicalSoftware/spigot/branch/master)\n\n\nSpigot allows you to simply connect into any event stream to pull in and publish strongly typed objects rather than simple strings.\n\nIn todays distributed, cloud-enabled world, more and more things have to communicate with existing systems they may not even know about. They also need to be able to let other applications know when they change the state of something so they can take action etc. The only scalable way to do this is by implementing an Event-driven architecture.\n\n\u003e \u003cb\u003eEvent-driven architecture (EDA)\u003c/b\u003e, is a software architecture pattern promoting the production, detection, consumption of, and reaction to events. \nAn event can be defined as \u003ci\u003e\"a significant change in state\".\u003c/i\u003e For example, when a consumer purchases a car, the car's state changes from \"for sale\" to \"sold\". A car dealer's system architecture may treat this state change as an event whose occurrence can be made known to other applications within the architecture. From a formal perspective, what is produced, published, propagated, detected or consumed is a (typically asynchronous) message called the event notification, and not the event itself, which is the state change that triggered the message emission. Events do not travel, they just occur. However, the term event is often used metonymically to denote the notification message itself, which may lead to some confusion. This is due to Event-Driven architectures often being designed atop message-driven architectures, where such communication pattern requires one of the inputs to be text-only, the message, to differentiate how each communication should be handled. \n\n[\u003ci\u003e Wikipedia definition of Event Driven Architecture\u003c/i\u003e](https://en.wikipedia.org/wiki/Event-driven_architecture)\n\nThis helps you design your system in a way that decouples how the data gets to your system and what you do with it. \n\nSpigot abstracts this away from you so you can concentrate on when to send these events and what to do with the ones you receive. This is done using the Pub-Sub model:\n\n\u003e In software architecture, \u003cb\u003epublish–subscribe\u003c/b\u003e is a messaging pattern where senders of messages, called publishers, do not program the messages to be sent directly to specific receivers, called subscribers, but instead categorize published messages into classes without knowledge of which subscribers, if any, there may be. Similarly, subscribers express interest in one or more classes and only receive messages that are of interest, without knowledge of which publishers, if any, there are. \nPublish–subscribe is a sibling of the message queue paradigm, and is typically one part of a larger message-oriented middleware system. Most messaging systems support both the pub/sub and message queue models in their API, e.g. Java Message Service (JMS). \nThis pattern provides greater network scalability and a more dynamic network topology, with a resulting decreased flexibility to modify the publisher and the structure of the published data. \n\n[\u003ci\u003e Wikipedia definition of Publish–subscribe pattern\u003c/i\u003e](https://en.wikipedia.org/wiki/Publish–subscribe_pattern)\n\nSubscribing to an event is as easy as creating a Knob:\n\n```csharp\n public class ComplexClassHandler : Knob\u003cComplexClass\u003e\n        {\n            public ComplexClassHandler(EventNumber number, Archetypical.Software.Spigot.Spigot spigot, ILogger\u003cKnob\u003cComplexClass\u003e\u003e logger) : base(spigot, logger)\n            {\n                //stuff\n            }\n\n            protected override void HandleMessage(EventArrived\u003cComplexClass\u003e message)\n            {\n                //handle\n            }\n        }\n```\nThen registering that Knob\n```csharp\n                services\n                .AddLogging()\n                .AddSpigot(config)\n                .AddKnob\u003cComplexClassHandler, ComplexClass\u003e()\n```\n\nSending is just as simple:\n\n```csharp\n\n            var complexSender = provider.GetService\u003cMessageSender\u003cComplexClass\u003e\u003e();\n                \n            complexSender.Send(new ComplexClass(testNumber));\n\n```\n\nFor more details, check out the [full documentation](docs)\n\n\n\n\n## Did you know: \n\n### Spigot is [CloudEvents](https://cloudevents.io) Compatible\n\u003cimg src='https://cloudevents.io/img/logos/cloudevents-icon-color.png' width='250px'\u003e\n\n### Spigot can run on all of these providers:\n\n\n|Stream|Description|||\n|---|---|---|---|\n| Archetypical.Software.Spigot.Streams.AWS  |   |[![Nuget](https://img.shields.io/nuget/v/Archetypical.Software.Spigot.Streams.AWS.svg?style=for-the-badge)](https://www.nuget.org/packages/Archetypical.Software.Spigot.Streams.AWS/)   | [![Nuget](https://img.shields.io/nuget/dt/Archetypical.Software.Spigot.Streams.AWS.svg?style=for-the-badge)](https://www.nuget.org/packages/Archetypical.Software.Spigot.Streams.AWS/)\n| Archetypical.Software.Spigot.Streams.Azure  |   |[![Nuget](https://img.shields.io/nuget/v/Archetypical.Software.Spigot.Streams.Azure.svg?style=for-the-badge)](https://www.nuget.org/packages/Archetypical.Software.Spigot.Streams.Azure/)   |[![Nuget](https://img.shields.io/nuget/dt/Archetypical.Software.Spigot.Streams.Azure.svg?style=for-the-badge)](https://www.nuget.org/packages/Archetypical.Software.Spigot.Streams.Azure/)\n| Archetypical.Software.Spigot.Streams.GoogleCloud  |   |[![Nuget](https://img.shields.io/nuget/v/Archetypical.Software.Spigot.Streams.GoogleCloud.svg?style=for-the-badge)](https://www.nuget.org/packages/Archetypical.Software.Spigot.Streams.GoogleCloud/)   |[![Nuget](https://img.shields.io/nuget/dt/Archetypical.Software.Spigot.Streams.GoogleCloud.svg?style=for-the-badge)](https://www.nuget.org/packages/Archetypical.Software.Spigot.Streams.GoogleCloud/)\n| Archetypical.Software.Spigot.Streams.RabbitMQ  |   |[![Nuget](https://img.shields.io/nuget/v/Archetypical.Software.Spigot.Streams.RabbitMQ.svg?style=for-the-badge)](https://www.nuget.org/packages/Archetypical.Software.Spigot.Streams.RabbitMQ/)   |[![Nuget](https://img.shields.io/nuget/dt/Archetypical.Software.Spigot.Streams.RabbitMQ.svg?style=for-the-badge)](https://www.nuget.org/packages/Archetypical.Software.Spigot.Streams.RabbitMQ/)\n| Archetypical.Software.Spigot.Streams.Redis  |   |[![Nuget](https://img.shields.io/nuget/v/Archetypical.Software.Spigot.Streams.Redis.svg?style=for-the-badge)](https://www.nuget.org/packages/Archetypical.Software.Spigot.Streams.Redis/)   |[![Nuget](https://img.shields.io/nuget/dt/Archetypical.Software.Spigot.Streams.Redis.svg?style=for-the-badge)](https://www.nuget.org/packages/Archetypical.Software.Spigot.Streams.Redis/)\n| Archetypical.Software.Spigot.Streams.ZeroMQ  |   |[![Nuget](https://img.shields.io/nuget/v/Archetypical.Software.Spigot.Streams.ZeroMQ.svg?style=for-the-badge)](https://www.nuget.org/packages/Archetypical.Software.Spigot.Streams.ZeroMQ/)   |[![Nuget](https://img.shields.io/nuget/dt/Archetypical.Software.Spigot.Streams.ZeroMQ.svg?style=for-the-badge)](https://www.nuget.org/packages/Archetypical.Software.Spigot.Streams.ZeroMQ/)\n| Archetypical.Software.Spigot.Streams.Kafka  |   |[![Nuget](https://img.shields.io/nuget/v/Archetypical.Software.Spigot.Streams.Kafka.svg?style=for-the-badge)](https://www.nuget.org/packages/Archetypical.Software.Spigot.Streams.Kafka/)   |[![Nuget](https://img.shields.io/nuget/dt/Archetypical.Software.Spigot.Streams.Kafka.svg?style=for-the-badge)](https://www.nuget.org/packages/Archetypical.Software.Spigot.Streams.Kafka/)\n| Archetypical.Software.Spigot.Streams.KubeMQ  |   |[![Nuget](https://img.shields.io/nuget/v/Archetypical.Software.Spigot.Streams.KubeMQ.svg?style=for-the-badge)](https://www.nuget.org/packages/Archetypical.Software.Spigot.Streams.KubeMQ/)   |[![Nuget](https://img.shields.io/nuget/dt/Archetypical.Software.Spigot.Streams.KubeMQ.svg?style=for-the-badge)](https://www.nuget.org/packages/Archetypical.Software.Spigot.Streams.KubeMQ/)\n\n\n### Spigot supports these serialization formats:\n\n|Stream|Description|||\n|---|---|---|---|\n| Archetypical.Software.Spigot.Serializers.Json  |   |[![Nuget](https://img.shields.io/nuget/v/Archetypical.Software.Spigot.Serializers.Json.svg?style=for-the-badge)](https://www.nuget.org/packages/Archetypical.Software.Spigot.Serializers.Json/)   | [![Nuget](https://img.shields.io/nuget/dt/Archetypical.Software.Spigot.Serializers.Json.svg?style=for-the-badge)](https://www.nuget.org/packages/Archetypical.Software.Spigot.Serializers.Json/)\n| Archetypical.Software.Spigot.Serializers.MsgPack  |   |[![Nuget](https://img.shields.io/nuget/v/Archetypical.Software.Spigot.Serializers.MsgPack.svg?style=for-the-badge)](https://www.nuget.org/packages/Archetypical.Software.Spigot.Serializers.MsgPack/)   |[![Nuget](https://img.shields.io/nuget/dt/Archetypical.Software.Spigot.Serializers.MsgPack.svg?style=for-the-badge)](https://www.nuget.org/packages/Archetypical.Software.Spigot.Serializers.MsgPack/)\n| Archetypical.Software.Spigot.Serializers.Protobuf  |   |[![Nuget](https://img.shields.io/nuget/v/Archetypical.Software.Spigot.Serializers.Protobuf.svg?style=for-the-badge)](https://www.nuget.org/packages/Archetypical.Software.Spigot.Serializers.Protobuf/)   |[![Nuget](https://img.shields.io/nuget/dt/Archetypical.Software.Spigot.Serializers.Protobuf.svg?style=for-the-badge)](https://www.nuget.org/packages/Archetypical.Software.Spigot.Serializers.Protobuf/)\n\n\n### Check out some hands-on [Demos](https://github.com/ArchetypicalSoftware/Spigot.Demo/tree/main) ","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farchetypicalsoftware%2Fspigot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Farchetypicalsoftware%2Fspigot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farchetypicalsoftware%2Fspigot/lists"}