1.0.0 • Published 7 years ago

socketio-rest v1.0.0

Weekly downloads
1
License
ISC
Repository
-
Last release
7 years ago

Motivation

Websockets are way faster than http. This package seeks to provide a replacement for http when creating RESTful APIs.

To do

  • Limit calls to WATCH handler so that it's only called when the matches of the query is changed. Now it is triggered for all changes within a resource.
  • Move CHANGE-events away from strategy

Usage

Client

import {Frontend} from 'socketio-rest'
import socketio from 'socket.io-client'

const io = socketio('http://localhost')
const realtime = new Frontend(io)

// Meta data for all messages

realtime.options.token = 'some jwt token'

// Create

async function createUser(options) {
  return realtime.create('users', options)
}

// Read

async function getUser(id) {
  return realtime.getOne('users', { id })
}

async function getUserByEmail(email) {
  return realtime.getOne('users', { email })
}

async function getAllUsers() {
  return realtime.get('users')
}

async function getAdminUsers() {
  return realtime.get('users', { role: 'admin' })
}

// Watch/unwatch

async function watchAdminUsers() {
  const watchId = await realtime.watch('users')

  return function unwatch() {
    return realtime.unwatch(watchId)
  }
}

async function watchAdminUsers() {
  const watchId = realtime.watch('users', { role: 'admin' })

  return function unwatch() {
    return realtime.unwatch(watchId)
  }
}

// Update

async function updateRole(userId, newRole) {
  return realtime.update('users', { role: newRole })
}

// Delete

async function deleteUser(id) {
  return realtime.destroy('users', { id })
}

Server

import {Backend} from 'socketio-rest'
import EventEmitter from 'events'
import socketio from 'socket.io'
import http from 'http'

const server = http.createServer()
const io = socketio(server)
const events = new EventEmitter()
const resources = ['users']

const databaseAdapter = {
  async getOne(resource, query, metaData) {
    // Return one instance of the resource matching the query
    // ‹Your implementation›
  },
  async get(resource, query, metaData) {
    // Return an array of instances matching the query
    // ‹Your implementation›
  },
  async update(resource, updates, metaData) {
    // Update an instance of the query using updates = { id, ...updates }
    // ‹Your implementation›

    // Then notify socketio-rest that a change has occurred
    events.emit('CHANGE ' + resource)
  },
  async create(resource, data, metaData) {
    // Create an instance of the resource
    // ‹Your implementation›

    // Then notify socketio-rest that a change has occurred
    events.emit('CHANGE ' + resource)
  },
  async destroy(resource, query, metaData) {
    // Delete an instance of the resource
    // ‹Your implementation›

    // Then notify socketio-rest that a change has occurred
    events.emit('CHANGE ' + resource)
  }
}

// Initialize

const realtime = new Backend(io, resources)

// Specify a strategy

const strategy = {
  db,
  events,
}

realtime.useStrategy(strategy)

server.listen(1234, () => {
  console.log('Server listening on port 1234')
})

Testing

yarn test
npm test