Giter Club home page Giter Club logo

changes-stream-rust's Introduction

changes-stream-rust

travis badge

an implementation of changes-stream in Rust.

this code reads in a readable stream from an endpoint and returns each chunk in JSON.

this code works off of the tokio branch of hyper to take advantage of new Rust Futures.

changes-stream-rust only works on nightly because it uses serde.

usage

in your Cargo.toml:

[dependencies]
changes-stream = { git = "https://github.com/ashleygwilliams/changes-stream-rust.git" }

from examples/follower.rs:

extern crate changes_stream;
extern crate futures;

use std::io;
use std::io::Write;

use changes_stream::ChangesStream;

fn main() {
    let url = "https://replicate.npmjs.com/_changes".to_string();
    let mut changes = ChangesStream::new(url);

    changes.on(|change| {
        io::stdout().write_all(&change).unwrap();
    });

    changes.run();
}

changes-stream-rust's People

Contributors

ashleygwilliams avatar ceejbot avatar steveklabnik avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

changes-stream-rust's Issues

design question: external reactor

Heya, newbie question here. I was wondering why you chose to bundle in the event loop inside the lib instead of taking in an external event loop. I know this was impossible in mio (at least I tried and failed), but was kinda hoping it'd be possible with tokio.

E.g. instead of this:

fn main() {
    let url = "https://replicate.npmjs.com/_changes".to_string();
    let mut changes = ChangesStream::new(url);

    changes.on(|change| {
        io::stdout().write_all(&change).unwrap();
    });

    changes.run();
}

I figured it'd be neat to be able to do this:

fn main() {
  let url = "https://replicate.npmjs.com/_changes".to_string();
  let mut changes = ChangesStream::new(url);
  let mut core = reactor::Core::new()

  changes.on(|change| {
    // And now for example we could use the same
    // core to do all sorts of timer stuff in here.
    io::stdout().write_all(&change).unwrap();
  });

  // slightly assuming core is able to run multiple things
  // and not just a single program; it'd be kinda moot otherwise hah
  core.run(changes);
}

I don't know; coming from Node I think I'm just very used to having a single event loop onto which all IO is attached; I was wondering if you'd have thoughts on this. Thanks heaps! โœจ

support options

{
  db: 'http://localhost:5984/my_db', // full database URL
  feed: 'continuous', // Can also be longpoll technically but not currently implemented
  filter: 'docs/whatever', // Can be a defined couchdb view, a local filter function or an array of IDs
  inactivity_ms: 60 * 60 * 1000, // time allow inactivity before retrying request
  timeout: undefined, // How long couchdb should wait for a change to show up before closing the feed. in milliseconds
  requestTimeout: 2 * 60 * 1000, // http timeout
  agent: undefined, // http agent
  since: 0, // update sequence to start from, 'now' will start it from latest
  heartbeat: 30 * 1000, // how often we want couchdb to send us a heartbeat message
  style: 'main_only', // specifies how many revisions returned all_docs would return leaf revs
  include_docs: false, // whether or not we want to return the full document as a property
  query_params: {}, // custom arbitrary params to send in request e.g. { hello: 'world' }
  use_post: false // switch the default HTTP method to POST (cannot be used with a filter array)
}

Refactoring: remove the option dance

We introduced Option here because we used to have a single handler, and so there was no way to say "zero or one handler". But now that we have a vector of handlers, an empty vector works as the empty state. So the Option can be straight-up removed.

typed chunks

use a type to guarantee that a "change" is a full "change" as expected

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.