SlideShare a Scribd company logo
1 of 52
Download to read offline
Copyright © 2016 M/Gateway Developments Ltd
qewd-ripple
The Ripple OSI Middle Tier
Rob Tweed
Director, M/Gateway Developments Ltd
Twitter: @rtweed
Copyright © 2016 M/Gateway Developments Ltd
What is qewd-ripple?
• Demonstration version of the Node.js-
based middle tier for the Ripple OSI
Application
– http://rippleosi.org/
• Built using the QEWD framework
– http://www.mgateway.com
• Integrates multiple OpenEHR Servers
– Ripple's UI presents a unified interface
• REST-based
Copyright © 2016 M/Gateway Developments Ltd
Installing qewd-ripple
• See instructions at:
– https://github.com/RippleOSI/Qewd-Ripple
• The built-in installer script creates a fully-
working system
– Ubuntu 16.04
– Raspberrry Pi
• Could be easily adapted for use with other
flavours of Linux
Copyright © 2016 M/Gateway Developments Ltd
qewd-ripple
• Linux installation: components installed
include:
– Node.js 6.x
– QEWD
– Redis or GT.M: "Global Storage" NoSQL
database
– MySQL
– Ripple UI:
• HTML, JavaScript, CSS files
Copyright © 2016 M/Gateway Developments Ltd
Node.js
• Server-side JavaScript
Copyright © 2016 M/Gateway Developments Ltd
QEWD
• Node.js-based module
• Used as the REST platform for qewd-ripple
• Provides an outward-facing HTTP/REST
interface
– Courtesy of Express, the standard Node.js web server
• Provides the run-time environment for Ripple's
REST API handler functions
– Written in JavaScript
• Acts as a proxy to and integrates multiple
OpenEHR (and potentially other) servers
Copyright © 2016 M/Gateway Developments Ltd
GT.M
• Used by QEWD as an embedded, in-
process, persistent JSON store and
Document Database, for:
– Session management
– OpenEHR data cacheing
• On a per-user basis
Copyright © 2016 M/Gateway Developments Ltd
Redis
• Redis
– High-performance key/value store
– ewd-redis-globals module:
• Gives Global Storage functionality to Redis
– Used by the Raspberry Pi version of qewd-
ripple
– Alternative to GT.M for Linux version of qewd-
ripple
• Behaves identically to GT.M as far as qewd-ripple
is concerned
Copyright © 2016 M/Gateway Developments Ltd
MySQL
• Used in the Ripple OSI Demonstrator for
PAS functionality
Copyright © 2016 M/Gateway Developments Ltd
Starting qewd-ripple
• cd ~/qewd
• Demo-mode:
– node ripple-demo
• Secure mode
– node ripple-secure
Copyright © 2016 M/Gateway Developments Ltd
Running Ripple OSI
• Point a browser at the IP address or host
name of the server running qewd-ripple,
eg:
– http://192.168.1.100
Copyright © 2016 M/Gateway Developments Ltd
Ripple Demo Mode
• Simulates a user with full access to all
patient data
– IDCR mode
Copyright © 2016 M/Gateway Developments Ltd
Ripple Secure Mode
• User identity management taken care of
by a 3rd party service
– The qewd-ripple demonstrator uses Auth0
• Users can have two alternative modes of
access:
– IDCR: clinical user, with full access to all
patient data
– PHR: an individual patient, with read access
to his/her own data only
Copyright © 2016 M/Gateway Developments Ltd
qewd-ripple architecture
• Extends QEWD
• Uses it for REST access only
• Implements handlers for the Ripple OSI
REST APIs
Copyright © 2016 M/Gateway Developments Ltd
QEWD (using Redis/GT.M)
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
qewd
ewd-qoper8-gtm
Redis/GT.M
ewd-document-store
Global
Storage
ewd-session
Express
HTTP(S)
Interface
RESTClient
Custom Worker
Module
ewd-qoper8
Constructed from a number of EWD 3 modules
Copyright © 2016 M/Gateway Developments Ltd
QEWD's Architecture
• Master Process
– Handles all incoming REST requests
• Via Express
• Queues and dispatches requests to worker
processes
• Worker Processes
– You define how large a pool of workers you
require
– Each worker handles just one request
Copyright © 2016 M/Gateway Developments Ltd
Master Node.js Process
Queue
Queue
processor/
dispatcher
Ripple REST
Request
QEWD Architecture
Every incoming request
is passed from Express
and placed in a queue
No further processing
of requests occurs in
the master process
Copyright © 2016 M/Gateway Developments Ltd
QEWD Architecture
Master Node.js Process
Queue
Queue
processor/
dispatcher
Queue dispatcher is
invoked whenever a
request is added to
the queue
Copyright © 2016 M/Gateway Developments Ltd
QEWD Architecture
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
Worker process
started if none
available
Copyright © 2016 M/Gateway Developments Ltd
QEWD Architecture
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
qewd-ripple
Handler module
Redis/GT.M
QEWD &
qewd-ripple-specific
Modules loaded
and connected to
database:
Redis or GT.M
Copyright © 2016 M/Gateway Developments Ltd
QEWD Architecture
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
Redis/GT.M
Request passed
to worker
Copyright © 2016 M/Gateway Developments Ltd
QEWD Architecture
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
Custom
Worker
Module
Worker flagged as Unavailable
Node.js Worker Process
Custom
Worker
Module
Redis/GT.M
Begin processing message
Copyright © 2016 M/Gateway Developments Ltd
QEWD Architecture
Master Node.js Process
Queue
Queue
processor/
dispatcher
Unavailable / processing
Another incoming
Ripple
REST request
Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
Redis/GT.M
Copyright © 2016 M/Gateway Developments Ltd
QEWD Architecture
Node.js Worker Process
Master Node.js Process
Queue
Queue
processor/
dispatcher
Custom
Worker
Module
Unavailable / processing
Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
Redis/GT.M
Node.js Worker Process
Custom
Worker
Module
Redis/GT.M
If worker pool size not exceeded,
another worker is started
and request passed to it
Copyright © 2016 M/Gateway Developments Ltd
QEWD Architecture
Master Node.js Process
Queue
Queue
processor/
dispatcher
Unavailable / processing
Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
Redis/GT.M
If entire Worker Pool is busy:
Unavailable / processing
Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
Redis/GT.M
Unavailable / processing
Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
Redis/GT.M
Copyright © 2016 M/Gateway Developments Ltd
QEWD Architecture
Master Node.js Process
Queue
Queue
processor/
dispatcher
Unavailable / processing
Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
Redis/GT.M
If entire Worker Pool is busy:
Unavailable / processing
Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
Redis/GT.M
Unavailable / processing
Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
Redis/GT.M
New
requests
remain
in queue
Copyright © 2016 M/Gateway Developments Ltd
QEWD Architecture
Master Node.js Process
Queue
Queue
processor/
dispatcher
Unavailable / processing
Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
Redis/GT.M
As soon as a worker is available again,
a queued message can be passed to it
Unavailable / processing
Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
Redis/GT.M
Available
Node.js Worker Process
Custom
Worker
Module
Redis/GT.M
Copyright © 2016 M/Gateway Developments Ltd
QEWD Architecture
Master Node.js Process
Queue
Queue
processor/
dispatcher
Finished
Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
Redis/GT.M
A user's handler function signals
completion using the function:
finished(responseObject);
This returns the response
object to the master
process
Copyright © 2016 M/Gateway Developments Ltd
QEWD Architecture
Master Node.js Process
Queue
Queue
processor/
dispatcher
Finished
Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
Node.js Worker Process
Custom
Worker
Module
Redis/GT.M
And the response is
passed to Express which
returns it to the client
that sent the original request
Copyright © 2016 M/Gateway Developments Ltd
QEWD Architecture
Master Node.js Process
Queue
Queue
processor/
dispatcher
Available
Node.js Worker Process
Custom
Worker
Module
Redis/GT.M
The finished() function
also automatically returns
the worker process back
to the available pool
So it can now handle
the next queued request
Copyright © 2016 M/Gateway Developments Ltd
QEWD Architecture
Master Node.js Process
Queue
Queue
processor/
dispatcher
Available
Node.js Worker Process
Custom
Worker
Module
Redis/GT.M
Worker processes, once started,
are persistent
No start-up / tear-down cost
Workers will automatically close
themselves down if they are
inactive for more than a pre-set
threshold time period
Copyright © 2016 M/Gateway Developments Ltd
QEWD Architecture
Master Node.js Process
Queue
Queue
processor/
dispatcher
Available
Node.js Worker Process
Custom
Worker
Module
Redis/GT.M
Worker processes only handle
a single request at a time
Completely isolated run-time
environment for handler functions
No need for concerns about
Node.js concurrency, so
synchronous APIs can be used
Copyright © 2016 M/Gateway Developments Ltd
QEWD Architecture
Master Node.js Process
Queue
Queue
processor/
dispatcher
Available
Node.js Worker Process
Custom
Worker
Module
Redis/GT.M
Long-running or CPU-intensive
logic has no direct impact on
other worker processes
Copyright © 2016 M/Gateway Developments Ltd
QEWD Architecture
Master Node.js Process
Queue
Queue
processor/
dispatcher
Node.js concurrency is handled
by the master process.
100% asynchronous logic
The master process does
almost nothing
No CPU-intensive or long-
running tasks, so very
high-performance
All the work happens in the
isolated worker processes
Multiple
Concurrent
Incoming
REST requests
Copyright © 2016 M/Gateway Developments Ltd
qewd-ripple Session Management
• Everything begins with receipt of /api/initialise request,
sent from the Ripple UI
Copyright © 2016 M/Gateway Developments Ltd
The /api/initialise API
• If:
– qewd-ripple is running in demo mode; and
– this is the first time the browser has connected
• Then:
– the middle tier starts a new QEWD Session which creates a
token
• The token is a random uuid-formatted string
– A hard-coded set of user credentials are stored in the
Session (an IDCR-mode user)
– The Session token is returned in the response to the UI
• The UI stores this as a cookie named JSESSIONID
– All subsequent requests will include this cookie
Copyright © 2016 M/Gateway Developments Ltd
qewd-ripple Session Management
• If:
– qewd-ripple is running in secure mode; and
– this is the first time the browser has connected
• Then:
– the middle tier passes control to Auth0
– User logs in via Auth0
– If successful, the credentials are passed back to qewd-ripple
– qewd-ripple creates a new QEWD Session and saves the
credentials in the user's Session
– The Session token is returned in the response to the UI
• The UI stores this as a cookie named JSESSIONID
Copyright © 2016 M/Gateway Developments Ltd
The /api/initialise API
• If:
– The request includes a JSESSIONID cookie containing a
currently valid, unexpired QEWD Session token
• Then:
– the middle tier returns an OK response that also tells the UI the
user's mode:
• IDCR or PHR
Copyright © 2016 M/Gateway Developments Ltd
qewd-ripple Session Management
• On successful receipt of the /api/initialise
response, the UI issues an /api/user request
– This request will now include the JSESSIONID cookie
• So qewd-ripple can identify the user's Session
• The middle tier retrieves the user's credentials
from the Session and returns them to the UI
• The UI can now display the user's details
Copyright © 2016 M/Gateway Developments Ltd
qewd-ripple Session Management
• The UI can now start issuing its REST APIs to
the middle tier
• Every request will include the JSESSIONID
cookie which contains the user's QEWD Session
token, allowing the request's handler to access
the user's QEWD Session:
– To retrieve data
– To cache data
Copyright © 2016 M/Gateway Developments Ltd
Accessing OpenEHR Servers
Browser QEWD
GT.M or
Redis
ewd-qoper8
queue
qewd-ripple
Module
Express
Worker
PulseTile
UI
REST/
HTTP
Incoming request for some
patient heading data
eg Allergies
Copyright © 2016 M/Gateway Developments Ltd
Accessing OpenEHR Servers
Browser QEWD
GT.M or
Redis
ewd-session
ewd-qoper8
queue
qewd-ripple
Module
Express
Worker
PulseTile
UI
Is the allergies data in the user's
QEWD Session storage?
Copyright © 2016 M/Gateway Developments Ltd
Accessing OpenEHR Servers
Browser QEWD
GT.M or
Redis
ewd-session
ewd-qoper8
queue
qewd-ripple
Module
Express
Worker
PulseTile
UI
Is the allergies data in the user's
QEWD Session storage?
No
Copyright © 2016 M/Gateway Developments Ltd
Accessing OpenEHR Servers
Browser QEWD
GT.M or
Redis
ewd-qoper8
queue
qewd-ripple
Module
Express
OpenEHR
Server
AQL over
HTTP(S)
Worker
PulseTile
UI
OpenEHR
Server
Fetch the allergies data
from the OpenEHR
servers
Copyright © 2016 M/Gateway Developments Ltd
Accessing OpenEHR Servers
Browser QEWD
GT.M or
Redis
ewd-qoper8
queue
qewd-ripple
Module
Express
OpenEHR
Server
HTTP(S)
Worker
PulseTile
UI
OpenEHR
Server
And save it in the
user's QEWD
Session storage
ewd-session
Copyright © 2016 M/Gateway Developments Ltd
Accessing OpenEHR Servers
Browser QEWD
GT.M or
Redis
ewd-session
ewd-qoper8
queue
qewd-ripple
Module
Express
Worker
PulseTile
UI
Repeat the logic…
Is the allergies data in the user's
QEWD Session storage?
Copyright © 2016 M/Gateway Developments Ltd
Accessing OpenEHR Servers
Browser QEWD
GT.M or
Redis
ewd-session
ewd-qoper8
queue
qewd-ripple
Module
Express
Worker
PulseTile
UI
Repeat the logic…
Is the allergies data in the user's
QEWD Session storage?
Yes
Copyright © 2016 M/Gateway Developments Ltd
Accessing OpenEHR Servers
Browser QEWD
GT.M or
Redis
ewd-session
ewd-qoper8
queue
qewd-ripple
Module
Express
Worker
PulseTile
UI
Return it to the
Browser that made
The request
Map OpenEHR
field-names to
UI field-names
Copyright © 2016 M/Gateway Developments Ltd
Accessing OpenEHR Servers
Browser QEWD
GT.M or
Redis
ewd-qoper8
queue
qewd-ripple
Module
Express
Worker
PulseTile
UI
REST/
HTTP
If a later request arrives
from this user for
Allergies data
Copyright © 2016 M/Gateway Developments Ltd
Accessing OpenEHR Servers
Browser QEWD
GT.M or
Redis
ewd-session
ewd-qoper8
queue
qewd-ripple
Module
Express
Worker
PulseTile
UI
Is the allergies data in the user's
QEWD Session storage?
Yes
Copyright © 2016 M/Gateway Developments Ltd
Accessing OpenEHR Servers
Browser QEWD
GT.M or
Redis
ewd-session
ewd-qoper8
queue
qewd-ripple
Module
Express
Worker
PulseTile
UI
Return it to the
Browser that made
The request
Map OpenEHR
field-names to
UI field-names
Copyright © 2016 M/Gateway Developments Ltd
QEWD Session = Headings Cache
• Each user's QEWD Session acts as a
high-performance cache of headings data
– Minimises "round-trips" to OpenEHR servers
• QEWD Session storage:
– Persistent JSON storage
– Document database
– GT.M and Redis behave identically as far as
qewd-ripple is concerned

