annotate web/rdfdbclient.ts @ 2447:361c612e3c60

checkpoint show data
author drewp@bigasterisk.com
date Mon, 03 Jun 2024 12:11:54 -0700
parents ac55319a2eac
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2071
56a9eaf5e882 rough ports from coffee to ts. untested
drewp@bigasterisk.com
parents: 1905
diff changeset
1 import debug from "debug";
2258
d3ecee9bfab5 refactor Patch into a class
drewp@bigasterisk.com
parents: 2256
diff changeset
2 import { parseJsonPatch, Patch } from "./patch";
2256
eb34653d315d move to RdfDbChannel.ts
drewp@bigasterisk.com
parents: 2255
diff changeset
3 import { RdfDbChannel } from "./RdfDbChannel";
2289
f2c6b39c155c fix messagesSend counter
drewp@bigasterisk.com
parents: 2284
diff changeset
4 const log = debug("rdfdbclient");
2071
56a9eaf5e882 rough ports from coffee to ts. untested
drewp@bigasterisk.com
parents: 1905
diff changeset
5
2255
7c94348d6127 big refactor of RdfDbClient, separating the websocket layer
drewp@bigasterisk.com
parents: 2074
diff changeset
6 export class RdfDbClient {
7c94348d6127 big refactor of RdfDbClient, separating the websocket layer
drewp@bigasterisk.com
parents: 2074
diff changeset
7 private channel: RdfDbChannel;
2421
ac55319a2eac don't drop patches that arrive before we get WS connected
drewp@bigasterisk.com
parents: 2376
diff changeset
8 private patchesToSend: Patch[];
2255
7c94348d6127 big refactor of RdfDbClient, separating the websocket layer
drewp@bigasterisk.com
parents: 2074
diff changeset
9 // Send and receive patches from rdfdb. Primarily used in SyncedGraph.
7c94348d6127 big refactor of RdfDbClient, separating the websocket layer
drewp@bigasterisk.com
parents: 2074
diff changeset
10 //
7c94348d6127 big refactor of RdfDbClient, separating the websocket layer
drewp@bigasterisk.com
parents: 2074
diff changeset
11 // What this should do, and does not yet, is keep the graph
7c94348d6127 big refactor of RdfDbClient, separating the websocket layer
drewp@bigasterisk.com
parents: 2074
diff changeset
12 // 'coasting' over a reconnect, applying only the diffs from the old
7c94348d6127 big refactor of RdfDbClient, separating the websocket layer
drewp@bigasterisk.com
parents: 2074
diff changeset
13 // contents to the new ones once they're in. Then, remove all the
7c94348d6127 big refactor of RdfDbClient, separating the websocket layer
drewp@bigasterisk.com
parents: 2074
diff changeset
14 // clearGraph stuff in graph.coffee that doesn't even work right.
7c94348d6127 big refactor of RdfDbClient, separating the websocket layer
drewp@bigasterisk.com
parents: 2074
diff changeset
15 //
7c94348d6127 big refactor of RdfDbClient, separating the websocket layer
drewp@bigasterisk.com
parents: 2074
diff changeset
16 constructor(
7c94348d6127 big refactor of RdfDbClient, separating the websocket layer
drewp@bigasterisk.com
parents: 2074
diff changeset
17 patchSenderUrl: string,
7c94348d6127 big refactor of RdfDbClient, separating the websocket layer
drewp@bigasterisk.com
parents: 2074
diff changeset
18 private clearGraphOnNewConnection: () => void,
7c94348d6127 big refactor of RdfDbClient, separating the websocket layer
drewp@bigasterisk.com
parents: 2074
diff changeset
19 private applyPatch: (p: Patch) => void,
7c94348d6127 big refactor of RdfDbClient, separating the websocket layer
drewp@bigasterisk.com
parents: 2074
diff changeset
20 setStatus: (status: string) => void
7c94348d6127 big refactor of RdfDbClient, separating the websocket layer
drewp@bigasterisk.com
parents: 2074
diff changeset
21 ) {
2421
ac55319a2eac don't drop patches that arrive before we get WS connected
drewp@bigasterisk.com
parents: 2376
diff changeset
22 this.patchesToSend = [];
2255
7c94348d6127 big refactor of RdfDbClient, separating the websocket layer
drewp@bigasterisk.com
parents: 2074
diff changeset
23 this.channel = new RdfDbChannel(patchSenderUrl);
7c94348d6127 big refactor of RdfDbClient, separating the websocket layer
drewp@bigasterisk.com
parents: 2074
diff changeset
24 this.channel.statusDisplay.subscribe((st: string) => {
2421
ac55319a2eac don't drop patches that arrive before we get WS connected
drewp@bigasterisk.com
parents: 2376
diff changeset
25 setStatus(st + `; ${this.patchesToSend.length} pending `);
2255
7c94348d6127 big refactor of RdfDbClient, separating the websocket layer
drewp@bigasterisk.com
parents: 2074
diff changeset
26 });
7c94348d6127 big refactor of RdfDbClient, separating the websocket layer
drewp@bigasterisk.com
parents: 2074
diff changeset
27 this.channel.newConnection.subscribe(() => {
7c94348d6127 big refactor of RdfDbClient, separating the websocket layer
drewp@bigasterisk.com
parents: 2074
diff changeset
28 this.clearGraphOnNewConnection();
7c94348d6127 big refactor of RdfDbClient, separating the websocket layer
drewp@bigasterisk.com
parents: 2074
diff changeset
29 });
7c94348d6127 big refactor of RdfDbClient, separating the websocket layer
drewp@bigasterisk.com
parents: 2074
diff changeset
30 this.channel.serverMessage.subscribe((m) => {
2284
dcfa69d53fd2 don't apply empty patch
drewp@bigasterisk.com
parents: 2258
diff changeset
31 parseJsonPatch(m.body, (p: Patch) => {
dcfa69d53fd2 don't apply empty patch
drewp@bigasterisk.com
parents: 2258
diff changeset
32 log('patch from server:', p.dump())
dcfa69d53fd2 don't apply empty patch
drewp@bigasterisk.com
parents: 2258
diff changeset
33 if (p.isEmpty()) {
dcfa69d53fd2 don't apply empty patch
drewp@bigasterisk.com
parents: 2258
diff changeset
34 return;
dcfa69d53fd2 don't apply empty patch
drewp@bigasterisk.com
parents: 2258
diff changeset
35 }
dcfa69d53fd2 don't apply empty patch
drewp@bigasterisk.com
parents: 2258
diff changeset
36 this.applyPatch(p);
dcfa69d53fd2 don't apply empty patch
drewp@bigasterisk.com
parents: 2258
diff changeset
37 });
2255
7c94348d6127 big refactor of RdfDbClient, separating the websocket layer
drewp@bigasterisk.com
parents: 2074
diff changeset
38 });
7c94348d6127 big refactor of RdfDbClient, separating the websocket layer
drewp@bigasterisk.com
parents: 2074
diff changeset
39 }
7c94348d6127 big refactor of RdfDbClient, separating the websocket layer
drewp@bigasterisk.com
parents: 2074
diff changeset
40
7c94348d6127 big refactor of RdfDbClient, separating the websocket layer
drewp@bigasterisk.com
parents: 2074
diff changeset
41 sendPatch(patch: Patch) {
2258
d3ecee9bfab5 refactor Patch into a class
drewp@bigasterisk.com
parents: 2256
diff changeset
42 log("queue patch to server ", patch.summary());
2421
ac55319a2eac don't drop patches that arrive before we get WS connected
drewp@bigasterisk.com
parents: 2376
diff changeset
43 this.patchesToSend.push(patch);
2255
7c94348d6127 big refactor of RdfDbClient, separating the websocket layer
drewp@bigasterisk.com
parents: 2074
diff changeset
44 this._continueSending();
7c94348d6127 big refactor of RdfDbClient, separating the websocket layer
drewp@bigasterisk.com
parents: 2074
diff changeset
45 }
7c94348d6127 big refactor of RdfDbClient, separating the websocket layer
drewp@bigasterisk.com
parents: 2074
diff changeset
46
2322
cdfd2901918a logging
drewp@bigasterisk.com
parents: 2289
diff changeset
47 disconnect(why:string) {
cdfd2901918a logging
drewp@bigasterisk.com
parents: 2289
diff changeset
48 this.channel.disconnect(why);
2255
7c94348d6127 big refactor of RdfDbClient, separating the websocket layer
drewp@bigasterisk.com
parents: 2074
diff changeset
49 }
7c94348d6127 big refactor of RdfDbClient, separating the websocket layer
drewp@bigasterisk.com
parents: 2074
diff changeset
50
7c94348d6127 big refactor of RdfDbClient, separating the websocket layer
drewp@bigasterisk.com
parents: 2074
diff changeset
51 async _continueSending() {
2071
56a9eaf5e882 rough ports from coffee to ts. untested
drewp@bigasterisk.com
parents: 1905
diff changeset
52 // we could call this less often and coalesce patches together to optimize
2289
f2c6b39c155c fix messagesSend counter
drewp@bigasterisk.com
parents: 2284
diff changeset
53 // the dragging cases. See rdfdb 'compactPatches' and 'processInbox'.
2421
ac55319a2eac don't drop patches that arrive before we get WS connected
drewp@bigasterisk.com
parents: 2376
diff changeset
54 while (this.patchesToSend.length) {
ac55319a2eac don't drop patches that arrive before we get WS connected
drewp@bigasterisk.com
parents: 2376
diff changeset
55 const patch = this.patchesToSend.splice(0, 1)[0];
2258
d3ecee9bfab5 refactor Patch into a class
drewp@bigasterisk.com
parents: 2256
diff changeset
56 const json = await patch.toJsonPatch();
2255
7c94348d6127 big refactor of RdfDbClient, separating the websocket layer
drewp@bigasterisk.com
parents: 2074
diff changeset
57 const ret = this.channel.sendMessage(json);
7c94348d6127 big refactor of RdfDbClient, separating the websocket layer
drewp@bigasterisk.com
parents: 2074
diff changeset
58 if (!ret) {
2421
ac55319a2eac don't drop patches that arrive before we get WS connected
drewp@bigasterisk.com
parents: 2376
diff changeset
59 log('sendMessage failed- retrying')
ac55319a2eac don't drop patches that arrive before we get WS connected
drewp@bigasterisk.com
parents: 2376
diff changeset
60 this.patchesToSend.unshift(patch);
2255
7c94348d6127 big refactor of RdfDbClient, separating the websocket layer
drewp@bigasterisk.com
parents: 2074
diff changeset
61 setTimeout(this._continueSending.bind(this), 500);
1361
c20dc52e5593 move to rdfdbclient.coffee
Drew Perttula <drewp@bigasterisk.com>
parents:
diff changeset
62
2255
7c94348d6127 big refactor of RdfDbClient, separating the websocket layer
drewp@bigasterisk.com
parents: 2074
diff changeset
63 // this.disconnect()
7c94348d6127 big refactor of RdfDbClient, separating the websocket layer
drewp@bigasterisk.com
parents: 2074
diff changeset
64 return;
7c94348d6127 big refactor of RdfDbClient, separating the websocket layer
drewp@bigasterisk.com
parents: 2074
diff changeset
65 }
7c94348d6127 big refactor of RdfDbClient, separating the websocket layer
drewp@bigasterisk.com
parents: 2074
diff changeset
66 }
2071
56a9eaf5e882 rough ports from coffee to ts. untested
drewp@bigasterisk.com
parents: 1905
diff changeset
67 }
56a9eaf5e882 rough ports from coffee to ts. untested
drewp@bigasterisk.com
parents: 1905
diff changeset
68 }