Skip to content

Instantly share code, notes, and snippets.

@jimsynz
Created January 3, 2012 08:29
Show Gist options
  • Save jimsynz/1554082 to your computer and use it in GitHub Desktop.
Save jimsynz/1554082 to your computer and use it in GitHub Desktop.
attempting to create a fiber based queue.
def handle_request(request)
json_msg = message_from_request(request)
message = JSON.parse(json_msg)
jsonp = request.params['jsonp'] || JSONP_CALLBACK
headers = request.get? ? TYPE_SCRIPT.dup : TYPE_JSON.dup
origin = request.env['HTTP_ORIGIN']
debug 'Received ?: ?', request.env['REQUEST_METHOD'], json_msg
@server.flush_connection(message) if request.get?
headers['Access-Control-Allow-Origin'] = origin if origin
headers['Cache-Control'] = 'no-cache, no-store' if request.get?
r = Fiber.new do
this_fiber = Fiber.current
body = FibreQueue.new(this_fiber)
@server.process(message, false) do |replies|
response = JSON.unparse(replies)
response = "#{ jsonp }(#{ response });" if request.get?
debug 'Returning ?', response
body.push(response)
end
puts "first yield"
Fiber.yield [200, headers, body]
end.resume
#rescue
# [400, TYPE_TEXT, ['Bad request']]
end
class FibreQueue
def initialize(fiber)
@fiber = fiber
@queue = []
@yielding = false
end
def push(element)
@queue << element
@fiber.resume if @yielding
end
def each
if @queue.empty?
@yielding = true
Fiber.yield
@yielding = false
end
yield @queue.delete_at(0)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment