c1-cms
Version:
Contains React components distributed with C1 CMS.
69 lines (63 loc) • 1.8 kB
JavaScript
import Wampy from 'wampy';
import { getBaseUrl } from './utils.js';
let currentClients = {};
function getClient(realm) {
if (currentClients[realm]) {
return Promise.resolve(currentClients[realm]);
} else {
return new Promise((resolve, reject) => {
let url = new URL(getBaseUrl() + '/Composite/api/Router', location.href);
url.protocol = url.protocol.replace('http', 'ws');
const client = new Wampy(url.href, {
realm,
onConnect: () => {
currentClients[realm] = client;
resolve(client);
},
onError: err => reject(err)
});
});
}
}
function close(realm) {
if (currentClients[realm]) {
currentClients[realm].disconnect();
delete currentClients[realm];
}
}
function closeAll() {
Object.keys(currentClients).forEach(realm => close(realm));
}
window.addEventListener('beforeunload', closeAll);
const WAMPClient = {
call: (uri, ...args) => {
return getClient('realm')
.then(client =>
new Promise((resolve, reject) =>
client.call(uri, args, { onSuccess: result => {
// Unpick the way Wampy passes data: (see https://github.com/KSDaemon/wampy.js/blob/dev/Migrating.md)
if (Array.isArray(result) && result.length === 1) {
// RPC returned non-array
resolve(result[0]);
} else {
// RPC returned array
resolve(result);
}
}, onError: reject })
)
);
},
subscribe: (uri, handler) => {
return getClient('realm')
.then(client =>
new Promise((resolve, reject) => {
client.subscribe(uri, {
onSuccess: (...args) => resolve(args),
onError: (message, details) => reject({message, details}),
onEvent: handler // Potentially needs argument unwrapping
});
})
);
}
};
export default WAMPClient;