UNPKG

@graffy/client

Version:

Graffy client library for the browser.

100 lines (89 loc) 3.19 kB
"use strict"; 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;