{"id":19515210,"url":"https://github.com/krmax44/houk","last_synced_at":"2026-05-28T16:31:23.900Z","repository":{"id":35107703,"uuid":"207598817","full_name":"krmax44/houk","owner":"krmax44","description":"A super simple event bus.","archived":false,"fork":false,"pushed_at":"2022-06-03T23:21:34.000Z","size":691,"stargazers_count":0,"open_issues_count":13,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-08-09T08:15:47.676Z","etag":null,"topics":["event-bus","event-listener","events","hooks","tiny","yet-another"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","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/krmax44.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}},"created_at":"2019-09-10T15:41:39.000Z","updated_at":"2021-04-03T17:25:32.000Z","dependencies_parsed_at":"2022-08-18T02:15:36.753Z","dependency_job_id":null,"html_url":"https://github.com/krmax44/houk","commit_stats":null,"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/krmax44/houk","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/krmax44%2Fhouk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/krmax44%2Fhouk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/krmax44%2Fhouk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/krmax44%2Fhouk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/krmax44","download_url":"https://codeload.github.com/krmax44/houk/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/krmax44%2Fhouk/sbom","scorecard":{"id":570570,"data":{"date":"2025-08-11","repo":{"name":"github.com/krmax44/houk","commit":"85aa060179a09005d27db0479c68cea40c9ce077"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.5,"checks":[{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/build.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/krmax44/houk/build.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/krmax44/houk/build.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/krmax44/houk/build.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/krmax44/houk/build.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:40: update your workflow using https://app.stepsecurity.io/secureworkflow/krmax44/houk/build.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:41: update your workflow using https://app.stepsecurity.io/secureworkflow/krmax44/houk/build.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:44: update your workflow using https://app.stepsecurity.io/secureworkflow/krmax44/houk/build.yml/main?enable=pin","Info:   0 out of   6 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":0,"reason":"59 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-67hx-6x53-jw92","Warn: Project is vulnerable to: GHSA-h5c3-5r3r-rr8q","Warn: Project is vulnerable to: GHSA-rmvr-2pp2-xj38","Warn: Project is vulnerable to: GHSA-xx4v-prfh-6cgc","Warn: Project is vulnerable to: GHSA-v88g-cgmw-v5xw","Warn: Project is vulnerable to: GHSA-93q8-gq69-wqmw","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-gxpj-cx7g-858c","Warn: Project is vulnerable to: GHSA-w573-4hg7-7wgq","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-ww39-953v-wcq6","Warn: Project is vulnerable to: GHSA-pfrx-2q88-qq97","Warn: Project is vulnerable to: GHSA-43f8-2h32-f4cj","Warn: Project is vulnerable to: GHSA-rc47-6667-2j5j","Warn: Project is vulnerable to: GHSA-qqgx-2p2h-9c37","Warn: Project is vulnerable to: GHSA-78xj-cgh5-2h22","Warn: Project is vulnerable to: GHSA-2p57-rm9w-gvfp","Warn: Project is vulnerable to: GHSA-896r-f27r-55mw","Warn: Project is vulnerable to: GHSA-9c47-m6qq-7p4h","Warn: Project is vulnerable to: GHSA-6c8f-qphg-qjgp","Warn: Project is vulnerable to: GHSA-p6mc-m468-83gw","Warn: Project is vulnerable to: GHSA-29mw-wpgm-hmr9","Warn: Project is vulnerable to: GHSA-35jh-r3h4-6jhm","Warn: Project is vulnerable to: GHSA-5v2h-r2cx-5xgj","Warn: Project is vulnerable to: GHSA-rrrm-qjm4-v8hf","Warn: Project is vulnerable to: GHSA-4xcv-9jjx-gfj3","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-f8q6-p94x-37v3","Warn: Project is vulnerable to: GHSA-vh95-rmgr-6w4m","Warn: Project is vulnerable to: GHSA-xvch-5gv4-984h","Warn: Project is vulnerable to: GHSA-r683-j2x4-v87g","Warn: Project is vulnerable to: GHSA-5fw9-fq32-wv5p","Warn: Project is vulnerable to: GHSA-px4h-xg32-q955","Warn: Project is vulnerable to: GHSA-hj48-42vr-x3v9","Warn: Project is vulnerable to: GHSA-hrpp-h998-j3pp","Warn: Project is vulnerable to: GHSA-p8p7-x288-28g6","Warn: Project is vulnerable to: GHSA-x2pg-mjhr-2m5x","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-44c6-4v22-4mhx","Warn: Project is vulnerable to: GHSA-4x5v-gmq8-25ch","Warn: Project is vulnerable to: GHSA-vx3p-948g-6vhq","Warn: Project is vulnerable to: GHSA-3jfq-g458-7qm9","Warn: Project is vulnerable to: GHSA-r628-mhmh-qjhw","Warn: Project is vulnerable to: GHSA-9r2w-394v-53qc","Warn: Project is vulnerable to: GHSA-5955-9wpr-37jh","Warn: Project is vulnerable to: GHSA-qq89-hq3f-393p","Warn: Project is vulnerable to: GHSA-f5x3-32g6-xq36","Warn: Project is vulnerable to: GHSA-jgrx-mgxx-jf9v","Warn: Project is vulnerable to: GHSA-72xf-g2v4-qvf3","Warn: Project is vulnerable to: GHSA-7p7h-4mm5-852v","Warn: Project is vulnerable to: GHSA-38fc-wpqx-33j7","Warn: Project is vulnerable to: GHSA-j8xg-fqg3-53r7","Warn: Project is vulnerable to: GHSA-6fc8-4gx4-v693","Warn: Project is vulnerable to: GHSA-3h5v-q93c-6h6q","Warn: Project is vulnerable to: GHSA-c4w7-xm78-47vh","Warn: Project is vulnerable to: GHSA-p9pc-299p-vxgp"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-20T16:14:07.789Z","repository_id":35107703,"created_at":"2025-08-20T16:14:07.789Z","updated_at":"2025-08-20T16:14:07.789Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33617718,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-28T02:00:06.440Z","response_time":99,"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":["event-bus","event-listener","events","hooks","tiny","yet-another"],"created_at":"2024-11-10T23:39:02.295Z","updated_at":"2026-05-28T16:31:23.883Z","avatar_url":"https://github.com/krmax44.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Houk\n\n[![GitHub CI Status](https://img.shields.io/github/workflow/status/krmax44/houk/build/main)](https://github.com/krmax44/houk/actions?query=workflow%3Abuild)\n[![Code Coverage](https://img.shields.io/codecov/c/github/krmax44/houk)](https://codecov.io/gh/krmax44/houk)\n[![bundle size](https://img.shields.io/bundlephobia/minzip/houk)](https://bundlephobia.com/result?p=houk)\n[![npm version](https://img.shields.io/npm/v/houk)](https://www.npmjs.com/package/houk)\n\nA safely typed, super simple, universal event bus with awesome IDE auto completions. Requires TypeScript 4+.\n\n## Installation\n\n```bash\nyarn add houk\n# or using npm\nnpm i houk\n```\n\n## Usage\n\n\u003cdetails open\u003e\n\u003csummary\u003eClass-based\u003c/summary\u003e\n\nSee the complete [API](#api) below.\n\n```ts\nimport Houk from 'houk';\n\nclass CoffeeShop extends Houk\u003c{\n\torder: [name: string, type: string];\n}\u003e {\n\tmakeMeACoffee() {\n\t\tconst name = 'Max';\n\t\tconst type = 'Cappuccino with oat milk';\n\n\t\tthis.emit('order', name, type);\n\t}\n}\n\nconst barista = new CoffeeShop();\nbarista.on('order', (name, type) =\u003e {\n\tconsole.log(`${name} would like a ${type}, please.`);\n});\n\nbarista.makeMeACoffee();\n\n// --\u003e Max would like a Cappuccino with oat milk, please.\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eas an open bus\u003c/summary\u003e\n\nSee the complete [API](#houkbus) below.\n\n```ts\nimport { HoukBus } from 'houk';\n\nconst coffeeShop = new HoukBus\u003c{\n\torder: [name: string, type: string];\n}\u003e();\n\ncoffeeShop.on('order', (name, type) =\u003e {\n\tconsole.log(`${name} would like a ${type}, please.`);\n});\n\nconst name = 'Max';\nconst type = 'Cappuccino with oat milk';\ncoffeeShop.emit('order', name, type);\n\n// --\u003e Max would like a Cappuccino with oat milk, please.\n```\n\n\u003c/details\u003e\n\n## API\n\n### Constructor\n\nThe Houk constructor requires one type argument:\n\n```ts\nclass MyClass extends Houk\u003c{\n\teventName: [arg1: string, arg2: number];\n}\u003e {}\n```\n\nThe object links the event names to the arguments the listener functions will receive. As labeled tuple types were introduced with TypeScript 4, make sure to be on the latest version.\nIn the example above, the listener function for the event `eventName` must be called with `arg1` of type `string` and `arg2` with type number. Rest parameters and optional types are possible.\n\n### `Houk.on`\n\nListen to a particular event. Takes the event name, a listener function and whether the listener should only be called once (false by default).\n\n```ts\non(eventName, listener, once?): void\n```\n\n### `Houk.off`\n\nUnregister an event listener. Returns true on success and false when the event listener didn't exist before.\n\n```ts\noff(eventName, listener) =\u003e boolean\n```\n\n### `Houk.awaitEvent`\n\nReturns a promise that will resolve, once the given event was triggered.\n\n```ts\nawait houk.awaitEvent('myEvent');\nconsole.log('myEvent was emitted');\n```\n\n### `Houk.emit`\n\nOnly available to deriving classes. Trigger all listeners of a particular event. `...args` will be passed along to the listeners.\n\nThe listeners will all be called at once. It returns a Promise, which will resolve once all listeners have reached completion.\n\n```ts\nemit(eventName, ...args) =\u003e Promise\n```\n\n### `Houk.emitSync`\n\nOnly available to deriving classes. Trigger all listeners of a particular event. `...args` will be passed along to the listeners.\n\nThe listeners will be called once at a time, in order of registration. It returns a Promise, which will resolve once all listeners have reached completion.\n\n```ts\nemit(eventName, ...args) =\u003e Promise\n```\n\n### `Houk.getListeners`\n\nOnly available to deriving classes, returns a set of listener functions.\n\n```ts\ngetListeners(eventName) =\u003e Set\u003c() =\u003e {})\u003e\n```\n\n### `HoukBus`\n\nYou can also create an open bus, using `HoukBus`:\n\n```ts\nimport { HoukBus } from 'houk';\n\nconst bus = new HoukBus\u003cEventTypes\u003e();\n```\n\nThe same API from `Houk` applies to HoukBus, except that all methods are public.\n\n## v3 Breaking Changes\n\nHouk used to be both an event and hook chain bus. The concept of combining those two into one is neat, but definitely janky at times, which paired together with type safety doesn't feel right. Therefore, I decided to drop hook chains and make Houk a super-simple, type-safe event bus only.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkrmax44%2Fhouk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkrmax44%2Fhouk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkrmax44%2Fhouk/lists"}