More Related Content

What's hot

LNUG: Having Your Node.js Cake and Eating It Too
LNUG: Having Your Node.js Cake and Eating It TooLNUG: Having Your Node.js Cake and Eating It Too
LNUG: Having Your Node.js Cake and Eating It TooRob Tweed
 
EWD 3 Training Course Part 42: The QEWD Docker Appliance
EWD 3 Training Course Part 42: The QEWD Docker ApplianceEWD 3 Training Course Part 42: The QEWD Docker Appliance
EWD 3 Training Course Part 42: The QEWD Docker ApplianceRob Tweed
 
EWD 3 Training Course Part 2: EWD 3 Overview
EWD 3 Training Course Part 2: EWD 3 OverviewEWD 3 Training Course Part 2: EWD 3 Overview
EWD 3 Training Course Part 2: EWD 3 OverviewRob Tweed
 
EWD 3 Training Course Part 8: Anatomy of the QEWD Messaging Cycle
EWD 3 Training Course Part 8: Anatomy of the QEWD Messaging CycleEWD 3 Training Course Part 8: Anatomy of the QEWD Messaging Cycle
EWD 3 Training Course Part 8: Anatomy of the QEWD Messaging CycleRob Tweed
 
EWD 3 Training Course Part 34: QEWD Resilient Mode
EWD 3 Training Course Part 34: QEWD Resilient ModeEWD 3 Training Course Part 34: QEWD Resilient Mode
EWD 3 Training Course Part 34: QEWD Resilient ModeRob Tweed
 
