SlideShare ist ein Scribd-Unternehmen logo
1 von 81
Downloaden Sie, um offline zu lesen
TransformingTransformingTransforming
WebSocketsWebSocketsWebSockets
!
3rdEden
"
3rd-Eden
fb
arnout.kazemier
the good partsthe good parts
WebSocketsWebSockets
the good parts
WebSockets
Chrome 20
Firefox 12
Opera 12.1
Safari 6
Internet Explorer 10
Chrome 4
Firefox 4
Opera 11
Safari 4.2
Internet Explorer 10
oh, it’s bi-directional
&
supports binary
oh, it’s bi-directional
&
supports binary
oh, it’s bi-directional
&
supports binary
The EndThe EndThe End
that nobody told youthat nobody told youthat nobody told you
The partsThe partsThe parts
HTTP proxy settings
in your network
settings can cause a
full browser crash.
user agent sniïŹ€
if (!
// Target safari browsers!
$.browser.safari!
!
// Not chrome!
&& !$.browser.chrome!
!
// And correct WebKit version!
&& parseFloat($.browser.version, 0) < 534.54!
) {!
// Don’t use WebSockets!
return;!
}
Writing to a closed WebSocket can
cause a full browser crash
write crash
var ws = new WebSocket("wss://localhost:8080/");!
!
ws.onmessage = function message(event) {!
// Wrap sends in a setTimeout out to allow the!
// readyState to be correctly set to closed. But!
// Only have this delay on mobile devices!
if (mobile) return setTimeout(function () {!
ws.send("Sup Oslo");!
}, 0);!
!
ws.send("Sup Oslo");!
};
Pressing ESC in Firefox closes the
WebSocket connection
connection end
$('body').keydown(function (e) {!
// make sure that you capture the `esc` key and!
// prevent it's default action from happening!
if (e.which === 27) e.preventDefault();!
});
Firefox can create ghost connections
when you connect during
ws.onclose.
Don’t use self signed SSL
certiïŹcates, not for development and
not in production
4G, 3G, LTE, mobile providers WTF
ARE YOU DOING?? — Reverse proxy
Virus scanners such as AVG block
WebSockets.
User, network and server ïŹrewalls
block WebSockets.
Load balancers don't understand and
block WebSockets.
So yeah.. Real-Time is HARD
What if
What if
What if

we could change thiswe could change thiswe could change this
Frameworks!Frameworks!Frameworks!
framework
ws
https://github.com/einaros/ws/
super damned fast
supports binary
cross domain
all the cool kids are doing it
i’m the only somewhat maintainer
no fallbacks or downgrading
broken by ïŹrewalls/virus scanners
only server, no client
module*
framework
socket.io
http://github.com/learnboost/socket.io
multiple transports
cross domain
invested with bugs
poorly / not maintained / left for dead
no message order guarantee
dies behind ïŹrewall/virusscanners
framework
engine.io
http://github.com/learnboost/engine.io
supports multiple transports
cross domain
upgrade instead of downgrade
works behind ïŹrewalls & virusscanners
not well battle tested yet
no message order guarantee
framework
browserchannel
https://github.com/josephg/node-browserchannel
multiple transports
client maintained by google
message order guaranteed
works behind ïŹrewalls & virusscanners
not cross domain
no websocket support
coïŹ€eescript on the server ._.
framework
sockjs
https://github.com/sockjs/sockjs-node/
multiple transports (tons of them)
cross domain
poor error handling
no query string allowed for connect
argh, more coïŹ€eescript
connection delay with ïŹrewalls
poorly maintained
in the way of developers
They all have diïŹ€erent use cases and
API's.
!
Changing product specs == rewrite
we could change this toowe could change this toowe could change this too
What if
What if
What if

