cozy-client-js
Version:
Javascript library to interact with a cozy
139 lines (93 loc) • 5.82 kB
Markdown
# Introduction to cozy-client-js
## Reminder about cozy architectures
There is two actives cozy architectures:
- The first, thereafter named **v2** is the existing cozy structure. It's based on 1 container / user with many node.js processes in each container (cozy-data-system, cozy-proxy, cozy-home, 1 process per app).
- The second, thereafter named **v3** is the new cozy-stack ([repository](https://github.com/cozy/cozy-stack)). It's based on go and aim to support multiple user on a single process.
**v2** supported both **server-side** applications with their own node.js process and **client-side** applications which run in the user browser.
**v3** will not support **server-side** applications. We will support server side modules managed by server administrator, but the applications themselves will all be **client-side** application.
This repository provides a library which allows you to build a **client-side** application compatible with both version.
The former javascript library for making client-side application was `cozy-browser-sdk`. We aim to deprecate it once `cozy-client-js` reaches feature-parity.
If you already have an application using `cozy-browser-sdk`, you can see what will change in the [transition document](./browser-sdk-transition.md). If you have any doubt, please open an issue!
## Include the library in your application
You can `import`/`require` cozy-client-js using npm & webpack.
You can also copy-paste the `dist/cozy-client.js` bundle file into your application, and include it in your application `index.html` with `<script src="./cozy-client.js">`.
If you are developing a client-side app for Cozy V3, you can import the lib directly from the stack, by using [`{{.CozyClientJS}}`](https://docs.cozy.io/en/cozy-stack/client-app-dev/#good-practices-for-your-application).
## Doctypes & Permissions
A doctype is a simple javascript string identifying a type of document.
Some basic doctypes are provided by cozy, but you can pick your own.
Cozy **v3** expects doctypes to be qualified to ensure uniqueness.
All doctypes designed by the cozy's team will be prefixed with `io.cozy.`, or `io.cozy.labs.`
Any doctype you introduce is expected to be prefixed with the reverse notation of a domain you own (JLS#7.7). If you do not own a domain, you can also use a reverse notation of your email address.
You are free to reuse another applications documents by using their doctypes but you **SHOULD** discuss with the domain owner if you want to add fields or format them differently.
To ensure retrocompatibility, when used on stack v2, all known doctypes will be auto-prefixed, but a warning will be written to the console. Unknown doctype will cause a fatal error. DO NOT rely on this behaviour in new applications, use qualified doctypes.
```javascript
// contacts is a doctype defined by cozy
cozyContactsDoctype = "io.cozy.contacts"
// your application handle books, let's create a doctype
myBooksDoctype = "com.mydomain.book"
```
When you use a doctype, even one created by your application, you need to ask for its permission in your manifest. How to do it depends on which stack you are developping for.
**TODO** Have some docs about **v2** package.json vs **v3** manifest.webapp
## Promises & Callbacks
All cozy-client-js functions support callback or promise.
If no callback is provided, a promise is returned.
```javascript
cozy.client.data.create(myBooksDoctype, doc)
.then(function(result){ console.log('done', result); });
.catch(function(err){ console.log('fail', err); });
```
If your build pipeline supports it, use async/await for sweet sweet async
```javascript
try {
result = await cozy.client.data.create(myBooksDoctype, doc)
console.log('done', result)
} catch(err) {
console.log('fail', err)
}
```
If for some reason you do not want to use promises, you can pass the `disablePromises` flag to the init function. This way, you will be able to use the functions with a classic callback.
```javascript
cozy.client.init({ disablePromises: true })
cozy.client.data.create(myBooksDoctype, doc, function(err, result) {
if (err) {
console.log('fail', err);
} else {
console.log('done', result);
}
});
> undefined
```
## Constructor
### `new cozy.Client(options)`
`new cozy.Client(options)` returns a new cozy client.
It does return a Cozy instance.
It takes the same options object as the `cozy.client.init(options)` function.
### `cozy.client.init(options)`
`cozy.client.init(options)` setups initialize the global cozy instance.
It does not return a value.
- `options` is an object with the following fields:
* `cozyURL`: absolute url of the cozy stack
* `disablePromises`: boolean to make function that returns promise used with a classical "callback as last argument" (default value is *false*)
* `oauth`: an object with the OAuth parameters, see [OAuth](./oauth.md) for details
* `version`: the version of Cozy (2 or 3), it's optional, by default with a request to the server it can deduce automatically the version. (Must be specified for an offline mode)
```javascript
cozy.client.init({
cozyURL: 'http://cozy.tools:8080',
disablePromises: false,
version: 3,
oauth: {
clientParams: {
redirectURI: 'http://localhost:3333/oauth/callback',
softwareID: 'cozy-client-js',
clientName: 'example',
scopes: ["io.cozy.files:GET"]
},
onRegistered: (client, url) => { /* */ },
storage: new cozy.auth.LocalStorage(window.localStorage)
}
})
```
Future APIs
-----------
This is the end of what we already have implemented, if you want to do something else (manipulating binary file, sharing, ...), you will have to wait a bit :smile:.
Feel free to open an issue if you see something missing, or if you disagree with the API design !