From 09a2e9cd629a4c15bf264b3bdd5dce0078c20c1e Mon Sep 17 00:00:00 2001 From: Andreas Dzialocha Date: Thu, 9 Mar 2017 23:22:43 +0100 Subject: [PATCH 1/2] Do check correctly for undefined atomic values --- dist/osc.js | 23 +++++++++++++---------- dist/osc.js.map | 2 +- dist/osc.min.js | 2 +- lib/osc.js | 23 +++++++++++++---------- src/atomic.js | 4 +++- src/atomic/blob.js | 4 ++-- src/atomic/string.js | 4 ++-- src/atomic/timetag.js | 4 ++-- src/common/utils.js | 9 +++++++++ test/atomic.spec.js | 2 ++ 10 files changed, 48 insertions(+), 29 deletions(-) diff --git a/dist/osc.js b/dist/osc.js index 17e31b5..af1bd20 100644 --- a/dist/osc.js +++ b/dist/osc.js @@ -28,6 +28,9 @@ function isBlob(n) { function isDate(n) { return n instanceof Date; } +function isUndefined(n) { + return typeof n === 'undefined'; +} function pad(n) { return n + 3 & ~0x03; } @@ -255,24 +258,24 @@ var Atomic = function () { throw new Error('OSC Atomic cant\'t be packed without given method or byteLength'); } var data = new Uint8Array(byteLength); - var dataView = new DataView(data.buffer); - if (!this.value) { + var dataView$$1 = new DataView(data.buffer); + if (isUndefined(this.value)) { throw new Error('OSC Atomic cant\'t be encoded with empty value'); } - dataView[method](this.offset, this.value, false); + dataView$$1[method](this.offset, this.value, false); return data; } }, { key: 'unpack', - value: function unpack(dataView, method, byteLength) { + value: function unpack(dataView$$1, method, byteLength) { var initialOffset = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0; - if (!(dataView && method && byteLength)) { + if (!(dataView$$1 && method && byteLength)) { throw new Error('OSC Atomic cant\'t be unpacked without given dataView, method or byteLength'); } - if (!(dataView instanceof DataView)) { + if (!(dataView$$1 instanceof DataView)) { throw new Error('OSC Atomic expects an instance of type DataView'); } - this.value = dataView[method](initialOffset, false); + this.value = dataView$$1[method](initialOffset, false); this.offset = initialOffset + byteLength; return this.offset; } @@ -340,7 +343,7 @@ var AtomicString = function (_Atomic) { createClass(AtomicString, [{ key: 'pack', value: function pack() { - if (!this.value) { + if (isUndefined(this.value)) { throw new Error('OSC AtomicString can not be encoded with empty value'); } var terminated = this.value + '\0'; @@ -393,7 +396,7 @@ var AtomicBlob = function (_Atomic) { createClass(AtomicBlob, [{ key: 'pack', value: function pack() { - if (!this.value) { + if (isUndefined(this.value)) { throw new Error('OSC AtomicBlob can not be encoded with empty value'); } var byteLength = pad(this.value.byteLength); @@ -575,7 +578,7 @@ var AtomicTimetag = function (_Atomic) { createClass(AtomicTimetag, [{ key: 'pack', value: function pack() { - if (!this.value) { + if (isUndefined(this.value)) { throw new Error('OSC AtomicTimetag can not be encoded with empty value'); } var _value = this.value, diff --git a/dist/osc.js.map b/dist/osc.js.map index 2f3c483..8d961ec 100644 --- a/dist/osc.js.map +++ b/dist/osc.js.map @@ -1 +1 @@ -{"version":3,"file":null,"sources":["../src/common/utils.js","../src/common/helpers.js","../src/atomic.js","../src/atomic/int32.js","../src/atomic/float32.js","../src/atomic/string.js","../src/atomic/blob.js","../src/message.js","../src/atomic/timetag.js","../src/bundle.js","../src/packet.js","../src/events.js","../src/plugin/dgram.js","../src/plugin/bridge.js","../src/plugin/wsclient.js","../src/plugin/wsserver.js","../src/osc.js"],"sourcesContent":["/**\n * Check if given object is an integer number\n * @param {*} n\n * @return {boolean}\n */\nexport function isInt(n) {\n return Number(n) === n && n % 1 === 0\n}\n\n/**\n * Check if given object is a float number\n * @param {*} n\n * @return {boolean}\n */\nexport function isFloat(n) {\n return Number(n) === n && n % 1 !== 0\n}\n\n/**\n * Check if given object is a string\n * @param {*} n\n * @return {boolean}\n */\nexport function isString(n) {\n return typeof n === 'string'\n}\n\n/**\n * Check if given object is an array\n * @param {*} n\n * @return {boolean}\n */\nexport function isArray(n) {\n return Object.prototype.toString.call(n) === '[object Array]'\n}\n\n/**\n * Check if given object is an object\n * @param {*} n\n * @return {boolean}\n */\nexport function isObject(n) {\n return Object.prototype.toString.call(n) === '[object Object]'\n}\n\n/**\n * Check if given object is a function\n * @param {*} n\n * @return {boolean}\n */\nexport function isFunction(n) {\n return typeof n === 'function'\n}\n\n/**\n * Check if given object is a Uint8Array\n * @param {*} n\n * @return {boolean}\n */\nexport function isBlob(n) {\n return n instanceof Uint8Array\n}\n\n/**\n * Check if given object is a Date\n * @param {*} n\n * @return {boolean}\n */\nexport function isDate(n) {\n return n instanceof Date\n}\n\n/**\n * Return the next multiple of four\n * @param {number} n\n */\nexport function pad(n) {\n return (n + 3) & ~0x03\n}\n\n/**\n * Wrap binary data in DataView\n * @param {*} obj\n * @return {DataView}\n */\nexport function dataView(obj) {\n if (obj.buffer) {\n return new DataView(obj.buffer)\n } else if (obj instanceof ArrayBuffer) {\n return new DataView(obj)\n }\n\n return new DataView(new Uint8Array(obj))\n}\n","import { isArray, isInt, isFloat, isString, isBlob } from './utils'\n\n/**\n * Checks type of given object and returns the regarding OSC\n * Type tag character\n * @param {*} item Any object\n * @return {string} OSC Type tag character\n */\nexport function typeTag(item) {\n if (isInt(item)) {\n return 'i'\n } else if (isFloat(item)) {\n return 'f'\n } else if (isString(item)) {\n return 's'\n } else if (isBlob(item)) {\n return 'b'\n }\n\n throw new Error('OSC typeTag() found unknown value type')\n}\n\n/**\n * Sanitizes an OSC-ready Address Pattern\n * @param {array|string} obj Address as string or array of strings\n * @return {string} Corrected address string\n *\n * @example\n * // all calls return '/test/path' string:\n * prepareAddress('test/path')\n * prepareAddress('/test/path/')\n * prepareAddress([test, path])\n */\nexport function prepareAddress(obj) {\n let address = ''\n\n if (isArray(obj)) {\n return `/${obj.join('/')}`\n } else if (isString(obj)) {\n address = obj\n\n // remove slash at ending of address\n if (address.length > 1 && address[address.length - 1] === '/') {\n address = address.slice(0, address.length - 1)\n }\n\n // add slash at beginning of address\n if (address.length > 1 && address[0] !== '/') {\n address = `/${address}`\n }\n\n return address\n }\n\n throw new Error('OSC prepareAddress() needs addresses of type array or string')\n}\n\n/**\n * Make an OSC address pattern javascript-regex-ready\n * @param {string} str OSC address pattern\n * @return {string} Javascript RegEx string\n */\nexport function prepareRegExPattern(str) {\n let pattern\n\n if (!(isString(str))) {\n throw new Error('OSC prepareRegExPattern() needs strings')\n }\n\n pattern = str.replace(/\\./g, '\\\\.')\n pattern = pattern.replace(/\\(/g, '\\\\(')\n pattern = pattern.replace(/\\)/g, '\\\\)')\n\n pattern = pattern.replace(/\\{/g, '(')\n pattern = pattern.replace(/\\}/g, ')')\n pattern = pattern.replace(/,/g, '|')\n\n pattern = pattern.replace(/\\[!/g, '[^')\n\n pattern = pattern.replace(/\\?/g, '.')\n pattern = pattern.replace(/\\*/g, '.*')\n\n return pattern\n}\n\n/**\n * Holds a list of items and helps to merge them\n * into a single array of packed binary data\n */\nexport default class EncodeHelper {\n /**\n * Create a new EncodeHelper instance\n */\n constructor() {\n /** @type {array} data */\n this.data = []\n /** @type {number} byteLength */\n this.byteLength = 0\n }\n\n /**\n * Packs an item and adds it to the list\n * @param {*} item Any object\n * @return {EncodeHelper}\n */\n add(item) {\n const buffer = item.pack()\n this.byteLength += buffer.byteLength\n this.data.push(buffer)\n\n return this\n }\n\n /**\n * Merge all added items into one Uint8Array\n * @return {Uint8Array} Merged binary data array of all items\n */\n merge() {\n const result = new Uint8Array(this.byteLength)\n let offset = 0\n\n this.data.forEach((data) => {\n result.set(data, offset)\n offset += data.byteLength\n })\n\n return result\n }\n}\n","/**\n * Base class for OSC Atomic Data Types\n */\nexport default class Atomic {\n /**\n * Create an Atomic instance\n * @param {*} [value] Initial value of any type\n */\n constructor(value) {\n /** @type {*} value */\n this.value = value\n /** @type {number} offset */\n this.offset = 0\n }\n\n /**\n * Interpret the given value of this entity as packed binary data\n * @param {string} method The DataView method to write to the ArrayBuffer\n * @param {number} byteLength Size of array in bytes\n * @return {Uint8Array} Packed binary data\n */\n pack(method, byteLength) {\n if (!(method && byteLength)) {\n throw new Error('OSC Atomic cant\\'t be packed without given method or byteLength')\n }\n\n const data = new Uint8Array(byteLength)\n const dataView = new DataView(data.buffer)\n\n if (!this.value) {\n throw new Error('OSC Atomic cant\\'t be encoded with empty value')\n }\n\n // use DataView to write to ArrayBuffer\n dataView[method](this.offset, this.value, false)\n\n // always return binary Uint8Array after packing\n return data\n }\n\n /**\n * Unpack binary data from DataView according to the given format\n * @param {DataView} dataView The DataView holding the binary representation of the value\n * @param {string} method The DataView method to read the format from the ArrayBuffer\n * @param {number} byteLength Size of array in bytes\n * @param {number} [initialOffset=0] Offset of DataView before unpacking\n * @return {number} Offset after unpacking\n */\n unpack(dataView, method, byteLength, initialOffset = 0) {\n if (!(dataView && method && byteLength)) {\n throw new Error('OSC Atomic cant\\'t be unpacked without given dataView, method or byteLength')\n }\n\n if (!(dataView instanceof DataView)) {\n throw new Error('OSC Atomic expects an instance of type DataView')\n }\n\n // use DataView to read from ArrayBuffer and add offset\n this.value = dataView[method](initialOffset, false)\n this.offset = initialOffset + byteLength\n\n // always return offset number after unpacking\n return this.offset\n }\n}\n","import { isInt } from '../common/utils'\n\nimport Atomic from '../atomic'\n\n/**\n * 32-bit big-endian two's complement integer OSC Atomic Data Type\n */\nexport default class AtomicInt32 extends Atomic {\n /**\n * Create an AtomicInt32 instance\n * @param {number} [value] Initial integer value\n */\n constructor(value) {\n if (value && !isInt(value)) {\n throw new Error('OSC AtomicInt32 constructor expects value of type number')\n }\n\n super(value)\n }\n\n /**\n * Interpret the given number as packed binary data\n * @return {Uint8Array} Packed binary data\n */\n pack() {\n return super.pack('setInt32', 4)\n }\n\n /**\n * Unpack binary data from DataView and read a Int32 number\n * @param {DataView} dataView The DataView holding the binary representation of the value\n * @param {number} [initialOffset=0] Offset of DataView before unpacking\n * @return {number} Offset after unpacking\n */\n unpack(dataView, initialOffset = 0) {\n return super.unpack(dataView, 'getInt32', 4, initialOffset)\n }\n}\n","import { isFloat } from '../common/utils'\n\nimport Atomic from '../atomic'\n\n/**\n * 32-bit big-endian IEEE 754 floating point number OSC Atomic Data Type\n */\nexport default class AtomicFloat32 extends Atomic {\n /**\n * Create an AtomicFloat32 instance\n * @param {number} [value] Float number\n */\n constructor(value) {\n if (value && !isFloat(value)) {\n throw new Error('OSC AtomicFloat32 constructor expects value of type float')\n }\n\n super(value)\n }\n\n /**\n * Interpret the given number as packed binary data\n * @return {Uint8Array} Packed binary data\n */\n pack() {\n return super.pack('setFloat32', 4)\n }\n\n /**\n * Unpack binary data from DataView and read a Float32 number\n * @param {DataView} dataView The DataView holding the binary representation of the value\n * @param {number} [initialOffset=0] Offset of DataView before unpacking\n * @return {number} Offset after unpacking\n */\n unpack(dataView, initialOffset = 0) {\n return super.unpack(dataView, 'getFloat32', 4, initialOffset)\n }\n}\n","import { pad, isString } from '../common/utils'\n\nimport Atomic from '../atomic'\n\n/**\n * A sequence of non-null ASCII characters OSC Atomic Data Type\n */\nexport default class AtomicString extends Atomic {\n /**\n * Create an AtomicString instance\n * @param {string} [value] Initial string value\n */\n constructor(value) {\n if (value && !isString(value)) {\n throw new Error('OSC AtomicString constructor expects value of type string')\n }\n\n super(value)\n }\n\n /**\n * Interpret the given string as packed binary data\n * @return {Uint8Array} Packed binary data\n */\n pack() {\n if (!this.value) {\n throw new Error('OSC AtomicString can not be encoded with empty value')\n }\n\n // add 0-3 null characters for total number of bits a multiple of 32\n const terminated = `${this.value}\\u0000`\n const byteLength = pad(terminated.length)\n\n const buffer = new Uint8Array(byteLength)\n\n for (let i = 0; i < terminated.length; i += 1) {\n buffer[i] = terminated.charCodeAt(i)\n }\n\n return buffer\n }\n\n /**\n * Unpack binary data from DataView and read a string\n * @param {DataView} dataView The DataView holding the binary representation of the string\n * @param {number} [initialOffset=0] Offset of DataView before unpacking\n * @return {number} Offset after unpacking\n */\n unpack(dataView, initialOffset = 0) {\n if (!(dataView instanceof DataView)) {\n throw new Error('OSC AtomicString expects an instance of type DataView')\n }\n\n let offset = initialOffset\n let charcode\n const data = []\n\n for (; offset < dataView.byteLength; offset += 1) {\n charcode = dataView.getUint8(offset)\n\n // check for terminating null character\n if (charcode !== 0) {\n data.push(charcode)\n } else {\n offset += 1\n break\n }\n }\n\n if (offset === dataView.length) {\n throw new Error('OSC AtomicString found a malformed OSC string')\n }\n\n /** @type {number} offset */\n this.offset = pad(offset)\n /** @type {string} value */\n this.value = String.fromCharCode.apply(null, data)\n\n return this.offset\n }\n}\n","import { pad, isBlob } from '../common/utils'\n\nimport Atomic from '../atomic'\n\n/**\n * 8-bit bytes of arbitrary binary data OSC Atomic Data Type\n */\nexport default class AtomicBlob extends Atomic {\n /**\n * Create an AtomicBlob instance\n * @param {Uint8Array} [value] Binary data\n */\n constructor(value) {\n if (value && !isBlob(value)) {\n throw new Error('OSC AtomicBlob constructor expects value of type Uint8Array')\n }\n\n super(value)\n }\n\n /**\n * Interpret the given blob as packed binary data\n * @return {Uint8Array} Packed binary data\n */\n pack() {\n if (!this.value) {\n throw new Error('OSC AtomicBlob can not be encoded with empty value')\n }\n\n const byteLength = pad(this.value.byteLength)\n const data = new Uint8Array(byteLength + 4)\n const dataView = new DataView(data.buffer)\n\n // an int32 size count\n dataView.setInt32(0, this.value.byteLength, false)\n // followed by 8-bit bytes of arbitrary binary data\n data.set(this.value, 4)\n\n return data\n }\n\n /**\n * Unpack binary data from DataView and read a blob\n * @param {DataView} dataView The DataView holding the binary representation of the blob\n * @param {number} [initialOffset=0] Offset of DataView before unpacking\n * @return {number} Offset after unpacking\n */\n unpack(dataView, initialOffset = 0) {\n if (!(dataView instanceof DataView)) {\n throw new Error('OSC AtomicBlob expects an instance of type DataView')\n }\n\n const byteLength = dataView.getInt32(initialOffset, false)\n\n /** @type {Uint8Array} value */\n this.value = new Uint8Array(dataView.buffer, initialOffset + 4, byteLength)\n /** @type {number} offset */\n this.offset = pad(initialOffset + 4 + byteLength)\n\n return this.offset\n }\n}\n","import { isString, isArray, isInt, isFloat, isBlob } from './common/utils'\nimport Helper, { typeTag, prepareAddress } from './common/helpers'\n\nimport AtomicInt32 from './atomic/int32'\nimport AtomicFloat32 from './atomic/float32'\nimport AtomicString from './atomic/string'\nimport AtomicBlob from './atomic/blob'\n\n/**\n * An OSC message consists of an OSC Address Pattern followed\n * by an OSC Type Tag String followed by zero or more OSC Arguments\n */\nexport default class Message {\n /**\n * Create a Message instance\n * @param {array|string} args Address\n * @param {...*} args OSC Atomic Data Types\n *\n * @example\n * const message = new Message(['test', 'path'], 50, 100.52, 'test')\n *\n * @example\n * const message = new Message('/test/path', 51.2)\n */\n constructor(...args) {\n /**\n * @type {number} offset\n * @private\n */\n this.offset = 0\n /** @type {string} address */\n this.address = ''\n /** @type {string} types */\n this.types = ''\n /** @type {array} args */\n this.args = []\n\n if (args.length > 0) {\n if (!(isString(args[0]) || isArray(args[0]))) {\n throw new Error('OSC Message constructor first argument (address) must be a string or array')\n }\n\n this.address = prepareAddress(args.shift())\n this.types = args.map(item => typeTag(item)).join('')\n this.args = args\n }\n }\n\n /**\n * Add an OSC Atomic Data Type to the list of elements\n * @param {*} item\n */\n add(item) {\n if (!item) {\n throw new Error('OSC Message needs a valid OSC Atomic Data Type')\n }\n\n this.args.push(item)\n this.types += typeTag(item)\n }\n\n /**\n * Interpret the Message as packed binary data\n * @return {Uint8Array} Packed binary data\n */\n pack() {\n if (this.address.length === 0 || this.address[0] !== '/') {\n throw new Error('OSC Message has an invalid address')\n }\n\n const encoder = new Helper()\n\n // OSC Address Pattern and Type string\n encoder.add(new AtomicString(this.address))\n encoder.add(new AtomicString(`,${this.types}`))\n\n // followed by zero or more OSC Arguments\n if (this.args.length > 0) {\n let argument\n\n this.args.forEach((value) => {\n if (isInt(value)) {\n argument = new AtomicInt32(value)\n } else if (isFloat(value)) {\n argument = new AtomicFloat32(value)\n } else if (isString(value)) {\n argument = new AtomicString(value)\n } else if (isBlob(value)) {\n argument = new AtomicBlob(value)\n } else {\n throw new Error('OSC Message found unknown argument type')\n }\n\n encoder.add(argument)\n })\n }\n\n return encoder.merge()\n }\n\n /**\n * Unpack binary data to read a Message\n * @param {DataView} dataView The DataView holding the binary representation of a Message\n * @param {number} [initialOffset=0] Offset of DataView before unpacking\n * @return {number} Offset after unpacking\n */\n unpack(dataView, initialOffset = 0) {\n if (!(dataView instanceof DataView)) {\n throw new Error('OSC Message expects an instance of type DataView.')\n }\n\n // read address pattern\n const address = new AtomicString()\n address.unpack(dataView, initialOffset)\n\n // read type string\n const types = new AtomicString()\n types.unpack(dataView, address.offset)\n\n if (address.value.length === 0 || address.value[0] !== '/') {\n throw new Error('OSC Message found malformed or missing address string')\n }\n\n if (types.value.length === 0 && types.value[0] !== ',') {\n throw new Error('OSC Message found malformed or missing type string')\n }\n\n let offset = types.offset\n let next\n let type\n\n const args = []\n\n // read message arguments (OSC Atomic Data Types)\n for (let i = 1; i < types.value.length; i += 1) {\n type = types.value[i]\n\n if (type === 'i') {\n next = new AtomicInt32()\n } else if (type === 'f') {\n next = new AtomicFloat32()\n } else if (type === 's') {\n next = new AtomicString()\n } else if (type === 'b') {\n next = new AtomicBlob()\n } else {\n throw new Error('OSC Message found non-standard argument type')\n }\n\n offset = next.unpack(dataView, offset)\n args.push(next.value)\n }\n\n this.offset = offset\n this.address = address.value\n this.types = types.value\n this.args = args\n\n return this.offset\n }\n}\n","import { isInt, isDate } from '../common/utils'\n\nimport Atomic from '../atomic'\n\n/** 70 years in seconds */\nexport const SECONDS_70_YEARS = 2208988800\n/** 2^32 */\nexport const TWO_POWER_32 = 4294967296\n\n/**\n * Timetag helper class for representing NTP timestamps\n * and conversion between them and javascript representation\n */\nexport class Timetag {\n /**\n * Create a Timetag instance\n * @param {number} [seconds=0] Initial NTP *seconds* value\n * @param {number} [fractions=0] Initial NTP *fractions* value\n */\n constructor(seconds = 0, fractions = 0) {\n if (!(isInt(seconds) && isInt(fractions))) {\n throw new Error('OSC Timetag constructor expects values of type integer number')\n }\n\n /** @type {number} seconds */\n this.seconds = seconds\n /** @type {number} fractions */\n this.fractions = fractions\n }\n\n /**\n * Converts from NTP to JS representation and back\n * @param {number} [milliseconds] Converts from JS milliseconds to NTP.\n * Leave empty for converting from NTP to JavaScript representation\n * @return {number} Javascript timestamp\n */\n timestamp(milliseconds) {\n let seconds\n\n if (typeof milliseconds === 'number') {\n seconds = milliseconds / 1000\n const rounded = Math.floor(seconds)\n\n this.seconds = rounded + SECONDS_70_YEARS\n this.fractions = Math.round(TWO_POWER_32 * (seconds - rounded))\n\n return milliseconds\n }\n\n seconds = this.seconds - SECONDS_70_YEARS\n return (seconds + (this.fractions / TWO_POWER_32)) * 1000\n }\n}\n\n/**\n * 64-bit big-endian fixed-point time tag, semantics\n * defined below OSC Atomic Data Type\n */\nexport default class AtomicTimetag extends Atomic {\n /**\n * Create a AtomicTimetag instance\n * @param {number|Timetag|Date} [value] Initial date, leave empty if\n * you want it to be the current date\n */\n constructor(value = Date.now()) {\n let timetag = new Timetag()\n\n if (value instanceof Timetag) {\n timetag = value\n } else if (isInt(value)) {\n timetag.timestamp(value)\n } else if (isDate(value)) {\n timetag.timestamp(value.getTime())\n }\n\n super(timetag)\n }\n\n /**\n * Interpret the given timetag as packed binary data\n * @return {Uint8Array} Packed binary data\n */\n pack() {\n if (!this.value) {\n throw new Error('OSC AtomicTimetag can not be encoded with empty value')\n }\n\n const { seconds, fractions } = this.value\n const data = new Uint8Array(8)\n const dataView = new DataView(data.buffer)\n\n dataView.setInt32(0, seconds, false)\n dataView.setInt32(4, fractions, false)\n\n return data\n }\n\n /**\n * Unpack binary data from DataView and read a timetag\n * @param {DataView} dataView The DataView holding the binary representation of the timetag\n * @param {number} [initialOffset=0] Offset of DataView before unpacking\n * @return {number} Offset after unpacking\n */\n unpack(dataView, initialOffset = 0) {\n if (!(dataView instanceof DataView)) {\n throw new Error('OSC AtomicTimetag expects an instance of type DataView')\n }\n\n const seconds = dataView.getUint32(initialOffset, false)\n const fractions = dataView.getUint32(initialOffset + 4, false)\n\n /** @type {Timetag} value */\n this.value = new Timetag(seconds, fractions)\n /** @type {number} offset */\n this.offset = initialOffset + 8\n\n return this.offset\n }\n}\n","import { isArray, isInt } from './common/utils'\nimport EncodeHelper from './common/helpers'\n\nimport Packet from './packet'\nimport Message from './message'\nimport AtomicString from './atomic/string'\nimport AtomicInt32 from './atomic/int32'\nimport AtomicTimetag from './atomic/timetag'\n\n/** OSC Bundle string */\nexport const BUNDLE_TAG = '#bundle'\n\n/**\n * An OSC Bundle consist of a Timetag and one or many Bundle Elements.\n * The elements are either OSC Messages or more OSC Bundles\n */\nexport default class Bundle {\n /**\n * Create a Bundle instance\n * @param {...*} [args] Timetag and elements. See examples for options\n *\n * @example\n * const bundle = new Bundle(new Date() + 500)\n *\n * @example\n * const message = new Message('/test/path', 51.2)\n * const anotherBundle = new Bundle([message], Date.now() + 1500)\n *\n * @example\n * const message = new Message('/test/path', 51.2)\n * const anotherMessage = new Message('/test/message', 'test', 12)\n * const anotherBundle = new Bundle(message, anotherMessage)\n */\n constructor(...args) {\n /**\n * @type {number} offset\n * @private\n */\n this.offset = 0\n /** @type {AtomicTimetag} timetag */\n this.timetag = new AtomicTimetag()\n /** @type {array} bundleElements */\n this.bundleElements = []\n\n if (args.length > 0) {\n // first argument is an Date or js timestamp (number)\n if (args[0] instanceof Date || isInt(args[0])) {\n this.timetag = new AtomicTimetag(args[0])\n } else if (isArray(args[0])) {\n // first argument is an Array of Bundle elements\n args[0].forEach((item) => {\n this.add(item)\n })\n\n // second argument is an Date or js timestamp (number)\n if (args.length > 1 && (args[1] instanceof Date || isInt(args[0]))) {\n this.timetag = new AtomicTimetag(args[1])\n }\n } else {\n // take all arguments as Bundle elements\n args.forEach((item) => {\n this.add(item)\n })\n }\n }\n }\n\n /**\n * Take a JavaScript timestamp to set the Bundle's timetag\n * @param {number} ms JS timestamp in milliseconds\n *\n * @example\n * const bundle = new Bundle()\n * bundle.timestamp(Date.now() + 5000) // in 5 seconds\n */\n timestamp(ms) {\n if (!isInt(ms)) {\n throw new Error('OSC Bundle needs an integer for setting the timestamp')\n }\n\n this.timetag = new AtomicTimetag(ms)\n }\n\n /**\n * Add a Message or Bundle to the list of elements\n * @param {Bundle|Message} item\n */\n add(item) {\n if (!(item instanceof Message || item instanceof Bundle)) {\n throw new Error('OSC Bundle contains only Messages and Bundles')\n }\n\n this.bundleElements.push(item)\n }\n\n /**\n * Interpret the Bundle as packed binary data\n * @return {Uint8Array} Packed binary data\n */\n pack() {\n const encoder = new EncodeHelper()\n\n // an OSC Bundle consists of the OSC-string \"#bundle\"\n encoder.add(new AtomicString(BUNDLE_TAG))\n\n // followed by an OSC Time Tag\n if (!this.timetag) {\n this.timetag = new AtomicTimetag()\n }\n\n encoder.add(this.timetag)\n\n // followed by zero or more OSC Bundle Elements\n this.bundleElements.forEach((item) => {\n encoder.add(new AtomicInt32(item.pack().byteLength))\n encoder.add(item)\n })\n\n return encoder.merge()\n }\n\n /**\n * Unpack binary data to read a Bundle\n * @param {DataView} dataView The DataView holding the binary representation of a Bundle\n * @param {number} [initialOffset=0] Offset of DataView before unpacking\n * @return {number} Offset after unpacking\n */\n unpack(dataView, initialOffset = 0) {\n if (!(dataView instanceof DataView)) {\n throw new Error('OSC Bundle expects an instance of type DataView')\n }\n\n // read the beginning bundle string\n const head = new AtomicString()\n head.unpack(dataView, initialOffset)\n\n if (head.value !== BUNDLE_TAG) {\n throw new Error('OSC Bundle does not contain a valid #bundle head')\n }\n\n // read the timetag\n const timetag = new AtomicTimetag()\n let offset = timetag.unpack(dataView, head.offset)\n\n // read the bundle elements\n this.bundleElements = []\n\n while (offset < dataView.byteLength) {\n const packet = new Packet()\n const size = new AtomicInt32()\n\n offset = size.unpack(dataView, offset)\n offset = packet.unpack(dataView, offset, this.timetag)\n\n this.bundleElements.push(packet.value)\n }\n\n this.offset = offset\n this.timetag = timetag\n\n return this.offset\n }\n}\n","import Bundle, { BUNDLE_TAG } from './bundle'\nimport Message from './message'\nimport AtomicString from './atomic/string'\n\n/**\n * The unit of transmission of OSC is an OSC Packet. The contents\n * of an OSC packet must be either an OSC Message or an OSC Bundle\n */\nexport default class Packet {\n /**\n * Create a Packet instance holding a Message or Bundle\n * @param {Message|Bundle} [value] Initial Packet value\n */\n constructor(value) {\n if (value && !(value instanceof Message || value instanceof Bundle)) {\n throw new Error('OSC Packet value has to be Message or Bundle')\n }\n\n /** @type {Message|Bundle} value */\n this.value = value\n /**\n * @type {number} offset\n * @private\n */\n this.offset = 0\n }\n\n /**\n * Packs the Packet value. This implementation is more like\n * a wrapper due to OSC specifications, you could also skip the\n * Packet and directly work with the Message or Bundle instance\n * @return {Uint8Array} Packed binary data\n *\n * @example\n * const message = new Message('/test/path', 21.5, 'test')\n * const packet = new Packet(message)\n * const packetBinary = packet.pack() // then send it via udp etc.\n *\n * // or skip the Packet for convenience\n * const messageBinary = message.pack()\n */\n pack() {\n if (!this.value) {\n throw new Error('OSC Packet can not be encoded with empty body')\n }\n\n return this.value.pack()\n }\n\n /**\n * Unpack binary data from DataView to read Messages or Bundles\n * @param {DataView} dataView The DataView holding a binary representation of a Packet\n * @param {number} [initialOffset=0] Offset of DataView before unpacking\n * @return {number} Offset after unpacking\n */\n unpack(dataView, initialOffset = 0) {\n if (!(dataView instanceof DataView)) {\n throw new Error('OSC Packet expects an instance of type DataView')\n }\n\n if (dataView.byteLength % 4 !== 0) {\n throw new Error('OSC Packet byteLength has to be a multiple of four')\n }\n\n const head = new AtomicString()\n head.unpack(dataView, initialOffset)\n\n let item\n\n // check if Packet is a Bundle or a Message\n if (head.value === BUNDLE_TAG) {\n item = new Bundle()\n } else {\n item = new Message()\n }\n\n item.unpack(dataView, initialOffset)\n\n this.offset = item.offset\n this.value = item\n\n return this.offset\n }\n}\n","import { isArray, isString, isInt, isFunction, dataView } from './common/utils'\nimport { prepareAddress, prepareRegExPattern } from './common/helpers'\n\nimport Packet from './packet'\nimport Bundle from './bundle'\nimport Message from './message'\n\n/**\n * Default options\n * @private\n */\nconst defaultOptions = {\n discardLateMessages: false,\n}\n\n/**\n * EventHandler to notify listeners on matching OSC messages and\n * status changes of plugins\n */\nexport default class EventHandler {\n /**\n * Create an EventHandler instance\n * @param {object} options Custom options\n */\n constructor(options) {\n /**\n * @type {object} options\n * @private\n */\n this.options = Object.assign({}, defaultOptions, options)\n /**\n * @type {array} addressHandlers\n * @private\n */\n this.addressHandlers = []\n /**\n * @type {object} eventHandlers\n * @private\n */\n this.eventHandlers = {\n open: [],\n error: [],\n close: [],\n }\n /**\n * @type {number} uuid\n * @private\n */\n this.uuid = 0\n }\n\n /**\n * Internally used method to dispatch OSC Packets. Extracts\n * given Timetags and dispatches them accordingly\n * @param {Packet} packet\n * @return {boolean} Success state\n * @private\n */\n dispatch(packet) {\n if (!(packet instanceof Packet)) {\n throw new Error('OSC EventHander dispatch() accepts only arguments of type Packet')\n }\n\n if (!packet.value) {\n throw new Error('OSC EventHander dispatch() can\\'t read empty Packets')\n }\n\n if (packet.value instanceof Bundle) {\n const bundle = packet.value\n\n return bundle.bundleElements.forEach((bundleItem) => {\n if (packet.value instanceof Bundle) {\n if (bundle.timetag.value.timestamp() < bundleItem.timetag.value.timestamp()) {\n throw new Error('OSC Bundle timestamp is older than the timestamp of enclosed Bundles')\n }\n return this.dispatch(bundleItem)\n } else if (bundleItem instanceof Message) {\n const message = bundleItem\n return this.notify(message.address, message, bundle.timetag.value.timestamp())\n }\n\n throw new Error('OSC EventHander dispatch() can\\'t dispatch unknown Packet value')\n })\n } else if (packet.value instanceof Message) {\n const message = packet.value\n return this.notify(message.address, message)\n }\n\n throw new Error('OSC EventHander dispatch() can\\'t dispatch unknown Packet value')\n }\n\n /**\n * Internally used method to invoke listener callbacks. Uses regular\n * expression pattern matching for OSC addresses\n * @param {string} name OSC address or event name\n * @param {*} [data] The data of the event\n * @return {boolean} Success state\n * @private\n */\n call(name, data) {\n let success = false\n\n // call event handlers\n if (isString(name) && name in this.eventHandlers) {\n this.eventHandlers[name].forEach((handler) => {\n handler.callback(data)\n success = true\n })\n\n return success\n }\n\n // call address handlers\n const handlerKeys = Object.keys(this.addressHandlers)\n const handlers = this.addressHandlers\n\n handlerKeys.forEach((key) => {\n const regex = new RegExp(prepareRegExPattern(prepareAddress(name)), 'g')\n const test = regex.test(key)\n\n // found a matching address in our callback handlers\n if (test && key.length === regex.lastIndex) {\n handlers[key].forEach((handler) => {\n handler.callback(data)\n success = true\n })\n }\n })\n\n return success\n }\n\n /**\n * Notify the EventHandler of incoming OSC messages or status\n * changes (*open*, *close*, *error*). Handles OSC address patterns\n * and executes timed messages. Use binary arrays when\n * handling directly incoming network data. Packet's or Messages can\n * also be used\n * @param {...*} args\n * The OSC address pattern / event name as string}. For convenience and\n * Plugin API communication you can also use Message or Packet instances\n * or ArrayBuffer, Buffer instances (low-level access). The latter will\n * automatically be unpacked\n * When using a string you can also pass on data as a second argument\n * (any type). All regarding listeners will be notified with this data.\n * As a third argument you can define a javascript timestamp (number or\n * Date instance) for timed notification of the listeners.\n * @return {boolean} Success state of notification\n *\n * @example\n * const socket = dgram.createSocket('udp4')\n * socket.on('message', (message) => {\n * this.notify(message)\n * })\n *\n * @example\n * this.notify('error', error.message)\n *\n * @example\n * const message = new OSC.Message('/test/path', 55)\n * this.notify(message)\n *\n * @example\n * const message = new OSC.Message('/test/path', 55)\n * // override timestamp\n * this.notify(message.address, message, Date.now() + 5000)\n */\n notify(...args) {\n if (args.length === 0) {\n throw new Error('OSC EventHandler can not be called without any argument')\n }\n\n // check for incoming dispatchable OSC data\n if (args[0] instanceof Packet) {\n return this.dispatch(args[0])\n } else if (args[0] instanceof Bundle || args[0] instanceof Message) {\n return this.dispatch(new Packet(args[0]))\n } else if (!isString(args[0])) {\n const packet = new Packet()\n packet.unpack(dataView(args[0]))\n return this.dispatch(packet)\n }\n\n const name = args[0]\n\n // data argument\n let data = null\n\n if (args.length > 1) {\n data = args[1]\n }\n\n // timestamp argument\n let timestamp = null\n\n if (args.length > 2) {\n if (isInt(args[2])) {\n timestamp = args[2]\n } else if (args[2] instanceof Date) {\n timestamp = args[2].getTime()\n } else {\n throw new Error('OSC EventHandler timestamp has to be a number or Date')\n }\n }\n\n // notify now or later\n if (timestamp) {\n const now = Date.now()\n\n // is message outdated?\n if (now > timestamp) {\n if (!this.options.discardLateMessages) {\n return this.call(name, data)\n }\n }\n\n // notify later\n const that = this\n\n setTimeout(() => {\n that.call(name, data)\n }, timestamp - now)\n\n return true\n }\n\n return this.call(name, data)\n }\n\n /**\n * Subscribe to a new address or event you want to listen to\n * @param {string} name The OSC address or event name\n * @param {function} callback Callback function on notification\n * @return {number} Subscription identifier (needed to unsubscribe)\n */\n on(name, callback) {\n if (!(isString(name) || isArray(name))) {\n throw new Error('OSC EventHandler accepts only strings or arrays for address patterns')\n }\n\n if (!isFunction(callback)) {\n throw new Error('OSC EventHandler callback has to be a function')\n }\n\n // get next id\n this.uuid += 1\n\n // prepare handler\n const handler = {\n id: this.uuid,\n callback,\n }\n\n // register event listener\n if (isString(name) && name in this.eventHandlers) {\n this.eventHandlers[name].push(handler)\n return this.uuid\n }\n\n // register address listener\n const address = prepareAddress(name)\n const regex = new RegExp(/[#*\\s[\\],/{}|?]/g)\n\n if (regex.test(address.split('/').join(''))) {\n throw new Error('OSC EventHandler address string contains invalid characters')\n }\n\n if (!(address in this.addressHandlers)) {\n this.addressHandlers[address] = []\n }\n\n this.addressHandlers[address].push(handler)\n\n return this.uuid\n }\n\n /**\n * Unsubscribe listener from event notification or address handler\n * @param {string} name The OSC address or event name\n * @param {number} subscriptionId Subscription id to identify the handler\n * @return {boolean} Success state\n */\n off(name, subscriptionId) {\n if (!(isString(name) || isArray(name))) {\n throw new Error('OSC EventHandler accepts only strings or arrays for address patterns')\n }\n\n if (!isInt(subscriptionId)) {\n throw new Error('OSC EventHandler subscription id has to be a number')\n }\n\n let key\n let haystack\n\n // event or address listener\n if (isString(name) && name in this.eventHandlers) {\n key = name\n haystack = this.eventHandlers\n } else {\n key = prepareAddress(name)\n haystack = this.addressHandlers\n }\n\n // remove the entry\n if (key in haystack) {\n return haystack[key].some((item, index) => {\n if (item.id === subscriptionId) {\n haystack[key].splice(index, 1)\n return true\n }\n\n return false\n })\n }\n\n return false\n }\n}\n","const dgram = typeof __dirname !== 'undefined' ? require('dgram') : undefined\n\n/**\n * Status flags\n * @private\n */\nconst STATUS = {\n IS_NOT_INITIALIZED: -1,\n IS_CONNECTING: 0,\n IS_OPEN: 1,\n IS_CLOSING: 2,\n IS_CLOSED: 3,\n}\n\n/**\n * Default options for open method\n * @private\n */\nconst defaultOpenOptions = {\n host: 'localhost',\n port: 41234,\n exclusive: false,\n}\n\n/**\n * Default options for send method\n * @private\n */\nconst defaultSendOptions = {\n host: 'localhost',\n port: 41235,\n}\n\n/**\n * Default options\n * @private\n */\nconst defaultOptions = {\n type: 'udp4',\n open: defaultOpenOptions,\n send: defaultSendOptions,\n}\n\n/**\n * OSC plugin for simple OSC messaging via udp client\n * and udp server\n */\nexport default class DatagramPlugin {\n /**\n * Create an OSC Plugin instance with given options. Defaults to\n * localhost:41234 for server and localhost:41235 for client messaging\n * @param {object} [options] Custom options\n * @param {string} [options.type='udp4'] 'udp4' or 'udp6'\n * @param {string} [options.open.host='localhost'] Hostname of udp server to bind to\n * @param {number} [options.open.port=41234] Port of udp server to bind to\n * @param {boolean} [options.open.exclusive=false] Exclusive flag\n * @param {string} [options.send.host='localhost'] Hostname of udp client for messaging\n * @param {number} [options.send.port=41235] Port of udp client for messaging\n *\n * @example\n * const plugin = new OSC.DatagramPlugin({ send: { port: 9912 } })\n * const osc = new OSC({ plugin: plugin })\n */\n constructor(customOptions = {}) {\n if (!dgram) {\n throw new Error('DatagramPlugin can not be used in browser context')\n }\n\n /**\n * @type {object} options\n * @private\n */\n this.options = Object.assign({}, defaultOptions, customOptions)\n\n /**\n * @type {object} socket\n * @private\n */\n this.socket = dgram.createSocket(this.options.type)\n /**\n * @type {number} socketStatus\n * @private\n */\n this.socketStatus = STATUS.IS_NOT_INITIALIZED\n\n // register events\n this.socket.on('message', (message) => {\n this.notify(message)\n })\n\n this.socket.on('error', (error) => {\n this.notify('error', error)\n })\n\n /**\n * @type {function} notify\n * @private\n */\n this.notify = () => {}\n }\n\n /**\n * Internal method to hook into osc library's\n * EventHandler notify method\n * @param {function} fn Notify callback\n * @private\n */\n registerNotify(fn) {\n this.notify = fn\n }\n\n /**\n * Returns the current status of the connection\n * @return {number} Status ID\n */\n status() {\n return this.socketStatus\n }\n\n /**\n * Bind a udp socket to a hostname and port\n * @param {object} [customOptions] Custom options\n * @param {string} [customOptions.host='localhost'] Hostname of udp server to bind to\n * @param {number} [customOptions.port=41234] Port of udp server to bind to\n * @param {boolean} [customOptions.exclusive=false] Exclusive flag\n */\n open(customOptions = {}) {\n const options = Object.assign({}, this.options.openOptions, customOptions)\n const { port, exclusive } = options\n\n this.socketStatus = STATUS.IS_CONNECTING\n\n this.socket.bind({\n address: options.host,\n port,\n exclusive,\n }, () => {\n this.socketStatus = STATUS.IS_OPEN\n this.notify('open')\n })\n }\n\n /**\n * Close udp socket\n */\n close() {\n this.socketStatus = STATUS.IS_CLOSING\n\n this.socket.close(() => {\n this.socketStatus = STATUS.IS_CLOSED\n this.notify('close')\n })\n }\n\n /**\n * Send an OSC Packet, Bundle or Message. Use options here for\n * custom port and hostname, otherwise the global options will\n * be taken\n * @param {Uint8Array} binary Binary representation of OSC Packet\n * @param {object} [customOptions] Custom options for udp socket\n * @param {string} [customOptions.host] Hostname of udp client\n * @param {number} [customOptions.port] Port of udp client\n */\n send(binary, customOptions = {}) {\n const options = Object.assign({}, this.options.sendOptions, customOptions)\n const { port, host } = options\n\n this.socket.send(new Buffer(binary), 0, binary.byteLength, port, host)\n }\n}\n","const dgram = typeof __dirname !== 'undefined' ? require('dgram') : undefined\nconst WebSocket = typeof __dirname !== 'undefined' ? require('ws').Server : undefined\n\n/**\n * Status flags\n * @private\n */\nconst STATUS = {\n IS_NOT_INITIALIZED: -1,\n IS_CONNECTING: 0,\n IS_OPEN: 1,\n IS_CLOSING: 2,\n IS_CLOSED: 3,\n}\n\n/**\n * Default options\n * @private\n */\nconst defaultOptions = {\n udpServer: {\n host: 'localhost',\n port: 41234,\n exclusive: false,\n },\n udpClient: {\n host: 'localhost',\n port: 41235,\n },\n wsServer: {\n host: 'localhost',\n port: 8080,\n },\n receiver: 'ws',\n}\n\n/**\n * Helper method to merge nested objects\n * @private\n */\nfunction mergeOptions(base, custom) {\n return Object.assign({}, defaultOptions, base, custom, {\n udpServer: Object.assign({}, defaultOptions.udpServer, base.udpServer, custom.udpServer),\n udpClient: Object.assign({}, defaultOptions.udpClient, base.udpClient, custom.udpClient),\n wsServer: Object.assign({}, defaultOptions.wsServer, base.wsServer, custom.wsServer),\n })\n}\n\n/**\n * OSC plugin for setting up communication between a Websocket\n * client and a udp client with a bridge inbetween\n */\nexport default class BridgePlugin {\n /**\n * Create an OSC Bridge instance with given options. Defaults to\n * localhost:41234 for udp server, localhost:41235 for udp client and\n * localhost:8080 for Websocket server\n * @param {object} [options] Custom options\n * @param {string} [options.udpServer.host='localhost'] Hostname of udp server to bind to\n * @param {number} [options.udpServer.port=41234] Port of udp server to bind to\n * @param {boolean} [options.udpServer.exclusive=false] Exclusive flag\n * @param {string} [options.udpClient.host='localhost'] Hostname of udp client for messaging\n * @param {number} [options.udpClient.port=41235] Port of udp client for messaging\n * @param {string} [options.wsServer.host='localhost'] Hostname of Websocket server\n * @param {number} [options.wsServer.port=8080] Port of Websocket server\n * @param {string} [options.receiver='ws'] Where messages sent via 'send' method will be\n * delivered to, 'ws' for Websocket clients, 'udp' for udp client\n *\n * @example\n * const plugin = new OSC.BridgePlugin({ wsServer: { port: 9912 } })\n * const osc = new OSC({ plugin: plugin })\n */\n constructor(customOptions = {}) {\n if (!dgram || !WebSocket) {\n throw new Error('BridgePlugin can not be used in browser context')\n }\n\n /** @type {object} options\n * @private\n */\n this.options = mergeOptions({}, customOptions)\n\n /**\n * @type {object} websocket\n * @private\n */\n this.websocket = null\n\n /**\n * @type {object} socket\n * @private\n */\n this.socket = dgram.createSocket('udp4')\n /**\n * @type {number} socketStatus\n * @private\n */\n this.socketStatus = STATUS.IS_NOT_INITIALIZED\n\n // register udp events\n this.socket.on('message', (message) => {\n this.send(message, { receiver: 'ws' })\n this.notify(message.buffer)\n })\n\n this.socket.on('error', (error) => {\n this.notify('error', error)\n })\n\n /**\n * @type {function} notify\n * @private\n */\n this.notify = () => {}\n }\n\n /**\n * Internal method to hook into osc library's\n * EventHandler notify method\n * @param {function} fn Notify callback\n * @private\n */\n registerNotify(fn) {\n this.notify = fn\n }\n\n /**\n * Returns the current status of the connection\n * @return {number} Status ID\n */\n status() {\n return this.socketStatus\n }\n\n /**\n * Bind a udp socket to a hostname and port\n * @param {object} [customOptions] Custom options\n * @param {string} [customOptions.host='localhost'] Hostname of udp server to bind to\n * @param {number} [customOptions.port=41234] Port of udp server to bind to\n * @param {boolean} [customOptions.exclusive=false] Exclusive flag\n */\n open(customOptions = {}) {\n const options = mergeOptions(this.options, customOptions)\n\n this.socketStatus = STATUS.IS_CONNECTING\n\n // bind udp server\n this.socket.bind({\n address: options.udpServer.host,\n port: options.udpServer.port,\n exclusive: options.udpServer.exclusive,\n }, () => {\n // bind Websocket server\n this.websocket = new WebSocket({ host: options.wsServer.host, port: options.wsServer.port })\n this.websocket.binaryType = 'arraybuffer'\n\n // register Websocket events\n this.websocket.on('error', (error) => {\n this.notify('error', error)\n })\n\n this.websocket.on('connection', (client) => {\n client.on('message', (message) => {\n this.send(message, { receiver: 'udp' })\n this.notify(new Uint8Array(message))\n })\n })\n\n this.notify('open')\n })\n }\n\n /**\n * Close udp socket and Websocket server\n */\n close() {\n this.socketStatus = STATUS.IS_CLOSING\n\n // close udp socket\n this.socket.close(() => {\n this.socketStatus = STATUS.IS_CLOSED\n this.notify('close')\n\n // close Websocket\n this.websocket.close()\n })\n }\n\n /**\n * Send an OSC Packet, Bundle or Message. Use options here for\n * custom receiver, otherwise the global options will be taken\n * @param {Uint8Array} binary Binary representation of OSC Packet\n * @param {object} [customOptions] Custom options\n * @param {string} [customOptions.udpClient.host='localhost'] Hostname of udp client for messaging\n * @param {number} [customOptions.udpClient.port=41235] Port of udp client for messaging\n * @param {string} [customOptions.receiver='ws'] Messages will be delivered to Websocket ('ws')\n * clients or udp client ('udp')\n */\n send(binary, customOptions = {}) {\n const options = mergeOptions(this.options, customOptions)\n const { receiver } = options\n\n if (receiver === 'udp') {\n // send data to udp client\n const data = binary instanceof Buffer ? binary : new Buffer(binary)\n this.socket.send(\n data,\n 0,\n data.byteLength,\n options.udpClient.port,\n options.udpClient.host,\n )\n } else if (receiver === 'ws') {\n // send data to all Websocket clients\n this.websocket.clients.forEach((client) => {\n client.send(binary, { binary: true })\n })\n } else {\n throw new Error('BridgePlugin can not send message to unknown receiver')\n }\n }\n}\n","// eslint-disable-next-line no-undef, no-use-before-define\nconst WebsocketClient = typeof __dirname === 'undefined' ? WebSocket : require('ws')\n\n/**\n * Status flags\n * @private\n */\nconst STATUS = {\n IS_NOT_INITIALIZED: -1,\n IS_CONNECTING: 0,\n IS_OPEN: 1,\n IS_CLOSING: 2,\n IS_CLOSED: 3,\n}\n\n/**\n * Default options\n * @private\n */\nconst defaultOptions = {\n host: 'localhost',\n port: 8080,\n}\n\n/**\n * OSC plugin for a Websocket client running in node or browser context\n */\nexport default class WebsocketClientPlugin {\n /**\n * Create an OSC WebsocketClientPlugin instance with given options.\n * Defaults to *localhost:8080* for connecting to a Websocket server\n * @param {object} [options] Custom options\n * @param {string} [options.host='localhost'] Hostname of Websocket server\n * @param {number} [options.port=8080] Port of Websocket server\n *\n * @example\n * const plugin = new OSC.WebsocketClientPlugin({ port: 9912 })\n * const osc = new OSC({ plugin: plugin })\n */\n constructor(customOptions) {\n if (!WebsocketClient) {\n throw new Error('WebsocketClientPlugin can\\'t find a WebSocket class')\n }\n\n /**\n * @type {object} options\n * @private\n */\n this.options = Object.assign({}, defaultOptions, customOptions)\n\n /**\n * @type {object} socket\n * @private\n */\n this.socket = null\n /**\n * @type {number} socketStatus\n * @private\n */\n this.socketStatus = STATUS.IS_NOT_INITIALIZED\n\n /**\n * @type {function} notify\n * @private\n */\n this.notify = () => {}\n }\n\n /**\n * Internal method to hook into osc library's\n * EventHandler notify method\n * @param {function} fn Notify callback\n * @private\n */\n registerNotify(fn) {\n this.notify = fn\n }\n\n /**\n * Returns the current status of the connection\n * @return {number} Status identifier\n */\n status() {\n return this.socketStatus\n }\n\n /**\n * Connect to a Websocket server. Defaults to global options\n * @param {object} [customOptions] Custom options\n * @param {string} [customOptions.host] Hostname of Websocket server\n * @param {number} [customOptions.port] Port of Websocket server\n */\n open(customOptions = {}) {\n const options = Object.assign({}, this.options, customOptions)\n const { port, host } = options\n\n // close socket when already given\n if (this.socket) {\n this.close()\n }\n\n // create websocket client\n this.socket = new WebsocketClient(`ws://${host}:${port}`)\n this.socket.binaryType = 'arraybuffer'\n this.socketStatus = STATUS.IS_CONNECTING\n\n // register events\n this.socket.onopen = () => {\n this.socketStatus = STATUS.IS_OPEN\n this.notify('open')\n }\n\n this.socket.onclose = () => {\n this.socketStatus = STATUS.IS_CLOSED\n this.notify('close')\n }\n\n this.socket.onerror = (error) => {\n this.notify('error', error)\n }\n\n this.socket.onmessage = (message) => {\n this.notify(message.data)\n }\n }\n\n /**\n * Close Websocket\n */\n close() {\n this.socketStatus = STATUS.IS_CLOSING\n this.socket.close()\n }\n\n /**\n * Send an OSC Packet, Bundle or Message to Websocket server\n * @param {Uint8Array} binary Binary representation of OSC Packet\n */\n send(binary) {\n this.socket.send(binary)\n }\n}\n","const WebsocketServer = typeof __dirname !== 'undefined' ? require('ws').Server : undefined\n\n/**\n * Status flags\n * @private\n */\nconst STATUS = {\n IS_NOT_INITIALIZED: -1,\n IS_CONNECTING: 0,\n IS_OPEN: 1,\n IS_CLOSING: 2,\n IS_CLOSED: 3,\n}\n\n/**\n * Default options\n * @private\n */\nconst defaultOptions = {\n host: 'localhost',\n port: 8080,\n}\n\n/**\n * OSC plugin for a Websocket client running in node or browser context\n */\nexport default class WebsocketServerPlugin {\n /**\n * Create an OSC WebsocketServerPlugin instance with given options.\n * Defaults to *localhost:8080* for the Websocket server\n * @param {object} [options] Custom options\n * @param {string} [options.host='localhost'] Hostname of Websocket server\n * @param {number} [options.port=8080] Port of Websocket server\n *\n * @example\n * const plugin = new OSC.WebsocketServerPlugin({ port: 9912 })\n * const osc = new OSC({ plugin: plugin })\n *\n * osc.open() // start server\n */\n constructor(customOptions) {\n if (!WebsocketServer) {\n throw new Error('WebsocketServerPlugin can not be used in browser context')\n }\n\n /**\n * @type {object} options\n * @private\n */\n this.options = Object.assign({}, defaultOptions, customOptions)\n\n /**\n * @type {object} socket\n * @private\n */\n this.socket = null\n /**\n * @type {number} socketStatus\n * @private\n */\n this.socketStatus = STATUS.IS_NOT_INITIALIZED\n\n /**\n * @type {function} notify\n * @private\n */\n this.notify = () => {}\n }\n\n /**\n * Internal method to hook into osc library's\n * EventHandler notify method\n * @param {function} fn Notify callback\n * @private\n */\n registerNotify(fn) {\n this.notify = fn\n }\n\n /**\n * Returns the current status of the connection\n * @return {number} Status identifier\n */\n status() {\n return this.socketStatus\n }\n\n /**\n * Start a Websocket server. Defaults to global options\n * @param {object} [customOptions] Custom options\n * @param {string} [customOptions.host] Hostname of Websocket server\n * @param {number} [customOptions.port] Port of Websocket server\n */\n open(customOptions = {}) {\n const options = Object.assign({}, this.options, customOptions)\n const { port, host } = options\n\n // close socket when already given\n if (this.socket) {\n this.close()\n }\n\n // create websocket server\n this.socket = new WebsocketServer({ host, port })\n this.socket.binaryType = 'arraybuffer'\n this.socketStatus = STATUS.IS_CONNECTING\n\n // register events\n this.socket.on('open', () => {\n this.socketStatus = STATUS.IS_OPEN\n this.notify('open')\n })\n\n this.socket.on('close', () => {\n this.socketStatus = STATUS.IS_CLOSED\n this.notify('close')\n })\n\n this.socket.on('error', (error) => {\n this.notify('error', error)\n })\n\n this.socket.on('connection', (client) => {\n client.on('message', (message) => {\n this.notify(new Uint8Array(message))\n })\n })\n }\n\n /**\n * Close Websocket server\n */\n close() {\n this.socketStatus = STATUS.IS_CLOSING\n this.socket.close()\n }\n\n /**\n * Send an OSC Packet, Bundle or Message to Websocket clients\n * @param {Uint8Array} binary Binary representation of OSC Packet\n */\n send(binary) {\n this.socket.clients.forEach((client) => {\n client.send(binary, { binary: true })\n })\n }\n}\n","import { isObject, isString, isFunction, isInt } from './common/utils'\n\nimport Packet from './packet'\nimport Bundle from './bundle'\nimport Message from './message'\n\nimport EventHandler from './events'\n\nimport DatagramPlugin from './plugin/dgram'\nimport BridgePlugin from './plugin/bridge'\nimport WebsocketClientPlugin from './plugin/wsclient'\nimport WebsocketServerPlugin from './plugin/wsserver'\n\n/**\n * Default options\n * @private\n */\nconst defaultOptions = {\n plugin: new WebsocketClientPlugin(),\n discardLateMessages: false,\n}\n\n/**\n * Status flags\n */\nconst STATUS = {\n IS_NOT_INITIALIZED: -1,\n IS_CONNECTING: 0,\n IS_OPEN: 1,\n IS_CLOSING: 2,\n IS_CLOSED: 3,\n}\n\n/**\n * OSC interface to send OSC Packets and to listen to status-changes and\n * incoming message events. Offers a Plugin API for different network\n * protocols, defaults to a simple Websocket client for OSC communication\n * between a browser js-app and a js-node server\n *\n * @example\n * const osc = new OSC()\n *\n * osc.on('/input/test', (message) => {\n * // print incoming OSC message arguments\n * console.log(message.args)\n * })\n *\n * osc.on('open', () => {\n * const message = new Message('/test/path', 55.12, 'hello')\n * osc.send(message)\n * })\n *\n * osc.open({ host: '192.168.178.115', port: 9012 })\n */\nclass OSC {\n /**\n * Create an OSC instance with given options\n * @param {object} [options] Custom options\n * @param {boolean} [options.discardLateMessages=false] Ignore incoming\n * messages when given timetag lies in the past\n * @param {Plugin} [options.plugin=WebsocketClientPlugin] Add a connection plugin\n * to this interface, defaults to a plugin with Websocket client.\n * Open README.md for further information on how to handle plugins or\n * how to write your own with the Plugin API\n *\n * @example\n * const osc = new OSC() // default options with Websocket client\n *\n * @example\n * const osc = new OSC({ discardLateMessages: true })\n *\n * @example\n * const websocketPlugin = new OSC.WebsocketClientPlugin()\n * const osc = new OSC({ plugin: websocketPlugin })\n */\n constructor(options) {\n if (options && !isObject(options)) {\n throw new Error('OSC options argument has to be an object.')\n }\n\n /**\n * @type {object} options\n * @private\n */\n this.options = Object.assign({}, defaultOptions, options)\n /**\n * @type {EventHandler} eventHandler\n * @private\n */\n this.eventHandler = new EventHandler({\n discardLateMessages: this.options.discardLateMessages,\n })\n\n // pass EventHandler's notify() to plugin\n const eventHandler = this.eventHandler\n if (this.options.plugin && this.options.plugin.registerNotify) {\n this.options.plugin.registerNotify((...args) =>\n eventHandler.notify(...args)\n )\n }\n }\n\n /**\n * Listen to a status-change event or incoming OSC message with\n * address pattern matching\n * @param {string} eventName Event name or OSC address pattern\n * @param {function} callback Function which is called on notification\n * @return {number} Subscription id (needed to unsubscribe)\n *\n * @example\n * // will be called when server receives /in!trument/* for example\n * osc.on('/instrument/1', (message) => {\n * console.log(message)\n * })\n *\n * @example\n * // will be called on network socket error\n * osc.on('error', (message) => {\n * console.log(message)\n * })\n */\n on(eventName, callback) {\n if (!(isString(eventName) && isFunction(callback))) {\n throw new Error('OSC on() needs event- or address string and callback function')\n }\n\n return this.eventHandler.on(eventName, callback)\n }\n\n /**\n * Unsubscribe an event listener\n * @param {string} eventName Event name or OSC address pattern\n * @param {number} subscriptionId The subscription id\n * @return {boolean} Success state\n *\n * @example\n * const listenerId = osc.on('error', (message) => {\n * console.log(message)\n * })\n * osc.off('error', listenerId) // unsubscribe from error event\n */\n off(eventName, subscriptionId) {\n if (!(isString(eventName) && isInt(subscriptionId))) {\n throw new Error('OSC off() needs string and number (subscriptionId) to unsubscribe')\n }\n\n return this.eventHandler.off(eventName, subscriptionId)\n }\n\n /**\n * Open network socket with plugin. This method is used by\n * plugins and is not available without (see Plugin API for more information)\n * @param {object} [options] Custom global options for plugin instance\n *\n * @example\n * const osc = new OSC({ plugin: new OSC.DatagramPlugin() })\n * osc.open({ host: '127.0.0.1', port: 8080 })\n */\n open(options) {\n if (options && !isObject(options)) {\n throw new Error('OSC open() options argument needs to be an object')\n }\n\n if (!(this.options.plugin && isFunction(this.options.plugin.open))) {\n throw new Error('OSC Plugin API #open is not implemented!')\n }\n\n return this.options.plugin.open(options)\n }\n\n /**\n * Returns the current status of the connection. See *STATUS* for\n * different possible states. This method is used by plugins\n * and is not available without (see Plugin API for more information)\n * @return {number} Status identifier\n *\n * @example\n * import OSC, { STATUS } from 'osc'\n * const osc = new OSC()\n * if (osc.status() === STATUS.IS_CONNECTING) {\n * // do something\n * }\n */\n status() {\n if (!(this.options.plugin && isFunction(this.options.plugin.status))) {\n throw new Error('OSC Plugin API #status is not implemented!')\n }\n\n return this.options.plugin.status()\n }\n\n /**\n * Close connection. This method is used by plugins and is not\n * available without (see Plugin API for more information)\n */\n close() {\n if (!(this.options.plugin && isFunction(this.options.plugin.close))) {\n throw new Error('OSC Plugin API #close is not implemented!')\n }\n\n return this.options.plugin.close()\n }\n\n /**\n * Send an OSC Packet, Bundle or Message. This method is used by plugins\n * and is not available without (see Plugin API for more information)\n * @param {Packet|Bundle|Message} packet OSC Packet, Bundle or Message instance\n * @param {object} [options] Custom options\n *\n * @example\n * const osc = new OSC({ plugin: new OSC.DatagramPlugin() })\n * osc.open({ host: '127.0.0.1', port: 8080 })\n *\n * const message = new OSC.Message('/test/path', 55.1, 57)\n * osc.send(message)\n *\n * // send message again to custom address\n * osc.send(message, { host: '192.168.178.115', port: 9001 })\n */\n send(packet, options) {\n if (!(this.options.plugin && isFunction(this.options.plugin.send))) {\n throw new Error('OSC Plugin API #send is not implemented!')\n }\n\n if (!(packet instanceof Message || packet instanceof Bundle || packet instanceof Packet)) {\n throw new Error('OSC send() needs Messages, Bundles or Packets')\n }\n\n if (options && !isObject(options)) {\n throw new Error('OSC send() options argument has to be an object')\n }\n\n return this.options.plugin.send(packet.pack(), options)\n }\n}\n\n// expose status flags\nOSC.STATUS = STATUS\n\n// expose OSC classes\nOSC.Packet = Packet\nOSC.Bundle = Bundle\nOSC.Message = Message\n\n// expose plugins\nOSC.DatagramPlugin = DatagramPlugin\nOSC.WebsocketClientPlugin = WebsocketClientPlugin\nOSC.WebsocketServerPlugin = WebsocketServerPlugin\nOSC.BridgePlugin = BridgePlugin\n\nexport default OSC\n"],"names":["isInt","n","Number","isFloat","isString","isArray","Object","prototype","toString","call","isObject","isFunction","isBlob","Uint8Array","isDate","Date","pad","dataView","obj","buffer","DataView","ArrayBuffer","typeTag","item","Error","prepareAddress","address","join","length","slice","prepareRegExPattern","str","pattern","replace","EncodeHelper","data","byteLength","pack","push","result","offset","forEach","set","Atomic","value","method","initialOffset","AtomicInt32","AtomicFloat32","AtomicString","terminated","i","charCodeAt","charcode","getUint8","String","fromCharCode","apply","AtomicBlob","setInt32","getInt32","Message","types","args","shift","map","encoder","Helper","add","argument","merge","unpack","next","type","SECONDS_70_YEARS","TWO_POWER_32","Timetag","seconds","fractions","milliseconds","rounded","Math","floor","round","AtomicTimetag","now","timetag","timestamp","getTime","getUint32","BUNDLE_TAG","Bundle","bundleElements","ms","head","packet","Packet","size","defaultOptions","EventHandler","options","assign","addressHandlers","eventHandlers","uuid","bundle","bundleItem","dispatch","message","notify","name","success","handler","callback","handlerKeys","keys","handlers","key","regex","RegExp","test","lastIndex","discardLateMessages","that","split","subscriptionId","haystack","some","index","id","splice","dgram","__dirname","require","undefined","STATUS","defaultOpenOptions","defaultSendOptions","DatagramPlugin","customOptions","socket","createSocket","socketStatus","IS_NOT_INITIALIZED","on","error","fn","openOptions","port","exclusive","IS_CONNECTING","bind","host","IS_OPEN","IS_CLOSING","close","IS_CLOSED","binary","sendOptions","send","Buffer","WebSocket","Server","mergeOptions","base","custom","udpServer","udpClient","wsServer","BridgePlugin","websocket","receiver","binaryType","client","clients","WebsocketClient","WebsocketClientPlugin","onopen","onclose","onerror","onmessage","WebsocketServer","WebsocketServerPlugin","OSC","eventHandler","plugin","registerNotify","eventName","off","open","status"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":null,"sources":["../src/common/utils.js","../src/common/helpers.js","../src/atomic.js","../src/atomic/int32.js","../src/atomic/float32.js","../src/atomic/string.js","../src/atomic/blob.js","../src/message.js","../src/atomic/timetag.js","../src/bundle.js","../src/packet.js","../src/events.js","../src/plugin/dgram.js","../src/plugin/bridge.js","../src/plugin/wsclient.js","../src/plugin/wsserver.js","../src/osc.js"],"sourcesContent":["/**\n * Check if given object is an integer number\n * @param {*} n\n * @return {boolean}\n */\nexport function isInt(n) {\n return Number(n) === n && n % 1 === 0\n}\n\n/**\n * Check if given object is a float number\n * @param {*} n\n * @return {boolean}\n */\nexport function isFloat(n) {\n return Number(n) === n && n % 1 !== 0\n}\n\n/**\n * Check if given object is a string\n * @param {*} n\n * @return {boolean}\n */\nexport function isString(n) {\n return typeof n === 'string'\n}\n\n/**\n * Check if given object is an array\n * @param {*} n\n * @return {boolean}\n */\nexport function isArray(n) {\n return Object.prototype.toString.call(n) === '[object Array]'\n}\n\n/**\n * Check if given object is an object\n * @param {*} n\n * @return {boolean}\n */\nexport function isObject(n) {\n return Object.prototype.toString.call(n) === '[object Object]'\n}\n\n/**\n * Check if given object is a function\n * @param {*} n\n * @return {boolean}\n */\nexport function isFunction(n) {\n return typeof n === 'function'\n}\n\n/**\n * Check if given object is a Uint8Array\n * @param {*} n\n * @return {boolean}\n */\nexport function isBlob(n) {\n return n instanceof Uint8Array\n}\n\n/**\n * Check if given object is a Date\n * @param {*} n\n * @return {boolean}\n */\nexport function isDate(n) {\n return n instanceof Date\n}\n\n/**\n * Check if given object is undefined\n * @param {*} n\n * @return {boolean}\n */\nexport function isUndefined(n) {\n return typeof n === 'undefined'\n}\n\n/**\n * Return the next multiple of four\n * @param {number} n\n */\nexport function pad(n) {\n return (n + 3) & ~0x03\n}\n\n/**\n * Wrap binary data in DataView\n * @param {*} obj\n * @return {DataView}\n */\nexport function dataView(obj) {\n if (obj.buffer) {\n return new DataView(obj.buffer)\n } else if (obj instanceof ArrayBuffer) {\n return new DataView(obj)\n }\n\n return new DataView(new Uint8Array(obj))\n}\n","import { isArray, isInt, isFloat, isString, isBlob } from './utils'\n\n/**\n * Checks type of given object and returns the regarding OSC\n * Type tag character\n * @param {*} item Any object\n * @return {string} OSC Type tag character\n */\nexport function typeTag(item) {\n if (isInt(item)) {\n return 'i'\n } else if (isFloat(item)) {\n return 'f'\n } else if (isString(item)) {\n return 's'\n } else if (isBlob(item)) {\n return 'b'\n }\n\n throw new Error('OSC typeTag() found unknown value type')\n}\n\n/**\n * Sanitizes an OSC-ready Address Pattern\n * @param {array|string} obj Address as string or array of strings\n * @return {string} Corrected address string\n *\n * @example\n * // all calls return '/test/path' string:\n * prepareAddress('test/path')\n * prepareAddress('/test/path/')\n * prepareAddress([test, path])\n */\nexport function prepareAddress(obj) {\n let address = ''\n\n if (isArray(obj)) {\n return `/${obj.join('/')}`\n } else if (isString(obj)) {\n address = obj\n\n // remove slash at ending of address\n if (address.length > 1 && address[address.length - 1] === '/') {\n address = address.slice(0, address.length - 1)\n }\n\n // add slash at beginning of address\n if (address.length > 1 && address[0] !== '/') {\n address = `/${address}`\n }\n\n return address\n }\n\n throw new Error('OSC prepareAddress() needs addresses of type array or string')\n}\n\n/**\n * Make an OSC address pattern javascript-regex-ready\n * @param {string} str OSC address pattern\n * @return {string} Javascript RegEx string\n */\nexport function prepareRegExPattern(str) {\n let pattern\n\n if (!(isString(str))) {\n throw new Error('OSC prepareRegExPattern() needs strings')\n }\n\n pattern = str.replace(/\\./g, '\\\\.')\n pattern = pattern.replace(/\\(/g, '\\\\(')\n pattern = pattern.replace(/\\)/g, '\\\\)')\n\n pattern = pattern.replace(/\\{/g, '(')\n pattern = pattern.replace(/\\}/g, ')')\n pattern = pattern.replace(/,/g, '|')\n\n pattern = pattern.replace(/\\[!/g, '[^')\n\n pattern = pattern.replace(/\\?/g, '.')\n pattern = pattern.replace(/\\*/g, '.*')\n\n return pattern\n}\n\n/**\n * Holds a list of items and helps to merge them\n * into a single array of packed binary data\n */\nexport default class EncodeHelper {\n /**\n * Create a new EncodeHelper instance\n */\n constructor() {\n /** @type {array} data */\n this.data = []\n /** @type {number} byteLength */\n this.byteLength = 0\n }\n\n /**\n * Packs an item and adds it to the list\n * @param {*} item Any object\n * @return {EncodeHelper}\n */\n add(item) {\n const buffer = item.pack()\n this.byteLength += buffer.byteLength\n this.data.push(buffer)\n\n return this\n }\n\n /**\n * Merge all added items into one Uint8Array\n * @return {Uint8Array} Merged binary data array of all items\n */\n merge() {\n const result = new Uint8Array(this.byteLength)\n let offset = 0\n\n this.data.forEach((data) => {\n result.set(data, offset)\n offset += data.byteLength\n })\n\n return result\n }\n}\n","import { isUndefined } from './common/utils'\n\n/**\n * Base class for OSC Atomic Data Types\n */\nexport default class Atomic {\n /**\n * Create an Atomic instance\n * @param {*} [value] Initial value of any type\n */\n constructor(value) {\n /** @type {*} value */\n this.value = value\n /** @type {number} offset */\n this.offset = 0\n }\n\n /**\n * Interpret the given value of this entity as packed binary data\n * @param {string} method The DataView method to write to the ArrayBuffer\n * @param {number} byteLength Size of array in bytes\n * @return {Uint8Array} Packed binary data\n */\n pack(method, byteLength) {\n if (!(method && byteLength)) {\n throw new Error('OSC Atomic cant\\'t be packed without given method or byteLength')\n }\n\n const data = new Uint8Array(byteLength)\n const dataView = new DataView(data.buffer)\n\n if (isUndefined(this.value)) {\n throw new Error('OSC Atomic cant\\'t be encoded with empty value')\n }\n\n // use DataView to write to ArrayBuffer\n dataView[method](this.offset, this.value, false)\n\n // always return binary Uint8Array after packing\n return data\n }\n\n /**\n * Unpack binary data from DataView according to the given format\n * @param {DataView} dataView The DataView holding the binary representation of the value\n * @param {string} method The DataView method to read the format from the ArrayBuffer\n * @param {number} byteLength Size of array in bytes\n * @param {number} [initialOffset=0] Offset of DataView before unpacking\n * @return {number} Offset after unpacking\n */\n unpack(dataView, method, byteLength, initialOffset = 0) {\n if (!(dataView && method && byteLength)) {\n throw new Error('OSC Atomic cant\\'t be unpacked without given dataView, method or byteLength')\n }\n\n if (!(dataView instanceof DataView)) {\n throw new Error('OSC Atomic expects an instance of type DataView')\n }\n\n // use DataView to read from ArrayBuffer and add offset\n this.value = dataView[method](initialOffset, false)\n this.offset = initialOffset + byteLength\n\n // always return offset number after unpacking\n return this.offset\n }\n}\n","import { isInt } from '../common/utils'\n\nimport Atomic from '../atomic'\n\n/**\n * 32-bit big-endian two's complement integer OSC Atomic Data Type\n */\nexport default class AtomicInt32 extends Atomic {\n /**\n * Create an AtomicInt32 instance\n * @param {number} [value] Initial integer value\n */\n constructor(value) {\n if (value && !isInt(value)) {\n throw new Error('OSC AtomicInt32 constructor expects value of type number')\n }\n\n super(value)\n }\n\n /**\n * Interpret the given number as packed binary data\n * @return {Uint8Array} Packed binary data\n */\n pack() {\n return super.pack('setInt32', 4)\n }\n\n /**\n * Unpack binary data from DataView and read a Int32 number\n * @param {DataView} dataView The DataView holding the binary representation of the value\n * @param {number} [initialOffset=0] Offset of DataView before unpacking\n * @return {number} Offset after unpacking\n */\n unpack(dataView, initialOffset = 0) {\n return super.unpack(dataView, 'getInt32', 4, initialOffset)\n }\n}\n","import { isFloat } from '../common/utils'\n\nimport Atomic from '../atomic'\n\n/**\n * 32-bit big-endian IEEE 754 floating point number OSC Atomic Data Type\n */\nexport default class AtomicFloat32 extends Atomic {\n /**\n * Create an AtomicFloat32 instance\n * @param {number} [value] Float number\n */\n constructor(value) {\n if (value && !isFloat(value)) {\n throw new Error('OSC AtomicFloat32 constructor expects value of type float')\n }\n\n super(value)\n }\n\n /**\n * Interpret the given number as packed binary data\n * @return {Uint8Array} Packed binary data\n */\n pack() {\n return super.pack('setFloat32', 4)\n }\n\n /**\n * Unpack binary data from DataView and read a Float32 number\n * @param {DataView} dataView The DataView holding the binary representation of the value\n * @param {number} [initialOffset=0] Offset of DataView before unpacking\n * @return {number} Offset after unpacking\n */\n unpack(dataView, initialOffset = 0) {\n return super.unpack(dataView, 'getFloat32', 4, initialOffset)\n }\n}\n","import { pad, isString, isUndefined } from '../common/utils'\n\nimport Atomic from '../atomic'\n\n/**\n * A sequence of non-null ASCII characters OSC Atomic Data Type\n */\nexport default class AtomicString extends Atomic {\n /**\n * Create an AtomicString instance\n * @param {string} [value] Initial string value\n */\n constructor(value) {\n if (value && !isString(value)) {\n throw new Error('OSC AtomicString constructor expects value of type string')\n }\n\n super(value)\n }\n\n /**\n * Interpret the given string as packed binary data\n * @return {Uint8Array} Packed binary data\n */\n pack() {\n if (isUndefined(this.value)) {\n throw new Error('OSC AtomicString can not be encoded with empty value')\n }\n\n // add 0-3 null characters for total number of bits a multiple of 32\n const terminated = `${this.value}\\u0000`\n const byteLength = pad(terminated.length)\n\n const buffer = new Uint8Array(byteLength)\n\n for (let i = 0; i < terminated.length; i += 1) {\n buffer[i] = terminated.charCodeAt(i)\n }\n\n return buffer\n }\n\n /**\n * Unpack binary data from DataView and read a string\n * @param {DataView} dataView The DataView holding the binary representation of the string\n * @param {number} [initialOffset=0] Offset of DataView before unpacking\n * @return {number} Offset after unpacking\n */\n unpack(dataView, initialOffset = 0) {\n if (!(dataView instanceof DataView)) {\n throw new Error('OSC AtomicString expects an instance of type DataView')\n }\n\n let offset = initialOffset\n let charcode\n const data = []\n\n for (; offset < dataView.byteLength; offset += 1) {\n charcode = dataView.getUint8(offset)\n\n // check for terminating null character\n if (charcode !== 0) {\n data.push(charcode)\n } else {\n offset += 1\n break\n }\n }\n\n if (offset === dataView.length) {\n throw new Error('OSC AtomicString found a malformed OSC string')\n }\n\n /** @type {number} offset */\n this.offset = pad(offset)\n /** @type {string} value */\n this.value = String.fromCharCode.apply(null, data)\n\n return this.offset\n }\n}\n","import { pad, isBlob, isUndefined } from '../common/utils'\n\nimport Atomic from '../atomic'\n\n/**\n * 8-bit bytes of arbitrary binary data OSC Atomic Data Type\n */\nexport default class AtomicBlob extends Atomic {\n /**\n * Create an AtomicBlob instance\n * @param {Uint8Array} [value] Binary data\n */\n constructor(value) {\n if (value && !isBlob(value)) {\n throw new Error('OSC AtomicBlob constructor expects value of type Uint8Array')\n }\n\n super(value)\n }\n\n /**\n * Interpret the given blob as packed binary data\n * @return {Uint8Array} Packed binary data\n */\n pack() {\n if (isUndefined(this.value)) {\n throw new Error('OSC AtomicBlob can not be encoded with empty value')\n }\n\n const byteLength = pad(this.value.byteLength)\n const data = new Uint8Array(byteLength + 4)\n const dataView = new DataView(data.buffer)\n\n // an int32 size count\n dataView.setInt32(0, this.value.byteLength, false)\n // followed by 8-bit bytes of arbitrary binary data\n data.set(this.value, 4)\n\n return data\n }\n\n /**\n * Unpack binary data from DataView and read a blob\n * @param {DataView} dataView The DataView holding the binary representation of the blob\n * @param {number} [initialOffset=0] Offset of DataView before unpacking\n * @return {number} Offset after unpacking\n */\n unpack(dataView, initialOffset = 0) {\n if (!(dataView instanceof DataView)) {\n throw new Error('OSC AtomicBlob expects an instance of type DataView')\n }\n\n const byteLength = dataView.getInt32(initialOffset, false)\n\n /** @type {Uint8Array} value */\n this.value = new Uint8Array(dataView.buffer, initialOffset + 4, byteLength)\n /** @type {number} offset */\n this.offset = pad(initialOffset + 4 + byteLength)\n\n return this.offset\n }\n}\n","import { isString, isArray, isInt, isFloat, isBlob } from './common/utils'\nimport Helper, { typeTag, prepareAddress } from './common/helpers'\n\nimport AtomicInt32 from './atomic/int32'\nimport AtomicFloat32 from './atomic/float32'\nimport AtomicString from './atomic/string'\nimport AtomicBlob from './atomic/blob'\n\n/**\n * An OSC message consists of an OSC Address Pattern followed\n * by an OSC Type Tag String followed by zero or more OSC Arguments\n */\nexport default class Message {\n /**\n * Create a Message instance\n * @param {array|string} args Address\n * @param {...*} args OSC Atomic Data Types\n *\n * @example\n * const message = new Message(['test', 'path'], 50, 100.52, 'test')\n *\n * @example\n * const message = new Message('/test/path', 51.2)\n */\n constructor(...args) {\n /**\n * @type {number} offset\n * @private\n */\n this.offset = 0\n /** @type {string} address */\n this.address = ''\n /** @type {string} types */\n this.types = ''\n /** @type {array} args */\n this.args = []\n\n if (args.length > 0) {\n if (!(isString(args[0]) || isArray(args[0]))) {\n throw new Error('OSC Message constructor first argument (address) must be a string or array')\n }\n\n this.address = prepareAddress(args.shift())\n this.types = args.map(item => typeTag(item)).join('')\n this.args = args\n }\n }\n\n /**\n * Add an OSC Atomic Data Type to the list of elements\n * @param {*} item\n */\n add(item) {\n if (!item) {\n throw new Error('OSC Message needs a valid OSC Atomic Data Type')\n }\n\n this.args.push(item)\n this.types += typeTag(item)\n }\n\n /**\n * Interpret the Message as packed binary data\n * @return {Uint8Array} Packed binary data\n */\n pack() {\n if (this.address.length === 0 || this.address[0] !== '/') {\n throw new Error('OSC Message has an invalid address')\n }\n\n const encoder = new Helper()\n\n // OSC Address Pattern and Type string\n encoder.add(new AtomicString(this.address))\n encoder.add(new AtomicString(`,${this.types}`))\n\n // followed by zero or more OSC Arguments\n if (this.args.length > 0) {\n let argument\n\n this.args.forEach((value) => {\n if (isInt(value)) {\n argument = new AtomicInt32(value)\n } else if (isFloat(value)) {\n argument = new AtomicFloat32(value)\n } else if (isString(value)) {\n argument = new AtomicString(value)\n } else if (isBlob(value)) {\n argument = new AtomicBlob(value)\n } else {\n throw new Error('OSC Message found unknown argument type')\n }\n\n encoder.add(argument)\n })\n }\n\n return encoder.merge()\n }\n\n /**\n * Unpack binary data to read a Message\n * @param {DataView} dataView The DataView holding the binary representation of a Message\n * @param {number} [initialOffset=0] Offset of DataView before unpacking\n * @return {number} Offset after unpacking\n */\n unpack(dataView, initialOffset = 0) {\n if (!(dataView instanceof DataView)) {\n throw new Error('OSC Message expects an instance of type DataView.')\n }\n\n // read address pattern\n const address = new AtomicString()\n address.unpack(dataView, initialOffset)\n\n // read type string\n const types = new AtomicString()\n types.unpack(dataView, address.offset)\n\n if (address.value.length === 0 || address.value[0] !== '/') {\n throw new Error('OSC Message found malformed or missing address string')\n }\n\n if (types.value.length === 0 && types.value[0] !== ',') {\n throw new Error('OSC Message found malformed or missing type string')\n }\n\n let offset = types.offset\n let next\n let type\n\n const args = []\n\n // read message arguments (OSC Atomic Data Types)\n for (let i = 1; i < types.value.length; i += 1) {\n type = types.value[i]\n\n if (type === 'i') {\n next = new AtomicInt32()\n } else if (type === 'f') {\n next = new AtomicFloat32()\n } else if (type === 's') {\n next = new AtomicString()\n } else if (type === 'b') {\n next = new AtomicBlob()\n } else {\n throw new Error('OSC Message found non-standard argument type')\n }\n\n offset = next.unpack(dataView, offset)\n args.push(next.value)\n }\n\n this.offset = offset\n this.address = address.value\n this.types = types.value\n this.args = args\n\n return this.offset\n }\n}\n","import { isInt, isDate, isUndefined } from '../common/utils'\n\nimport Atomic from '../atomic'\n\n/** 70 years in seconds */\nexport const SECONDS_70_YEARS = 2208988800\n/** 2^32 */\nexport const TWO_POWER_32 = 4294967296\n\n/**\n * Timetag helper class for representing NTP timestamps\n * and conversion between them and javascript representation\n */\nexport class Timetag {\n /**\n * Create a Timetag instance\n * @param {number} [seconds=0] Initial NTP *seconds* value\n * @param {number} [fractions=0] Initial NTP *fractions* value\n */\n constructor(seconds = 0, fractions = 0) {\n if (!(isInt(seconds) && isInt(fractions))) {\n throw new Error('OSC Timetag constructor expects values of type integer number')\n }\n\n /** @type {number} seconds */\n this.seconds = seconds\n /** @type {number} fractions */\n this.fractions = fractions\n }\n\n /**\n * Converts from NTP to JS representation and back\n * @param {number} [milliseconds] Converts from JS milliseconds to NTP.\n * Leave empty for converting from NTP to JavaScript representation\n * @return {number} Javascript timestamp\n */\n timestamp(milliseconds) {\n let seconds\n\n if (typeof milliseconds === 'number') {\n seconds = milliseconds / 1000\n const rounded = Math.floor(seconds)\n\n this.seconds = rounded + SECONDS_70_YEARS\n this.fractions = Math.round(TWO_POWER_32 * (seconds - rounded))\n\n return milliseconds\n }\n\n seconds = this.seconds - SECONDS_70_YEARS\n return (seconds + (this.fractions / TWO_POWER_32)) * 1000\n }\n}\n\n/**\n * 64-bit big-endian fixed-point time tag, semantics\n * defined below OSC Atomic Data Type\n */\nexport default class AtomicTimetag extends Atomic {\n /**\n * Create a AtomicTimetag instance\n * @param {number|Timetag|Date} [value] Initial date, leave empty if\n * you want it to be the current date\n */\n constructor(value = Date.now()) {\n let timetag = new Timetag()\n\n if (value instanceof Timetag) {\n timetag = value\n } else if (isInt(value)) {\n timetag.timestamp(value)\n } else if (isDate(value)) {\n timetag.timestamp(value.getTime())\n }\n\n super(timetag)\n }\n\n /**\n * Interpret the given timetag as packed binary data\n * @return {Uint8Array} Packed binary data\n */\n pack() {\n if (isUndefined(this.value)) {\n throw new Error('OSC AtomicTimetag can not be encoded with empty value')\n }\n\n const { seconds, fractions } = this.value\n const data = new Uint8Array(8)\n const dataView = new DataView(data.buffer)\n\n dataView.setInt32(0, seconds, false)\n dataView.setInt32(4, fractions, false)\n\n return data\n }\n\n /**\n * Unpack binary data from DataView and read a timetag\n * @param {DataView} dataView The DataView holding the binary representation of the timetag\n * @param {number} [initialOffset=0] Offset of DataView before unpacking\n * @return {number} Offset after unpacking\n */\n unpack(dataView, initialOffset = 0) {\n if (!(dataView instanceof DataView)) {\n throw new Error('OSC AtomicTimetag expects an instance of type DataView')\n }\n\n const seconds = dataView.getUint32(initialOffset, false)\n const fractions = dataView.getUint32(initialOffset + 4, false)\n\n /** @type {Timetag} value */\n this.value = new Timetag(seconds, fractions)\n /** @type {number} offset */\n this.offset = initialOffset + 8\n\n return this.offset\n }\n}\n","import { isArray, isInt } from './common/utils'\nimport EncodeHelper from './common/helpers'\n\nimport Packet from './packet'\nimport Message from './message'\nimport AtomicString from './atomic/string'\nimport AtomicInt32 from './atomic/int32'\nimport AtomicTimetag from './atomic/timetag'\n\n/** OSC Bundle string */\nexport const BUNDLE_TAG = '#bundle'\n\n/**\n * An OSC Bundle consist of a Timetag and one or many Bundle Elements.\n * The elements are either OSC Messages or more OSC Bundles\n */\nexport default class Bundle {\n /**\n * Create a Bundle instance\n * @param {...*} [args] Timetag and elements. See examples for options\n *\n * @example\n * const bundle = new Bundle(new Date() + 500)\n *\n * @example\n * const message = new Message('/test/path', 51.2)\n * const anotherBundle = new Bundle([message], Date.now() + 1500)\n *\n * @example\n * const message = new Message('/test/path', 51.2)\n * const anotherMessage = new Message('/test/message', 'test', 12)\n * const anotherBundle = new Bundle(message, anotherMessage)\n */\n constructor(...args) {\n /**\n * @type {number} offset\n * @private\n */\n this.offset = 0\n /** @type {AtomicTimetag} timetag */\n this.timetag = new AtomicTimetag()\n /** @type {array} bundleElements */\n this.bundleElements = []\n\n if (args.length > 0) {\n // first argument is an Date or js timestamp (number)\n if (args[0] instanceof Date || isInt(args[0])) {\n this.timetag = new AtomicTimetag(args[0])\n } else if (isArray(args[0])) {\n // first argument is an Array of Bundle elements\n args[0].forEach((item) => {\n this.add(item)\n })\n\n // second argument is an Date or js timestamp (number)\n if (args.length > 1 && (args[1] instanceof Date || isInt(args[0]))) {\n this.timetag = new AtomicTimetag(args[1])\n }\n } else {\n // take all arguments as Bundle elements\n args.forEach((item) => {\n this.add(item)\n })\n }\n }\n }\n\n /**\n * Take a JavaScript timestamp to set the Bundle's timetag\n * @param {number} ms JS timestamp in milliseconds\n *\n * @example\n * const bundle = new Bundle()\n * bundle.timestamp(Date.now() + 5000) // in 5 seconds\n */\n timestamp(ms) {\n if (!isInt(ms)) {\n throw new Error('OSC Bundle needs an integer for setting the timestamp')\n }\n\n this.timetag = new AtomicTimetag(ms)\n }\n\n /**\n * Add a Message or Bundle to the list of elements\n * @param {Bundle|Message} item\n */\n add(item) {\n if (!(item instanceof Message || item instanceof Bundle)) {\n throw new Error('OSC Bundle contains only Messages and Bundles')\n }\n\n this.bundleElements.push(item)\n }\n\n /**\n * Interpret the Bundle as packed binary data\n * @return {Uint8Array} Packed binary data\n */\n pack() {\n const encoder = new EncodeHelper()\n\n // an OSC Bundle consists of the OSC-string \"#bundle\"\n encoder.add(new AtomicString(BUNDLE_TAG))\n\n // followed by an OSC Time Tag\n if (!this.timetag) {\n this.timetag = new AtomicTimetag()\n }\n\n encoder.add(this.timetag)\n\n // followed by zero or more OSC Bundle Elements\n this.bundleElements.forEach((item) => {\n encoder.add(new AtomicInt32(item.pack().byteLength))\n encoder.add(item)\n })\n\n return encoder.merge()\n }\n\n /**\n * Unpack binary data to read a Bundle\n * @param {DataView} dataView The DataView holding the binary representation of a Bundle\n * @param {number} [initialOffset=0] Offset of DataView before unpacking\n * @return {number} Offset after unpacking\n */\n unpack(dataView, initialOffset = 0) {\n if (!(dataView instanceof DataView)) {\n throw new Error('OSC Bundle expects an instance of type DataView')\n }\n\n // read the beginning bundle string\n const head = new AtomicString()\n head.unpack(dataView, initialOffset)\n\n if (head.value !== BUNDLE_TAG) {\n throw new Error('OSC Bundle does not contain a valid #bundle head')\n }\n\n // read the timetag\n const timetag = new AtomicTimetag()\n let offset = timetag.unpack(dataView, head.offset)\n\n // read the bundle elements\n this.bundleElements = []\n\n while (offset < dataView.byteLength) {\n const packet = new Packet()\n const size = new AtomicInt32()\n\n offset = size.unpack(dataView, offset)\n offset = packet.unpack(dataView, offset, this.timetag)\n\n this.bundleElements.push(packet.value)\n }\n\n this.offset = offset\n this.timetag = timetag\n\n return this.offset\n }\n}\n","import Bundle, { BUNDLE_TAG } from './bundle'\nimport Message from './message'\nimport AtomicString from './atomic/string'\n\n/**\n * The unit of transmission of OSC is an OSC Packet. The contents\n * of an OSC packet must be either an OSC Message or an OSC Bundle\n */\nexport default class Packet {\n /**\n * Create a Packet instance holding a Message or Bundle\n * @param {Message|Bundle} [value] Initial Packet value\n */\n constructor(value) {\n if (value && !(value instanceof Message || value instanceof Bundle)) {\n throw new Error('OSC Packet value has to be Message or Bundle')\n }\n\n /** @type {Message|Bundle} value */\n this.value = value\n /**\n * @type {number} offset\n * @private\n */\n this.offset = 0\n }\n\n /**\n * Packs the Packet value. This implementation is more like\n * a wrapper due to OSC specifications, you could also skip the\n * Packet and directly work with the Message or Bundle instance\n * @return {Uint8Array} Packed binary data\n *\n * @example\n * const message = new Message('/test/path', 21.5, 'test')\n * const packet = new Packet(message)\n * const packetBinary = packet.pack() // then send it via udp etc.\n *\n * // or skip the Packet for convenience\n * const messageBinary = message.pack()\n */\n pack() {\n if (!this.value) {\n throw new Error('OSC Packet can not be encoded with empty body')\n }\n\n return this.value.pack()\n }\n\n /**\n * Unpack binary data from DataView to read Messages or Bundles\n * @param {DataView} dataView The DataView holding a binary representation of a Packet\n * @param {number} [initialOffset=0] Offset of DataView before unpacking\n * @return {number} Offset after unpacking\n */\n unpack(dataView, initialOffset = 0) {\n if (!(dataView instanceof DataView)) {\n throw new Error('OSC Packet expects an instance of type DataView')\n }\n\n if (dataView.byteLength % 4 !== 0) {\n throw new Error('OSC Packet byteLength has to be a multiple of four')\n }\n\n const head = new AtomicString()\n head.unpack(dataView, initialOffset)\n\n let item\n\n // check if Packet is a Bundle or a Message\n if (head.value === BUNDLE_TAG) {\n item = new Bundle()\n } else {\n item = new Message()\n }\n\n item.unpack(dataView, initialOffset)\n\n this.offset = item.offset\n this.value = item\n\n return this.offset\n }\n}\n","import { isArray, isString, isInt, isFunction, dataView } from './common/utils'\nimport { prepareAddress, prepareRegExPattern } from './common/helpers'\n\nimport Packet from './packet'\nimport Bundle from './bundle'\nimport Message from './message'\n\n/**\n * Default options\n * @private\n */\nconst defaultOptions = {\n discardLateMessages: false,\n}\n\n/**\n * EventHandler to notify listeners on matching OSC messages and\n * status changes of plugins\n */\nexport default class EventHandler {\n /**\n * Create an EventHandler instance\n * @param {object} options Custom options\n */\n constructor(options) {\n /**\n * @type {object} options\n * @private\n */\n this.options = Object.assign({}, defaultOptions, options)\n /**\n * @type {array} addressHandlers\n * @private\n */\n this.addressHandlers = []\n /**\n * @type {object} eventHandlers\n * @private\n */\n this.eventHandlers = {\n open: [],\n error: [],\n close: [],\n }\n /**\n * @type {number} uuid\n * @private\n */\n this.uuid = 0\n }\n\n /**\n * Internally used method to dispatch OSC Packets. Extracts\n * given Timetags and dispatches them accordingly\n * @param {Packet} packet\n * @return {boolean} Success state\n * @private\n */\n dispatch(packet) {\n if (!(packet instanceof Packet)) {\n throw new Error('OSC EventHander dispatch() accepts only arguments of type Packet')\n }\n\n if (!packet.value) {\n throw new Error('OSC EventHander dispatch() can\\'t read empty Packets')\n }\n\n if (packet.value instanceof Bundle) {\n const bundle = packet.value\n\n return bundle.bundleElements.forEach((bundleItem) => {\n if (packet.value instanceof Bundle) {\n if (bundle.timetag.value.timestamp() < bundleItem.timetag.value.timestamp()) {\n throw new Error('OSC Bundle timestamp is older than the timestamp of enclosed Bundles')\n }\n return this.dispatch(bundleItem)\n } else if (bundleItem instanceof Message) {\n const message = bundleItem\n return this.notify(message.address, message, bundle.timetag.value.timestamp())\n }\n\n throw new Error('OSC EventHander dispatch() can\\'t dispatch unknown Packet value')\n })\n } else if (packet.value instanceof Message) {\n const message = packet.value\n return this.notify(message.address, message)\n }\n\n throw new Error('OSC EventHander dispatch() can\\'t dispatch unknown Packet value')\n }\n\n /**\n * Internally used method to invoke listener callbacks. Uses regular\n * expression pattern matching for OSC addresses\n * @param {string} name OSC address or event name\n * @param {*} [data] The data of the event\n * @return {boolean} Success state\n * @private\n */\n call(name, data) {\n let success = false\n\n // call event handlers\n if (isString(name) && name in this.eventHandlers) {\n this.eventHandlers[name].forEach((handler) => {\n handler.callback(data)\n success = true\n })\n\n return success\n }\n\n // call address handlers\n const handlerKeys = Object.keys(this.addressHandlers)\n const handlers = this.addressHandlers\n\n handlerKeys.forEach((key) => {\n const regex = new RegExp(prepareRegExPattern(prepareAddress(name)), 'g')\n const test = regex.test(key)\n\n // found a matching address in our callback handlers\n if (test && key.length === regex.lastIndex) {\n handlers[key].forEach((handler) => {\n handler.callback(data)\n success = true\n })\n }\n })\n\n return success\n }\n\n /**\n * Notify the EventHandler of incoming OSC messages or status\n * changes (*open*, *close*, *error*). Handles OSC address patterns\n * and executes timed messages. Use binary arrays when\n * handling directly incoming network data. Packet's or Messages can\n * also be used\n * @param {...*} args\n * The OSC address pattern / event name as string}. For convenience and\n * Plugin API communication you can also use Message or Packet instances\n * or ArrayBuffer, Buffer instances (low-level access). The latter will\n * automatically be unpacked\n * When using a string you can also pass on data as a second argument\n * (any type). All regarding listeners will be notified with this data.\n * As a third argument you can define a javascript timestamp (number or\n * Date instance) for timed notification of the listeners.\n * @return {boolean} Success state of notification\n *\n * @example\n * const socket = dgram.createSocket('udp4')\n * socket.on('message', (message) => {\n * this.notify(message)\n * })\n *\n * @example\n * this.notify('error', error.message)\n *\n * @example\n * const message = new OSC.Message('/test/path', 55)\n * this.notify(message)\n *\n * @example\n * const message = new OSC.Message('/test/path', 55)\n * // override timestamp\n * this.notify(message.address, message, Date.now() + 5000)\n */\n notify(...args) {\n if (args.length === 0) {\n throw new Error('OSC EventHandler can not be called without any argument')\n }\n\n // check for incoming dispatchable OSC data\n if (args[0] instanceof Packet) {\n return this.dispatch(args[0])\n } else if (args[0] instanceof Bundle || args[0] instanceof Message) {\n return this.dispatch(new Packet(args[0]))\n } else if (!isString(args[0])) {\n const packet = new Packet()\n packet.unpack(dataView(args[0]))\n return this.dispatch(packet)\n }\n\n const name = args[0]\n\n // data argument\n let data = null\n\n if (args.length > 1) {\n data = args[1]\n }\n\n // timestamp argument\n let timestamp = null\n\n if (args.length > 2) {\n if (isInt(args[2])) {\n timestamp = args[2]\n } else if (args[2] instanceof Date) {\n timestamp = args[2].getTime()\n } else {\n throw new Error('OSC EventHandler timestamp has to be a number or Date')\n }\n }\n\n // notify now or later\n if (timestamp) {\n const now = Date.now()\n\n // is message outdated?\n if (now > timestamp) {\n if (!this.options.discardLateMessages) {\n return this.call(name, data)\n }\n }\n\n // notify later\n const that = this\n\n setTimeout(() => {\n that.call(name, data)\n }, timestamp - now)\n\n return true\n }\n\n return this.call(name, data)\n }\n\n /**\n * Subscribe to a new address or event you want to listen to\n * @param {string} name The OSC address or event name\n * @param {function} callback Callback function on notification\n * @return {number} Subscription identifier (needed to unsubscribe)\n */\n on(name, callback) {\n if (!(isString(name) || isArray(name))) {\n throw new Error('OSC EventHandler accepts only strings or arrays for address patterns')\n }\n\n if (!isFunction(callback)) {\n throw new Error('OSC EventHandler callback has to be a function')\n }\n\n // get next id\n this.uuid += 1\n\n // prepare handler\n const handler = {\n id: this.uuid,\n callback,\n }\n\n // register event listener\n if (isString(name) && name in this.eventHandlers) {\n this.eventHandlers[name].push(handler)\n return this.uuid\n }\n\n // register address listener\n const address = prepareAddress(name)\n const regex = new RegExp(/[#*\\s[\\],/{}|?]/g)\n\n if (regex.test(address.split('/').join(''))) {\n throw new Error('OSC EventHandler address string contains invalid characters')\n }\n\n if (!(address in this.addressHandlers)) {\n this.addressHandlers[address] = []\n }\n\n this.addressHandlers[address].push(handler)\n\n return this.uuid\n }\n\n /**\n * Unsubscribe listener from event notification or address handler\n * @param {string} name The OSC address or event name\n * @param {number} subscriptionId Subscription id to identify the handler\n * @return {boolean} Success state\n */\n off(name, subscriptionId) {\n if (!(isString(name) || isArray(name))) {\n throw new Error('OSC EventHandler accepts only strings or arrays for address patterns')\n }\n\n if (!isInt(subscriptionId)) {\n throw new Error('OSC EventHandler subscription id has to be a number')\n }\n\n let key\n let haystack\n\n // event or address listener\n if (isString(name) && name in this.eventHandlers) {\n key = name\n haystack = this.eventHandlers\n } else {\n key = prepareAddress(name)\n haystack = this.addressHandlers\n }\n\n // remove the entry\n if (key in haystack) {\n return haystack[key].some((item, index) => {\n if (item.id === subscriptionId) {\n haystack[key].splice(index, 1)\n return true\n }\n\n return false\n })\n }\n\n return false\n }\n}\n","const dgram = typeof __dirname !== 'undefined' ? require('dgram') : undefined\n\n/**\n * Status flags\n * @private\n */\nconst STATUS = {\n IS_NOT_INITIALIZED: -1,\n IS_CONNECTING: 0,\n IS_OPEN: 1,\n IS_CLOSING: 2,\n IS_CLOSED: 3,\n}\n\n/**\n * Default options for open method\n * @private\n */\nconst defaultOpenOptions = {\n host: 'localhost',\n port: 41234,\n exclusive: false,\n}\n\n/**\n * Default options for send method\n * @private\n */\nconst defaultSendOptions = {\n host: 'localhost',\n port: 41235,\n}\n\n/**\n * Default options\n * @private\n */\nconst defaultOptions = {\n type: 'udp4',\n open: defaultOpenOptions,\n send: defaultSendOptions,\n}\n\n/**\n * OSC plugin for simple OSC messaging via udp client\n * and udp server\n */\nexport default class DatagramPlugin {\n /**\n * Create an OSC Plugin instance with given options. Defaults to\n * localhost:41234 for server and localhost:41235 for client messaging\n * @param {object} [options] Custom options\n * @param {string} [options.type='udp4'] 'udp4' or 'udp6'\n * @param {string} [options.open.host='localhost'] Hostname of udp server to bind to\n * @param {number} [options.open.port=41234] Port of udp server to bind to\n * @param {boolean} [options.open.exclusive=false] Exclusive flag\n * @param {string} [options.send.host='localhost'] Hostname of udp client for messaging\n * @param {number} [options.send.port=41235] Port of udp client for messaging\n *\n * @example\n * const plugin = new OSC.DatagramPlugin({ send: { port: 9912 } })\n * const osc = new OSC({ plugin: plugin })\n */\n constructor(customOptions = {}) {\n if (!dgram) {\n throw new Error('DatagramPlugin can not be used in browser context')\n }\n\n /**\n * @type {object} options\n * @private\n */\n this.options = Object.assign({}, defaultOptions, customOptions)\n\n /**\n * @type {object} socket\n * @private\n */\n this.socket = dgram.createSocket(this.options.type)\n /**\n * @type {number} socketStatus\n * @private\n */\n this.socketStatus = STATUS.IS_NOT_INITIALIZED\n\n // register events\n this.socket.on('message', (message) => {\n this.notify(message)\n })\n\n this.socket.on('error', (error) => {\n this.notify('error', error)\n })\n\n /**\n * @type {function} notify\n * @private\n */\n this.notify = () => {}\n }\n\n /**\n * Internal method to hook into osc library's\n * EventHandler notify method\n * @param {function} fn Notify callback\n * @private\n */\n registerNotify(fn) {\n this.notify = fn\n }\n\n /**\n * Returns the current status of the connection\n * @return {number} Status ID\n */\n status() {\n return this.socketStatus\n }\n\n /**\n * Bind a udp socket to a hostname and port\n * @param {object} [customOptions] Custom options\n * @param {string} [customOptions.host='localhost'] Hostname of udp server to bind to\n * @param {number} [customOptions.port=41234] Port of udp server to bind to\n * @param {boolean} [customOptions.exclusive=false] Exclusive flag\n */\n open(customOptions = {}) {\n const options = Object.assign({}, this.options.openOptions, customOptions)\n const { port, exclusive } = options\n\n this.socketStatus = STATUS.IS_CONNECTING\n\n this.socket.bind({\n address: options.host,\n port,\n exclusive,\n }, () => {\n this.socketStatus = STATUS.IS_OPEN\n this.notify('open')\n })\n }\n\n /**\n * Close udp socket\n */\n close() {\n this.socketStatus = STATUS.IS_CLOSING\n\n this.socket.close(() => {\n this.socketStatus = STATUS.IS_CLOSED\n this.notify('close')\n })\n }\n\n /**\n * Send an OSC Packet, Bundle or Message. Use options here for\n * custom port and hostname, otherwise the global options will\n * be taken\n * @param {Uint8Array} binary Binary representation of OSC Packet\n * @param {object} [customOptions] Custom options for udp socket\n * @param {string} [customOptions.host] Hostname of udp client\n * @param {number} [customOptions.port] Port of udp client\n */\n send(binary, customOptions = {}) {\n const options = Object.assign({}, this.options.sendOptions, customOptions)\n const { port, host } = options\n\n this.socket.send(new Buffer(binary), 0, binary.byteLength, port, host)\n }\n}\n","const dgram = typeof __dirname !== 'undefined' ? require('dgram') : undefined\nconst WebSocket = typeof __dirname !== 'undefined' ? require('ws').Server : undefined\n\n/**\n * Status flags\n * @private\n */\nconst STATUS = {\n IS_NOT_INITIALIZED: -1,\n IS_CONNECTING: 0,\n IS_OPEN: 1,\n IS_CLOSING: 2,\n IS_CLOSED: 3,\n}\n\n/**\n * Default options\n * @private\n */\nconst defaultOptions = {\n udpServer: {\n host: 'localhost',\n port: 41234,\n exclusive: false,\n },\n udpClient: {\n host: 'localhost',\n port: 41235,\n },\n wsServer: {\n host: 'localhost',\n port: 8080,\n },\n receiver: 'ws',\n}\n\n/**\n * Helper method to merge nested objects\n * @private\n */\nfunction mergeOptions(base, custom) {\n return Object.assign({}, defaultOptions, base, custom, {\n udpServer: Object.assign({}, defaultOptions.udpServer, base.udpServer, custom.udpServer),\n udpClient: Object.assign({}, defaultOptions.udpClient, base.udpClient, custom.udpClient),\n wsServer: Object.assign({}, defaultOptions.wsServer, base.wsServer, custom.wsServer),\n })\n}\n\n/**\n * OSC plugin for setting up communication between a Websocket\n * client and a udp client with a bridge inbetween\n */\nexport default class BridgePlugin {\n /**\n * Create an OSC Bridge instance with given options. Defaults to\n * localhost:41234 for udp server, localhost:41235 for udp client and\n * localhost:8080 for Websocket server\n * @param {object} [options] Custom options\n * @param {string} [options.udpServer.host='localhost'] Hostname of udp server to bind to\n * @param {number} [options.udpServer.port=41234] Port of udp server to bind to\n * @param {boolean} [options.udpServer.exclusive=false] Exclusive flag\n * @param {string} [options.udpClient.host='localhost'] Hostname of udp client for messaging\n * @param {number} [options.udpClient.port=41235] Port of udp client for messaging\n * @param {string} [options.wsServer.host='localhost'] Hostname of Websocket server\n * @param {number} [options.wsServer.port=8080] Port of Websocket server\n * @param {string} [options.receiver='ws'] Where messages sent via 'send' method will be\n * delivered to, 'ws' for Websocket clients, 'udp' for udp client\n *\n * @example\n * const plugin = new OSC.BridgePlugin({ wsServer: { port: 9912 } })\n * const osc = new OSC({ plugin: plugin })\n */\n constructor(customOptions = {}) {\n if (!dgram || !WebSocket) {\n throw new Error('BridgePlugin can not be used in browser context')\n }\n\n /** @type {object} options\n * @private\n */\n this.options = mergeOptions({}, customOptions)\n\n /**\n * @type {object} websocket\n * @private\n */\n this.websocket = null\n\n /**\n * @type {object} socket\n * @private\n */\n this.socket = dgram.createSocket('udp4')\n /**\n * @type {number} socketStatus\n * @private\n */\n this.socketStatus = STATUS.IS_NOT_INITIALIZED\n\n // register udp events\n this.socket.on('message', (message) => {\n this.send(message, { receiver: 'ws' })\n this.notify(message.buffer)\n })\n\n this.socket.on('error', (error) => {\n this.notify('error', error)\n })\n\n /**\n * @type {function} notify\n * @private\n */\n this.notify = () => {}\n }\n\n /**\n * Internal method to hook into osc library's\n * EventHandler notify method\n * @param {function} fn Notify callback\n * @private\n */\n registerNotify(fn) {\n this.notify = fn\n }\n\n /**\n * Returns the current status of the connection\n * @return {number} Status ID\n */\n status() {\n return this.socketStatus\n }\n\n /**\n * Bind a udp socket to a hostname and port\n * @param {object} [customOptions] Custom options\n * @param {string} [customOptions.host='localhost'] Hostname of udp server to bind to\n * @param {number} [customOptions.port=41234] Port of udp server to bind to\n * @param {boolean} [customOptions.exclusive=false] Exclusive flag\n */\n open(customOptions = {}) {\n const options = mergeOptions(this.options, customOptions)\n\n this.socketStatus = STATUS.IS_CONNECTING\n\n // bind udp server\n this.socket.bind({\n address: options.udpServer.host,\n port: options.udpServer.port,\n exclusive: options.udpServer.exclusive,\n }, () => {\n // bind Websocket server\n this.websocket = new WebSocket({ host: options.wsServer.host, port: options.wsServer.port })\n this.websocket.binaryType = 'arraybuffer'\n\n // register Websocket events\n this.websocket.on('error', (error) => {\n this.notify('error', error)\n })\n\n this.websocket.on('connection', (client) => {\n client.on('message', (message) => {\n this.send(message, { receiver: 'udp' })\n this.notify(new Uint8Array(message))\n })\n })\n\n this.notify('open')\n })\n }\n\n /**\n * Close udp socket and Websocket server\n */\n close() {\n this.socketStatus = STATUS.IS_CLOSING\n\n // close udp socket\n this.socket.close(() => {\n this.socketStatus = STATUS.IS_CLOSED\n this.notify('close')\n\n // close Websocket\n this.websocket.close()\n })\n }\n\n /**\n * Send an OSC Packet, Bundle or Message. Use options here for\n * custom receiver, otherwise the global options will be taken\n * @param {Uint8Array} binary Binary representation of OSC Packet\n * @param {object} [customOptions] Custom options\n * @param {string} [customOptions.udpClient.host='localhost'] Hostname of udp client for messaging\n * @param {number} [customOptions.udpClient.port=41235] Port of udp client for messaging\n * @param {string} [customOptions.receiver='ws'] Messages will be delivered to Websocket ('ws')\n * clients or udp client ('udp')\n */\n send(binary, customOptions = {}) {\n const options = mergeOptions(this.options, customOptions)\n const { receiver } = options\n\n if (receiver === 'udp') {\n // send data to udp client\n const data = binary instanceof Buffer ? binary : new Buffer(binary)\n this.socket.send(\n data,\n 0,\n data.byteLength,\n options.udpClient.port,\n options.udpClient.host,\n )\n } else if (receiver === 'ws') {\n // send data to all Websocket clients\n this.websocket.clients.forEach((client) => {\n client.send(binary, { binary: true })\n })\n } else {\n throw new Error('BridgePlugin can not send message to unknown receiver')\n }\n }\n}\n","// eslint-disable-next-line no-undef, no-use-before-define\nconst WebsocketClient = typeof __dirname === 'undefined' ? WebSocket : require('ws')\n\n/**\n * Status flags\n * @private\n */\nconst STATUS = {\n IS_NOT_INITIALIZED: -1,\n IS_CONNECTING: 0,\n IS_OPEN: 1,\n IS_CLOSING: 2,\n IS_CLOSED: 3,\n}\n\n/**\n * Default options\n * @private\n */\nconst defaultOptions = {\n host: 'localhost',\n port: 8080,\n}\n\n/**\n * OSC plugin for a Websocket client running in node or browser context\n */\nexport default class WebsocketClientPlugin {\n /**\n * Create an OSC WebsocketClientPlugin instance with given options.\n * Defaults to *localhost:8080* for connecting to a Websocket server\n * @param {object} [options] Custom options\n * @param {string} [options.host='localhost'] Hostname of Websocket server\n * @param {number} [options.port=8080] Port of Websocket server\n *\n * @example\n * const plugin = new OSC.WebsocketClientPlugin({ port: 9912 })\n * const osc = new OSC({ plugin: plugin })\n */\n constructor(customOptions) {\n if (!WebsocketClient) {\n throw new Error('WebsocketClientPlugin can\\'t find a WebSocket class')\n }\n\n /**\n * @type {object} options\n * @private\n */\n this.options = Object.assign({}, defaultOptions, customOptions)\n\n /**\n * @type {object} socket\n * @private\n */\n this.socket = null\n /**\n * @type {number} socketStatus\n * @private\n */\n this.socketStatus = STATUS.IS_NOT_INITIALIZED\n\n /**\n * @type {function} notify\n * @private\n */\n this.notify = () => {}\n }\n\n /**\n * Internal method to hook into osc library's\n * EventHandler notify method\n * @param {function} fn Notify callback\n * @private\n */\n registerNotify(fn) {\n this.notify = fn\n }\n\n /**\n * Returns the current status of the connection\n * @return {number} Status identifier\n */\n status() {\n return this.socketStatus\n }\n\n /**\n * Connect to a Websocket server. Defaults to global options\n * @param {object} [customOptions] Custom options\n * @param {string} [customOptions.host] Hostname of Websocket server\n * @param {number} [customOptions.port] Port of Websocket server\n */\n open(customOptions = {}) {\n const options = Object.assign({}, this.options, customOptions)\n const { port, host } = options\n\n // close socket when already given\n if (this.socket) {\n this.close()\n }\n\n // create websocket client\n this.socket = new WebsocketClient(`ws://${host}:${port}`)\n this.socket.binaryType = 'arraybuffer'\n this.socketStatus = STATUS.IS_CONNECTING\n\n // register events\n this.socket.onopen = () => {\n this.socketStatus = STATUS.IS_OPEN\n this.notify('open')\n }\n\n this.socket.onclose = () => {\n this.socketStatus = STATUS.IS_CLOSED\n this.notify('close')\n }\n\n this.socket.onerror = (error) => {\n this.notify('error', error)\n }\n\n this.socket.onmessage = (message) => {\n this.notify(message.data)\n }\n }\n\n /**\n * Close Websocket\n */\n close() {\n this.socketStatus = STATUS.IS_CLOSING\n this.socket.close()\n }\n\n /**\n * Send an OSC Packet, Bundle or Message to Websocket server\n * @param {Uint8Array} binary Binary representation of OSC Packet\n */\n send(binary) {\n this.socket.send(binary)\n }\n}\n","const WebsocketServer = typeof __dirname !== 'undefined' ? require('ws').Server : undefined\n\n/**\n * Status flags\n * @private\n */\nconst STATUS = {\n IS_NOT_INITIALIZED: -1,\n IS_CONNECTING: 0,\n IS_OPEN: 1,\n IS_CLOSING: 2,\n IS_CLOSED: 3,\n}\n\n/**\n * Default options\n * @private\n */\nconst defaultOptions = {\n host: 'localhost',\n port: 8080,\n}\n\n/**\n * OSC plugin for a Websocket client running in node or browser context\n */\nexport default class WebsocketServerPlugin {\n /**\n * Create an OSC WebsocketServerPlugin instance with given options.\n * Defaults to *localhost:8080* for the Websocket server\n * @param {object} [options] Custom options\n * @param {string} [options.host='localhost'] Hostname of Websocket server\n * @param {number} [options.port=8080] Port of Websocket server\n *\n * @example\n * const plugin = new OSC.WebsocketServerPlugin({ port: 9912 })\n * const osc = new OSC({ plugin: plugin })\n *\n * osc.open() // start server\n */\n constructor(customOptions) {\n if (!WebsocketServer) {\n throw new Error('WebsocketServerPlugin can not be used in browser context')\n }\n\n /**\n * @type {object} options\n * @private\n */\n this.options = Object.assign({}, defaultOptions, customOptions)\n\n /**\n * @type {object} socket\n * @private\n */\n this.socket = null\n /**\n * @type {number} socketStatus\n * @private\n */\n this.socketStatus = STATUS.IS_NOT_INITIALIZED\n\n /**\n * @type {function} notify\n * @private\n */\n this.notify = () => {}\n }\n\n /**\n * Internal method to hook into osc library's\n * EventHandler notify method\n * @param {function} fn Notify callback\n * @private\n */\n registerNotify(fn) {\n this.notify = fn\n }\n\n /**\n * Returns the current status of the connection\n * @return {number} Status identifier\n */\n status() {\n return this.socketStatus\n }\n\n /**\n * Start a Websocket server. Defaults to global options\n * @param {object} [customOptions] Custom options\n * @param {string} [customOptions.host] Hostname of Websocket server\n * @param {number} [customOptions.port] Port of Websocket server\n */\n open(customOptions = {}) {\n const options = Object.assign({}, this.options, customOptions)\n const { port, host } = options\n\n // close socket when already given\n if (this.socket) {\n this.close()\n }\n\n // create websocket server\n this.socket = new WebsocketServer({ host, port })\n this.socket.binaryType = 'arraybuffer'\n this.socketStatus = STATUS.IS_CONNECTING\n\n // register events\n this.socket.on('open', () => {\n this.socketStatus = STATUS.IS_OPEN\n this.notify('open')\n })\n\n this.socket.on('close', () => {\n this.socketStatus = STATUS.IS_CLOSED\n this.notify('close')\n })\n\n this.socket.on('error', (error) => {\n this.notify('error', error)\n })\n\n this.socket.on('connection', (client) => {\n client.on('message', (message) => {\n this.notify(new Uint8Array(message))\n })\n })\n }\n\n /**\n * Close Websocket server\n */\n close() {\n this.socketStatus = STATUS.IS_CLOSING\n this.socket.close()\n }\n\n /**\n * Send an OSC Packet, Bundle or Message to Websocket clients\n * @param {Uint8Array} binary Binary representation of OSC Packet\n */\n send(binary) {\n this.socket.clients.forEach((client) => {\n client.send(binary, { binary: true })\n })\n }\n}\n","import { isObject, isString, isFunction, isInt } from './common/utils'\n\nimport Packet from './packet'\nimport Bundle from './bundle'\nimport Message from './message'\n\nimport EventHandler from './events'\n\nimport DatagramPlugin from './plugin/dgram'\nimport BridgePlugin from './plugin/bridge'\nimport WebsocketClientPlugin from './plugin/wsclient'\nimport WebsocketServerPlugin from './plugin/wsserver'\n\n/**\n * Default options\n * @private\n */\nconst defaultOptions = {\n plugin: new WebsocketClientPlugin(),\n discardLateMessages: false,\n}\n\n/**\n * Status flags\n */\nconst STATUS = {\n IS_NOT_INITIALIZED: -1,\n IS_CONNECTING: 0,\n IS_OPEN: 1,\n IS_CLOSING: 2,\n IS_CLOSED: 3,\n}\n\n/**\n * OSC interface to send OSC Packets and to listen to status-changes and\n * incoming message events. Offers a Plugin API for different network\n * protocols, defaults to a simple Websocket client for OSC communication\n * between a browser js-app and a js-node server\n *\n * @example\n * const osc = new OSC()\n *\n * osc.on('/input/test', (message) => {\n * // print incoming OSC message arguments\n * console.log(message.args)\n * })\n *\n * osc.on('open', () => {\n * const message = new Message('/test/path', 55.12, 'hello')\n * osc.send(message)\n * })\n *\n * osc.open({ host: '192.168.178.115', port: 9012 })\n */\nclass OSC {\n /**\n * Create an OSC instance with given options\n * @param {object} [options] Custom options\n * @param {boolean} [options.discardLateMessages=false] Ignore incoming\n * messages when given timetag lies in the past\n * @param {Plugin} [options.plugin=WebsocketClientPlugin] Add a connection plugin\n * to this interface, defaults to a plugin with Websocket client.\n * Open README.md for further information on how to handle plugins or\n * how to write your own with the Plugin API\n *\n * @example\n * const osc = new OSC() // default options with Websocket client\n *\n * @example\n * const osc = new OSC({ discardLateMessages: true })\n *\n * @example\n * const websocketPlugin = new OSC.WebsocketClientPlugin()\n * const osc = new OSC({ plugin: websocketPlugin })\n */\n constructor(options) {\n if (options && !isObject(options)) {\n throw new Error('OSC options argument has to be an object.')\n }\n\n /**\n * @type {object} options\n * @private\n */\n this.options = Object.assign({}, defaultOptions, options)\n /**\n * @type {EventHandler} eventHandler\n * @private\n */\n this.eventHandler = new EventHandler({\n discardLateMessages: this.options.discardLateMessages,\n })\n\n // pass EventHandler's notify() to plugin\n const eventHandler = this.eventHandler\n if (this.options.plugin && this.options.plugin.registerNotify) {\n this.options.plugin.registerNotify((...args) =>\n eventHandler.notify(...args)\n )\n }\n }\n\n /**\n * Listen to a status-change event or incoming OSC message with\n * address pattern matching\n * @param {string} eventName Event name or OSC address pattern\n * @param {function} callback Function which is called on notification\n * @return {number} Subscription id (needed to unsubscribe)\n *\n * @example\n * // will be called when server receives /in!trument/* for example\n * osc.on('/instrument/1', (message) => {\n * console.log(message)\n * })\n *\n * @example\n * // will be called on network socket error\n * osc.on('error', (message) => {\n * console.log(message)\n * })\n */\n on(eventName, callback) {\n if (!(isString(eventName) && isFunction(callback))) {\n throw new Error('OSC on() needs event- or address string and callback function')\n }\n\n return this.eventHandler.on(eventName, callback)\n }\n\n /**\n * Unsubscribe an event listener\n * @param {string} eventName Event name or OSC address pattern\n * @param {number} subscriptionId The subscription id\n * @return {boolean} Success state\n *\n * @example\n * const listenerId = osc.on('error', (message) => {\n * console.log(message)\n * })\n * osc.off('error', listenerId) // unsubscribe from error event\n */\n off(eventName, subscriptionId) {\n if (!(isString(eventName) && isInt(subscriptionId))) {\n throw new Error('OSC off() needs string and number (subscriptionId) to unsubscribe')\n }\n\n return this.eventHandler.off(eventName, subscriptionId)\n }\n\n /**\n * Open network socket with plugin. This method is used by\n * plugins and is not available without (see Plugin API for more information)\n * @param {object} [options] Custom global options for plugin instance\n *\n * @example\n * const osc = new OSC({ plugin: new OSC.DatagramPlugin() })\n * osc.open({ host: '127.0.0.1', port: 8080 })\n */\n open(options) {\n if (options && !isObject(options)) {\n throw new Error('OSC open() options argument needs to be an object')\n }\n\n if (!(this.options.plugin && isFunction(this.options.plugin.open))) {\n throw new Error('OSC Plugin API #open is not implemented!')\n }\n\n return this.options.plugin.open(options)\n }\n\n /**\n * Returns the current status of the connection. See *STATUS* for\n * different possible states. This method is used by plugins\n * and is not available without (see Plugin API for more information)\n * @return {number} Status identifier\n *\n * @example\n * import OSC, { STATUS } from 'osc'\n * const osc = new OSC()\n * if (osc.status() === STATUS.IS_CONNECTING) {\n * // do something\n * }\n */\n status() {\n if (!(this.options.plugin && isFunction(this.options.plugin.status))) {\n throw new Error('OSC Plugin API #status is not implemented!')\n }\n\n return this.options.plugin.status()\n }\n\n /**\n * Close connection. This method is used by plugins and is not\n * available without (see Plugin API for more information)\n */\n close() {\n if (!(this.options.plugin && isFunction(this.options.plugin.close))) {\n throw new Error('OSC Plugin API #close is not implemented!')\n }\n\n return this.options.plugin.close()\n }\n\n /**\n * Send an OSC Packet, Bundle or Message. This method is used by plugins\n * and is not available without (see Plugin API for more information)\n * @param {Packet|Bundle|Message} packet OSC Packet, Bundle or Message instance\n * @param {object} [options] Custom options\n *\n * @example\n * const osc = new OSC({ plugin: new OSC.DatagramPlugin() })\n * osc.open({ host: '127.0.0.1', port: 8080 })\n *\n * const message = new OSC.Message('/test/path', 55.1, 57)\n * osc.send(message)\n *\n * // send message again to custom address\n * osc.send(message, { host: '192.168.178.115', port: 9001 })\n */\n send(packet, options) {\n if (!(this.options.plugin && isFunction(this.options.plugin.send))) {\n throw new Error('OSC Plugin API #send is not implemented!')\n }\n\n if (!(packet instanceof Message || packet instanceof Bundle || packet instanceof Packet)) {\n throw new Error('OSC send() needs Messages, Bundles or Packets')\n }\n\n if (options && !isObject(options)) {\n throw new Error('OSC send() options argument has to be an object')\n }\n\n return this.options.plugin.send(packet.pack(), options)\n }\n}\n\n// expose status flags\nOSC.STATUS = STATUS\n\n// expose OSC classes\nOSC.Packet = Packet\nOSC.Bundle = Bundle\nOSC.Message = Message\n\n// expose plugins\nOSC.DatagramPlugin = DatagramPlugin\nOSC.WebsocketClientPlugin = WebsocketClientPlugin\nOSC.WebsocketServerPlugin = WebsocketServerPlugin\nOSC.BridgePlugin = BridgePlugin\n\nexport default OSC\n"],"names":["isInt","n","Number","isFloat","isString","isArray","Object","prototype","toString","call","isObject","isFunction","isBlob","Uint8Array","isDate","Date","isUndefined","pad","dataView","obj","buffer","DataView","ArrayBuffer","typeTag","item","Error","prepareAddress","address","join","length","slice","prepareRegExPattern","str","pattern","replace","EncodeHelper","data","byteLength","pack","push","result","offset","forEach","set","Atomic","value","method","initialOffset","AtomicInt32","AtomicFloat32","AtomicString","terminated","i","charCodeAt","charcode","getUint8","String","fromCharCode","apply","AtomicBlob","setInt32","getInt32","Message","types","args","shift","map","encoder","Helper","add","argument","merge","unpack","next","type","SECONDS_70_YEARS","TWO_POWER_32","Timetag","seconds","fractions","milliseconds","rounded","Math","floor","round","AtomicTimetag","now","timetag","timestamp","getTime","getUint32","BUNDLE_TAG","Bundle","bundleElements","ms","head","packet","Packet","size","defaultOptions","EventHandler","options","assign","addressHandlers","eventHandlers","uuid","bundle","bundleItem","dispatch","message","notify","name","success","handler","callback","handlerKeys","keys","handlers","key","regex","RegExp","test","lastIndex","discardLateMessages","that","split","subscriptionId","haystack","some","index","id","splice","dgram","__dirname","require","undefined","STATUS","defaultOpenOptions","defaultSendOptions","DatagramPlugin","customOptions","socket","createSocket","socketStatus","IS_NOT_INITIALIZED","on","error","fn","openOptions","port","exclusive","IS_CONNECTING","bind","host","IS_OPEN","IS_CLOSING","close","IS_CLOSED","binary","sendOptions","send","Buffer","WebSocket","Server","mergeOptions","base","custom","udpServer","udpClient","wsServer","BridgePlugin","websocket","receiver","binaryType","client","clients","WebsocketClient","WebsocketClientPlugin","onopen","onclose","onerror","onmessage","WebsocketServer","WebsocketServerPlugin","OSC","eventHandler","plugin","registerNotify","eventName","off","open","status"],"mappings":"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"} \ No newline at end of file diff --git a/dist/osc.min.js b/dist/osc.min.js index 7d90833..41272c3 100644 --- a/dist/osc.min.js +++ b/dist/osc.min.js @@ -1 +1 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.OSC=e()}(this,function(){"use strict";function t(t){return Number(t)===t&&t%1===0}function e(t){return Number(t)===t&&t%1!==0}function n(t){return"string"==typeof t}function r(t){return"[object Array]"===Object.prototype.toString.call(t)}function o(t){return"[object Object]"===Object.prototype.toString.call(t)}function i(t){return"function"==typeof t}function s(t){return t instanceof Uint8Array}function a(t){return t instanceof Date}function u(t){return t+3&-4}function c(t){return t.buffer?new DataView(t.buffer):t instanceof ArrayBuffer?new DataView(t):new DataView(new Uint8Array(t))}function f(r){if(t(r))return"i";if(e(r))return"f";if(n(r))return"s";if(s(r))return"b";throw new Error("OSC typeTag() found unknown value type")}function h(t){var e="";if(r(t))return"/"+t.join("/");if(n(t))return e=t,e.length>1&&"/"===e[e.length-1]&&(e=e.slice(0,e.length-1)),e.length>1&&"/"!==e[0]&&(e="/"+e),e;throw new Error("OSC prepareAddress() needs addresses of type array or string")}function l(t){var e=void 0;if(!n(t))throw new Error("OSC prepareRegExPattern() needs strings");return e=t.replace(/\./g,"\\."),e=e.replace(/\(/g,"\\("),e=e.replace(/\)/g,"\\)"),e=e.replace(/\{/g,"("),e=e.replace(/\}/g,")"),e=e.replace(/,/g,"|"),e=e.replace(/\[!/g,"[^"),e=e.replace(/\?/g,"."),e=e.replace(/\*/g,".*")}function p(t,e){return Object.assign({},F,t,e,{udpServer:Object.assign({},F.udpServer,t.udpServer,e.udpServer),udpClient:Object.assign({},F.udpClient,t.udpClient,e.udpClient),wsServer:Object.assign({},F.wsServer,t.wsServer,e.wsServer)})}var d="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},v=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},w=function(){function t(t,e){for(var n=0;n3&&void 0!==arguments[3]?arguments[3]:0;if(!(t&&e&&n))throw new Error("OSC Atomic cant't be unpacked without given dataView, method or byteLength");if(!(t instanceof DataView))throw new Error("OSC Atomic expects an instance of type DataView");return this.value=t[e](r,!1),this.offset=r+n,this.offset}}]),t}(),O=function(e){function n(e){if(v(this,n),e&&!t(e))throw new Error("OSC AtomicInt32 constructor expects value of type number");return k(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,e))}return g(n,e),w(n,[{key:"pack",value:function(){return y(n.prototype.__proto__||Object.getPrototypeOf(n.prototype),"pack",this).call(this,"setInt32",4)}},{key:"unpack",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return y(n.prototype.__proto__||Object.getPrototypeOf(n.prototype),"unpack",this).call(this,t,"getInt32",4,e)}}]),n}(b),m=function(t){function n(t){if(v(this,n),t&&!e(t))throw new Error("OSC AtomicFloat32 constructor expects value of type float");return k(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,t))}return g(n,t),w(n,[{key:"pack",value:function(){return y(n.prototype.__proto__||Object.getPrototypeOf(n.prototype),"pack",this).call(this,"setFloat32",4)}},{key:"unpack",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return y(n.prototype.__proto__||Object.getPrototypeOf(n.prototype),"unpack",this).call(this,t,"getFloat32",4,e)}}]),n}(b),E=function(t){function e(t){if(v(this,e),t&&!n(t))throw new Error("OSC AtomicString constructor expects value of type string");return k(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t))}return g(e,t),w(e,[{key:"pack",value:function(){if(!this.value)throw new Error("OSC AtomicString can not be encoded with empty value");for(var t=this.value+"\0",e=u(t.length),n=new Uint8Array(e),r=0;r1&&void 0!==arguments[1]?arguments[1]:0;if(!(t instanceof DataView))throw new Error("OSC AtomicString expects an instance of type DataView");for(var n=e,r=void 0,o=[];n1&&void 0!==arguments[1]?arguments[1]:0;if(!(t instanceof DataView))throw new Error("OSC AtomicBlob expects an instance of type DataView");var n=t.getInt32(e,!1);return this.value=new Uint8Array(t.buffer,e+4,n),this.offset=u(e+4+n),this.offset}}]),e}(b),C=function(){function o(){v(this,o),this.offset=0,this.address="",this.types="",this.args=[];for(var t=arguments.length,e=Array(t),i=0;i0){if(!n(e[0])&&!r(e[0]))throw new Error("OSC Message constructor first argument (address) must be a string or array");this.address=h(e.shift()),this.types=e.map(function(t){return f(t)}).join(""),this.args=e}}return w(o,[{key:"add",value:function(t){if(!t)throw new Error("OSC Message needs a valid OSC Atomic Data Type");this.args.push(t),this.types+=f(t)}},{key:"pack",value:function(){var r=this;if(0===this.address.length||"/"!==this.address[0])throw new Error("OSC Message has an invalid address");var o=new S;return o.add(new E(this.address)),o.add(new E(","+this.types)),this.args.length>0&&!function(){var i=void 0;r.args.forEach(function(r){if(t(r))i=new O(r);else if(e(r))i=new m(r);else if(n(r))i=new E(r);else{if(!s(r))throw new Error("OSC Message found unknown argument type");i=new I(r)}o.add(i)})}(),o.merge()}},{key:"unpack",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;if(!(t instanceof DataView))throw new Error("OSC Message expects an instance of type DataView.");var n=new E;n.unpack(t,e);var r=new E;if(r.unpack(t,n.offset),0===n.value.length||"/"!==n.value[0])throw new Error("OSC Message found malformed or missing address string");if(0===r.value.length&&","!==r.value[0])throw new Error("OSC Message found malformed or missing type string");for(var o=r.offset,i=void 0,s=void 0,a=[],u=1;u0&&void 0!==arguments[0]?arguments[0]:0,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;if(v(this,e),!t(n)||!t(r))throw new Error("OSC Timetag constructor expects values of type integer number");this.seconds=n,this.fractions=r}return w(e,[{key:"timestamp",value:function(t){var e=void 0;if("number"==typeof t){e=t/1e3;var n=Math.floor(e);return this.seconds=n+_,this.fractions=Math.round(N*(e-n)),t}return e=this.seconds-_,1e3*(e+this.fractions/N)}}]),e}(),D=function(e){function n(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Date.now();v(this,n);var r=new P;return e instanceof P?r=e:t(e)?r.timestamp(e):a(e)&&r.timestamp(e.getTime()),k(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,r))}return g(n,e),w(n,[{key:"pack",value:function(){if(!this.value)throw new Error("OSC AtomicTimetag can not be encoded with empty value");var t=this.value,e=t.seconds,n=t.fractions,r=new Uint8Array(8),o=new DataView(r.buffer);return o.setInt32(0,e,!1),o.setInt32(4,n,!1),r}},{key:"unpack",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;if(!(t instanceof DataView))throw new Error("OSC AtomicTimetag expects an instance of type DataView");var n=t.getUint32(e,!1),r=t.getUint32(e+4,!1);return this.value=new P(n,r),this.offset=e+8,this.offset}}]),n}(b),A="#bundle",L=function(){function e(){var n=this;v(this,e),this.offset=0,this.timetag=new D,this.bundleElements=[];for(var o=arguments.length,i=Array(o),s=0;s0&&(i[0]instanceof Date||t(i[0])?this.timetag=new D(i[0]):r(i[0])?(i[0].forEach(function(t){n.add(t)}),i.length>1&&(i[1]instanceof Date||t(i[0]))&&(this.timetag=new D(i[1]))):i.forEach(function(t){n.add(t)}))}return w(e,[{key:"timestamp",value:function(e){if(!t(e))throw new Error("OSC Bundle needs an integer for setting the timestamp");this.timetag=new D(e)}},{key:"add",value:function(t){if(!(t instanceof C||t instanceof e))throw new Error("OSC Bundle contains only Messages and Bundles");this.bundleElements.push(t)}},{key:"pack",value:function(){var t=new S;return t.add(new E(A)),this.timetag||(this.timetag=new D),t.add(this.timetag),this.bundleElements.forEach(function(e){t.add(new O(e.pack().byteLength)),t.add(e)}),t.merge()}},{key:"unpack",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;if(!(t instanceof DataView))throw new Error("OSC Bundle expects an instance of type DataView");var n=new E;if(n.unpack(t,e),n.value!==A)throw new Error("OSC Bundle does not contain a valid #bundle head");var r=new D,o=r.unpack(t,n.offset);for(this.bundleElements=[];o1&&void 0!==arguments[1]?arguments[1]:0;if(!(t instanceof DataView))throw new Error("OSC Packet expects an instance of type DataView");if(t.byteLength%4!==0)throw new Error("OSC Packet byteLength has to be a multiple of four");var n=new E;n.unpack(t,e);var r=void 0;return r=n.value===A?new L:new C,r.unpack(t,e),this.offset=r.offset,this.value=r,this.offset}}]),t}(),T={discardLateMessages:!1},H=function(){function e(t){v(this,e),this.options=Object.assign({},T,t),this.addressHandlers=[],this.eventHandlers={open:[],error:[],close:[]},this.uuid=0}return w(e,[{key:"dispatch",value:function(t){var e=this;if(!(t instanceof j))throw new Error("OSC EventHander dispatch() accepts only arguments of type Packet");if(!t.value)throw new Error("OSC EventHander dispatch() can't read empty Packets");if(t.value instanceof L){var n=function(){var n=t.value;return{v:n.bundleElements.forEach(function(r){if(t.value instanceof L){if(n.timetag.value.timestamp()1&&(u=o[1]);var f=null;if(o.length>2)if(t(o[2]))f=o[2];else{if(!(o[2]instanceof Date))throw new Error("OSC EventHandler timestamp has to be a number or Date");f=o[2].getTime()}if(f){var h=function(){var t=Date.now();if(t>f&&!e.options.discardLateMessages)return{v:e.call(a,u)};var n=e;return setTimeout(function(){n.call(a,u)},f-t),{v:!0}}();if("object"===("undefined"==typeof h?"undefined":d(h)))return h.v}return this.call(a,u)}},{key:"on",value:function(t,e){if(!n(t)&&!r(t))throw new Error("OSC EventHandler accepts only strings or arrays for address patterns");if(!i(e))throw new Error("OSC EventHandler callback has to be a function");this.uuid+=1;var o={id:this.uuid,callback:e};if(n(t)&&t in this.eventHandlers)return this.eventHandlers[t].push(o),this.uuid;var s=h(t),a=new RegExp(/[#*\s[\],\/{}|?]/g);if(a.test(s.split("/").join("")))throw new Error("OSC EventHandler address string contains invalid characters");return s in this.addressHandlers||(this.addressHandlers[s]=[]),this.addressHandlers[s].push(o),this.uuid}},{key:"off",value:function(e,o){if(!n(e)&&!r(e))throw new Error("OSC EventHandler accepts only strings or arrays for address patterns");if(!t(o))throw new Error("OSC EventHandler subscription id has to be a number");var i=void 0,s=void 0;return n(e)&&e in this.eventHandlers?(i=e,s=this.eventHandlers):(i=h(e),s=this.addressHandlers),i in s&&s[i].some(function(t,e){return t.id===o&&(s[i].splice(e,1),!0)})}}]),e}(),x="undefined"!=typeof __dirname?require("dgram"):void 0,V={IS_NOT_INITIALIZED:-1,IS_CONNECTING:0,IS_OPEN:1,IS_CLOSING:2,IS_CLOSED:3},B={host:"localhost",port:41234,exclusive:!1},M={host:"localhost",port:41235},G={type:"udp4",open:B,send:M},U=function(){function t(){var e=this,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(v(this,t),!x)throw new Error("DatagramPlugin can not be used in browser context");this.options=Object.assign({},G,n),this.socket=x.createSocket(this.options.type),this.socketStatus=V.IS_NOT_INITIALIZED,this.socket.on("message",function(t){e.notify(t)}),this.socket.on("error",function(t){e.notify("error",t)}),this.notify=function(){}}return w(t,[{key:"registerNotify",value:function(t){this.notify=t}},{key:"status",value:function(){return this.socketStatus}},{key:"open",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=Object.assign({},this.options.openOptions,e),r=n.port,o=n.exclusive;this.socketStatus=V.IS_CONNECTING,this.socket.bind({address:n.host,port:r,exclusive:o},function(){t.socketStatus=V.IS_OPEN,t.notify("open")})}},{key:"close",value:function(){var t=this;this.socketStatus=V.IS_CLOSING,this.socket.close(function(){t.socketStatus=V.IS_CLOSED,t.notify("close")})}},{key:"send",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=Object.assign({},this.options.sendOptions,e),r=n.port,o=n.host;this.socket.send(new Buffer(t),0,t.byteLength,r,o)}}]),t}(),Z="undefined"!=typeof __dirname?require("dgram"):void 0,W="undefined"!=typeof __dirname?require("ws").Server:void 0,q={IS_NOT_INITIALIZED:-1,IS_CONNECTING:0,IS_OPEN:1,IS_CLOSING:2,IS_CLOSED:3},F={udpServer:{host:"localhost",port:41234,exclusive:!1},udpClient:{host:"localhost",port:41235},wsServer:{host:"localhost",port:8080},receiver:"ws"},R=function(){function t(){var e=this,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(v(this,t),!Z||!W)throw new Error("BridgePlugin can not be used in browser context");this.options=p({},n),this.websocket=null,this.socket=Z.createSocket("udp4"),this.socketStatus=q.IS_NOT_INITIALIZED,this.socket.on("message",function(t){e.send(t,{receiver:"ws"}),e.notify(t.buffer)}),this.socket.on("error",function(t){e.notify("error",t)}),this.notify=function(){}}return w(t,[{key:"registerNotify",value:function(t){this.notify=t}},{key:"status",value:function(){return this.socketStatus}},{key:"open",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=p(this.options,e);this.socketStatus=q.IS_CONNECTING,this.socket.bind({address:n.udpServer.host,port:n.udpServer.port,exclusive:n.udpServer.exclusive},function(){t.websocket=new W({host:n.wsServer.host,port:n.wsServer.port}),t.websocket.binaryType="arraybuffer",t.websocket.on("error",function(e){t.notify("error",e)}),t.websocket.on("connection",function(e){e.on("message",function(e){t.send(e,{receiver:"udp"}),t.notify(new Uint8Array(e))})}),t.notify("open")})}},{key:"close",value:function(){var t=this;this.socketStatus=q.IS_CLOSING,this.socket.close(function(){t.socketStatus=q.IS_CLOSED,t.notify("close"),t.websocket.close()})}},{key:"send",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=p(this.options,e),r=n.receiver;if("udp"===r){var o=t instanceof Buffer?t:new Buffer(t);this.socket.send(o,0,o.byteLength,n.udpClient.port,n.udpClient.host)}else{if("ws"!==r)throw new Error("BridgePlugin can not send message to unknown receiver");this.websocket.clients.forEach(function(e){e.send(t,{binary:!0})})}}}]),t}(),z="undefined"==typeof __dirname?WebSocket:require("ws"),J={IS_NOT_INITIALIZED:-1,IS_CONNECTING:0,IS_OPEN:1,IS_CLOSING:2,IS_CLOSED:3},K={host:"localhost",port:8080},Q=function(){function t(e){if(v(this,t),!z)throw new Error("WebsocketClientPlugin can't find a WebSocket class");this.options=Object.assign({},K,e),this.socket=null,this.socketStatus=J.IS_NOT_INITIALIZED,this.notify=function(){}}return w(t,[{key:"registerNotify",value:function(t){this.notify=t}},{key:"status",value:function(){return this.socketStatus}},{key:"open",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=Object.assign({},this.options,e),r=n.port,o=n.host;this.socket&&this.close(),this.socket=new z("ws://"+o+":"+r),this.socket.binaryType="arraybuffer",this.socketStatus=J.IS_CONNECTING,this.socket.onopen=function(){t.socketStatus=J.IS_OPEN,t.notify("open")},this.socket.onclose=function(){t.socketStatus=J.IS_CLOSED,t.notify("close")},this.socket.onerror=function(e){t.notify("error",e)},this.socket.onmessage=function(e){t.notify(e.data)}}},{key:"close",value:function(){this.socketStatus=J.IS_CLOSING,this.socket.close()}},{key:"send",value:function(t){this.socket.send(t)}}]),t}(),X="undefined"!=typeof __dirname?require("ws").Server:void 0,Y={IS_NOT_INITIALIZED:-1,IS_CONNECTING:0,IS_OPEN:1,IS_CLOSING:2,IS_CLOSED:3},$={host:"localhost",port:8080},tt=function(){function t(e){if(v(this,t),!X)throw new Error("WebsocketServerPlugin can not be used in browser context");this.options=Object.assign({},$,e),this.socket=null,this.socketStatus=Y.IS_NOT_INITIALIZED,this.notify=function(){}}return w(t,[{key:"registerNotify",value:function(t){this.notify=t}},{key:"status",value:function(){return this.socketStatus}},{key:"open",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=Object.assign({},this.options,e),r=n.port,o=n.host;this.socket&&this.close(),this.socket=new X({host:o,port:r}),this.socket.binaryType="arraybuffer",this.socketStatus=Y.IS_CONNECTING,this.socket.on("open",function(){t.socketStatus=Y.IS_OPEN,t.notify("open")}),this.socket.on("close",function(){t.socketStatus=Y.IS_CLOSED,t.notify("close")}),this.socket.on("error",function(e){t.notify("error",e)}),this.socket.on("connection",function(e){e.on("message",function(e){t.notify(new Uint8Array(e))})})}},{key:"close",value:function(){this.socketStatus=Y.IS_CLOSING,this.socket.close()}},{key:"send",value:function(t){this.socket.clients.forEach(function(e){e.send(t,{binary:!0})})}}]),t}(),et={plugin:new Q,discardLateMessages:!1},nt={IS_NOT_INITIALIZED:-1,IS_CONNECTING:0,IS_OPEN:1,IS_CLOSING:2,IS_CLOSED:3},rt=function(){function e(t){if(v(this,e),t&&!o(t))throw new Error("OSC options argument has to be an object.");this.options=Object.assign({},et,t),this.eventHandler=new H({discardLateMessages:this.options.discardLateMessages});var n=this.eventHandler;this.options.plugin&&this.options.plugin.registerNotify&&this.options.plugin.registerNotify(function(){return n.notify.apply(n,arguments)})}return w(e,[{key:"on",value:function(t,e){if(!n(t)||!i(e))throw new Error("OSC on() needs event- or address string and callback function");return this.eventHandler.on(t,e)}},{key:"off",value:function(e,r){if(!n(e)||!t(r))throw new Error("OSC off() needs string and number (subscriptionId) to unsubscribe");return this.eventHandler.off(e,r)}},{key:"open",value:function(t){if(t&&!o(t))throw new Error("OSC open() options argument needs to be an object");if(!this.options.plugin||!i(this.options.plugin.open))throw new Error("OSC Plugin API #open is not implemented!");return this.options.plugin.open(t)}},{key:"status",value:function(){if(!this.options.plugin||!i(this.options.plugin.status))throw new Error("OSC Plugin API #status is not implemented!");return this.options.plugin.status()}},{key:"close",value:function(){if(!this.options.plugin||!i(this.options.plugin.close))throw new Error("OSC Plugin API #close is not implemented!");return this.options.plugin.close()}},{key:"send",value:function(t,e){if(!this.options.plugin||!i(this.options.plugin.send))throw new Error("OSC Plugin API #send is not implemented!");if(!(t instanceof C||t instanceof L||t instanceof j))throw new Error("OSC send() needs Messages, Bundles or Packets");if(e&&!o(e))throw new Error("OSC send() options argument has to be an object");return this.options.plugin.send(t.pack(),e)}}]),e}();return rt.STATUS=nt,rt.Packet=j,rt.Bundle=L,rt.Message=C,rt.DatagramPlugin=U,rt.WebsocketClientPlugin=Q,rt.WebsocketServerPlugin=tt,rt.BridgePlugin=R,rt}); +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.OSC=e()}(this,function(){"use strict";function t(t){return Number(t)===t&&t%1===0}function e(t){return Number(t)===t&&t%1!==0}function n(t){return"string"==typeof t}function r(t){return"[object Array]"===Object.prototype.toString.call(t)}function o(t){return"[object Object]"===Object.prototype.toString.call(t)}function i(t){return"function"==typeof t}function s(t){return t instanceof Uint8Array}function a(t){return t instanceof Date}function u(t){return"undefined"==typeof t}function c(t){return t+3&-4}function f(t){return t.buffer?new DataView(t.buffer):t instanceof ArrayBuffer?new DataView(t):new DataView(new Uint8Array(t))}function h(r){if(t(r))return"i";if(e(r))return"f";if(n(r))return"s";if(s(r))return"b";throw new Error("OSC typeTag() found unknown value type")}function l(t){var e="";if(r(t))return"/"+t.join("/");if(n(t))return e=t,e.length>1&&"/"===e[e.length-1]&&(e=e.slice(0,e.length-1)),e.length>1&&"/"!==e[0]&&(e="/"+e),e;throw new Error("OSC prepareAddress() needs addresses of type array or string")}function p(t){var e=void 0;if(!n(t))throw new Error("OSC prepareRegExPattern() needs strings");return e=t.replace(/\./g,"\\."),e=e.replace(/\(/g,"\\("),e=e.replace(/\)/g,"\\)"),e=e.replace(/\{/g,"("),e=e.replace(/\}/g,")"),e=e.replace(/,/g,"|"),e=e.replace(/\[!/g,"[^"),e=e.replace(/\?/g,"."),e=e.replace(/\*/g,".*")}function d(t,e){return Object.assign({},R,t,e,{udpServer:Object.assign({},R.udpServer,t.udpServer,e.udpServer),udpClient:Object.assign({},R.udpClient,t.udpClient,e.udpClient),wsServer:Object.assign({},R.wsServer,t.wsServer,e.wsServer)})}var v="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},w=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},y=function(){function t(t,e){for(var n=0;n3&&void 0!==arguments[3]?arguments[3]:0;if(!(t&&e&&n))throw new Error("OSC Atomic cant't be unpacked without given dataView, method or byteLength");if(!(t instanceof DataView))throw new Error("OSC Atomic expects an instance of type DataView");return this.value=t[e](r,!1),this.offset=r+n,this.offset}}]),t}(),m=function(e){function n(e){if(w(this,n),e&&!t(e))throw new Error("OSC AtomicInt32 constructor expects value of type number");return S(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,e))}return k(n,e),y(n,[{key:"pack",value:function(){return g(n.prototype.__proto__||Object.getPrototypeOf(n.prototype),"pack",this).call(this,"setInt32",4)}},{key:"unpack",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return g(n.prototype.__proto__||Object.getPrototypeOf(n.prototype),"unpack",this).call(this,t,"getInt32",4,e)}}]),n}(O),E=function(t){function n(t){if(w(this,n),t&&!e(t))throw new Error("OSC AtomicFloat32 constructor expects value of type float");return S(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,t))}return k(n,t),y(n,[{key:"pack",value:function(){return g(n.prototype.__proto__||Object.getPrototypeOf(n.prototype),"pack",this).call(this,"setFloat32",4)}},{key:"unpack",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return g(n.prototype.__proto__||Object.getPrototypeOf(n.prototype),"unpack",this).call(this,t,"getFloat32",4,e)}}]),n}(O),I=function(t){function e(t){if(w(this,e),t&&!n(t))throw new Error("OSC AtomicString constructor expects value of type string");return S(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t))}return k(e,t),y(e,[{key:"pack",value:function(){if(u(this.value))throw new Error("OSC AtomicString can not be encoded with empty value");for(var t=this.value+"\0",e=c(t.length),n=new Uint8Array(e),r=0;r1&&void 0!==arguments[1]?arguments[1]:0;if(!(t instanceof DataView))throw new Error("OSC AtomicString expects an instance of type DataView");for(var n=e,r=void 0,o=[];n1&&void 0!==arguments[1]?arguments[1]:0;if(!(t instanceof DataView))throw new Error("OSC AtomicBlob expects an instance of type DataView");var n=t.getInt32(e,!1);return this.value=new Uint8Array(t.buffer,e+4,n),this.offset=c(e+4+n),this.offset}}]),e}(O),_=function(){function o(){w(this,o),this.offset=0,this.address="",this.types="",this.args=[];for(var t=arguments.length,e=Array(t),i=0;i0){if(!n(e[0])&&!r(e[0]))throw new Error("OSC Message constructor first argument (address) must be a string or array");this.address=l(e.shift()),this.types=e.map(function(t){return h(t)}).join(""),this.args=e}}return y(o,[{key:"add",value:function(t){if(!t)throw new Error("OSC Message needs a valid OSC Atomic Data Type");this.args.push(t),this.types+=h(t)}},{key:"pack",value:function(){var r=this;if(0===this.address.length||"/"!==this.address[0])throw new Error("OSC Message has an invalid address");var o=new b;return o.add(new I(this.address)),o.add(new I(","+this.types)),this.args.length>0&&!function(){var i=void 0;r.args.forEach(function(r){if(t(r))i=new m(r);else if(e(r))i=new E(r);else if(n(r))i=new I(r);else{if(!s(r))throw new Error("OSC Message found unknown argument type");i=new C(r)}o.add(i)})}(),o.merge()}},{key:"unpack",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;if(!(t instanceof DataView))throw new Error("OSC Message expects an instance of type DataView.");var n=new I;n.unpack(t,e);var r=new I;if(r.unpack(t,n.offset),0===n.value.length||"/"!==n.value[0])throw new Error("OSC Message found malformed or missing address string");if(0===r.value.length&&","!==r.value[0])throw new Error("OSC Message found malformed or missing type string");for(var o=r.offset,i=void 0,s=void 0,a=[],u=1;u0&&void 0!==arguments[0]?arguments[0]:0,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;if(w(this,e),!t(n)||!t(r))throw new Error("OSC Timetag constructor expects values of type integer number");this.seconds=n,this.fractions=r}return y(e,[{key:"timestamp",value:function(t){var e=void 0;if("number"==typeof t){e=t/1e3;var n=Math.floor(e);return this.seconds=n+N,this.fractions=Math.round(P*(e-n)),t}return e=this.seconds-N,1e3*(e+this.fractions/P)}}]),e}(),A=function(e){function n(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Date.now();w(this,n);var r=new D;return e instanceof D?r=e:t(e)?r.timestamp(e):a(e)&&r.timestamp(e.getTime()),S(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,r))}return k(n,e),y(n,[{key:"pack",value:function(){if(u(this.value))throw new Error("OSC AtomicTimetag can not be encoded with empty value");var t=this.value,e=t.seconds,n=t.fractions,r=new Uint8Array(8),o=new DataView(r.buffer);return o.setInt32(0,e,!1),o.setInt32(4,n,!1),r}},{key:"unpack",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;if(!(t instanceof DataView))throw new Error("OSC AtomicTimetag expects an instance of type DataView");var n=t.getUint32(e,!1),r=t.getUint32(e+4,!1);return this.value=new D(n,r),this.offset=e+8,this.offset}}]),n}(O),L="#bundle",j=function(){function e(){var n=this;w(this,e),this.offset=0,this.timetag=new A,this.bundleElements=[];for(var o=arguments.length,i=Array(o),s=0;s0&&(i[0]instanceof Date||t(i[0])?this.timetag=new A(i[0]):r(i[0])?(i[0].forEach(function(t){n.add(t)}),i.length>1&&(i[1]instanceof Date||t(i[0]))&&(this.timetag=new A(i[1]))):i.forEach(function(t){n.add(t)}))}return y(e,[{key:"timestamp",value:function(e){if(!t(e))throw new Error("OSC Bundle needs an integer for setting the timestamp");this.timetag=new A(e)}},{key:"add",value:function(t){if(!(t instanceof _||t instanceof e))throw new Error("OSC Bundle contains only Messages and Bundles");this.bundleElements.push(t)}},{key:"pack",value:function(){var t=new b;return t.add(new I(L)),this.timetag||(this.timetag=new A),t.add(this.timetag),this.bundleElements.forEach(function(e){t.add(new m(e.pack().byteLength)),t.add(e)}),t.merge()}},{key:"unpack",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;if(!(t instanceof DataView))throw new Error("OSC Bundle expects an instance of type DataView");var n=new I;if(n.unpack(t,e),n.value!==L)throw new Error("OSC Bundle does not contain a valid #bundle head");var r=new A,o=r.unpack(t,n.offset);for(this.bundleElements=[];o1&&void 0!==arguments[1]?arguments[1]:0;if(!(t instanceof DataView))throw new Error("OSC Packet expects an instance of type DataView");if(t.byteLength%4!==0)throw new Error("OSC Packet byteLength has to be a multiple of four");var n=new I;n.unpack(t,e);var r=void 0;return r=n.value===L?new j:new _,r.unpack(t,e),this.offset=r.offset,this.value=r,this.offset}}]),t}(),H={discardLateMessages:!1},x=function(){function e(t){w(this,e),this.options=Object.assign({},H,t),this.addressHandlers=[],this.eventHandlers={open:[],error:[],close:[]},this.uuid=0}return y(e,[{key:"dispatch",value:function(t){var e=this;if(!(t instanceof T))throw new Error("OSC EventHander dispatch() accepts only arguments of type Packet");if(!t.value)throw new Error("OSC EventHander dispatch() can't read empty Packets");if(t.value instanceof j){var n=function(){var n=t.value;return{v:n.bundleElements.forEach(function(r){if(t.value instanceof j){if(n.timetag.value.timestamp()1&&(u=o[1]);var c=null;if(o.length>2)if(t(o[2]))c=o[2];else{if(!(o[2]instanceof Date))throw new Error("OSC EventHandler timestamp has to be a number or Date");c=o[2].getTime()}if(c){var h=function(){var t=Date.now();if(t>c&&!e.options.discardLateMessages)return{v:e.call(a,u)};var n=e;return setTimeout(function(){n.call(a,u)},c-t),{v:!0}}();if("object"===("undefined"==typeof h?"undefined":v(h)))return h.v}return this.call(a,u)}},{key:"on",value:function(t,e){if(!n(t)&&!r(t))throw new Error("OSC EventHandler accepts only strings or arrays for address patterns");if(!i(e))throw new Error("OSC EventHandler callback has to be a function");this.uuid+=1;var o={id:this.uuid,callback:e};if(n(t)&&t in this.eventHandlers)return this.eventHandlers[t].push(o),this.uuid;var s=l(t),a=new RegExp(/[#*\s[\],\/{}|?]/g);if(a.test(s.split("/").join("")))throw new Error("OSC EventHandler address string contains invalid characters");return s in this.addressHandlers||(this.addressHandlers[s]=[]),this.addressHandlers[s].push(o),this.uuid}},{key:"off",value:function(e,o){if(!n(e)&&!r(e))throw new Error("OSC EventHandler accepts only strings or arrays for address patterns");if(!t(o))throw new Error("OSC EventHandler subscription id has to be a number");var i=void 0,s=void 0;return n(e)&&e in this.eventHandlers?(i=e,s=this.eventHandlers):(i=l(e),s=this.addressHandlers),i in s&&s[i].some(function(t,e){return t.id===o&&(s[i].splice(e,1),!0)})}}]),e}(),V="undefined"!=typeof __dirname?require("dgram"):void 0,B={IS_NOT_INITIALIZED:-1,IS_CONNECTING:0,IS_OPEN:1,IS_CLOSING:2,IS_CLOSED:3},M={host:"localhost",port:41234,exclusive:!1},G={host:"localhost",port:41235},U={type:"udp4",open:M,send:G},Z=function(){function t(){var e=this,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(w(this,t),!V)throw new Error("DatagramPlugin can not be used in browser context");this.options=Object.assign({},U,n),this.socket=V.createSocket(this.options.type),this.socketStatus=B.IS_NOT_INITIALIZED,this.socket.on("message",function(t){e.notify(t)}),this.socket.on("error",function(t){e.notify("error",t)}),this.notify=function(){}}return y(t,[{key:"registerNotify",value:function(t){this.notify=t}},{key:"status",value:function(){return this.socketStatus}},{key:"open",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=Object.assign({},this.options.openOptions,e),r=n.port,o=n.exclusive;this.socketStatus=B.IS_CONNECTING,this.socket.bind({address:n.host,port:r,exclusive:o},function(){t.socketStatus=B.IS_OPEN,t.notify("open")})}},{key:"close",value:function(){var t=this;this.socketStatus=B.IS_CLOSING,this.socket.close(function(){t.socketStatus=B.IS_CLOSED,t.notify("close")})}},{key:"send",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=Object.assign({},this.options.sendOptions,e),r=n.port,o=n.host;this.socket.send(new Buffer(t),0,t.byteLength,r,o)}}]),t}(),W="undefined"!=typeof __dirname?require("dgram"):void 0,q="undefined"!=typeof __dirname?require("ws").Server:void 0,F={IS_NOT_INITIALIZED:-1,IS_CONNECTING:0,IS_OPEN:1,IS_CLOSING:2,IS_CLOSED:3},R={udpServer:{host:"localhost",port:41234,exclusive:!1},udpClient:{host:"localhost",port:41235},wsServer:{host:"localhost",port:8080},receiver:"ws"},z=function(){function t(){var e=this,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(w(this,t),!W||!q)throw new Error("BridgePlugin can not be used in browser context");this.options=d({},n),this.websocket=null,this.socket=W.createSocket("udp4"),this.socketStatus=F.IS_NOT_INITIALIZED,this.socket.on("message",function(t){e.send(t,{receiver:"ws"}),e.notify(t.buffer)}),this.socket.on("error",function(t){e.notify("error",t)}),this.notify=function(){}}return y(t,[{key:"registerNotify",value:function(t){this.notify=t}},{key:"status",value:function(){return this.socketStatus}},{key:"open",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=d(this.options,e);this.socketStatus=F.IS_CONNECTING,this.socket.bind({address:n.udpServer.host,port:n.udpServer.port,exclusive:n.udpServer.exclusive},function(){t.websocket=new q({host:n.wsServer.host,port:n.wsServer.port}),t.websocket.binaryType="arraybuffer",t.websocket.on("error",function(e){t.notify("error",e)}),t.websocket.on("connection",function(e){e.on("message",function(e){t.send(e,{receiver:"udp"}),t.notify(new Uint8Array(e))})}),t.notify("open")})}},{key:"close",value:function(){var t=this;this.socketStatus=F.IS_CLOSING,this.socket.close(function(){t.socketStatus=F.IS_CLOSED,t.notify("close"),t.websocket.close()})}},{key:"send",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=d(this.options,e),r=n.receiver;if("udp"===r){var o=t instanceof Buffer?t:new Buffer(t);this.socket.send(o,0,o.byteLength,n.udpClient.port,n.udpClient.host)}else{if("ws"!==r)throw new Error("BridgePlugin can not send message to unknown receiver");this.websocket.clients.forEach(function(e){e.send(t,{binary:!0})})}}}]),t}(),J="undefined"==typeof __dirname?WebSocket:require("ws"),K={IS_NOT_INITIALIZED:-1,IS_CONNECTING:0,IS_OPEN:1,IS_CLOSING:2,IS_CLOSED:3},Q={host:"localhost",port:8080},X=function(){function t(e){if(w(this,t),!J)throw new Error("WebsocketClientPlugin can't find a WebSocket class");this.options=Object.assign({},Q,e),this.socket=null,this.socketStatus=K.IS_NOT_INITIALIZED,this.notify=function(){}}return y(t,[{key:"registerNotify",value:function(t){this.notify=t}},{key:"status",value:function(){return this.socketStatus}},{key:"open",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=Object.assign({},this.options,e),r=n.port,o=n.host;this.socket&&this.close(),this.socket=new J("ws://"+o+":"+r),this.socket.binaryType="arraybuffer",this.socketStatus=K.IS_CONNECTING,this.socket.onopen=function(){t.socketStatus=K.IS_OPEN,t.notify("open")},this.socket.onclose=function(){t.socketStatus=K.IS_CLOSED,t.notify("close")},this.socket.onerror=function(e){t.notify("error",e)},this.socket.onmessage=function(e){t.notify(e.data)}}},{key:"close",value:function(){this.socketStatus=K.IS_CLOSING,this.socket.close()}},{key:"send",value:function(t){this.socket.send(t)}}]),t}(),Y="undefined"!=typeof __dirname?require("ws").Server:void 0,$={IS_NOT_INITIALIZED:-1,IS_CONNECTING:0,IS_OPEN:1,IS_CLOSING:2,IS_CLOSED:3},tt={host:"localhost",port:8080},et=function(){function t(e){if(w(this,t),!Y)throw new Error("WebsocketServerPlugin can not be used in browser context");this.options=Object.assign({},tt,e),this.socket=null,this.socketStatus=$.IS_NOT_INITIALIZED,this.notify=function(){}}return y(t,[{key:"registerNotify",value:function(t){this.notify=t}},{key:"status",value:function(){return this.socketStatus}},{key:"open",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=Object.assign({},this.options,e),r=n.port,o=n.host;this.socket&&this.close(),this.socket=new Y({host:o,port:r}),this.socket.binaryType="arraybuffer",this.socketStatus=$.IS_CONNECTING,this.socket.on("open",function(){t.socketStatus=$.IS_OPEN,t.notify("open")}),this.socket.on("close",function(){t.socketStatus=$.IS_CLOSED,t.notify("close")}),this.socket.on("error",function(e){t.notify("error",e)}),this.socket.on("connection",function(e){e.on("message",function(e){t.notify(new Uint8Array(e))})})}},{key:"close",value:function(){this.socketStatus=$.IS_CLOSING,this.socket.close()}},{key:"send",value:function(t){this.socket.clients.forEach(function(e){e.send(t,{binary:!0})})}}]),t}(),nt={plugin:new X,discardLateMessages:!1},rt={IS_NOT_INITIALIZED:-1,IS_CONNECTING:0,IS_OPEN:1,IS_CLOSING:2,IS_CLOSED:3},ot=function(){function e(t){if(w(this,e),t&&!o(t))throw new Error("OSC options argument has to be an object.");this.options=Object.assign({},nt,t),this.eventHandler=new x({discardLateMessages:this.options.discardLateMessages});var n=this.eventHandler;this.options.plugin&&this.options.plugin.registerNotify&&this.options.plugin.registerNotify(function(){return n.notify.apply(n,arguments)})}return y(e,[{key:"on",value:function(t,e){if(!n(t)||!i(e))throw new Error("OSC on() needs event- or address string and callback function");return this.eventHandler.on(t,e)}},{key:"off",value:function(e,r){if(!n(e)||!t(r))throw new Error("OSC off() needs string and number (subscriptionId) to unsubscribe");return this.eventHandler.off(e,r)}},{key:"open",value:function(t){if(t&&!o(t))throw new Error("OSC open() options argument needs to be an object");if(!this.options.plugin||!i(this.options.plugin.open))throw new Error("OSC Plugin API #open is not implemented!");return this.options.plugin.open(t)}},{key:"status",value:function(){if(!this.options.plugin||!i(this.options.plugin.status))throw new Error("OSC Plugin API #status is not implemented!");return this.options.plugin.status()}},{key:"close",value:function(){if(!this.options.plugin||!i(this.options.plugin.close))throw new Error("OSC Plugin API #close is not implemented!");return this.options.plugin.close()}},{key:"send",value:function(t,e){if(!this.options.plugin||!i(this.options.plugin.send))throw new Error("OSC Plugin API #send is not implemented!");if(!(t instanceof _||t instanceof j||t instanceof T))throw new Error("OSC send() needs Messages, Bundles or Packets");if(e&&!o(e))throw new Error("OSC send() options argument has to be an object");return this.options.plugin.send(t.pack(),e)}}]),e}();return ot.STATUS=rt,ot.Packet=T,ot.Bundle=j,ot.Message=_,ot.DatagramPlugin=Z,ot.WebsocketClientPlugin=X,ot.WebsocketServerPlugin=et,ot.BridgePlugin=z,ot}); diff --git a/lib/osc.js b/lib/osc.js index 12262d4..3bffe2e 100644 --- a/lib/osc.js +++ b/lib/osc.js @@ -28,6 +28,9 @@ function isBlob(n) { function isDate(n) { return n instanceof Date; } +function isUndefined(n) { + return typeof n === 'undefined'; +} function pad(n) { return n + 3 & ~0x03; } @@ -255,24 +258,24 @@ var Atomic = function () { throw new Error('OSC Atomic cant\'t be packed without given method or byteLength'); } var data = new Uint8Array(byteLength); - var dataView = new DataView(data.buffer); - if (!this.value) { + var dataView$$1 = new DataView(data.buffer); + if (isUndefined(this.value)) { throw new Error('OSC Atomic cant\'t be encoded with empty value'); } - dataView[method](this.offset, this.value, false); + dataView$$1[method](this.offset, this.value, false); return data; } }, { key: 'unpack', - value: function unpack(dataView, method, byteLength) { + value: function unpack(dataView$$1, method, byteLength) { var initialOffset = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0; - if (!(dataView && method && byteLength)) { + if (!(dataView$$1 && method && byteLength)) { throw new Error('OSC Atomic cant\'t be unpacked without given dataView, method or byteLength'); } - if (!(dataView instanceof DataView)) { + if (!(dataView$$1 instanceof DataView)) { throw new Error('OSC Atomic expects an instance of type DataView'); } - this.value = dataView[method](initialOffset, false); + this.value = dataView$$1[method](initialOffset, false); this.offset = initialOffset + byteLength; return this.offset; } @@ -340,7 +343,7 @@ var AtomicString = function (_Atomic) { createClass(AtomicString, [{ key: 'pack', value: function pack() { - if (!this.value) { + if (isUndefined(this.value)) { throw new Error('OSC AtomicString can not be encoded with empty value'); } var terminated = this.value + '\0'; @@ -393,7 +396,7 @@ var AtomicBlob = function (_Atomic) { createClass(AtomicBlob, [{ key: 'pack', value: function pack() { - if (!this.value) { + if (isUndefined(this.value)) { throw new Error('OSC AtomicBlob can not be encoded with empty value'); } var byteLength = pad(this.value.byteLength); @@ -575,7 +578,7 @@ var AtomicTimetag = function (_Atomic) { createClass(AtomicTimetag, [{ key: 'pack', value: function pack() { - if (!this.value) { + if (isUndefined(this.value)) { throw new Error('OSC AtomicTimetag can not be encoded with empty value'); } var _value = this.value, diff --git a/src/atomic.js b/src/atomic.js index f88c835..2a34ebb 100644 --- a/src/atomic.js +++ b/src/atomic.js @@ -1,3 +1,5 @@ +import { isUndefined } from './common/utils' + /** * Base class for OSC Atomic Data Types */ @@ -27,7 +29,7 @@ export default class Atomic { const data = new Uint8Array(byteLength) const dataView = new DataView(data.buffer) - if (!this.value) { + if (isUndefined(this.value)) { throw new Error('OSC Atomic cant\'t be encoded with empty value') } diff --git a/src/atomic/blob.js b/src/atomic/blob.js index f57d777..79f1d69 100644 --- a/src/atomic/blob.js +++ b/src/atomic/blob.js @@ -1,4 +1,4 @@ -import { pad, isBlob } from '../common/utils' +import { pad, isBlob, isUndefined } from '../common/utils' import Atomic from '../atomic' @@ -23,7 +23,7 @@ export default class AtomicBlob extends Atomic { * @return {Uint8Array} Packed binary data */ pack() { - if (!this.value) { + if (isUndefined(this.value)) { throw new Error('OSC AtomicBlob can not be encoded with empty value') } diff --git a/src/atomic/string.js b/src/atomic/string.js index 5476e53..bd769d9 100644 --- a/src/atomic/string.js +++ b/src/atomic/string.js @@ -1,4 +1,4 @@ -import { pad, isString } from '../common/utils' +import { pad, isString, isUndefined } from '../common/utils' import Atomic from '../atomic' @@ -23,7 +23,7 @@ export default class AtomicString extends Atomic { * @return {Uint8Array} Packed binary data */ pack() { - if (!this.value) { + if (isUndefined(this.value)) { throw new Error('OSC AtomicString can not be encoded with empty value') } diff --git a/src/atomic/timetag.js b/src/atomic/timetag.js index 954b183..7f2ad78 100644 --- a/src/atomic/timetag.js +++ b/src/atomic/timetag.js @@ -1,4 +1,4 @@ -import { isInt, isDate } from '../common/utils' +import { isInt, isDate, isUndefined } from '../common/utils' import Atomic from '../atomic' @@ -81,7 +81,7 @@ export default class AtomicTimetag extends Atomic { * @return {Uint8Array} Packed binary data */ pack() { - if (!this.value) { + if (isUndefined(this.value)) { throw new Error('OSC AtomicTimetag can not be encoded with empty value') } diff --git a/src/common/utils.js b/src/common/utils.js index b6ee246..03b7b9f 100644 --- a/src/common/utils.js +++ b/src/common/utils.js @@ -70,6 +70,15 @@ export function isDate(n) { return n instanceof Date } +/** + * Check if given object is undefined + * @param {*} n + * @return {boolean} + */ +export function isUndefined(n) { + return typeof n === 'undefined' +} + /** * Return the next multiple of four * @param {number} n diff --git a/test/atomic.spec.js b/test/atomic.spec.js index 5a33681..ccdf884 100644 --- a/test/atomic.spec.js +++ b/test/atomic.spec.js @@ -21,9 +21,11 @@ describe('Atomic', () => { atomic = new Atomic(2) atomicChildren = [ + new AtomicInt32(0), new AtomicInt32(123132132), new AtomicFloat32(1299389992.342243), new AtomicString('hello'), + new AtomicString(''), new AtomicBlob(new Uint8Array([5, 4, 3, 2, 1])), new AtomicTimetag(new Timetag(SECONDS_70_YEARS + 123, 3312123)), ] From bad1c5c41f6450ee8ef8cd5ad75985dc1271a689 Mon Sep 17 00:00:00 2001 From: Andreas Dzialocha Date: Thu, 9 Mar 2017 23:23:23 +0100 Subject: [PATCH 2/2] Bump to version 1.0.2 --- bower.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bower.json b/bower.json index 2b6f33a..9682a8b 100644 --- a/bower.json +++ b/bower.json @@ -1,7 +1,7 @@ { "name": "osc-js", "description": "OSC library for Node.js and the browser, with customizable Plugin API for WebSocket, UDP or bridge networking", - "version": "1.0.1", + "version": "1.0.2", "main": "dist/osc.js", "authors": [ "Andreas Dzialocha" diff --git a/package.json b/package.json index 57de356..e42ce9b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "osc-js", - "version": "1.0.1", + "version": "1.0.2", "description": "OSC library for Node.js and the browser, with customizable Plugin API for WebSocket, UDP or bridge networking", "main": "lib/osc.js", "scripts": {