@push.rocks/smartdns 8.3.0 → 8.5.1
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_rust/rustdns-client_linux_amd64_musl.tsrust-build.json +3 -3
- package/dist_rust/rustdns-client_linux_arm64_musl.tsrust-build.json +3 -3
- package/dist_rust/rustdns_linux_amd64_musl +0 -0
- package/dist_rust/rustdns_linux_amd64_musl.tsrust-build.json +4 -4
- package/dist_rust/rustdns_linux_arm64_musl +0 -0
- package/dist_rust/rustdns_linux_arm64_musl.tsrust-build.json +4 -4
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts_server/classes.manageddnsserver.d.ts +9 -5
- package/dist_ts_server/classes.manageddnsserver.js +26 -3
- package/dist_ts_server/classes.rustdnsbridge.d.ts +24 -1
- package/dist_ts_server/classes.rustdnsbridge.js +23 -2
- package/dist_ts_server/interfaces.managed.d.ts +11 -0
- package/package.json +5 -5
- package/readme.md +63 -1
- package/ts/00_commitinfo_data.ts +1 -1
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
"binarySha256": "458bba943f70bd1ab64f520d12a7a128980cb3a793880b72c3e72079f7566823",
|
|
4
4
|
"buildInfo": {
|
|
5
5
|
"projectName": "@push.rocks/smartdns",
|
|
6
|
-
"projectVersion": "8.
|
|
7
|
-
"gitCommit": "
|
|
6
|
+
"projectVersion": "8.5.1",
|
|
7
|
+
"gitCommit": "727fe56903eb637fcd8e91ead92d4730a0a29729",
|
|
8
8
|
"gitDirty": false,
|
|
9
|
-
"builtAt": "2026-09-
|
|
9
|
+
"builtAt": "2026-09-14T14:27:37.041Z",
|
|
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.
|
|
7
|
-
"gitCommit": "
|
|
6
|
+
"projectVersion": "8.5.1",
|
|
7
|
+
"gitCommit": "727fe56903eb637fcd8e91ead92d4730a0a29729",
|
|
8
8
|
"gitDirty": false,
|
|
9
|
-
"builtAt": "2026-09-
|
|
9
|
+
"builtAt": "2026-09-14T14:27:37.352Z",
|
|
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": "
|
|
3
|
+
"binarySha256": "e7134b5a1ec65aab6c0483bff81078cccf70053e9372aeaa041ce8ff7e30e8a4",
|
|
4
4
|
"buildInfo": {
|
|
5
5
|
"projectName": "@push.rocks/smartdns",
|
|
6
|
-
"projectVersion": "8.
|
|
7
|
-
"gitCommit": "
|
|
6
|
+
"projectVersion": "8.5.1",
|
|
7
|
+
"gitCommit": "727fe56903eb637fcd8e91ead92d4730a0a29729",
|
|
8
8
|
"gitDirty": false,
|
|
9
|
-
"builtAt": "2026-09-
|
|
9
|
+
"builtAt": "2026-09-14T14:27:37.041Z",
|
|
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": "
|
|
3
|
+
"binarySha256": "27518e7dd6cece176d1392493d299651d47718266461e4eb0a16a8017b709253",
|
|
4
4
|
"buildInfo": {
|
|
5
5
|
"projectName": "@push.rocks/smartdns",
|
|
6
|
-
"projectVersion": "8.
|
|
7
|
-
"gitCommit": "
|
|
6
|
+
"projectVersion": "8.5.1",
|
|
7
|
+
"gitCommit": "727fe56903eb637fcd8e91ead92d4730a0a29729",
|
|
8
8
|
"gitDirty": false,
|
|
9
|
-
"builtAt": "2026-09-
|
|
9
|
+
"builtAt": "2026-09-14T14:27:37.352Z",
|
|
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.
|
|
6
|
+
version: '8.5.1',
|
|
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,
|
|
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;
|
|
@@ -15,16 +15,20 @@ export declare class ManagedDnsServer {
|
|
|
15
15
|
private started;
|
|
16
16
|
private failedOwned;
|
|
17
17
|
private stopPromise;
|
|
18
|
-
constructor(options:
|
|
18
|
+
constructor(options: TOptions, processOptions?: IRustDnsBridgeOptions);
|
|
19
19
|
private enqueue;
|
|
20
20
|
private ensureSpawned;
|
|
21
21
|
/** Starts the child if needed; does not admit queries or create a listener. */
|
|
22
22
|
getClockEvidence(): Promise<IManagedDnsClockEvidence>;
|
|
23
23
|
/** Bind both transports. Until an accepted snapshot exists all queries refuse. */
|
|
24
|
-
start(): Promise<
|
|
24
|
+
start(): Promise<TManagedDnsServerStatus<TOptions>>;
|
|
25
25
|
/** Atomic complete replacement; older revisions and conflicting replay reject. */
|
|
26
26
|
applySnapshot(snapshot: IManagedDnsSnapshot): Promise<IManagedDnsRevision>;
|
|
27
|
-
getStatus(): Promise<
|
|
27
|
+
getStatus(): Promise<TManagedDnsServerStatus<TOptions>>;
|
|
28
|
+
/** Replace the complete listener set at the retained port, including empty.
|
|
29
|
+
* Mixed authority changes use union -> snapshot -> target, under the caller's
|
|
30
|
+
* persisted transition. This operation never changes or renews DNS authority. */
|
|
31
|
+
setBindAddresses(this: ManagedDnsServer<IManagedDnsListenerSetOptions>, addresses: string[]): Promise<IManagedDnsListenerSetStatus>;
|
|
28
32
|
/**
|
|
29
33
|
* Stop admission immediately, join pending calls and native listener/query
|
|
30
34
|
* cleanup, then confirm child termination. Failed cleanup remains retryable.
|
|
@@ -62,7 +62,9 @@ export class ManagedDnsServer {
|
|
|
62
62
|
throw new Error('Managed DNS server already started');
|
|
63
63
|
await this.ensureSpawned();
|
|
64
64
|
try {
|
|
65
|
-
const status =
|
|
65
|
+
const status = 'bindAddresses' in this.options
|
|
66
|
+
? await this.bridge.managedStartListenerSet(this.options)
|
|
67
|
+
: await this.bridge.managedStart(this.options);
|
|
66
68
|
this.started = true;
|
|
67
69
|
return status;
|
|
68
70
|
}
|
|
@@ -98,7 +100,28 @@ export class ManagedDnsServer {
|
|
|
98
100
|
return this.enqueue(async () => {
|
|
99
101
|
if (!this.started)
|
|
100
102
|
throw new Error('Managed DNS server is not started');
|
|
101
|
-
|
|
103
|
+
const status = 'bindAddresses' in this.options
|
|
104
|
+
? await this.bridge.managedListenerSetStatus() : await this.bridge.managedStatus();
|
|
105
|
+
return status;
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
/** Replace the complete listener set at the retained port, including empty.
|
|
109
|
+
* Mixed authority changes use union -> snapshot -> target, under the caller's
|
|
110
|
+
* persisted transition. This operation never changes or renews DNS authority. */
|
|
111
|
+
setBindAddresses(addresses) {
|
|
112
|
+
const ownedAddresses = structuredClone(addresses);
|
|
113
|
+
return this.enqueue(async () => {
|
|
114
|
+
if (!this.started)
|
|
115
|
+
throw new Error('Managed DNS server is not started');
|
|
116
|
+
try {
|
|
117
|
+
return await this.bridge.managedSetBindAddresses(ownedAddresses);
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
if (!(error instanceof plugins.smartrust.RustBridgeRequestError)
|
|
121
|
+
|| error.code !== 'ERR_RUST_BRIDGE_REQUEST_RUST_RESPONSE')
|
|
122
|
+
this.failedOwned = true;
|
|
123
|
+
throw error;
|
|
124
|
+
}
|
|
102
125
|
});
|
|
103
126
|
}
|
|
104
127
|
/**
|
|
@@ -138,4 +161,4 @@ export class ManagedDnsServer {
|
|
|
138
161
|
return operation;
|
|
139
162
|
}
|
|
140
163
|
}
|
|
141
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
164
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5tYW5hZ2VkZG5zc2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfc2VydmVyL2NsYXNzZXMubWFuYWdlZGRuc3NlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUE4QixNQUFNLDRCQUE0QixDQUFDO0FBQ3ZGLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBWXhDOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLGdCQUFnQjtJQVUzQixZQUFZLE9BQWlCLEVBQUUsaUJBQXdDLEVBQUU7UUFQakUsVUFBSyxHQUFxQixPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDNUMsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDcEIsZ0JBQVcsR0FBeUIsSUFBSSxDQUFDO1FBRy9DLElBQUksQ0FBQyxPQUFPLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVPLE9BQU8sQ0FBSSxTQUEyQjtRQUM1QyxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JDLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxDQUFDLENBQUM7UUFDdkYsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ3hDLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQUMsa0RBQWtELENB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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;
|
|
@@ -113,6 +127,12 @@ export interface IDnsQueryEvent {
|
|
|
113
127
|
export interface IRustDnsBridgeOptions {
|
|
114
128
|
/** Installer-verified absolute native executable. Disables every lookup fallback. */
|
|
115
129
|
binaryPath?: string;
|
|
130
|
+
/**
|
|
131
|
+
* Linux network-namespace descriptor owned by the caller. Keep it open and bound
|
|
132
|
+
* to the intended namespace until spawn resolves. The child enters that namespace
|
|
133
|
+
* before creating threads or sockets; neither owner closes the caller's descriptor.
|
|
134
|
+
*/
|
|
135
|
+
networkNamespaceFd?: number;
|
|
116
136
|
}
|
|
117
137
|
/**
|
|
118
138
|
* Bridge to the Rust DNS binary via smartrust IPC.
|
|
@@ -126,6 +146,9 @@ export declare class RustDnsBridge extends plugins.events.EventEmitter {
|
|
|
126
146
|
spawn(): Promise<boolean>;
|
|
127
147
|
managedClock(): Promise<IManagedDnsClockEvidence>;
|
|
128
148
|
managedStart(options: IManagedDnsServerOptions): Promise<IManagedDnsStatus>;
|
|
149
|
+
managedStartListenerSet(options: IManagedDnsListenerSetOptions): Promise<IManagedDnsListenerSetStatus>;
|
|
150
|
+
managedSetBindAddresses(addresses: string[]): Promise<IManagedDnsListenerSetStatus>;
|
|
151
|
+
managedListenerSetStatus(): Promise<IManagedDnsListenerSetStatus>;
|
|
129
152
|
managedApply(snapshot: IManagedDnsSnapshot): Promise<IManagedDnsRevision>;
|
|
130
153
|
managedStatus(): Promise<IManagedDnsStatus>;
|
|
131
154
|
managedStop(): Promise<void>;
|
|
@@ -9,6 +9,15 @@ export class RustDnsBridge extends plugins.events.EventEmitter {
|
|
|
9
9
|
&& (typeof options.binaryPath !== 'string' || !plugins.path.isAbsolute(options.binaryPath))) {
|
|
10
10
|
throw new TypeError('DNS binaryPath must be an absolute executable path');
|
|
11
11
|
}
|
|
12
|
+
if (options.networkNamespaceFd !== undefined) {
|
|
13
|
+
if (process.platform !== 'linux') {
|
|
14
|
+
throw new Error('DNS networkNamespaceFd requires Linux');
|
|
15
|
+
}
|
|
16
|
+
if (!Number.isInteger(options.networkNamespaceFd)
|
|
17
|
+
|| options.networkNamespaceFd < 0 || options.networkNamespaceFd > 0x7fff_ffff) {
|
|
18
|
+
throw new RangeError('DNS networkNamespaceFd must be a non-negative native file descriptor');
|
|
19
|
+
}
|
|
20
|
+
}
|
|
12
21
|
const localPaths = [];
|
|
13
22
|
if (options.binaryPath === undefined) {
|
|
14
23
|
const packageDir = plugins.path.resolve(plugins.path.dirname(new URL(import.meta.url).pathname), '..');
|
|
@@ -26,7 +35,10 @@ export class RustDnsBridge extends plugins.events.EventEmitter {
|
|
|
26
35
|
this.bridge = new plugins.smartrust.RustBridge({
|
|
27
36
|
binaryName: 'rustdns',
|
|
28
37
|
binaryPath: options.binaryPath,
|
|
29
|
-
cliArgs:
|
|
38
|
+
cliArgs: options.networkNamespaceFd === undefined
|
|
39
|
+
? ['--management'] : ['--management', '--network-namespace-fd', '3'],
|
|
40
|
+
inheritedFileDescriptors: options.networkNamespaceFd === undefined
|
|
41
|
+
? undefined : [options.networkNamespaceFd],
|
|
30
42
|
requestTimeoutMs: 30_000,
|
|
31
43
|
readyTimeoutMs: 10_000,
|
|
32
44
|
maxPendingRequestsByMethod: {
|
|
@@ -67,6 +79,15 @@ export class RustDnsBridge extends plugins.events.EventEmitter {
|
|
|
67
79
|
managedStart(options) {
|
|
68
80
|
return this.bridge.sendCommand('managedStart', options);
|
|
69
81
|
}
|
|
82
|
+
managedStartListenerSet(options) {
|
|
83
|
+
return this.bridge.sendCommand('managedStartListenerSet', options);
|
|
84
|
+
}
|
|
85
|
+
managedSetBindAddresses(addresses) {
|
|
86
|
+
return this.bridge.sendCommand('managedSetBindAddresses', { addresses });
|
|
87
|
+
}
|
|
88
|
+
managedListenerSetStatus() {
|
|
89
|
+
return this.bridge.sendCommand('managedListenerSetStatus', {});
|
|
90
|
+
}
|
|
70
91
|
managedApply(snapshot) {
|
|
71
92
|
return this.bridge.sendCommand('managedApply', snapshot);
|
|
72
93
|
}
|
|
@@ -167,4 +188,4 @@ function getPlatformSuffix() {
|
|
|
167
188
|
}
|
|
168
189
|
return null;
|
|
169
190
|
}
|
|
170
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
191
|
+
//# 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.
|
|
3
|
+
"version": "8.5.1",
|
|
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": {
|
|
@@ -41,19 +41,19 @@
|
|
|
41
41
|
"@push.rocks/smartdelay": "^3.0.1",
|
|
42
42
|
"@push.rocks/smartenv": "^6.0.0",
|
|
43
43
|
"@push.rocks/smartpromise": "^4.2.5",
|
|
44
|
-
"@push.rocks/smartrust": "^1.
|
|
44
|
+
"@push.rocks/smartrust": "^1.9.1",
|
|
45
45
|
"@tsclass/tsclass": "^9.5.1",
|
|
46
46
|
"acme-client": "^5.4.0",
|
|
47
47
|
"minimatch": "^10.2.6"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
|
-
"@git.zone/tsbuild": "^4.4.
|
|
50
|
+
"@git.zone/tsbuild": "^4.4.3",
|
|
51
51
|
"@git.zone/tsrun": "^2.0.6",
|
|
52
52
|
"@git.zone/tsrust": "^1.13.0",
|
|
53
|
-
"@git.zone/tstest": "^
|
|
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.
|
|
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
|
|
@@ -677,6 +725,20 @@ build binaries exist. The installer remains responsible for verifying the artifa
|
|
|
677
725
|
and protecting its path. Without this option the existing npm package lookup is
|
|
678
726
|
preserved, including static Linux musl binaries.
|
|
679
727
|
|
|
728
|
+
For a caller-owned Linux network namespace, add `networkNamespaceFd: handle.fd`
|
|
729
|
+
to those process options. Keep the original descriptor open and bound to the
|
|
730
|
+
intended namespace until `getClockEvidence()` or `start()` resolves; the caller
|
|
731
|
+
owns and closes it. SmartDNS inherits a separate descriptor through Smartrust,
|
|
732
|
+
verifies that it is a network namespace, enters it before creating runtime threads
|
|
733
|
+
or opening sockets, then closes only the child's copy. Entry failure prevents
|
|
734
|
+
readiness. Namespace paths, process IDs and serialized identity records are not
|
|
735
|
+
accepted in place of the live descriptor. Namespace creation, recovery, routing
|
|
736
|
+
and packet policy remain the caller's responsibility. Successful entry requires
|
|
737
|
+
the Linux capabilities for `setns(CLONE_NEWNET)` in both relevant user namespaces.
|
|
738
|
+
The native executable exposes the same startup contract through
|
|
739
|
+
`--management --network-namespace-fd 3` with an already inherited descriptor;
|
|
740
|
+
descriptors below 3 are rejected to protect the IPC streams.
|
|
741
|
+
|
|
680
742
|
The caller authenticates the configuration, enforces the kernel binding between
|
|
681
743
|
each workload/interface and source IP, and persists complete snapshots plus the
|
|
682
744
|
highest `revision`/`contentHash` receipt. The engine does not authenticate a claimed
|
|
@@ -758,7 +820,7 @@ most four upstreams, 1,024 allowed suffixes per view, 512 response records, 256
|
|
|
758
820
|
bound forwarding work. A response arriving after replacement or expiry cannot
|
|
759
821
|
answer under its old authority.
|
|
760
822
|
|
|
761
|
-
`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
|
|
762
824
|
pending facade calls and all native query/connection work, and confirms child
|
|
763
825
|
termination. Failed cleanup remains owned and retryable. A transport-ambiguous
|
|
764
826
|
snapshot update prevents further mutations until cleanup; callers must reconcile
|
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -3,6 +3,6 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@push.rocks/smartdns',
|
|
6
|
-
version: '8.
|
|
6
|
+
version: '8.5.1',
|
|
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
|
}
|