annotate src/SourceGraph.ts @ 137:a8939c717015

still trying to get build right, but there are other update bugs too
author drewp@bigasterisk.com
date Sat, 06 May 2023 15:34:40 -0700
parents 73a70d00fb74
children cf642d395be4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
128
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
1 import { JsonLdParser } from "jsonld-streaming-parser";
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
2 import { Parser, Store } from "n3";
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
3 import { SubEvent } from "sub-events";
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
4 import { Patch } from "./Patch";
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
5
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
6 // Possibly-changing graph for one source. Maintains its own dataset.
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
7 // Read-only.
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
8 //
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
9 // Rename to RemoteGraph? RemoteStore? SyncedStore? PatchableGraph?
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
10 export class SourceGraph {
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
11 store: Store; // const; do not rebuild
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
12 isCurrent: boolean = false;
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
13 sourceGraphChanged: SubEvent<Patch> = new SubEvent();
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
14 constructor(public url: string /* immutable */) {
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
15 this.store = new Store();
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
16 }
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
17
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
18 dispose() {}
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
19
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
20 // Call this first, after you've subscribed to `sourceGraphChanged`. This call may
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
21 // synchronously fire change events.
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
22 //
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
23 async reloadRdf() {
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
24 const resp = await fetch(this.url);
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
25 const ctype = resp.headers.get("content-type");
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
26 if (ctype?.startsWith("text/event-stream")) {
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
27 await this.reloadEventStream();
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
28 } else {
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
29 await this.reloadSimpleFile(resp);
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
30 }
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
31 }
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
32
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
33 private async reloadEventStream(): Promise<void> {
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
34 return new Promise((res, rej) => {
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
35 // todo deal with reconnects
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
36 const ev = new EventSource(this.url);
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
37 let firstPatch = true;
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
38 // clear store here?
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
39
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
40 // maybe the event messages should be 'add' and 'del',
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
41 // for less parsing and clearer order of ops.
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
42 ev.addEventListener("patch", async (ev) => {
137
a8939c717015 still trying to get build right, but there are other update bugs too
drewp@bigasterisk.com
parents: 130
diff changeset
43 // this is reentrant- ok?
a8939c717015 still trying to get build right, but there are other update bugs too
drewp@bigasterisk.com
parents: 130
diff changeset
44
130
73a70d00fb74 dep upgrades; working on build+release setup
drewp@bigasterisk.com
parents: 128
diff changeset
45 const patchMsg = JSON.parse((ev as any).data);
128
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
46
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
47 const p = new Patch();
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
48
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
49 const parser = new JsonLdParser();
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
50 parser.write(JSON.stringify(patchMsg.patch.adds));
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
51 parser.end();
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
52
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
53 await p.streamImport(parser);
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
54 this.isCurrent = true;
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
55
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
56 p.applyToStore(this.store);
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
57 console.log("patchlife0: eventsream store changed");
137
a8939c717015 still trying to get build right, but there are other update bugs too
drewp@bigasterisk.com
parents: 130
diff changeset
58 // firing before there are listeners
128
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
59 this.sourceGraphChanged.emit(p);
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
60 if (firstPatch) {
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
61 firstPatch = false;
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
62 res();
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
63 }
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
64 });
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
65 });
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
66 }
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
67
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
68 private async reloadSimpleFile(resp: Response) {
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
69 const bodyText = await resp.text();
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
70 const parser = new Parser({ format: "application/trig" });
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
71 await new Promise<void>((res, rej) => {
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
72 parser.parse(bodyText, (error, quad, prefixes) => {
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
73 if (error) {
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
74 console.log("parse ~ error:", error);
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
75 rej(error);
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
76 return;
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
77 }
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
78 if (quad) {
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
79 this.store.addQuad(quad); // prob want to do this as one or a small number of patches
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
80 } else {
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
81 res();
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
82 }
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
83 });
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
84 });
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
85 this.isCurrent = true;
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
86 // this may have to fire per addQuad call for correctness, or else we batch the adds where no readers can see them in advance.
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
87 console.log("patchlife0: simple file store changed");
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
88 this.sourceGraphChanged.emit(new Patch());
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
89 }
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
90
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
91 quadCount(): number {
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
92 return this.store.countQuads(null, null, null, null);
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
93 }
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
94 }