Skip to content

Commit 8e0100b

Browse files
author
metinseylan
committed
2.1.0
1 parent c7491fc commit 8e0100b

8 files changed

+140
-83
lines changed

README.md

100644100755
+67-23
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,39 @@
11
# Vue-Socket.io
2-
socket.io implemantation for Vuejs 2.0 and 1.0
32

4-
## Install
3+
[![NPM version](https://img.shields.io/npm/v/vue-socket.io.svg)](https://www.npmjs.com/package/vue-socket.io)
4+
![VueJS v2 compatible](https://img.shields.io/badge/Vuejs%202-compatible-green.svg)
5+
<a href="https://www.npmjs.com/package/vue-socket.io"><img src="https://img.shields.io/npm/dt/vue-socket.io.svg" alt="Downloads"></a>
6+
<img id="dependency_badge" src="https://www.versioneye.com/javascript/metinseylan:vue-socket.io/2.0.1/badge.svg" alt="Dependency Badge" rel="nofollow">
7+
<a href="https://www.npmjs.com/package/vue-socket.io"><img src="https://img.shields.io/npm/l/vue-socket.io.svg" alt="License"></a>
58

6-
``` bash
7-
npm install vue-socket.io --save
8-
```
9-
for Vue 1.0
9+
socket.io implemantation for Vuejs 2 and Vuex
1010

11-
``` bash
12-
npm install vue-socket.io@1.0.2 --save
13-
```
11+
## Install
1412

15-
## Usage
13+
``` bash
14+
npm install vue-socket.io --save
15+
```
1616

17+
## Usage
18+
##### Configration
19+
Automaticly socket connect from url string
1720
``` js
18-
import Vue from 'vue';
19-
import VueSocketio from 'vue-socket.io';
20-
21-
Vue.use(VueSocketio, 'http://socketserver.com:1923'); // Automaticly socket connect from url string
22-
23-
/*
24-
import socketio from 'socket.io-client';
21+
Vue.use(VueSocketio, 'http://socketserver.com:1923');
22+
```
2523

26-
var ioInstance = socketio('http://socketserver.com:1923');
24+
Bind custom socket.io-client instance
25+
``` js
26+
Vue.use(VueSocketio, socketio('http://socketserver.com:1923'));
27+
```
2728

28-
Vue.use(VueSocketio, ioInstance); // bind custom socketio instance
29-
*/
29+
Enable Vuex integration
30+
``` js
31+
import store from './yourstore'
32+
Vue.use(VueSocketio, socketio('http://socketserver.com:1923'), store);
33+
```
3034

35+
##### On Vuejs instance usage
36+
``` js
3137
var vm = new Vue({
3238
sockets:{
3339
connect: function(){
@@ -46,10 +52,48 @@ var vm = new Vue({
4652
})
4753
```
4854

55+
##### Dynamic socket event listenlers
56+
Create new listenler
57+
``` js
58+
this.$options.sockets.event_name = (data) => {
59+
console.log(data)
60+
}
61+
```
62+
Remove exist listenler
63+
``` js
64+
delete this.$options.sockets.event_name;
65+
```
66+
67+
##### Vuex Store integration
68+
Example store, socket mutations always have "SOCKET_" prefix
69+
``` js
70+
import Vue from 'vue'
71+
import Vuex from 'vuex'
72+
73+
Vue.use(Vuex);
74+
75+
export default new Vuex.Store({
76+
state: {
77+
connect: false,
78+
message: null
79+
},
80+
mutations:{
81+
SOCKET_CONNECT: (state, status ) => {
82+
state.connect = true;
83+
},
84+
SOCKET_USER_MESSAGE: (state, message) => {
85+
state.message = message;
86+
}
87+
},
88+
actions: {
89+
otherAction: ({ commit, dispatch, state }, type) => {
90+
return true;
91+
}
92+
}
93+
})
94+
```
95+
4996
## Example
5097
[Realtime Car Tracker System](http://metinseylan.com/)
5198

5299
[Simple Chat App](http://metinseylan.com/vuesocketio/)
53-
54-
## License
55-
[WTFPL](http://www.wtfpl.net/)

dist/build.js

100644100755
+3-4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/build.js.map

100644100755
+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

100644100755
+10-8
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
{
22
"name": "vue-socket.io",
3-
"version": "2.0.1",
4-
"description": "socket.io implemantation for vuejs",
3+
"version": "2.1.0",
4+
"description": "socket.io implemantation for vuejs and vuex",
55
"main": "dist/build.js",
66
"scripts": {
7-
"build": "cross-env NODE_ENV=production webpack --progress --hide-modules"
7+
"build": "webpack --progress --hide-modules"
88
},
99
"repository": {
1010
"type": "git",
@@ -14,9 +14,13 @@
1414
"vuejs",
1515
"socket",
1616
"vue",
17-
"socket",
1817
"socket.io",
19-
"comolokko"
18+
"websocket",
19+
"socket.io-client",
20+
"realtime",
21+
"flux",
22+
"vuex",
23+
"redux"
2024
],
2125
"author": "Metin Seylan",
2226
"license": "MIT",
@@ -31,8 +35,6 @@
3135
"babel-cli": "^6.11.4",
3236
"babel-loader": "^6.2.5",
3337
"babel-preset-es2015": "^6.3.13",
34-
"babel-preset-stage-0": "^6.3.13",
35-
"cross-env": "^2.0.0",
36-
"webpack": "^1.13.2"
38+
"webpack": "^2.2.0-rc.3"
3739
}
3840
}

src/Emitter.js

100644100755
+1
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,5 @@ export default new class {
4545
}
4646
return false;
4747
}
48+
4849
}

src/Main.js

100644100755
+22-10
Original file line numberDiff line numberDiff line change
@@ -3,38 +3,50 @@ import Emitter from './Emitter'
33

44
export default {
55

6-
install(Vue, connection){
6+
install(Vue, connection, store){
77

88
if(!connection) throw new Error("[Vue-Socket.io] cannot locate connection")
99

10-
let observer = new Observer(connection)
10+
let observer = new Observer(connection, store)
1111

1212
Vue.prototype.$socket = observer.Socket;
1313

1414
Vue.mixin({
1515
beforeCreate(){
16-
let _this = this;
1716
let sockets = this.$options['sockets']
1817

18+
this.$options.sockets = new Proxy({}, {
19+
set: (target, key, value) => {
20+
Emitter.addListener(key, value, this)
21+
target[key] = value
22+
return true;
23+
},
24+
deleteProperty: (target, key) => {
25+
Emitter.removeListener(key, this.$options.sockets[key], this)
26+
delete target.key;
27+
return true
28+
}
29+
})
30+
1931
if(sockets){
20-
Object.keys(sockets).forEach(function(key) {
21-
Emitter.addListener(key, sockets[key], _this)
32+
Object.keys(sockets).forEach((key) => {
33+
this.$options.sockets[key] = sockets[key];
2234
});
2335
}
24-
2536
},
2637
beforeDestroy(){
27-
let _this = this;
2838
let sockets = this.$options['sockets']
2939

3040
if(sockets){
31-
Object.keys(sockets).forEach(function(key) {
32-
Emitter.removeListener(key, sockets[key], _this)
41+
Object.keys(sockets).forEach((key) => {
42+
delete this.$options.sockets[key]
3343
});
3444
}
3545
}
3646
})
3747

3848
}
3949

40-
}
50+
}
51+
52+

src/Observer.js

100644100755
+22-4
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,49 @@ import Socket from 'socket.io-client'
33

44
export default class{
55

6-
constructor(connection) {
6+
constructor(connection, store) {
77

88
if(typeof connection == 'string'){
99
this.Socket = Socket(connection);
1010
}else{
1111
this.Socket = connection
1212
}
1313

14+
if(store) this.store = store;
15+
1416
this.onEvent()
1517

1618
}
1719

1820
onEvent(){
1921
this.Socket.onevent = (packet) => {
20-
Emitter.emit(packet.data[0], packet.data[1])
21-
}
22+
Emitter.emit(packet.data[0], packet.data[1]);
23+
24+
if(this.store) this.commitStore('SOCKET_'+packet.data[0], packet.data[1])
25+
26+
};
2227

2328
let _this = this;
2429

2530
["connect", "error", "disconnect", "reconnect", "reconnect_attempt", "reconnecting", "reconnect_error", "reconnect_failed", "connect_error", "connect_timeout", "connecting", "ping", "pong"]
2631
.forEach((value) => {
2732
_this.Socket.on(value, (data) => {
28-
Emitter.emit(value, data)
33+
Emitter.emit(value, data);
34+
if(_this.store) _this.commitStore('SOCKET_'+value.toUpperCase(), data)
2935
})
3036
})
3137
}
3238

39+
40+
commitStore(type, payload){
41+
42+
if(type.split('_')[0].toUpperCase() === 'SOCKET'){
43+
44+
if(this.store._mutations[type])
45+
this.store.commit(type, payload)
46+
47+
}
48+
49+
}
50+
3351
}

webpack.config.js

100644100755
+14-33
Original file line numberDiff line numberDiff line change
@@ -8,43 +8,24 @@ module.exports = {
88
library: ['VueSocketio'],
99
libraryTarget: 'umd'
1010
},
11-
resolveLoader: {
12-
root: path.join(__dirname, 'node_modules'),
13-
},
11+
devtool: "source-map",
12+
plugins: [
13+
new webpack.optimize.UglifyJsPlugin({
14+
compress: {
15+
warnings: false
16+
}
17+
})
18+
],
1419
module: {
1520
loaders: [
1621
{
1722
test: /\.js$/,
18-
loader: 'babel',
1923
exclude: /node_modules/,
20-
query: {
21-
presets: ['es2015']
22-
}
23-
},
24-
{
25-
test: /\.json$/,
26-
loader: 'json'
24+
loader: 'babel-loader',
25+
query: {
26+
presets: ['es2015']
27+
}
2728
}
2829
]
29-
},
30-
devtool: 'eval-source-map'
31-
}
32-
33-
if (process.env.NODE_ENV === 'production') {
34-
module.exports.devtool = 'source-map'
35-
36-
module.exports.plugins = (module.exports.plugins || []).concat([
37-
new webpack.DefinePlugin({
38-
'process.env': {
39-
NODE_ENV: '"production"'
40-
}
41-
}),
42-
new webpack.optimize.UglifyJsPlugin({
43-
compress: {
44-
warnings: false
45-
}
46-
}),
47-
new webpack.optimize.OccurenceOrderPlugin()
48-
])
49-
}
50-
30+
}
31+
}

0 commit comments

Comments
 (0)