|
- # frozen_string_literal: true
- require_relative "aries/version"
- require_relative "aries/database"
-
- require "json"
- require "socket"
- # require "profile"
-
- module Aries
- class Error < StandardError; end
- # Your code goes here...
-
- def self.action callable
- begin
- [callable.call, nil]
- rescue => e
- pp e.backtrace << e
- [nil, e]
- end
- end
-
- def self.valid? commands
- for command in commands
- command.keys.each do |k|
- if ! ["add", "find", "first", "last"].include? k
- return [nil, "Undefined command key '#{k}'"]
- end
- end
- end
-
- return [true, nil]
- end
-
- host = "localhost"
- port = 1234
- server = TCPServer.new host, port
-
- puts "Server started, listening #{host}:#{port}"
-
- dbs = {}
- db_factory = lambda do |n|
- if ! dbs.keys.include? n
- dbs[n] = Database.new n
- puts "Initialized database #{n}"
- end
-
- dbs[n]
- end
-
- # ticker thread
- Thread.new do
- limit = 60 * 10
- loop do
- dbs.keys.each do |n|
- db = dbs[n]
- if db.used_at and ((db.used_at.to_i + limit) < Time.now.to_i)
- puts "Closing database #{n} it was last used more than #{limit} seconds ago"
- dbs.delete n
- puts "Closed database #{n}"
- end
- end
- sleep 1
- end
- end
-
- loop do
- Thread.start server.accept do |client|
- # client = server.accept
-
- connection = JSON.parse(client.gets)
- db = db_factory.call connection['database']
-
- # client.puts "Connected to Aries"
- puts "Client connected #{client}"
-
- while commands = client.gets
- commands, err = action -> { JSON.parse commands }
-
- if ! err.nil?
- client.puts JSON.generate(err: err)
- next
- end
-
- _, err = valid? commands
-
- if ! err.nil?
- client.puts JSON.generate(err: err)
- next
- end
-
- results = {}
- commands.each_with_index do |command, idx|
-
- func, vals = command.to_a.first
- begin
- results[idx] = db.send(func, vals)
- db.used_at = Time.now.to_i
- rescue => e
- pp [e.backtrace << e]
- results = {err: e}
- break
- end
- end
-
- client.puts JSON.generate(results)
- end
-
- client.close
- puts "Client disconnected #{client}"
- end
- end
-
- end
|