@neat.is/core 0.4.14 → 0.4.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -360,6 +360,7 @@ interface ProjectSlot {
360
360
  outPath: string;
361
361
  paths: ProjectPaths;
362
362
  stopPersist: () => void;
363
+ detachEvents: () => void;
363
364
  status: 'active' | 'broken';
364
365
  errorReason?: string;
365
366
  }
package/dist/index.d.ts CHANGED
@@ -360,6 +360,7 @@ interface ProjectSlot {
360
360
  outPath: string;
361
361
  paths: ProjectPaths;
362
362
  stopPersist: () => void;
363
+ detachEvents: () => void;
363
364
  status: 'active' | 'broken';
364
365
  errorReason?: string;
365
366
  }
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  routeSpanToProject,
3
3
  startDaemon
4
- } from "./chunk-QZRDQ7WX.js";
4
+ } from "./chunk-VMLWUK7W.js";
5
5
  import {
6
6
  ProjectNameCollisionError,
7
7
  addProject,
package/dist/neatd.cjs CHANGED
@@ -968,6 +968,56 @@ eventBus.setMaxListeners(0);
968
968
  function emitNeatEvent(envelope) {
969
969
  eventBus.emit(EVENT_BUS_CHANNEL, envelope);
970
970
  }
971
+ function attachGraphToEventBus(graph, opts) {
972
+ const { project } = opts;
973
+ const onNodeAdded = (payload) => {
974
+ emitNeatEvent({
975
+ type: "node-added",
976
+ project,
977
+ payload: { node: payload.attributes }
978
+ });
979
+ };
980
+ const onNodeDropped = (payload) => {
981
+ emitNeatEvent({
982
+ type: "node-removed",
983
+ project,
984
+ payload: { id: payload.key }
985
+ });
986
+ };
987
+ const onEdgeAdded = (payload) => {
988
+ emitNeatEvent({
989
+ type: "edge-added",
990
+ project,
991
+ payload: { edge: payload.attributes }
992
+ });
993
+ };
994
+ const onEdgeDropped = (payload) => {
995
+ emitNeatEvent({
996
+ type: "edge-removed",
997
+ project,
998
+ payload: { id: payload.key }
999
+ });
1000
+ };
1001
+ const onNodeAttrsUpdated = (payload) => {
1002
+ emitNeatEvent({
1003
+ type: "node-updated",
1004
+ project,
1005
+ payload: { id: payload.key, changes: payload.attributes }
1006
+ });
1007
+ };
1008
+ graph.on("nodeAdded", onNodeAdded);
1009
+ graph.on("nodeDropped", onNodeDropped);
1010
+ graph.on("edgeAdded", onEdgeAdded);
1011
+ graph.on("edgeDropped", onEdgeDropped);
1012
+ graph.on("nodeAttributesUpdated", onNodeAttrsUpdated);
1013
+ return () => {
1014
+ graph.off("nodeAdded", onNodeAdded);
1015
+ graph.off("nodeDropped", onNodeDropped);
1016
+ graph.off("edgeAdded", onEdgeAdded);
1017
+ graph.off("edgeDropped", onEdgeDropped);
1018
+ graph.off("nodeAttributesUpdated", onNodeAttrsUpdated);
1019
+ };
1020
+ }
971
1021
 
972
1022
  // src/traverse.ts
973
1023
  init_cjs_shims();
@@ -6578,6 +6628,16 @@ function unroutedErrorsPath(neatHome3) {
6578
6628
  }
6579
6629
 
6580
6630
  // src/daemon.ts
6631
+ function teardownSlot(slot) {
6632
+ try {
6633
+ slot.stopPersist();
6634
+ } catch {
6635
+ }
6636
+ try {
6637
+ slot.detachEvents();
6638
+ } catch {
6639
+ }
6640
+ }
6581
6641
  function neatHomeFor(opts) {
6582
6642
  if (opts.neatHome && opts.neatHome.length > 0) return import_node_path41.default.resolve(opts.neatHome);
6583
6643
  const env = process.env.NEAT_HOME;
@@ -6636,6 +6696,8 @@ async function bootstrapProject(entry2) {
6636
6696
  paths,
6637
6697
  stopPersist: () => {
6638
6698
  },
6699
+ detachEvents: () => {
6700
+ },
6639
6701
  status: "broken",
6640
6702
  errorReason: err.message
6641
6703
  };
@@ -6644,18 +6706,25 @@ async function bootstrapProject(entry2) {
6644
6706
  const graph = getGraph(entry2.name);
6645
6707
  const outPath = paths.snapshotPath;
6646
6708
  await loadGraphFromDisk(graph, outPath);
6647
- await extractFromDirectory(graph, entry2.path);
6648
- const stopPersist = startPersistLoop(graph, outPath);
6649
- await touchLastSeen(entry2.name).catch(() => {
6650
- });
6651
- return {
6652
- entry: entry2,
6653
- graph,
6654
- outPath,
6655
- paths,
6656
- stopPersist,
6657
- status: "active"
6658
- };
6709
+ const detachEvents = attachGraphToEventBus(graph, { project: entry2.name });
6710
+ try {
6711
+ await extractFromDirectory(graph, entry2.path);
6712
+ const stopPersist = startPersistLoop(graph, outPath);
6713
+ await touchLastSeen(entry2.name).catch(() => {
6714
+ });
6715
+ return {
6716
+ entry: entry2,
6717
+ graph,
6718
+ outPath,
6719
+ paths,
6720
+ stopPersist,
6721
+ detachEvents,
6722
+ status: "active"
6723
+ };
6724
+ } catch (err) {
6725
+ detachEvents();
6726
+ throw err;
6727
+ }
6659
6728
  }
6660
6729
  function resolveRestPort(opts) {
6661
6730
  if (typeof opts.restPort === "number") return opts.restPort;
@@ -6737,6 +6806,8 @@ async function startDaemon(opts = {}) {
6737
6806
  async function tryRecoverSlot(entry2) {
6738
6807
  try {
6739
6808
  const fresh = await bootstrapProject(entry2);
6809
+ const prior = slots.get(entry2.name);
6810
+ if (prior) teardownSlot(prior);
6740
6811
  slots.set(entry2.name, fresh);
6741
6812
  upsertRegistryFromSlot(fresh);
6742
6813
  if (fresh.status === "active") {
@@ -6759,6 +6830,8 @@ async function startDaemon(opts = {}) {
6759
6830
  bootstrapStartedAt.set(entry2.name, Date.now());
6760
6831
  try {
6761
6832
  const slot = await bootstrapProject(entry2);
6833
+ const prior = slots.get(entry2.name);
6834
+ if (prior) teardownSlot(prior);
6762
6835
  slots.set(entry2.name, slot);
6763
6836
  upsertRegistryFromSlot(slot);
6764
6837
  bootstrapStatus.set(entry2.name, slot.status === "broken" ? "broken" : "active");
@@ -6794,10 +6867,7 @@ async function startDaemon(opts = {}) {
6794
6867
  }
6795
6868
  for (const [name, slot] of [...slots.entries()]) {
6796
6869
  if (seen.has(name)) continue;
6797
- try {
6798
- slot.stopPersist();
6799
- } catch {
6800
- }
6870
+ teardownSlot(slot);
6801
6871
  slots.delete(name);
6802
6872
  bootstrapStatus.delete(name);
6803
6873
  bootstrapStartedAt.delete(name);
@@ -6843,10 +6913,7 @@ async function startDaemon(opts = {}) {
6843
6913
  console.log(`neatd: REST listening on ${restAddress}`);
6844
6914
  } catch (err) {
6845
6915
  for (const slot of slots.values()) {
6846
- try {
6847
- slot.stopPersist();
6848
- } catch {
6849
- }
6916
+ teardownSlot(slot);
6850
6917
  }
6851
6918
  if (restApp) await restApp.close().catch(() => {
6852
6919
  });
@@ -6947,10 +7014,7 @@ async function startDaemon(opts = {}) {
6947
7014
  console.log(`neatd: OTLP listening on ${otlpAddress}/v1/traces`);
6948
7015
  } catch (err) {
6949
7016
  for (const slot of slots.values()) {
6950
- try {
6951
- slot.stopPersist();
6952
- } catch {
6953
- }
7017
+ teardownSlot(slot);
6954
7018
  }
6955
7019
  if (restApp) await restApp.close().catch(() => {
6956
7020
  });
@@ -7042,10 +7106,7 @@ async function startDaemon(opts = {}) {
7042
7106
  if (restApp) await restApp.close().catch(() => {
7043
7107
  });
7044
7108
  for (const slot of slots.values()) {
7045
- try {
7046
- slot.stopPersist();
7047
- } catch {
7048
- }
7109
+ teardownSlot(slot);
7049
7110
  }
7050
7111
  await import_node_fs25.promises.unlink(pidPath).catch(() => {
7051
7112
  });