audioshake.js
Version:
AudioShakes groovy websocket client for receiving job status notifications
106 lines (101 loc) • 4.4 kB
JavaScript
const AudioShake = {
HOST: "",
LIVE_HOST: "https://groovy.audioshake.ai",
TEST_HOST: "https://staging-groovy.audioshake.ai",
websocket: null,
notify: function ({ live, token, onSuccess, onFailure, onStatus, debug }) {
const host = live ? `${AudioShake.LIVE_HOST.split('http').join('ws')}/notes` : "ws://localhost:3002/notes";
let ws = new WebSocket(host);
AudioShake.HOST = live ? AudioShake.LIVE_HOST : AudioShake.TEST_HOST;
AudioShake.websocket = ws;
ws.onopen = function (e) {
console.log("audioshake: socket connection established");
};
ws.onclose = function (event) {
if (event.wasClean) {
console.log(`audioshake: socket connection closed cleanly, code=${event.code} reason=${event.reason}`);
} else {
console.log('audioshake: socket. connection died. reconnecting...');
AudioShake.notify({ live, token, onSuccess, onFailure, onStatus });
}
};
ws.onerror = function (error) {
console.log(`audioshake: socket [error] ${error.message}`);
};
ws.onmessage = (msg) => {
const request = JSON.parse(msg.data);
if (debug) {
console.log("socket message recvd: ", msg);
console.log("socket method: ", request.method);
console.log("socket message: ", request.message);
}
if (request.method === "handshake") {
const d = { method: "subscribe", message: { token } };
ws.send(JSON.stringify(d));
} else if (request.method === "ping") {
const d = { method: "ping", message: { keepAlive: true }, };
ws.send(JSON.stringify(d));
} else if (request.method === "subscribe") {
const { message: { status } } = request;
if (!status || status === 'Authentication failed') {
onFailure(status);
ws.close();
return;
}
onSuccess(`Status: Authenticated.`);
const d = { method: "ping", message: { keepAlive: true }, };
ws.send(JSON.stringify(d));
} else if (request.method === "create") {
const { message: { id, stemName, status } } = request;
if (!status || status === 'Failed') {
onFailure(status);
return;
}
} else if (request.method === "status") {
onStatus(request.message);
}
};
},
register: function (data, callback) {
const host = `${AudioShake.HOST}/client`;
var xhr = new XMLHttpRequest();
xhr.open("POST", host);
xhr.setRequestHeader("Accept", "application/json");
xhr.setRequestHeader("Content-Type", "application/json");
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
console.log(xhr.status);
console.log(xhr.responseText);
callback(xhr.responseText);
}
};
xhr.send(data);
},
upload: function ({ token, audioFile, stemNames, callback }) {
const host = `${AudioShake.HOST}/upload/file`;
let formData = new FormData();
formData.append("file", audioFile);
formData.append(stemNames, [stemNames]);
var xhr = new XMLHttpRequest();
xhr.open("POST", host);
xhr.setRequestHeader("authorization", `Bearer ${token}`);
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
console.log(xhr.status);
console.log(xhr.responseText);
callback({ status: xhr.status, media: xhr.responseText });
}
};
xhr.send(formData);
},
createJob: function ({assetId, stemName, format}) {
const d = { method: "create", message: { assetId, stemName, format }, };
AudioShake.websocket.send(JSON.stringify(d));
},
disconnect: function () {
if (AudioShake.websocket) {
AudioShake.websocket.close()
}
}
};
export default AudioShake;