@push.rocks/smartvpn 2.8.0 → 2.9.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": "99bac3443522361425a0f038061de8764c0cdaa5aae7bc0a81ff978b7743e86a",
3
+ "binarySha256": "6f189c85064794e0625daa15dafee56108b2b354d063074b01faf490d082924d",
4
4
  "buildInfo": {
5
5
  "projectName": "@push.rocks/smartvpn",
6
- "projectVersion": "2.8.0",
7
- "gitCommit": "ea2b91234508f2befa1ee7da1187bc343700617f",
6
+ "projectVersion": "2.9.0",
7
+ "gitCommit": "f5a88206348a42607b8f5a6dbebcc671b72c0955",
8
8
  "gitDirty": false,
9
- "builtAt": "2026-10-30T14:29:11.081Z",
9
+ "builtAt": "2026-10-30T16:45:58.106Z",
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": "0f394f849bbb515b3e59dc3766884d28fdc401289cc90d8dcb423398863bcc12",
3
+ "binarySha256": "c435ade4e374e11885ca40d2c1eb16a0f09238f7de0e299e6941ea5f633399bf",
4
4
  "buildInfo": {
5
5
  "projectName": "@push.rocks/smartvpn",
6
- "projectVersion": "2.8.0",
7
- "gitCommit": "ea2b91234508f2befa1ee7da1187bc343700617f",
6
+ "projectVersion": "2.9.0",
7
+ "gitCommit": "f5a88206348a42607b8f5a6dbebcc671b72c0955",
8
8
  "gitDirty": false,
9
- "builtAt": "2026-10-30T14:31:16.358Z",
9
+ "builtAt": "2026-10-30T16:48:03.847Z",
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.8.0',
6
+ version: '2.9.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,5 +1,5 @@
1
1
  export * from './smartvpn.interfaces.js';
2
- export { managedPreparationBoundMs } from './smartvpn.managedbounds.js';
2
+ export { managedInspectionBoundMs, managedPreparationBoundMs } from './smartvpn.managedbounds.js';
3
3
  export { VpnBridge } from './smartvpn.classes.vpnbridge.js';
4
4
  export { VpnClient } from './smartvpn.classes.vpnclient.js';
5
5
  export { VpnServer } from './smartvpn.classes.vpnserver.js';
package/dist_ts/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  export * from './smartvpn.interfaces.js';
2
- export { managedPreparationBoundMs } from './smartvpn.managedbounds.js';
2
+ export { managedInspectionBoundMs, managedPreparationBoundMs } from './smartvpn.managedbounds.js';
3
3
  export { VpnBridge } from './smartvpn.classes.vpnbridge.js';
4
4
  export { VpnClient } from './smartvpn.classes.vpnclient.js';
5
5
  export { VpnServer } from './smartvpn.classes.vpnserver.js';
6
6
  export { VpnConfig } from './smartvpn.classes.vpnconfig.js';
7
7
  export { VpnInstaller } from './smartvpn.classes.vpninstaller.js';
8
8
  export { WgConfigGenerator } from './smartvpn.classes.wgconfig.js';
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM1RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDNUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzVELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM1RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDbEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUMifQ==
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2xHLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM1RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDNUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzVELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM1RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDbEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUMifQ==
@@ -1,10 +1,19 @@
1
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.
2
+ * The longest a `prepareManagedTunnel` takes to answer in its timed steps, in milliseconds: adding
3
+ * the split routes and auditing the device that holds them, then, for a hub assignment update that
4
+ * landed during them, moving the routes and auditing again. Each step takes at most 3 seconds and
5
+ * ends by its own bound. A prepare applies the assignment in force once, however many updates
6
+ * landed, then answers; an update that lands after that is applied after the answer, before the
7
+ * next command. Creating and configuring the device runs before these steps in blocking ioctls with
8
+ * no bound of its own, so a caller's window is the only limit on that part. A caller arming its own
9
+ * window around the prepare keeps that window longer than this, so SmartVPN's bound fires first.
9
10
  */
10
- export declare const managedPreparationBoundMs = 6000;
11
+ export declare const managedPreparationBoundMs = 12000;
12
+ /**
13
+ * The longest an `inspectManagedSession` of a device waits for its audit, in milliseconds. A caller
14
+ * that inspects inside its own window adds this to what the window holds. It does not cover an
15
+ * update still unapplied when the inspection arrives, whose reassignment and audit run first: the
16
+ * sum of a prepare's bound and this one holds one reassignment, and each further update adds its
17
+ * own reassignment and audit.
18
+ */
19
+ export declare const managedInspectionBoundMs = 4000;
@@ -1,11 +1,20 @@
1
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.
2
+ * The longest a `prepareManagedTunnel` takes to answer in its timed steps, in milliseconds: adding
3
+ * the split routes and auditing the device that holds them, then, for a hub assignment update that
4
+ * landed during them, moving the routes and auditing again. Each step takes at most 3 seconds and
5
+ * ends by its own bound. A prepare applies the assignment in force once, however many updates
6
+ * landed, then answers; an update that lands after that is applied after the answer, before the
7
+ * next command. Creating and configuring the device runs before these steps in blocking ioctls with
8
+ * no bound of its own, so a caller's window is the only limit on that part. A caller arming its own
9
+ * window around the prepare keeps that window longer than this, so SmartVPN's bound fires first.
9
10
  */
10
- export const managedPreparationBoundMs = 6000;
11
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnR2cG4ubWFuYWdlZGJvdW5kcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0dnBuLm1hbmFnZWRib3VuZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLENBQUMifQ==
11
+ export const managedPreparationBoundMs = 12000;
12
+ /**
13
+ * The longest an `inspectManagedSession` of a device waits for its audit, in milliseconds. A caller
14
+ * that inspects inside its own window adds this to what the window holds. It does not cover an
15
+ * update still unapplied when the inspection arrives, whose reassignment and audit run first: the
16
+ * sum of a prepare's bound and this one holds one reassignment, and each further update adds its
17
+ * own reassignment and audit.
18
+ */
19
+ export const managedInspectionBoundMs = 4000;
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnR2cG4ubWFuYWdlZGJvdW5kcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3NtYXJ0dnBuLm1hbmFnZWRib3VuZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsS0FBSyxDQUFDO0FBRS9DOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLElBQUksQ0FBQyJ9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@push.rocks/smartvpn",
3
- "version": "2.8.0",
3
+ "version": "2.9.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,13 +214,21 @@ 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. 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.
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 timed steps after it take at most
218
+ `managedPreparationBoundMs` (12 seconds), 3 seconds each, one after the other:
219
+ adding the routes, auditing the device and, for a hub assignment update that landed
220
+ during those two, moving the routes and auditing again. A prepare applies the
221
+ assignment in force once, however many updates landed, then answers; an update that
222
+ lands after that is applied after the answer and before the next command, which
223
+ waits for its reassignment and audit. A step of the first two that overruns fails
224
+ the prepare by name (`Managed route creation timed out`, `Managed kernel inventory
225
+ timed out`) with the device and its routes gone. One of the last two retires the
226
+ runtime and the session with it: the prepare is rejected with `Managed session owner
227
+ closed before replying`, and the step's name is in the `retired` event's reason. A
228
+ caller that arms its own window around the prepare keeps it longer than that bound,
229
+ and adds `managedInspectionBoundMs` (4 seconds) for each inspection it runs in that
230
+ window. That sum holds one reassignment: each further update adds its own
231
+ reassignment and audit.
224
232
  3. Install and verify caller-owned policy against the fresh returned `runtime`.
225
233
  `enableManagedForwarding(generation)` reinspects the native inventory, discards
226
234
  already-ready incoming encrypted frames and TUN packets, then starts forwarding.
@@ -1191,7 +1199,7 @@ smartvpn/
1191
1199
  │ ├── smartvpn.interfaces.ts # Interfaces, types, IPC command maps
1192
1200
  │ ├── smartvpn.plugins.ts # Dependency imports
1193
1201
  │ ├── smartvpn.paths.ts # Binary path resolution
1194
- │ ├── smartvpn.managedbounds.ts # Managed preparation bound (`managedPreparationBoundMs`)
1202
+ │ ├── smartvpn.managedbounds.ts # Managed preparation and inspection bounds
1195
1203
  │ ├── smartvpn.classes.vpnserver.ts
1196
1204
  │ ├── smartvpn.classes.vpnclient.ts
1197
1205
  │ ├── smartvpn.classes.vpnbridge.ts
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@push.rocks/smartvpn',
6
- version: '2.8.0',
6
+ version: '2.9.0',
7
7
  description: 'A VPN solution with TypeScript control plane and Rust data plane daemon'
8
8
  }
package/ts/index.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export * from './smartvpn.interfaces.js';
2
- export { managedPreparationBoundMs } from './smartvpn.managedbounds.js';
2
+ export { managedInspectionBoundMs, managedPreparationBoundMs } from './smartvpn.managedbounds.js';
3
3
  export { VpnBridge } from './smartvpn.classes.vpnbridge.js';
4
4
  export { VpnClient } from './smartvpn.classes.vpnclient.js';
5
5
  export { VpnServer } from './smartvpn.classes.vpnserver.js';
@@ -1,10 +1,20 @@
1
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.
2
+ * The longest a `prepareManagedTunnel` takes to answer in its timed steps, in milliseconds: adding
3
+ * the split routes and auditing the device that holds them, then, for a hub assignment update that
4
+ * landed during them, moving the routes and auditing again. Each step takes at most 3 seconds and
5
+ * ends by its own bound. A prepare applies the assignment in force once, however many updates
6
+ * landed, then answers; an update that lands after that is applied after the answer, before the
7
+ * next command. Creating and configuring the device runs before these steps in blocking ioctls with
8
+ * no bound of its own, so a caller's window is the only limit on that part. A caller arming its own
9
+ * window around the prepare keeps that window longer than this, so SmartVPN's bound fires first.
9
10
  */
10
- export const managedPreparationBoundMs = 6000;
11
+ export const managedPreparationBoundMs = 12000;
12
+
13
+ /**
14
+ * The longest an `inspectManagedSession` of a device waits for its audit, in milliseconds. A caller
15
+ * that inspects inside its own window adds this to what the window holds. It does not cover an
16
+ * update still unapplied when the inspection arrives, whose reassignment and audit run first: the
17
+ * sum of a prepare's bound and this one holds one reassignment, and each further update adds its
18
+ * own reassignment and audit.
19
+ */
20
+ export const managedInspectionBoundMs = 4000;