EWD 3 Training Course Part 15: Using a Framework other than jQuery with QEWD
EWD 3 Training Course Part 15: Using a Framework other than jQuery with QEWDEWD 3 Training Course Part 15: Using a Framework other than jQuery with QEWD
EWD 3 Training Course Part 15: Using a Framework other than jQuery with QEWDRob Tweed
 
EWD 3 Training Course Part 3: Summary of EWD 3 Modules
EWD 3 Training Course Part 3: Summary of EWD 3 ModulesEWD 3 Training Course Part 3: Summary of EWD 3 Modules
EWD 3 Training Course Part 3: Summary of EWD 3 ModulesRob Tweed
 
EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...
EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...
EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...Rob Tweed
 
Data Persistence as a Language Feature
Data Persistence as a Language FeatureData Persistence as a Language Feature
Data Persistence as a Language FeatureRob Tweed
 
EWD 3 Training Course Part 19: The cache.node APIs
EWD 3 Training Course Part 19: The cache.node APIsEWD 3 Training Course Part 19: The cache.node APIs
EWD 3 Training Course Part 19: The cache.node APIsRob Tweed
 
EWD.js: The Future Starts Here
EWD.js: The Future Starts HereEWD.js: The Future Starts Here
EWD.js: The Future Starts HereRob Tweed
 
EWD 3 Training Course Part 33: Configuring QEWD to use CORS
EWD 3 Training Course Part 33: Configuring QEWD to use CORSEWD 3 Training Course Part 33: Configuring QEWD to use CORS
EWD 3 Training Course Part 33: Configuring QEWD to use CORSRob Tweed
 
EWD 3 Training Course Part 28: Integrating Legacy Mumps Code with QEWD
EWD 3 Training Course Part 28: Integrating Legacy Mumps Code with QEWDEWD 3 Training Course Part 28: Integrating Legacy Mumps Code with QEWD
EWD 3 Training Course Part 28: Integrating Legacy Mumps Code with QEWDRob Tweed
 
EWD 3 Training Course Part 31: Using QEWD for Web and REST Services
EWD 3 Training Course Part 31: Using QEWD for Web and REST ServicesEWD 3 Training Course Part 31: Using QEWD for Web and REST Services
EWD 3 Training Course Part 31: Using QEWD for Web and REST ServicesRob Tweed
 
EWD 3 Training Course Part 36: Accessing REST and Web Services from a QEWD ap...
EWD 3 Training Course Part 36: Accessing REST and Web Services from a QEWD ap...EWD 3 Training Course Part 36: Accessing REST and Web Services from a QEWD ap...
EWD 3 Training Course Part 36: Accessing REST and Web Services from a QEWD ap...Rob Tweed
 
EWD 3 Training Course Part 27: The QEWD Session
EWD 3 Training Course Part 27: The QEWD SessionEWD 3 Training Course Part 27: The QEWD Session
EWD 3 Training Course Part 27: The QEWD SessionRob Tweed
 
EWD 3 Training Course Part 5b: First Steps in Building a QEWD Application
EWD 3 Training Course Part 5b: First Steps in Building a QEWD ApplicationEWD 3 Training Course Part 5b: First Steps in Building a QEWD Application
EWD 3 Training Course Part 5b: First Steps in Building a QEWD ApplicationRob Tweed
 
EWD 3 Training Course Part 35: QEWD Session Locking
EWD 3 Training Course Part 35: QEWD Session LockingEWD 3 Training Course Part 35: QEWD Session Locking
EWD 3 Training Course Part 35: QEWD Session LockingRob Tweed
 
EWD 3 Training Course Part 5a: First Steps in Building a QEWD Application
EWD 3 Training Course Part 5a: First Steps in Building a QEWD ApplicationEWD 3 Training Course Part 5a: First Steps in Building a QEWD Application
EWD 3 Training Course Part 5a: First Steps in Building a QEWD ApplicationRob Tweed
 

What's hot (20)

LNUG: Having Your Node.js Cake and Eating It Too
LNUG: Having Your Node.js Cake and Eating It TooLNUG: Having Your Node.js Cake and Eating It Too
LNUG: Having Your Node.js Cake and Eating It Too
 
