real time
Fernando Daciuk
FullStack Engineer
npm install fdaciuk
zimp.me
github.com/wpbrasil/odin
da2k.com.br
JAVASCRIPT
NINJA
eventick.com.br/curso-javascript-ninja
What is
real time?real time?
What is
Process that automates
updating data
Give me
examples!
Data needs to be
updated...
interaction!
without user
interaction!
without user
1. fast
2. self-updating
How to
do that?
How to
do that?
pooling
Are we
there yet?
function update() {
$.get('/api/product/123')
.done(function(data) {
$('#price').text(data.price);
setTimeout(update, 15000);
});
}
pooling
function update() {
$.get('/api/product/123')
.done(function(data) {
$('#price').text(data.price);
setTimeout(update, 15000);
});
}
function
create update
function update() {
$.get('/api/product/123')
.done(function(data) {
$('#price').text(data.price);
setTimeout(update, 15000);
});
}
make an
ajax request
function update() {
$.get('/api/product/123')
.done(function(data) {
$('#price').text(data.price);
setTimeout(update, 15000);
});
}
update price and
run again after 15s
1. fast
2. self-updating
so fast!
It is not
so fast!
It is not
Client requests
server
00:00 - GET /api/product/123
Server responds
to client
00:02 - RESPONSE {
price: 100
}
Server changes data
after 3s
00:05 - {
price: 120
}
Client waits 15s
before request again
00:17 - GET /api/product/123
What is the
better way?
What is the
sockets
web
the data...
Server sends
like
The information
magic!
appears...
Are you
ready?
Are you
ready?
But, how does
it work?
That sounds good!
CLIENT
SIDE
.emit()
stream
tweet
socket.io-playground
github.com/fdaciuk
npmjs.org/package/node-tweet-stream
var config = require('./config.json');
var app = require('express')();
var serveStatic = require('serve-static');
var server = require('http').Server(app);
var io = require('socket.io')(server);
var tw = require('node-tweet-stream')(config);
app.js
add
dependencies
var config = require('./config.json');
var app = require('express')();
var serveStatic = require('serve-static');
var server = require('http').Server(app);
var io = require('socket.io')(server);
var tw = require('node-tweet-stream')(config);
app.js
add
dependencies
{
"consumer_key": "CONSUMER_KEY",
"consumer_secret": "CONSUMER_SECRET",
"token": "TOKEN",
"token_secret": "TOKEN_SECRET"
}
config.json
var config = require('./config.json');
var app = require('express')();
var serveStatic = require('serve-static');
var server = require('http').Server(app);
var io = require('socket.io')(server);
var tw = require('node-tweet-stream')(config);
app.js
add
dependencies
var config = require('./config.json');
var app = require('express')();
var serveStatic = require('serve-static');
var server = require('http').Server(app);
var io = require('socket.io')(server);
var tw = require('node-tweet-stream')(config);
app.js
add
dependencies
app.use(serveStatic(__dirname + '/public'));
app.get('/', function(req, res) {
res.sendFile(__dirname + '/public/index.html');
});
server.listen(3000);
app.js
Create
local server
io.on('connection', function(socket) {
console.log('socket.io connected!');
tw.track('wordcampsp');
tw.on('tweet', function(tweet) {
socket.emit('tweet', tweet);
});
});
app.js
socket.io
configuration
io.on('connection', function(socket) {
console.log('socket.io connected!');
tw.track('wordcampsp');
tw.on('tweet', function(tweet) {
socket.emit('tweet', tweet);
});
});
app.js
socket.io
configuration
io.on('connection', function(socket) {
console.log('socket.io connected!');
tw.track('wordcampsp');
tw.on('tweet', function(tweet) {
socket.emit('tweet', tweet);
});
});
app.js
socket.io
configuration
io.on('connection', function(socket) {
console.log('socket.io connected!');
tw.track('wordcampsp');
tw.on('tweet', function(tweet) {
socket.emit('tweet', tweet);
});
});
app.js
socket.io
configuration
io.on('connection', function(socket) {
console.log('socket.io connected!');
tw.track('wordcampsp');
tw.on('tweet', function(tweet) {
socket.emit('tweet', tweet);
});
});
app.js
socket.io
configuration
io.on('connection', function(socket) {
console.log('socket.io connected!');
tw.track('wordcampsp');
tw.on('tweet', function(tweet) {
socket.emit('tweet', tweet);
});
});
app.js
socket.io
configuration
<!DOCTYPE html>
<html>
...
<body>
<ul data-js="tweets"></ul>
<script src="/socket.io/socket.io.js"></script>
<script src="js/main.js"></script>
</body>
</html>
public/index.html
<!DOCTYPE html>
<html>
...
<body>
<ul data-js="tweets"></ul>
<script src="/socket.io/socket.io.js"></script>
<script src="js/main.js"></script>
</body>
</html>
public/index.html
<!DOCTYPE html>
<html>
...
<body>
<ul data-js="tweets"></ul>
<script src="/socket.io/socket.io.js"></script>
<script src="js/main.js"></script>
</body>
</html>
public/index.html
var socket = io('http://localhost:3000');
var $tweets = document.querySelector('[data-js="tweets"]');
socket.on('tweet', function(data) {
$tweets.innerHTML += '<li>' + data.text + '<li>';
});
public/js/main.js
var socket = io('http://localhost:3000');
var $tweets = document.querySelector('[data-js="tweets"]');
socket.on('tweet', function(data) {
$tweets.innerHTML += '<li>' + data.text + '<li>';
});
public/js/main.js
var socket = io('http://localhost:3000');
var $tweets = document.querySelector('[data-js="tweets"]');
socket.on('tweet', function(data) {
$tweets.innerHTML += '<li>' + data.text + '<li>';
});
public/js/main.js
var socket = io('http://localhost:3000');
var $tweets = document.querySelector('[data-js="tweets"]');
socket.on('tweet', function(data) {
$tweets.innerHTML += '<li>' + data.text + '<li>';
});
public/js/main.js
var socket = io('http://localhost:3000');
var $tweets = document.querySelector('[data-js="tweets"]');
socket.on('tweet', function(data) {
$tweets.innerHTML += '<li>' + data.text + '<li>';
});
public/js/main.js
?
!
socket.io-emitter
socket.io-redis
CLIENT
SIDE
emit()
+ socket.io-emitter
socket.io-redis
Installing
dependencies
{
"require": {
"rase/socket.io-emitter": "^0.7.0"
}
}
composer.json
composer require rase/socket.io-emitter
terminal
Install “redis-server”
on your operating system
Now, we need a simple
NodeJS Application
var io = require('socket.io')(3000);
io.adapter(require('socket.io-redis')());
io.on('connection', function() {
console.log('Connected!');
});
app.js
PHP can’t emit
events to client
var io = require('socket.io')(3000);
io.adapter(require('socket.io-redis')());
io.on('connection', function() {
console.log('Connected!');
});
app.js
require_once './vendor/autoload.php';
$id = get_the_ID();
$views = (int) get_post_meta( $id, 'views', true );
$views++;
update_post_meta( $id, 'views', $views );
$emitter = new SocketIOEmitter();
$emitter->emit( 'post views', $id, $views );
echo $views;
single.php
require_once './vendor/autoload.php';
$id = get_the_ID();
$views = (int) get_post_meta( $id, 'views', true );
$views++;
update_post_meta( $id, 'views', $views );
$emitter = new SocketIOEmitter();
$emitter->emit( 'post views', $id, $views );
echo $views;
single.php
require_once './vendor/autoload.php';
$id = get_the_ID();
$views = (int) get_post_meta( $id, 'views', true );
$views++;
update_post_meta( $id, 'views', $views );
$emitter = new SocketIOEmitter();
$emitter->emit( 'post views', $id, $views );
echo $views;
single.php
require_once './vendor/autoload.php';
$id = get_the_ID();
$views = (int) get_post_meta( $id, 'views', true );
$views++;
update_post_meta( $id, 'views', $views );
$emitter = new SocketIOEmitter();
$emitter->emit( 'post views', $id, $views );
echo $views;
single.php
require_once './vendor/autoload.php';
$id = get_the_ID();
$views = (int) get_post_meta( $id, 'views', true );
$views++;
update_post_meta( $id, 'views', $views );
$emitter = new SocketIOEmitter();
$emitter->emit( 'post views', $id, $views );
echo $views;
single.php
require_once './vendor/autoload.php';
$id = get_the_ID();
$views = (int) get_post_meta( $id, 'views', true );
$views++;
update_post_meta( $id, 'views', $views );
$emitter = new SocketIOEmitter();
$emitter->emit( 'post views', $id, $views );
echo $views;
single.php
var socket = io('http://localhost:3000');
socket.on('post views', function(id, views) {
$('#post-' + id).text(views);
});
main.js
var socket = io('http://localhost:3000');
socket.on('post views', function(id, views) {
$('#post-' + id).text(views);
});
main.js
var socket = io('http://localhost:3000');
socket.on('post views', function(id, views) {
$('#post-' + id).text(views);
});
main.js
var socket = io('http://localhost:3000');
socket.on('post views', function(id, views) {
$('#post-' + id).text(views);
});
main.js
var socket = io('http://localhost:3000');
socket.on('post views', function(id, views) {
$('#post-' + id).text(views);
});
main.js
the box!
Think outside
the box!
Think outside
Fernando Daciuk
FullStack Engineer
Thanks!
/fdaciuk/talks npm install fdaciuk

WordPress Realtime - WordCamp São Paulo 2015