/** * Tools to help generate wireguard configs for common situations. * * @since 1.0.0 */ import type * as ParseResult from "effect/ParseResult"; import * as InternetSchemas from "effect-schemas/Internet"; import * as Array from "effect/Array"; import * as Effect from "effect/Effect"; import * as Record from "effect/Record"; import * as Schema from "effect/Schema"; import * as WireguardInternetSchemas from "./InternetSchemas.ts"; import * as WireguardConfig from "./WireguardConfig.ts"; import * as WireguardErrors from "./WireguardErrors.ts"; import * as WireguardKey from "./WireguardKey.ts"; /** A node in the network can either have an ipv4 or ipv6 address. */ type WireguardIPv4RoamingPeer = Schema.Schema.Type; type WireguardIPv6RoamingPeer = Schema.Schema.Type; type WireguardRoamingPeer = WireguardIPv4RoamingPeer | WireguardIPv6RoamingPeer; /** * A server in the network can either have an ipv4 address pool or ipv6 address * pool. */ type WireguardIPv4Server = Schema.Schema.Type | Schema.Schema.Type; type WireguardIPv6Server = Schema.Schema.Type | Schema.Schema.Type; type WireguardServer = WireguardIPv4Server | WireguardIPv6Server; /** * Every node in the network must have a public+private key pair and possibly a * preshare key as well. */ type Keys = { publicKey: WireguardKey.WireguardKey; privateKey: WireguardKey.WireguardKey; preshareKey?: WireguardKey.WireguardKey; }; /** * The nodes in the network must be homogeneous (either all ipv4 or all ipv6). * If you want dual stack, you must have two separate networks. */ type WireguardIPv4Node = WireguardIPv4Server | WireguardIPv4RoamingPeer; type WireguardIPv6Node = WireguardIPv6Server | WireguardIPv6RoamingPeer; /** * Base layer containing just the nodes in the network. * * @since 1.0.0 * @category WireguardGenerate */ export type NodesLayer] | readonly [node1: WireguardIPv6Node, node2: WireguardIPv6Node, ...rest: Array]> = { nodes: Nodes; wireguardNetworkCidr: Nodes[0] extends WireguardIPv4Node ? InternetSchemas.IPv4CidrBlock : Nodes[0] extends WireguardIPv6Node ? InternetSchemas.IPv6CidrBlock : never; }; /** * Layer containing the keys for each node in the network. * * @since 1.0.0 * @category WireguardGenerate */ export type keysLayer] | readonly [node1: WireguardIPv6Node, node2: WireguardIPv6Node, ...rest: Array]> = NodesLayer & { keys: Record.ReadonlyRecord["ip"] | Extract[1]["ip"], Keys>; }; /** * Layer containing the connections for each node in the network. * * @since 1.0.0 * @category WireguardGenerate */ export type ConnectionsLayer] | readonly [node1: WireguardIPv6Node, node2: WireguardIPv6Node, ...rest: Array]> = keysLayer & { connections: Record.ReadonlyRecord["ip"] | Extract[1]["ip"], Array.NonEmptyReadonlyArray["ip"] | Extract[1]["ip"]>>; }; /** * Layer containing the allowed IPs for each node in the network. * * @since 1.0.0 * @category WireguardGenerate */ export type AllowedIPsLayer] | readonly [node1: WireguardIPv6Node, node2: WireguardIPv6Node, ...rest: Array]> = ConnectionsLayer & { allowedIPs: Record.ReadonlyRecord["ip"] | Extract[1]["ip"], Array.NonEmptyReadonlyArray<{ block: Schema.Schema.Encoded; from: Extract["ip"] | Extract[1]["ip"]; }>>; }; /** * The final network type. * * @since 1.0.0 * @category WireguardGenerate */ export type WireguardNetwork] | readonly [node1: WireguardIPv6Node, node2: WireguardIPv6Node, ...rest: Array]> = AllowedIPsLayer; /** * Generates private+public keys for all nodes in the network. * * @since 1.0.0 * @category Key Transformers */ export declare const generateKeys: ] | readonly [node1: WireguardIPv6Node, node2: WireguardIPv6Node, ...rest: Array]>(nodesLayer: NodesLayer) => keysLayer; /** * Generates preshare keys for all nodes in the network. * * @since 1.0.0 * @category Key Transformers */ export declare const addPreshareKeys: ] | readonly [node1: WireguardIPv6Node, node2: WireguardIPv6Node, ...rest: Array]>(keysLayer: keysLayer) => keysLayer; /** * Generates connections in a star pattern for all nodes in the network. * * @since 1.0.0 * @category Connection Transformers */ export declare const generateStarConnections: ] | readonly [node1: WireguardIPv6Node, node2: WireguardIPv6Node, ...rest: Array]>(keysLayer: keysLayer) => ConnectionsLayer; /** * Generates connections in a hub and spoke pattern for all nodes in the * network. * * @since 1.0.0 * @category Connection Transformers */ export declare const generateHubAndSpokeConnections: ] | readonly [node1: WireguardIPv6Node, node2: WireguardIPv6Node, ...rest: Array]>(keysLayer: keysLayer) => ConnectionsLayer; /** * Adds a direct connection between two nodes in the network. * * @since 1.0.0 * @category Connection Transformers */ export declare const addConnection: (] | readonly [node1: WireguardIPv6Node, node2: WireguardIPv6Node, ...rest: Array]>(from: Extract["ip"] | Extract[1]["ip"], to: Extract["ip"] | Extract[1]["ip"]) => (connectionsLayer: ConnectionsLayer) => ConnectionsLayer) & (] | readonly [node1: WireguardIPv6Node, node2: WireguardIPv6Node, ...rest: Array]>(connectionsLayer: ConnectionsLayer, from: Extract["ip"] | Extract[1]["ip"], to: Extract["ip"] | Extract[1]["ip"]) => ConnectionsLayer); /** * Generates the allowed IPs for each node in the network based on the * connections is has to the other nodes. * * @since 1.0.0 * @category AllowedIPs Transformers */ export declare const computeAllowedIPsFromConnections: ] | readonly [node1: WireguardIPv6Node, node2: WireguardIPv6Node, ...rest: Array]>(connectionsLayer: ConnectionsLayer) => AllowedIPsLayer; /** * Adds an allowed IP to a node in the network. * * @since 1.0.0 * @category AllowedIPs Transformers */ export declare const addAllowedIPs: (] | readonly [node1: WireguardIPv6Node, node2: WireguardIPv6Node, ...rest: Array]>(nodeToIp: Extract["ip"] | Extract[1]["ip"], nodeFromIp: Extract["ip"] | Extract[1]["ip"], cidrs: Array.NonEmptyReadonlyArray>) => (allowedIPsLayer: AllowedIPsLayer) => AllowedIPsLayer) & (] | readonly [node1: WireguardIPv6Node, node2: WireguardIPv6Node, ...rest: Array]>(allowedIPsLayer: AllowedIPsLayer, nodeToIp: Extract["ip"] | Extract[1]["ip"], nodeFromIp: Extract["ip"] | Extract[1]["ip"], cidrs: Array.NonEmptyReadonlyArray>) => AllowedIPsLayer); /** * Converts a network into configs. * * @since 1.0.0 * @category Generator */ export declare const toConfigs: ] | readonly [node1: WireguardIPv6Node, node2: WireguardIPv6Node, ...rest: Array]>({ allowedIPs, connections, keys, nodes, wireguardNetworkCidr, }: WireguardNetwork) => Effect.Effect], ParseResult.ParseError | WireguardErrors.WireguardError, never>; /** * Use your phone or computer to remotely access just the wireguard server. * * @since 1.0.0 * @category Generators */ export declare const generateRemoteAccessToServer: (options: { nodes: Nodes; wireguardNetworkCidr: NetworkCidr; }) => WireguardNetwork; /** * Builds on "Remote access to server", allowing you to access your entire LAN * as well. * * @since 1.0.0 * @category Generators */ export declare const generateRemoteAccessToLan: : Nodes[0] extends WireguardIPv6Server ? InternetSchemas.IPv6CidrBlock | Array.NonEmptyArray : never>(options: { nodes: Nodes; wireguardNetworkCidr: NetworkCidr1; lanNetworkCidr: NetworkCidr2; }) => WireguardNetwork; /** * Allows two servers to connect to each other. * * @since 1.0.0 * @category Generators */ export declare const generateServerToServerAccess: (options: { nodes: Nodes; wireguardNetworkCidr: NetworkCidr; }) => WireguardNetwork; /** * Builds on "Server to server access", allowing two entire networks to * communicate. * * @since 1.0.0 * @category Generators */ export declare const generateLanToLanAccess: : Nodes[0] extends WireguardIPv6Server ? InternetSchemas.IPv6CidrBlock | Array.NonEmptyArray : never, NetworkCidr3 extends Nodes[1] extends WireguardIPv4Server ? InternetSchemas.IPv4CidrBlock | Array.NonEmptyArray : Nodes[1] extends WireguardIPv6Server ? InternetSchemas.IPv6CidrBlock | Array.NonEmptyArray : never>(options: { nodes: Nodes; server1Lan: NetworkCidr2; server2Lan: NetworkCidr3; wireguardNetworkCidr: NetworkCidr1; }) => WireguardNetwork; /** * Builds on "Remote access to server", except that all of the VPN clients can * connect to each other as well. Note: all traffic between nodes must pass * through the server. * * @since 1.0.0 * @category Generators */ export declare const generateServerHubAndSpokeAccess: ] | readonly [server: WireguardIPv6Server, ...nodes: Array.NonEmptyReadonlyArray], NetworkCidr extends Nodes[0] extends WireguardIPv4Node ? InternetSchemas.IPv4CidrBlock : Nodes[0] extends WireguardIPv6Node ? InternetSchemas.IPv6CidrBlock : never>(options: { nodes: Nodes; wireguardNetworkCidr: NetworkCidr; }) => WireguardNetwork; /** * Builds on "Server hub and spoke access", allowing you to access your entire * LAN as well. * * @since 1.0.0 * @category Generators */ export declare const generateLanHubAndSpokeAccess: ] | readonly [server: WireguardIPv6Server, ...nodes: Array.NonEmptyReadonlyArray], NetworkCidr extends Nodes[0] extends WireguardIPv4Node ? InternetSchemas.IPv4CidrBlock : Nodes[0] extends WireguardIPv6Node ? InternetSchemas.IPv6CidrBlock : never, NetworkCidr2 extends Nodes[0] extends WireguardIPv4Server ? InternetSchemas.IPv4CidrBlock | Array.NonEmptyArray : Nodes[0] extends WireguardIPv6Server ? InternetSchemas.IPv6CidrBlock | Array.NonEmptyArray : never>(options: { nodes: Nodes; lanNetworkCidr: NetworkCidr2; wireguardNetworkCidr: NetworkCidr; }) => WireguardNetwork; /** * Route specific traffic through a commercial WireGuard VPN provider. * * @since 1.0.0 * @category Generators */ export declare const generateVpnTunneledAccess: (options: { nodes: Nodes; wireguardNetworkCidr: NetworkCidr; }) => WireguardNetwork; /** * Securely access the Internet from untrusted networks by routing all of your * traffic through the VPN and out the server's internet connection. * * @since 1.0.0 * @category Generators */ export declare const generateRemoteTunneledAccess: : Nodes[0] extends WireguardIPv6Server ? InternetSchemas.IPv6CidrBlock | Array.NonEmptyArray : never>(options: { nodes: Nodes; lanNetworkCidr: NetworkCidr2; wireguardNetworkCidr: NetworkCidr1; }) => WireguardNetwork; export {}; //# sourceMappingURL=WireguardGenerate.d.ts.map