@push.rocks/smartdns 8.4.0 → 8.6.0

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.
@@ -3,10 +3,10 @@
3
3
  "binarySha256": "458bba943f70bd1ab64f520d12a7a128980cb3a793880b72c3e72079f7566823",
4
4
  "buildInfo": {
5
5
  "projectName": "@push.rocks/smartdns",
6
- "projectVersion": "8.4.0",
7
- "gitCommit": "fbbda1bf36bf95d1648ec98bd701bfc2f284c66b",
6
+ "projectVersion": "8.6.0",
7
+ "gitCommit": "eb7026e54a27f28417eb2fbfbb3ea9c5cd4dcf80",
8
8
  "gitDirty": false,
9
- "builtAt": "2026-09-13T11:11:41.278Z",
9
+ "builtAt": "2026-09-14T17:51:26.732Z",
10
10
  "tsrustVersion": "1.13.0",
11
11
  "binary": "rustdns-client",
12
12
  "target": "linux_amd64_musl"
@@ -3,10 +3,10 @@
3
3
  "binarySha256": "8c6530c2d3357f165e225ea911bc8479d18012f6ff5734cdfd7048a6a12366e5",
4
4
  "buildInfo": {
5
5
  "projectName": "@push.rocks/smartdns",
6
- "projectVersion": "8.4.0",
7
- "gitCommit": "fbbda1bf36bf95d1648ec98bd701bfc2f284c66b",
6
+ "projectVersion": "8.6.0",
7
+ "gitCommit": "eb7026e54a27f28417eb2fbfbb3ea9c5cd4dcf80",
8
8
  "gitDirty": false,
9
- "builtAt": "2026-09-13T11:11:41.575Z",
9
+ "builtAt": "2026-09-14T17:51:27.124Z",
10
10
  "tsrustVersion": "1.13.0",
11
11
  "binary": "rustdns-client",
12
12
  "target": "linux_arm64_musl"
Binary file
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "format": "tsrust.build-provenance.v2",
3
- "binarySha256": "423c14c067089e99b006617f8bf2939b08a75ba42aa986061d9f69790466b12c",
3
+ "binarySha256": "e7134b5a1ec65aab6c0483bff81078cccf70053e9372aeaa041ce8ff7e30e8a4",
4
4
  "buildInfo": {
5
5
  "projectName": "@push.rocks/smartdns",
6
- "projectVersion": "8.4.0",
7
- "gitCommit": "fbbda1bf36bf95d1648ec98bd701bfc2f284c66b",
6
+ "projectVersion": "8.6.0",
7
+ "gitCommit": "eb7026e54a27f28417eb2fbfbb3ea9c5cd4dcf80",
8
8
  "gitDirty": false,
9
- "builtAt": "2026-09-13T11:11:41.278Z",
9
+ "builtAt": "2026-09-14T17:51:26.732Z",
10
10
  "tsrustVersion": "1.13.0",
11
11
  "binary": "rustdns",
12
12
  "target": "linux_amd64_musl"
Binary file
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "format": "tsrust.build-provenance.v2",
3
- "binarySha256": "6185f3673a8ac91da74455a25359d4e038b2308f45f02d8fdb71fee78b6dd18d",
3
+ "binarySha256": "27518e7dd6cece176d1392493d299651d47718266461e4eb0a16a8017b709253",
4
4
  "buildInfo": {
5
5
  "projectName": "@push.rocks/smartdns",
6
- "projectVersion": "8.4.0",
7
- "gitCommit": "fbbda1bf36bf95d1648ec98bd701bfc2f284c66b",
6
+ "projectVersion": "8.6.0",
7
+ "gitCommit": "eb7026e54a27f28417eb2fbfbb3ea9c5cd4dcf80",
8
8
  "gitDirty": false,
9
- "builtAt": "2026-09-13T11:11:41.575Z",
9
+ "builtAt": "2026-09-14T17:51:27.124Z",
10
10
  "tsrustVersion": "1.13.0",
11
11
  "binary": "rustdns",
12
12
  "target": "linux_arm64_musl"
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@push.rocks/smartdns',
6
- version: '8.4.0',
6
+ version: '8.6.0',
7
7
  description: 'A robust TypeScript library providing advanced DNS management and resolution capabilities including support for DNSSEC, custom DNS servers, and integration with various DNS providers.'
8
8
  };
9
9
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxzQkFBc0I7SUFDNUIsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLHlMQUF5TDtDQUN2TSxDQUFBIn0=
@@ -1,12 +1,12 @@
1
1
  import { type IRustDnsBridgeOptions } from './classes.rustdnsbridge.js';
2
- import type { IManagedDnsClockEvidence, IManagedDnsRevision, IManagedDnsServerOptions, IManagedDnsSnapshot, IManagedDnsStatus } from './interfaces.managed.js';
2
+ import type { IManagedDnsClockEvidence, IManagedDnsRevision, IManagedDnsServerOptions, IManagedDnsSnapshot, IManagedDnsListenerSetOptions, IManagedDnsListenerSetStatus, TManagedDnsServerOptions, TManagedDnsServerStatus } from './interfaces.managed.js';
3
3
  /**
4
4
  * Native private-view DNS owner. Each instance owns one joined child lifecycle.
5
5
  * The caller authenticates and persists complete snapshots and revision receipts
6
6
  * through its own persistence layer before acknowledging applied configuration.
7
7
  * Workload source/interface anti-spoofing remains the caller's kernel-policy duty.
8
8
  */
9
- export declare class ManagedDnsServer {
9
+ export declare class ManagedDnsServer<TOptions extends TManagedDnsServerOptions = IManagedDnsServerOptions> {
10
10
  private readonly bridge;
11
11
  private readonly options;
12
12
  private queue;
@@ -14,17 +14,26 @@ export declare class ManagedDnsServer {
14
14
  private spawned;
15
15
  private started;
16
16
  private failedOwned;
17
+ private readonly failure;
17
18
  private stopPromise;
18
- constructor(options: IManagedDnsServerOptions, processOptions?: IRustDnsBridgeOptions);
19
+ constructor(options: TOptions, processOptions?: IRustDnsBridgeOptions);
20
+ /** Terminal owner loss, including an idle child exit. It is not cleanup evidence;
21
+ * callers must still await stop(). Successful orderly stop does not abort it. */
22
+ get failureSignal(): AbortSignal;
23
+ private fail;
19
24
  private enqueue;
20
25
  private ensureSpawned;
21
26
  /** Starts the child if needed; does not admit queries or create a listener. */
22
27
  getClockEvidence(): Promise<IManagedDnsClockEvidence>;
23
28
  /** Bind both transports. Until an accepted snapshot exists all queries refuse. */
24
- start(): Promise<IManagedDnsStatus>;
29
+ start(): Promise<TManagedDnsServerStatus<TOptions>>;
25
30
  /** Atomic complete replacement; older revisions and conflicting replay reject. */
26
31
  applySnapshot(snapshot: IManagedDnsSnapshot): Promise<IManagedDnsRevision>;
27
- getStatus(): Promise<IManagedDnsStatus>;
32
+ getStatus(): Promise<TManagedDnsServerStatus<TOptions>>;
33
+ /** Replace the complete listener set at the retained port, including empty.
34
+ * Mixed authority changes use union -> snapshot -> target, under the caller's
35
+ * persisted transition. This operation never changes or renews DNS authority. */
36
+ setBindAddresses(this: ManagedDnsServer<IManagedDnsListenerSetOptions>, addresses: string[]): Promise<IManagedDnsListenerSetStatus>;
28
37
  /**
29
38
  * Stop admission immediately, join pending calls and native listener/query
30
39
  * cleanup, then confirm child termination. Failed cleanup remains retryable.
@@ -13,9 +13,20 @@ export class ManagedDnsServer {
13
13
  this.spawned = false;
14
14
  this.started = false;
15
15
  this.failedOwned = false;
16
+ this.failure = new AbortController();
16
17
  this.stopPromise = null;
17
18
  this.options = structuredClone(options);
18
19
  this.bridge = new RustDnsBridge(processOptions);
20
+ this.bridge.on('exit', () => { if (!this.closing)
21
+ this.fail(); });
22
+ }
23
+ /** Terminal owner loss, including an idle child exit. It is not cleanup evidence;
24
+ * callers must still await stop(). Successful orderly stop does not abort it. */
25
+ get failureSignal() { return this.failure.signal; }
26
+ fail() {
27
+ this.failedOwned = true;
28
+ if (!this.failure.signal.aborted)
29
+ this.failure.abort(new Error('Managed DNS owner requires cleanup'));
19
30
  }
20
31
  enqueue(operation) {
21
32
  if (this.closing || this.failedOwned) {
@@ -33,7 +44,7 @@ export class ManagedDnsServer {
33
44
  async ensureSpawned() {
34
45
  if (this.spawned) {
35
46
  if (!this.bridge.running) {
36
- this.failedOwned = true;
47
+ this.fail();
37
48
  throw new Error('Managed DNS child exited; create a fresh owner after cleanup');
38
49
  }
39
50
  return;
@@ -41,10 +52,12 @@ export class ManagedDnsServer {
41
52
  try {
42
53
  if (!(await this.bridge.spawn()))
43
54
  throw new Error('Managed DNS native binary unavailable');
55
+ if (this.failedOwned || !this.bridge.running)
56
+ throw new Error('Managed DNS child exited during startup');
44
57
  this.spawned = true;
45
58
  }
46
59
  catch (error) {
47
- this.failedOwned = true;
60
+ this.fail();
48
61
  throw error;
49
62
  }
50
63
  }
@@ -62,12 +75,16 @@ export class ManagedDnsServer {
62
75
  throw new Error('Managed DNS server already started');
63
76
  await this.ensureSpawned();
64
77
  try {
65
- const status = await this.bridge.managedStart(this.options);
78
+ const status = 'bindAddresses' in this.options
79
+ ? await this.bridge.managedStartListenerSet(this.options)
80
+ : await this.bridge.managedStart(this.options);
81
+ if (this.failedOwned)
82
+ throw new Error('Managed DNS child exited during startup');
66
83
  this.started = true;
67
84
  return status;
68
85
  }
69
86
  catch (error) {
70
- this.failedOwned = true;
87
+ this.fail();
71
88
  throw error;
72
89
  }
73
90
  });
@@ -88,7 +105,7 @@ export class ManagedDnsServer {
88
105
  // block further mutations until this child has been joined and replaced.
89
106
  if (!(error instanceof plugins.smartrust.RustBridgeRequestError)
90
107
  || error.code !== 'ERR_RUST_BRIDGE_REQUEST_RUST_RESPONSE') {
91
- this.failedOwned = true;
108
+ this.fail();
92
109
  }
93
110
  throw error;
94
111
  }
@@ -98,7 +115,28 @@ export class ManagedDnsServer {
98
115
  return this.enqueue(async () => {
99
116
  if (!this.started)
100
117
  throw new Error('Managed DNS server is not started');
101
- return this.bridge.managedStatus();
118
+ const status = 'bindAddresses' in this.options
119
+ ? await this.bridge.managedListenerSetStatus() : await this.bridge.managedStatus();
120
+ return status;
121
+ });
122
+ }
123
+ /** Replace the complete listener set at the retained port, including empty.
124
+ * Mixed authority changes use union -> snapshot -> target, under the caller's
125
+ * persisted transition. This operation never changes or renews DNS authority. */
126
+ setBindAddresses(addresses) {
127
+ const ownedAddresses = structuredClone(addresses);
128
+ return this.enqueue(async () => {
129
+ if (!this.started)
130
+ throw new Error('Managed DNS server is not started');
131
+ try {
132
+ return await this.bridge.managedSetBindAddresses(ownedAddresses);
133
+ }
134
+ catch (error) {
135
+ if (!(error instanceof plugins.smartrust.RustBridgeRequestError)
136
+ || error.code !== 'ERR_RUST_BRIDGE_REQUEST_RUST_RESPONSE')
137
+ this.fail();
138
+ throw error;
139
+ }
102
140
  });
103
141
  }
104
142
  /**
@@ -127,7 +165,7 @@ export class ManagedDnsServer {
127
165
  failures.push(error);
128
166
  }
129
167
  if (failures.length) {
130
- this.failedOwned = true;
168
+ this.fail();
131
169
  throw new AggregateError(failures, 'Managed DNS cleanup failed');
132
170
  }
133
171
  this.spawned = false;
@@ -138,4 +176,4 @@ export class ManagedDnsServer {
138
176
  return operation;
139
177
  }
140
178
  }
141
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5tYW5hZ2VkZG5zc2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfc2VydmVyL2NsYXNzZXMubWFuYWdlZGRuc3NlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUE4QixNQUFNLDRCQUE0QixDQUFDO0FBQ3ZGLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBU3hDOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLGdCQUFnQjtJQVUzQixZQUFZLE9BQWlDLEVBQUUsaUJBQXdDLEVBQUU7UUFQakYsVUFBSyxHQUFxQixPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDNUMsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDcEIsZ0JBQVcsR0FBeUIsSUFBSSxDQUFDO1FBRy9DLElBQUksQ0FBQyxPQUFPLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVPLE9BQU8sQ0FBSSxTQUEyQjtRQUM1QyxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JDLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxDQUFDLENBQUM7UUFDdkYsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ3hDLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQUMsa0RBQWtELENB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
179
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5tYW5hZ2VkZG5zc2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfc2VydmVyL2NsYXNzZXMubWFuYWdlZGRuc3NlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUE4QixNQUFNLDRCQUE0QixDQUFDO0FBQ3ZGLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBWXhDOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLGdCQUFnQjtJQVczQixZQUFZLE9BQWlCLEVBQUUsaUJBQXdDLEVBQUU7UUFSakUsVUFBSyxHQUFxQixPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDNUMsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDWCxZQUFPLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUN6QyxnQkFBVyxHQUF5QixJQUFJLENBQUM7UUFHL0MsSUFBSSxDQUFDLE9BQU8sR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPO1lBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVEO3FGQUNpRjtJQUNqRixJQUFXLGFBQWEsS0FBa0IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFFL0QsSUFBSTtRQUNWLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxJ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
@@ -1,5 +1,5 @@
1
1
  import * as plugins from './plugins.js';
2
- import type { IManagedDnsClockEvidence, IManagedDnsRevision, IManagedDnsServerOptions, IManagedDnsSnapshot, IManagedDnsStatus } from './interfaces.managed.js';
2
+ import type { IManagedDnsClockEvidence, IManagedDnsRevision, IManagedDnsServerOptions, IManagedDnsSnapshot, IManagedDnsStatus, IManagedDnsListenerSetOptions, IManagedDnsListenerSetStatus } from './interfaces.managed.js';
3
3
  export type TDnsCommands = {
4
4
  managedClock: {
5
5
  params: Record<string, never>;
@@ -9,6 +9,20 @@ export type TDnsCommands = {
9
9
  params: IManagedDnsServerOptions;
10
10
  result: IManagedDnsStatus;
11
11
  };
12
+ managedStartListenerSet: {
13
+ params: IManagedDnsListenerSetOptions;
14
+ result: IManagedDnsListenerSetStatus;
15
+ };
16
+ managedSetBindAddresses: {
17
+ params: {
18
+ addresses: string[];
19
+ };
20
+ result: IManagedDnsListenerSetStatus;
21
+ };
22
+ managedListenerSetStatus: {
23
+ params: Record<string, never>;
24
+ result: IManagedDnsListenerSetStatus;
25
+ };
12
26
  managedApply: {
13
27
  params: IManagedDnsSnapshot;
14
28
  result: IManagedDnsRevision;
@@ -132,6 +146,9 @@ export declare class RustDnsBridge extends plugins.events.EventEmitter {
132
146
  spawn(): Promise<boolean>;
133
147
  managedClock(): Promise<IManagedDnsClockEvidence>;
134
148
  managedStart(options: IManagedDnsServerOptions): Promise<IManagedDnsStatus>;
149
+ managedStartListenerSet(options: IManagedDnsListenerSetOptions): Promise<IManagedDnsListenerSetStatus>;
150
+ managedSetBindAddresses(addresses: string[]): Promise<IManagedDnsListenerSetStatus>;
151
+ managedListenerSetStatus(): Promise<IManagedDnsListenerSetStatus>;
135
152
  managedApply(snapshot: IManagedDnsSnapshot): Promise<IManagedDnsRevision>;
136
153
  managedStatus(): Promise<IManagedDnsStatus>;
137
154
  managedStop(): Promise<void>;
@@ -48,6 +48,7 @@ export class RustDnsBridge extends plugins.events.EventEmitter {
48
48
  searchSystemPath: false,
49
49
  });
50
50
  // Forward events from inner bridge
51
+ this.bridge.on('exit', (...args) => this.emit('exit', ...args));
51
52
  this.bridge.on('management:dnsQuery', (data) => {
52
53
  this.emit('dnsQuery', data);
53
54
  });
@@ -79,6 +80,15 @@ export class RustDnsBridge extends plugins.events.EventEmitter {
79
80
  managedStart(options) {
80
81
  return this.bridge.sendCommand('managedStart', options);
81
82
  }
83
+ managedStartListenerSet(options) {
84
+ return this.bridge.sendCommand('managedStartListenerSet', options);
85
+ }
86
+ managedSetBindAddresses(addresses) {
87
+ return this.bridge.sendCommand('managedSetBindAddresses', { addresses });
88
+ }
89
+ managedListenerSetStatus() {
90
+ return this.bridge.sendCommand('managedListenerSetStatus', {});
91
+ }
82
92
  managedApply(snapshot) {
83
93
  return this.bridge.sendCommand('managedApply', snapshot);
84
94
  }
@@ -179,4 +189,4 @@ function getPlatformSuffix() {
179
189
  }
180
190
  return null;
181
191
  }
182
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5ydXN0ZG5zYnJpZGdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfc2VydmVyL2NsYXNzZXMucnVzdGRuc2JyaWRnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQTJHeEM7O0dBRUc7QUFDSCxNQUFNLE9BQU8sYUFBYyxTQUFRLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWTtJQUc1RCxZQUFZLFVBQWlDLEVBQUU7UUFDN0MsS0FBSyxFQUFFLENBQUM7UUFFUixJQUFJLE9BQU8sQ0FBQyxVQUFVLEtBQUssU0FBUztlQUMvQixDQUFDLE9BQU8sT0FBTyxDQUFDLFVBQVUsS0FBSyxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzlGLE1BQU0sSUFBSSxTQUFTLENBQUMsb0RBQW9ELENBQUMsQ0FBQztRQUM1RSxDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsa0JBQWtCLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDN0MsSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLE9BQU8sRUFBRSxDQUFDO2dCQUNqQyxNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7WUFDM0QsQ0FBQztZQUNELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQzttQkFDNUMsT0FBTyxDQUFDLGtCQUFrQixHQUFHLENBQUMsSUFBSSxPQUFPLENBQUMsa0JBQWtCLEdBQUcsV0FBVyxFQUFFLENBQUM7Z0JBQ2hGLE1BQU0sSUFBSSxVQUFVLENBQUMsc0VBQXNFLENBQUMsQ0FBQztZQUMvRixDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sVUFBVSxHQUFhLEVBQUUsQ0FBQztRQUNoQyxJQUFJLE9BQU8sQ0FBQyxVQUFVLEtBQUssU0FBUyxFQUFF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
192
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5ydXN0ZG5zYnJpZGdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfc2VydmVyL2NsYXNzZXMucnVzdGRuc2JyaWRnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQStHeEM7O0dBRUc7QUFDSCxNQUFNLE9BQU8sYUFBYyxTQUFRLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWTtJQUc1RCxZQUFZLFVBQWlDLEVBQUU7UUFDN0MsS0FBSyxFQUFFLENBQUM7UUFFUixJQUFJLE9BQU8sQ0FBQyxVQUFVLEtBQUssU0FBUztlQUMvQixDQUFDLE9BQU8sT0FBTyxDQUFDLFVBQVUsS0FBSyxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzlGLE1BQU0sSUFBSSxTQUFTLENBQUMsb0RBQW9ELENBQUMsQ0FBQztRQUM1RSxDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsa0JBQWtCLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDN0MsSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLE9BQU8sRUFBRSxDQUFDO2dCQUNqQyxNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7WUFDM0QsQ0FBQztZQUNELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQzttQkFDNUMsT0FBTyxDQUFDLGtCQUFrQixHQUFHLENBQUMsSUFBSSxPQUFPLENBQUMsa0JBQWtCLEdBQUcsV0FBVyxFQUFFLENBQUM7Z0JBQ2hGLE1BQU0sSUFBSSxVQUFVLENBQUMsc0VBQXNFLENBQUMsQ0FBQztZQUMvRixDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sVUFBVSxHQUFhLEVBQUUsQ0FBQztRQUNoQyxJQUFJLE9BQU8sQ0FBQyxVQUFVLEtBQUssU0FBUyxFQUFF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
@@ -19,6 +19,13 @@ export interface IManagedDnsServerOptions {
19
19
  /** Other node-local resolver addresses, forbidden as forwarding destinations. */
20
20
  forbiddenUpstreamAddresses: string[];
21
21
  }
22
+ /** Complete listener set owned by one native process and one DNS snapshot. */
23
+ export interface IManagedDnsListenerSetOptions extends Omit<IManagedDnsServerOptions, 'bindAddress'> {
24
+ /** Canonical, distinct IP literals, at most 256. Empty starts without listeners. */
25
+ bindAddresses: string[];
26
+ }
27
+ export type TManagedDnsServerOptions = IManagedDnsServerOptions | IManagedDnsListenerSetOptions;
28
+ export type TManagedDnsServerStatus<TOptions extends TManagedDnsServerOptions> = TOptions extends IManagedDnsListenerSetOptions ? IManagedDnsListenerSetStatus : IManagedDnsStatus;
22
29
  export interface IManagedDnsSnapshot {
23
30
  ownerId: string;
24
31
  revision: number;
@@ -77,3 +84,7 @@ export interface IManagedDnsStatus {
77
84
  active: boolean;
78
85
  clock: IManagedDnsClockEvidence;
79
86
  }
87
+ export interface IManagedDnsListenerSetStatus extends Omit<IManagedDnsStatus, 'address'> {
88
+ /** Exact complete ordered set; no wildcard or implicit primary address. */
89
+ addresses: string[];
90
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@push.rocks/smartdns",
3
- "version": "8.4.0",
3
+ "version": "8.6.0",
4
4
  "private": false,
5
5
  "description": "A robust TypeScript library providing advanced DNS management and resolution capabilities including support for DNSSEC, custom DNS servers, and integration with various DNS providers.",
6
6
  "exports": {
@@ -53,7 +53,7 @@
53
53
  "@git.zone/tstest": "^6.0.0",
54
54
  "@types/dns-packet": "^5.6.5",
55
55
  "@types/lodash.clonedeep": "^4.5.9",
56
- "@types/node": "^26.4.1",
56
+ "@types/node": "^26.5.0",
57
57
  "dns-packet": "^5.6.1"
58
58
  },
59
59
  "files": [
package/readme.md CHANGED
@@ -668,6 +668,54 @@ const receipt = await dns.applySnapshot({
668
668
  await dns.stop();
669
669
  ```
670
670
 
671
+ For a changing set of exact local addresses, pass `bindAddresses` instead of
672
+ `bindAddress`. The two start modes are mutually exclusive. The complete-set mode
673
+ accepts zero through 256 distinct canonical IP literals and returns
674
+ `IManagedDnsListenerSetStatus` with `addresses: string[]`. The existing singleton
675
+ mode retains its scalar `address` status and immutable binding.
676
+
677
+ ```typescript
678
+ const dns = new ManagedDnsServer({
679
+ ownerId: 'node:one',
680
+ bindAddresses: [],
681
+ port: 53,
682
+ revisionFloor: null,
683
+ forbiddenUpstreamAddresses: [],
684
+ });
685
+ await dns.start(); // No listeners or active answers until addresses and authority exist.
686
+ await dns.setBindAddresses(['10.100.1.1', '10.100.2.1']);
687
+ // Apply the authenticated complete snapshot through applySnapshot as above.
688
+ await dns.setBindAddresses([]); // Joins all listeners without replacing the child.
689
+ await dns.stop();
690
+ ```
691
+
692
+ `setBindAddresses()` replaces the complete ordered set at the retained port. It
693
+ binds every added UDP/TCP pair before publishing any change; a preparation failure
694
+ drops all additions and leaves the prior set and accepted snapshot intact.
695
+ Unchanged sockets and TCP connections survive. Removed query and connection work
696
+ is cancelled and joined before acknowledgement. All addresses share one native
697
+ snapshot/revision and the same global 256 UDP-job and 128 TCP-connection budgets.
698
+ An empty set has `active: false` while retaining the accepted revision and native
699
+ owner. Port zero allocates one common port at the first nonempty binding and
700
+ retains it through later empty sets; before that first binding, status reports zero.
701
+
702
+ For a mixed address/authority transition, the caller persists and serializes its
703
+ combined intent, binds the union of old and new addresses, applies one new complete
704
+ snapshot, then sets the final address set. This ensures new gateways exist before
705
+ their client authority is applied and removes old listeners only after withdrawal.
706
+ Every query still selects its view by kernel-observed source and checks the same
707
+ current revision before sending. Listener changes never renew validity or change
708
+ client membership. A transport-ambiguous listener mutation fences the facade until
709
+ joined cleanup, just like a snapshot mutation. A new owner must receive the retained
710
+ snapshot and revision floor from the caller's persistence layer.
711
+
712
+ All current listener addresses are forbidden forwarding destinations. Adding a
713
+ listener that matches an accepted upstream rejects before binding; explicitly
714
+ withdraw that forwarding authority first. Removing a listener does not remove any
715
+ independently configured `forbiddenUpstreamAddresses` entry. The 256-address bound
716
+ does not imply that an arbitrary generated snapshot fits the separate native view,
717
+ record and encoded-size limits; callers must preflight the exact complete input.
718
+
671
719
  For an installed or compiled node bundle, pass a second, process-only option:
672
720
  `new ManagedDnsServer(configuration, { binaryPath: '/opt/node/bin/rustdns' })`.
673
721
  `binaryPath` must be absolute and is never serialized into a DNS snapshot or native
@@ -772,11 +820,16 @@ most four upstreams, 1,024 allowed suffixes per view, 512 response records, 256
772
820
  bound forwarding work. A response arriving after replacement or expiry cannot
773
821
  answer under its old authority.
774
822
 
775
- `start()` binds both transports before admission. `stop()` closes admission, joins
823
+ `start()` binds both transports at every initial address before admission. `stop()` closes admission, joins
776
824
  pending facade calls and all native query/connection work, and confirms child
777
825
  termination. Failed cleanup remains owned and retryable. A transport-ambiguous
778
826
  snapshot update prevents further mutations until cleanup; callers must reconcile
779
- their persisted intent. Each facade instance is single-use: construct a new one
827
+ their persisted intent. The one-shot `failureSignal` aborts immediately on an
828
+ unexpected child exit, failed start, ambiguous mutation or failed cleanup. Native
829
+ validation rejections that preserve the prior state and successful orderly stop
830
+ leave it un-aborted. The signal is a failure notification, never proof of joined
831
+ cleanup: always await `stop()`, retrying a failed stop while retaining ownership.
832
+ Each facade instance is single-use: construct a new one
780
833
  with the persisted revision floor after a stop. Stdin closure stops the native
781
834
  listeners when their parent dies. IPC commands have a 16 MiB allocation ceiling;
782
835
  snapshots have an 8 MiB encoded ceiling.
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@push.rocks/smartdns',
6
- version: '8.4.0',
6
+ version: '8.6.0',
7
7
  description: 'A robust TypeScript library providing advanced DNS management and resolution capabilities including support for DNSSEC, custom DNS servers, and integration with various DNS providers.'
8
8
  }