parallaxis/node_modules/osc-min/lib/index.js

165 lines
5.8 KiB
JavaScript
Executable File

(function() {
//~readme.out~
//[![build status](https://secure.travis-ci.org/russellmcc/node-osc-min.png)](http://travis-ci.org/russellmcc/node-osc-min)
//# osc-min
//
// _simple utilities for open sound control in node.js_
//
// This package provides some node.js utilities for working with
// [OSC](http://opensoundcontrol.org/), a format for sound and systems control.
// Here we implement the [OSC 1.1][spec11] specification. OSC is a transport-independent
// protocol, so we don't provide any server objects, as you should be able to
// use OSC over any transport you like. The most common is probably udp, but tcp
// is not unheard of.
//
// [spec11]: http://opensoundcontrol.org/spec-1_1
//
//----
//## Installation
//~installation~
//----
//## Examples
//~examples~
//
// more examples are available in the `examples/` directory.
//
//----
//~api~
//----
//~representation~
//~representation~
//## Javascript representations of the OSC types.
// See the [spec][spec] for more information on the OSC types.
//
// + An _OSC Packet_ is an _OSC Message_ or an _OSC Bundle_.
//
// + An _OSC Message_:
//
// {
// oscType : "message"
// address : "/address/pattern/might/have/wildcards"
// args : [arg1,arg2]
// }
//
// Where args is an array of _OSC Arguments_. `oscType` is optional.
// `args` can be a single element.
//
// + An _OSC Argument_ is represented as a javascript object with the following layout:
//
// {
// type : "string"
// value : "value"
// }
//
// Where the `type` is one of the following:
// + `string` - string value
// + `float` - numeric value
// + `integer` - numeric value
// + `blob` - node.js Buffer value
// + `true` - value is boolean true
// + `false` - value is boolean false
// + `null` - no value
// + `bang` - no value (this is the `I` type tag)
// + `timetag` - numeric value
// + `array` - array of _OSC Arguments_
//
// Note that `type` is always a string - i.e. `"true"` rather than `true`.
//
// The following non-standard types are also supported:
// + `double` - numeric value (encodes to a float64 value)
//
//
// For messages sent to the `toBuffer` function, `type` is optional.
// If the argument is not an object, it will be interpreted as either
// `string`, `float`, `array` or `blob`, depending on its javascript type
// (String, Number, Array, Buffer, respectively)
//
// + An _OSC Bundle_ is represented as a javascript object with the following layout
//
// {
// oscType : "bundle"
// timetag : 7
// elements : [element1, element]
// }
//
// Where the timetag is a javascript-native numeric value of the timetag,
// and elements is an array of either an _OSC Bundle_ or an _OSC Message_
// The `oscType` field is optional, but is always returned by api functions.
//
// [spec]: http://opensoundcontrol.org/spec-1_0
var utils, coffee;
utils = require("./osc-utilities");
// ~api~
//## Exported functions
//
//------
//### .fromBuffer(buffer, [strict])
// takes a node.js Buffer of a complete _OSC Packet_ and
// outputs the javascript representation, or throws if the buffer is ill-formed.
//
// `strict` is an optional parameter that makes the function fail more often.
exports.fromBuffer = function(buffer, strict) {
return utils.fromOscPacket(buffer, strict);
};
//~api~
//----
//### .toBuffer(object, [strict])
// takes a _OSC packet_ javascript representation as defined below and returns
// a node.js Buffer, or throws if the representation is ill-formed.
//
//----
//### .toBuffer(address, args[], [strict])
// alternative syntax for above. Assumes this is an _OSC Message_ as defined below,
// and `args` is an array of _OSC Arguments_ or single _OSC Argument_
exports.toBuffer = function(object, strict, opt) {
if(typeof object === "string")
return utils.toOscPacket({'address' : object, 'args' : strict}, opt);
return utils.toOscPacket(object, strict);
};
//~api~
//----
//### .applyAddressTransform(buffer, transform)
// takes a callback that takes a string and outputs a string,
// and applies that to the address of the message encoded in the buffer,
// and outputs an encoded buffer.
//
// If the buffer encodes an _OSC Bundle_, this applies the function to each address
// in the bundle.
//
// There's two subtle reasons you'd want to use this function rather than
// composing `fromBuffer` and `toBuffer`:
// - Future-proofing - if the OSC message uses an argument typecode that
// we don't understand, calling `fromBuffer` will throw. The only time
// when `applyAddressTranform` might fail is if the address is malformed.
// - Accuracy - javascript represents numbers as 64-bit floats, so some
// OSC types will not be able to be represented accurately. If accuracy
// is important to you, then, you should never convert the OSC message to a
// javascript representation.
exports.applyAddressTransform = function(buffer, transform) {
return utils.applyTransform(buffer, utils.addressTransform(transform));
};
//~api~
//----
//### .applyMessageTransform(buffer, transform)
// takes a function that takes and returns a javascript _OSC Message_ representation,
// and applies that to each message encoded in the buffer,
// and outputs a new buffer with the new address.
//
// If the buffer encodes an osc-bundle, this applies the function to each message
// in the bundle.
//
// See notes above for applyAddressTransform for why you might want to use this.
// While this does parse and re-pack the messages, the bundle timetags are left
// in their accurate and prestine state.
exports.applyMessageTransform = function(buffer, transform) {
return utils.applyTransform(buffer, utils.messageTransform(transform));
};
}).call(this);