2023-09-06 20:40:43 -04:00
|
|
|
export const docs = {};
|
|
|
|
|
2023-09-13 19:00:47 -04:00
|
|
|
docs.global = `# Tilde Friends API Documentation
|
|
|
|
|
|
|
|
Welcome to the Tilde Friends API documentation.
|
|
|
|
|
|
|
|
* [App Globals](#App_Globals)
|
|
|
|
* [Database Interface](#Database)
|
|
|
|
* [Remote Procedure Calls](#tfrpc)
|
|
|
|
|
|
|
|
<a id="App_Globals"></a>
|
|
|
|
## <span style="color: #aaf">App Globals</span>
|
2023-09-06 20:40:43 -04:00
|
|
|
The following are functions and values exposed to all apps in their \`app.js\` or \`handler.js\`. Most
|
|
|
|
of these are asynchronous, returning a \`Promise\` that will be resolved when the call completes, unless
|
|
|
|
noted otherwise.
|
|
|
|
|
|
|
|
This is all a work in progess. These are liable to change without warning. Feedback is welcome.
|
|
|
|
|
|
|
|
The exposed functions in this API balance multiple competing needs:
|
2023-09-13 19:00:47 -04:00
|
|
|
* The surface area of the exposed API ought to be fairly minimal. If something can be implemented entirely app-side, that is
|
2023-09-06 20:40:43 -04:00
|
|
|
generally preferred over building it into the core.
|
|
|
|
* Everything is built on this API. Ideally the admin app, the SSB app, and the editor all use standard API exposed to all
|
|
|
|
apps, with appropriate permission guards in place making it so that only trusted apps do potentially destructive operations.
|
|
|
|
There will be some things here that aren't necessarily general use to support what's required.
|
2023-09-13 19:00:47 -04:00
|
|
|
|
|
|
|
If you are looking at the [Tilde Friends source code](https://www.tildefriends.net/~cory/releases/),
|
|
|
|
the vast majority of these are implemented in \`src/*.js.c\` files, and exposed to apps via \`core/core.js\`.
|
2023-09-06 20:40:43 -04:00
|
|
|
`;
|
|
|
|
|
|
|
|
docs['core.user.credentials.session.name'] = `
|
|
|
|
*String* The name of the authenticated user.
|
|
|
|
`;
|
|
|
|
|
|
|
|
docs['app.setDocument()'] = `
|
|
|
|
Set the contents of the client <iframe/>.
|
|
|
|
### Parameters
|
|
|
|
* *String* **html** The HTML contents.
|
|
|
|
`;
|
|
|
|
|
2023-10-04 20:24:33 -04:00
|
|
|
docs['core.apps()'] = `
|
|
|
|
Gets a list of apps owned by the current user.
|
|
|
|
### Returns
|
|
|
|
*Array* An array of string names of the apps owned by the current user.
|
|
|
|
`;
|
|
|
|
|
|
|
|
docs['core.url'] = `
|
|
|
|
The url by which the running app is being invoked.
|
|
|
|
`;
|
|
|
|
|
|
|
|
docs['app.localStorageSet()'] = `
|
|
|
|
Set a value in browser local storage.
|
|
|
|
### Parameters
|
|
|
|
*String* **key** The localStorage key to set.
|
|
|
|
*String* **value** The localStorage value to set.
|
|
|
|
`;
|
|
|
|
|
|
|
|
docs['app.localStorageGet()'] = `
|
|
|
|
Gets a value from browser local storage.
|
|
|
|
### Parameters
|
|
|
|
*String* **key** The key with which the value was set.
|
|
|
|
### Returns
|
|
|
|
*String* The value, or undefined.
|
|
|
|
`;
|
|
|
|
|
|
|
|
docs['app.print()'] = `
|
|
|
|
Log information for debugging purposes to the server and to the connected browser console.
|
|
|
|
### Parameters
|
|
|
|
* ... Any args to print.
|
|
|
|
`;
|
|
|
|
|
|
|
|
docs['ssb.createIdentity()'] = `
|
|
|
|
Create a new SSB identity.
|
|
|
|
### Returns
|
|
|
|
*String* The created identity public key.
|
|
|
|
`;
|
|
|
|
|
|
|
|
docs['ssb.getIdentities()'] = `
|
|
|
|
Get all SSB identities owned by the current user.
|
|
|
|
### Returns
|
|
|
|
*Array* An array of public key strings.
|
|
|
|
`;
|
|
|
|
|
2023-09-06 20:40:43 -04:00
|
|
|
docs['ssb.sqlAsync()'] = `
|
|
|
|
Run an SQL query against the sqlite database.
|
|
|
|
### Parameters
|
|
|
|
* *String* **query** The sqlite query.
|
|
|
|
* *Array* **args** The query arguments to bind.
|
|
|
|
* *Function* **callback** Callback called for each row result.
|
|
|
|
`;
|
|
|
|
|
|
|
|
docs['ssb.appendMessageWithIdentity()'] = `
|
|
|
|
Signs and stores a message in the SSB database.
|
|
|
|
### Parameters
|
|
|
|
* *String* **id** The public key of an SSB identity owned by the authenticated user.
|
|
|
|
* *Object* **message** The unsigned message.
|
|
|
|
`;
|
|
|
|
|
|
|
|
docs['ssb.storeMessage()'] = `
|
|
|
|
Verifies and stores a signed message in the SSB database.
|
|
|
|
### Parameters
|
|
|
|
* *Object* **message** The valid, signed message to store.
|
|
|
|
`;
|
|
|
|
|
|
|
|
docs['ssb.blobStore()'] = `
|
|
|
|
Store a blob in the SSB database.
|
|
|
|
### Parameters
|
|
|
|
* *String*/*Uint8Array* **blob** The blob contents to store
|
|
|
|
### Returns
|
|
|
|
*String* The stored blob ID.
|
|
|
|
`;
|
|
|
|
|
2023-09-13 19:00:47 -04:00
|
|
|
docs['ssb.blobGet()'] = `
|
|
|
|
Fetches a blob from the database.
|
|
|
|
### Parameters
|
|
|
|
* *String* **blob_id** The blob identifier to fetch (\`&....sha256\`).
|
|
|
|
### Returns
|
|
|
|
*ArrayBuffer* The blob data.
|
|
|
|
`;
|
|
|
|
|
2023-09-06 20:40:43 -04:00
|
|
|
docs['print()'] = `
|
|
|
|
Log debug information both to the server's console and to the visiting user's browser console when possible.
|
|
|
|
### Parameters
|
|
|
|
* **...** Whatever you want to log. Will be joined with spaces.
|
|
|
|
`;
|
|
|
|
|
|
|
|
docs['database()'] = `
|
|
|
|
Returns a database instance that is specific to the authenticated user and the given key.
|
|
|
|
### Parameters
|
|
|
|
* *String* **key** The database key.
|
|
|
|
### Returns
|
|
|
|
*Database* A database.
|
|
|
|
`;
|
|
|
|
|
|
|
|
docs['my_shared_database()'] = `
|
|
|
|
Returns a database instance that is specific to the authenticated user and the given key.
|
|
|
|
### Parameters
|
|
|
|
* *String* **package_name** The database package name.
|
|
|
|
* *String* **key** The database key.
|
|
|
|
### Returns
|
2023-09-13 19:00:47 -04:00
|
|
|
*Database* A database.
|
2023-09-06 20:40:43 -04:00
|
|
|
`;
|
|
|
|
|
|
|
|
docs['shared_database()'] = `
|
|
|
|
Returns a database instance that is shared between all users of the app, determined by its owner and app name.
|
|
|
|
### Parameters
|
|
|
|
* *String* **key** The database key.
|
|
|
|
### Returns
|
2023-09-13 19:00:47 -04:00
|
|
|
*Database* A database.
|
|
|
|
`;
|
|
|
|
|
|
|
|
docs['base64Decode()'] = `
|
|
|
|
Decode a base64 string to bytes.
|
|
|
|
|
|
|
|
Completes synchronously.
|
|
|
|
### Parameters
|
|
|
|
* *String* value The base64-encoded string.
|
|
|
|
### Returns
|
|
|
|
*Uint8Array* The decoded bytes.
|
2023-09-06 20:40:43 -04:00
|
|
|
`;
|
|
|
|
|
2023-09-13 19:00:47 -04:00
|
|
|
docs['base64Encode()'] = `
|
|
|
|
Encode bytes to a base64 string.
|
|
|
|
|
|
|
|
Completes synchronously.
|
|
|
|
### Parameters
|
|
|
|
* *Uint8Array* The bytes to encode.
|
|
|
|
### Returns
|
|
|
|
*String* The base64-encoded string.
|
|
|
|
`;
|
|
|
|
|
|
|
|
docs['utf8Decode()'] = `
|
2023-09-06 20:40:43 -04:00
|
|
|
Decode UTF-8 bytes to a string.
|
|
|
|
|
|
|
|
Completes synchronously.
|
|
|
|
### Parameters
|
|
|
|
* *Uint8Array* **value** The value to decode.
|
|
|
|
### Returns
|
|
|
|
*String* The value as a string.
|
|
|
|
`;
|
|
|
|
|
2023-09-13 19:00:47 -04:00
|
|
|
docs['utf8Encode()'] = `
|
2023-09-06 20:40:43 -04:00
|
|
|
Encodes a string to UTF-8 bytes.
|
|
|
|
|
|
|
|
Completes synchronously.
|
|
|
|
### Parameters
|
|
|
|
* *String* **value** The value to encode.
|
|
|
|
### Returns
|
|
|
|
*Uint8Array* The encoded \`value\`.
|
|
|
|
`;
|
|
|
|
|
2023-09-13 19:00:47 -04:00
|
|
|
docs['setTimeout()'] = `
|
|
|
|
Call a function after some delay.
|
|
|
|
### Parameters
|
|
|
|
* *Function* **callback** The function to call.
|
|
|
|
* *Number* **timeout** Number of milliseconds to wait before calling the callback function.
|
|
|
|
`;
|
|
|
|
|
|
|
|
docs['parseHttpRequest()'] = `
|
|
|
|
Parses an HTTP request.
|
|
|
|
### Parameters
|
|
|
|
* *Uint8Array* **request** The request data. Maybe be partial or contain extra data. The return value will
|
|
|
|
indicate when and where it is complete.
|
|
|
|
* *Number* **last_length** The length of the data passed on a previous attempt for the same request, or 0 initially.
|
|
|
|
### Returns
|
|
|
|
* *Integer* **-2** if the request is incomplete.
|
|
|
|
* *Integer* **-1** if the request could not be parsed.
|
|
|
|
* *Object* An object with **bytes_parsed**, **minor_version**, **path**, and **headers** fields on successful parse.
|
|
|
|
`;
|
|
|
|
|
|
|
|
docs['parseHttpResponse()'] = `
|
|
|
|
Parses an HTTP response.
|
|
|
|
### Parameters
|
|
|
|
* *Uint8Array* **response** The response data. Maybe be partial or contain extra data. The return value will
|
|
|
|
indicate when and where it is complete.
|
|
|
|
* *Number* **last_length** The length of the data passed on a previous attempt for the same response, or 0 initially.
|
|
|
|
### Returns
|
|
|
|
* *Integer* **-2** if the response is incomplete.
|
|
|
|
* *Integer* **-1** if the response could not be parsed.
|
|
|
|
* *Object* An object with **bytes_parsed**, **minor_version**, **status**, **message**, and **headers** fields on successful parse.
|
|
|
|
`;
|
|
|
|
|
2023-09-06 20:40:43 -04:00
|
|
|
docs['sha1Digest()'] = `
|
|
|
|
Calculates a SHA1 digest.
|
|
|
|
|
|
|
|
Completes synchronously.
|
|
|
|
### Parameters
|
|
|
|
* *String* **value** The value for which to calculate the digest.
|
|
|
|
### Returns
|
|
|
|
*String* The SHA1 digest of UTF-8 encoded \`value\`.
|
|
|
|
`;
|
|
|
|
|
|
|
|
docs['maskBytes()'] = `
|
|
|
|
Masks bytes for WebSocket communication.
|
|
|
|
|
|
|
|
Completes synchronously.
|
|
|
|
### Parameters
|
|
|
|
* *Uint8Array* **bytes** The byte array of data to mask.
|
|
|
|
* *Uint32* **mask** The mask to apply.
|
|
|
|
### Returns
|
|
|
|
*Uint32Array* The masked bytes.
|
|
|
|
`;
|
|
|
|
|
|
|
|
docs['exit()'] = `
|
|
|
|
Exits the app. But why would you want to do that?
|
|
|
|
|
|
|
|
Completes synchronously.
|
|
|
|
### Parameters
|
|
|
|
* *Integer* **exit_code** System exit code.
|
|
|
|
`;
|
|
|
|
|
|
|
|
docs['version()'] = `
|
|
|
|
Gets version information for the running server.
|
|
|
|
### Returns
|
|
|
|
*Object* Keys are things like \`name\` and \`number\` for the server itself and \`libuv\` and \`openssl\` for
|
|
|
|
dependencies. Values are *String* version numbers.
|
|
|
|
`;
|
|
|
|
|
|
|
|
docs['platform()'] = `
|
|
|
|
Gets the host operating system platform of the running server.
|
|
|
|
### Returns
|
|
|
|
*String* The platform, one of \`windows\`, \`android\`, \`linux\`, or \`other\`.
|
|
|
|
`;
|
|
|
|
|
|
|
|
docs['getFile()'] = `
|
|
|
|
Gets a file from the running app.
|
|
|
|
### Parameters
|
|
|
|
* *String* **name** Name of the file to retrieve.
|
|
|
|
### Returns
|
|
|
|
*Uint8Array* The contents of a file from the app with the given name, or *undefined*.
|
|
|
|
`;
|
|
|
|
|
|
|
|
docs.database = `
|
|
|
|
# <span style="color: #aaf">Database</span>
|
|
|
|
Local-only storage is provided by a \`Database\` type representing a key-value store.
|
|
|
|
`;
|
|
|
|
|
|
|
|
docs['database.get()'] = `
|
|
|
|
Gets a value from the database.
|
|
|
|
### Parameters
|
|
|
|
* *String* **key** The key.
|
|
|
|
### Returns
|
|
|
|
*String* The value from the database or undefined if not found.
|
|
|
|
`;
|
|
|
|
|
|
|
|
docs['database.getAll()'] = `
|
|
|
|
Gets all keys from the database.
|
|
|
|
### Returns
|
|
|
|
*Array* An array of *String* key names for all keys in the given database.
|
|
|
|
`;
|
|
|
|
|
|
|
|
docs['database.getLike()'] = `
|
|
|
|
Gets all keys and values from the database matching a pattern.
|
|
|
|
### Parameters
|
|
|
|
* *String* **pattern** An sqlite \`LIKE\` pattern to match keys against.
|
|
|
|
### Returns
|
|
|
|
*Object* An object whose keys are the database keys and values are the database values that match the given pattern.
|
|
|
|
`;
|
|
|
|
|
|
|
|
docs['database.set()'] = `
|
|
|
|
Sets a value in the database, creating a new entry or replacing an existing entry.
|
|
|
|
### Parameters
|
|
|
|
* *String* **key** The key.
|
|
|
|
* *String* **value** The value.
|
|
|
|
`;
|
|
|
|
|
|
|
|
docs['database.exchange()'] = `
|
|
|
|
Performs an atomic compare and exchange operation, setting a value in the database only if its current value matches what is expected.
|
|
|
|
### Parameters
|
|
|
|
* *String* **key** The key.
|
|
|
|
* *String* **expected** The expected value.
|
|
|
|
* *String* **value** The new value.
|
|
|
|
### Returns
|
|
|
|
*Boolean* true if the value is now the given value.
|
|
|
|
`;
|
|
|
|
|
|
|
|
docs['database.remove()'] = `
|
|
|
|
Removes an entry from the database if it exists.
|
|
|
|
### Parameters
|
|
|
|
* *String* **key** The key.
|
|
|
|
`;
|
|
|
|
|
|
|
|
docs.tfrpc = `
|
2023-09-13 19:00:47 -04:00
|
|
|
# <span style="color: #aaf" id="tfrpc">tfrpc</span>
|
2023-09-06 20:40:43 -04:00
|
|
|
\`tfrpc.js\` is a small helper script that is available to be used to facilitate communication between parts of an application.
|
|
|
|
|
2023-09-13 19:00:47 -04:00
|
|
|
\`tfrpc.js\` can be used to asynchronously make calls between the app code running in a sandboxed iframe in the browser
|
|
|
|
and the app process on the server.
|
2023-09-06 20:40:43 -04:00
|
|
|
|
|
|
|
From \`app.js\`:
|
|
|
|
\`\`\`
|
|
|
|
import * as tfrpc from '/tfrpc.js';
|
|
|
|
\`\`\`
|
|
|
|
|
|
|
|
|
|
|
|
From script running in the browser:
|
|
|
|
\`\`\`
|
|
|
|
import * as tfrpc from '/static/tfrpc.js';
|
|
|
|
\`\`\`
|
|
|
|
|
|
|
|
Either side can register or call functions, though they must be registered before they can be called. Arguments and return
|
|
|
|
values are ultimately serialized by means that attempt to preserve most JSON-serializable values as well as functions themselves.
|
|
|
|
`;
|
|
|
|
|
|
|
|
docs['tfrpc.register()'] = `
|
|
|
|
Register a function, allowing it to be called remotely.
|
|
|
|
### Parameters
|
|
|
|
* *Function* **function** The function to register. Its name will be how it will be called.
|
|
|
|
`;
|
|
|
|
|
|
|
|
docs['tfrpc.rpc.*()'] = `
|
|
|
|
Call a remote function.
|
|
|
|
### Parameters
|
|
|
|
* **...** Parameters to pass to the function.
|
|
|
|
### Returns
|
|
|
|
The return value of the called function.
|
|
|
|
`;
|