{"id":29151204,"url":"https://github.com/karpeleslab/emitter","last_synced_at":"2025-10-16T06:38:14.205Z","repository":{"id":255441054,"uuid":"851106733","full_name":"KarpelesLab/emitter","owner":"KarpelesLab","description":null,"archived":false,"fork":false,"pushed_at":"2024-11-12T15:38:03.000Z","size":42,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-07-01T00:08:52.622Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/KarpelesLab.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"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":"2024-09-02T12:42:49.000Z","updated_at":"2024-11-12T15:37:58.000Z","dependencies_parsed_at":null,"dependency_job_id":"48a39bdb-79f6-44bc-9c9b-cc96b1869540","html_url":"https://github.com/KarpelesLab/emitter","commit_stats":null,"previous_names":["karpeleslab/emitter"],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/KarpelesLab/emitter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KarpelesLab%2Femitter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KarpelesLab%2Femitter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KarpelesLab%2Femitter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KarpelesLab%2Femitter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/KarpelesLab","download_url":"https://codeload.github.com/KarpelesLab/emitter/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KarpelesLab%2Femitter/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279163217,"owners_count":26117404,"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","status":"online","status_checked_at":"2025-10-16T02:00:06.019Z","response_time":53,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":[],"created_at":"2025-07-01T00:08:54.068Z","updated_at":"2025-10-16T06:38:14.140Z","avatar_url":"https://github.com/KarpelesLab.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![GoDoc](https://godoc.org/github.com/KarpelesLab/emitter?status.svg)](https://godoc.org/github.com/KarpelesLab/emitter)\n\n# emitter\n\nSimple emitter lib.\n\n## Example\n\n```go\nh := emitter.New()\n\ngo func(ch \u003c-chan *emitter.Event) {\n    defer h.Off(\"event\", ch)\n\n    for ev := range ch {\n        // handle event\n        intVal, err := emitter.Arg[int](ev, 0)\n        // intVal is 42\n    }\n}(h.On(\"event\"))\n\nh.Emit(\"event\", 42)\n```\n\n## Global Hub\n\nFor some cases it might be useful to have global events that can be handled by multiple packages. This can be done with the global hub.\n\n```go\ngo func(ch \u003c-chan *emitter.Event) {\n    for ev := range ch {\n        // ...\n    }\n})(emitter.Global.On(\"event\"))\n\nemitter.Global.Emit(\"event\", 42)\n```\n\n# Trigger\n\nThe trigger object allows waking multiple threads at the same time using channels rather than [sync.Cond](https://pkg.go.dev/sync#Cond). This can be useful to wake many threads to specific events while still using other event sources such as timers.\n\nTriggers by default have a queue size of 1, meaning that a call to Push() can be queued and delivered later if the receiving thread is busy. Cap can be set to other values including zero (do not queue) or larger values (queue a number of calls).\n\nUnlike events `Emit()`, a trigger's `Push()` method returns instantly and is non blocking, with minimal resource usage.\n\n## Example\n\n```go\ntrig := emitter.Global.Trigger(\"test\")\n\ngo func() {\n    t := time.NewTicker(30*time.Second)\n    defer t.Stop()\n    l := trig.Listen()\n    defer l.Release()\n\n    for {\n        select {\n        case \u003c-t.C:\n            // do something every 30 secs\n        case _, closed := \u003c-l.C:\n            if closed {\n                // exit loop if channel is closed, would be triggered by trig.Close()\n                // this can be ignored if trig.Closed() isn't called\n                return\n            }\n            // do something on trigger called\n        }\n    }\n}\n\ntrig.Push() // push event\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkarpeleslab%2Femitter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkarpeleslab%2Femitter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkarpeleslab%2Femitter/lists"}