rdflib
Version:
an RDF library for node.js. Suitable for client and server side.
150 lines (148 loc) • 3.64 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.UpdatesVia = exports.UpdatesSocket = void 0;
var _rdflibDataFactory = _interopRequireDefault(require("./factories/rdflib-data-factory"));
/*
* Updates-Via
*/
class UpdatesSocket {
constructor(parent, via) {
this.parent = parent;
this.via = via;
this.connected = false;
this.pending = {};
this.subscribed = {};
this.socket = {};
try {
this.socket = new WebSocket(via);
this.socket.onopen = this.onOpen;
this.socket.onclose = this.onClose;
this.socket.onmessage = this.onMessage;
this.socket.onerror = this.onError;
} catch (error) {
this.onError(error);
}
}
_decode(q) {
var elt;
var i;
var k;
var r;
var ref;
var ref1;
var v;
r = {};
ref = function () {
var j, len, ref, results;
ref = q.split('&');
results = [];
for (j = 0, len = ref.length; j < len; j++) {
elt = ref[j];
results.push(elt.split('='));
}
return results;
}();
for (i in ref) {
elt = ref[i];
ref1 = [decodeURIComponent(elt[0]), decodeURIComponent(elt[1])];
k = ref1[0];
v = ref1[1];
if (r[k] == null) {
r[k] = [];
}
r[k].push(v);
}
return r;
}
_send(method, uri, data) {
var base, message;
message = [method, uri, data].join(' ');
return typeof (base = this.socket).send === 'function' ? base.send(message) : void 0;
}
_subscribe(uri) {
this._send('sub', uri, '');
this.subscribed[uri] = true;
return this.subscribed[uri];
}
onClose(e) {
var uri;
this.connected = false;
for (uri in this.subscribed) {
this.pending[uri] = true;
}
this.subscribed = {};
return this.subscribed;
}
onError(e) {
throw new Error('onError' + e);
}
onMessage(e) {
var base, message;
message = e.data.split(' ');
if (message[0] === 'ping') {
return typeof (base = this.socket).send === 'function' ? base.send('pong ' + message.slice(1).join(' ')) : void 0;
} else if (message[0] === 'pub') {
return this.parent.onUpdate(message[1], this._decode(message[2]));
}
}
onOpen(e) {
var results, uri;
this.connected = true;
results = [];
for (uri in this.pending) {
delete this.pending[uri];
results.push(this._subscribe(uri));
}
return results;
}
subscribe(uri) {
if (this.connected) {
return this._subscribe(uri);
} else {
this.pending[uri] = true;
return this.pending[uri];
}
}
}
exports.UpdatesSocket = UpdatesSocket;
class UpdatesVia {
constructor(fetcher) {
this.fetcher = fetcher;
this.graph = {};
this.via = {};
this.fetcher.addCallback('headers', this.onHeaders);
}
onHeaders(d) {
var etag, uri, via;
if (d.headers == null) {
return true;
}
if (typeof WebSocket === 'undefined' || WebSocket === null) {
return true;
}
etag = d.headers['etag'];
via = d.headers['updates-via'];
uri = d.uri;
if (etag && via) {
this.graph[uri] = {
etag: etag,
via: via
};
this.register(via, uri);
}
return true;
}
onUpdate(uri, d) {
return this.fetcher.refresh(_rdflibDataFactory.default.namedNode(uri));
}
register(via, uri) {
if (this.via[via] == null) {
this.via[via] = new UpdatesSocket(this, via);
}
return this.via[via].subscribe(uri);
}
}
exports.UpdatesVia = UpdatesVia;