@push.rocks/smartvpn 2.7.1 → 2.8.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.
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "format": "tsrust.build-provenance.v2",
3
- "binarySha256": "e06e9bec1206146c13370d105610c056dd3684cca29d1280e7befd5a08c34e99",
3
+ "binarySha256": "99bac3443522361425a0f038061de8764c0cdaa5aae7bc0a81ff978b7743e86a",
4
4
  "buildInfo": {
5
5
  "projectName": "@push.rocks/smartvpn",
6
- "projectVersion": "2.7.1",
7
- "gitCommit": "d1bbbeaec9ed99d89334375aa615471c3f2615ef",
6
+ "projectVersion": "2.8.0",
7
+ "gitCommit": "ea2b91234508f2befa1ee7da1187bc343700617f",
8
8
  "gitDirty": false,
9
- "builtAt": "2026-10-26T21:48:04.722Z",
9
+ "builtAt": "2026-10-30T14:29:11.081Z",
10
10
  "tsrustVersion": "1.1.1",
11
11
  "binary": "smartvpn_daemon",
12
12
  "target": "linux_amd64_musl"
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "format": "tsrust.build-provenance.v2",
3
- "binarySha256": "8ae1a19ef3b0b11251a3af628ef1caaf7ff81d0c66b8033c32fccf8da4271e77",
3
+ "binarySha256": "0f394f849bbb515b3e59dc3766884d28fdc401289cc90d8dcb423398863bcc12",
4
4
  "buildInfo": {
5
5
  "projectName": "@push.rocks/smartvpn",
6
- "projectVersion": "2.7.1",
7
- "gitCommit": "d1bbbeaec9ed99d89334375aa615471c3f2615ef",
6
+ "projectVersion": "2.8.0",
7
+ "gitCommit": "ea2b91234508f2befa1ee7da1187bc343700617f",
8
8
  "gitDirty": false,
9
- "builtAt": "2026-10-26T21:50:58.538Z",
9
+ "builtAt": "2026-10-30T14:31:16.358Z",
10
10
  "tsrustVersion": "1.1.1",
11
11
  "binary": "smartvpn_daemon",
12
12
  "target": "linux_arm64_musl"
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@push.rocks/smartvpn',
6
- version: '2.7.1',
6
+ version: '2.8.0',
7
7
  description: 'A VPN solution with TypeScript control plane and Rust data plane daemon'
8
8
  };
9
9
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxzQkFBc0I7SUFDNUIsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLHlFQUF5RTtDQUN2RixDQUFBIn0=
@@ -1,4 +1,5 @@
1
1
  export * from './smartvpn.interfaces.js';
2
+ export { managedPreparationBoundMs } from './smartvpn.managedbounds.js';
2
3
  export { VpnBridge } from './smartvpn.classes.vpnbridge.js';
3
4
  export { VpnClient } from './smartvpn.classes.vpnclient.js';
4
5
  export { VpnServer } from './smartvpn.classes.vpnserver.js';
package/dist_ts/index.js CHANGED
@@ -1,8 +1,9 @@
1
1
  export * from './smartvpn.interfaces.js';
2
+ export { managedPreparationBoundMs } from './smartvpn.managedbounds.js';
2
3
  export { VpnBridge } from './smartvpn.classes.vpnbridge.js';
3
4
  export { VpnClient } from './smartvpn.classes.vpnclient.js';
4
5
  export { VpnServer } from './smartvpn.classes.vpnserver.js';
5
6
  export { VpnConfig } from './smartvpn.classes.vpnconfig.js';
6
7
  export { VpnInstaller } from './smartvpn.classes.vpninstaller.js';
7
8
  export { WgConfigGenerator } from './smartvpn.classes.wgconfig.js';
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM1RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDNUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzVELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM1RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDbEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUMifQ==
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM1RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDNUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzVELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM1RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDbEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUMifQ==
@@ -0,0 +1,10 @@
1
+ /**
2
+ * The sum of a managed tunnel preparation's two timed steps, in milliseconds: adding the split
3
+ * routes, then auditing the device that holds them, each ended by its own bound and by name.
4
+ * Creating and configuring the device runs before them in blocking ioctls with no bound of its own,
5
+ * so a caller's window is the only limit on that part. A
6
+ * caller arming its own window around `prepareManagedTunnel` keeps that window longer than this, so
7
+ * SmartVPN names a failed step before the window fires. A hub assignment update that lands during
8
+ * the preparation is applied before the prepare answers and is not covered.
9
+ */
10
+ export declare const managedPreparationBoundMs = 6000;
@@ -0,0 +1,11 @@
1
+ /**
2
+ * The sum of a managed tunnel preparation's two timed steps, in milliseconds: adding the split
3
+ * routes, then auditing the device that holds them, each ended by its own bound and by name.
4
+ * Creating and configuring the device runs before them in blocking ioctls with no bound of its own,
5
+ * so a caller's window is the only limit on that part. A
6
+ * caller arming its own window around `prepareManagedTunnel` keeps that window longer than this, so
7
+ * SmartVPN names a failed step before the window fires. A hub assignment update that lands during
8
+ * the preparation is applied before the prepare answers and is not covered.
9
+ */
10
+ export const managedPreparationBoundMs = 6000;
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnR2cG4ubWFuYWdlZGJvdW5kcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0dnBuLm1hbmFnZWRib3VuZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLENBQUMifQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@push.rocks/smartvpn",
3
- "version": "2.7.1",
3
+ "version": "2.8.0",
4
4
  "private": false,
5
5
  "description": "A VPN solution with TypeScript control plane and Rust data plane daemon",
6
6
  "type": "module",
package/readme.md CHANGED
@@ -214,7 +214,13 @@ starting. Keep the live client owner and use the returned generation for each st
214
214
  `prepareManagedTunnel(generation)` then creates that fresh nonpersistent TUN
215
215
  with `IFF_TUN_EXCL`, the assigned IPv4 /32 and exact split routes. The interface
216
216
  is UP; packet forwarding remains disabled. An existing same-named interface
217
- causes failure and is never adopted or deleted.
217
+ causes failure and is never adopted or deleted. Creating and configuring the device runs first, in blocking ioctls with no bound of its own, so a caller's window is the only limit on that part. The two timed steps after it take at most
218
+ `managedPreparationBoundMs` (6 seconds): adding the routes and auditing the device,
219
+ 3 seconds each, one after the other, and a step that overruns fails the prepare by
220
+ name (`Managed route creation timed out`, `Managed kernel inventory timed out`)
221
+ with the device and its routes gone. A caller that arms its own window around the
222
+ prepare keeps it longer than that bound. A hub assignment update that lands during
223
+ the prepare is applied before the reply and adds its own route and audit steps.
218
224
  3. Install and verify caller-owned policy against the fresh returned `runtime`.
219
225
  `enableManagedForwarding(generation)` reinspects the native inventory, discards
220
226
  already-ready incoming encrypted frames and TUN packets, then starts forwarding.
@@ -1185,6 +1191,7 @@ smartvpn/
1185
1191
  │ ├── smartvpn.interfaces.ts # Interfaces, types, IPC command maps
1186
1192
  │ ├── smartvpn.plugins.ts # Dependency imports
1187
1193
  │ ├── smartvpn.paths.ts # Binary path resolution
1194
+ │ ├── smartvpn.managedbounds.ts # Managed preparation bound (`managedPreparationBoundMs`)
1188
1195
  │ ├── smartvpn.classes.vpnserver.ts
1189
1196
  │ ├── smartvpn.classes.vpnclient.ts
1190
1197
  │ ├── smartvpn.classes.vpnbridge.ts
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@push.rocks/smartvpn',
6
- version: '2.7.1',
6
+ version: '2.8.0',
7
7
  description: 'A VPN solution with TypeScript control plane and Rust data plane daemon'
8
8
  }
package/ts/index.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from './smartvpn.interfaces.js';
2
+ export { managedPreparationBoundMs } from './smartvpn.managedbounds.js';
2
3
  export { VpnBridge } from './smartvpn.classes.vpnbridge.js';
3
4
  export { VpnClient } from './smartvpn.classes.vpnclient.js';
4
5
  export { VpnServer } from './smartvpn.classes.vpnserver.js';
@@ -0,0 +1,10 @@
1
+ /**
2
+ * The sum of a managed tunnel preparation's two timed steps, in milliseconds: adding the split
3
+ * routes, then auditing the device that holds them, each ended by its own bound and by name.
4
+ * Creating and configuring the device runs before them in blocking ioctls with no bound of its own,
5
+ * so a caller's window is the only limit on that part. A
6
+ * caller arming its own window around `prepareManagedTunnel` keeps that window longer than this, so
7
+ * SmartVPN names a failed step before the window fires. A hub assignment update that lands during
8
+ * the preparation is applied before the prepare answers and is not covered.
9
+ */
10
+ export const managedPreparationBoundMs = 6000;