Skip to content

Commit 864316e

Browse files
author
Gabe Fiji
committed
Inline worker. Updated docs
1 parent 05ab1d8 commit 864316e

16 files changed

Lines changed: 747 additions & 133 deletions

README.md

Lines changed: 47 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -38,26 +38,16 @@ Connection Manager `io.Manager` is not yet supported
3838

3939
```js
4040
var ws = wio('http://localhost:8000/')
41-
ws.useWorker('shared-worker.js')
41+
ws.start() // use default SharedWorker script URL
4242

43-
ws.on('connect', function() {
43+
// same as socket.io-client api: https://github.com/socketio/socket.io-client
44+
ws.on('connect', () => {
4445
console.log('connected!')
45-
46-
ws.on('message', function (data) {
47-
console.log('message', data)
48-
})
49-
5046
ws.emit('message', 'Hi There!')
5147
})
52-
53-
ws.on('disconnect', function() {
54-
console.log('disconnected!')
55-
})
56-
57-
ws.on('error', function (data) {
58-
console.log('error', data)
59-
})
60-
48+
ws.on('message', data => console.log('received message', data))
49+
ws.on('disconnect', () => console.log('disconnected!'))
50+
ws.on('error', data => console.log('error', data))
6151
```
6252

6353
## Install
@@ -68,41 +58,68 @@ Install locally using npm. (Alternatively clone the repo and look at `index.html
6858
npm install --save socketio-shared-webworker
6959
```
7060

71-
To use in your nodejs project:
72-
73-
First make sure `node_modules/socketio-shared-webworker/dist/shared-worker.js` is served by your server.
74-
As an example see `server.js` for an example `express` and `socket.io` server serving `dist/shared-worker.js` as `shared-worker.js` via `express.static`.
75-
76-
You can also copy `dist/shared-worker.js` into your `public/` directory and serve that with `app.use(express.static('./public'))`.
61+
### To use in your nodejs project:
7762

7863
```js
7964
var wio = require('socketio-shared-webworker')
8065
var ws = wio('http://localhost:8000/')
81-
ws.useWorker('node_modules/socketio-shared-webworker/dist/shared-worker.js') // or just shared-worker.js if placed in public/
66+
ws.start() // use default SharedWorker script URL
67+
68+
// same as socket.io-client
8269
ws.on('connect', () => {
8370
console.log('connected!')
8471
ws.emit('message', 'Hi There!')
8572
})
73+
8674
ws.on('message', data => console.log('received message', data))
8775
ws.on('disconnect', () => console.log('disconnected!'))
8876
ws.on('error', data => console.log('error', data))
8977
```
9078

91-
Or to use in HTML `wio` is global.
79+
### To use in HTML `wio` is global.
9280

9381
```html
9482
<script src="socket.io-worker.js"></script>
9583
<script>
9684
var ws = wio('http://localhost:8000/')
97-
ws.useWorker('node_modules/socketio-shared-webworker/dist/shared-worker.js')
98-
// use wio like io
85+
ws.start() // use default SharedWorker script URL
86+
87+
// same as socket.io-client
88+
ws.on('connect', () => {
89+
console.log('connected!')
90+
ws.emit('message', 'Hi There!')
91+
})
92+
ws.on('message', data => console.log('received message', data))
93+
ws.on('disconnect', () => console.log('disconnected!'))
94+
ws.on('error', data => console.log('error', data))
9995
</script>
96+
```
97+
98+
## Using a specific `SharedWorker` script
99+
100+
When using `ws.start()` the default worker located in `build/shared-worker-inline.js` is used. This worker is served inline using `URL.createObjectURL()` instead of being served over HTTP. This is limited to `Worker` and `SharedWorker` since `ServiceWorker` requires the same domain. (`ServiceWorker` is not yet supported)
100101

102+
In order to specify the Worker script URL manually use:
103+
104+
```
105+
ws.useWorker('http/same/domain/url/to/shared-worker.js')
101106
```
102107

103-
Note: `ws.useWorker('node_modules/socketio-shared-webworker/shared-worker.js')` should point to the shared-worker.js url relative to your HTML page base URL. Shared webworkers can only be loaded from the same domain like CORS.
108+
Note: `ws.useWorker('shared-worker.js')` should point to the `shared-worker.js` url relative to your HTML page base URL.
109+
Shared webworkers can only be loaded from the same domain similar to CORS.
110+
When installed into a project with `npm i socketio-shared-webworker` you will find the script in: `node_modules/socketio-shared-webworker/build/shared-worker.js`
111+
112+
You may copy `dist/shared-worker.js` to your `public/` directory and serve using `express.static`.
113+
An example of this is found in `server.js`.
114+
You can also serve it as a regular JS file with Apache, Nginx etc.
115+
116+
```js
117+
var wio = require('socketio-shared-webworker')
118+
var ws = wio('http://localhost:8000/')
119+
ws.useWorker('shared-worker.js') // use a specific SharedWorker script URL
120+
// same as socket.io-client
121+
```
104122

105-
See `index.html` for an example.
106123

107124
### Using a Worker instead of SharedWorker
108125

@@ -113,7 +130,8 @@ If you want to specify using `Worker` specifically then use:
113130
var wio = require('socketio-shared-webworker')
114131
var ws = wio('http://localhost:8000/')
115132
ws.setWorkerType(Worker)
116-
ws.useWorker('node_modules/socketio-shared-webworker/dist/shared-worker.js')
133+
ws.start()
134+
// same as socket.io-client
117135
```
118136

119137
At the moment only `SharedWorker` and `Worker` are supported. `ServiceWorker` is not.

dist/shared-worker-inline.js

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
'use strict';
2+
3+
const SharedWorker = () => {
4+
const log = console.log.bind(console)
5+
6+
log('Loading shared worker', self.name)
7+
8+
try {
9+
importScripts(self.name + 'socket.io/socket.io.js')
10+
} catch(e) {
11+
window.io = require('socket.io-client')
12+
}
13+
14+
let socket = io(self.name),
15+
ports = [],
16+
socketConnected = false
17+
18+
// handle shared webworker clients already with ports
19+
socket.on('connect', function(msg) {
20+
socketConnected = true
21+
ports.forEach(function(port) {
22+
port.postMessage({
23+
type: 'connect',
24+
message: msg
25+
})
26+
})
27+
})
28+
socket.on('disconnect', function(msg) {
29+
socketConnected = false
30+
ports.forEach(function(port) {
31+
port.postMessage({
32+
type: 'disconnect',
33+
message: msg
34+
})
35+
})
36+
})
37+
38+
// shared worker handle new clients
39+
addEventListener('connect', function(event) {
40+
const port = event.ports[0]
41+
ports.push(port)
42+
port.start()
43+
44+
log('client connected to shared worker', event)
45+
46+
port.addEventListener('message', event => handleMessage(event, port))
47+
})
48+
49+
// regular worker handle messages
50+
addEventListener('message', event => handleMessage(event, self))
51+
if (typeof Worker !== 'undefined') {
52+
setTimeout(() => postMessage({
53+
type: 'connect',
54+
message: null
55+
}))
56+
}
57+
58+
// handle messages
59+
function handleMessage(event, port) {
60+
61+
const model = event.data
62+
log('port received message', model.eventType, model.event, model.data)
63+
switch(model.eventType) {
64+
case 'on':
65+
const eventName = model.event
66+
if (eventName == 'connect') {
67+
if (socketConnected) {
68+
port.postMessage({
69+
type: eventName
70+
})
71+
}
72+
break;
73+
}
74+
if (eventName == 'disconnect') {
75+
break;
76+
}
77+
socket.on(eventName, function(msg) {
78+
log('socket received message', msg)
79+
port.postMessage({
80+
type: eventName,
81+
message: msg
82+
})
83+
})
84+
break;
85+
case 'emit':
86+
socket.emit(model.event, model.data) // todo: ack cb
87+
break;
88+
}
89+
90+
}
91+
}
92+
93+
if (typeof window === 'object') {
94+
window.SocketIoSharedWorker = SharedWorker
95+
}
96+
97+
if (typeof module === 'object') {
98+
module.exports = SharedWorker
99+
} else {
100+
SharedWorker()
101+
}

dist/shared-worker.js

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/shared-worker.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/socket.io-worker.js

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/socket.io-worker.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/socket.io.js

Lines changed: 2 additions & 15 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/socket.io.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

example/app.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,9 @@
33
const wio = require('../src/socket.io-worker')
44

55
const ws = wio('http://localhost:3000/')
6-
const workerType = confirm('Use SharedWorker? (Will use Worker if no)') ? SharedWorker : Worker
7-
8-
ws.setWorkerType(workerType)
9-
ws.useWorker('dist/shared-worker.js')
6+
//const workerType = confirm('Use SharedWorker? (Will use Worker if no)') ? SharedWorker : Worker
7+
//ws.setWorkerType(workerType)
8+
ws.start()
109
console.log('connecting...')
1110

1211
ws.on('connect', function() {

example/webpack.config.js

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
var path = require('path');
2-
var webpack = require('webpack');
1+
const path = require('path');
2+
const webpack = require('webpack');
3+
const CopyPlugin = require('copy-webpack-plugin');
34

45
module.exports = {
56
mode: 'development',
@@ -34,12 +35,21 @@ module.exports = {
3435
}
3536
},
3637
plugins: [
37-
new webpack.HotModuleReplacementPlugin()
38+
new webpack.HotModuleReplacementPlugin(),
39+
new CopyPlugin({
40+
patterns: [
41+
{
42+
from: 'src/shared-worker.js',
43+
to: 'dist/shared-worker-inline.js'
44+
}
45+
],
46+
}),
3847
],
3948
module: {
49+
noParse: /\/dist\/.*/,
4050
rules: [{
4151
test: /\.m?js$/,
42-
exclude: /(node_modules|bower_components)/,
52+
exclude: /(node_modules|bower_components|dist)/,
4353
use: {
4454
loader: 'babel-loader',
4555
options: {

0 commit comments

Comments
 (0)