2020-05-09 06:51:18 +03:00
|
|
|
export default class Subscription {
|
|
|
|
constructor(store, api, channel) {
|
|
|
|
this.store = store;
|
|
|
|
this.api = api;
|
|
|
|
this.channel = channel;
|
|
|
|
|
|
|
|
this.channel.setOnChannelError(this.onChannelError.bind(this));
|
|
|
|
this.firstRoundComplete = false;
|
|
|
|
}
|
|
|
|
|
2020-05-01 05:54:12 +03:00
|
|
|
start() {
|
2020-05-12 00:58:13 +03:00
|
|
|
if (this.api.ship) {
|
2020-05-09 06:51:18 +03:00
|
|
|
this.firstRound();
|
2020-05-01 05:54:12 +03:00
|
|
|
} else {
|
2020-05-09 06:51:18 +03:00
|
|
|
console.error('~~~ ERROR: Must set api.ship before operation ~~~');
|
2020-05-01 05:54:12 +03:00
|
|
|
}
|
2020-09-25 02:24:02 +03:00
|
|
|
this.setupSlog();
|
|
|
|
}
|
|
|
|
|
|
|
|
setupSlog() {
|
|
|
|
const slog = new EventSource('/~/slog', { withCredentials: true });
|
|
|
|
|
|
|
|
slog.onopen = e => {
|
|
|
|
console.log('slog: opened stream');
|
|
|
|
}
|
|
|
|
|
|
|
|
slog.onmessage = e => {
|
|
|
|
this.handleEvent({ txt: e.data });
|
|
|
|
}
|
|
|
|
|
|
|
|
slog.onerror = e => {
|
|
|
|
console.error('slog: eventsource error:', e);
|
2020-09-25 16:13:45 +03:00
|
|
|
window.setTimeout(() => {
|
|
|
|
if (slog.readyState !== EventSource.CLOSED) return;
|
|
|
|
console.log('slog: reconnecting...');
|
|
|
|
this.setupSlog();
|
|
|
|
}, 10000);
|
2020-09-25 02:24:02 +03:00
|
|
|
}
|
2020-05-01 05:54:12 +03:00
|
|
|
}
|
|
|
|
|
2020-05-09 06:51:18 +03:00
|
|
|
delete() {
|
|
|
|
this.channel.delete();
|
2020-05-01 05:54:12 +03:00
|
|
|
}
|
|
|
|
|
2020-05-09 06:51:18 +03:00
|
|
|
onChannelError(err) {
|
|
|
|
console.error('event source error: ', err);
|
|
|
|
console.log('initiating new channel');
|
|
|
|
this.firstRoundComplete = false;
|
|
|
|
setTimeout(2000, () => {
|
2020-05-12 00:58:13 +03:00
|
|
|
this.store.handleEvent({
|
2020-05-09 06:51:18 +03:00
|
|
|
data: { clear : true }
|
|
|
|
});
|
|
|
|
|
|
|
|
this.start();
|
|
|
|
});
|
2020-05-01 05:54:12 +03:00
|
|
|
}
|
|
|
|
|
2020-05-09 06:51:18 +03:00
|
|
|
subscribe(path, app) {
|
2020-05-12 00:58:13 +03:00
|
|
|
this.api.bind(path, 'PUT', this.api.ship, app,
|
2020-05-01 05:54:12 +03:00
|
|
|
this.handleEvent.bind(this),
|
2020-05-09 06:51:18 +03:00
|
|
|
(err) => {
|
|
|
|
console.log(err);
|
|
|
|
this.subscribe(path, app);
|
|
|
|
},
|
|
|
|
() => {
|
|
|
|
this.subscribe(path, app);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
firstRound() {
|
2020-05-12 00:58:13 +03:00
|
|
|
this.subscribe('/sole/' + this.api.dojoId, 'dojo');
|
2020-05-09 06:51:18 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
handleEvent(diff) {
|
2020-05-12 00:58:13 +03:00
|
|
|
this.store.handleEvent(diff);
|
2020-05-01 05:54:12 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|