the-moby-effect
Version:
Moby/Docker API client built using effect-ts
220 lines • 8.6 kB
JavaScript
import * as Context from "effect/Context";
import * as Effect from "effect/Effect";
import * as Layer from "effect/Layer";
import * as Schema from "effect/Schema";
import * as SchemaGetter from "effect/SchemaGetter";
import * as HttpClient from "effect/unstable/http/HttpClient";
import * as HttpApi from "effect/unstable/httpapi/HttpApi";
import * as HttpApiClient from "effect/unstable/httpapi/HttpApiClient";
import * as HttpApiEndpoint from "effect/unstable/httpapi/HttpApiEndpoint";
import * as HttpApiGroup from "effect/unstable/httpapi/HttpApiGroup";
import * as HttpApiSchema from "effect/unstable/httpapi/HttpApiSchema";
import { MobyConnectionOptions } from "../../MobyConnection.js";
import { makeAgnosticHttpClientLayer } from "../../MobyPlatforms.js";
import { NetworkConnectOptions, NetworkCreateRequest, NetworkInspect } from "../generated/index.js";
import { ContainerIdentifier, NetworkIdentifier } from "../schemas/id.js";
import { DockerError } from "./circular.js";
import { BadRequest, Forbidden, InternalServerError, NotFound } from "./errors.js";
import { BooleanFilter, StringFilter } from "./filters.js";
/** @since 1.0.0 */
export const ListFilters = /*#__PURE__*/Schema.fromJsonString(/*#__PURE__*/Schema.Struct({
dangling: /*#__PURE__*/Schema.optional(/*#__PURE__*/BooleanFilter("dangling")),
driver: /*#__PURE__*/Schema.optional(/*#__PURE__*/Schema.Array(Schema.String)),
id: /*#__PURE__*/Schema.optional(/*#__PURE__*/Schema.Array(Schema.String)),
label: /*#__PURE__*/Schema.optional(/*#__PURE__*/Schema.Array(Schema.String)),
name: /*#__PURE__*/Schema.optional(/*#__PURE__*/Schema.Array(Schema.String)),
scope: /*#__PURE__*/Schema.optional(/*#__PURE__*/Schema.Array(Schema.String)),
type: /*#__PURE__*/Schema.optional(/*#__PURE__*/Schema.Tuple([Schema.Literals(["custom", "builtin"])]).pipe(/*#__PURE__*/Schema.decodeTo(/*#__PURE__*/Schema.Literals(["custom", "builtin"]), {
decode: /*#__PURE__*/SchemaGetter.transform(([value]) => value),
encode: /*#__PURE__*/SchemaGetter.transform(value => [value])
})))
}));
/** @since 1.0.0 */
export const PruneFilters = /*#__PURE__*/Schema.fromJsonString(/*#__PURE__*/Schema.Struct({
label: /*#__PURE__*/Schema.optional(/*#__PURE__*/Schema.Array(Schema.String)),
until: /*#__PURE__*/Schema.optional(StringFilter)
}));
/** @see https://docs.docker.com/reference/api/engine/latest/#tag/Network/operation/NetworkList */
const listNetworksEndpoint = /*#__PURE__*/HttpApiEndpoint.get("list", "/", {
query: {
filters: /*#__PURE__*/Schema.optional(ListFilters)
},
success: /*#__PURE__*/Schema.Array(NetworkInspect),
// 200 OK
error: [InternalServerError]
});
/** @see https://docs.docker.com/reference/api/engine/latest/#tag/Network/operation/NetworkInspect */
const inspectNetworkEndpoint = /*#__PURE__*/HttpApiEndpoint.get("inspect", "/:id", {
params: {
id: Schema.String
},
query: {
verbose: /*#__PURE__*/Schema.optional(Schema.Boolean),
scope: /*#__PURE__*/Schema.optional(Schema.String)
},
success: NetworkInspect,
// 200 OK
error: [NotFound,
// 404 No such network
InternalServerError]
});
/** @see https://docs.docker.com/reference/api/engine/latest/#tag/Network/operation/NetworkDelete */
const deleteNetworkEndpoint = /*#__PURE__*/HttpApiEndpoint.delete("delete", "/:id", {
params: {
id: Schema.String
},
success: HttpApiSchema.NoContent,
// 204 No Content
error: [Forbidden,
// 403 Not supported for pre-defined networks
NotFound,
// 404 No such network
InternalServerError]
});
/** @see https://docs.docker.com/reference/api/engine/latest/#tag/Network/operation/NetworkCreate */
const createNetworkEndpoint = /*#__PURE__*/HttpApiEndpoint.post("create", "/create", {
payload: NetworkCreateRequest,
success: /*#__PURE__*/Schema.Struct({
Id: NetworkIdentifier
}).pipe(/*#__PURE__*/HttpApiSchema.status(201)),
// 201 Created
error: [BadRequest,
// 400 Bad parameter
Forbidden,
// 403 Forbidden operation
NotFound,
// 404 Plugin not found
InternalServerError]
});
/** @see https://docs.docker.com/reference/api/engine/latest/#tag/Network/operation/NetworkConnect */
const connectNetworkEndpoint = /*#__PURE__*/HttpApiEndpoint.post("connect", "/:id/connect", {
params: {
id: Schema.String
},
payload: NetworkConnectOptions,
success: /*#__PURE__*/HttpApiSchema.Empty(200),
// 200 OK
error: [BadRequest,
// 400 Bad parameter
Forbidden,
// 403 Forbidden operation
NotFound,
// 404 Plugin not found
InternalServerError]
});
/** @see https://docs.docker.com/reference/api/engine/latest/#tag/Network/operation/NetworkDisconnect */
const disconnectNetworkEndpoint = /*#__PURE__*/HttpApiEndpoint.post("disconnect", "/:id/disconnect", {
params: {
id: Schema.String
},
payload: /*#__PURE__*/Schema.Struct({
Container: ContainerIdentifier,
Force: Schema.Boolean
}),
success: /*#__PURE__*/HttpApiSchema.Empty(200),
// 200 OK
error: [Forbidden,
// 403 Forbidden operation
NotFound,
// 404 Plugin not found
InternalServerError]
});
/** @see https://docs.docker.com/reference/api/engine/latest/#tag/Network/operation/NetworkPrune */
const pruneNetworkEndpoint = /*#__PURE__*/HttpApiEndpoint.post("prune", "/prune", {
query: {
filters: /*#__PURE__*/Schema.optional(PruneFilters)
},
success: /*#__PURE__*/Schema.Struct({
NetworksDeleted: /*#__PURE__*/Schema.NullishOr(/*#__PURE__*/Schema.Array(Schema.String))
}),
// 200 OK
error: [InternalServerError]
});
/** @see https://docs.docker.com/reference/api/engine/latest/#tag/Network */
const NetworksGroup = /*#__PURE__*/HttpApiGroup.make("networks").add(listNetworksEndpoint, createNetworkEndpoint, inspectNetworkEndpoint, deleteNetworkEndpoint, connectNetworkEndpoint, disconnectNetworkEndpoint, pruneNetworkEndpoint).prefix("/networks");
/**
* @since 1.0.0
* @category HttpApi
* @see https://docs.docker.com/reference/api/engine/latest/#tag/Network
*/
export const NetworksApi = /*#__PURE__*/HttpApi.make("NetworksApi").add(NetworksGroup);
/**
* @since 1.0.0
* @category Services
* @see https://docs.docker.com/reference/api/engine/latest/#tag/Network
*/
export class Networks extends /*#__PURE__*/Context.Service()("@the-moby-effect/endpoints/Networks", {
make: /*#__PURE__*/Effect.gen(function* () {
const httpClient = yield* HttpClient.HttpClient;
const NetworksError = DockerError.WrapForModule("networks");
const client = yield* HttpApiClient.group(NetworksApi, {
group: "networks",
httpClient
});
const list_ = filters => client.list({
query: {
filters
}
}).pipe(Effect.mapError(NetworksError("list")));
const create_ = payload => NetworkCreateRequest.makeEffect(payload).pipe(Effect.flatMap(payload => client.create({
payload
})), Effect.mapError(NetworksError("create")));
const inspect_ = (id, options) => client.inspect({
params: {
id
},
query: {
...options
}
}).pipe(Effect.mapError(NetworksError("inspect")));
const delete_ = id => client.delete({
params: {
id
}
}).pipe(Effect.mapError(NetworksError("delete")));
const connect_ = (id, payload) => NetworkConnectOptions.makeEffect(payload).pipe(Effect.flatMap(payload => client.connect({
params: {
id
},
payload
})), Effect.mapError(NetworksError("connect")));
const disconnect_ = (id, containerId, options) => client.disconnect({
params: {
id
},
payload: {
Container: containerId,
Force: options?.force ?? false
}
}).pipe(Effect.mapError(NetworksError("disconnect")));
const prune_ = filters => client.prune({
query: {
filters
}
}).pipe(Effect.mapError(NetworksError("prune")));
return {
list: list_,
create: create_,
inspect: inspect_,
delete: delete_,
connect: connect_,
disconnect: disconnect_,
prune: prune_
};
})
}) {}
/**
* @since 1.0.0
* @category Layers
* @see https://docs.docker.com/reference/api/engine/latest/#tag/Network
*/
export const NetworksLayer = /*#__PURE__*/Layer.effect(Networks, Networks.make);
/**
* @since 1.0.0
* @category Layers
* @see https://docs.docker.com/reference/api/engine/latest/#tag/Network
*/
export const NetworksLayerLocalSocket = /*#__PURE__*/NetworksLayer.pipe(/*#__PURE__*/Layer.provide(/*#__PURE__*/makeAgnosticHttpClientLayer(/*#__PURE__*/MobyConnectionOptions.socket({
socketPath: "/var/run/docker.sock"
}))));
//# sourceMappingURL=networks.js.map