lib/plezi/common/api.rb in plezi-0.11.2 vs lib/plezi/common/api.rb in plezi-0.12.0

- old
+ new

@@ -3,24 +3,43 @@ module_function # Defines methods used to set up the Plezi app. - # public API to add a service to the framework. - # accepts a Hash object with any of the following options (Hash keys): - # port:: port number. defaults to 3000 or the port specified when the script was called. - # host:: the host name. defaults to any host not explicitly defined (a catch-all). NOTICE: in order to allow for hostname aliases, this is host emulation and the listening socket will bind to all the addresses available. To limit the actual binding use the `:bind` parameter as set by the GReactor's API - in which case host aliases might not work. + # Deprecated. use {Plezi.host}. + def listen parameters = {} + Iodine.warn "listen is deprecated. use `Plezi.host` instead." + host parameters.delete(:host) || :default, parameters + end + + # adds a route to the last server created + def route(path, controller = nil, &block) + ::Plezi::Base::HTTPRouter.add_route path, controller, &block + end + + + # adds a shared route to all existing services and hosts. + def shared_route(path, controller = nil, &block) + ::Plezi::Base::HTTPRouter.add_shared_route path, controller, &block + end + + # public API to add or setup domain names related to the application. + # + # A default host can be created or accessed by using `:default` of false for the host name. + # + # Accepts: + # host_name:: the name (domain name) of the host as a String object. Use the Symbol `:default` for the catch-all domain name. + # + # + # The options is a Hash object with any of the following options (Hash keys): # alias:: a String or an Array of Strings which represent alternative host names (i.e. `alias: ["admin.google.com", "admin.gmail.com"]`). # public:: the public root folder. if this is defined, static files will be served from this folder and all it's sub-folders. Plezi does NOT support file indexing. # assets:: the assets root folder. defaults to nil (no assets support). if the path is defined, assets will be served from `/assets/...` (or the public_asset path defined) before any static files. assets will not be served if the file in the /public/assets folder if up to date (a rendering attempt will be made for systems that allow file writing). # assets_public:: the assets public uri location (uri format, NOT a file path). defaults to `/assets`. `save_assets` will set if assets should be saved to the assets public folder as static files (defaults to false). # assets_callback:: a method that accepts two parameters: (request, response) and renders any custom assets. the method should return `false` unless it had set the response. # save_assets:: saves the rendered assets to the filesystem, under the public folder. defaults to false. # templates:: the templates root folder. defaults to nil (no template support). templates can be rendered by a Controller class, using the `render` method. - # ssl:: if true, an SSL service will be attempted. if no certificate is defined, an attempt will be made to create a self signed certificate. - # ssl_key:: the public key for the SSL service. - # ssl_cert:: the certificate for the SSL service. # # Assets: # # Assets support will render `.sass`, `.scss` and `.coffee` and save them as local files (`.css`, `.css`, and `.js` respectively) # before sending them as static files. @@ -29,111 +48,39 @@ # # templates: # # Plezi's controller.render ERB, Slim and Haml are natively supported. # - # @return [Plezi::Router] + # @return [::Plezi::Base::HTTPRouter] # - def listen parameters = {} - # update default values - parameters[:index_file] ||= 'index.html' - parameters[:assets_public] ||= '/assets' - parameters[:assets_public].chomp! '/' - parameters[:public] ||= parameters[:root] # backwards compatability - puts "Warning: 'root' option is being depracated. use 'public' instead." if parameters[:root] - - # check if the port is used twice. - @routers_locker.synchronize do - @active_router = GRHttp.listen(parameters) - unless @active_router[:upgrade_handler] - @routers << (@active_router[:http_handler] = ::Plezi::Base::HTTPRouter.new) - @active_router[:upgrade_handler] = @active_router[:http_handler].upgrade_proc - else - @active_router.delete :alias - end - @active_router[:http_handler].add_host(parameters[:host], @active_router.merge(parameters) ) - @active_router = @active_router[:http_handler] - end - # return the current handler or the protocol.. - @active_router - end - - # clears all the listeners and routes defined - def clear_app - @routers_locker.synchronize {GReactor.clear_listeners; @routers.clear} - end - # adds a route to the last server created - def route(path, controller = nil, &block) - raise "Must define a listener before adding a route - use `Plezi.listen`." unless @active_router - @routers_locker.synchronize { @active_router.add_route path, controller, &block } - end - - - # adds a shared route to all existing services and hosts. - def shared_route(path, controller = nil, &block) - raise "Must have created at least one Pleze service before calling `shared_route` - use `Plezi.listen`." unless @routers - @routers_locker.synchronize { @routers.each {|r| r.add_shared_route path, controller, &block } } - end - - # adds a host to the last server created - # - # accepts a host name and a parameter(s) Hash which are the same parameter(s) as {Plezi.listen} accepts: def host(host_name, params) - raise "Must define a listener before adding a route - use `Plezi.listen`." unless @active_router - @routers_locker.synchronize { @active_router.add_host host_name, params } + ::Plezi::Base::HTTPRouter.add_host host_name, params end - # starts the Plezi framework server and hangs until the exit signal is given. - def start - start_async - puts "\nPress ^C to exit.\n" - GReactor.join { puts "\r\nStarting shutdown sequesnce. Press ^C to force quit."} - end - - # Makes sure the GRHttp server will be used by Rack (if Rack is available) and disables Plezi's autostart feature. + # This allows you to use the Plezi framework's code inside your existing Rack application - WITHOUT running the actual server. # - # This method is a both a fail safe and a shortcut. Plezi will automatically attempt to diable autostart when discovering Rack - # but this method also makes sure that the GRHttp is set as the Rack server by setting the ENV\["RACK_HANDLER"] variable. - # - # This is used as an alternative to {Plezi.start_placebo}. - # - # Use {Plezi.start_placebo} to augment an existing app while operating Plezi on a different process or server. - # - # Use {Plezi.start_rack} to augment an existing Rack app (i.e. Rails/Sinatra) by loading both Plezi and the existing Rack app - # to the GRHtto server (it will set up GRHttp as the Rack server). - def start_rack - Object.const_set("NO_PLEZI_AUTO_START", true) unless defined?(NO_PLEZI_AUTO_START) - ENV["RACK_HANDLER"] = 'grhttp' - end - # starts the Plezi framework and returns immidiately, - # allowing you to run the Plezi framework along side another framework. - def start_async - Object.const_set("NO_PLEZI_AUTO_START", true) unless defined?(NO_PLEZI_AUTO_START) - return GReactor.start if GReactor.running? - puts "Starting Plezi #{Plezi::VERSION} Services using GRHttp #{GRHttp::VERSION} and GReactor #{GReactor::VERSION}." - GReactor.on_shutdown { puts "Plezi shutdown. It was fun to serve you." } - GReactor.start ::Plezi::Settings.max_threads - end - # This allows you to run the Plezi framework along side another framework - WITHOUT running the actual server. - # # The server will not be initiatet and instead you will be able to use Plezi controllers and the Redis auto-config - # to broadcast Plezi messages to other Plezi processes - allowing for scalable intigration of Plezi into other frameworks. - def start_placebo - GReactor.clear_listeners - redis # make sure the redis connection is activated - puts "* Plezi #{Plezi::VERSION} Services will start with no Server...\n" - start_async + # to broadcast Plezi messages to other Plezi processes - allowing for scalable intigration of Plezi into existing Rack applications. + def start_placebo receiver = nil + # force start Iodine only if Iodine isn't used as the server + if ::Iodine.protocol == ::Iodine::Http::Http1 && (defined?(::Rack) ? (::Rack::Handler.default == ::Iodine::Http::Rack) : true) + # Iodine.info("`start_placebo` is called while using the Iodine server. `start_placebo` directive being ignored.") + return false + end + unless @placebo_initialized + raise "Placebo fatal error: Redis connection failed to load - make sure gem is required and `ENV['PL_REDIS_URL']` is set." unless redis # make sure the redis connection is activated + puts "* Plezi #{Plezi::VERSION} Services will start with no Server...\n" + ::Iodine.protocol = :no_server + Iodine.force_start! + @placebo_initialized = true + end + receiver ? Plezi::Placebo.new(receiver) : true end - # this module contains the methods that are used as a DSL and sets up easy access to the Plezi framework. - # - # use the`listen`, `host` and `route` functions rather then accessing this object. - # - @active_router = nil - @routers_locker = Mutex.new - @routers ||= [].to_set + # deprecation notice + def start_rack + Iodine.warn "`start_rack` is deprecated. There is no need to call this method." + end end Encoding.default_internal = 'utf-8' Encoding.default_external = 'utf-8' - -Object.const_set("NO_PLEZI_AUTO_START", true) if defined?(::Rack::Builder) && !defined?(NO_PLEZI_AUTO_START)