lipp/node-jet

View on GitHub
examples/todo/server/index.ts

Summary

Maintainability
A
0 mins
Test Coverage
import { Daemon, Method, Peer, State, ValueType } from '../../../lib'
import { Todo } from './Todo'

var port = parseInt(process.argv[2]) || 8081

// // Create Jet Daemon
var daemon = new Daemon({
  username: 'Admin',
  password: 'test',
  features: {
    fetch: 'full',
    batches: true,
    asNotification: true
  }
})

daemon.listen({
  wsPort: port
})
console.log('todo-server ready')
console.log('listening on port', port)

// Create Jet Peer
var peer = new Peer({
  url: `ws://localhost:8081/`
})

var todoStates: Record<string, State<Todo>> = {}

// Provide a "todo/add" method to create new todos
var jetState = new State<ValueType>('todo/value', { test: 4 })
jetState.on('set', (value) => {
  jetState.value(value)
})
var addTodo = new Method('todo/add')
addTodo.on('call', (args) => {
  var title = args[0]
  var todo = new Todo(title)

  // create a new todo state and store ref.
  const todoState = new State('todo/#' + todo.id, todo)
  todoState.on('set', (requestedTodo) => {
    todo.merge(requestedTodo)
  })
  if (todo.id in todoStates) {
    throw 'already existent'
  }
  todoStates[todo.id] = todoState
  peer.add(todoState).catch(() => {
    console.log('State already existent')
  })
})

// Provide a "todo/remove" method to delete a certain todo
var removeTodo = new Method('todo/remove', 'admin')
removeTodo.on('call', (id: string) => {
  if (id in todoStates) {
    peer.remove(todoStates[id] as State<ValueType>)
    delete todoStates[id]
  }
})

// Provide a "todo/remove" method to delete a certain todo
var clearCompletedTodos = new Method('todo/clearCompleted')
clearCompletedTodos.on('call', () => {
  Object.keys(todoStates).forEach((id) => {
    if (todoStates[id].value().completed) {
      delete todoStates[id]
    }
  })
})

// Provide a "todo/remove" method to delete a certain todo
var setCompleted = new Method('todo/setCompleted')
setCompleted.on('call', (args) => {
  Object.keys(todoStates).forEach((id) => {
    var todo = todoStates[id]
    var current = todo.value()
    if (current.completed !== args[0]) {
      current.completed = args[0]
      todo.value(current)
    }
  })
})

const stateTest = new State<ValueType>('test', 1, 'admin', 'admin')
const stateTest2 = new State<ValueType>('test2', 2)

console.log('connecting')
peer
  .connect()
  .then(() => console.log('connected'))
  .then(() => peer.authenticate('Admin', 'test'))
  .then(() => peer.addUser('Operator', '', ['operation']))
  .then(() => peer.addUser('Maintainer', '', ['maintenance']))
  .then(() => peer.add(jetState))
  .then(() => peer.add(addTodo))
  .then(() => peer.add(removeTodo))
  .then(() => peer.add(setCompleted))
  .then(() => peer.add(clearCompletedTodos))
  .then(() => peer.add(stateTest))
  .then(() => peer.add(stateTest2))
  .catch((ex) => {
    console.log('Caught exception', ex)
  })