mirror of
https://github.com/eliasstepanik/strudel-docker.git
synced 2026-01-11 21:58:31 +00:00
1727 lines
56 KiB
JavaScript
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;
|