pmcf 1.27.1 → 1.27.2

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pmcf",
3
- "version": "1.27.1",
3
+ "version": "1.27.2",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -0,0 +1,7 @@
1
+ import { Owner } from "./owner.mjs";
2
+
3
+ export class Cluster extends Owner {
4
+ static get typeName() {
5
+ return "cluster";
6
+ }
7
+ }
package/src/model.mjs CHANGED
@@ -2,210 +2,16 @@ import { readFile, glob } from "node:fs/promises";
2
2
  import { join } from "node:path";
3
3
  import {
4
4
  asArray,
5
- bridgeToJSON,
6
5
  isIPv4Address,
7
6
  isIPv6Address,
8
7
  normalizeIPAddress
9
8
  } from "./utils.mjs";
10
9
  import { Base } from "./base.mjs";
10
+ import { Owner } from "./owner.mjs";
11
11
  import { Service } from "./service.mjs";
12
+ import { Cluster } from "./cluster.mjs";
12
13
  import { DNSService } from "./dns.mjs";
13
14
 
14
- export class Owner extends Base {
15
- #hosts = new Map();
16
- #networks = new Map();
17
- #subnets = new Map();
18
- #bridges = new Set();
19
- #dns;
20
- #administratorEmail;
21
- domain;
22
- ntp = { servers: [] };
23
-
24
- constructor(owner, data) {
25
- super(owner, data);
26
-
27
- let dns;
28
- if (data?.dns) {
29
- dns = data.dns;
30
- delete data.dns;
31
- }
32
-
33
- this.#dns = new DNSService(this, dns);
34
-
35
- if (data?.networks) {
36
- const networks = data.networks;
37
- delete data.networks;
38
-
39
- for (const [name, data] of Object.entries(networks)) {
40
- data.name = name;
41
- new Network(this, data);
42
- }
43
- }
44
- Object.assign(this, data);
45
- }
46
-
47
- _traverse(...args) {
48
- if (super._traverse(...args)) {
49
- for (const network of this.#networks.values()) {
50
- network._traverse(...args);
51
- }
52
-
53
- for (const host of this.#hosts.values()) {
54
- host._traverse(...args);
55
- }
56
-
57
- return true;
58
- }
59
-
60
- return false;
61
- }
62
-
63
- get dns() {
64
- return this.#dns;
65
- }
66
-
67
- async *hosts() {
68
- for (const host of this.#hosts.values()) {
69
- yield host;
70
- }
71
- }
72
-
73
- addObject(object) {
74
- this.world.addObject(object);
75
- }
76
-
77
- addHost(host) {
78
- this.#hosts.set(host.name, host);
79
- this.addObject(host);
80
- }
81
-
82
- async service(filter) {
83
- let best;
84
- for await (const service of this.services(filter)) {
85
- if (!best || service.priority < best.priority) {
86
- best = service;
87
- }
88
- }
89
-
90
- return best;
91
- }
92
-
93
- async *services(filter) {
94
- for await (const host of this.hosts()) {
95
- for await (const service of host.services(filter)) {
96
- yield service;
97
- }
98
- }
99
- }
100
-
101
- networkNamed(name) {
102
- return this.#networks.get(name);
103
- }
104
-
105
- async *networks() {
106
- for (const network of this.#networks.values()) {
107
- yield network;
108
- }
109
- }
110
-
111
- addNetwork(network) {
112
- this.#networks.set(network.fullName, network);
113
- }
114
-
115
- addBridge(network, destinationNetworks) {
116
- if (destinationNetworks) {
117
- let bridge;
118
-
119
- for (bridge of this.#bridges) {
120
- if (bridge.has(network.name)) {
121
- bridge.delete(network.name);
122
- bridge.add(network);
123
- break;
124
- }
125
-
126
- if (bridge.has(network)) {
127
- break;
128
- }
129
- }
130
-
131
- if (!bridge) {
132
- bridge = new Set([network]);
133
- this.#bridges.add(bridge);
134
- }
135
-
136
- for (const name of asArray(destinationNetworks)) {
137
- const other = this.networkNamed(name);
138
- if (other) {
139
- bridge.add(other);
140
- other.bridge = bridge;
141
- } else {
142
- bridge.add(name);
143
- this.finalize(() => this._resolveBridges());
144
- }
145
- }
146
-
147
- return bridge;
148
- }
149
- }
150
-
151
- _resolveBridges() {
152
- for (const bridge of this.#bridges) {
153
- this.info(bridgeToJSON(bridge));
154
- for (const network of bridge) {
155
- if (typeof network === "string") {
156
- const other = this.networkNamed(network);
157
-
158
- if (other) {
159
- bridge.delete(network);
160
- bridge.add(other);
161
- other.bridge = bridge;
162
- } else {
163
- this.error(`Unresolvabale bridge network`, network);
164
- }
165
- }
166
- }
167
- }
168
- }
169
-
170
- async *networkAddresses() {
171
- for await (const host of this.hosts()) {
172
- for (const networkAddresses of host.networkAddresses()) {
173
- yield networkAddresses;
174
- }
175
- }
176
- }
177
-
178
- addSubnet(subnet) {
179
- this.#subnets.set(subnet.name, subnet);
180
- }
181
-
182
- subnet(name) {
183
- return this.#subnets.get(name);
184
- }
185
-
186
- subnets() {
187
- return this.#subnets.values();
188
- }
189
-
190
- get administratorEmail() {
191
- return this.#administratorEmail || "admin@" + this.domain;
192
- }
193
-
194
- get propertyNames() {
195
- return [...super.propertyNames, "domain", "administratorEmail", "dns"];
196
- }
197
-
198
- toJSON() {
199
- return {
200
- ...super.toJSON(),
201
- networks: [...this.#networks.keys()].sort(),
202
- subnets: [...this.#subnets.keys()].sort(),
203
- bridges: [...this.#bridges].map(b => bridgeToJSON(b)),
204
- hosts: [...this.#hosts.keys()].sort()
205
- };
206
- }
207
- }
208
-
209
15
  export class World extends Owner {
210
16
  static get types() {
211
17
  return _typesByName;
@@ -869,5 +675,5 @@ export class Subnet extends Base {
869
675
  }
870
676
  }
871
677
 
872
- const _types = [Location, Network, Subnet, Host, Service, DNSService];
678
+ const _types = [Location, Network, Subnet, Host, Cluster, Service, DNSService];
873
679
  const _typesByName = Object.fromEntries(_types.map(t => [t.typeName, t]));
package/src/module.mjs CHANGED
@@ -1,4 +1,6 @@
1
1
  export * from "./base.mjs";
2
2
  export * from "./service.mjs";
3
3
  export * from "./dns.mjs";
4
+ export * from "./cluster.mjs";
5
+ export * from "./owner.mjs";
4
6
  export * from "./model.mjs";
package/src/owner.mjs ADDED
@@ -0,0 +1,199 @@
1
+ import { asArray, bridgeToJSON } from "./utils.mjs";
2
+
3
+ import { Base } from "./base.mjs";
4
+ import { DNSService } from "./dns.mjs";
5
+
6
+ export class Owner extends Base {
7
+ #hosts = new Map();
8
+ #networks = new Map();
9
+ #subnets = new Map();
10
+ #bridges = new Set();
11
+ #dns;
12
+ #administratorEmail;
13
+ domain;
14
+ ntp = { servers: [] };
15
+
16
+ constructor(owner, data) {
17
+ super(owner, data);
18
+
19
+ let dns;
20
+ if (data?.dns) {
21
+ dns = data.dns;
22
+ delete data.dns;
23
+ }
24
+
25
+ this.#dns = new DNSService(this, dns);
26
+
27
+ if (data?.networks) {
28
+ const networks = data.networks;
29
+ delete data.networks;
30
+
31
+ for (const [name, data] of Object.entries(networks)) {
32
+ data.name = name;
33
+ new Network(this, data);
34
+ }
35
+ }
36
+ Object.assign(this, data);
37
+ }
38
+
39
+ _traverse(...args) {
40
+ if (super._traverse(...args)) {
41
+ for (const network of this.#networks.values()) {
42
+ network._traverse(...args);
43
+ }
44
+
45
+ for (const host of this.#hosts.values()) {
46
+ host._traverse(...args);
47
+ }
48
+
49
+ return true;
50
+ }
51
+
52
+ return false;
53
+ }
54
+
55
+ get dns() {
56
+ return this.#dns;
57
+ }
58
+
59
+ async *hosts() {
60
+ for (const host of this.#hosts.values()) {
61
+ yield host;
62
+ }
63
+ }
64
+
65
+ addObject(object) {
66
+ this.world.addObject(object);
67
+ }
68
+
69
+ addHost(host) {
70
+ this.#hosts.set(host.name, host);
71
+ this.addObject(host);
72
+ }
73
+
74
+ async service(filter) {
75
+ let best;
76
+ for await (const service of this.services(filter)) {
77
+ if (!best || service.priority < best.priority) {
78
+ best = service;
79
+ }
80
+ }
81
+
82
+ return best;
83
+ }
84
+
85
+ async *services(filter) {
86
+ for await (const host of this.hosts()) {
87
+ for await (const service of host.services(filter)) {
88
+ yield service;
89
+ }
90
+ }
91
+ }
92
+
93
+ networkNamed(name) {
94
+ return this.#networks.get(name);
95
+ }
96
+
97
+ async *networks() {
98
+ for (const network of this.#networks.values()) {
99
+ yield network;
100
+ }
101
+ }
102
+
103
+ addNetwork(network) {
104
+ this.#networks.set(network.fullName, network);
105
+ }
106
+
107
+ addBridge(network, destinationNetworks) {
108
+ if (destinationNetworks) {
109
+ let bridge;
110
+
111
+ for (bridge of this.#bridges) {
112
+ if (bridge.has(network.name)) {
113
+ bridge.delete(network.name);
114
+ bridge.add(network);
115
+ break;
116
+ }
117
+
118
+ if (bridge.has(network)) {
119
+ break;
120
+ }
121
+ }
122
+
123
+ if (!bridge) {
124
+ bridge = new Set([network]);
125
+ this.#bridges.add(bridge);
126
+ }
127
+
128
+ for (const name of asArray(destinationNetworks)) {
129
+ const other = this.networkNamed(name);
130
+ if (other) {
131
+ bridge.add(other);
132
+ other.bridge = bridge;
133
+ } else {
134
+ bridge.add(name);
135
+ this.finalize(() => this._resolveBridges());
136
+ }
137
+ }
138
+
139
+ return bridge;
140
+ }
141
+ }
142
+
143
+ _resolveBridges() {
144
+ for (const bridge of this.#bridges) {
145
+ this.info(bridgeToJSON(bridge));
146
+ for (const network of bridge) {
147
+ if (typeof network === "string") {
148
+ const other = this.networkNamed(network);
149
+
150
+ if (other) {
151
+ bridge.delete(network);
152
+ bridge.add(other);
153
+ other.bridge = bridge;
154
+ } else {
155
+ this.error(`Unresolvabale bridge network`, network);
156
+ }
157
+ }
158
+ }
159
+ }
160
+ }
161
+
162
+ async *networkAddresses() {
163
+ for await (const host of this.hosts()) {
164
+ for (const networkAddresses of host.networkAddresses()) {
165
+ yield networkAddresses;
166
+ }
167
+ }
168
+ }
169
+
170
+ addSubnet(subnet) {
171
+ this.#subnets.set(subnet.name, subnet);
172
+ }
173
+
174
+ subnet(name) {
175
+ return this.#subnets.get(name);
176
+ }
177
+
178
+ subnets() {
179
+ return this.#subnets.values();
180
+ }
181
+
182
+ get administratorEmail() {
183
+ return this.#administratorEmail || "admin@" + this.domain;
184
+ }
185
+
186
+ get propertyNames() {
187
+ return [...super.propertyNames, "domain", "administratorEmail", "dns"];
188
+ }
189
+
190
+ toJSON() {
191
+ return {
192
+ ...super.toJSON(),
193
+ networks: [...this.#networks.keys()].sort(),
194
+ subnets: [...this.#subnets.keys()].sort(),
195
+ bridges: [...this.#bridges].map(b => bridgeToJSON(b)),
196
+ hosts: [...this.#hosts.keys()].sort()
197
+ };
198
+ }
199
+ }
@@ -0,0 +1,3 @@
1
+ export class Cluster extends Owner {
2
+ }
3
+ import { Owner } from "./owner.mjs";
package/types/model.d.mts CHANGED
@@ -1,35 +1,6 @@
1
- export class Owner extends Base {
2
- domain: any;
3
- ntp: {
4
- servers: any[];
5
- };
6
- _traverse(...args: any[]): boolean;
7
- get dns(): DNSService;
8
- hosts(): AsyncGenerator<any, void, unknown>;
9
- addObject(object: any): void;
10
- addHost(host: any): void;
11
- service(filter: any): Promise<any>;
12
- services(filter: any): AsyncGenerator<any, void, unknown>;
13
- networkNamed(name: any): any;
14
- networks(): AsyncGenerator<any, void, unknown>;
15
- addNetwork(network: any): void;
16
- addBridge(network: any, destinationNetworks: any): any;
17
- _resolveBridges(): void;
18
- networkAddresses(): AsyncGenerator<any, void, unknown>;
19
- addSubnet(subnet: any): void;
20
- subnet(name: any): any;
21
- subnets(): MapIterator<any>;
22
- toJSON(): {
23
- networks: any[];
24
- subnets: any[];
25
- bridges: any[][];
26
- hosts: any[];
27
- };
28
- #private;
29
- }
30
1
  export class World extends Owner {
31
2
  static get types(): {
32
- [k: string]: typeof Service | typeof DNSService | typeof Network | typeof Host | typeof Location | typeof Subnet;
3
+ [k: string]: typeof DNSService | typeof Cluster | typeof Service | typeof Host | typeof Network | typeof Subnet;
33
4
  };
34
5
  constructor(directory: any);
35
6
  get fullName(): string;
@@ -114,6 +85,8 @@ export class Subnet extends Base {
114
85
  networks: Set<any>;
115
86
  get address(): any;
116
87
  }
117
- import { Base } from "./base.mjs";
88
+ import { Owner } from "./owner.mjs";
118
89
  import { DNSService } from "./dns.mjs";
90
+ import { Cluster } from "./cluster.mjs";
119
91
  import { Service } from "./service.mjs";
92
+ import { Base } from "./base.mjs";
@@ -1,4 +1,6 @@
1
1
  export * from "./base.mjs";
2
2
  export * from "./service.mjs";
3
3
  export * from "./dns.mjs";
4
+ export * from "./cluster.mjs";
5
+ export * from "./owner.mjs";
4
6
  export * from "./model.mjs";
@@ -0,0 +1,31 @@
1
+ export class Owner extends Base {
2
+ domain: any;
3
+ ntp: {
4
+ servers: any[];
5
+ };
6
+ _traverse(...args: any[]): boolean;
7
+ get dns(): DNSService;
8
+ hosts(): AsyncGenerator<any, void, unknown>;
9
+ addObject(object: any): void;
10
+ addHost(host: any): void;
11
+ service(filter: any): Promise<any>;
12
+ services(filter: any): AsyncGenerator<any, void, unknown>;
13
+ networkNamed(name: any): any;
14
+ networks(): AsyncGenerator<any, void, unknown>;
15
+ addNetwork(network: any): void;
16
+ addBridge(network: any, destinationNetworks: any): any;
17
+ _resolveBridges(): void;
18
+ networkAddresses(): AsyncGenerator<any, void, unknown>;
19
+ addSubnet(subnet: any): void;
20
+ subnet(name: any): any;
21
+ subnets(): MapIterator<any>;
22
+ toJSON(): {
23
+ networks: any[];
24
+ subnets: any[];
25
+ bridges: any[][];
26
+ hosts: any[];
27
+ };
28
+ #private;
29
+ }
30
+ import { Base } from "./base.mjs";
31
+ import { DNSService } from "./dns.mjs";