2022-04-12 23:54:13 +02:00

1727 lines
56 KiB
JavaScript

function ownKeys(object, enumerableOnly) {
var keys = Object.keys(object);
if (Object.getOwnPropertySymbols) {
var symbols = Object.getOwnPropertySymbols(object);
enumerableOnly && (symbols = symbols.filter(function (sym) {
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
})), keys.push.apply(keys, symbols);
}
return keys;
}
function _objectSpread2(target) {
for (var i = 1; i < arguments.length; i++) {
var source = null != arguments[i] ? arguments[i] : {};
i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {
_defineProperty(target, key, source[key]);
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
});
}
return target;
}
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
Object.defineProperty(Constructor, "prototype", {
writable: false
});
return Constructor;
}
function _defineProperty(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
function _inherits(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function");
}
subClass.prototype = Object.create(superClass && superClass.prototype, {
constructor: {
value: subClass,
writable: true,
configurable: true
}
});
Object.defineProperty(subClass, "prototype", {
writable: false
});
if (superClass) _setPrototypeOf(subClass, superClass);
}
function _getPrototypeOf(o) {
_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
return o.__proto__ || Object.getPrototypeOf(o);
};
return _getPrototypeOf(o);
}
function _setPrototypeOf(o, p) {
_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
o.__proto__ = p;
return o;
};
return _setPrototypeOf(o, p);
}
function _isNativeReflectConstruct() {
if (typeof Reflect === "undefined" || !Reflect.construct) return false;
if (Reflect.construct.sham) return false;
if (typeof Proxy === "function") return true;
try {
Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));
return true;
} catch (e) {
return false;
}
}
function _assertThisInitialized(self) {
if (self === void 0) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
return self;
}
function _possibleConstructorReturn(self, call) {
if (call && (typeof call === "object" || typeof call === "function")) {
return call;
} else if (call !== void 0) {
throw new TypeError("Derived constructors may only return object or undefined");
}
return _assertThisInitialized(self);
}
function _createSuper(Derived) {
var hasNativeReflectConstruct = _isNativeReflectConstruct();
return function _createSuperInternal() {
var Super = _getPrototypeOf(Derived),
result;
if (hasNativeReflectConstruct) {
var NewTarget = _getPrototypeOf(this).constructor;
result = Reflect.construct(Super, arguments, NewTarget);
} else {
result = Super.apply(this, arguments);
}
return _possibleConstructorReturn(this, result);
};
}
function _superPropBase(object, property) {
while (!Object.prototype.hasOwnProperty.call(object, property)) {
object = _getPrototypeOf(object);
if (object === null) break;
}
return object;
}
function _get() {
if (typeof Reflect !== "undefined" && Reflect.get) {
_get = Reflect.get;
} else {
_get = function _get(target, property, receiver) {
var base = _superPropBase(target, property);
if (!base) return;
var desc = Object.getOwnPropertyDescriptor(base, property);
if (desc.get) {
return desc.get.call(arguments.length < 3 ? target : receiver);
}
return desc.value;
};
}
return _get.apply(this, arguments);
}
function isInt(n) {
return Number(n) === n && n % 1 === 0;
}
function isFloat(n) {
return Number(n) === n && n % 1 !== 0;
}
function isNumber(n) {
return Number(n) === n;
}
function isString(n) {
return typeof n === 'string';
}
function isBoolean(n) {
return typeof n === 'boolean';
}
function isInfinity(n) {
return n === Infinity;
}
function isArray(n) {
return Object.prototype.toString.call(n) === '[object Array]';
}
function isObject(n) {
return Object.prototype.toString.call(n) === '[object Object]';
}
function isFunction(n) {
return typeof n === 'function';
}
function isBlob(n) {
return n instanceof Uint8Array;
}
function isDate(n) {
return n instanceof Date;
}
function isUndefined(n) {
return typeof n === 'undefined';
}
function isNull(n) {
return n === null;
}
function pad(n) {
return n + 3 & ~0x03;
}
function hasProperty(name) {
return Object.prototype.hasOwnProperty.call(typeof global !== 'undefined' ? global : window,
name);
}
function dataView(obj) {
if (obj.buffer) {
return new DataView(obj.buffer);
} else if (obj instanceof ArrayBuffer) {
return new DataView(obj);
}
return new DataView(new Uint8Array(obj));
}
function typeTag(item) {
if (isInt(item)) {
return 'i';
} else if (isFloat(item)) {
return 'f';
} else if (isString(item)) {
return 's';
} else if (isBlob(item)) {
return 'b';
} else if (isBoolean(item)) {
return item ? 'T' : 'F';
} else if (isNull(item)) {
return 'N';
} else if (isInfinity(item)) {
return 'I';
}
throw new Error('OSC typeTag() found unknown value type');
}
function prepareAddress(obj) {
var address = '';
if (isArray(obj)) {
return "/".concat(obj.join('/'));
} else if (isString(obj)) {
address = obj;
if (address.length > 1 && address[address.length - 1] === '/') {
address = address.slice(0, address.length - 1);
}
if (address.length > 1 && address[0] !== '/') {
address = "/".concat(address);
}
return address;
}
throw new Error('OSC prepareAddress() needs addresses of type array or string');
}
function prepareRegExPattern(str) {
var pattern;
if (!isString(str)) {
throw new Error('OSC prepareRegExPattern() needs strings');
}
pattern = str.replace(/\./g, '\\.');
pattern = pattern.replace(/\(/g, '\\(');
pattern = pattern.replace(/\)/g, '\\)');
pattern = pattern.replace(/\{/g, '(');
pattern = pattern.replace(/\}/g, ')');
pattern = pattern.replace(/,/g, '|');
pattern = pattern.replace(/\[!/g, '[^');
pattern = pattern.replace(/\?/g, '.');
pattern = pattern.replace(/\*/g, '.*');
return pattern;
}
var EncodeHelper = function () {
function EncodeHelper() {
_classCallCheck(this, EncodeHelper);
this.data = [];
this.byteLength = 0;
}
_createClass(EncodeHelper, [{
key: "add",
value: function add(item) {
if (isBoolean(item) || isInfinity(item) || isNull(item)) {
return this;
}
var buffer = item.pack();
this.byteLength += buffer.byteLength;
this.data.push(buffer);
return this;
}
}, {
key: "merge",
value: function merge() {
var result = new Uint8Array(this.byteLength);
var offset = 0;
this.data.forEach(function (data) {
result.set(data, offset);
offset += data.byteLength;
});
return result;
}
}]);
return EncodeHelper;
}();
var Atomic = function () {
function Atomic(value) {
_classCallCheck(this, Atomic);
this.value = value;
this.offset = 0;
}
_createClass(Atomic, [{
key: "pack",
value: function pack(method, byteLength) {
if (!(method && byteLength)) {
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 (isUndefined(this.value)) {
throw new Error('OSC Atomic cant\'t be encoded with empty value');
}
dataView[method](this.offset, this.value, false);
return data;
}
}, {
key: "unpack",
value: function unpack(dataView, method, byteLength) {
var initialOffset = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
if (!(dataView && method && byteLength)) {
throw new Error('OSC Atomic cant\'t be unpacked without given dataView, method or byteLength');
}
if (!(dataView instanceof DataView)) {
throw new Error('OSC Atomic expects an instance of type DataView');
}
this.value = dataView[method](initialOffset, false);
this.offset = initialOffset + byteLength;
return this.offset;
}
}]);
return Atomic;
}();
var AtomicInt32 = function (_Atomic) {
_inherits(AtomicInt32, _Atomic);
var _super = _createSuper(AtomicInt32);
function AtomicInt32(value) {
_classCallCheck(this, AtomicInt32);
if (value && !isInt(value)) {
throw new Error('OSC AtomicInt32 constructor expects value of type number');
}
return _super.call(this, value);
}
_createClass(AtomicInt32, [{
key: "pack",
value: function pack() {
return _get(_getPrototypeOf(AtomicInt32.prototype), "pack", this).call(this, 'setInt32', 4);
}
}, {
key: "unpack",
value: function unpack(dataView) {
var initialOffset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
return _get(_getPrototypeOf(AtomicInt32.prototype), "unpack", this).call(this, dataView, 'getInt32', 4, initialOffset);
}
}]);
return AtomicInt32;
}(Atomic);
var STR_SLICE_SIZE = 65537;
var STR_ENCODING = 'utf-8';
function charCodesToString(charCodes) {
if (hasProperty('Buffer')) {
return Buffer.from(charCodes).toString(STR_ENCODING);
} else if (hasProperty('TextDecoder')) {
return new TextDecoder(STR_ENCODING)
.decode(new Int8Array(charCodes));
}
var str = '';
for (var i = 0; i < charCodes.length; i += STR_SLICE_SIZE) {
str += String.fromCharCode.apply(null, charCodes.slice(i, i + STR_SLICE_SIZE));
}
return str;
}
var AtomicString = function (_Atomic) {
_inherits(AtomicString, _Atomic);
var _super = _createSuper(AtomicString);
function AtomicString(value) {
_classCallCheck(this, AtomicString);
if (value && !isString(value)) {
throw new Error('OSC AtomicString constructor expects value of type string');
}
return _super.call(this, value);
}
_createClass(AtomicString, [{
key: "pack",
value: function pack() {
if (isUndefined(this.value)) {
throw new Error('OSC AtomicString can not be encoded with empty value');
}
var terminated = "".concat(this.value, "\0");
var byteLength = pad(terminated.length);
var buffer = new Uint8Array(byteLength);
for (var i = 0; i < terminated.length; i += 1) {
buffer[i] = terminated.charCodeAt(i);
}
return buffer;
}
}, {
key: "unpack",
value: function unpack(dataView) {
var initialOffset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
if (!(dataView instanceof DataView)) {
throw new Error('OSC AtomicString expects an instance of type DataView');
}
var offset = initialOffset;
var charcode;
var charCodes = [];
for (; offset < dataView.byteLength; offset += 1) {
charcode = dataView.getUint8(offset);
if (charcode !== 0) {
charCodes.push(charcode);
} else {
offset += 1;
break;
}
}
if (offset === dataView.length) {
throw new Error('OSC AtomicString found a malformed OSC string');
}
this.offset = pad(offset);
this.value = charCodesToString(charCodes);
return this.offset;
}
}]);
return AtomicString;
}(Atomic);
var SECONDS_70_YEARS = 2208988800;
var TWO_POWER_32 = 4294967296;
var Timetag = function () {
function Timetag() {
var seconds = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
var fractions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
_classCallCheck(this, Timetag);
if (!(isInt(seconds) && isInt(fractions))) {
throw new Error('OSC Timetag constructor expects values of type integer number');
}
this.seconds = seconds;
this.fractions = fractions;
}
_createClass(Timetag, [{
key: "timestamp",
value: function timestamp(milliseconds) {
var seconds;
if (typeof milliseconds === 'number') {
seconds = milliseconds / 1000;
var rounded = Math.floor(seconds);
this.seconds = rounded + SECONDS_70_YEARS;
this.fractions = Math.round(TWO_POWER_32 * (seconds - rounded));
return milliseconds;
}
seconds = this.seconds - SECONDS_70_YEARS;
return (seconds + Math.round(this.fractions / TWO_POWER_32)) * 1000;
}
}]);
return Timetag;
}();
var AtomicTimetag = function (_Atomic) {
_inherits(AtomicTimetag, _Atomic);
var _super = _createSuper(AtomicTimetag);
function AtomicTimetag() {
var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Date.now();
_classCallCheck(this, AtomicTimetag);
var timetag = new Timetag();
if (value instanceof Timetag) {
timetag = value;
} else if (isInt(value)) {
timetag.timestamp(value);
} else if (isDate(value)) {
timetag.timestamp(value.getTime());
}
return _super.call(this, timetag);
}
_createClass(AtomicTimetag, [{
key: "pack",
value: function pack() {
if (isUndefined(this.value)) {
throw new Error('OSC AtomicTimetag can not be encoded with empty value');
}
var _this$value = this.value,
seconds = _this$value.seconds,
fractions = _this$value.fractions;
var data = new Uint8Array(8);
var dataView = new DataView(data.buffer);
dataView.setInt32(0, seconds, false);
dataView.setInt32(4, fractions, false);
return data;
}
}, {
key: "unpack",
value: function unpack(dataView) {
var initialOffset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
if (!(dataView instanceof DataView)) {
throw new Error('OSC AtomicTimetag expects an instance of type DataView');
}
var seconds = dataView.getUint32(initialOffset, false);
var fractions = dataView.getUint32(initialOffset + 4, false);
this.value = new Timetag(seconds, fractions);
this.offset = initialOffset + 8;
return this.offset;
}
}]);
return AtomicTimetag;
}(Atomic);
var AtomicBlob = function (_Atomic) {
_inherits(AtomicBlob, _Atomic);
var _super = _createSuper(AtomicBlob);
function AtomicBlob(value) {
_classCallCheck(this, AtomicBlob);
if (value && !isBlob(value)) {
throw new Error('OSC AtomicBlob constructor expects value of type Uint8Array');
}
return _super.call(this, value);
}
_createClass(AtomicBlob, [{
key: "pack",
value: function pack() {
if (isUndefined(this.value)) {
throw new Error('OSC AtomicBlob can not be encoded with empty value');
}
var byteLength = pad(this.value.byteLength);
var data = new Uint8Array(byteLength + 4);
var dataView = new DataView(data.buffer);
dataView.setInt32(0, this.value.byteLength, false);
data.set(this.value, 4);
return data;
}
}, {
key: "unpack",
value: function unpack(dataView) {
var initialOffset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
if (!(dataView instanceof DataView)) {
throw new Error('OSC AtomicBlob expects an instance of type DataView');
}
var byteLength = dataView.getInt32(initialOffset, false);
this.value = new Uint8Array(dataView.buffer, initialOffset + 4, byteLength);
this.offset = pad(initialOffset + 4 + byteLength);
return this.offset;
}
}]);
return AtomicBlob;
}(Atomic);
var AtomicFloat32 = function (_Atomic) {
_inherits(AtomicFloat32, _Atomic);
var _super = _createSuper(AtomicFloat32);
function AtomicFloat32(value) {
_classCallCheck(this, AtomicFloat32);
if (value && !isNumber(value)) {
throw new Error('OSC AtomicFloat32 constructor expects value of type float');
}
return _super.call(this, value);
}
_createClass(AtomicFloat32, [{
key: "pack",
value: function pack() {
return _get(_getPrototypeOf(AtomicFloat32.prototype), "pack", this).call(this, 'setFloat32', 4);
}
}, {
key: "unpack",
value: function unpack(dataView) {
var initialOffset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
return _get(_getPrototypeOf(AtomicFloat32.prototype), "unpack", this).call(this, dataView, 'getFloat32', 4, initialOffset);
}
}]);
return AtomicFloat32;
}(Atomic);
var AtomicFloat64 = function (_Atomic) {
_inherits(AtomicFloat64, _Atomic);
var _super = _createSuper(AtomicFloat64);
function AtomicFloat64(value) {
_classCallCheck(this, AtomicFloat64);
if (value && !isNumber(value)) {
throw new Error('OSC AtomicFloat64 constructor expects value of type float');
}
return _super.call(this, value);
}
_createClass(AtomicFloat64, [{
key: "pack",
value: function pack() {
return _get(_getPrototypeOf(AtomicFloat64.prototype), "pack", this).call(this, 'setFloat64', 8);
}
}, {
key: "unpack",
value: function unpack(dataView) {
var initialOffset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
return _get(_getPrototypeOf(AtomicFloat64.prototype), "unpack", this).call(this, dataView, 'getFloat64', 8, initialOffset);
}
}]);
return AtomicFloat64;
}(Atomic);
var MAX_INT64 = BigInt('9223372036854775807');
var MIN_INT64 = BigInt('-9223372036854775808');
var AtomicInt64 = function (_Atomic) {
_inherits(AtomicInt64, _Atomic);
var _super = _createSuper(AtomicInt64);
function AtomicInt64(value) {
_classCallCheck(this, AtomicInt64);
if (value && typeof value !== 'bigint') {
throw new Error('OSC AtomicInt64 constructor expects value of type BigInt');
}
if (value && (value < MIN_INT64 || value > MAX_INT64)) {
throw new Error('OSC AtomicInt64 value is out of bounds');
}
var tmp;
if (value) {
tmp = BigInt.asIntN(64, value);
}
return _super.call(this, tmp);
}
_createClass(AtomicInt64, [{
key: "pack",
value: function pack() {
return _get(_getPrototypeOf(AtomicInt64.prototype), "pack", this).call(this, 'setBigInt64', 8);
}
}, {
key: "unpack",
value: function unpack(dataView) {
var initialOffset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
return _get(_getPrototypeOf(AtomicInt64.prototype), "unpack", this).call(this, dataView, 'getBigInt64', 8, initialOffset);
}
}]);
return AtomicInt64;
}(Atomic);
var MAX_UINT64 = BigInt('18446744073709551615');
var AtomicUInt64 = function (_Atomic) {
_inherits(AtomicUInt64, _Atomic);
var _super = _createSuper(AtomicUInt64);
function AtomicUInt64(value) {
_classCallCheck(this, AtomicUInt64);
if (value && typeof value !== 'bigint') {
throw new Error('OSC AtomicUInt64 constructor expects value of type BigInt');
}
if (value && (value < 0 || value > MAX_UINT64)) {
throw new Error('OSC AtomicUInt64 value is out of bounds');
}
var tmp;
if (value) {
tmp = BigInt.asUintN(64, value);
}
return _super.call(this, tmp);
}
_createClass(AtomicUInt64, [{
key: "pack",
value: function pack() {
return _get(_getPrototypeOf(AtomicUInt64.prototype), "pack", this).call(this, 'setBigUint64', 8);
}
}, {
key: "unpack",
value: function unpack(dataView) {
var initialOffset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
return _get(_getPrototypeOf(AtomicUInt64.prototype), "unpack", this).call(this, dataView, 'getBigUint64', 8, initialOffset);
}
}]);
return AtomicUInt64;
}(Atomic);
var VALUE_TRUE = true;
var VALUE_FALSE = false;
var VALUE_NONE = null;
var VALUE_INFINITY = Infinity;
var TypedMessage = function () {
function TypedMessage(address, args) {
var _this = this;
_classCallCheck(this, TypedMessage);
this.offset = 0;
this.address = '';
this.types = '';
this.args = [];
if (!isUndefined(address)) {
if (!(isString(address) || isArray(address))) {
throw new Error('OSC Message constructor first argument (address) must be a string or array');
}
this.address = prepareAddress(address);
}
if (!isUndefined(args)) {
if (!isArray(args)) {
throw new Error('OSC Message constructor second argument (args) must be an array');
}
args.forEach(function (item) {
return _this.add(item.type, item.value);
});
}
}
_createClass(TypedMessage, [{
key: "add",
value: function add(type, item) {
if (isUndefined(type)) {
throw new Error('OSC Message needs a valid OSC Atomic Data Type');
}
if (type === 'N') {
this.args.push(VALUE_NONE);
} else if (type === 'T') {
this.args.push(VALUE_TRUE);
} else if (type === 'F') {
this.args.push(VALUE_FALSE);
} else if (type === 'I') {
this.args.push(VALUE_INFINITY);
} else {
this.args.push(item);
}
this.types += type;
}
}, {
key: "pack",
value: function pack() {
var _this2 = this;
if (this.address.length === 0 || this.address[0] !== '/') {
throw new Error('OSC Message has an invalid address');
}
var encoder = new EncodeHelper();
encoder.add(new AtomicString(this.address));
encoder.add(new AtomicString(",".concat(this.types)));
if (this.args.length > 0) {
var argument;
if (this.args.length > this.types.length) {
throw new Error('OSC Message argument and type tag mismatch');
}
this.args.forEach(function (value, index) {
var type = _this2.types[index];
if (type === 'i') {
argument = new AtomicInt32(value);
} else if (type === 'h') {
argument = new AtomicInt64(value);
} else if (type === 't') {
argument = new AtomicUInt64(value);
} else if (type === 'f') {
argument = new AtomicFloat32(value);
} else if (type === 'd') {
argument = new AtomicFloat64(value);
} else if (type === 's') {
argument = new AtomicString(value);
} else if (type === 'b') {
argument = new AtomicBlob(value);
} else if (type === 'T') {
argument = VALUE_TRUE;
} else if (type === 'F') {
argument = VALUE_FALSE;
} else if (type === 'N') {
argument = VALUE_NONE;
} else if (type === 'I') {
argument = VALUE_INFINITY;
} else {
throw new Error('OSC Message found unknown argument type');
}
encoder.add(argument);
});
}
return encoder.merge();
}
}, {
key: "unpack",
value: function unpack(dataView) {
var initialOffset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
if (!(dataView instanceof DataView)) {
throw new Error('OSC Message expects an instance of type DataView.');
}
var address = new AtomicString();
address.unpack(dataView, initialOffset);
var types = new AtomicString();
types.unpack(dataView, address.offset);
if (address.value.length === 0 || address.value[0] !== '/') {
throw new Error('OSC Message found malformed or missing address string');
}
if (types.value.length === 0 && types.value[0] !== ',') {
throw new Error('OSC Message found malformed or missing type string');
}
var offset = types.offset;
var next;
var type;
var args = [];
for (var i = 1; i < types.value.length; i += 1) {
type = types.value[i];
next = null;
if (type === 'i') {
next = new AtomicInt32();
} else if (type === 'h') {
next = new AtomicInt64();
} else if (type === 't') {
next = new AtomicUInt64();
} else if (type === 'f') {
next = new AtomicFloat32();
} else if (type === 'd') {
next = new AtomicFloat64();
} else if (type === 's') {
next = new AtomicString();
} else if (type === 'b') {
next = new AtomicBlob();
} else if (type === 'T') {
args.push(VALUE_TRUE);
} else if (type === 'F') {
args.push(VALUE_FALSE);
} else if (type === 'N') {
args.push(VALUE_NONE);
} else if (type === 'I') {
args.push(VALUE_INFINITY);
} else {
throw new Error('OSC Message found unsupported argument type');
}
if (next) {
offset = next.unpack(dataView, offset);
args.push(next.value);
}
}
this.offset = offset;
this.address = address.value;
this.types = types.value;
this.args = args;
return this.offset;
}
}]);
return TypedMessage;
}();
var Message = function (_TypedMessage) {
_inherits(Message, _TypedMessage);
var _super = _createSuper(Message);
function Message() {
var _this3;
_classCallCheck(this, Message);
var address;
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
if (args.length > 0) {
address = args.shift();
}
var oscArgs;
if (args.length > 0) {
if (args[0] instanceof Array) {
oscArgs = args.shift();
}
}
_this3 = _super.call(this, address, oscArgs);
if (args.length > 0) {
_this3.types = args.map(function (item) {
return typeTag(item);
}).join('');
_this3.args = args;
}
return _this3;
}
_createClass(Message, [{
key: "add",
value: function add(item) {
_get(_getPrototypeOf(Message.prototype), "add", this).call(this, typeTag(item), item);
}
}]);
return Message;
}(TypedMessage);
var BUNDLE_TAG = '#bundle';
var Bundle = function () {
function Bundle() {
var _this = this;
_classCallCheck(this, Bundle);
this.offset = 0;
this.timetag = new AtomicTimetag();
this.bundleElements = [];
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
if (args.length > 0) {
if (args[0] instanceof Date || isInt(args[0])) {
this.timetag = new AtomicTimetag(args[0]);
} else if (isArray(args[0])) {
args[0].forEach(function (item) {
_this.add(item);
});
if (args.length > 1 && (args[1] instanceof Date || isInt(args[0]))) {
this.timetag = new AtomicTimetag(args[1]);
}
} else {
args.forEach(function (item) {
_this.add(item);
});
}
}
}
_createClass(Bundle, [{
key: "timestamp",
value: function timestamp(ms) {
if (!isInt(ms)) {
throw new Error('OSC Bundle needs an integer for setting the timestamp');
}
this.timetag = new AtomicTimetag(ms);
}
}, {
key: "add",
value: function add(item) {
if (!(item instanceof Message || item instanceof Bundle)) {
throw new Error('OSC Bundle contains only Messages and Bundles');
}
this.bundleElements.push(item);
}
}, {
key: "pack",
value: function pack() {
var encoder = new EncodeHelper();
encoder.add(new AtomicString(BUNDLE_TAG));
if (!this.timetag) {
this.timetag = new AtomicTimetag();
}
encoder.add(this.timetag);
this.bundleElements.forEach(function (item) {
encoder.add(new AtomicInt32(item.pack().byteLength));
encoder.add(item);
});
return encoder.merge();
}
}, {
key: "unpack",
value: function unpack(dataView) {
var initialOffset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
if (!(dataView instanceof DataView)) {
throw new Error('OSC Bundle expects an instance of type DataView');
}
var parentHead = new AtomicString();
parentHead.unpack(dataView, initialOffset);
if (parentHead.value !== BUNDLE_TAG) {
throw new Error('OSC Bundle does not contain a valid #bundle head');
}
var timetag = new AtomicTimetag();
var offset = timetag.unpack(dataView, parentHead.offset);
this.bundleElements = [];
while (offset < dataView.byteLength) {
var head = new AtomicString();
var size = new AtomicInt32();
offset = size.unpack(dataView, offset);
var item = void 0;
head.unpack(dataView, offset);
if (head.value === BUNDLE_TAG) {
item = new Bundle();
} else {
item = new Message();
}
offset = item.unpack(dataView, offset);
this.bundleElements.push(item);
}
this.offset = offset;
this.timetag = timetag;
return this.offset;
}
}]);
return Bundle;
}();
var Packet = function () {
function Packet(value) {
_classCallCheck(this, Packet);
if (value && !(value instanceof Message || value instanceof Bundle)) {
throw new Error('OSC Packet value has to be Message or Bundle');
}
this.value = value;
this.offset = 0;
}
_createClass(Packet, [{
key: "pack",
value: function pack() {
if (!this.value) {
throw new Error('OSC Packet can not be encoded with empty body');
}
return this.value.pack();
}
}, {
key: "unpack",
value: function unpack(dataView) {
var initialOffset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
if (!(dataView instanceof DataView)) {
throw new Error('OSC Packet expects an instance of type DataView');
}
if (dataView.byteLength % 4 !== 0) {
throw new Error('OSC Packet byteLength has to be a multiple of four');
}
var head = new AtomicString();
head.unpack(dataView, initialOffset);
var item;
if (head.value === BUNDLE_TAG) {
item = new Bundle();
} else {
item = new Message();
}
item.unpack(dataView, initialOffset);
this.offset = item.offset;
this.value = item;
return this.offset;
}
}]);
return Packet;
}();
var defaultOptions$5 = {
discardLateMessages: false
};
var EventHandler = function () {
function EventHandler(options) {
_classCallCheck(this, EventHandler);
this.options = _objectSpread2(_objectSpread2({}, defaultOptions$5), options);
this.addressHandlers = [];
this.eventHandlers = {
open: [],
error: [],
close: []
};
this.uuid = 0;
}
_createClass(EventHandler, [{
key: "dispatch",
value: function dispatch(packet, rinfo) {
var _this = this;
if (!(packet instanceof Packet)) {
throw new Error('OSC EventHander dispatch() accepts only arguments of type Packet');
}
if (!packet.value) {
throw new Error('OSC EventHander dispatch() can\'t read empty Packets');
}
if (packet.value instanceof Bundle) {
var bundle = packet.value;
return bundle.bundleElements.forEach(function (bundleItem) {
if (bundleItem instanceof Bundle) {
if (bundle.timetag.value.timestamp() < bundleItem.timetag.value.timestamp()) {
throw new Error('OSC Bundle timestamp is older than the timestamp of enclosed Bundles');
}
return _this.dispatch(bundleItem);
} else if (bundleItem instanceof Message) {
var message = bundleItem;
return _this.notify(message.address, message, bundle.timetag.value.timestamp(), rinfo);
}
throw new Error('OSC EventHander dispatch() can\'t dispatch unknown Packet value');
});
} else if (packet.value instanceof Message) {
var message = packet.value;
return this.notify(message.address, message, 0, rinfo);
}
throw new Error('OSC EventHander dispatch() can\'t dispatch unknown Packet value');
}
}, {
key: "call",
value: function call(name, data, rinfo) {
var success = false;
if (isString(name) && name in this.eventHandlers) {
this.eventHandlers[name].forEach(function (handler) {
handler.callback(data, rinfo);
success = true;
});
return success;
}
var handlerKeys = Object.keys(this.addressHandlers);
var handlers = this.addressHandlers;
handlerKeys.forEach(function (key) {
var foundMatch = false;
var regex = new RegExp(prepareRegExPattern(prepareAddress(name)), 'g');
var test = regex.test(key);
if (test && key.length === regex.lastIndex) {
foundMatch = true;
}
if (!foundMatch) {
var reverseRegex = new RegExp(prepareRegExPattern(prepareAddress(key)), 'g');
var reverseTest = reverseRegex.test(name);
if (reverseTest && name.length === reverseRegex.lastIndex) {
foundMatch = true;
}
}
if (foundMatch) {
handlers[key].forEach(function (handler) {
handler.callback(data, rinfo);
success = true;
});
}
});
return success;
}
}, {
key: "notify",
value: function notify() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
if (args.length === 0) {
throw new Error('OSC EventHandler can not be called without any argument');
}
if (args[0] instanceof Packet) {
return this.dispatch(args[0], args[1]);
} else if (args[0] instanceof Bundle || args[0] instanceof Message) {
return this.dispatch(new Packet(args[0]), args[1]);
} else if (!isString(args[0])) {
var packet = new Packet();
packet.unpack(dataView(args[0]));
return this.dispatch(packet, args[1]);
}
var name = args[0];
var data = null;
if (args.length > 1) {
data = args[1];
}
var timestamp = null;
if (args.length > 2) {
if (isInt(args[2])) {
timestamp = args[2];
} else if (args[2] instanceof Date) {
timestamp = args[2].getTime();
} else {
throw new Error('OSC EventHandler timestamp has to be a number or Date');
}
}
var rinfo = null;
if (args.length >= 3) {
rinfo = args[3];
}
if (timestamp) {
var now = Date.now();
if (now > timestamp) {
if (!this.options.discardLateMessages) {
return this.call(name, data, rinfo);
}
}
var that = this;
setTimeout(function () {
that.call(name, data, rinfo);
}, timestamp - now);
return true;
}
return this.call(name, data, rinfo);
}
}, {
key: "on",
value: function on(name, callback) {
if (!(isString(name) || isArray(name))) {
throw new Error('OSC EventHandler accepts only strings or arrays for address patterns');
}
if (!isFunction(callback)) {
throw new Error('OSC EventHandler callback has to be a function');
}
this.uuid += 1;
var handler = {
id: this.uuid,
callback: callback
};
if (isString(name) && name in this.eventHandlers) {
this.eventHandlers[name].push(handler);
return this.uuid;
}
var address = prepareAddress(name);
if (!(address in this.addressHandlers)) {
this.addressHandlers[address] = [];
}
this.addressHandlers[address].push(handler);
return this.uuid;
}
}, {
key: "off",
value: function off(name, subscriptionId) {
if (!(isString(name) || isArray(name))) {
throw new Error('OSC EventHandler accepts only strings or arrays for address patterns');
}
if (!isInt(subscriptionId)) {
throw new Error('OSC EventHandler subscription id has to be a number');
}
var key;
var haystack;
if (isString(name) && name in this.eventHandlers) {
key = name;
haystack = this.eventHandlers;
} else {
key = prepareAddress(name);
haystack = this.addressHandlers;
}
if (key in haystack) {
return haystack[key].some(function (item, index) {
if (item.id === subscriptionId) {
haystack[key].splice(index, 1);
return true;
}
return false;
});
}
return false;
}
}]);
return EventHandler;
}();
var dgram$1 = /* typeof window !== 'undefined' ? require('dgram') : */ undefined;
var STATUS$4 = {
IS_NOT_INITIALIZED: -1,
IS_CONNECTING: 0,
IS_OPEN: 1,
IS_CLOSING: 2,
IS_CLOSED: 3
};
var defaultOpenOptions = {
host: 'localhost',
port: 41234,
exclusive: false
};
var defaultSendOptions = {
host: 'localhost',
port: 41235
};
var defaultOptions$4 = {
type: 'udp4',
open: defaultOpenOptions,
send: defaultSendOptions
};
function mergeOptions$1(base, custom) {
return _objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2({}, defaultOptions$4), base), custom), {}, {
open: _objectSpread2(_objectSpread2(_objectSpread2({}, defaultOptions$4.open), base.open), custom.open),
send: _objectSpread2(_objectSpread2(_objectSpread2({}, defaultOptions$4.send), base.send), custom.send)
});
}
var DatagramPlugin = function () {
function DatagramPlugin() {
var _this = this;
var customOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, DatagramPlugin);
if (!dgram$1) {
throw new Error('DatagramPlugin can not be used in browser context');
}
this.options = mergeOptions$1({}, customOptions);
this.socket = dgram$1.createSocket(this.options.type);
this.socketStatus = STATUS$4.IS_NOT_INITIALIZED;
this.socket.on('message', function (message, rinfo) {
_this.notify(message, rinfo);
});
this.socket.on('error', function (error) {
_this.notify('error', error);
});
this.notify = function () {};
}
_createClass(DatagramPlugin, [{
key: "registerNotify",
value: function registerNotify(fn) {
this.notify = fn;
}
}, {
key: "status",
value: function status() {
return this.socketStatus;
}
}, {
key: "open",
value: function open() {
var _this2 = this;
var customOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var options = _objectSpread2(_objectSpread2({}, this.options.open), customOptions);
var port = options.port,
exclusive = options.exclusive;
this.socketStatus = STATUS$4.IS_CONNECTING;
this.socket.bind({
address: options.host,
port: port,
exclusive: exclusive
}, function () {
_this2.socketStatus = STATUS$4.IS_OPEN;
_this2.notify('open');
});
}
}, {
key: "close",
value: function close() {
var _this3 = this;
this.socketStatus = STATUS$4.IS_CLOSING;
this.socket.close(function () {
_this3.socketStatus = STATUS$4.IS_CLOSED;
_this3.notify('close');
});
}
}, {
key: "send",
value: function send(binary) {
var customOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var options = _objectSpread2(_objectSpread2({}, this.options.send), customOptions);
var port = options.port,
host = options.host;
this.socket.send(Buffer.from(binary), 0, binary.byteLength, port, host);
}
}]);
return DatagramPlugin;
}();
var dgram = /* typeof window !== 'undefined' ? require('dgram') : */ undefined;
var WebSocketServer$1 = /* typeof window !== 'undefined' ? require('isomorphic-ws').Server : */ undefined;
var STATUS$3 = {
IS_NOT_INITIALIZED: -1,
IS_CONNECTING: 0,
IS_OPEN: 1,
IS_CLOSING: 2,
IS_CLOSED: 3
};
var defaultOptions$3 = {
udpServer: {
host: 'localhost',
port: 41234,
exclusive: false
},
udpClient: {
host: 'localhost',
port: 41235
},
wsServer: {
host: 'localhost',
port: 8080
},
receiver: 'ws'
};
function mergeOptions(base, custom) {
return _objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2({}, defaultOptions$3), base), custom), {}, {
udpServer: _objectSpread2(_objectSpread2(_objectSpread2({}, defaultOptions$3.udpServer), base.udpServer), custom.udpServer),
udpClient: _objectSpread2(_objectSpread2(_objectSpread2({}, defaultOptions$3.udpClient), base.udpClient), custom.udpClient),
wsServer: _objectSpread2(_objectSpread2(_objectSpread2({}, defaultOptions$3.wsServer), base.wsServer), custom.wsServer)
});
}
var BridgePlugin = function () {
function BridgePlugin() {
var _this = this;
var customOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, BridgePlugin);
if (!dgram || !WebSocketServer$1) {
throw new Error('BridgePlugin can not be used in browser context');
}
this.options = mergeOptions({}, customOptions);
this.websocket = null;
this.socket = dgram.createSocket('udp4');
this.socketStatus = STATUS$3.IS_NOT_INITIALIZED;
this.socket.on('message', function (message) {
_this.send(message, {
receiver: 'ws'
});
_this.notify(message.buffer);
});
this.socket.on('error', function (error) {
_this.notify('error', error);
});
this.notify = function () {};
}
_createClass(BridgePlugin, [{
key: "registerNotify",
value: function registerNotify(fn) {
this.notify = fn;
}
}, {
key: "status",
value: function status() {
return this.socketStatus;
}
}, {
key: "open",
value: function open() {
var _this2 = this;
var customOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var options = mergeOptions(this.options, customOptions);
this.socketStatus = STATUS$3.IS_CONNECTING;
this.socket.bind({
address: options.udpServer.host,
port: options.udpServer.port,
exclusive: options.udpServer.exclusive
}, function () {
var wsServerOptions = {};
if (options.wsServer.server) wsServerOptions.server = options.wsServer.server;else wsServerOptions = options.wsServer;
_this2.websocket = new WebSocketServer$1(wsServerOptions);
_this2.websocket.binaryType = 'arraybuffer';
_this2.websocket.on('listening', function () {
_this2.socketStatus = STATUS$3.IS_OPEN;
_this2.notify('open');
});
_this2.websocket.on('error', function (error) {
_this2.notify('error', error);
});
_this2.websocket.on('connection', function (client) {
client.on('message', function (message, rinfo) {
_this2.send(message, {
receiver: 'udp'
});
_this2.notify(new Uint8Array(message), rinfo);
});
});
});
}
}, {
key: "close",
value: function close() {
var _this3 = this;
this.socketStatus = STATUS$3.IS_CLOSING;
this.socket.close(function () {
_this3.websocket.close(function () {
_this3.socketStatus = STATUS$3.IS_CLOSED;
_this3.notify('close');
});
});
}
}, {
key: "send",
value: function send(binary) {
var customOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var options = mergeOptions(this.options, customOptions);
var receiver = options.receiver;
if (receiver === 'udp') {
var data = binary instanceof Buffer ? binary : Buffer.from(binary);
this.socket.send(data, 0, data.byteLength, options.udpClient.port, options.udpClient.host);
} else if (receiver === 'ws') {
this.websocket.clients.forEach(function (client) {
client.send(binary, {
binary: true
});
});
} else {
throw new Error('BridgePlugin can not send message to unknown receiver');
}
}
}]);
return BridgePlugin;
}();
var scope = typeof global === 'undefined' ? window : global;
var WebSocket = typeof __dirname === 'undefined' ? scope.WebSocket : require('isomorphic-ws');
var STATUS$2 = {
IS_NOT_INITIALIZED: -1,
IS_CONNECTING: 0,
IS_OPEN: 1,
IS_CLOSING: 2,
IS_CLOSED: 3
};
var defaultOptions$2 = {
host: 'localhost',
port: 8080,
secure: false,
protocol: []
};
var WebsocketClientPlugin = function () {
function WebsocketClientPlugin(customOptions) {
_classCallCheck(this, WebsocketClientPlugin);
if (!WebSocket) {
throw new Error('WebsocketClientPlugin can\'t find a WebSocket class');
}
this.options = _objectSpread2(_objectSpread2({}, defaultOptions$2), customOptions);
this.socket = null;
this.socketStatus = STATUS$2.IS_NOT_INITIALIZED;
this.notify = function () {};
}
_createClass(WebsocketClientPlugin, [{
key: "registerNotify",
value: function registerNotify(fn) {
this.notify = fn;
}
}, {
key: "status",
value: function status() {
return this.socketStatus;
}
}, {
key: "open",
value: function open() {
var _this = this;
var customOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var options = _objectSpread2(_objectSpread2({}, this.options), customOptions);
var port = options.port,
host = options.host,
secure = options.secure,
protocol = options.protocol;
if (this.socket) {
this.close();
}
var scheme = secure ? 'wss' : 'ws';
var rinfo = {
address: host,
family: scheme,
port: port,
size: 0
};
this.socket = new WebSocket("".concat(scheme, "://").concat(host, ":").concat(port), protocol);
this.socket.binaryType = 'arraybuffer';
this.socketStatus = STATUS$2.IS_CONNECTING;
this.socket.onopen = function () {
_this.socketStatus = STATUS$2.IS_OPEN;
_this.notify('open');
};
this.socket.onclose = function () {
_this.socketStatus = STATUS$2.IS_CLOSED;
_this.notify('close');
};
this.socket.onerror = function (error) {
_this.notify('error', error);
};
this.socket.onmessage = function (message) {
_this.notify(message.data, rinfo);
};
}
}, {
key: "close",
value: function close() {
this.socketStatus = STATUS$2.IS_CLOSING;
this.socket.close();
}
}, {
key: "send",
value: function send(binary) {
this.socket.send(binary);
}
}]);
return WebsocketClientPlugin;
}();
var WebSocketServer = typeof __dirname !== 'undefined' ? require('isomorphic-ws').Server : undefined;
var STATUS$1 = {
IS_NOT_INITIALIZED: -1,
IS_CONNECTING: 0,
IS_OPEN: 1,
IS_CLOSING: 2,
IS_CLOSED: 3
};
var defaultOptions$1 = {
host: 'localhost',
port: 8080
};
var WebsocketServerPlugin = function () {
function WebsocketServerPlugin(customOptions) {
_classCallCheck(this, WebsocketServerPlugin);
if (!WebSocketServer) {
throw new Error('WebsocketServerPlugin can not be used in browser context');
}
this.options = _objectSpread2(_objectSpread2({}, defaultOptions$1), customOptions);
this.socket = null;
this.socketStatus = STATUS$1.IS_NOT_INITIALIZED;
this.notify = function () {};
}
_createClass(WebsocketServerPlugin, [{
key: "registerNotify",
value: function registerNotify(fn) {
this.notify = fn;
}
}, {
key: "status",
value: function status() {
return this.socketStatus;
}
}, {
key: "open",
value: function open() {
var _this = this;
var customOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var options = _objectSpread2(_objectSpread2({}, this.options), customOptions);
var port = options.port,
host = options.host;
var rinfo = {
address: host,
family: 'wsserver',
port: port,
size: 0
};
if (this.socket) {
this.close();
}
if (options.server) {
this.socket = new WebSocketServer({
server: options.server
});
} else {
this.socket = new WebSocketServer({
host: host,
port: port
});
}
this.socket.binaryType = 'arraybuffer';
this.socketStatus = STATUS$1.IS_CONNECTING;
this.socket.on('listening', function () {
_this.socketStatus = STATUS$1.IS_OPEN;
_this.notify('open');
});
this.socket.on('error', function (error) {
_this.notify('error', error);
});
this.socket.on('connection', function (client) {
client.on('message', function (message) {
_this.notify(new Uint8Array(message), rinfo);
});
});
}
}, {
key: "close",
value: function close() {
var _this2 = this;
this.socketStatus = STATUS$1.IS_CLOSING;
this.socket.close(function () {
_this2.socketStatus = STATUS$1.IS_CLOSED;
_this2.notify('close');
});
}
}, {
key: "send",
value: function send(binary) {
this.socket.clients.forEach(function (client) {
client.send(binary, {
binary: true
});
});
}
}]);
return WebsocketServerPlugin;
}();
var defaultOptions = {
discardLateMessages: false,
plugin: new WebsocketClientPlugin()
};
var STATUS = {
IS_NOT_INITIALIZED: -1,
IS_CONNECTING: 0,
IS_OPEN: 1,
IS_CLOSING: 2,
IS_CLOSED: 3
};
var OSC = function () {
function OSC(options) {
_classCallCheck(this, OSC);
if (options && !isObject(options)) {
throw new Error('OSC options argument has to be an object.');
}
this.options = _objectSpread2(_objectSpread2({}, defaultOptions), options);
this.eventHandler = new EventHandler({
discardLateMessages: this.options.discardLateMessages
});
var eventHandler = this.eventHandler;
if (this.options.plugin && this.options.plugin.registerNotify) {
this.options.plugin.registerNotify(function () {
return eventHandler.notify.apply(eventHandler, arguments);
});
}
}
_createClass(OSC, [{
key: "on",
value: function on(eventName, callback) {
if (!(isString(eventName) && isFunction(callback))) {
throw new Error('OSC on() needs event- or address string and callback function');
}
return this.eventHandler.on(eventName, callback);
}
}, {
key: "off",
value: function off(eventName, subscriptionId) {
if (!(isString(eventName) && isInt(subscriptionId))) {
throw new Error('OSC off() needs string and number (subscriptionId) to unsubscribe');
}
return this.eventHandler.off(eventName, subscriptionId);
}
}, {
key: "open",
value: function open(options) {
if (options && !isObject(options)) {
throw new Error('OSC open() options argument needs to be an object');
}
if (!(this.options.plugin && isFunction(this.options.plugin.open))) {
throw new Error('OSC Plugin API #open is not implemented!');
}
return this.options.plugin.open(options);
}
}, {
key: "status",
value: function status() {
if (!(this.options.plugin && isFunction(this.options.plugin.status))) {
throw new Error('OSC Plugin API #status is not implemented!');
}
return this.options.plugin.status();
}
}, {
key: "close",
value: function close() {
if (!(this.options.plugin && isFunction(this.options.plugin.close))) {
throw new Error('OSC Plugin API #close is not implemented!');
}
return this.options.plugin.close();
}
}, {
key: "send",
value: function send(packet, options) {
if (!(this.options.plugin && isFunction(this.options.plugin.send))) {
throw new Error('OSC Plugin API #send is not implemented!');
}
if (!(packet instanceof TypedMessage || packet instanceof Message || packet instanceof Bundle || packet instanceof Packet)) {
throw new Error('OSC send() needs Messages, Bundles or Packets');
}
if (options && !isObject(options)) {
throw new Error('OSC send() options argument has to be an object');
}
return this.options.plugin.send(packet.pack(), options);
}
}]);
return OSC;
}();
OSC.STATUS = STATUS;
OSC.Packet = Packet;
OSC.Bundle = Bundle;
OSC.Message = Message;
OSC.TypedMessage = TypedMessage;
OSC.DatagramPlugin = DatagramPlugin;
OSC.WebsocketClientPlugin = WebsocketClientPlugin;
OSC.WebsocketServerPlugin = WebsocketServerPlugin;
OSC.BridgePlugin = BridgePlugin;
export default OSC;