@graffy/client
Version:
Graffy client library for the browser.
100 lines (89 loc) • 3.19 kB
JavaScript
;
exports.__esModule = true;
exports.default = void 0;
var _common = require("@graffy/common");
var _stream = require("@graffy/stream");
function getOptionsParam(options) {
if (!options) return '';
return encodeURIComponent((0, _common.serialize)(options));
}
var _default = function _default(baseUrl, _temp) {
var _ref = _temp === void 0 ? {} : _temp,
_ref$getOptions = _ref.getOptions,
getOptions = _ref$getOptions === void 0 ? function () {} : _ref$getOptions,
watch = _ref.watch,
_ref$connInfoPath = _ref.connInfoPath,
connInfoPath = _ref$connInfoPath === void 0 ? '/connection' : _ref$connInfoPath;
return function (store) {
connInfoPath = (0, _common.makePath)(connInfoPath);
store.onWrite(connInfoPath, function (_ref2) {
var url = _ref2.url;
baseUrl = url;
return {
url: url
};
});
store.onRead(connInfoPath, function () {
return {
url: baseUrl
};
});
store.on('read', function (query, options) {
if (!fetch) throw Error('client.fetch.unavailable');
var optionsParam = getOptionsParam(getOptions('read', options));
var url = baseUrl + "?q=" + (0, _common.encodeUrl)(query) + "&opts=" + optionsParam;
return fetch(url).then(function (res) {
if (res.status === 200) return res.json();
return res.text().then(function (message) {
throw Error('server.' + message);
});
});
});
store.on('watch', function (query, options) {
if (watch === 'none') throw Error('client.no_watch');
if (watch === 'hang') {
return (0, _stream.makeStream)(function (push) {
push(undefined);
});
}
if (!EventSource) throw Error('client.sse.unavailable');
var optionsParam = getOptionsParam(getOptions('watch', options));
var url = baseUrl + "?q=" + (0, _common.encodeUrl)(query) + "&opts=" + optionsParam;
var source = new EventSource(url);
return (0, _stream.makeStream)(function (push, end) {
source.onmessage = function (_ref3) {
var data = _ref3.data;
push((0, _common.deserialize)(data));
};
source.onerror = function (e) {
end(Error('client.sse.transport: ' + e.message));
};
source.addEventListener('graffyerror', function (e) {
end(Error('server.' + e.data));
});
return function () {
source.close();
};
});
});
store.on('write', function (change, options) {
if (!fetch) throw Error('client.fetch.unavailable');
var optionsParam = getOptionsParam(getOptions('write', options));
var url = baseUrl + "?opts=" + optionsParam;
return fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: (0, _common.serialize)(change)
}).then(function (res) {
if (res.status === 200) return res.json();
return res.text().then(function (message) {
throw Error('server.' + message);
});
});
});
};
};
exports.default = _default;
module.exports = exports.default;