5.0.0 • Published 9 months ago

cozy-realtime v5.0.0

Weekly downloads
353
License
MIT
Repository
github
Last release
9 months ago

Subscribe to cozy-stack server side events cozy-stack via Websocket.

Install

npm install --save cozy-realtime`
yarn add cozy-realtime

Setup

CozyRealtime comes with a plugin for cozy-client. This is the recommended way to setup:

// setup.js
import CozyClient from 'cozy-client'
import { RealtimePlugin } from 'cozy-realtime'

const client = new CozyClient({})
client.registerPlugin(RealtimePlugin)

Then, you can listen for a whole doctype, thanks to the <RealTimeQueries> component, provided by cozy-client. This will automatically subscribe to all the events occuring on the specified doctype and accordingly update the store, so your app will reflect the data changes in realtime.

// App.js
import { RealTimeQueries } from 'cozy-client'

<App>
  <RealTimeQueries doctype="io.cozy.files" />
  ...
</App>

Simple, isn't it?

You can also provide your own method to instantiate Websockets. This can be useful when using cozy-realtime from a Node application for example.

// main.node.js
import { Agent } from 'http'
import { WebSocket } from 'ws'

import CozyClient from 'cozy-client'
import { RealtimePlugin } from 'cozy-realtime'

const agent = new Agent({ keepAlive: true })
const createWebSocket = (uri, doctype) => {
  return new WebSocket(uri, doctype, { agent })
}

const client = new CozyClient({})
client.registerPlugin(RealtimePlugin, { createWebSocket })

Manual subscribe

If your app needs to handle specific events on the data, you need to subscribe/unsubscribe like this:

const realtime = client.plugins.realtime
realtime.subscribe('created', 'io.cozy.bank.accounts', handleBankAccountCreated)
realtime.unsubscribe('created', 'io.cozy.bank.accounts', handleBankAccountCreated)

Example

It is important to unsubscribe when unmounting React components.

// some-component.js

const handleCreate = accounts => {
  console.log(`A new 'io.cozy.accounts' is created with id '${accounts._id}'.`)
}

const handleUpdate = accounts => {
  console.log(`An account is updated with id '${accounts._id}'.`)
}

class MyComp extends Component {

  constructor(props){
    super(props)
  }

  componentDidMount(){
    this.realtime = this.props.client.plugins.realtime
    if(this.realtime){
      // Listen to document creations
      await this.realtime.subscribe('created', type, this.handleCreate)
      //listen of the update for a type
      await this.realtime.subscribe('updated', type, this.handleUpdate)
      // Listen to a specific document
      await this.realtime.subscribe('updated', type, id, this.handleUpdate)
    }

  }

  componentWillUnmount(){
    if(this.realtime){
      // To unsubscribe
      await this.realtime.unsubscribe('created', type, handleCreate)
      await this.realtime.unsubscribe('updated', type, handleUpdate)
      await this.realtime.unsubscribe('updated', type, id, handleUpdate)

      // To unsubscribe all
      await this.realtime.unsubscribeAll()
    }
  }
}

export default withClient(MyComp)

Subscribe to multiple events

Here we subscribe to

  • The creation event
  • The update of a single document
import CozyRealtime from 'cozy-realtime'

/**
 * In Node applications, provide a function to instantiate Websockets:
 *
 * const createWebSocket = (uri, doctype) => { ... }
 *
 * const realtime = new CozyRealtime({ client: cozyClient, createWebSocket })
 *
 */
const realtime = new CozyRealtime({ client: cozyClient })

const type = 'io.cozy.accounts'
const id = 'document_id'

const handleCreate = accounts => {
  console.log(`A new 'io.cozy.accounts' is created with id '${accounts._id}'.`)
}
const handleUpdate = accounts => {
  console.log(`An account is updated with id '${accounts._id}'.`)
}

// To subscribe
await realtime.subscribe('created', type, handleCreate)
await realtime.subscribe('updated', type, id, handleUpdate)

// To unsubscribe
await realtime.unsubscribe('created', type, handleCreate)
await realtime.unsubscribe('updated', type, id, handleUpdate)

// To unsubscribe all events in one go
await realtime.unsubscribeAll()

License

cozy-realtime is distributed under the MIT license.

5.0.0

9 months ago

4.6.0

11 months ago

4.5.0

12 months ago

4.4.1

1 year ago

4.4.0

1 year ago

4.3.0

1 year ago

4.2.7

2 years ago

4.2.6

2 years ago

4.2.9

1 year ago

4.2.8

2 years ago

4.2.5

2 years ago

4.2.4

2 years ago

4.2.3

2 years ago

4.2.2

2 years ago

4.2.1

2 years ago

4.2.0

2 years ago

4.1.0

2 years ago

4.0.7

2 years ago

4.0.6

2 years ago

4.0.8

2 years ago

4.0.5

2 years ago

4.0.4

2 years ago

4.0.1

2 years ago

4.0.0

2 years ago

4.0.3

2 years ago

4.0.2

2 years ago

3.14.1

2 years ago

3.14.3

2 years ago

3.14.2

2 years ago

3.14.4

2 years ago

3.14.0

3 years ago

3.13.1

3 years ago

3.13.0

3 years ago

3.12.2

3 years ago

3.12.1

3 years ago

3.12.0

3 years ago

3.11.0

4 years ago

3.10.6

4 years ago

3.10.5

4 years ago

3.10.4

4 years ago

3.10.3

4 years ago

3.10.2

4 years ago

3.10.1

4 years ago

3.10.0

4 years ago

3.9.1

4 years ago

3.9.0

4 years ago

3.8.2

4 years ago

3.8.1

4 years ago

3.8.0

4 years ago

3.7.0

4 years ago

3.6.4

4 years ago

3.6.2

4 years ago

3.6.3

4 years ago

3.6.1

4 years ago

3.6.0

4 years ago

3.5.0

4 years ago

3.4.0

4 years ago

3.3.1

4 years ago

3.3.0

4 years ago

3.2.3

5 years ago

3.2.2

5 years ago

3.2.1

5 years ago

3.2.0

5 years ago

3.1.6

5 years ago

3.1.5

5 years ago

3.1.4

5 years ago

3.1.3

5 years ago

3.1.2

5 years ago

3.1.1

5 years ago

3.1.0

5 years ago

3.0.1

5 years ago

3.0.0

5 years ago

2.1.0

5 years ago

3.0.0-beta.11

5 years ago

3.0.0-beta.10

5 years ago

3.0.0-beta.9

5 years ago

3.0.0-beta.8

5 years ago

3.0.0-beta.7

5 years ago

3.0.0-beta.6

5 years ago

3.0.0-beta.5

5 years ago

3.0.0-beta.4

5 years ago

3.0.0-beta.3

5 years ago

3.0.0-beta.2

5 years ago

2.0.8

5 years ago

3.0.0-beta.1

5 years ago

2.0.7

5 years ago

2.0.6

5 years ago

2.0.5

5 years ago

2.0.4

5 years ago

2.0.3

5 years ago

2.0.2

5 years ago

2.0.1

5 years ago

2.0.0

5 years ago

1.4.0

5 years ago

1.3.0

5 years ago

1.2.8

5 years ago

1.2.7

5 years ago

1.2.6

5 years ago

1.2.5

5 years ago

1.2.4

5 years ago

1.2.3

5 years ago

1.2.2

5 years ago

1.2.1

5 years ago

1.2.0

6 years ago

1.1.10

6 years ago

1.1.9

6 years ago

1.1.8

6 years ago

1.1.7

6 years ago

1.1.6

6 years ago

1.1.5

6 years ago

1.1.4

6 years ago

1.1.3

6 years ago

1.1.2

6 years ago

1.1.1

6 years ago

1.1.0

6 years ago

1.0.0

6 years ago