Jump To …
READMEsrc / lib / InternalSocket.coffeesrc / lib / Component.coffeesrc / lib / Server.coffeesrc / lib / Fbp.coffeesrc / lib / Graph.coffeesrc / lib / Port.coffeesrc / lib / NoFlo.coffeesrc / lib / Utils.coffeesrc / lib / ArrayPort.coffeesrc / lib / shell.coffeesrc / bin / noflo.coffeesrc / components / GroupByPacket.coffeesrc / components / ParseJson.coffeesrc / components / Merge.coffeesrc / components / ReadDocument.coffeesrc / components / ScrapeHtml.coffeesrc / components / ParseXml.coffeesrc / components / SliceArray.coffeesrc / components / SetPropertyValue.coffeesrc / components / ReadDir.coffeesrc / components / Graph.coffeesrc / components / DuplicateProperty.coffeesrc / components / ReadFileRaw.coffeesrc / components / HTTP / Server.coffeesrc / components / HTTP / BasicAuth.coffeesrc / components / HTTP / SendResponse.coffeesrc / components / HTTP / WriteResponse.coffeesrc / components / HTTP / Profiler.coffeesrc / components / Counter.coffeesrc / components / Template.coffeesrc / components / SetProperty.coffeesrc / components / Replace.coffeesrc / components / WebService / CouchDB / ReadDocument.coffeesrc / components / WebService / CouchDB / GetChanges.coffeesrc / components / WebService / CouchDB / WriteDocument.coffeesrc / components / WebService / CouchDB / OpenDatabase.coffeesrc / components / WebService / CouchDB / ReadDocumentAttachment.coffeesrc / components / WebService / Basecamp / ReadHours.coffeesrc / components / WebService / Basecamp / BasecampComponent.coffeesrc / components / WebService / Basecamp / ConvertToJson.coffeesrc / components / WebService / Basecamp / ReadProjects.coffeesrc / components / WebService / Basecamp / ReadTaskLists.coffeesrc / components / WebService / Basecamp / ReadProjectHours.coffeesrc / components / WebService / Basecamp / ReadTasks.coffeesrc / components / WebService / Basecamp / ReadProject.coffeesrc / components / GetObjectKey.coffeesrc / components / RemoveGroups.coffeesrc / components / UniquePacket.coffeesrc / components / CreateDate.coffeesrc / components / Split.coffeesrc / components / Kick.coffeesrc / components / Output.coffeesrc / components / Callback.coffeesrc / components / GroupByObjectKey.coffeesrc / components / RemoveProperty.coffeesrc / components / MapGroup.coffeesrc / components / WriteFileRaw.coffeesrc / components / UniqueArray.coffeesrc / components / FilterPropertyValue.coffeesrc / components / MapPropertyValue.coffeesrc / components / SplitArray.coffeesrc / components / Stat.coffeesrc / components / FilterProperty.coffeesrc / components / FlattenObject.coffeesrc / components / CreateObject.coffeesrc / components / SplitStr.coffeesrc / components / Base64Encode.coffeesrc / components / ReadFile.coffeesrc / components / MapProperty.coffeesrc / components / PropertiesToObjects.coffeesrc / components / CollectGroups.coffee

GetChanges.coffee

src/components/WebService/CouchDB/
noflo = require "noflo"

class GetChanges extends noflo.Component
    constructor: ->
        @connection = null
        @options = null
        @defaults =
            feed: "continuous"
            heartbeat: 1000
        @request = null
        @streamData = ""

        @inPorts =
            connection: new noflo.Port()
            option: new noflo.ArrayPort()
        @outPorts =
            out: new noflo.ArrayPort()

        @inPorts.connection.on "data", (data) =>
            @connection = data
            do @getChanges if @options

        @inPorts.option.on "data", (data) =>
            @setOption data
            do @getChanges if @connection

    setOption: (option) ->
        if typeof option is "object"
            @options = option
            return

        @options = @defaults unless @options
        optionParts = option.split "="
        @options[optionParts[0]] = optionParts[1]

    getQuery: ->
        queries = []
        for key, value of @options
            queries.push "#{key}=#{value}"
        return "?#{queries.join('&')}"

    streamToLines: () ->
        newline = @streamData.indexOf "\n"
        return if newline is -1
        
        line = @streamData.substr(0, newline).trim()
        @streamData = @streamData.substr newline + 1

        if line.length
            @outPorts.out.send JSON.parse line

        do @streamToLines

    getChanges: ->
        do @request.end if @request

        url = "#{@connection.uri.pathname}/_changes/#{@getQuery()}"
        @request = @connection.request "GET", url
        @request.on "data", (data) =>
            @streamData += data
            do @streamToLines

        @request.on "end", =>

TODO: Try to reconnect?

            @outPorts.out.disconnect() 

exports.getComponent = -> new GetChanges

generated Tue Apr 03 2012 15:29:54 GMT+0200 (CEST)
NoFlo