urbit/pkg/interface/webterm/subscription.tsx

88 lines
1.8 KiB
TypeScript
Raw Normal View History

export default class Subscription {
store: any;
api: any;
channel: any;
firstRoundComplete: boolean;
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() {
if (this.api.ship) {
this.firstRound();
2020-05-01 05:54:12 +03:00
} else {
console.error('~~~ ERROR: Must set api.ship before operation ~~~');
2020-05-01 05:54:12 +03:00
}
this.setupSlog();
}
setupSlog() {
let available = false;
const slog = new EventSource('/~_~/slog', { withCredentials: true });
slog.onopen = (e) => {
console.log('slog: opened stream');
available = true;
};
slog.onmessage = (e) => {
this.handleEvent({ slog: e.data });
};
slog.onerror = (e) => {
console.error('slog: eventsource error:', e);
if (available) {
window.setTimeout(() => {
if (slog.readyState !== EventSource.CLOSED)
return;
console.log('slog: reconnecting...');
this.setupSlog();
}, 10000);
}
};
2020-05-01 05:54:12 +03:00
}
delete() {
this.channel.delete();
2020-05-01 05:54:12 +03:00
}
onChannelError(err) {
console.error('event source error: ', err);
console.log('initiating new channel');
this.firstRoundComplete = false;
setTimeout(() => {
this.store.handleEvent({
data: { clear : true }
});
this.start();
}, 2000);
2020-05-01 05:54:12 +03:00
}
subscribe(path, app) {
this.api.bind(path, 'PUT', this.api.ship, app,
2020-05-01 05:54:12 +03:00
this.handleEvent.bind(this),
(err) => {
console.log(err);
this.subscribe(path, app);
},
() => {
this.subscribe(path, app);
});
}
firstRound() {
this.subscribe('/session/', 'herm');
}
handleEvent(diff) {
this.store.handleEvent(diff);
2020-05-01 05:54:12 +03:00
}
}