Giter Site home page Giter Site logo

chat's Introduction

chat

Build Status codecov Code Climate Dependency Status devDependency Status

try it: https://dwyl.s3.amazonaws.com/index.html

Why?

there-is-no-cloud-1920

This repo is designed as a showcase for how to build apps that scale.

We have built chat example apps a couple of times before and the response has been good,
this time our mission is to operate within a very tight set of constraints:

  1. No Servers
  2. Progressive Enhancement (Works when JavaScript is OFF!)
  3. Precisely Predictable (Linear) Performance

What?

Chat. Probably the simplest and easiets to scale implementation you will see ...
unless you work for {{ insert name of silicon valley unicorn messenger app here }}.

How?

Lambda

https://aws.amazon.com/lambda/

S3

We use S3 to render our initial page and host all our static content. https://aws.amazon.com/s3/

API Gateway

API Gateway routes the requests we make from the front-end through to the Lambda function that will process it.

Body Mapping Templates

In order to allow the data submitted by the client to flow through to the Lambda we need to define a "Body Mapping Template".

application/json Body Mapping Template:
{
  ## extract all params in body as JSON;
  "body": $input.json('$'),
  "context" : {
    "method" : "$context.httpMethod",
    "path" : "$context.resourcePath",
    "stage" : "$context.stage",
    "source_ip" : "$context.identity.sourceIp",
    "user_agent" : "$context.identity.userAgent",
    "user_arn" : "$context.identity.userArn",
    "request_id" : "$context.requestId",
    "resource_id" : "$context.resourceId"
  },
  "headers": {
    #foreach($param in $input.params().header.keySet())
    "$param": "$util.escapeJavaScript($input.params().header.get($param))" #if($foreach.hasNext),#end
    #end
  }
}

Once Body Mapping Template is enabled, test using curl:

curl -v -H "Content-Type: application/json" -X POST -d '{"m":"Hello World!","n":"yourname","t":"123456"}' https://r09u5uw11g.execute-api.eu-west-1.amazonaws.com/prod/savemessage

With Authorization Header:

curl -v -H "Content-Type: application/json" -X POST -d '{"m":"1348","n":"yourname","t":"12345678"}' -H "Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwibmFtZSI6IkFudGhvbnkgVmFsaWQgVXNlciIsImlhdCI6MTQyNTQ3MzUzNX0.KA68l60mjiC8EXaC2odnjFwdIDxE__iDu5RwLdN1F2A" https://r09u5uw11g.execute-api.eu-west-1.amazonaws.com/prod/savemessage

GET messages:

curl https://r09u5uw11g.execute-api.eu-west-1.amazonaws.com/prod/chat

curl -v -H "Content-Type: application/json" -X POST -d '{"m":"Hello World!","n":"yourname","t":"123456"}' https://r09u5uw11g.execute-api.eu-west-1.amazonaws.com/prod/chat

IOT

WebRTC?

Over 50% of browsers (Firefox & Chrome) which means we can cut-out paying for IOT messages for the people who are using good browsers.

http://caniuse.com/#feat=rtcpeerconnection

This also means when we use Electron

How much ($£€) ?

How much does all of this cost...?

Let's break down the cost in the order of the Tech Stack.

S3

https://aws.amazon.com/s3/pricing/

API Gateway

https://aws.amazon.com/api-gateway/pricing/

What is a read/write capacity unit? http://aws.amazon.com/dynamodb/faqs/#What_is_a_readwrite_capacity_unit

Lambda

https://aws.amazon.com/lambda/pricing/

DynamoDB

https://aws.amazon.com/dynamodb/pricing/

Cognito

Amazon Cognito costs $0.15 for each 10,000 sync operations and $0.15 per GB of sync store per month.

https://aws.amazon.com/cognito/pricing/

IOT

$5 per million messages.

A message is a 512-byte block of data processed by AWS IoT – either published to or delivered by the Service. For example, a 900-byte payload is billed as two messages.

https://aws.amazon.com/iot/pricing/

Background Reading

Learning by Doing

Discussion

We considered using S3 as our primary data store, but soon realized its not that "simple"... see: Why does S3 still not support Appending? https://news.ycombinator.com/item?id=10746969

chat's People

Contributors

nelsonic avatar iteles avatar alanshaw avatar

Watchers

James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.