version_parser.ts 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import {Buffer} from "buffer"; // NodeJS library
  2. import {Delta} from "./delta";
  3. import {VersionRegistry} from "./version";
  4. import {DeltaParser} from "./delta_parser";
  5. export class VersionParser {
  6. readonly deltaParser: DeltaParser;
  7. readonly versionRegistry: VersionRegistry;
  8. constructor(deltaParser: DeltaParser, versionRegistry: VersionRegistry) {
  9. this.deltaParser = deltaParser;
  10. this.versionRegistry = versionRegistry;
  11. }
  12. load({externalDependencies, deltas, versions}, onLoadDelta: (Delta) => void, onLoadVersion: (Version) => void) {
  13. for (const e of externalDependencies) {
  14. if (this.versionRegistry.lookupOptional(Buffer.from(e, 'hex')) === undefined) {
  15. throw new Error("Cannot load versions: missing dependency: " + e);
  16. }
  17. }
  18. for (const d of deltas) {
  19. const loadedDelta = this.deltaParser.loadDelta(d);
  20. onLoadDelta(loadedDelta);
  21. }
  22. for (const {id, delta, parent, embeddings} of versions) {
  23. const parentVersion = this.versionRegistry.lookup(Buffer.from(parent, 'hex'));
  24. const parentDelta = this.deltaParser.deltaRegistry.deltas.get(delta)!;
  25. const theEmbeddings = new Map();
  26. const selfEmbeddingKeys = new Set<string>();
  27. for (const {guestId, v, ovr} of embeddings) {
  28. console.log({guestId, v, id})
  29. if (v === id) {
  30. selfEmbeddingKeys.add(guestId);
  31. }
  32. else {
  33. const guestVersion = this.versionRegistry.lookupOptional(Buffer.from(v, 'hex'));
  34. for (const [key,val] of Object.entries(ovr)) {
  35. const guestDelta = this.deltaParser.deltaRegistry.deltas.get(key as string);
  36. const hostDelta = this.deltaParser.deltaRegistry.deltas.get(val as string);
  37. theEmbeddings.set(guestDelta, hostDelta);
  38. }
  39. }
  40. }
  41. const loadedVersion = this.versionRegistry.createVersion(parentVersion, parentDelta, newVersion => {
  42. for (const guestId of selfEmbeddingKeys) {
  43. theEmbeddings.set(guestId, {version: newVersion, overridings: new Map()});
  44. }
  45. return theEmbeddings;
  46. });
  47. onLoadVersion(loadedVersion);
  48. }
  49. }
  50. }