apollo-client
Version:
A simple yet functional GraphQL client.
85 lines • 2.86 kB
JavaScript
;
var isString = require('lodash.isstring');
var assign = require('lodash.assign');
function createNetworkInterface(uri, opts) {
if (opts === void 0) { opts = {}; }
if (!uri) {
throw new Error('A remote enpdoint is required for a network layer');
}
if (!isString(uri)) {
throw new Error('Remote endpoint must be a string');
}
var _uri = uri;
var _opts = assign({}, opts);
var _middlewares = [];
function applyMiddlewares(_a) {
var _this = this;
var request = _a.request, options = _a.options;
return new Promise(function (resolve, reject) {
var queue = function (funcs, scope) {
var next = function () {
if (funcs.length > 0) {
var f = funcs.shift();
f.applyMiddleware.apply(scope, [{ request: request, options: options }, next]);
}
else {
resolve({
request: request,
options: options,
});
}
};
next();
};
queue(_middlewares.slice(), _this);
});
}
function fetchFromRemoteEndpoint(_a) {
var request = _a.request, options = _a.options;
return fetch(uri, assign({}, _opts, options, {
body: JSON.stringify(request),
headers: assign({}, options.headers, {
Accept: '*/*',
'Content-Type': 'application/json',
}),
method: 'POST',
}));
}
;
function query(request) {
var options = assign({}, _opts);
return applyMiddlewares({
request: request,
options: options,
}).then(fetchFromRemoteEndpoint)
.then(function (result) { return result.json(); })
.then(function (payload) {
if (!payload.hasOwnProperty('data') && !payload.hasOwnProperty('errors')) {
throw new Error("Server response was missing for query '" + request.debugName + "'.");
}
else {
return payload;
}
});
}
;
function use(middlewares) {
middlewares.map(function (middleware) {
if (typeof middleware.applyMiddleware === 'function') {
_middlewares.push(middleware);
}
else {
throw new Error('Middleware must implement the applyMiddleware function');
}
});
}
return {
_uri: _uri,
_opts: _opts,
_middlewares: _middlewares,
query: query,
use: use,
};
}
exports.createNetworkInterface = createNetworkInterface;
//# sourceMappingURL=networkInterface.js.map