/service-js

:mushroom: http, osc, and socket.io shared room databse for programming in space

Primary LanguageJavaScript

service-js

Creates a living room that you can connect to over HTTP, eventstreams, socket.io, and osc!

You can test it out by running npm start after installing the dependencies with npm install

For a better example with more context, processes and displays, see https://github.com/living-room/lovelace

For a nice javascript client, check out https://github.com/living-room/client-js

installing

npm install
npm start
npm test

example http

$ curl -d 'facts=curl is an app at (20, 30)' localhost:3000/assert
OK

$ curl -d 'facts=$who is an app at ($x, $y)' localhost:3000/select
{"assertions":[{"who":{"word":"curl"},"x":{"value":20},"y":{"value":30}}]}%

example socket.io

npm run serve:examples && open http://localhost:5000

from examples/browser.html

const socket = io.connect(`http://localhost:3000`)

// The pattern we want to match on
const pattern = 'ping $number'

let pong = 0

// To subscribe pass in the JSON of an array of patterns
const patternsString = JSON.stringify([pattern])

// We will get back an object, we just care about new assertions
socket.on(patternsString, ({assertions}) => {
  assertions.forEach(({number}) => {
    const value = parseInt(number.value)
    if (value > pong) pong = value
    console.log(`<- pong ${pong}`)
    pong++
  })
})
socket.emit('subscribe', patternsString)

// Start pinging from highest previous ping
setInterval(() => {
  socket.emit('assert', `ping ${pong}`, data => {
    console.log(`-> ${data[0]}`)
  })
}, 1500)

example opensoundcontrol

from examples/osc/osc.pde

import oscP5.*;
import netP5.*;

OscP5 oscP5;
NetAddress myRemoteLocation;

void setup() {
  size(400,400);
  frameRate(25);
  oscP5 = new OscP5(this, 12000);

  myRemoteLocation = new NetAddress("127.0.0.1",41234);
}


void draw() {
  background(0);
}

void mousePressed() {
  OscMessage assertMessage = new OscMessage("/assert");
  assertMessage.add("processing is a program at (0.2, 0.3)");
  oscP5.send(assertMessage, myRemoteLocation);

  OscMessage assert2Message = new OscMessage("/assert");
  assert2Message.add("coolprocessing is a notherprogram at (0.4, 0.4)");
  oscP5.send(assert2Message, myRemoteLocation);

  OscMessage selectMessage = new OscMessage("/select");
  selectMessage.add("$name is a $type at ($x, $y)");
  oscP5.send(selectMessage, myRemoteLocation);
}

api

The http, socketio, and osc endpoints are all the same HTTP uses POST unless otherwise stated.

Add some facts

/assert facts=['some', 'facts', 'here']

Remove some facts

/retract facts=['some', 'facts', 'here']

Batch add and remove facts from the database

/ facts=[{assert: 'some'}, {retract: 'facts'}, {assert: 'here'}]

Find some facts that match a pattern

/select `facts='$what'`

Get all the facts

GET /facts