the-wireguard-effect
Version:
Cross platform wireguard api client for nodejs built on wireguard-go with effect-ts
334 lines • 11.8 kB
JavaScript
/**
* Internet schemas for wireguard configuration.
*
* @since 1.0.0
*/
import * as Duration from "effect/Duration";
import * as Predicate from "effect/Predicate";
import * as Schema from "effect/Schema";
import * as SchemaGetter from "effect/SchemaGetter";
import { IPv4, IPv4Family, IPv6, IPv6Family, Port } from "effect-schemas/Internet";
import * as internal from "./internal/internetSchemas.js";
/**
* Transforms a `number` of seconds into a `Duration`.
*
* @since 1.0.0
* @category Schemas
*/
export const DurationFromSeconds = /*#__PURE__*/Schema.Int.pipe(/*#__PURE__*/Schema.decodeTo(Schema.Duration, {
decode: /*#__PURE__*/SchemaGetter.transform(Duration.seconds),
encode: /*#__PURE__*/SchemaGetter.transform(Duration.toSeconds)
}));
/**
* An IPv4 wireguard endpoint, which consists of an IPv4 address followed by a
* nat port then an optional local port. If only one port is provided, it is
* assumed that the nat port and listen port are the same.
*
* @since 1.0.0
* @category Schemas
* @example
* ```ts
*
* import * as assert from "node:assert";
*
* import * as Schema from "effect/Schema";
* import { IPv4Endpoint } from "the-wireguard-effect/InternetSchemas";
*
* const decodeEndpoint = Schema.decodeSync(IPv4Endpoint);
* const endpoint1 = decodeEndpoint("1.2.3.4:51820");
* const endpoint2 = decodeEndpoint("1.2.3.4:51820:41820");
*
* const endpoint3 = decodeEndpoint({
* ip: "1.2.3.4",
* port: 51820,
* family: "ipv4",
* });
*
* const endpoint4 = decodeEndpoint({
* ip: "1.2.3.4",
* natPort: 51820,
* listenPort: 41820,
* family: "ipv4",
* });
* ```;
*/
export const IPv4Endpoint = /*#__PURE__*/Schema.Union([Schema.Struct({
ip: Schema.String,
port: Schema.Number,
family: IPv4Family
}), Schema.Struct({
ip: Schema.String,
natPort: Schema.Number,
listenPort: Schema.Number,
family: IPv4Family
}), Schema.TemplateLiteral([Schema.String, Schema.Literal(":"), Schema.Number]), Schema.TemplateLiteral([Schema.String, Schema.Literal(":"), Schema.Number, Schema.Literal(":"), Schema.Number])]).pipe(/*#__PURE__*/Schema.decodeTo(/*#__PURE__*/Schema.Struct({
address: IPv4,
natPort: Port,
listenPort: Port
}), {
decode: /*#__PURE__*/SchemaGetter.transform(data => {
const isObjectInput = !Predicate.isString(data);
const [ip, natPort, listenPort] = isObjectInput ? [data.ip, "natPort" in data ? `${data.natPort}` : `${data.port}`, "listenPort" in data ? `${data.listenPort}` : undefined] : internal.splitLiteral(data, ":");
const natPortParsed = Number.parseInt(natPort, 10);
const listenPortParsed = Predicate.isNotUndefined(listenPort) ? Number.parseInt(listenPort, 10) : natPortParsed;
return {
address: ip,
natPort: natPortParsed,
listenPort: listenPortParsed
};
}),
encode: /*#__PURE__*/SchemaGetter.transform(({
address,
listenPort,
natPort
}) => `${address}:${natPort}:${listenPort}`)
}), /*#__PURE__*/Schema.annotate({
identifier: "IPv4Endpoint",
description: "An ipv4 wireguard endpoint"
}));
/**
* An IPv6 wireguard endpoint, which consists of an IPv6 address in square
* brackets followed by a nat port then an optional local port. If only one port
* is provided, it is assumed that the nat port and listen port are the same.
*
* @since 1.0.0
* @category Schemas
* @example
* ```ts
*
* import * as assert from "node:assert";
*
* import * as Schema from "effect/Schema";
* import { IPv6Endpoint } from "the-wireguard-effect/InternetSchemas";
*
* const decodeEndpoint = Schema.decodeSync(IPv6Endpoint);
* const endpoint1 = decodeEndpoint(
* "[2001:0db8:85a3:0000:0000:8a2e:0370:7334]:51820"
* );
* const endpoint2 = decodeEndpoint(
* "[2001:0db8:85a3:0000:0000:8a2e:0370:7334]:51820:41820"
* );
*
* const endpoint3 = decodeEndpoint({
* ip: "2001:0db8:85a3:0000:0000:8a2e:0370:7334",
* port: 51820,
* family: "ipv6",
* });
*
* const endpoint4 = decodeEndpoint({
* ip: "2001:0db8:85a3:0000:0000:8a2e:0370:7334",
* natPort: 51820,
* listenPort: 41820,
* family: "ipv6",
* });
* ```;
*/
export const IPv6Endpoint = /*#__PURE__*/Schema.Union([Schema.Struct({
ip: Schema.String,
port: Schema.Number,
family: IPv6Family
}), Schema.Struct({
ip: Schema.String,
natPort: Schema.Number,
listenPort: Schema.Number,
family: IPv6Family
}), Schema.TemplateLiteral([Schema.Literal("["), Schema.String, Schema.Literal("]"), Schema.Literal(":"), Schema.Number]), Schema.TemplateLiteral([Schema.Literal("["), Schema.String, Schema.Literal("]"), Schema.Literal(":"), Schema.Number, Schema.Literal(":"), Schema.Number])]).pipe(/*#__PURE__*/Schema.decodeTo(/*#__PURE__*/Schema.Struct({
address: IPv6,
natPort: Port,
listenPort: Port
}), {
decode: /*#__PURE__*/SchemaGetter.transform(data => {
const isObjectInput = !Predicate.isString(data);
const [ip, natPort, listenPort] = isObjectInput ? [data.ip, "natPort" in data ? `${data.natPort}` : `${data.port}`, "listenPort" in data ? `${data.listenPort}` : undefined] : [internal.splitLiteral(data, "]")[0].slice(1), ...internal.tail(internal.splitLiteral(internal.splitLiteral(data, "]")[1], ":"))];
const natPortParsed = Number.parseInt(natPort, 10);
const listenPortParsed = Predicate.isNotUndefined(listenPort) ? Number.parseInt(listenPort, 10) : natPortParsed;
return {
address: ip.slice(1),
natPort: natPortParsed,
listenPort: listenPortParsed
};
}),
encode: /*#__PURE__*/SchemaGetter.transform(({
address,
listenPort,
natPort
}) => `[${address}]:${natPort}:${listenPort}`)
}), /*#__PURE__*/Schema.annotate({
identifier: "IPv6Endpoint",
description: "An ipv6 wireguard endpoint"
}));
/**
* A hostname wireguard endpoint, which consists of a hostname followed by a\
* Nat port then an optional local port. If only one port is provided, it is
* assumed that the nat port and listen port are the same.
*
* @since 1.0.0
* @category Schemas
*/
export const HostnameEndpoint = /*#__PURE__*/Schema.Union([Schema.Struct({
host: Schema.String,
port: Schema.Number
}), Schema.Struct({
host: Schema.String,
natPort: Schema.Number,
listenPort: Schema.Number
}), Schema.TemplateLiteral([Schema.String, Schema.Literal(":"), Schema.Number]), Schema.TemplateLiteral([Schema.String, Schema.Literal(":"), Schema.Number, Schema.Literal(":"), Schema.Number])]).pipe(/*#__PURE__*/Schema.decodeTo(/*#__PURE__*/Schema.Struct({
host: Schema.String,
natPort: Port,
listenPort: Port
}), {
decode: /*#__PURE__*/SchemaGetter.transform(data => {
const isObjectInput = !Predicate.isString(data);
const [host, natPort, listenPort] = isObjectInput ? [data.host, "natPort" in data ? `${data.natPort}` : `${data.port}`, "listenPort" in data ? `${data.listenPort}` : undefined] : internal.splitLiteral(data, ":");
const natPortParsed = Number.parseInt(natPort, 10);
const listenPortParsed = Predicate.isNotUndefined(listenPort) ? Number.parseInt(listenPort, 10) : natPortParsed;
return {
host,
natPort: natPortParsed,
listenPort: listenPortParsed
};
}),
encode: /*#__PURE__*/SchemaGetter.transform(({
host,
listenPort,
natPort
}) => `${host}:${natPort}:${listenPort}`)
}), /*#__PURE__*/Schema.annotate({
identifier: "HostnameEndpoint",
description: "A hostname endpoint"
}));
/**
* A wireguard endpoint, which is either an IPv4 or IPv6 endpoint.
*
* @since 1.0.0
* @category Schemas
* @example
* import * as Schema from "effect/Schema";
*
* import { Endpoint } from "the-wireguard-effect/InternetSchemas";
*
* const decodeEndpoint = Schema.decodeSync(Endpoint);
* const endpoint1 = decodeEndpoint("1.2.3.4:51820");
* const endpoint2 = decodeEndpoint("1.2.3.4:51820:41820");
*
* const endpoint3 = decodeEndpoint({
* ip: "1.2.3.4",
* port: 51820,
* family: "ipv4",
* });
*
* const endpoint4: Endpoint = decodeEndpoint({
* ip: "1.2.3.4",
* natPort: 51820,
* listenPort: 41820,
* family: "ipv4",
* });
*
* const endpoint5 = decodeEndpoint(
* "[2001:0db8:85a3:0000:0000:8a2e:0370:7334]:51820"
* );
* const endpoint6 = decodeEndpoint(
* "[2001:0db8:85a3:0000:0000:8a2e:0370:7334]:51820:41820"
* );
*
* const endpoint7 = decodeEndpoint({
* ip: "2001:0db8:85a3:0000:0000:8a2e:0370:7334",
* port: 51820,
* family: "ipv6",
* });
*
* const endpoint8: Endpoint = decodeEndpoint({
* ip: "2001:0db8:85a3:0000:0000:8a2e:0370:7334",
* natPort: 51820,
* listenPort: 41820,
* family: "ipv6",
* });
* ```;
*/
export const Endpoint = /*#__PURE__*/Schema.Union([IPv4Endpoint, IPv6Endpoint, HostnameEndpoint]).annotate({
identifier: "Endpoint",
description: "An ipv4, ipv6, or hostname wireguard endpoint"
});
/**
* A wireguard setup data, which consists of an endpoint followed by an address.
*
* @since 1.0.0
* @category Schemas
* @example
* import * as Schema from "effect/Schema";
* import { SetupData } from "the-wireguard-effect/InternetSchemas";
*
* const decodeSetupData = Schema.decodeSync(SetupData);
* const setupData = decodeSetupData(["1.1.1.1:51280", "10.0.0.1"]);
* ```;
*/
export const IPv4SetupData = /*#__PURE__*/Schema.Tuple([IPv4Endpoint, IPv4]).annotate({
identifier: "SetupData",
description: "A wireguard setup data"
});
/**
* A wireguard setup data, which consists of an endpoint followed by an address.
*
* @since 1.0.0
* @category Schemas
* @example
* import * as Schema from "effect/Schema";
* import { SetupData } from "the-wireguard-effect/InternetSchemas";
*
* const decodeSetupData = Schema.decodeSync(SetupData);
* const setupData = decodeSetupData(["1.1.1.1:51280", "10.0.0.1"]);
* ```;
*/
export const IPv6SetupData = /*#__PURE__*/Schema.Tuple([IPv6Endpoint, IPv6]).annotate({
identifier: "SetupData",
description: "A wireguard setup data"
});
/**
* A wireguard setup data, which consists of an endpoint followed by an address.
*
* @since 1.0.0
* @category Schemas
* @see {@link IPv4}
* @see {@link HostnameEndpoint}
*/
export const HostnameIPv4SetupData = /*#__PURE__*/Schema.Tuple([HostnameEndpoint, IPv4]).annotate({
identifier: "HostnameIPv4SetupData",
description: "A wireguard hostname+ipv4 setup data"
});
/**
* A wireguard setup data, which consists of an endpoint followed by an address.
*
* @since 1.0.0
* @category Schemas
* @see {@link IPv6}
* @see {@link HostnameEndpoint}
*/
export const HostnameIPv6SetupData = /*#__PURE__*/Schema.Tuple([HostnameEndpoint, IPv6]).annotate({
identifier: "HostnameIPv6SetupData",
description: "A wireguard hostname+ipv6 setup data"
});
/**
* A wireguard setup data, which consists of an endpoint followed by an address.
*
* @since 1.0.0
* @category Schemas
* @example
* ```ts
*
* import * as assert from "node:assert";
*
* import * as Schema from "effect/Schema";
* import { SetupData } from "the-wireguard-effect/InternetSchemas";
*
* const decodeSetupData = Schema.decodeSync(SetupData);
* const setupData = decodeSetupData(["1.1.1.1:51280", "10.0.0.1"]);
* ```;
*
* @see {@link Address}
* @see {@link Endpoint}
*/
export const SetupData = /*#__PURE__*/Schema.Union([IPv4SetupData, IPv6SetupData, HostnameIPv4SetupData, HostnameIPv6SetupData]).annotate({
identifier: "SetupData",
description: "A wireguard setup data"
});
//# sourceMappingURL=InternetSchemas.js.map