annotate src/SourceGraph.ts @ 130:73a70d00fb74

dep upgrades; working on build+release setup
author drewp@bigasterisk.com
date Sat, 06 May 2023 13:11:19 -0700
parents 5a1a79f54779
children a8939c717015
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) => {
130
73a70d00fb74 dep upgrades; working on build+release setup
drewp@bigasterisk.com
parents: 128
diff changeset
43 const patchMsg = JSON.parse((ev as any).data);
128
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
44
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
45 const p = new Patch();
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
46
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
47 const parser = new JsonLdParser();
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
48 parser.write(JSON.stringify(patchMsg.patch.adds));
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
49 parser.end();
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
50
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
51 await p.streamImport(parser);
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
52 this.isCurrent = true;
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
53
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
54 p.applyToStore(this.store);
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
55 console.log("patchlife0: eventsream store changed");
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
56 this.sourceGraphChanged.emit(p);
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
57 if (firstPatch) {
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
58 firstPatch = false;
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
59 res();
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
60 }
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
61 });
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
62 });
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 private async reloadSimpleFile(resp: Response) {
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
66 const bodyText = await resp.text();
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
67 const parser = new Parser({ format: "application/trig" });
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
68 await new Promise<void>((res, rej) => {
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
69 parser.parse(bodyText, (error, quad, prefixes) => {
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
70 if (error) {
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
71 console.log("parse ~ error:", error);
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
72 rej(error);
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
73 return;
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
74 }
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
75 if (quad) {
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
76 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
77 } else {
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
78 res();
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
79 }
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
80 });
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
81 });
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
82 this.isCurrent = true;
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
83 // 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
84 console.log("patchlife0: simple file store changed");
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
85 this.sourceGraphChanged.emit(new Patch());
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
86 }
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
87
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
88 quadCount(): number {
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
89 return this.store.countQuads(null, null, null, null);
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
90 }
5a1a79f54779 big rewrite
drewp@bigasterisk.com
parents:
diff changeset
91 }