EWD 3 Training Course Part 42: The QEWD Docker Appliance
EWD 3 Training Course Part 42: The QEWD Docker ApplianceEWD 3 Training Course Part 42: The QEWD Docker Appliance
EWD 3 Training Course Part 42: The QEWD Docker Appliance
 
EWD 3 Training Course Part 2: EWD 3 Overview
EWD 3 Training Course Part 2: EWD 3 OverviewEWD 3 Training Course Part 2: EWD 3 Overview
EWD 3 Training Course Part 2: EWD 3 Overview
 
EWD 3 Training Course Part 8: Anatomy of the QEWD Messaging Cycle
EWD 3 Training Course Part 8: Anatomy of the QEWD Messaging CycleEWD 3 Training Course Part 8: Anatomy of the QEWD Messaging Cycle
EWD 3 Training Course Part 8: Anatomy of the QEWD Messaging Cycle
 
EWD 3 Training Course Part 34: QEWD Resilient Mode
EWD 3 Training Course Part 34: QEWD Resilient ModeEWD 3 Training Course Part 34: QEWD Resilient Mode
EWD 3 Training Course Part 34: QEWD Resilient Mode
 
QEWD Update
QEWD UpdateQEWD Update
QEWD Update
 
EWD 3 Training Course Part 15: Using a Framework other than jQuery with QEWD
EWD 3 Training Course Part 15: Using a Framework other than jQuery with QEWDEWD 3 Training Course Part 15: Using a Framework other than jQuery with QEWD
EWD 3 Training Course Part 15: Using a Framework other than jQuery with QEWD
 
EWD 3 Training Course Part 3: Summary of EWD 3 Modules
EWD 3 Training Course Part 3: Summary of EWD 3 ModulesEWD 3 Training Course Part 3: Summary of EWD 3 Modules
EWD 3 Training Course Part 3: Summary of EWD 3 Modules
 
EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...
EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...
EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...
 
Data Persistence as a Language Feature
Data Persistence as a Language FeatureData Persistence as a Language Feature
Data Persistence as a Language Feature
 
EWD 3 Training Course Part 19: The cache.node APIs
EWD 3 Training Course Part 19: The cache.node APIsEWD 3 Training Course Part 19: The cache.node APIs
EWD 3 Training Course Part 19: The cache.node APIs
 
EWD.js: The Future Starts Here
EWD.js: The Future Starts HereEWD.js: The Future Starts Here
EWD.js: The Future Starts Here
 
EWD 3 Training Course Part 33: Configuring QEWD to use CORS
EWD 3 Training Course Part 33: Configuring QEWD to use CORSEWD 3 Training Course Part 33: Configuring QEWD to use CORS
EWD 3 Training Course Part 33: Configuring QEWD to use CORS
 
EWD 3 Training Course Part 28: Integrating Legacy Mumps Code with QEWD
EWD 3 Training Course Part 28: Integrating Legacy Mumps Code with QEWDEWD 3 Training Course Part 28: Integrating Legacy Mumps Code with QEWD
EWD 3 Training Course Part 28: Integrating Legacy Mumps Code with QEWD
 
EWD 3 Training Course Part 31: Using QEWD for Web and REST Services
EWD 3 Training Course Part 31: Using QEWD for Web and REST ServicesEWD 3 Training Course Part 31: Using QEWD for Web and REST Services
EWD 3 Training Course Part 31: Using QEWD for Web and REST Services
 
EWD 3 Training Course Part 36: Accessing REST and Web Services from a QEWD ap...
EWD 3 Training Course Part 36: Accessing REST and Web Services from a QEWD ap...EWD 3 Training Course Part 36: Accessing REST and Web Services from a QEWD ap...
EWD 3 Training Course Part 36: Accessing REST and Web Services from a QEWD ap...
 
EWD 3 Training Course Part 27: The QEWD Session
EWD 3 Training Course Part 27: The QEWD SessionEWD 3 Training Course Part 27: The QEWD Session
EWD 3 Training Course Part 27: The QEWD Session
 
EWD 3 Training Course Part 5b: First Steps in Building a QEWD Application
EWD 3 Training Course Part 5b: First Steps in Building a QEWD ApplicationEWD 3 Training Course Part 5b: First Steps in Building a QEWD Application
EWD 3 Training Course Part 5b: First Steps in Building a QEWD Application
 
EWD 3 Training Course Part 35: QEWD Session Locking
EWD 3 Training Course Part 35: QEWD Session LockingEWD 3 Training Course Part 35: QEWD Session Locking
EWD 3 Training Course Part 35: QEWD Session Locking
 
EWD 3 Training Course Part 5a: First Steps in Building a QEWD Application
EWD 3 Training Course Part 5a: First Steps in Building a QEWD ApplicationEWD 3 Training Course Part 5a: First Steps in Building a QEWD Application
EWD 3 Training Course Part 5a: First Steps in Building a QEWD Application
 

Similar to Node.js Ripple OSI Middle Tier Demo

EWD 3 Training Course Part 16: QEWD Services
EWD 3 Training Course Part 16: QEWD ServicesEWD 3 Training Course Part 16: QEWD Services
EWD 3 Training Course Part 16: QEWD ServicesRob Tweed
 
Cloud Foundry Open Tour China (english)
Cloud Foundry Open Tour China (english)Cloud Foundry Open Tour China (english)
Cloud Foundry Open Tour China (english)marklucovsky
 
Introduction to node js - From "hello world" to deploying on azure
Introduction to node js - From "hello world" to deploying on azureIntroduction to node js - From "hello world" to deploying on azure
Introduction to node js - From "hello world" to deploying on azureColin Mackay
 
Cloud Foundry Open Tour China
Cloud Foundry Open Tour ChinaCloud Foundry Open Tour China
Cloud Foundry Open Tour Chinamarklucovsky
 
The next step from Microsoft - Vnext (Srdjan Poznic)
The next step from Microsoft - Vnext (Srdjan Poznic)The next step from Microsoft - Vnext (Srdjan Poznic)
The next step from Microsoft - Vnext (Srdjan Poznic)Geekstone
 
EWD 3 Training Course Part 17: Introduction to Global Storage Databases
EWD 3 Training Course Part 17: Introduction to Global Storage DatabasesEWD 3 Training Course Part 17: Introduction to Global Storage Databases
EWD 3 Training Course Part 17: Introduction to Global Storage DatabasesRob Tweed
 
Get acquainted with the new ASP.Net 5
Get acquainted with the new ASP.Net 5Get acquainted with the new ASP.Net 5
Get acquainted with the new ASP.Net 5Suyati Technologies
 
.NET Cloud-Native Bootcamp
.NET Cloud-Native Bootcamp.NET Cloud-Native Bootcamp
.NET Cloud-Native BootcampVMware Tanzu
 
Best Practices for couchDB developers on Microsoft Azure
Best Practices for couchDB developers on Microsoft AzureBest Practices for couchDB developers on Microsoft Azure
Best Practices for couchDB developers on Microsoft AzureBrian Benz
 
JavaOne 2014: Java vs JavaScript
JavaOne 2014:   Java vs JavaScriptJavaOne 2014:   Java vs JavaScript
JavaOne 2014: Java vs JavaScriptChris Bailey
 
