Engine.dcl 4.08 KB
Newer Older
1 2 3 4
definition module iTasks.Engine
/**
* This module provides the iTasks engine.
* This is the primary function that creates the complete
5
* environment in which tasks can be executed.
6 7 8
*/

from Data.Maybe      import :: Maybe
9
from Data.Error      import :: MaybeError
10
from System.FilePath import :: FilePath
11
from System.Time     import :: Timespec
12
from Internet.HTTP   import :: HTTPRequest
13 14 15

import iTasks.WF.Definition

16 17 18 19 20 21 22 23 24 25
/*
* There are two ways tasks can be started:
* Interactively when a user requests it through the web,
* or directly when the application (server) is started,
*/
:: StartableTask
  = WebTask !WebTask
  | StartupTask !StartupTask

:: WebTask =
26
	{ path :: !String
27 28 29 30 31 32 33 34 35 36 37 38
	, task :: !WebTaskWrapper
	}

:: StartupTask =
	{ attributes :: !TaskAttributes 
	, task       :: !TaskWrapper
	}

:: WebTaskWrapper = E.a: WebTaskWrapper (HTTPRequest -> Task a) & iTask a
:: TaskWrapper = E.a: TaskWrapper (Task a) & iTask a

//Utility functions for creating collections of startable tasks
39 40 41 42 43 44 45
//Common cases:
onStartup :: (Task a) -> StartableTask | iTask a
onRequest :: String (Task a) -> StartableTask | iTask a

//Less common cases:
onStartupWithAttributes :: (Task a) TaskAttributes -> StartableTask | iTask a
onRequestFromRequest :: String (HTTPRequest -> Task a) -> StartableTask | iTask a
46

47
publish :== onRequestFromRequest //Backwards compatibility
48 49 50 51 52 53 54 55 56

class Startable a
where
	toStartable :: !a -> [StartableTask]

instance Startable (Task a) | iTask a //Default as web task
instance Startable (HTTPRequest -> Task a) | iTask a //As web task
instance Startable StartableTask
instance Startable [StartableTask]
57
instance Startable (a,b) | Startable a & Startable b
58

59
:: EngineOptions =
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
	{ appName          :: !String
	, appPath          :: !FilePath  //* Location of the application's executable
	, appVersion       :: !String
	, serverPort       :: !Int
	, serverUrl        :: !String
	, allowedHosts     :: ![String]  //* Only allow connections from these hosts (default ["127.0.0.1"])
	, keepaliveTime    :: !Timespec
	, sessionTime      :: !Timespec
	, persistTasks     :: !Bool
	, autoLayout       :: !Bool
	, maxEvents        :: !Int
	, timeout          :: !Maybe Int //* The timeout
	, distributed      :: !Bool
	, sdsPort          :: !Int
	, webDirPath       :: !FilePath  //* Location of public files that are served by the iTask webserver
	, storeDirPath     :: !FilePath  //* Location of the application's persistent data files
	, tempDirPath      :: !FilePath  //* Location for temporary files used in tasks
	, byteCodePath     :: !FilePath  //* Location of the application's bytecode
	, showInstructions :: !Bool      //* Whether instructions to open the browser should be shown
79
	}
80
derive class iTask EngineOptions
81 82

/**
83
* Executes the task framework with a collection of startable task definitions.
84 85 86 87 88
*
* @param Tasks to start
* @param The world
* @return The world
*/
89 90
doTasks :: a !*World -> *World | Startable a
startEngine :== doTasks //Backwards compatibility
91 92 93 94 95 96 97 98

/**
* Starts the task engine with options and a list of published task definitions.
*
* @param Tasks to start
* @param An initialization function to set the engine options with:
      @param The command line arguments
      @param The default options
99 100
      @return When Ok the engine options the engine is not started,
              when Error, a message is printed to the console
101 102 103
* @param The world
* @return The world
*/
Bas Lijnse's avatar
Bas Lijnse committed
104
doTasksWithOptions :: ([String] EngineOptions -> MaybeError [String] (a,EngineOptions)) !*World
105 106 107
	-> *World | Startable a

startEngineWithOptions :== doTasksWithOptions
108 109 110 111 112

/**
* The function that takes the 'standard' command line options of an itask engine and
* shows the default help and startup message
*
113
* Essentially: doTasks = doTasksWithOptions defaultEngineCLIOptions 
114 115 116

* @param The command line arguments
* @param The default options
117 118
* @return When Ok the engine options the engine is not started,
*         when Error, the message to printed to the console
119
*/
Bas Lijnse's avatar
Bas Lijnse committed
120
defaultEngineCLIOptions :: a [String] EngineOptions -> MaybeError [String] (a, EngineOptions)
121 122 123 124 125

/**
* Determines the default options for an application
*/
defaultEngineOptions :: !*World -> (!EngineOptions,!*World)