0.0.1 • Published 3 years ago

@loadingio/datahub v0.0.1

Weekly downloads
1
License
MIT
Repository
github
Last release
3 years ago

Data Hub

Access scoped data via piped operational transformation.

Usage

# this is our data source.
src = new srchub do
  ops-out: (ops) -> # update data src by incoming ops
  get: -> # return complete data. always return cloned data to prevent user from touching original data

# this is our view controller
des = new deshub do
  ops-in (ops): -> # update ui / widget

# data through pipe are scoped under "my-view"
view-hub = new hub {scope: ["my-view"]}
# ... from srchub / through view-hub / to deshub
src.pipe view-hub .pipe des

# notify all users (deshub) about data changed
src.ops-in [... /* ops */ ...]

# update data source (srchub)
des.ops-out [... /* ops */ ...]

Memhub, Userhub

Datahub also provides auxiliary hubs for quickly trying and testing.

  • memhub - data source hub. store data in memory.
  • usrhub - simple destination hub. constructor options:
    • render(ops): called when there are updates from data source.

A sample usage of memhub and usrhub as follows:

mhub = new memhub!
uhub = new usrhub {render: -> console.log('ok'); }
mhub.pipe uhub
document.querySelector('textarea').addEventListener \input, ->
  uhub.ops-out [
    { p: ['str',0], si: @value[@value.length - 1] }
  ]

Sharehub

Sharehub provides a simple interface and implementation reference for adopting ShareDB with data hub to keep edited data in database:

uhub = new usrhub!
shub = new sharehub do
  render: -> # .. update ui ..
shub.init({
  id: 'my-sharedb-doc-id'
})
  .then ->
    shub.pipe uhub

Sharehub is in a standalone JS file. include sharehub.js if you want to use it.

Scoping

Passing scope option ( an array of strings / numbers ) into datahub constructor to filter incoming op and data based on the specified scope. For example, assume our data source keeps data in datasrc variable, then following hub:

new hub({scope: ["users", "deleted"]})

will only pass ops that affect object in datasrc.users.deleted. Furthermore, data get from this hub will only be the subtree in datasrc.users.deleted.

You can pipe data source to a hub that is scoped, and pipe this scoped hub to the destination hubs that use the same subtree.

License

MIT