{"id":13578180,"url":"https://github.com/crossbario/autobahn-js","last_synced_at":"2026-02-25T12:16:49.578Z","repository":{"id":2678588,"uuid":"3670753","full_name":"crossbario/autobahn-js","owner":"crossbario","description":"WAMP in JavaScript for Browsers and NodeJS","archived":false,"fork":false,"pushed_at":"2026-01-13T08:37:31.000Z","size":6808,"stargazers_count":1447,"open_issues_count":89,"forks_count":235,"subscribers_count":53,"default_branch":"master","last_synced_at":"2026-01-15T14:46:23.838Z","etag":null,"topics":["autobahn","html5","javascript","nodejs","pubsub","real-time","rpc","wamp","websocket"],"latest_commit_sha":null,"homepage":"http://crossbar.io/autobahn","language":"JavaScript","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/crossbario.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2012-03-09T13:13:13.000Z","updated_at":"2026-01-15T09:40:51.000Z","dependencies_parsed_at":"2024-06-18T12:18:17.784Z","dependency_job_id":"50bf8c6b-2662-4694-9275-7c0658c58e05","html_url":"https://github.com/crossbario/autobahn-js","commit_stats":{"total_commits":570,"total_committers":67,"mean_commits":8.507462686567164,"dds":0.5157894736842106,"last_synced_commit":"c831f35c1911eb31ec8ffdfe0f62fa15e9dcccb6"},"previous_names":["tavendo/autobahnjs"],"tags_count":59,"template":false,"template_full_name":null,"purl":"pkg:github/crossbario/autobahn-js","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crossbario%2Fautobahn-js","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crossbario%2Fautobahn-js/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crossbario%2Fautobahn-js/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crossbario%2Fautobahn-js/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/crossbario","download_url":"https://codeload.github.com/crossbario/autobahn-js/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crossbario%2Fautobahn-js/sbom","scorecard":{"id":309506,"data":{"date":"2025-08-11","repo":{"name":"github.com/crossbario/autobahn-js","commit":"01936e16568a10bd14700239d6e28adab5c5986a"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.2,"checks":[{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/main.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":"Maintained","score":1,"reason":"2 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 1","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":3,"reason":"Found 9/30 approved changesets -- score normalized to 3","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":"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":"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":"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":"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":"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":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"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":"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":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"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":"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/main.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/crossbario/autobahn-js/main.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/crossbario/autobahn-js/main.yml/master?enable=pin","Warn: containerImage not pinned by hash: Dockerfile:1: pin your Docker image by updating ubuntu:bionic to ubuntu:bionic@sha256:152dc042452c496007f07ca9127571cb9c29697f42acbfad72324b2bb2e43c98","Warn: containerImage not pinned by hash: docker/aarch64/Dockerfile.alpine:1","Warn: containerImage not pinned by hash: docker/aarch64/Dockerfile.full:2: pin your Docker image by updating arm64v8/node to arm64v8/node@sha256:3a63137a5b42226d52a1b5122533b5241ddd4308d65c31e7b3cad434540107fc","Warn: containerImage not pinned by hash: docker/armhf/Dockerfile.alpine:1","Warn: containerImage not pinned by hash: docker/armhf/Dockerfile.full:1: pin your Docker image by updating arm32v7/node to arm32v7/node@sha256:91a3785301528ff75b1e1cee5e9db0549594f9648d909b00fbd2a144871071f7","Warn: containerImage not pinned by hash: docker/x86_64/Dockerfile.alpine:1: pin your Docker image by updating alpine:edge to alpine:edge@sha256:115729ec5cb049ba6359c3ab005ac742012d92bbaa5b8bc1a878f1e8f62c0cb8","Warn: containerImage not pinned by hash: docker/x86_64/Dockerfile.full:1: pin your Docker image by updating node to node@sha256:dc4ac80350904c2797058e477a30b6285e9e025f23f139ea8b277c9efe55dd9a","Warn: containerImage not pinned by hash: packages/autobahn-xbr/test/client/nodejs/Dockerfile:1: pin your Docker image by updating node:11-stretch to node:11-stretch@sha256:67ca28addce8ae818b144114a9376a6603aba09069b7313618d37b38584abba1","Warn: pipCommand not pinned by hash: Dockerfile:32","Warn: npmCommand not pinned by hash: docker/aarch64/Dockerfile.alpine:54","Warn: npmCommand not pinned by hash: docker/aarch64/Dockerfile.alpine:55","Warn: npmCommand not pinned by hash: docker/aarch64/Dockerfile.alpine:56","Warn: npmCommand not pinned by hash: docker/aarch64/Dockerfile.full:60","Warn: npmCommand not pinned by hash: docker/aarch64/Dockerfile.full:61","Warn: npmCommand not pinned by hash: docker/aarch64/Dockerfile.full:62","Warn: npmCommand not pinned by hash: docker/armhf/Dockerfile.alpine:54","Warn: npmCommand not pinned by hash: docker/armhf/Dockerfile.alpine:55","Warn: npmCommand not pinned by hash: docker/armhf/Dockerfile.alpine:56","Warn: npmCommand not pinned by hash: docker/armhf/Dockerfile.full:59","Warn: npmCommand not pinned by hash: docker/armhf/Dockerfile.full:60","Warn: npmCommand not pinned by hash: docker/armhf/Dockerfile.full:61","Warn: npmCommand not pinned by hash: docker/x86_64/Dockerfile.alpine:47","Warn: npmCommand not pinned by hash: docker/x86_64/Dockerfile.alpine:48","Warn: npmCommand not pinned by hash: docker/x86_64/Dockerfile.alpine:49","Warn: npmCommand not pinned by hash: docker/x86_64/Dockerfile.full:52","Warn: npmCommand not pinned by hash: docker/x86_64/Dockerfile.full:53","Warn: npmCommand not pinned by hash: docker/x86_64/Dockerfile.full:54","Warn: npmCommand not pinned by hash: packages/autobahn-xbr/test/client/nodejs/Dockerfile:5","Warn: npmCommand not pinned by hash: docker/aarch64/app/run:3","Warn: npmCommand not pinned by hash: docker/armhf/app/run:3","Warn: npmCommand not pinned by hash: docker/x86_64/app/run:3","Warn: npmCommand not pinned by hash: .github/workflows/main.yml:38","Warn: pipCommand not pinned by hash: .github/workflows/main.yml:39","Warn: npmCommand not pinned by hash: .github/workflows/main.yml:43","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   8 containerImage dependencies pinned","Info:   0 out of   2 pipCommand dependencies pinned","Info:   0 out of  24 npmCommand 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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 26 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-17T22:54:01.797Z","repository_id":2678588,"created_at":"2025-08-17T22:54:01.797Z","updated_at":"2025-08-17T22:54:01.797Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28522310,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-17T22:11:28.393Z","status":"ssl_error","status_checked_at":"2026-01-17T22:11:27.841Z","response_time":85,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["autobahn","html5","javascript","nodejs","pubsub","real-time","rpc","wamp","websocket"],"created_at":"2024-08-01T15:01:28.205Z","updated_at":"2026-01-17T23:37:17.179Z","avatar_url":"https://github.com/crossbario.png","language":"JavaScript","funding_links":[],"categories":["JavaScript"],"sub_categories":[],"readme":"# **Autobahn**|JS\n\nWAMP for Browsers and NodeJS.\n\n[![IANA WAMP](https://img.shields.io/badge/IANA-WAMP%20Subprotocol-informational.svg)](https://www.iana.org/assignments/websocket/websocket.xhtml)\n[![CI](https://github.com/crossbario/autobahn-js/actions/workflows/main.yml/badge.svg)](https://github.com/crossbario/autobahn-js/actions/workflows/main.yml)\n[![Docs](https://img.shields.io/badge/docs-GitHub%20Pages-blue.svg)](https://crossbario.github.io/autobahn-js/)\n[![npm version](https://img.shields.io/npm/v/autobahn.svg)](https://www.npmjs.com/package/autobahn)\n[![npm downloads](https://img.shields.io/npm/dm/autobahn.svg)](https://www.npmjs.com/package/autobahn)\n[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n\n[![NPM](https://nodei.co/npm/autobahn.png?downloads=true\u0026downloadRank=true\u0026stars=true)](https://nodei.co/npm/autobahn/)\n\n**npm quicklinks:**\n\n* [**autobahn**](https://www.npmjs.com/package/autobahn/) - Autobahn for NodeJS\n* [**autobahn-browser**](https://www.npmjs.com/package/autobahn-browser/) - Autobahn for browsers\n* [**autobahn-xbr**](https://www.npmjs.com/package/autobahn-xbr/) - Autobahn-[XBR](https://xbr.network/) for NodeJS\n* [**autobahn-xbr-browser**](https://www.npmjs.com/package/autobahn-xbr-browser/) - Autobahn-[XBR](https://xbr.network/) for browsers\n\n**XBR quicklinks:**\n\n* [XBR Network](https://xbr.network/) - The XBR Network homepage.\n* [XBR Protocol](https://github.com/crossbario/xbr-protocol) - The XBR Protocol source repository.\n* [XBR Docs](https://xbr.network/docs/protocol/index.html) - XBR Protocol and APIs Documentation.\n\n---\n\n**Autobahn**|JS is a subproject of the [Autobahn project](https://autobahn.readthedocs.io) and provides an open-source implementation of the **[Web Application Messaging Protocol V2](http://wamp.ws/)** in JavaScript under the [MIT license](/LICENSE).\n\nWAMP provides asynchronous **Remote Procedure Calls** and **Publish \u0026 Subscribe** for applications in *one* protocol running over [WebSocket](http://tools.ietf.org/html/rfc6455) (and fallback transports for old browsers).\n\n**Autobahn**|JS runs on both **Web browsers** and **[Node.js](http://nodejs.org/)**.\n\n## Platform Requirements\n\n**Autobahn**|JS targets:\n\n- **Node.js 22+** (uses native WebSocket, no external dependencies)\n- **Modern browsers**: Chrome, Firefox, Edge, Safari (all current versions)\n\nFor older Node.js versions (\u003c 22), use AutobahnJS v20.x which includes the `ws` library.\n\n## What can I do with this stuff?\n\n**Autobahn|JS** makes **distributed, realtime Web applications easy**: it provides the infrastructure for both **distributing live updates** to all connected clients (using the PubSub messaging pattern) and for **calling remote procedures** in different backend components (using RPC).\n\nIt is ideal for distributed, multi-client and server applications, such as multi-user database-drive business applications, real-time charts, sensor networks (IoT), instant messaging or MMOGs (massively multi-player online games).\n\nThe protocol that **Autobahn|JS** uses, WAMP, enables application architectures with application code **distributed freely across processes and devices** according to functional aspects. All WAMP clients are equal in that they can publish events and subscribe to them, can offer a procedure for remote calling and call remote procedures.\n\nSince WAMP implementations exist for **multiple languages**, this extends beyond JavaScript clients: WAMP applications can be polyglot. Application components can be implemented in a language and run on a device which best fit the particular use case. Applications can span the range from embedded IoT sensors right to mobile clients or the browser - using the same protocol.\n\n## Show me some code\n\nThe following example implements all four roles that **Autobahn**|JS offers\n\n * Publisher\n * Subscriber\n * Caller (calls a remote procedure)\n * Callee (offers a remote procedure)\n\n**The code runs unaltered in the browser or Node.js!**\n\n```javascript\ntry {\n   // for Node.js\n   var autobahn = require('autobahn');\n} catch (e) {\n   // for browsers (where AutobahnJS is available globally)\n}\n\nvar connection = new autobahn.Connection({url: 'ws://127.0.0.1:9000/', realm: 'realm1'});\n\nconnection.onopen = function (session) {\n\n   // 1) subscribe to a topic\n   function onevent(args) {\n      console.log(\"Event:\", args[0]);\n   }\n   session.subscribe('com.myapp.hello', onevent);\n\n   // 2) publish an event\n   session.publish('com.myapp.hello', ['Hello, world!']);\n\n   // 3) register a procedure for remoting\n   function add2(args) {\n      return args[0] + args[1];\n   }\n   session.register('com.myapp.add2', add2);\n\n   // 4) call a remote procedure\n   session.call('com.myapp.add2', [2, 3]).then(\n      function (res) {\n         console.log(\"Result:\", res);\n      }\n   );\n};\n\nconnection.open();\n```\n\nFeatures\n--------\n\n* supports WAMP v2, works with any WAMP server\n* works both in the browser and Node.js\n* provides asynchronous RPC and PubSub messaging patterns\n* uses WebSocket or HTTP long-poll as transport\n* easy to use Promise-based API\n* pluggable promises/deferreds: uses [when.js](https://github.com/cujojs/when) (built-in) with progress support for WAMP progressive calls\n* minimal dependencies (when.js for promises, CryptoJS for WAMP-CRA auth)\n* small size (~250kB source, ~110kB minified, ~35kB gzipped)\n* Open-Source (MIT License)\n\n\n## Get it\n\n### Browser Development\n\nThe *latest* built release of AutobahnJS can be retrieved by cloning [this](https://github.com/crossbario/autobahn-js-browser) repository. You can then host the library wherever you need to.\n\nThis also contains a complete history of previous releases and can be used with **[Bower](http://bower.io/)**. To install:\n\n\tbower install autobahn\n\n\n### Node.js Development\n\nAutobahnJS is available via npm [here](https://www.npmjs.org/package/autobahn). To install:\n\n```console\nnpm install autobahn\n```\n\n#### Supported Node.js Versions\n\nAutobahnJS is tested and supported on the following Node.js versions:\n\n| Version | Status | Support Until |\n|---------|--------|---------------|\n| 22.x | Maintenance LTS | Apr 2027 |\n| 24.x | **Active LTS** \"Krypton\" | Apr 2028 |\n| 25.x | Current | — |\n\n**Recommendation:** Use Node.js 24.x (Active LTS) for production deployments.\n\nFor the latest Node.js release schedule, see [nodejs.org/about/previous-releases](https://nodejs.org/en/about/previous-releases).\n\n#### WebSocket Support\n\nNode.js 22+ includes native WebSocket support. AutobahnJS uses this native implementation directly—no external WebSocket library is required.\n\n#### Quick Check\n\nVerify your installation:\n\n```console\nnode -e \"var autobahn = require('autobahn'); console.log('AutobahnJS version:', autobahn.version);\"\n```\n\n## More information\n\nFor more information, take a look at the [project documentation](/doc/README.md). This provides:\n\n* [a quick 'Getting Started'](/doc/getting-started.md)\n* [a basic introduction to programming with Autobahn|JS](/doc/programming.md)\n* [a list of all examples in this repo](/doc/examples.md)\n* [a full API reference](/doc/reference.md)\n\n\n## Get in touch\n\nGet in touch on our [user forum](https://crossbar.discourse.group/).\n\n\n## Acknowledgements\n\n**Autobahn**|JS includes code from the following open-source projects\n\n  * [when.js](https://github.com/cujojs/when) — Promise/A+ implementation with progress support\n  * [CryptoJS](http://code.google.com/p/crypto-js/) — Cryptographic functions for WAMP-CRA\n\nSpecial thanks to the [Coders with an Unhealthy Javascript Obsession](http://cujojs.com/) for creating *when.js - A lightweight Promise and when() implementation, plus other async goodies.*\n\n**Historical note:** Prior to v26.x, AutobahnJS used the excellent [ws](https://github.com/websockets/ws) library for WebSocket support in Node.js. With Node.js 22+ providing native WebSocket, this dependency is no longer needed.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcrossbario%2Fautobahn-js","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcrossbario%2Fautobahn-js","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcrossbario%2Fautobahn-js/lists"}