{"id":14973632,"url":"https://github.com/probil/vue-socket.io-extended","last_synced_at":"2025-05-14T11:11:59.186Z","repository":{"id":31249220,"uuid":"127283648","full_name":"probil/vue-socket.io-extended","owner":"probil","description":":v::zap: Socket.io bindings for Vue.js and Vuex (inspired by Vue-Socket.io)","archived":false,"fork":false,"pushed_at":"2025-05-06T13:26:46.000Z","size":7017,"stargazers_count":626,"open_issues_count":39,"forks_count":37,"subscribers_count":12,"default_branch":"master","last_synced_at":"2025-05-06T14:44:05.831Z","etag":null,"topics":["adapter","realtime","socket-io","vuejs","vuejs2","vuex","websockets"],"latest_commit_sha":null,"homepage":"","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/probil.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","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,"zenodo":null},"funding":{"github":null,"patreon":null,"open_collective":null,"ko_fi":"probil","tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":null}},"created_at":"2018-03-29T11:44:51.000Z","updated_at":"2025-03-22T20:19:16.000Z","dependencies_parsed_at":"2023-12-19T16:05:10.207Z","dependency_job_id":"b18ba231-0612-4306-80fc-212b29143805","html_url":"https://github.com/probil/vue-socket.io-extended","commit_stats":{"total_commits":1312,"total_committers":15,"mean_commits":87.46666666666667,"dds":0.3277439024390244,"last_synced_commit":"17710644ede12da932d8c47c0d12a67ff88a1886"},"previous_names":[],"tags_count":29,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/probil%2Fvue-socket.io-extended","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/probil%2Fvue-socket.io-extended/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/probil%2Fvue-socket.io-extended/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/probil%2Fvue-socket.io-extended/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/probil","download_url":"https://codeload.github.com/probil/vue-socket.io-extended/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254129523,"owners_count":22019628,"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":["adapter","realtime","socket-io","vuejs","vuejs2","vuex","websockets"],"created_at":"2024-09-24T13:49:07.037Z","updated_at":"2025-05-14T11:11:54.168Z","avatar_url":"https://github.com/probil.png","language":"JavaScript","funding_links":["https://ko-fi.com/probil","https://ko-fi.com/R5R1119O3'"],"categories":["Components \u0026 Libraries","公用事业","Utilities","Utilities [🔝](#readme)"],"sub_categories":["Utilities","双向信息传输","Web Sockets"],"readme":"[![Stand With Ukraine](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/banner-direct-single.svg)](https://stand-with-ukraine.pp.ua)\n\n---\n\n\u003ch1 align=\"center\" style=\"text-align:center\"\u003eVue-Socket.io-Extended\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://circleci.com/gh/probil/vue-socket.io-extended/tree/master\"\u003e\u003cimg src=\"https://badgen.net/circleci/github/probil/vue-socket.io-extended/master\" alt=\"Build Status\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.npmjs.com/package/vue-socket.io-extended\"\u003e\u003cimg src=\"https://badgen.net/npm/v/vue-socket.io-extended\" alt=\"Version\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.npmjs.com/package/vue-socket.io-extended\"\u003e\u003cimg src=\"https://badgen.net/npm/dt/vue-socket.io-extended\" alt=\"Downloads\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.npmjs.com/package/vue-socket.io-extended\"\u003e\u003cimg src=\"https://badgen.net/npm/license/vue-socket.io-extended\" alt=\"License\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://vuejs.org/\"\u003e\u003cimg src=\"https://badgen.net/badge/Vue/2.x/orange\" alt=\"Vue.js 2.x compatible\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://raw.githubusercontent.com/probil/vue-socket.io-extended/master/dist/vue-socket.io-ext.min.js\"\u003e\u003cimg src=\"https://badgen.net/bundlephobia/min/vue-socket.io-extended\" alt=\"Minified library size\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://codecov.io/gh/probil/vue-socket.io-extended\"\u003e\u003cimg src=\"https://badgen.net/codecov/c/github/probil/vue-socket.io-extended/master\" alt=\"Code coverage (codecov)\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://gitter.im/vue-socket-io-extended/Lobby?utm_source=share-link\u0026utm_medium=link\u0026utm_campaign=share-link\"\u003e\u003cimg src=\"https://badgen.net/badge/chat/on%20gitter/cyan\" alt=\"Join us Gitter\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://app.fossa.io/projects/git%2Bgithub.com%2Fprobil%2Fvue-socket.io-extended?ref=badge_shield\" alt=\"FOSSA Status\"\u003e\u003cimg src=\"https://app.fossa.io/api/projects/git%2Bgithub.com%2Fprobil%2Fvue-socket.io-extended.svg?type=shield\"/\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  Socket.io bindings for Vue.js 2 and Vuex (inspired by Vue-Socket.io)\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://codesandbox.io/s/oxqpm54pnq?fontsize=14\u0026module=%2Fsrc%2FApp.vue\"\u003e\u003cimg src=\"https://codesandbox.io/static/img/play-codesandbox.svg\" alt=\"Edit Vue Socket IO Extended Twitter feed demo\"/\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n  \u003ca href='https://ko-fi.com/R5R1119O3' target='_blank'\u003e\u003cimg height='36' style='border:0px;height:36px;' src='https://az743702.vo.msecnd.net/cdn/kofi2.png?v=2' border='0' alt='Buy Me a Coffee at ko-fi.com' /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\n\u003e :warning: [The alpha version of v5](https://github.com/probil/vue-socket.io-extended/tree/alpha) (with Vue 3 support) has been released. Your feedback would be appreciated [here](https://github.com/probil/vue-socket.io-extended/issues/489)\n\n\n## :cherries: Features\n\n- Lightweight and dependency free - only 2kb min gzip\n- Reactive properties `$socket.connected` and `$socket.disconnected`\n- Listening and emitting `socket.io` events inside components\n- Auto-dispatches actions and mutations in multiple namespaced Vuex modules on `socket.io` events\n- Good TypeScript support (decorator and typing)\n- Can be used with any version of `socket.io-client`\n- Custom options - tweak the library to better fit your project needs\n- etc...\n\n## :heavy_check_mark: Browser Support\n\n|![Chrome](https://raw.github.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png) | ![Firefox](https://raw.github.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png) | ![Safari](https://raw.github.com/alrra/browser-logos/master/src/safari/safari_48x48.png) | ![Opera](https://raw.github.com/alrra/browser-logos/master/src/opera/opera_48x48.png) | ![Edge](https://raw.github.com/alrra/browser-logos/master/src/edge/edge_48x48.png) | ![IE](https://raw.github.com/alrra/browser-logos/master/src/archive/internet-explorer_9-11/internet-explorer_9-11_48x48.png) |\n| --- | --- | --- | --- | --- | --- |\n| 38+ :heavy_check_mark: | 13+ :heavy_check_mark:  | 8+ :heavy_check_mark: | 25+ :heavy_check_mark: | 12+ :heavy_check_mark: | 11+ :heavy_check_mark: |\n\nWe support only browsers with global usage statistics greater than 1% and last 2 version of each browser (but not dead browsers). Library may work in older browser as well, but we don't guarantee that. You may need addition polyfills to make it work.\n\n## :seedling: Motivation\n\nI was using [`Vue-Socket.io`](https://github.com/MetinSeylan/Vue-Socket.io) for few months. I've liked the idea, but the more I used it the more I faced with bugs, outdated documentation, lack of support, absence of tests, and a huge amount of issues :disappointed:. That slowed down development of the product I was working on. So I ended up with a decision to create my own fork with all the desirable stuff (features/fixes/tests/support/CI checks etc). That's how `vue-socket.io-extended` was born.\n\nIf you'd like to help - create an issue or PR. I will be glad to see any contribution.  Let's make the world a better place :heart:\n\n## :grey_exclamation: Prerequisites\n\nYou must have a running Socket.IO server before starting any Vue/Socket.IO project! Instructions on how to build a Node/Socket.IO server are found [here](https://socket.io).\n\n## :grey_exclamation: Software Requirements\n\n- [Vue.js](https://vuejs.org/) `\u003e=2.X`\n- [Socket.io-client](https://socket.io) `\u003e=2.X`\n- [Vuex](https://vuex.vuejs.org/) `\u003e=2.X` (optional)\n\n## :cd: Installation\n\n```bash\nnpm install vue-socket.io-extended socket.io-client\n```\n\n## :checkered_flag: Initialization\n\n#### ES2015 (Webpack/Rollup/Browserify/Parcel/etc)\n```js\nimport VueSocketIOExt from 'vue-socket.io-extended';\nimport { io } from 'socket.io-client';\n\nconst socket = io('http://socketserver.com:1923');\n\nVue.use(VueSocketIOExt, socket);\n```\n*Note:* you have to pass instance of `socket.io-client` as second argument to prevent library duplication. Read more [here](https://github.com/probil/vue-socket.io-extended/issues/19).\n\n#### UMD (Browser)\n\n```html\n\u003cscript src=\"https://cdn.jsdelivr.net/npm/vue/dist/vue.min.js\"\u003e\u003c/script\u003e\n\u003cscript src=\"https://cdn.jsdelivr.net/npm/socket.io-client/dist/socket.io.slim.js\"\u003e\u003c/script\u003e\n\u003cscript src=\"https://cdn.jsdelivr.net/npm/vue-socket.io-extended\"\u003e\u003c/script\u003e\n\u003cscript\u003e\n  var socket = io('http://socketserver.com:1923');\n  Vue.use(VueSocketIOExt, socket);\n\u003c/script\u003e\n```\n\n## :rocket: Usage\n\n#### On Vue.js component\n\nDefine your listeners under `sockets` section, and they will listen corresponding `socket.io` events automatically.\n\n```js\nnew Vue({\n  sockets: {\n    connect() {\n      console.log('socket connected')\n    },\n    customEmit(val) {\n      console.log('this method was fired by the socket server. eg: io.emit(\"customEmit\", data)')\n    }\n  },\n  methods: {\n    clickButton(val) {\n      // this.$socket.client is `socket.io-client` instance\n      this.$socket.client.emit('emit_method', val);\n    }\n  }\n})\n```\n\n**Note**: Don't use arrow functions for methods or listeners if you are going to emit `socket.io` events inside. You will end up with using incorrect `this`. More info about this [here](https://github.com/probil/vue-socket.io-extended/issues/61)\n\n#### Dynamic socket event listeners (changed in v4)\n\nThere is a way to create listeners dynamically, in case you need to start listening only on some condition.\n```js\n// creating event listener\nthis.$socket.$subscribe('event_name', payload =\u003e {\n  console.log(payload)\n});\n\n// removing existing listener\nthis.$socket.$unsubscribe('event_name');\n```\nAs an alternative, feel free to attach events directly to socket.io client, but keep in mind that you'd need to pass the same function to `.off(event_name, fn)` that you passed to `.on(event_name, fn)` in order to unsubscribe properly. Otherwise, [it won't work as you expect](https://github.com/probil/vue-socket.io-extended/issues/431#issuecomment-714377402).\n```js\nexport default {\n  methods: {\n    onEventName(params) {\n      console.log('`eventName` has fired with:', params)\n    },\n  },\n  mounted() {\n    // subscribe\n    this.$socket.client.on('eventName', this.onEventName) // \u003c-- this.onEventName here\n  },\n  beforeDestroy() {\n    // unsubscribe\n    this.$socket.client.off('eventName', this.onEventName) // \u003c-- this.onEventName here\n  },\n}\n```\n\n**Important**: Every dynamic subscription should have appropriate unsubscription. Or else, you'd experience [an event firing multiple times](https://github.com/probil/vue-socket.io-extended/issues/518). Moreover, unsubscribed leftovers might cause memory leaks.\n\n#### Reactive properties (new in v4)\n`$socket.connected` and `$socket.diconnected` are reactive. That means you can use them in expressions\n```vue\n\u003ctemplate\u003e\n  \u003cdiv\u003e\n    \u003cspan\u003e{{ $socket.connected ? 'Connected' : 'Disconnected' }}\u003c/span\u003e\n  \u003c/div\u003e\n\u003c/template\u003e\n```\nOr conditions\n```vue\n\u003ctemplate\u003e\n  \u003cspan\n    class=\"notification\"\n    v-if=\"$socket.disconnected\"\n  \u003e\n    You are disconnected\n  \u003c/span\u003e\n\u003c/template\u003e\n```\nOr computed properties, methods and hooks. Treat them as computed properties that are available in all components\n\n## :evergreen_tree: Vuex Store Integration\n\n#### Setup\n\nTo set up Vuex integration just pass the store as the third argument. In a Vue CLI project, you might do this in the `src/main.js` file. Example:\n\n```js\nimport VueSocketIOExt from 'vue-socket.io-extended';\nimport { io } from 'socket.io-client';\nimport store from './store'\n\nconst socket = io('http://socketserver.com:1923');\n\nVue.use(VueSocketIOExt, socket, { store });\n```\n\n#### Receiving Events\n\nMutations and actions will be dispatched or committed automatically in the Vuex store when a socket event arrives.  A mutation or action must follow the naming convention below to recognize and handle a socket event.\n\n* A **mutation** should start with `SOCKET_` prefix and continue with an uppercase version of the event\n* An **action** should start with `socket_` prefix and continue with camelcase version of the event\n\n| Server Event | Mutation | Action\n| --- | --- | --- |\n| `chat message` | `SOCKET_CHAT MESSAGE` | `socket_chatMessage` |\n| `chat_message` | `SOCKET_CHAT_MESSAGE` | `socket_chatMessage` |\n| `chatMessage`  | `SOCKET_CHATMESSAGE`  | `socket_chatMessage` |\n| `CHAT_MESSAGE` | `SOCKET_CHAT_MESSAGE` | `socket_chatMessage` |\n\nCheck the [Configuration](#gear-configuration) section if you'd like to use a custom transformation.\n\nCheck the [Migration from VueSocketIO](#information_source-migration-from-vuesocketio) section if you want to keep actions names in UPPER_CASE.\n\n```js\n// In this example we have a socket.io server that sends message ID when it arrives\n// so to get entire body of the message we need to make AJAX call the server\nimport Vue from 'vue'\nimport Vuex from 'vuex'\n\n// `MessagesAPI.downloadMessageById` is an async function (goes to backend through REST Api and fetches all message data)\nimport MessagesAPI from './api/message'\n\nVue.use(Vuex);\n\nexport default new Vuex.Store({\n  state: {\n    // we store messages as a dictionary for easier access and interaction\n    // @see https://hackernoon.com/shape-your-redux-store-like-your-database-98faa4754fd5\n    messages: {},\n    messagesOrder: []\n  },\n  mutations: {\n    NEW_MESSAGE(state, message) {\n      state.messages[message.id] = message;\n      state.messagesOrder.push(message.id);\n    }\n  },\n  actions: {\n    socket_userMessage ({ dispatch, commit }, messageId) { // \u003c-- this action is triggered when `user_message` is emmited on the server\n      return MessagesAPI.downloadMessageById(messageId).then((message) =\u003e {\n       commit('NEW_MESSAGE', message);\n      })\n    }\n  }\n})\n```\n\n#### Emitting Events\n\nEvents can be sent to the Socket.IO server by calling `this._vm.$socket.client.emit` from a Vuex mutation or action. Mutation or action names are not subject to the same naming requirements as above. More then one argument can be included. [All serializable data structures are supported](https://socket.io/docs/client-api/#socket-emit-eventName-%E2%80%A6args-ack), including Buffer.\n\n```js\n  actions: {\n    emitSocketEvent(data) {\n      this._vm.$socket.client.emit('eventName', data);\n      this._vm.$socket.client.emit('with-binary', 1, '2', { 3: '4', 5: new Buffer(6) });\n    }\n  }\n```\n\n#### Namespaced Vuex Modules\n\nNamespaced modules are supported out-of-the-box. Any appropriately-named mutation or action should work regardless of whether it's in a module or in the main Vuex store.\n\n```js\nimport Vue from 'vue'\nimport Vuex from 'vuex'\n\nVue.use(Vuex);\n\nconst messages = {\n  state: {\n    messages: []\n  },\n  mutations: {\n    SOCKET_CHAT_MESSAGE(state, message) {\n      state.messages.push(message);\n    }\n  },\n  actions: {\n    socket_chatMessage() {\n      console.log('this action will be called');\n    }\n  },\n};\n\nconst notifications = {\n  state: {\n    notifications: []\n  },\n  mutations: {\n    SOCKET_CHAT_MESSAGE(state, message) {\n      state.notifications.push({ type: 'message', payload: message });\n    }\n  },\n};\n\nexport default new Vuex.Store({\n  modules: {\n    messages,\n    notifications,\n  }\n})\n```\nThe above code will:\n* Commit the `SOCKET_CHAT_MESSAGE` mutation in the `messages` module\n* Commit the `SOCKET_CHAT_MESSAGE` mutation in the `notification` module\n* Dispatch the `socket_chatMessage` action in the `messages` module\n\n## :bamboo: ECMAScript / TypeScript decorator (added in v4)\n\n**Required**: [ECMAScript stage 1 decorators](https://github.com/wycats/javascript-decorators/blob/master/README.md).\nIf you use Babel, [babel-plugin-transform-decorators-legacy](https://github.com/loganfsmyth/babel-plugin-transform-decorators-legacy) is needed.\nIf you use TypeScript, enable `--experimentalDecorators` flag.\n\n\u003e It does not support the stage 2 decorators yet since mainstream transpilers still transpile to the old decorators.\n\nWe provide `@Socket()` decorator for users of [class-style Vue components](https://github.com/vuejs/vue-class-component). By default, `@Socket()` decorator listens the same event as decorated method name but you can use custom name by passing a string inside decorator e.g. `@Socket('custom_event')`.\n\nCheck the example below:\n\n```vue\n\u003c!-- App.vue --\u003e\n\u003cscript\u003e\nimport Vue from 'vue'\nimport Component from 'vue-class-component'\nimport { Socket } from 'vue-socket.io-extended'\n\n@Component({})\nexport default class App extends Vue {\n  @Socket() // --\u003e listens to the event by method name, e.g. `connect`\n  connect () {\n    console.log('connection established');\n  }\n\n  @Socket('tweet')  // --\u003e listens to the event with given name, e.g. `tweet`\n  onTweet (tweetInfo) {\n    // do something with `tweetInfo`\n  }\n}\n\u003c/script\u003e\n```\n\n## :mountain_bicyclist: Usage with Nuxt.js\n\u003e The key point here is to disable SSR for the plugin as it will crash otherwise. It's a well-know issue and we are going to fix it. Thanks [@ll931217](https://github.com/ll931217) for investigation.\n\n**1. Create plugin**:\n```js\n// ~/plugins/socket.io.js\nimport Vue from 'vue';\nimport { io } from 'socket.io-client';\nimport VueSocketIOExt from 'vue-socket.io-extended';\n\nconst socket = io('http://localhost:3000');\n\nexport default ({ store }) =\u003e {\n  Vue.use(VueSocketIOExt, socket, { store });\n}\n```\n\n**2. Then register it**:\n\n```js\n// nuxt.config.js\nmodule.exports = {\n  //...,\n  plugins: [\n    //...,\n    {\n      src: '~/plugins/socket.io.js',\n      ssr: false,                    // \u003c-- this line is required\n    },\n  ]\n}\n```\n\n## :mountain_bicyclist: Usage with Quasar Framework\n\u003e Register vue-socket.io-extended with a boot file and disable server side rendering\n\n**1. Create bootfile**:\n```js\n// ~/boot/socket.io.js\nimport { io } from 'socket.io-client';\nimport VueSocketIOExt from 'vue-socket.io-extended';\n\nconst socket = io('http://localhost:3000');\n\nexport default async ({ store, Vue }) =\u003e {\n  Vue.use(VueSocketIOExt, socket, { store })\n}\n```\n\n**2. Then register it**:\n\n```js\n// quasar.conf.js\nmodule.exports = function (ctx) {\n  return {\n    //...,\n    boot: [\n      //...,\n      {\n        path: 'socket.io',\n        server: false,\n      },\n    ]\n  }\n};\n```\n\n## :gear: Configuration\n\nIn addition to store instance, `vue-socket.io-extended` accepts other options.\nHere they are:\n\n| Option | Type | Default | Description |\n| ---- | ---- | ------- | ------- |\n| `store` | `Object` | `undefined` | Vuex store instance, enables vuex integration |\n| `actionPrefix` | `String` | `'socket_'` | Prepend to event name while converting event to action. Empty string disables prefixing |\n| `mutationPrefix` | `String` | `'SOCKET_'` | Prepend to event name while converting event to mutation. Empty string disables prefixing |\n| `eventToMutationTransformer` | `Function` `string =\u003e string` | uppercase function | Determines how event name converted to mutation |\n| `eventToActionTransformer` | `Function` `string =\u003e string` | camelcase function | Determines how event name converted to action |\n| eventMapping | `Function` `socket =\u003e string` | | Map your event from socket event data\n\n*FYI:* You can always access default plugin options if you need it (e.g. re-use default `eventToActionTransformer` function):\n\n```js\nimport VueSocketIOExt from 'vue-socket.io-extended';\nVueSocketIOExt.defaults // -\u003e { actionPrefix: '...', mutationPrefix: '...', ... }\n```\n\n## :information_source: Migration from VueSocketIO\n\nFor everyone who has migrated from old package VueSocketIO to this new one on existing project.\nYou need to re-define 2 parameters, in order to use existing store actions without changes (e.g. `SOCKET_EVENT_NAME`).\n\n```js\nimport VueSocketIO from 'vue-socket.io-extended';\nimport { io } from 'socket.io-client';\n\nconst ioInstance = io('https://hostname/path', {\n  reconnection: true,\n  reconnectionDelay: 500,\n  maxReconnectionAttempts: Infinity\n});\n\nVue.use(VueSocketIO, ioInstance, {\n  store, // vuex store instance\n  actionPrefix: 'SOCKET_', // (1) keep prefix in uppercase\n  eventToActionTransformer: (actionName) =\u003e actionName // (2) cancel camelcasing\n});\n```\n\n\n## :question: FAQ\n\n- [How to prevent connection until authed?](https://github.com/probil/vue-socket.io-extended/issues/114#issuecomment-405411500)\n\n- [How to receive/emit event from server to the particular user?](https://github.com/probil/vue-socket.io-extended/issues/71#issuecomment-390820203) (check also [this](https://gitter.im/vue-socket-io-extended/Lobby?at=5bbc9973ef4afc4f2842d0bc))\n\n- [How access this.$socket from Vuex actions?](https://github.com/probil/vue-socket.io-extended/issues/91#issuecomment-397232621)\n\n- [My mutation is triggered two times?](https://github.com/probil/vue-socket.io-extended/issues/185)\n\n- [Mutations and actions are not fired while using Quasar](https://github.com/probil/vue-socket.io-extended/issues/384#issuecomment-517736400)\n\n## :anchor: Semantic Versioning Policy\n\nThis plugin follows [semantic versioning](http://semver.org/).\n\n## :newspaper: Changelog\n\nWe're using [GitHub Releases](https://github.com/probil/vue-socket.io-extended/releases).\n\n## :beers: Contribution\n\nWe're more than happy to see potential contributions, so don't hesitate. If you have any suggestions, ideas or problems feel free to add new [issue](https://github.com/probil/vue-socket.io-extended/issues/new), but first please make sure your question does not repeat previous ones.\n\n## :lock: License\n\nSee the [LICENSE](LICENSE) file for license rights and limitations (MIT).\n\n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fprobil%2Fvue-socket.io-extended.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fprobil%2Fvue-socket.io-extended?ref=badge_large)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprobil%2Fvue-socket.io-extended","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fprobil%2Fvue-socket.io-extended","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprobil%2Fvue-socket.io-extended/lists"}