W3gram Server
This is a node.js server for the W3gram push notification protocol.
The server was designed to be deployed to Heroku using free resources, so it fits in a single dyno. The code has great test coverage using mocha.
Easy Setup
Click the ''Deploy to Heroku'' button at the top of this page to create your own W3gram server running on Heroku. Don't worry, the project only uses free add-ons!
Get your server's MAK and store it somewhere safely.
curl -i https://w3gram-test.herokuapp.com/mak # Response example: # { "mak": "G-TPkmtKOczXx203po1NblklXsK5OXUylUOGkQUxRQk" }
Create an application and note its API key and secret.
curl -i -X POST -H 'Content-Type: application/json' \ -d '{"mak": "G-TPkmtKOczXx203po1NblklXsK5OXUylUOGkQUxRQk", "app": { "name": "Testing", "origin": "*"}}' \ https://w3gram-test.herokuapp.com/apps # Response example: # { # "key":"uUJPS3zgIpQjDnxn", # "secret":"7cAXyVAYEhRbQ0UFCFI4qJAWOmXLZaPC1xX6niNIxCE", # "origin":"*", # "name":"Testing" # }
Manual Interaction Example
Create a token for a device ID.
echo -n "device-id|my-tablet" | \ openssl dgst -sha256 -hmac "7cAXyVAYEhRbQ0UFCFI4qJAWOmXLZaPC1xX6niNIxCE" \ -binary | base64 # Output example: # EVwwWmwiIfLbTDV8OWsHVc4r/p2WUpKXIJcXCdtoFxM
Register the device.
curl -i -X POST -H 'Content-Type: application/json' \ -d '{"app": "uUJPS3zgIpQjDnxn", "device": "my-tablet", "token": "EVwwWmwiIfLbTDV8OWsHVc4r_p2WUpKXIJcXCdtoFxM"}' \ https://w3gram-test.herokuapp.com/register # Response example: # { # "push":"https://w3gram-test.herokuapp.com/push/1.my-tablet.WMF5TISqRYYkUr5GJWunmP40FvXI1yU_Qb5kXc907TY", # "route":"https://w3gram-test.herokuapp.com/route/1.my-tablet.HwVTM_07vSbHzrQHCBeHeLygUuvm5esJa2yzOjwmJwQ" # }
Do the routing step.
curl -i -X POST -H 'Content-Type: application/json' -d '{}' \ https://w3gram-test.herokuapp.com/route/1.my-tablet.WMF5TISqRYYkUr5GJWunmP40FvXI1yU_Qb5kXc907TY # Response example: # { # "listen":"wss://w3gram-test.herokuapp.com/ws/1.my-tablet.HwVTM_07vSbHzrQHCBeHeLygUuvm5esJa2yzOjwmJwQ" # }
Start a WebSocket connection:
wscat -c "wss://w3gram-test.herokuapp.com/ws/1.my-tablet.HwVTM_07vSbHzrQHCBeHeLygUuvm5esJa2yzOjwmJwQ"
Send a notification:
curl -i -X POST -H 'Content-Type: application/json' \ -d '{"receiver": "1.my-tablet.WMF5TISqRYYkUr5GJWunmP40FvXI1yU_Qb5kXc907TY", "message": { "data": "Hello push world" } }' \ https://w3gram-test.herokuapp.com/push
Development Setup
Install all dependencies and create PostgreSQL database for development and testing.
npm installcreatedb w3gram_testcreatedb w3gram_dev
Run the server in development mode.
PORT=3100 npm start
For development, it can be handy to create an application whose key and secret matches pre-defined values.
curl -i -X POST -H 'Content-Type: application/json' \ -d '{"mak": "dev-mak", "app": { "name": "Testing", "origin": "*", "key": "fixed-key", "secret": "fixed-secret" }}' \ http://localhost:3100/apps # Response example: # { # "key":"fixed-key", # "secret":"fixed-secret", # "origin":"*", # "name":"Testing" # }
License
This project is Copyright (c) 2014 Victor Costan, and distributed under the MIT License.