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
|
||
|
});
|
||
|
}}}
|