npm install primus
Primus wraps and improves popular
real-time frameworks. So you can
focus on building apps.
CommunityCommunityCommunity
community
community
1014
1
5
stars, but growing steady
star it on http://github.com/primus/primus
1014
1 line of code to switch between
excluding adding a framework to your package.json
diïŹ€erent frameworks build-in
socket.io, engine.io, sockjs, websockets, browserchannel, but allows addition third party
5
1014
1
5
community
community
50
31
50
31
50 diïŹ€erent plugins
substream, emit, primus-emitter, primus-cluster, primus-rooms, primus-multiplex, primus-redis
diïŹ€erent authors
damonoehlman, mmalecki, jcrugzz, daïŹ„, balupton, cayasso & many more
31
community
#primus on irc.freenode.net
questions are bugs, ask them in our github issue tracker
why was primus inventedwhy was primus inventedwhy was primus invented
HistoryHistoryHistory
history
real-time layer
for the bigpipe
app framework
history
which had an
engine.io
wrapper
history
no single point
of failure
history
extracted and
released as
!
primus
Use casesUse casesUse cases
use cases
module & framework authors
use cases
startups & web developers
Learning
Primus
Learning
Primus
Learning
Primus
learning primus
cd your-awesome-project!
!
$ npm install --save primus ws!
!
echo "??" !
echo “profit!”!
!
vim index.js
learning primus
'use strict';!
!
var Primus = require("primus")!
, server = require("http").createServer(fn)!
, primus = new Primus(server, { transformer:"ws" });!
!
primus.on("connection", function connection(spark) {!
console.log("connection received", spark.id);!
spark.write("ohai");!
!
spark.on("data", function data(msg) {!
console.log("received", msg);!
});!
});!
!
server.listen(8080);
learning primus
<script src="http://localhost:8080/primus/primus.js"></script>!
<script>!
'use strict';!
!
var primus = new Primus("http://localhost:8080");!
!
primus.on("open", function connected() {!
console.log("connection opened");!
primus.write("ohai");!
});!
!
primus.on("data", function data(msg) {!
console.log(“received", msg);!
});!
</script>
SwitchingSwitchingSwitching
1 line of code
var primus = new Primus(server, { !
transformer: “sockjs" // engine.io, socket.io etc!
});
1 line of code
1 line of code
module.exports = require(“primus/transformer").extend({!
server: function () {!
// This is only exposed and ran on the server.!
},!
!
client: function () {!
// This is stringified end send/stored in the client.!
// Can be ran on the server, if used through Node.js!
},!
!
// Optional library for the front-end, assumes globals!
library: fs.readFileSync(__dirname +"./yourclientlib.js")!
});
StabilityStabilityStability
manual patching
manual patching
Stream CompatibleStream CompatibleStream Compatible
stream compatible
primus.on("end", function disconnected() {!
console.log("connection ended");!
});!
!
primus.end();!
primus.write();!
!
fs.createReadStream(__dirname + '/index.html').pipe(spark, {!
end: false!
});
EncodingEncodingEncoding
message encoding
var primus = new Primus(server, { !
parser: "JSON" // JSON by default!
});
message encoding
var primus = new Primus(server, { !
parser: "EJSON" // or binary-pack or a third party module!
});
message encoding
module.exports = {!
encoder: function (data, fn) {!
// encode data to a string.!
},!
!
decoder: function (data, fn) {!
// decode data to an object!
},!
!
// Optional library for the front-end, assumes globals!
library: fs.readFileSync(__dirname +"./yourclientlib.js")!
};
message encoding
primus.transform('incoming', function (packet) {!
// This would transform all incoming messages to foo;!
packet.data = 'foo';!
});!
!
primus.transform('outgoing', function (packet) {!
// This would transform all outgoing messages to foo;!
packet.data = 'foo';!
});
transforming
ReconnectReconnectReconnect
reconnect
var primus = new Primus("http://localhost:8080", {!
strategy: "disconnect, online"!
});
BroadcastBroadcastBroadcast
broadcast
primus.write("message"); // send message to all users!
!
primus.forEach(function (spark) {!
// Or iterate over all connections, select the once you!
// want and only write to those!
!
spark.write("message");!
});
Node clientNode clientNode client
node.js
var primus = new Primus(server)!
, Socket = primus.Socket;!
!
var client = new Socket(“http://localhost:8080”);!
!
// or if you want to connect to a remote server:!
var primus = require(“primus”).createSocket({/* options */});
PluginsPluginsPlugins
plugins
// The long awaited Socket.IO 1.0 release with Primus:!
!
var server = require("http").createServer(fn)!
, primus = new Primus(server, { transformer:"engine.io" });!
!
primus.use(“emitter","primus-emitter")!
.use(“multiplex”, require(“primus-multiplex”))!
.use(“primus-emitter”, "primus-rooms");
plugins
module.exports = {!
server: function () {!
// This is only exposed and ran on the server.!
},!
!
client: function () {!
// This is stringified end send/stored in the client.!
// Can be ran on the server, if used through Node.js!
},!
!
// Optional library for the front-end, assumes globals!
library: fs.readFileSync(__dirname +"./yourclientlib.js")!
};
and middlewareand middlewareand middleware
PluginsPluginsPlugins
middleware
var server = require("http").createServer(fn)!
, primus = new Primus(server, { transformer:"sockjs" });!
!
primus.before(“session”, require(“session-parse-module”))!
.before(“middleware-name”, "middleware-module-name");
!
3rdEden
"
3rd-Eden
fb
arnout.kazemier
That's it! Thanks & check it out on
http://primus.io
http://primus.io

Weitere Àhnliche Inhalte

Was ist angesagt?

Advances in BeEF - AthCon2012
Advances in BeEF - AthCon2012Advances in BeEF - AthCon2012
Advances in BeEF - AthCon2012
Michele Orru
 
CouchDB Google
CouchDB GoogleCouchDB Google
CouchDB Google
Steve Souders
 
Open Web Device: The first phone running Firefox OS!
Open Web Device: The first phone running Firefox OS!Open Web Device: The first phone running Firefox OS!
Open Web Device: The first phone running Firefox OS!
Francisco Jordano
 
Kettunen, miaubiz fuzzing at scale and in style
Kettunen, miaubiz   fuzzing at scale and in styleKettunen, miaubiz   fuzzing at scale and in style
Kettunen, miaubiz fuzzing at scale and in style
DefconRussia
 
Rails Presentation (Anton Dmitriyev)
Rails Presentation (Anton Dmitriyev)Rails Presentation (Anton Dmitriyev)
Rails Presentation (Anton Dmitriyev)
True-Vision
 
Developing OpenResty Framework
Developing OpenResty FrameworkDeveloping OpenResty Framework
Developing OpenResty Framework
Aapo Talvensaari
 

Was ist angesagt? (20)

Capistrano
CapistranoCapistrano
Capistrano
 
Advances in BeEF - AthCon2012
Advances in BeEF - AthCon2012Advances in BeEF - AthCon2012
Advances in BeEF - AthCon2012
 
CouchDB Google
CouchDB GoogleCouchDB Google
CouchDB Google
 
Cloud forensics putting the bits back together
Cloud forensics putting the bits back togetherCloud forensics putting the bits back together
Cloud forensics putting the bits back together
 
Full-Stack Plone Deployment with Ansible
Full-Stack Plone Deployment with AnsibleFull-Stack Plone Deployment with Ansible
Full-Stack Plone Deployment with Ansible
 
Open Web Device: The first phone running Firefox OS!
Open Web Device: The first phone running Firefox OS!Open Web Device: The first phone running Firefox OS!
Open Web Device: The first phone running Firefox OS!
 
Die .htaccess richtig nutzen
Die .htaccess richtig nutzenDie .htaccess richtig nutzen
Die .htaccess richtig nutzen
 
10x Command Line Fu
10x Command Line Fu10x Command Line Fu
10x Command Line Fu
 
Web sockets in Java
Web sockets in JavaWeb sockets in Java
Web sockets in Java
 
Frontend Performance: Beginner to Expert to Crazy Person
Frontend Performance: Beginner to Expert to Crazy PersonFrontend Performance: Beginner to Expert to Crazy Person
Frontend Performance: Beginner to Expert to Crazy Person
 
Frontend Performance: De débutant à Expert à Fou Furieux
Frontend Performance: De débutant à Expert à Fou FurieuxFrontend Performance: De débutant à Expert à Fou Furieux
Frontend Performance: De débutant à Expert à Fou Furieux
 
Be a microservices hero
Be a microservices heroBe a microservices hero
Be a microservices hero
 
LCA2014 - Introduction to Go
LCA2014 - Introduction to GoLCA2014 - Introduction to Go
LCA2014 - Introduction to Go
 
Frontend Performance: Expert to Crazy Person
Frontend Performance: Expert to Crazy PersonFrontend Performance: Expert to Crazy Person
Frontend Performance: Expert to Crazy Person
 
Ruby in the Browser - RubyConf 2011
Ruby in the Browser - RubyConf 2011Ruby in the Browser - RubyConf 2011
Ruby in the Browser - RubyConf 2011
 
Buildout: How to maintain big app stacks without losing your mind
Buildout: How to maintain big app stacks without losing your mindBuildout: How to maintain big app stacks without losing your mind
Buildout: How to maintain big app stacks without losing your mind
 
Kettunen, miaubiz fuzzing at scale and in style
Kettunen, miaubiz   fuzzing at scale and in styleKettunen, miaubiz   fuzzing at scale and in style
Kettunen, miaubiz fuzzing at scale and in style
 
Rails Presentation (Anton Dmitriyev)
Rails Presentation (Anton Dmitriyev)Rails Presentation (Anton Dmitriyev)
Rails Presentation (Anton Dmitriyev)
 
Rush, a shell that will yield to you
Rush, a shell that will yield to youRush, a shell that will yield to you
Rush, a shell that will yield to you
 
Developing OpenResty Framework
Developing OpenResty FrameworkDeveloping OpenResty Framework
Developing OpenResty Framework
 

Andere mochten auch

Real-time Web Application with Socket.IO, Node.js, and Redis
Real-time Web Application with Socket.IO, Node.js, and RedisReal-time Web Application with Socket.IO, Node.js, and Redis
Real-time Web Application with Socket.IO, Node.js, and Redis
York Tsai
 
Building your First MEAN App
Building your First MEAN AppBuilding your First MEAN App
Building your First MEAN App
MongoDB
 
Socket Programming
Socket ProgrammingSocket Programming
Socket Programming
VisualBee.com
 
Building notification system in NodeJS + Redis
Building notification system in NodeJS + RedisBuilding notification system in NodeJS + Redis
Building notification system in NodeJS + Redis
Le Duc
 

Andere mochten auch (20)

Real-time Web Application with Socket.IO, Node.js, and Redis
Real-time Web Application with Socket.IO, Node.js, and RedisReal-time Web Application with Socket.IO, Node.js, and Redis
Real-time Web Application with Socket.IO, Node.js, and Redis
 
Node worshop Realtime - Socket.io
Node worshop Realtime - Socket.ioNode worshop Realtime - Socket.io
Node worshop Realtime - Socket.io
 
Node js oc meetup 2 socket io intro
Node js oc meetup 2 socket io introNode js oc meetup 2 socket io intro
Node js oc meetup 2 socket io intro
 
Socket io - JSZurich
Socket io - JSZurichSocket io - JSZurich
Socket io - JSZurich
 
Realtime web applications with ExpressJS and SocketIO
Realtime web applications with ExpressJS and SocketIORealtime web applications with ExpressJS and SocketIO
Realtime web applications with ExpressJS and SocketIO
 
Better d3 charts with tdd
Better d3 charts with tddBetter d3 charts with tdd
Better d3 charts with tdd
 
tea
teatea
tea
 
Data visualization
Data visualizationData visualization
Data visualization
 
Building your First MEAN App
Building your First MEAN AppBuilding your First MEAN App
Building your First MEAN App
 
Socket.io (part 1)
Socket.io (part 1)Socket.io (part 1)
Socket.io (part 1)
 
NodeJS & Socket IO on Microsoft Azure Cloud Web Sites - DWX 2014
NodeJS & Socket IO on Microsoft Azure Cloud Web Sites - DWX 2014NodeJS & Socket IO on Microsoft Azure Cloud Web Sites - DWX 2014
NodeJS & Socket IO on Microsoft Azure Cloud Web Sites - DWX 2014
 
Socket.IO - Alternative Ways for Real-time Application
Socket.IO - Alternative Ways for Real-time ApplicationSocket.IO - Alternative Ways for Real-time Application
Socket.IO - Alternative Ways for Real-time Application
 
Redis : Database, cache, pub/sub and more at Jelly button games
Redis : Database, cache, pub/sub and more at Jelly button gamesRedis : Database, cache, pub/sub and more at Jelly button games
Redis : Database, cache, pub/sub and more at Jelly button games
 
Hacking websockets
Hacking websocketsHacking websockets
Hacking websockets
 
Socket Programming
Socket ProgrammingSocket Programming
Socket Programming
 
Fun with D3.js: Data Visualization Eye Candy with Streaming JSON
Fun with D3.js: Data Visualization Eye Candy with Streaming JSONFun with D3.js: Data Visualization Eye Candy with Streaming JSON
Fun with D3.js: Data Visualization Eye Candy with Streaming JSON
 
Practical Use of MongoDB for Node.js
Practical Use of MongoDB for Node.jsPractical Use of MongoDB for Node.js
Practical Use of MongoDB for Node.js
 
Building notification system in NodeJS + Redis
Building notification system in NodeJS + RedisBuilding notification system in NodeJS + Redis
Building notification system in NodeJS + Redis
 
laravel websocket(use redis pubsub) [Laravel meetup tokyo]
laravel websocket(use redis pubsub) [Laravel meetup tokyo]laravel websocket(use redis pubsub) [Laravel meetup tokyo]
laravel websocket(use redis pubsub) [Laravel meetup tokyo]
 
Real Time Communication using Node.js and Socket.io
Real Time Communication using Node.js and Socket.ioReal Time Communication using Node.js and Socket.io
Real Time Communication using Node.js and Socket.io
 

Ähnlich wie Transforming WebSockets

HTML5 vs Silverlight
HTML5 vs SilverlightHTML5 vs Silverlight
HTML5 vs Silverlight
Matt Casto
 
Getting started with puppet and vagrant (1)
Getting started with puppet and vagrant (1)Getting started with puppet and vagrant (1)
Getting started with puppet and vagrant (1)
Puppet
 
Into The Box 2018 Going live with commandbox and docker
Into The Box 2018 Going live with commandbox and dockerInto The Box 2018 Going live with commandbox and docker
Into The Box 2018 Going live with commandbox and docker
Ortus Solutions, Corp
 
Going live with BommandBox and docker Into The Box 2018
Going live with BommandBox and docker Into The Box 2018Going live with BommandBox and docker Into The Box 2018
Going live with BommandBox and docker Into The Box 2018
Ortus Solutions, Corp
 

Ähnlich wie Transforming WebSockets (20)

WebSockets with Spring 4
WebSockets with Spring 4WebSockets with Spring 4
WebSockets with Spring 4
 
State of Web APIs 2017
State of Web APIs 2017State of Web APIs 2017
State of Web APIs 2017
 
HTML5 vs Silverlight
HTML5 vs SilverlightHTML5 vs Silverlight
HTML5 vs Silverlight
 
ä»Žć°äčŠç­Ÿćˆ°æ”è§ˆć™šæ‰©ć±•çš„ćș”甚
ä»Žć°äčŠç­Ÿćˆ°æ”è§ˆć™šæ‰©ć±•çš„ćș”ç”šä»Žć°äčŠç­Ÿćˆ°æ”è§ˆć™šæ‰©ć±•çš„ćș”甚
ä»Žć°äčŠç­Ÿćˆ°æ”è§ˆć™šæ‰©ć±•çš„ćș”甚
 
Building Isomorphic Apps (JSConf.Asia 2014)
Building Isomorphic Apps (JSConf.Asia 2014)Building Isomorphic Apps (JSConf.Asia 2014)
Building Isomorphic Apps (JSConf.Asia 2014)
 
Getting started with puppet and vagrant (1)
Getting started with puppet and vagrant (1)Getting started with puppet and vagrant (1)
Getting started with puppet and vagrant (1)
 
Html 5 boot camp
Html 5 boot campHtml 5 boot camp
Html 5 boot camp
 
Moving to modules
Moving to modulesMoving to modules
Moving to modules
 
Web versus Native: round 1!
Web versus Native: round 1!Web versus Native: round 1!
Web versus Native: round 1!
 
Xke - Introduction to Apache Camel
Xke - Introduction to Apache CamelXke - Introduction to Apache Camel
Xke - Introduction to Apache Camel
 
Vagrant - Team Development made easy
Vagrant - Team Development made easyVagrant - Team Development made easy
Vagrant - Team Development made easy
 
RichFaces - Testing on Mobile Devices
RichFaces - Testing on Mobile DevicesRichFaces - Testing on Mobile Devices
RichFaces - Testing on Mobile Devices
 
HTTP/2 - How it's changing web performance
HTTP/2 - How it's changing web performanceHTTP/2 - How it's changing web performance
HTTP/2 - How it's changing web performance
 
Fargate ë„Œ 읎용한 ECS with VPC 1부
Fargate ë„Œ 읎용한 ECS with VPC 1부Fargate ë„Œ 읎용한 ECS with VPC 1부
Fargate ë„Œ 읎용한 ECS with VPC 1부
 
Sprockets
SprocketsSprockets
Sprockets
 
Into The Box 2018 Going live with commandbox and docker
Into The Box 2018 Going live with commandbox and dockerInto The Box 2018 Going live with commandbox and docker
Into The Box 2018 Going live with commandbox and docker
 
Going live with BommandBox and docker Into The Box 2018
Going live with BommandBox and docker Into The Box 2018Going live with BommandBox and docker Into The Box 2018
Going live with BommandBox and docker Into The Box 2018
 
URL Design
URL DesignURL Design
URL Design
 
Firefox OS in Japan
Firefox OS in JapanFirefox OS in Japan
Firefox OS in Japan
 
Apidays Paris 2023 - Forget TypeScript, Choose Rust to build Robust, Fast and...
Apidays Paris 2023 - Forget TypeScript, Choose Rust to build Robust, Fast and...Apidays Paris 2023 - Forget TypeScript, Choose Rust to build Robust, Fast and...
Apidays Paris 2023 - Forget TypeScript, Choose Rust to build Robust, Fast and...
 

KĂŒrzlich hochgeladen

CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
giselly40
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 

KĂŒrzlich hochgeladen (20)

Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 

Transforming WebSockets