# Webfuse Protocol ## Requests, responses and notifications There are three types of messages, used for communication between webfuse daemon and filesystem provider. All message types are encoded in [JSON](https://www.json.org/) and strongly inspired by [JSON-RPC](https://www.jsonrpc.org/). ### Request A request is used by a sender to invoke a method on the receiver. The sender awaits a response from the receiver. Since requests and responses can be sendet or answered in any order, an id is provided in each request to identify it. { "method": , "params": , "id" : } | Item | Data type | Description | | ----------- |:---------:| --------------------------------- | | method_name | string | name of the method to invoke | | params | array | method specific parameters | | id | integer | id, which is repeated in response | ### Response A response is used to answer a prior request. There are two kinds of responses: #### Successful Results { "result": , "id": } | Item | Data type | Description | | ----------- |:---------:| ----------------------- | | result | any | request specific result | | id | integer | id, same as request | #### Error notifications { "error": { "code": }, "id": } | Item | Data type | Description | | ----------- |:---------:| ------------------- | | code | integer | error code | | id | integer | id, same as request | #### Error codes | Symbolic name | Code | Description | | ------------------ | ---------:| ---------------------- | | GOOD | 0 | no error | | BAD | 1 | generic error | | BAD_NOTIMPLEMENTED | 2 | method not implemented | | BAD_TIMEOUT | 3 | timeout occured | | BAD_BUSY | 4 | resource busy | | BAD_FORMAT | 5 | invalid formt | | BAD_NOENTRY | 101 | invalid entry | | BAD_ACCESS_DENIED | 102 | access not allowed | ### Notification Notfications are used to inform a receiver about something. Unlike requests, notifications are not answered. Therefore, an id is not supplied. { "method": , "params": } | Item | Data type | Description | | ----------- |:---------:| --------------------------------- | | method_name | string | name of the method to invoke | | params | array | method specific parameters | ## Requests (Adapter -> Provider) ### lookup Retrieve information about a filesystem entry by name. webfuse daemon: {"method": "lookup", "params": [, , ], "id": } fs provider: {"result": { "inode": , "mode" : , "type" : , "size" : , "atime": , "mtime": , "ctime": }, "id": } | Item | Data type | Description | | ----------- | --------------- | ------------------------------------------- | | filesystem | string | name of the filesystem | | parent | integer | inode of parent directory (1 = root) | | name | string | name of the filesystem object to look up | | inode | integer | inode of the filesystem object | | mode | integer | unix file mode | | type | "file" or "dir" | type of filesystem object | | size | integer | required for files; file size in bytes | | atime | integer | optional; unix time of last access | | mtime | integer | optional; unix time of last modification | | ctime | intefer | optional; unix time of last metadata change | ### getattr Get file attributes. webfuse daemon: {"method": "getattr", "params": [, ], "id": } fs provider: {"result": { "mode" : , "type" : , "size" : , "atime": , "mtime": , "ctime": }, "id": } | Item | Data type | Description | | ----------- | --------------- | ------------------------------------------- | | filesystem | string | name of the filesystem | | inode | integer | inode of the filesystem object | | mode | integer | unix file mode | | type | "file" or "dir" | type of filesystem object | | size | integer | required for files; file size in bytes | | atime | integer | optional; unix time of last access | | mtime | integer | optional; unix time of last modification | | ctime | intefer | optional; unix time of last metadata change | ### readdir Read directory contents. Result is an array of name-inode pairs for each entry. The generic entries "." and ".." should also be provided. webfuse daemon: {"method": "readdir", "params": [, ], "id": } fs provider: {"result": [ {"name": , "inode": }, ... ], "id": } | Item | Data type | Description | | ----------- | --------------- | ------------------------------ | | filesystem | string | name of the filesystem | | dir_inode | integer | inode of the directory to read | | name | integer | name of the entry | | inode | integer | inode of the entry | ### open Open a file. webfuse daemon: {"method": "readdir", "params": [, , ], "id": } fs provider: {"result": {"handle": }, "id": } | Item | Data type | Description | | ----------- | ----------| ----------------------------- | | filesystem | string | name of the filesystem | | inode | integer | inode of the file | | flags | integer | access mode flags (see below) | | handle | integer | handle of the file | #### Flags | Symbolic name | Code | Description | | --------------| ---------:| --------------------------- | | O_ACCMODE | 0x003 | access mode mask | | O_RDONLY | 0x000 | open for reading only | | O_WRONLY | 0x001 | open for writing only | | O_RDWR | 0x002 | open for reading an writing | | O_CREAT | 0x040 | create (a new) file | | O_EXCL | 0x080 | open file exclusivly | | O_TRUNC | 0x200 | open file to truncate | | O_APPEND | 0x400 | open file to append | ### close Informs filesystem provider, that a file is closed. Since `close` is a notification, it cannot fail. webfuse daemon: {"method": "close", "params": [, , , ], "id": } | Item | Data type | Description | | ----------- | ----------| ---------------------------- | | filesystem | string | name of the filesystem | | inode | integer | inode of the file | | handle | integer | handle of the file | | flags | integer | access mode flags (see open) | ### read Read from an open file. webfuse daemon: {"method": "close", "params": [, , , , ], "id": } fs provider: {"result": { "data": , "format": , "count": }, "id": } | Item | Data type | Description | | ----------- | ----------| ----------------------------- | | filesystem | string | name of the filesystem | | inode | integer | inode of the file | | handle | integer | handle of the file | | offset | integer | Offet to start read operation | | length | integer | Max. number of bytes to read | | data | integer | handle of the file | | format | string | Encoding of data (see below) | | count | integer | Actual number of bytes read | #### Format | Format | Description | | ---------- | -------------------------------------------------------- | | "identiy" | Use data as is; note that JSON strings are UTF-8 encoded | | "base64" | data is base64 encoded | ## Requests (Provider -> Adapter) ### add_filesystem Adds a filesystem. fs provider: {"method": "add_filesystem", "params": [], "id": } webfuse daemon: {"result": {"id": }, "id": } | Item | Data type | Description | | ----------- | ----------| ------------------------------- | | name | string | name and id of filesystem | ### authtenticate Authenticate the provider. If authentication is enabled, a provider must be authenticated by the adapter before filesystems can be added. fs provider: {"method": "authenticate", "params": [, ], "id": } webfuse daemon: {"result": {}, "id": } | Item | Data type | Description | | ----------- | ----------| ------------------------------- | | type | string | authentication type (see below) | | credentials | object | credentials to authenticate | #### authentication types - **username**: authenticate via username and password `{"username": , "password": }`