Learning ASP.NET 5 and MVC 6
Learning ASP.NET 5 and MVC 6Learning ASP.NET 5 and MVC 6
Learning ASP.NET 5 and MVC 6Ido Flatow
 
betterCode Workshop: Effizientes DevOps-Tooling mit Go
betterCode Workshop:  Effizientes DevOps-Tooling mit GobetterCode Workshop:  Effizientes DevOps-Tooling mit Go
betterCode Workshop: Effizientes DevOps-Tooling mit GoQAware GmbH
 
Intro to HTTP and Node.js
Intro to HTTP and Node.jsIntro to HTTP and Node.js
Intro to HTTP and Node.jsJean-Luc David
 
Red Hat Forum Benelux 2015
Red Hat Forum Benelux 2015Red Hat Forum Benelux 2015
Red Hat Forum Benelux 2015Microsoft
 

Similar to Node.js Ripple OSI Middle Tier Demo (20)

EWD 3 Training Course Part 16: QEWD Services
EWD 3 Training Course Part 16: QEWD ServicesEWD 3 Training Course Part 16: QEWD Services
EWD 3 Training Course Part 16: QEWD Services
 
PHP as a Service TDC2019
PHP as a Service TDC2019PHP as a Service TDC2019
PHP as a Service TDC2019
 
Node on Windows Azure
Node on Windows AzureNode on Windows Azure
Node on Windows Azure
 
Cloud Foundry Open Tour China (english)
Cloud Foundry Open Tour China (english)Cloud Foundry Open Tour China (english)
Cloud Foundry Open Tour China (english)
 
Introduction to node js - From "hello world" to deploying on azure
Introduction to node js - From "hello world" to deploying on azureIntroduction to node js - From "hello world" to deploying on azure
Introduction to node js - From "hello world" to deploying on azure
 
Introduction to Node.js by Vinothini B
Introduction to Node.js by Vinothini BIntroduction to Node.js by Vinothini B
Introduction to Node.js by Vinothini B
 
Cloud Foundry Open Tour China
Cloud Foundry Open Tour ChinaCloud Foundry Open Tour China
Cloud Foundry Open Tour China
 
The next step from Microsoft - Vnext (Srdjan Poznic)
The next step from Microsoft - Vnext (Srdjan Poznic)The next step from Microsoft - Vnext (Srdjan Poznic)
The next step from Microsoft - Vnext (Srdjan Poznic)
 
EWD 3 Training Course Part 17: Introduction to Global Storage Databases
EWD 3 Training Course Part 17: Introduction to Global Storage DatabasesEWD 3 Training Course Part 17: Introduction to Global Storage Databases
EWD 3 Training Course Part 17: Introduction to Global Storage Databases
 
Intro to Sails.js
Intro to Sails.jsIntro to Sails.js
Intro to Sails.js
 
Get acquainted with the new ASP.Net 5
Get acquainted with the new ASP.Net 5Get acquainted with the new ASP.Net 5
Get acquainted with the new ASP.Net 5
 
Sst hackathon express
Sst hackathon expressSst hackathon express
Sst hackathon express
 
.NET Cloud-Native Bootcamp
.NET Cloud-Native Bootcamp.NET Cloud-Native Bootcamp
.NET Cloud-Native Bootcamp
 
Best Practices for couchDB developers on Microsoft Azure
Best Practices for couchDB developers on Microsoft AzureBest Practices for couchDB developers on Microsoft Azure
Best Practices for couchDB developers on Microsoft Azure
 
JavaOne 2014: Java vs JavaScript
JavaOne 2014:   Java vs JavaScriptJavaOne 2014:   Java vs JavaScript
JavaOne 2014: Java vs JavaScript
 
Learning ASP.NET 5 and MVC 6
Learning ASP.NET 5 and MVC 6Learning ASP.NET 5 and MVC 6
Learning ASP.NET 5 and MVC 6
 
betterCode Workshop: Effizientes DevOps-Tooling mit Go
betterCode Workshop:  Effizientes DevOps-Tooling mit GobetterCode Workshop:  Effizientes DevOps-Tooling mit Go
betterCode Workshop: Effizientes DevOps-Tooling mit Go
 
Intro to HTTP and Node.js
Intro to HTTP and Node.jsIntro to HTTP and Node.js
Intro to HTTP and Node.js
 
Red Hat Forum Benelux 2015
Red Hat Forum Benelux 2015Red Hat Forum Benelux 2015
Red Hat Forum Benelux 2015
 
Beginners Node.js
Beginners Node.jsBeginners Node.js
Beginners Node.js
 

More from Rob Tweed

EWD 3 Training Course Part 43: Using JSON Web Tokens with QEWD REST Services
EWD 3 Training Course Part 43: Using JSON Web Tokens with QEWD REST ServicesEWD 3 Training Course Part 43: Using JSON Web Tokens with QEWD REST Services
EWD 3 Training Course Part 43: Using JSON Web Tokens with QEWD REST ServicesRob Tweed
 
EWD 3 Training Course Part 41: Building a React.js application with QEWD, Part 5
EWD 3 Training Course Part 41: Building a React.js application with QEWD, Part 5EWD 3 Training Course Part 41: Building a React.js application with QEWD, Part 5
EWD 3 Training Course Part 41: Building a React.js application with QEWD, Part 5Rob Tweed
 
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 4
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 4EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 4
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 4Rob Tweed
 
EWD 3 Training Course Part 39: Building a React.js application with QEWD, Part 3
EWD 3 Training Course Part 39: Building a React.js application with QEWD, Part 3EWD 3 Training Course Part 39: Building a React.js application with QEWD, Part 3
EWD 3 Training Course Part 39: Building a React.js application with QEWD, Part 3Rob Tweed
 
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 2
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 2EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 2
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 2Rob Tweed
 
EWD 3 Training Course Part 32: Configuring QEWD to use SSL/HTTPS
EWD 3 Training Course Part 32: Configuring QEWD to use SSL/HTTPSEWD 3 Training Course Part 32: Configuring QEWD to use SSL/HTTPS
EWD 3 Training Course Part 32: Configuring QEWD to use SSL/HTTPSRob Tweed
 
EWD 3 Training Course Part 29: Running QEWD as a Service
EWD 3 Training Course Part 29: Running QEWD as a ServiceEWD 3 Training Course Part 29: Running QEWD as a Service
EWD 3 Training Course Part 29: Running QEWD as a ServiceRob Tweed
 
EWD 3 Training Course Part 26: Event-driven Indexing
EWD 3 Training Course Part 26: Event-driven IndexingEWD 3 Training Course Part 26: Event-driven Indexing
EWD 3 Training Course Part 26: Event-driven IndexingRob Tweed
 
EWD 3 Training Course Part 25: Document Database Capabilities
EWD 3 Training Course Part 25: Document Database CapabilitiesEWD 3 Training Course Part 25: Document Database Capabilities
EWD 3 Training Course Part 25: Document Database CapabilitiesRob Tweed
 
