@nice2dev/spatial-core 1.0.10

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.
Files changed (82) hide show
  1. package/README.md +160 -0
  2. package/dist/bim/index.d.ts +366 -0
  3. package/dist/bim/index.d.ts.map +1 -0
  4. package/dist/bim/index.js +60 -0
  5. package/dist/bim/index.js.map +1 -0
  6. package/dist/cad/index.d.ts +329 -0
  7. package/dist/cad/index.d.ts.map +1 -0
  8. package/dist/cad/index.js +124 -0
  9. package/dist/cad/index.js.map +1 -0
  10. package/dist/ecad/index.d.ts +316 -0
  11. package/dist/ecad/index.d.ts.map +1 -0
  12. package/dist/ecad/index.js +11 -0
  13. package/dist/ecad/index.js.map +1 -0
  14. package/dist/export/index.d.ts +93 -0
  15. package/dist/export/index.d.ts.map +1 -0
  16. package/dist/export/index.js +522 -0
  17. package/dist/export/index.js.map +1 -0
  18. package/dist/floor-plan/index.d.ts +248 -0
  19. package/dist/floor-plan/index.d.ts.map +1 -0
  20. package/dist/floor-plan/index.js +228 -0
  21. package/dist/floor-plan/index.js.map +1 -0
  22. package/dist/grid/index.d.ts +160 -0
  23. package/dist/grid/index.d.ts.map +1 -0
  24. package/dist/grid/index.js +319 -0
  25. package/dist/grid/index.js.map +1 -0
  26. package/dist/import/import.worker.d.ts +28 -0
  27. package/dist/import/import.worker.d.ts.map +1 -0
  28. package/dist/import/import.worker.js +52 -0
  29. package/dist/import/import.worker.js.map +1 -0
  30. package/dist/import/index.d.ts +111 -0
  31. package/dist/import/index.d.ts.map +1 -0
  32. package/dist/import/index.js +1092 -0
  33. package/dist/import/index.js.map +1 -0
  34. package/dist/import/workerImport.d.ts +56 -0
  35. package/dist/import/workerImport.d.ts.map +1 -0
  36. package/dist/import/workerImport.js +207 -0
  37. package/dist/import/workerImport.js.map +1 -0
  38. package/dist/index.d.ts +29 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +86 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/interior/index.d.ts +241 -0
  43. package/dist/interior/index.d.ts.map +1 -0
  44. package/dist/interior/index.js +101 -0
  45. package/dist/interior/index.js.map +1 -0
  46. package/dist/measurement/index.d.ts +186 -0
  47. package/dist/measurement/index.d.ts.map +1 -0
  48. package/dist/measurement/index.js +400 -0
  49. package/dist/measurement/index.js.map +1 -0
  50. package/dist/objects/index.d.ts +288 -0
  51. package/dist/objects/index.d.ts.map +1 -0
  52. package/dist/objects/index.js +463 -0
  53. package/dist/objects/index.js.map +1 -0
  54. package/dist/serialization/index.d.ts +421 -0
  55. package/dist/serialization/index.d.ts.map +1 -0
  56. package/dist/serialization/index.js +412 -0
  57. package/dist/serialization/index.js.map +1 -0
  58. package/dist/topology/index.d.ts +252 -0
  59. package/dist/topology/index.d.ts.map +1 -0
  60. package/dist/topology/index.js +525 -0
  61. package/dist/topology/index.js.map +1 -0
  62. package/dist/transitions/index.d.ts +141 -0
  63. package/dist/transitions/index.d.ts.map +1 -0
  64. package/dist/transitions/index.js +160 -0
  65. package/dist/transitions/index.js.map +1 -0
  66. package/dist/unified/index.d.ts +225 -0
  67. package/dist/unified/index.d.ts.map +1 -0
  68. package/dist/unified/index.js +474 -0
  69. package/dist/unified/index.js.map +1 -0
  70. package/dist/virtualization/QuadTree.d.ts +68 -0
  71. package/dist/virtualization/QuadTree.d.ts.map +1 -0
  72. package/dist/virtualization/QuadTree.js +228 -0
  73. package/dist/virtualization/QuadTree.js.map +1 -0
  74. package/dist/virtualization/ViewportCulling.d.ts +92 -0
  75. package/dist/virtualization/ViewportCulling.d.ts.map +1 -0
  76. package/dist/virtualization/ViewportCulling.js +123 -0
  77. package/dist/virtualization/ViewportCulling.js.map +1 -0
  78. package/dist/virtualization/index.d.ts +9 -0
  79. package/dist/virtualization/index.d.ts.map +1 -0
  80. package/dist/virtualization/index.js +9 -0
  81. package/dist/virtualization/index.js.map +1 -0
  82. package/package.json +64 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/topology/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAMpD,8BAA8B;AAC9B,MAAM,MAAM,gBAAgB,GACxB,eAAe,GACf,eAAe,GACf,gBAAgB,GAChB,eAAe,GACf,cAAc,GACd,aAAa,GACb,MAAM,GACN,YAAY,GACZ,aAAa,GACb,WAAW,GACX,WAAW,GACX,WAAW,GACX,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,MAAM,GACN,aAAa,GACb,aAAa,GACb,QAAQ,GACR,KAAK,GACL,MAAM,GACN,aAAa,GACb,QAAQ,CAAC;AAEb,yBAAyB;AACzB,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;AAExF,8CAA8C;AAC9C,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,wBAAwB;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wBAAwB;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,MAAM,EAAE,gBAAgB,CAAC;IACzB,sDAAsD;IACtD,SAAS,EAAE,OAAO,EAAE,CAAC;IACrB,yBAAyB;IACzB,MAAM,EAAE,gBAAgB,CAAC;IACzB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qBAAqB;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sBAAsB;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8BAA8B;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB;IAClB,SAAS,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC1C,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uBAAuB;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAMD,kDAAkD;AAClD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,uBAAuB;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,qBAAqB;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,8CAA8C;IAC9C,YAAY,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,mBAAmB,EAAE,MAAM,CAAC;IAC5B,8CAA8C;IAC9C,MAAM,EAAE,gBAAgB,CAAC;IACzB,gCAAgC;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,oCAAoC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,4DAA4D;AAC5D,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,kBAAkB;IAClB,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,aAAa,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IAC/F,yBAAyB;IACzB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,4BAA4B;IAC5B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD,uBAAuB;AACvB,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,4BAA4B;IAC5B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kBAAkB;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oBAAoB;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,mDAAmD;AACnD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,GAAG,KAAK,GAAG,YAAY,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC7F,6BAA6B;IAC7B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,gBAAgB;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,0BAA0B;IAC1B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,6BAA6B;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAMD,8BAA8B;AAC9B,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,8BAA8B;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,sBAAsB;IACtB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,mDAAmD;IACnD,eAAe,EAAE,OAAO,EAAE,CAAC;IAC3B,yCAAyC;IACzC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,sBAAsB;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6BAA6B;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,gCAAgC;AAChC,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,gBAAgB;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,uBAAuB;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,8BAA8B;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,0BAA0B;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAMD,uCAAuC;AACvC,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,mCAAmC;IACnC,WAAW,EAAE,kBAAkB,EAAE,CAAC;IAClC,oBAAoB;IACpB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,aAAa;IACb,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,qBAAqB;IACrB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,+BAA+B;IAC/B,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;IACrC,0CAA0C;IAC1C,YAAY,EAAE,iBAAiB,EAAE,CAAC;IAClC,8BAA8B;IAC9B,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AAMD;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,gBAAgB,EACxB,OAAO,GAAE,OAAO,CAAC,kBAAkB,CAAM,GACxC,kBAAkB,CAoBpB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAalE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAc5D;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CA4B1E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAsB3E;AAMD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,kBAAkB,EAAE,GAChC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,kBAAkB,CAAA;CAAE,CAAC,CAAC,CAsB1E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,kBAAkB,EAAE,EACjC,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,MAAM,GAAE,SAAS,GAAG,MAAM,GAAG,WAAuB,GACnD,WAAW,GAAG,IAAI,CAwGpB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,WAAW,EAAE,kBAAkB,EAAE,EACjC,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,QAAQ,GAAE,MAAU,GACnB,WAAW,EAAE,CAuDf;AAMD;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,OAAO,EACZ,SAAS,EAAE,WAAW,EAAE,EACxB,QAAQ,GAAE,MAAW,GACpB,OAAO,EAAE,CAqGX;AAoCD;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,mBAAmB,EAAE,OAAO,EAC5B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,EAChC,MAAM,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,EAClE,iBAAiB,GAAE,MAAY,GAC9B,gBAAgB,CAqClB;AAMD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,OAAO,EACjB,MAAM,EAAE,OAAO,EACf,SAAS,EAAE,OAAO,EAAE,EACpB,MAAM,GAAE,OAAc,GACrB,MAAM,CA0BR;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAclE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,kBAAkB,EAAE,GAChC;IACD,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB,CAgBA"}
