WebSockets: improve support for callbacks in JS client lib
This commit is contained in:
parent
1f3b40f4bd
commit
da670aa186
@ -38,7 +38,8 @@ import { Switch, DiscreteSlider, ContinuousSlider, LogarithmicSlider,
|
||||
main();
|
||||
|
||||
function main () {
|
||||
ardour.messageCallback = (msg) => {
|
||||
ardour.addCallback({
|
||||
onMessage: (msg) => {
|
||||
log(`↙ ${msg}`, 'message-in');
|
||||
|
||||
if (msg.node == 'strip_desc') {
|
||||
@ -52,11 +53,12 @@ import { Switch, DiscreteSlider, ContinuousSlider, LogarithmicSlider,
|
||||
widgets[msg.hash].value = msg.val[0];
|
||||
}
|
||||
}
|
||||
};
|
||||
},
|
||||
|
||||
ardour.errorCallback = () => {
|
||||
onError: () => {
|
||||
log('Client error', 'error');
|
||||
};
|
||||
}
|
||||
});
|
||||
|
||||
ardour.open();
|
||||
}
|
||||
|
@ -22,22 +22,33 @@ import { MessageChannel } from './channel.js';
|
||||
export class Ardour {
|
||||
|
||||
constructor () {
|
||||
this._channel = new MessageChannel(location.host);
|
||||
this._channel.errorCallback = (error) => this.errorCallback();
|
||||
this._channel.messageCallback = (msg) => this._onChannelMessage(msg);
|
||||
this._callbacks = [];
|
||||
this._pendingRequest = null;
|
||||
this._channel = new MessageChannel(location.host);
|
||||
|
||||
this._channel.onError = (error) => {
|
||||
this._fireCallbacks('error', error);
|
||||
};
|
||||
|
||||
this._channel.onMessage = (msg) => {
|
||||
this._onChannelMessage(msg);
|
||||
};
|
||||
}
|
||||
|
||||
addCallback (callback) {
|
||||
this._callbacks.push(callback);
|
||||
}
|
||||
|
||||
async open () {
|
||||
this._channel.closeCallback = () => {
|
||||
this.errorCallback(new Error('Message channel unexpectedly closed'));
|
||||
this._channel.onClose = () => {
|
||||
this._fireCallbacks('error', new Error('Message channel unexpectedly closed'));
|
||||
};
|
||||
|
||||
await this._channel.open();
|
||||
}
|
||||
|
||||
close () {
|
||||
this._channel.closeCallback = () => {};
|
||||
this._channel.onClose = () => {};
|
||||
this._channel.close();
|
||||
}
|
||||
|
||||
@ -45,14 +56,6 @@ export class Ardour {
|
||||
this._channel.send(msg);
|
||||
}
|
||||
|
||||
errorCallback (error) {
|
||||
// empty
|
||||
}
|
||||
|
||||
messageCallback (msg) {
|
||||
// empty
|
||||
}
|
||||
|
||||
// Surface metadata API over HTTP
|
||||
|
||||
async getAvailableSurfaces () {
|
||||
@ -73,7 +76,8 @@ export class Ardour {
|
||||
const xmlDoc = new DOMParser().parseFromString(xmlText, 'text/xml');
|
||||
return {
|
||||
name: xmlDoc.getElementsByTagName('Name')[0].getAttribute('value'),
|
||||
description: xmlDoc.getElementsByTagName('Description')[0].getAttribute('value')
|
||||
description: xmlDoc.getElementsByTagName('Description')[0].getAttribute('value'),
|
||||
version: xmlDoc.getElementsByTagName('Version')[0].getAttribute('value')
|
||||
}
|
||||
} else {
|
||||
throw this._fetchResponseStatusError(response.status);
|
||||
@ -151,7 +155,21 @@ export class Ardour {
|
||||
this._pendingRequest.resolve(msg.val);
|
||||
this._pendingRequest = null;
|
||||
} else {
|
||||
this.messageCallback(msg);
|
||||
this._fireCallbacks('message', msg);
|
||||
this._fireCallbacks(msg.node, ...msg.addr, ...msg.val);
|
||||
}
|
||||
}
|
||||
|
||||
_fireCallbacks (name, ...args) {
|
||||
// name_with_underscores -> onNameWithUnderscores
|
||||
const method = 'on' + name.split('_').map((s) => {
|
||||
return s[0].toUpperCase() + s.slice(1).toLowerCase();
|
||||
}).join('');
|
||||
|
||||
for (const callback of this._callbacks) {
|
||||
if (method in callback) {
|
||||
callback[method](...args)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
31
share/web_surfaces/shared/callback.js
Normal file
31
share/web_surfaces/shared/callback.js
Normal file
@ -0,0 +1,31 @@
|
||||
/*
|
||||
* Copyright © 2020 Luciano Iam <lucianito@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
export class ArdourCallback {
|
||||
|
||||
onTempo (bpm) {}
|
||||
onStripGain (stripId, db) {}
|
||||
onStripPan (stripId, value) {}
|
||||
onStripMute (stripId, value) {}
|
||||
onStripPluginEnable (stripId, pluginId, value) {}
|
||||
onStripPluginParamValue (stripId, pluginId, paramId, value) {}
|
||||
|
||||
onMessage (msg) {}
|
||||
onError (error) {}
|
||||
|
||||
}
|
@ -29,19 +29,19 @@ export class MessageChannel {
|
||||
return new Promise((resolve, reject) => {
|
||||
this._socket = new WebSocket(`ws://${this._host}`);
|
||||
|
||||
this._socket.onclose = () => this.closeCallback();
|
||||
this._socket.onclose = () => this.onClose();
|
||||
|
||||
this._socket.onerror = (error) => this.errorCallback(error);
|
||||
this._socket.onerror = (error) => this.onError(error);
|
||||
|
||||
this._socket.onmessage = (event) => {
|
||||
this.messageCallback (Message.fromJsonText(event.data));
|
||||
this.onMessage (Message.fromJsonText(event.data));
|
||||
};
|
||||
|
||||
this._socket.onopen = resolve;
|
||||
});
|
||||
}
|
||||
|
||||
async close () {
|
||||
close () {
|
||||
this._socket.close();
|
||||
}
|
||||
|
||||
@ -53,16 +53,8 @@ export class MessageChannel {
|
||||
}
|
||||
}
|
||||
|
||||
closeCallback () {
|
||||
// empty
|
||||
}
|
||||
|
||||
errorCallback (error) {
|
||||
// empty
|
||||
}
|
||||
|
||||
messageCallback (msg) {
|
||||
// empty
|
||||
}
|
||||
onClose () {}
|
||||
onError (error) {}
|
||||
onMessage (msg) {}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user