EWD 3 Training Course Part 24: Traversing a Document's Leaf Nodes
EWD 3 Training Course Part 24: Traversing a Document's Leaf NodesEWD 3 Training Course Part 24: Traversing a Document's Leaf Nodes
EWD 3 Training Course Part 24: Traversing a Document's Leaf NodesRob Tweed
 
EWD 3 Training Course Part 23: Traversing a Range using DocumentNode Objects
EWD 3 Training Course Part 23: Traversing a Range using DocumentNode ObjectsEWD 3 Training Course Part 23: Traversing a Range using DocumentNode Objects
EWD 3 Training Course Part 23: Traversing a Range using DocumentNode ObjectsRob Tweed
 

More from Rob Tweed (11)

EWD 3 Training Course Part 43: Using JSON Web Tokens with QEWD REST Services
EWD 3 Training Course Part 43: Using JSON Web Tokens with QEWD REST ServicesEWD 3 Training Course Part 43: Using JSON Web Tokens with QEWD REST Services
EWD 3 Training Course Part 43: Using JSON Web Tokens with QEWD REST Services
 
EWD 3 Training Course Part 41: Building a React.js application with QEWD, Part 5
EWD 3 Training Course Part 41: Building a React.js application with QEWD, Part 5EWD 3 Training Course Part 41: Building a React.js application with QEWD, Part 5
EWD 3 Training Course Part 41: Building a React.js application with QEWD, Part 5
 
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 4
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 4EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 4
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 4
 
EWD 3 Training Course Part 39: Building a React.js application with QEWD, Part 3
EWD 3 Training Course Part 39: Building a React.js application with QEWD, Part 3EWD 3 Training Course Part 39: Building a React.js application with QEWD, Part 3
EWD 3 Training Course Part 39: Building a React.js application with QEWD, Part 3
 
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 2
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 2EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 2
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 2
 
EWD 3 Training Course Part 32: Configuring QEWD to use SSL/HTTPS
EWD 3 Training Course Part 32: Configuring QEWD to use SSL/HTTPSEWD 3 Training Course Part 32: Configuring QEWD to use SSL/HTTPS
EWD 3 Training Course Part 32: Configuring QEWD to use SSL/HTTPS
 
EWD 3 Training Course Part 29: Running QEWD as a Service
EWD 3 Training Course Part 29: Running QEWD as a ServiceEWD 3 Training Course Part 29: Running QEWD as a Service
EWD 3 Training Course Part 29: Running QEWD as a Service
 
EWD 3 Training Course Part 26: Event-driven Indexing
EWD 3 Training Course Part 26: Event-driven IndexingEWD 3 Training Course Part 26: Event-driven Indexing
EWD 3 Training Course Part 26: Event-driven Indexing
 
EWD 3 Training Course Part 25: Document Database Capabilities
EWD 3 Training Course Part 25: Document Database CapabilitiesEWD 3 Training Course Part 25: Document Database Capabilities
EWD 3 Training Course Part 25: Document Database Capabilities
 
EWD 3 Training Course Part 24: Traversing a Document's Leaf Nodes
EWD 3 Training Course Part 24: Traversing a Document's Leaf NodesEWD 3 Training Course Part 24: Traversing a Document's Leaf Nodes
EWD 3 Training Course Part 24: Traversing a Document's Leaf Nodes
 
EWD 3 Training Course Part 23: Traversing a Range using DocumentNode Objects
EWD 3 Training Course Part 23: Traversing a Range using DocumentNode ObjectsEWD 3 Training Course Part 23: Traversing a Range using DocumentNode Objects
EWD 3 Training Course Part 23: Traversing a Range using DocumentNode Objects
 

Recently uploaded

cybersecurity notes for mca students for learning
cybersecurity notes for mca students for learningcybersecurity notes for mca students for learning
cybersecurity notes for mca students for learningVitsRangannavar
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)OPEN KNOWLEDGE GmbH
 
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...kellynguyen01
 
Engage Usergroup 2024 - The Good The Bad_The Ugly
Engage Usergroup 2024 - The Good The Bad_The UglyEngage Usergroup 2024 - The Good The Bad_The Ugly
Engage Usergroup 2024 - The Good The Bad_The UglyFrank van der Linden
 
Unit 1.1 Excite Part 1, class 9, cbse...
Unit 1.1 Excite Part 1, class 9, cbse...Unit 1.1 Excite Part 1, class 9, cbse...
Unit 1.1 Excite Part 1, class 9, cbse...aditisharan08
 
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...Christina Lin
 
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideBuilding Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideChristina Lin
 
What is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWhat is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWave PLM
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...gurkirankumar98700
 
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEBATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEOrtus Solutions, Corp
 
EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityNeo4j
 
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio, Inc.
 
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝soniya singh
 
Project Based Learning (A.I).pptx detail explanation
Project Based Learning (A.I).pptx detail explanationProject Based Learning (A.I).pptx detail explanation
Project Based Learning (A.I).pptx detail explanationkaushalgiri8080
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software DevelopersVinodh Ram
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...ICS
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...MyIntelliSource, Inc.
 
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdfThe Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdfkalichargn70th171
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comFatema Valibhai
 

Recently uploaded (20)

cybersecurity notes for mca students for learning
cybersecurity notes for mca students for learningcybersecurity notes for mca students for learning
cybersecurity notes for mca students for learning
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)
 
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
 
Engage Usergroup 2024 - The Good The Bad_The Ugly
Engage Usergroup 2024 - The Good The Bad_The UglyEngage Usergroup 2024 - The Good The Bad_The Ugly
Engage Usergroup 2024 - The Good The Bad_The Ugly
 
Unit 1.1 Excite Part 1, class 9, cbse...
Unit 1.1 Excite Part 1, class 9, cbse...Unit 1.1 Excite Part 1, class 9, cbse...
Unit 1.1 Excite Part 1, class 9, cbse...
 
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
 
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideBuilding Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
 
What is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWhat is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need It
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
 
Call Girls In Mukherjee Nagar 📱 9999965857 🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
Call Girls In Mukherjee Nagar 📱  9999965857  🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...Call Girls In Mukherjee Nagar 📱  9999965857  🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
Call Girls In Mukherjee Nagar 📱 9999965857 🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
 
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEBATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
 
EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered Sustainability
 
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
 
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
 
Project Based Learning (A.I).pptx detail explanation
Project Based Learning (A.I).pptx detail explanationProject Based Learning (A.I).pptx detail explanation
Project Based Learning (A.I).pptx detail explanation
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software Developers
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
 
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdfThe Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.com
 