@@ -0,0 +1,525 @@
1
+ /**
2
+ * Topology Layer — Network topology overlay for floor plans.
3
+ *
4
+ * Provides:
5
+ * - Device connections (cables, wireless links)
6
+ * - Network paths and routing
7
+ * - Cable routing with pathfinding
8
+ * - VLAN visualization
9
+ * - Signal strength / coverage areas
10
+ *
11
+ * @module @nice2dev/spatial-core/topology
12
+ */
13
+ /* ================================================================
14
+ TOPOLOGY UTILITIES
15
+ ================================================================ */
16
+ /**
17
+ * Create a new network connection.
18
+ */
19
+ export function createConnection(sourceId, targetId, medium, options = {}) {
20
+ return {
21
+ id: `conn-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,
22
+ sourceId,
23
+ targetId,
24
+ medium,
25
+ waypoints: options.waypoints ?? [],
26
+ status: options.status ?? 'unknown',
27
+ bandwidth: options.bandwidth,
28
+ latency: options.latency,
29
+ signalStrength: options.signalStrength,
30
+ vlanId: options.vlanId,
31
+ cableLabel: options.cableLabel,
32
+ cableLength: options.cableLength,
33
+ color: options.color ?? getDefaultConnectionColor(medium),
34
+ lineStyle: options.lineStyle ?? (isWireless(medium) ? 'dashed' : 'solid'),
35
+ lineWidth: options.lineWidth ?? 2,
36
+ metadata: options.metadata,
37
+ ...options,
38
+ };
39
+ }
40
+ /**
41
+ * Create empty topology layer.
42
+ */
43
+ export function createTopologyLayer(floorId) {
44
+ return {
45
+ id: `topology-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,
46
+ floorId,
47
+ deviceIds: [],
48
+ connections: [],
49
+ cableRoutes: [],
50
+ vlans: [],
51
+ zones: [],
52
+ wirelessCoverage: [],
53
+ measurements: [],
54
+ paths: [],
55
+ };
56
+ }
57
+ /**
58
+ * Check if medium is wireless.
59
+ */
60
+ export function isWireless(medium) {
61
+ return [
62
+ 'wifi-2.4ghz',
63
+ 'wifi-5ghz',
64
+ 'wifi-6ghz',
65
+ 'bluetooth',
66
+ 'zigbee',
67
+ 'z-wave',
68
+ 'thread',
69
+ 'matter',
70
+ 'lora',
71
+ 'cellular-4g',
72
+ 'cellular-5g',
73
+ ].includes(medium);
74
+ }
75
+ /**
76
+ * Get default color for connection medium.
77
+ */
78
+ export function getDefaultConnectionColor(medium) {
79
+ const colors = {
80
+ 'ethernet-cat5': '#3b82f6',
81
+ 'ethernet-cat6': '#2563eb',
82
+ 'ethernet-cat6a': '#1d4ed8',
83
+ 'ethernet-cat7': '#1e40af',
84
+ 'fiber-single': '#f59e0b',
85
+ 'fiber-multi': '#d97706',
86
+ coax: '#6b7280',
87
+ 'power-line': '#ef4444',
88
+ 'wifi-2.4ghz': '#22c55e',
89
+ 'wifi-5ghz': '#16a34a',
90
+ 'wifi-6ghz': '#15803d',
91
+ bluetooth: '#8b5cf6',
92
+ zigbee: '#a855f7',
93
+ 'z-wave': '#d946ef',
94
+ thread: '#ec4899',
95
+ matter: '#f43f5e',
96
+ lora: '#14b8a6',
97
+ 'cellular-4g': '#06b6d4',
98
+ 'cellular-5g': '#0891b2',
99
+ serial: '#78716c',
100
+ usb: '#a3a3a3',
101
+ hdmi: '#dc2626',
102
+ displayport: '#7c3aed',
103
+ custom: '#64748b',
104
+ };
105
+ return colors[medium] ?? '#64748b';
106
+ }
107
+ /**
108
+ * Get bandwidth for connection medium (typical max).
109
+ */
110
+ export function getTypicalBandwidth(medium) {
111
+ const bandwidths = {
112
+ 'ethernet-cat5': 100,
113
+ 'ethernet-cat6': 1000,
114
+ 'ethernet-cat6a': 10000,
115
+ 'ethernet-cat7': 10000,
116
+ 'fiber-single': 100000,
117
+ 'fiber-multi': 10000,
118
+ coax: 1000,
119
+ 'power-line': 200,
120
+ 'wifi-2.4ghz': 150,
121
+ 'wifi-5ghz': 1300,
122
+ 'wifi-6ghz': 9600,
123
+ bluetooth: 3,
124
+ zigbee: 0.25,
125
+ 'z-wave': 0.1,
126
+ thread: 0.25,
127
+ 'cellular-4g': 100,
128
+ 'cellular-5g': 1000,
129
+ usb: 5000,
130
+ };
131
+ return bandwidths[medium] ?? null;
132
+ }
133
+ /* ================================================================
134
+ PATH FINDING
135
+ ================================================================ */
136
+ /**
137
+ * Build adjacency graph from connections.
138
+ */
139
+ export function buildAdjacencyGraph(connections) {
140
+ const graph = new Map();
141
+ for (const conn of connections) {
142
+ if (conn.status === 'error') {
143
+ continue;
144
+ }
145
+ // Add forward edge
146
+ if (!graph.has(conn.sourceId)) {
147
+ graph.set(conn.sourceId, []);
148
+ }
149
+ graph.get(conn.sourceId).push({ deviceId: conn.targetId, connection: conn });
150
+ // Add reverse edge (bidirectional)
151
+ if (!graph.has(conn.targetId)) {
152
+ graph.set(conn.targetId, []);
153
+ }
154
+ graph.get(conn.targetId).push({ deviceId: conn.sourceId, connection: conn });
155
+ }
156
+ return graph;
157
+ }
158
+ /**
159
+ * Find shortest path between two devices (Dijkstra).
160
+ */
161
+ export function findShortestPath(connections, startDeviceId, endDeviceId, metric = 'latency') {
162
+ const graph = buildAdjacencyGraph(connections);
163
+ if (!graph.has(startDeviceId) || !graph.has(endDeviceId)) {
164
+ return null;
165
+ }
166
+ const distances = new Map();
167
+ const previous = new Map();
168
+ const visited = new Set();
169
+ const queue = [];
170
+ // Initialize
171
+ for (const deviceId of graph.keys()) {
172
+ distances.set(deviceId, Infinity);
173
+ previous.set(deviceId, null);
174
+ }
175
+ distances.set(startDeviceId, 0);
176
+ queue.push({ deviceId: startDeviceId, distance: 0 });
177
+ while (queue.length > 0) {
178
+ // Sort by distance (simple priority queue)
179
+ queue.sort((a, b) => a.distance - b.distance);
180
+ const current = queue.shift();
181
+ if (visited.has(current.deviceId)) {
182
+ continue;
183
+ }
184
+ visited.add(current.deviceId);
185
+ if (current.deviceId === endDeviceId) {
186
+ break;
187
+ }
188
+ const neighbors = graph.get(current.deviceId) ?? [];
189
+ for (const neighbor of neighbors) {
190
+ if (visited.has(neighbor.deviceId)) {
191
+ continue;
192
+ }
193
+ let cost;
194
+ switch (metric) {
195
+ case 'latency':
196
+ cost = neighbor.connection.latency ?? 1;
197
+ break;
198
+ case 'hops':
199
+ cost = 1;
200
+ break;
201
+ case 'bandwidth':
202
+ // Invert bandwidth (lower is better for Dijkstra)
203
+ cost = 1 / (neighbor.connection.bandwidth ?? 1);
204
+ break;
205
+ }
206
+ const newDistance = distances.get(current.deviceId) + cost;
207
+ if (newDistance < distances.get(neighbor.deviceId)) {
208
+ distances.set(neighbor.deviceId, newDistance);
209
+ previous.set(neighbor.deviceId, {
210
+ deviceId: current.deviceId,
211
+ connection: neighbor.connection,
212
+ });
213
+ queue.push({ deviceId: neighbor.deviceId, distance: newDistance });
214
+ }
215
+ }
216
+ }
217
+ // Reconstruct path
218
+ if (!previous.has(endDeviceId) || distances.get(endDeviceId) === Infinity) {
219
+ return null;
220
+ }
221
+ const connectionIds = [];
222
+ let totalLatency = 0;
223
+ let bottleneckBandwidth = Infinity;
224
+ let worstStatus = 'active';
225
+ let current = endDeviceId;
226
+ while (current && previous.get(current)) {
227
+ const prev = previous.get(current);
228
+ connectionIds.unshift(prev.connection.id);
229
+ totalLatency += prev.connection.latency ?? 0;
230
+ if (prev.connection.bandwidth !== undefined) {
231
+ bottleneckBandwidth = Math.min(bottleneckBandwidth, prev.connection.bandwidth);
232
+ }
233
+ if (prev.connection.status === 'error') {
234
+ worstStatus = 'error';
235
+ }
236
+ else if (prev.connection.status === 'degraded' && worstStatus !== 'error') {
237
+ worstStatus = 'degraded';
238
+ }
239
+ else if (prev.connection.status === 'inactive' && worstStatus === 'active') {
240
+ worstStatus = 'inactive';
241
+ }
242
+ current = prev.deviceId;
243
+ }
244
+ return {
245
+ id: `path-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,
246
+ startDeviceId,
247
+ endDeviceId,
248
+ connectionIds,
249
+ totalLatency,
250
+ bottleneckBandwidth: bottleneckBandwidth === Infinity ? 0 : bottleneckBandwidth,
251
+ status: worstStatus,
252
+ isPrimary: true,
253
+ };
254
+ }
255
+ /**
256
+ * Find all paths between two devices (for redundancy analysis).
257
+ */
258
+ export function findAllPaths(connections, startDeviceId, endDeviceId, maxPaths = 5) {
259
+ const paths = [];
260
+ const graph = buildAdjacencyGraph(connections);
261
+ function dfs(current, target, visited, pathConnections) {
262
+ if (paths.length >= maxPaths) {
263
+ return;
264
+ }
265
+ if (current === target && pathConnections.length > 0) {
266
+ let totalLatency = 0;
267
+ let bottleneckBandwidth = Infinity;
268
+ let worstStatus = 'active';
269
+ for (const conn of pathConnections) {
270
+ totalLatency += conn.latency ?? 0;
271
+ if (conn.bandwidth !== undefined) {
272
+ bottleneckBandwidth = Math.min(bottleneckBandwidth, conn.bandwidth);
273
+ }
274
+ if (conn.status === 'error') {
275
+ worstStatus = 'error';
276
+ }
277
+ else if (conn.status === 'degraded' && worstStatus !== 'error') {
278
+ worstStatus = 'degraded';
279
+ }
280
+ }
281
+ paths.push({
282
+ id: `path-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,
283
+ startDeviceId,
284
+ endDeviceId,
285
+ connectionIds: pathConnections.map((c) => c.id),
286
+ totalLatency,
287
+ bottleneckBandwidth: bottleneckBandwidth === Infinity ? 0 : bottleneckBandwidth,
288
+ status: worstStatus,
289
+ isPrimary: paths.length === 0,
290
+ });
291
+ return;
292
+ }
293
+ visited.add(current);
294
+ const neighbors = graph.get(current) ?? [];
295
+ for (const neighbor of neighbors) {
296
+ if (!visited.has(neighbor.deviceId)) {
297
+ dfs(neighbor.deviceId, target, new Set(visited), [...pathConnections, neighbor.connection]);
298
+ }
299
+ }
300
+ }
301
+ dfs(startDeviceId, endDeviceId, new Set(), []);
302
+ return paths;
303
+ }
304
+ /* ================================================================
305
+ CABLE ROUTING
306
+ ================================================================ */
307
+ /**
308
+ * Calculate optimal cable route avoiding obstacles.
309
+ * Uses A* pathfinding on a grid.
310
+ */
311
+ export function calculateCableRoute(start, end, obstacles, gridSize = 10) {
312
+ // Simple grid-based A* pathfinding
313
+ const openSet = [];
314
+ const closedSet = new Set();
315
+ const pointKey = (p) => `${Math.round(p.x / gridSize)},${Math.round(p.y / gridSize)}`;
316
+ const heuristic = (a, b) => Math.abs(a.x - b.x) + Math.abs(a.y - b.y);
317
+ const isBlocked = (p) => {
318
+ for (const obs of obstacles) {
319
+ if (p.x >= obs.x && p.x <= obs.x + obs.width && p.y >= obs.y && p.y <= obs.y + obs.height) {
320
+ return true;
321
+ }
322
+ }
323
+ return false;
324
+ };
325
+ const snappedStart = {
326
+ x: Math.round(start.x / gridSize) * gridSize,
327
+ y: Math.round(start.y / gridSize) * gridSize,
328
+ };
329
+ const snappedEnd = {
330
+ x: Math.round(end.x / gridSize) * gridSize,
331
+ y: Math.round(end.y / gridSize) * gridSize,
332
+ };
333
+ openSet.push({
334
+ point: snappedStart,
335
+ f: heuristic(snappedStart, snappedEnd),
336
+ g: 0,
337
+ parent: null,
338
+ });
339
+ const cameFrom = new Map();
340
+ const gScore = new Map();
341
+ gScore.set(pointKey(snappedStart), 0);
342
+ const directions = [
343
+ { x: gridSize, y: 0 },
344
+ { x: -gridSize, y: 0 },
345
+ { x: 0, y: gridSize },
346
+ { x: 0, y: -gridSize },
347
+ ];
348
+ let iterations = 0;
349
+ const maxIterations = 10000;
350
+ while (openSet.length > 0 && iterations < maxIterations) {
351
+ iterations++;
352
+ openSet.sort((a, b) => a.f - b.f);
353
+ const current = openSet.shift();
354
+ const currentKey = pointKey(current.point);
355
+ if (Math.abs(current.point.x - snappedEnd.x) < gridSize &&
356
+ Math.abs(current.point.y - snappedEnd.y) < gridSize) {
357
+ // Reconstruct path
358
+ const path = [end];
359
+ let p = current.point;
360
+ while (cameFrom.has(pointKey(p))) {
361
+ path.unshift(p);
362
+ p = cameFrom.get(pointKey(p));
363
+ }
364
+ path.unshift(start);
365
+ return simplifyPath(path);
366
+ }
367
+ closedSet.add(currentKey);
368
+ for (const dir of directions) {
369
+ const neighbor = {
370
+ x: current.point.x + dir.x,
371
+ y: current.point.y + dir.y,
372
+ };
373
+ const neighborKey = pointKey(neighbor);
374
+ if (closedSet.has(neighborKey) || isBlocked(neighbor)) {
375
+ continue;
376
+ }
377
+ const tentativeG = gScore.get(currentKey) + gridSize;
378
+ if (!gScore.has(neighborKey) || tentativeG < gScore.get(neighborKey)) {
379
+ cameFrom.set(neighborKey, current.point);
380
+ gScore.set(neighborKey, tentativeG);
381
+ if (!openSet.find((n) => pointKey(n.point) === neighborKey)) {
382
+ openSet.push({
383
+ point: neighbor,
384
+ g: tentativeG,
385
+ f: tentativeG + heuristic(neighbor, snappedEnd),
386
+ parent: current.point,
387
+ });
388
+ }
389
+ }
390
+ }
391
+ }
392
+ // Fallback: direct line
393
+ return [start, end];
394
+ }
395
+ /**
396
+ * Simplify path by removing collinear points.
397
+ */
398
+ function simplifyPath(path) {
399
+ if (path.length <= 2) {
400
+ return path;
401
+ }
402
+ const result = [path[0]];
403
+ for (let i = 1; i < path.length - 1; i++) {
404
+ const prev = path[i - 1];
405
+ const curr = path[i];
406
+ const next = path[i + 1];
407
+ // Check if points are collinear
408
+ const dx1 = curr.x - prev.x;
409
+ const dy1 = curr.y - prev.y;
410
+ const dx2 = next.x - curr.x;
411
+ const dy2 = next.y - curr.y;
412
+ if (dx1 !== dx2 || dy1 !== dy2) {
413
+ result.push(curr);
414
+ }
415
+ }
416
+ result.push(path[path.length - 1]);
417
+ return result;
418
+ }
419
+ /* ================================================================
420
+ WIRELESS COVERAGE ESTIMATION
421
+ ================================================================ */
422
+ /**
423
+ * Estimate wireless coverage area.
424
+ * Simple model based on distance and obstacles.
425
+ */
426
+ export function estimateWirelessCoverage(accessPointPosition, txPower, band, _walls, boundaryThreshold = -70) {
427
+ // Path loss exponent varies by band
428
+ const pathLossExponent = {
429
+ '2.4ghz': 2.5,
430
+ '5ghz': 3.0,
431
+ '6ghz': 3.5,
432
+ };
433
+ // Estimate max range at boundary threshold
434
+ // Free space path loss: PL = 20*log10(f) + 20*log10(d) + 20*log10(4π/c)
435
+ // Simplified: rxPower = txPower - 10 * n * log10(d/d0)
436
+ const n = pathLossExponent[band];
437
+ const maxRangeM = Math.pow(10, (txPower - boundaryThreshold) / (10 * n));
438
+ const maxRange = Math.min(maxRangeM, 100); // Cap at 100m
439
+ // Generate approximate coverage polygon (octagon)
440
+ const numPoints = 16;
441
+ const coveragePolygon = [];
442
+ for (let i = 0; i < numPoints; i++) {
443
+ const angle = (2 * Math.PI * i) / numPoints;
444
+ const range = maxRange * (0.8 + 0.2 * Math.random()); // Add some variation
445
+ coveragePolygon.push({
446
+ x: accessPointPosition.x + range * Math.cos(angle),
447
+ y: accessPointPosition.y + range * Math.sin(angle),
448
+ });
449
+ }
450
+ return {
451
+ id: `coverage-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,
452
+ accessPointId: '',
453
+ band,
454
+ coveragePolygon,
455
+ boundarySignalStrength: boundaryThreshold,
456
+ maxRange,
457
+ txPower,
458
+ };
459
+ }
460
+ /* ================================================================
461
+ VISUALIZATION HELPERS
462
+ ================================================================ */
463
+ /**
464
+ * Generate SVG path for a connection with waypoints.
465
+ */
466
+ export function connectionToSVGPath(startPos, endPos, waypoints, curved = true) {
467
+ const allPoints = [startPos, ...waypoints, endPos];
468
+ if (!curved || allPoints.length <= 2) {
469
+ return allPoints.map((p, i) => `${i === 0 ? 'M' : 'L'}${p.x},${p.y}`).join(' ');
470
+ }
471
+ // Generate smooth curve through waypoints
472
+ let path = `M${allPoints[0].x},${allPoints[0].y}`;
473
+ for (let i = 1; i < allPoints.length; i++) {
474
+ const prev = allPoints[i - 1];
475
+ const curr = allPoints[i];
476
+ const cpx = (prev.x + curr.x) / 2;
477
+ const cpy = (prev.y + curr.y) / 2;
478
+ if (i === 1) {
479
+ path += ` Q${prev.x},${prev.y} ${cpx},${cpy}`;
480
+ }
481
+ else if (i === allPoints.length - 1) {
482
+ path += ` Q${cpx},${cpy} ${curr.x},${curr.y}`;
483
+ }
484
+ else {
485
+ path += ` T${cpx},${cpy}`;
486
+ }
487
+ }
488
+ return path;
489
+ }
490
+ /**
491
+ * Generate gradient ID for signal strength visualization.
492
+ */
493
+ export function getSignalGradientId(signalStrength) {
494
+ if (signalStrength >= -50) {
495
+ return 'signal-excellent';
496
+ }
497
+ if (signalStrength >= -60) {
498
+ return 'signal-good';
499
+ }
500
+ if (signalStrength >= -70) {
501
+ return 'signal-fair';
502
+ }
503
+ if (signalStrength >= -80) {
504
+ return 'signal-poor';
505
+ }
506
+ return 'signal-none';
507
+ }
508
+ /**
509
+ * Calculate connection statistics for a device.
510
+ */
511
+ export function getDeviceConnectionStats(deviceId, connections) {
512
+ const deviceConns = connections.filter((c) => c.sourceId === deviceId || c.targetId === deviceId);
513
+ const activeConns = deviceConns.filter((c) => c.status === 'active');
514
+ const totalBandwidth = activeConns.reduce((sum, c) => sum + (c.bandwidth ?? 0), 0);
515
+ const avgLatency = activeConns.length > 0
516
+ ? activeConns.reduce((sum, c) => sum + (c.latency ?? 0), 0) / activeConns.length
517
+ : 0;
518
+ return {
519
+ totalConnections: deviceConns.length,
520
+ activeConnections: activeConns.length,
521
+ totalBandwidth,
522
+ averageLatency: avgLatency,
523
+ };
524
+ }
525
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/topology/index.ts"],"names":[],"mappings":"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"}