forked from cory/tildefriends
		
	
		
			
	
	
		
			62 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			62 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|  | = SandboxOS App Development Guide = | ||
|  | This is a brief introduction on developing SandboxOS apps targeted at people who are already familiar with web development. | ||
|  | 
 | ||
|  | == Packages == | ||
|  | A package is a directory of files.  '''package.json''' is the only file with special meaning. | ||
|  | 
 | ||
|  | Here is an example package.json: | ||
|  | {{{ | ||
|  | #!json | ||
|  | { | ||
|  | 	"name": "chat", | ||
|  | 	"start": "backend.js", | ||
|  | 	"imports": ["auth", "httpd", "filesystem"], | ||
|  | 	"href": "/chat", | ||
|  | 	"description": "A basic multi-user chat example." | ||
|  | } | ||
|  | }}} | ||
|  | 
 | ||
|  |  * '''name''': identifies the package.  If it is not unique, any existing installed package of the same name will be replaced when installing the package. | ||
|  |  * '''start''': specifies the JavaScript file which is the entry point of the task.  When a new process is started for this package, this script is executed within it. | ||
|  |  * '''imports''': list of package/task names which this package wants to be able to access. | ||
|  |  * '''href''': link to the task's entry page used by [/tasks /tasks]. | ||
|  |  * '''description''': human-readable description of the package, displayed by [/tasks /tasks]. | ||
|  | 
 | ||
|  | == Promises == | ||
|  | 
 | ||
|  | JavaScript promises are used heavily.  Invoking any method on another task will return a Promise object.  Execution will return immediately but go asynchronous.  That usually looks like this: | ||
|  | {{{ | ||
|  | #!javascript | ||
|  | imports.email.sendMessage(message).then(function(result) { | ||
|  | 	// When sendMessage completes, result is the return value. | ||
|  | }).catch(function(error) { | ||
|  | 	// If sendMessage fails (or calling it somehow fails), error is the reason. | ||
|  | }); | ||
|  | // sendMessage returns immediately and execution continues on. | ||
|  | }}} | ||
|  | 
 | ||
|  | This is a completely inadequate explanation of the nuances involved, but it's a starting point.  Promises can be created and chained and combined in interesting ways. | ||
|  | 
 | ||
|  | == Inter-Task Communication == | ||
|  | Tasks have access to the exported functions on any task declared in their package imports. | ||
|  | 
 | ||
|  | In addition, functions passed between tasks can be called by the receiving task or passed along further. | ||
|  | 
 | ||
|  | Here is an untested, made-up example with two hypothetical tasks, '''math''' and '''test''': | ||
|  | 
 | ||
|  | '''math.js''': | ||
|  | {{{ | ||
|  | #!javascript | ||
|  | exports = { | ||
|  | 	sum: function(a, b) { return a + b; }, | ||
|  | 	multiply: function(a, b) { return a * b; }, | ||
|  | }; | ||
|  | }}} | ||
|  | 
 | ||
|  | '''test.js''': | ||
|  | {{{ | ||
|  | #!javascript | ||
|  | imports.math.sum(4, 5).then(function(result) { | ||
|  | 	// result === 9 | ||
|  | }); | ||
|  | }}} |