Node.js Ripple OSI Middle Tier Demo

  • 1. Copyright © 2016 M/Gateway Developments Ltd qewd-ripple The Ripple OSI Middle Tier Rob Tweed Director, M/Gateway Developments Ltd Twitter: @rtweed
  • 2. Copyright © 2016 M/Gateway Developments Ltd What is qewd-ripple? • Demonstration version of the Node.js- based middle tier for the Ripple OSI Application – http://rippleosi.org/ • Built using the QEWD framework – http://www.mgateway.com • Integrates multiple OpenEHR Servers – Ripple's UI presents a unified interface • REST-based
  • 3. Copyright © 2016 M/Gateway Developments Ltd Installing qewd-ripple • See instructions at: – https://github.com/RippleOSI/Qewd-Ripple • The built-in installer script creates a fully- working system – Ubuntu 16.04 – Raspberrry Pi • Could be easily adapted for use with other flavours of Linux
  • 4. Copyright © 2016 M/Gateway Developments Ltd qewd-ripple • Linux installation: components installed include: – Node.js 6.x – QEWD – Redis or GT.M: "Global Storage" NoSQL database – MySQL – Ripple UI: • HTML, JavaScript, CSS files
  • 5. Copyright © 2016 M/Gateway Developments Ltd Node.js • Server-side JavaScript
  • 6. Copyright © 2016 M/Gateway Developments Ltd QEWD • Node.js-based module • Used as the REST platform for qewd-ripple • Provides an outward-facing HTTP/REST interface – Courtesy of Express, the standard Node.js web server • Provides the run-time environment for Ripple's REST API handler functions – Written in JavaScript • Acts as a proxy to and integrates multiple OpenEHR (and potentially other) servers
  • 7. Copyright © 2016 M/Gateway Developments Ltd GT.M • Used by QEWD as an embedded, in- process, persistent JSON store and Document Database, for: – Session management – OpenEHR data cacheing • On a per-user basis
  • 8. Copyright © 2016 M/Gateway Developments Ltd Redis • Redis – High-performance key/value store – ewd-redis-globals module: • Gives Global Storage functionality to Redis – Used by the Raspberry Pi version of qewd- ripple – Alternative to GT.M for Linux version of qewd- ripple • Behaves identically to GT.M as far as qewd-ripple is concerned
  • 9. Copyright © 2016 M/Gateway Developments Ltd MySQL • Used in the Ripple OSI Demonstrator for PAS functionality
  • 10. Copyright © 2016 M/Gateway Developments Ltd Starting qewd-ripple • cd ~/qewd • Demo-mode: – node ripple-demo • Secure mode – node ripple-secure
  • 11. Copyright © 2016 M/Gateway Developments Ltd Running Ripple OSI • Point a browser at the IP address or host name of the server running qewd-ripple, eg: – http://192.168.1.100
  • 12. Copyright © 2016 M/Gateway Developments Ltd Ripple Demo Mode • Simulates a user with full access to all patient data – IDCR mode
  • 13. Copyright © 2016 M/Gateway Developments Ltd Ripple Secure Mode • User identity management taken care of by a 3rd party service – The qewd-ripple demonstrator uses Auth0 • Users can have two alternative modes of access: – IDCR: clinical user, with full access to all patient data – PHR: an individual patient, with read access to his/her own data only
  • 14. Copyright © 2016 M/Gateway Developments Ltd qewd-ripple architecture • Extends QEWD • Uses it for REST access only • Implements handlers for the Ripple OSI REST APIs
  • 15. Copyright © 2016 M/Gateway Developments Ltd QEWD (using Redis/GT.M) Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher qewd ewd-qoper8-gtm Redis/GT.M ewd-document-store Global Storage ewd-session Express HTTP(S) Interface RESTClient Custom Worker Module ewd-qoper8 Constructed from a number of EWD 3 modules
  • 16. Copyright © 2016 M/Gateway Developments Ltd QEWD's Architecture • Master Process – Handles all incoming REST requests • Via Express • Queues and dispatches requests to worker processes • Worker Processes – You define how large a pool of workers you require – Each worker handles just one request
  • 17. Copyright © 2016 M/Gateway Developments Ltd Master Node.js Process Queue Queue processor/ dispatcher Ripple REST Request QEWD Architecture Every incoming request is passed from Express and placed in a queue No further processing of requests occurs in the master process
  • 18. Copyright © 2016 M/Gateway Developments Ltd QEWD Architecture Master Node.js Process Queue Queue processor/ dispatcher Queue dispatcher is invoked whenever a request is added to the queue
  • 19. Copyright © 2016 M/Gateway Developments Ltd QEWD Architecture Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher Worker process started if none available
  • 20. Copyright © 2016 M/Gateway Developments Ltd QEWD Architecture Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher qewd-ripple Handler module Redis/GT.M QEWD & qewd-ripple-specific Modules loaded and connected to database: Redis or GT.M
  • 21. Copyright © 2016 M/Gateway Developments Ltd QEWD Architecture Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher Custom Worker Module Node.js Worker Process Custom Worker Module Redis/GT.M Request passed to worker
  • 22. Copyright © 2016 M/Gateway Developments Ltd QEWD Architecture Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher Custom Worker Module Worker flagged as Unavailable Node.js Worker Process Custom Worker Module Redis/GT.M Begin processing message
  • 23. Copyright © 2016 M/Gateway Developments Ltd QEWD Architecture Master Node.js Process Queue Queue processor/ dispatcher Unavailable / processing Another incoming Ripple REST request Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module Redis/GT.M
  • 24. Copyright © 2016 M/Gateway Developments Ltd QEWD Architecture Node.js Worker Process Master Node.js Process Queue Queue processor/ dispatcher Custom Worker Module Unavailable / processing Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module Redis/GT.M Node.js Worker Process Custom Worker Module Redis/GT.M If worker pool size not exceeded, another worker is started and request passed to it
  • 25. Copyright © 2016 M/Gateway Developments Ltd QEWD Architecture Master Node.js Process Queue Queue processor/ dispatcher Unavailable / processing Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module Redis/GT.M If entire Worker Pool is busy: Unavailable / processing Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module Redis/GT.M Unavailable / processing Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module Redis/GT.M
  • 26. Copyright © 2016 M/Gateway Developments Ltd QEWD Architecture Master Node.js Process Queue Queue processor/ dispatcher Unavailable / processing Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module Redis/GT.M If entire Worker Pool is busy: Unavailable / processing Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module Redis/GT.M Unavailable / processing Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module Redis/GT.M New requests remain in queue
  • 27. Copyright © 2016 M/Gateway Developments Ltd QEWD Architecture Master Node.js Process Queue Queue processor/ dispatcher Unavailable / processing Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module Redis/GT.M As soon as a worker is available again, a queued message can be passed to it Unavailable / processing Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module Redis/GT.M Available Node.js Worker Process Custom Worker Module Redis/GT.M
  • 28. Copyright © 2016 M/Gateway Developments Ltd QEWD Architecture Master Node.js Process Queue Queue processor/ dispatcher Finished Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module Redis/GT.M A user's handler function signals completion using the function: finished(responseObject); This returns the response object to the master process
  • 29. Copyright © 2016 M/Gateway Developments Ltd QEWD Architecture Master Node.js Process Queue Queue processor/ dispatcher Finished Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module Node.js Worker Process Custom Worker Module Redis/GT.M And the response is passed to Express which returns it to the client that sent the original request
  • 30. Copyright © 2016 M/Gateway Developments Ltd QEWD Architecture Master Node.js Process Queue Queue processor/ dispatcher Available Node.js Worker Process Custom Worker Module Redis/GT.M The finished() function also automatically returns the worker process back to the available pool So it can now handle the next queued request
  • 31. Copyright © 2016 M/Gateway Developments Ltd QEWD Architecture Master Node.js Process Queue Queue processor/ dispatcher Available Node.js Worker Process Custom Worker Module Redis/GT.M Worker processes, once started, are persistent No start-up / tear-down cost Workers will automatically close themselves down if they are inactive for more than a pre-set threshold time period
  • 32. Copyright © 2016 M/Gateway Developments Ltd QEWD Architecture Master Node.js Process Queue Queue processor/ dispatcher Available Node.js Worker Process Custom Worker Module Redis/GT.M Worker processes only handle a single request at a time Completely isolated run-time environment for handler functions No need for concerns about Node.js concurrency, so synchronous APIs can be used
  • 33. Copyright © 2016 M/Gateway Developments Ltd QEWD Architecture Master Node.js Process Queue Queue processor/ dispatcher Available Node.js Worker Process Custom Worker Module Redis/GT.M Long-running or CPU-intensive logic has no direct impact on other worker processes
  • 34. Copyright © 2016 M/Gateway Developments Ltd QEWD Architecture Master Node.js Process Queue Queue processor/ dispatcher Node.js concurrency is handled by the master process. 100% asynchronous logic The master process does almost nothing No CPU-intensive or long- running tasks, so very high-performance All the work happens in the isolated worker processes Multiple Concurrent Incoming REST requests
  • 35. Copyright © 2016 M/Gateway Developments Ltd qewd-ripple Session Management • Everything begins with receipt of /api/initialise request, sent from the Ripple UI
  • 36. Copyright © 2016 M/Gateway Developments Ltd The /api/initialise API • If: – qewd-ripple is running in demo mode; and – this is the first time the browser has connected • Then: – the middle tier starts a new QEWD Session which creates a token • The token is a random uuid-formatted string – A hard-coded set of user credentials are stored in the Session (an IDCR-mode user) – The Session token is returned in the response to the UI • The UI stores this as a cookie named JSESSIONID – All subsequent requests will include this cookie
  • 37. Copyright © 2016 M/Gateway Developments Ltd qewd-ripple Session Management • If: – qewd-ripple is running in secure mode; and – this is the first time the browser has connected • Then: – the middle tier passes control to Auth0 – User logs in via Auth0 – If successful, the credentials are passed back to qewd-ripple – qewd-ripple creates a new QEWD Session and saves the credentials in the user's Session – The Session token is returned in the response to the UI • The UI stores this as a cookie named JSESSIONID
  • 38. Copyright © 2016 M/Gateway Developments Ltd The /api/initialise API • If: – The request includes a JSESSIONID cookie containing a currently valid, unexpired QEWD Session token • Then: – the middle tier returns an OK response that also tells the UI the user's mode: • IDCR or PHR
  • 39. Copyright © 2016 M/Gateway Developments Ltd qewd-ripple Session Management • On successful receipt of the /api/initialise response, the UI issues an /api/user request – This request will now include the JSESSIONID cookie • So qewd-ripple can identify the user's Session • The middle tier retrieves the user's credentials from the Session and returns them to the UI • The UI can now display the user's details
  • 40. Copyright © 2016 M/Gateway Developments Ltd qewd-ripple Session Management • The UI can now start issuing its REST APIs to the middle tier • Every request will include the JSESSIONID cookie which contains the user's QEWD Session token, allowing the request's handler to access the user's QEWD Session: – To retrieve data – To cache data
  • 41. Copyright © 2016 M/Gateway Developments Ltd Accessing OpenEHR Servers Browser QEWD GT.M or Redis ewd-qoper8 queue qewd-ripple Module Express Worker PulseTile UI REST/ HTTP Incoming request for some patient heading data eg Allergies
  • 42. Copyright © 2016 M/Gateway Developments Ltd Accessing OpenEHR Servers Browser QEWD GT.M or Redis ewd-session ewd-qoper8 queue qewd-ripple Module Express Worker PulseTile UI Is the allergies data in the user's QEWD Session storage?
  • 43. Copyright © 2016 M/Gateway Developments Ltd Accessing OpenEHR Servers Browser QEWD GT.M or Redis ewd-session ewd-qoper8 queue qewd-ripple Module Express Worker PulseTile UI Is the allergies data in the user's QEWD Session storage? No
  • 44. Copyright © 2016 M/Gateway Developments Ltd Accessing OpenEHR Servers Browser QEWD GT.M or Redis ewd-qoper8 queue qewd-ripple Module Express OpenEHR Server AQL over HTTP(S) Worker PulseTile UI OpenEHR Server Fetch the allergies data from the OpenEHR servers
  • 45. Copyright © 2016 M/Gateway Developments Ltd Accessing OpenEHR Servers Browser QEWD GT.M or Redis ewd-qoper8 queue qewd-ripple Module Express OpenEHR Server HTTP(S) Worker PulseTile UI OpenEHR Server And save it in the user's QEWD Session storage ewd-session
  • 46. Copyright © 2016 M/Gateway Developments Ltd Accessing OpenEHR Servers Browser QEWD GT.M or Redis ewd-session ewd-qoper8 queue qewd-ripple Module Express Worker PulseTile UI Repeat the logic… Is the allergies data in the user's QEWD Session storage?
  • 47. Copyright © 2016 M/Gateway Developments Ltd Accessing OpenEHR Servers Browser QEWD GT.M or Redis ewd-session ewd-qoper8 queue qewd-ripple Module Express Worker PulseTile UI Repeat the logic… Is the allergies data in the user's QEWD Session storage? Yes
  • 48. Copyright © 2016 M/Gateway Developments Ltd Accessing OpenEHR Servers Browser QEWD GT.M or Redis ewd-session ewd-qoper8 queue qewd-ripple Module Express Worker PulseTile UI Return it to the Browser that made The request Map OpenEHR field-names to UI field-names
  • 49. Copyright © 2016 M/Gateway Developments Ltd Accessing OpenEHR Servers Browser QEWD GT.M or Redis ewd-qoper8 queue qewd-ripple Module Express Worker PulseTile UI REST/ HTTP If a later request arrives from this user for Allergies data
  • 50. Copyright © 2016 M/Gateway Developments Ltd Accessing OpenEHR Servers Browser QEWD GT.M or Redis ewd-session ewd-qoper8 queue qewd-ripple Module Express Worker PulseTile UI Is the allergies data in the user's QEWD Session storage? Yes
  • 51. Copyright © 2016 M/Gateway Developments Ltd Accessing OpenEHR Servers Browser QEWD GT.M or Redis ewd-session ewd-qoper8 queue qewd-ripple Module Express Worker PulseTile UI Return it to the Browser that made The request Map OpenEHR field-names to UI field-names
  • 52. Copyright © 2016 M/Gateway Developments Ltd QEWD Session = Headings Cache • Each user's QEWD Session acts as a high-performance cache of headings data – Minimises "round-trips" to OpenEHR servers • QEWD Session storage: – Persistent JSON storage – Document database – GT.M and Redis behave identically as far as qewd-ripple is concerned