{"version":3,"sources":["../src/api/Modem.ts","../src/utils/Handle.ts","../src/stack/stackDeps.ts","../src/conf/config.ts","../src/conf/configs.ts","../src/container/container.ts","../src/container/containers.ts","../src/image/image.ts","../src/utils/HandleLogWrapper.ts","../src/image/images.ts","../src/network/network.ts","../src/network/networks.ts","../src/node/node.ts","../src/node/nodes.ts","../src/plugin/plugin.ts","../src/plugin/plugins.ts","../src/swarm/swarm.ts","../src/secret/secret.ts","../src/secret/secrets.ts","../src/service/services.ts","../src/service/service.ts","../src/system/system.ts","../src/task/task.ts","../src/task/tasks.ts","../src/volume/volume.ts","../src/volume/clusterVolume.ts","../src/volume/volumes.ts","../src/stack/stack.ts","../src/stack/stacks.ts"],"sourcesContent":["import https from \"https\";\nimport http from \"http\";\n\nimport fs from \"fs\";\nimport path from \"path\";\n\nimport { Socket } from \"net\";\nimport querystring from \"node:querystring\";\n\nexport type ModemDialMethod = \"GET\" | \"POST\" | \"HEAD\" | \"PUT\" | \"DELETE\" | \"PATCH\";\nexport type ModemDialResponseResult = object | null;\nexport type ModemDialStreamResult = http.IncomingMessage;\nexport type ModemDialResult = ModemDialResponseResult | ModemDialStreamResult | Socket;\n\ninterface ModemDialResultContentHandler { (raw: string): ModemDialResponseResult; }\n\nexport interface ModemDialOptions {\n    path: string,\n    method: ModemDialMethod,\n    headers?: Map<string, string>,\n    query?: Map<string, Array<string>>,\n    body?: object | string,\n\n    isStream?: boolean // CHECK if this is not needed in future api verisons\n}\n\nexport default class Modem {\n    private socketPath: string;\n    private static version = \"v1.44\";\n\n    private static responseStreamContentType = [\n        \"application/vnd.docker.raw-stream\",\n        \"application/vnd.docker.multiplexed-stream\"\n    ];\n\n    constructor(socketPath: string) {\n        this.socketPath = socketPath;\n    }\n\n    private static responseIsStream(response: http.IncomingMessage): boolean {\n        // CHECK maybe this can also be identified by the connection: keep-alive header\n        const contentType = response.headers[\"content-type\"];\n        return contentType ? Modem.responseStreamContentType.includes(contentType) : false;\n    }\n\n    private static getResponseContentHandler(response: http.IncomingMessage): ModemDialResultContentHandler {\n        switch (response.headers[\"content-type\"]) {\n            case \"application/json\": return (raw: string) => { return JSON.parse(raw); };\n            default: return (raw: string) => null;\n        }\n    }\n\n    private static getQueryString(query?: Map<string, Array<string>>) {\n        return query && query.size > 0 ? \"?\" + querystring.stringify(Object.fromEntries(query)) : \"\";\n    }\n\n    public async dial(options: ModemDialOptions) {\n        const socketPath = this.socketPath;\n        const path = (Modem.version ? \"/\" + Modem.version : \"\") + options.path;\n\n        const body = options.body ? JSON.stringify(options.body) : null;\n        const headers: http.OutgoingHttpHeaders = options.headers ? Object.fromEntries(options.headers) : {}; // IDEA consider switching to https later\n        \n        if (body) {\n            headers[\"Content-Type\"] = \"application/json\";\n            headers[\"Content-Length\"] = Buffer.byteLength(body);\n        }\n\n        return await new Promise<ModemDialResult>(function(resolve, reject) {\n            let finished = false;\n\n            const requestOptions: http.RequestOptions = {\n                socketPath: socketPath,\n                path: path + Modem.getQueryString(options.query),\n                method: options.method,\n                headers: headers\n            };\n\n            const request = http.request(requestOptions);\n\n            request.on(\"upgrade\", function(response, socket, head) {\n                if (finished)\n                    return;\n\n                finished = true;\n                resolve(socket);\n            });\n\n            request.on(\"response\", function(response) {\n                const status = response.statusCode;\n\n                if (!status) {\n                    reject(new Error(\"Status is not defined\"));\n                    return;\n                }\n\n                if (Modem.responseIsStream(response) || options.isStream) {\n                    if (finished)\n                        return;\n\n                    finished = true;\n                    resolve(response);\n                    return;\n                }\n\n                // CHECK it seems like the response does not always set content-length (e.g. /networks) maybe there is another way of telling\n                // const contentLength = headers[\"content-length\"] ? Number.parseInt(headers[\"content-length\"]) : 0;\n                const rawHandler = Modem.getResponseContentHandler(response);\n                const isOk = status < 300;\n\n                let chunks = new Array();\n\n                const pushChunk = function(chunk: any) { chunks.push(chunk); };\n                const responseEnd = function() {\n                    if (finished)\n                        return;\n\n                    finished = true;\n\n                    const buffer = Buffer.concat(chunks);\n                    const raw = buffer.toString(\"utf-8\");\n                    const parsed = rawHandler(raw);\n\n                    if (isOk)\n                        resolve(parsed);\n                    else\n                        reject(parsed);\n                };\n\n                // response.setEncoding(\"utf-8\");\n                response.on(\"error\", reject);\n                response.on(\"data\", pushChunk);\n                response.on(\"end\", responseEnd);\n                response.on(\"close\", responseEnd);\n            });\n\n            if (body)\n                request.write(body);\n\n            request.on(\"error\", reject);\n            request.end();\n        }).catch(function(err) { return Promise.reject(\"message\" in err ? err.message : err); });\n    }\n}","import Modem from \"../api/Modem\";\n\nexport default abstract class Handle {\n    protected readonly modem: Modem;\n    public readonly id: string;\n\n    constructor(modem: Modem, id: string) {\n        this.modem = modem;\n        this.id = id;\n    }\n}","import { ServiceSpec } from \"../service/service\";\n\nconst DOCKER_STACK_IMAGE_LABEL = \"com.docker.stack.image\";\nexport const DOCKER_STACK_NAMESPACE_LABEL = \"com.docker.stack.namespace\";","import Modem, { ModemDialOptions } from \"../api/Modem\";\nimport { DOCKER_STACK_NAMESPACE_LABEL } from \"../stack/stackDeps\";\nimport Handle from \"../utils/Handle\";\nimport Stackable from \"../utils/Stackable\";\nimport { DockerLabels, Driver, SwarmBase } from \"../utils/types\";\n\nexport type ConfigId = string;\n\nexport type ConfigSpec = {\n    Name: string,\n    Labels?: DockerLabels,\n    Data: string,\n    Templating?: Driver\n};\n\nexport interface Config extends SwarmBase<ConfigId> {\n    Spec: ConfigSpec\n}\n\nexport default class ConfigHandle extends Handle implements Stackable {\n    async inspect() {\n        const call: ModemDialOptions = {\n            path: \"/configs/\" + this.id,\n            method: \"GET\"\n        };\n\n        return await this.modem.dial(call) as Config;\n    }\n\n    /**\n     * @see https://docs.docker.com/engine/api/v1.44/#tag/Config/operation/ConfigUpdate\n     * @param spec \n     */\n    async update(spec: ConfigSpec) {\n        const current = await this.inspect();\n        const version = current.Version.Index;\n\n        const query = new Map();\n        query.set(\"version\", version);\n\n        const newSpec = current.Spec;\n        newSpec.Labels = spec.Labels;\n\n        const call: ModemDialOptions = {\n            path: \"/configs/\" + this.id + \"/update\",\n            method: \"POST\",\n            query: query,\n            body: newSpec\n        };\n\n        await this.modem.dial(call);\n    }\n\n    async remove() {\n        const current = await this.inspect();\n\n        if (this.shouldThrowStackError() && ConfigHandle.isPartOfStack(current))\n            throw new Error(\"The current config was created by a stack, it can not be removed individually\");\n\n        const call: ModemDialOptions = {\n            path: \"/configs/\" + this.id,\n            method: \"DELETE\"\n        };\n\n        await this.modem.dial(call);\n    }\n\n    public shouldThrowStackError() {\n        return true;\n    }\n\n    static isPartOfStack(config: Config) {\n        return config.Spec.Labels && DOCKER_STACK_NAMESPACE_LABEL in config.Spec.Labels;\n    }\n\n    static fromConfig(modem: Modem, config: Config) {\n        const id = config.ID;\n        return new ConfigHandle(modem, id);\n    }\n}","import Modem, { ModemDialOptions } from \"../api/Modem\";\nimport ConfigHandle, { Config, ConfigId, ConfigSpec } from \"./config\";\n\ntype ConfigListFilterType = \"id\" | \"label\" | \"name\" | \"names\";\n\nexport type ConfigListFilters = Map<ConfigListFilterType, Array<string>>;\nexport type ConfigListResult = Array<Config>;\n\nexport type ConfigListQueryOptions = {\n    filters?: ConfigListFilters\n};\n\ntype ConfigCreateResult = {\n    ID: ConfigId\n};\n\nexport default class Configs {\n    static async list(modem: Modem, queryOptions: ConfigListQueryOptions = {}) {\n        const query = new Map();\n        if (queryOptions.filters) query.set(\"filters\", JSON.stringify(Object.fromEntries(queryOptions.filters)));\n\n        const call: ModemDialOptions = {\n            path: \"/configs\",\n            method: \"GET\",\n            query: query\n        };\n\n        return await modem.dial(call) as ConfigListResult;\n    }\n\n    static async create(modem: Modem, spec: ConfigSpec) {\n        const call: ModemDialOptions = {\n            path: \"/configs/create\",\n            method: \"POST\",\n            body: spec\n        };\n\n        const result = await modem.dial(call) as ConfigCreateResult;\n        return new ConfigHandle(modem, result.ID);\n    }\n\n    static getHandle(modem: Modem, id: ConfigId) {\n        return new ConfigHandle(modem, id);\n    }\n}","import Modem, { ModemDialOptions, ModemDialResult, ModemDialStreamResult } from \"../api/Modem\";\nimport Handle from \"../utils/Handle\";\nimport { DockerLabels, Port, EndpointSettings, MountPoint, HealthConfig, Health, HostConfig, GraphDriverData, PortMap, Address, HostConfigBase, RestartPolicy } from \"../utils/types\";\n\nexport type ContainerId = string;\n\ntype ContainerHostConfig = {\n    NetworkMode?: string\n};\n\ntype ContainerSummaryNetworkSettings = {\n    Networks: {\n        [name: string]: EndpointSettings\n    }\n};\n\ninterface ContainerBase {\n    Id: ContainerId,\n    Image: string,\n    Mounts: Array<MountPoint>\n}\n\nexport interface ContainerSummary extends ContainerBase {\n    Names: Array<string>,\n    ImageID: string,\n    Command: string,\n    Created: number,\n    Ports: Array<Port>,\n    SizeRw: number,\n    SizeRootFs: number,\n    Labels: DockerLabels,\n    State: string,\n    Status: string,\n    HostConfig: ContainerHostConfig,\n    NetworkSettings: ContainerSummaryNetworkSettings,\n}\n\nexport type ContainerStatus = {\n    ContainerID: ContainerId,\n    PID: string,\n    ExitCode: number\n};\n\n/**\n * Format: <port>/<tcp|udp|sctp>: {}\n */\ntype ContainerSpecExposedPorts = {\n    [port: string]: object\n};\n\ntype ContainerVolumes = {\n    [name: string]: object\n};\n\ntype ContainerSpecNetworkingConfig = {\n    EndpointsConfig: EndpointSettings\n};\n\nexport type ContainerConfig = {\n    Hostname?: string,\n    Domainname?: string,\n    User?: string,\n    AttachStdin?: boolean,\n    AttachStdout?: boolean,\n    AttachStderr?: boolean,\n    ExposedPorts?: ContainerSpecExposedPorts,\n    Tty?: boolean,\n    OpenStdin?: boolean,\n    StdinOnce?: boolean,\n    Env?: Array<string>,\n    Cmd?: Array<string>,\n    Healthcheck?: HealthConfig,\n    ArgsEscaped?: boolean | null,\n    Image: string,\n    Volumes?: ContainerVolumes,\n    WorkingDir?: string,\n    Entrypoint?: Array<string>,\n    NetworkDisabled?: boolean | null,\n    MacAddress?: string | null,\n    OnBuild?: Array<string> | null,\n    Labels?: DockerLabels,\n    StopSignal?: string | null,\n    StopTimeout?: number | null,\n    Shell?: Array<string> | null,\n}\n\nexport type ContainerSpec = ContainerConfig & {\n    HostConfig?: ContainerHostConfig,\n    NetworkingConfig?: ContainerSpecNetworkingConfig\n};\n\ntype ContainerStateStatus = \"created\" | \"running\" | \"paused\" | \"restarting\" | \"removing\" | \"exited\" | \"dead\";\ntype ContainerState = {\n    Status: ContainerStateStatus,\n    Running: boolean,\n    Paused: boolean,\n    Restarting: boolean,\n    OOMKilled: boolean,\n    Dead: boolean,\n    Pid: number,\n    ExitCode: number,\n    Error: string,\n    StartedAt: string,\n    FinishedAt: string,\n    Health: Health\n};\n\ntype ContainerNetworkSettings = ContainerSummaryNetworkSettings & {\n    Bridge: string,\n    SandboxID: string,\n    HairpinMode: boolean,\n    LinkLocalIPv6Address: string,\n    LinkLocalIPv6PrefixLen: number,\n    Ports: PortMap,\n    SandboxKey: string,\n    SecondaryIPAddresses: Array<Address> | null,\n    SecondaryIPv6Addresses: Array<Address> | null\n}\n\nexport interface Container extends ContainerBase {\n    Created: string,\n    Path: string,\n    Args: Array<string>,\n    State: ContainerState,\n    ResolvConfPath: string,\n    HostnamePath: string,\n    HostsPath: string,\n    LogPath: string,\n    Name: string,\n    RestartCount: number,\n    Driver: string,\n    Platform: string,\n    MountLabel: string,\n    ProcessLabel: string,\n    AppArmorProfile: string,\n    ExecIds: Array<string> | null,\n    HostConfig: HostConfig,\n    GraphDriver: GraphDriverData,\n    SizeRw: number,\n    SizeRootFs: number,\n    Mounts: Array<MountPoint>,\n    Config: ContainerConfig,\n    NetworkSettings: ContainerNetworkSettings\n};\n\nexport type ContainerUpdateConfig = HostConfigBase & {\n    RestartPolicy: RestartPolicy\n};\n\nexport type ContainerInspectQueryOptions = {\n    size?: boolean\n};\n\nexport type ContainerListProcessesQueryOptions = {\n    ps_args?: string\n};\n\nexport type ContainerLogsQueryOptions = {\n    follow?: boolean,\n    stdout?: boolean,\n    stderr?: boolean,\n    since?: number,\n    until?: number,\n    timestamps?: boolean,\n    tail?: \"all\" | number\n}\n\nexport type ContainerListProcessesResult = {\n    Titles: Array<string>,\n    Processes: Array<Array<string>>\n};\n\nexport type ContainerChangesResult = Array<{\n    Path: string,\n    Kind: 0 | 1 | 2\n}>;\n\nexport type ContainerStatsQueryOptions = {\n    stream?: boolean,\n\n    /**\n     * Has to be used with stream=false  \n     * Returns values immediately instead of waiting 2 cycles\n     */\n    oneShot?: boolean\n};\n\nexport type ContainerResizeQueryOptions = {\n    w: number,\n    h: number\n};\n\nexport type ContainerStartQueryOptions = {\n    detachKeys?: string\n};\n\nexport type ContainerKillQueryOptions = {\n    signal?: string,\n}\n\nexport type ContainerStopQueryOptions = ContainerKillQueryOptions & {\n    t?: number\n};\n\nexport type ContainerRenameQueryOptions = {\n    name: string\n};\n\nexport type ContainerWaitQueryOptions = {\n    condition?: \"not-running\" | \"next-exit\" | \"removed\"\n};\n\nexport type ContainerRemoveQueryOptions = {\n    v?: boolean,\n    force?: boolean,\n    link?: boolean\n};\n\nexport type ContainerUpdateResult = {\n    Warnings: Array<string>\n};\n\nexport default class ContainerHandle extends Handle {\n    async inspect(queryOptions: ContainerInspectQueryOptions = {}) {\n        const query = new Map();\n        if (\"size\" in queryOptions) query.set(\"size\", queryOptions.size ? \"true\" : \"false\");\n\n        const call: ModemDialOptions = {\n            path: \"/containers/\" + this.id + \"/json\",\n            method: \"GET\",\n            query: query\n        };\n\n        return await this.modem.dial(call) as Container;\n    }\n\n    async listProcesses(queryOptions: ContainerListProcessesQueryOptions = {}) {\n        const query = new Map();\n        query.set(\"ps_args\", queryOptions.ps_args ?? \"-ef\");\n\n        const call: ModemDialOptions = {\n            path: `/containers/${this.id}/top`,\n            method: \"GET\",\n            query: query\n        };\n\n        return await this.modem.dial(call) as ContainerListProcessesResult;\n    }\n\n    public async getLogs(queryOptions: ContainerLogsQueryOptions = {}) {\n        const query = new Map();\n        query.set(\"follow\", queryOptions.follow ? \"true\" : \"false\");\n        query.set(\"stdout\", queryOptions.stdout ? \"true\" : \"false\");\n        query.set(\"stderr\", queryOptions.stderr ? \"true\" : \"false\");\n        query.set(\"since\", queryOptions.since ?? 0);\n        query.set(\"until\", queryOptions.until ?? 0);\n        query.set(\"timestamps\", queryOptions.timestamps ? \"true\" : \"false\");\n        query.set(\"tail\", queryOptions.tail ?? \"all\");\n\n        const call : ModemDialOptions = {\n            path: `/containers/${this.id}/logs`,\n            method: \"GET\",\n            query: query\n        };\n\n        return await this.modem.dial(call) as ModemDialStreamResult;\n    }\n\n    async changes() {\n        const call: ModemDialOptions = {\n            path: `/containers/${this.id}/changes`,\n            method: \"GET\",\n        };\n\n        return await this.modem.dial(call) as ContainerChangesResult;\n    }\n\n    async export() {\n        const call: ModemDialOptions = {\n            path: `/containers/${this.id}/export`,\n            method: \"GET\",\n            isStream: true\n        };\n\n        return await this.modem.dial(call) as ModemDialStreamResult;\n    }\n\n    async stats(queryOptions: ContainerStatsQueryOptions = {}) {\n        const query = new Map();\n        if (\"stream\" in queryOptions) query.set(\"stream\", queryOptions.stream ? \"true\" : \"false\");\n        if (\"oneShot\" in queryOptions) query.set(\"one-shot\", queryOptions.oneShot ? \"true\" : \"false\");\n\n        const call: ModemDialOptions = {\n            path: \"/containers/\" + this.id + \"/stats\",\n            method: \"GET\",\n            query: query,\n            isStream: queryOptions.stream\n        };\n\n        return await this.modem.dial(call) as ModemDialStreamResult;\n    }\n\n    async resize(queryOptions: ContainerResizeQueryOptions) {\n        const query = new Map();\n        query.set(\"h\", queryOptions.h);\n        query.set(\"w\", queryOptions.w);\n\n        const call: ModemDialOptions = {\n            path: `/containers/${this.id}/resize`,\n            method: \"POST\",\n            query: query\n        };\n\n        return await this.modem.dial(call);\n    }\n\n    async start(queryOptions: ContainerStartQueryOptions = {}) {\n        const query = new Map();\n        if (queryOptions.detachKeys) query.set(\"detachKeys\", queryOptions.detachKeys);\n\n        const call: ModemDialOptions = {\n            path: `/containers/${this.id}/start`,\n            method: \"POST\",\n            query: query\n        };\n\n        return await this.modem.dial(call);\n    }\n\n    async stop(queryOptions: ContainerStopQueryOptions = {}) {\n        const query = new Map();\n        query.set(\"signal\", queryOptions.signal ?? \"SIGINT\");\n        query.set(\"t\", typeof queryOptions.t === \"undefined\" ? 5 : queryOptions.t);\n\n        const call: ModemDialOptions = {\n            path: `/containers/${this.id}/stop`,\n            method: \"POST\",\n            query: query\n        };\n\n        return await this.modem.dial(call);\n    }\n\n    async restart(queryOptions: ContainerStopQueryOptions = {}) {\n        const query = new Map();\n        query.set(\"signal\", queryOptions.signal ?? \"SIGINT\");\n        query.set(\"t\", queryOptions.t);\n\n        const call: ModemDialOptions = {\n            path: `/containers/${this.id}/restart`,\n            method: \"POST\",\n            query: query\n        };\n\n        return await this.modem.dial(call);\n    }\n\n    async kill(queryOptions: ContainerKillQueryOptions = {}) {\n        const query = new Map();\n        query.set(\"signal\", queryOptions.signal ?? \"SIGKILL\");\n\n        const call: ModemDialOptions = {\n            path: `/containers/${this.id}/kill`,\n            method: \"POST\",\n            query: query\n        };\n\n        return await this.modem.dial(call);\n    }\n\n    public async update(updateConfig: ContainerUpdateConfig) {\n        const call: ModemDialOptions = {\n            path: `/containers/${this.id}/update`,\n            method: \"POST\",\n            body: updateConfig\n        };\n\n        return await this.modem.dial(call) as ContainerUpdateResult;\n    }\n\n    async rename(queryOptions: ContainerRenameQueryOptions) {\n        const query = new Map();\n        query.set(\"name\", queryOptions.name);\n\n        const call: ModemDialOptions = {\n            path: `/containers/${this.id}/rename`,\n            method: \"POST\",\n            query: query\n        };\n\n        return await this.modem.dial(call);\n    }\n\n    async pause() {\n        const call: ModemDialOptions = {\n            path: `/containers/${this.id}/pause`,\n            method: \"GET\",\n            isStream: true\n        };\n\n        return await this.modem.dial(call);\n    }\n\n    async unpause() {\n        const call: ModemDialOptions = {\n            path: `/containers/${this.id}/unpause`,\n            method: \"GET\",\n            isStream: true\n        };\n\n        return await this.modem.dial(call);\n    }\n\n    // TODO attach to container\n    // TODO attach to container via websocket\n\n    async wait(queryOptions: ContainerWaitQueryOptions = {}) {\n        const query = new Map();\n        query.set(\"condition\", queryOptions.condition ?? \"not-running\");\n\n        const call: ModemDialOptions = {\n            path: `/containers/${this.id}/wait`,\n            method: \"POST\",\n            query: query\n        };\n\n        return await this.modem.dial(call);\n    }\n\n    async remove(queryOptions: ContainerRemoveQueryOptions = {}) {\n        const query = new Map();\n        query.set(\"v\", queryOptions.v ? \"true\" : \"false\");\n        query.set(\"force\", queryOptions.force ? \"true\" : \"false\");\n        query.set(\"link\", queryOptions.link ? \"true\" : \"false\");\n\n        const call: ModemDialOptions = {\n            path: \"/containers/\" + this.id,\n            method: \"DELETE\",\n            query: query\n        };\n\n        await this.modem.dial(call);\n    }\n\n    // TODO implement archive endpoints\n\n    static fromContainer(modem: Modem, container: ContainerSummary) {\n        return new ContainerHandle(modem, container.Id);\n    }\n}","import Modem, { ModemDialOptions } from \"../api/Modem\";\nimport ContainerHandle, { Container, ContainerId, ContainerSpec, ContainerSummary } from \"./container\";\n\ntype ContainerListFilterType = \"ancestor\" | \"before\" | \"expose\" | \"exited\" | \"isolation\" | \"is-task\" | \"label\" | \"name\" | \"network\" | \"publish\" | \"since\" | \"status\" | \"volume\";\ntype ContainerListFilters = Map<ContainerListFilterType, Array<string>>;\n\ntype ContainerPruneFilterType = \"until\" | \"label\";\ntype ContainerPruneFilters = Map<ContainerPruneFilterType, Array<string>>;\n\nexport type ContainerListQueryOptions = {\n    all?: boolean,\n    limit?: number,\n    size?: boolean,\n    filters?: ContainerListFilters\n};\n\nexport type ContainerPruneQueryOptions = {\n    filters?: ContainerPruneFilters\n};\n\nexport type ContainerListResult = Array<ContainerSummary>;\ntype ContainerCreateResult = {\n    Id: string,\n    Warnings: Array<string>\n};\ntype ContainerPruneResult = {\n    ContainersDeleted: Array<string>,\n    SpaceReclaimed: number\n};\n\nexport default class Containers {\n    static async list(modem: Modem, queryOptions: ContainerListQueryOptions = {}) {\n        const query = new Map();\n        if (queryOptions.all) query.set(\"all\", queryOptions.all ? \"true\" : \"false\");\n        if (queryOptions.size) query.set(\"size\", queryOptions.size ? \"true\" : \"false\");\n        if (queryOptions.limit) query.set(\"limit\", queryOptions.limit);\n        if (queryOptions.filters) query.set(\"filters\", JSON.stringify(Object.fromEntries(queryOptions.filters)));\n\n        const call: ModemDialOptions = {\n            path: \"/containers/json\",\n            method: \"GET\",\n            query: query\n        };\n\n        return await modem.dial(call) as ContainerListResult;\n    }\n\n    static async create(modem: Modem, spec: ContainerSpec) {\n        const call: ModemDialOptions = {\n            path: \"/containers/create\",\n            method: \"POST\",\n            body: spec\n        };\n\n        const result = await modem.dial(call) as ContainerCreateResult;\n        return new ContainerHandle(modem, result.Id);\n    }\n\n    static async prune(modem: Modem, queryOptions: ContainerPruneQueryOptions = {}) {\n        const query = new Map();\n        if (queryOptions.filters) query.set(\"filters\", JSON.stringify(Object.fromEntries(queryOptions.filters)));\n\n        const call: ModemDialOptions = {\n            path: \"/containers/prune\",\n            method: \"POST\",\n            query: query\n        };\n\n        return await modem.dial(call) as ContainerPruneResult;\n    }\n\n    static getHandle(modem: Modem, id: ContainerId) {\n        return new ContainerHandle(modem, id);\n    }\n}","import Modem, { ModemDialOptions } from \"../api/Modem\";\nimport { ContainerConfig } from \"../container/container\";\nimport Handle from \"../utils/Handle\";\nimport { DockerLabels, GraphDriverData } from \"../utils/types\";\n\nexport type ImageId = string;\n\ntype ImageConfig = ContainerConfig;\n\ninterface ImageBase {\n    Id: ImageId,\n    ParentId: ImageId,\n    RepoTags: Array<string>,\n    RepoDigests: Array<string>,\n    Created: number,\n    Size: number,\n    VirtualSize?: number\n}\n\nexport interface ImageSummary extends ImageBase {\n    SharedSize: number,\n    Labels: DockerLabels,\n    Containers: number\n}\n\ntype ImageRootFS = {\n    Type: string,\n    Layers: Array<string>\n};\n\ntype ImageMetadata = {\n    LastTagTime: string | null\n}\n\nexport interface Image extends ImageBase {\n    Comment: string,\n    Container: string,\n    ContainerConfig: ContainerConfig,\n    DockerVersion: string,\n    Author: string,\n    Config: ImageConfig,\n    Architecture: string,\n    Variant: string,\n    Os: string,\n    OsVersion: string,\n    GraphDriver: GraphDriverData,\n    RootFS: ImageRootFS,\n    Metadata: ImageMetadata\n}\n\ntype ImageLayer = {\n    Id: string,\n    Created: number,\n    CreatedBy: string,\n    Tags: Array<string>,\n    Size: number,\n    Comment: string\n};\n\nexport type ImageHistoryResult = Array<ImageLayer>;\n\nexport type ImagePushQueryOptions = {\n    tag?: string\n};\n\nexport type ImageTagQueryOptions = {\n    repo: string,\n    tag: string\n};\n\nexport type ImageRemoveQueryOptions = {\n    force?: boolean,\n    noprune?: false\n};\n\nexport default class ImageHandle extends Handle {\n    async inspect() {\n        const call: ModemDialOptions = {\n            path: \"/images/\" + this.id + \"/json\",\n            method: \"GET\"\n        };\n\n        return await this.modem.dial(call) as Image;\n    }\n\n    async history() {\n        const call: ModemDialOptions = {\n            path: `/images/${this.id}/history`,\n            method: \"GET\"\n        };\n\n        return await this.modem.dial(call) as ImageHistoryResult;\n    }\n\n    async push(queryOptions: ImagePushQueryOptions = {}, registryAuth?: string) {\n        const headers = new Map();\n        if (registryAuth) headers.set(\"X-Registry-Auth\", registryAuth);\n\n        const query = new Map();\n        if (queryOptions.tag) query.set(\"tag\", queryOptions.tag);\n\n        const call: ModemDialOptions = {\n            path: `/images/${this.id}/push`,\n            method: \"POST\",\n            headers: headers,\n            query: query\n        };\n\n        return await this.modem.dial(call);\n    }\n\n    async tag(queryOptions: ImageTagQueryOptions) {\n        const query = new Map();\n        query.set(\"repo\", queryOptions.repo);\n        query.set(\"tag\", queryOptions.tag);\n\n        const call: ModemDialOptions = {\n            path: `/images/${this.id}/tag`,\n            method: \"POST\",\n            query: query\n        };\n\n        return await this.modem.dial(call);\n    }\n\n    async remove(queryOptions: ImageRemoveQueryOptions = {}) {\n        const query = new Map();\n        if (queryOptions.force) query.set(\"force\", queryOptions.force ? \"true\" : \"false\");\n        if (queryOptions.noprune) query.set(\"noprune\", queryOptions.noprune ? \"true\" : \"false\");\n\n        const call: ModemDialOptions = {\n            path: \"/images/\" + this.id,\n            method: \"DELETE\",\n            query: query\n        };\n\n        await this.modem.dial(call);\n    }\n\n    static fromImage(modem: Modem, image: Image) {\n        return new ImageHandle(modem, image.Id);\n    }\n}","import Modem, { ModemDialStreamResult } from \"../api/Modem\";\nimport Handle from \"./Handle\";\n\nexport default class HandleLogWrapper<HandleType extends Handle> {\n    private readonly handle: HandleType;\n    private readonly logStream?: ModemDialStreamResult;\n    private readonly logChunks: Array<string>;\n\n    public constructor(handle: HandleType, logStream?: ModemDialStreamResult) {\n        this.handle = handle;\n        this.logStream = logStream;\n        this.logChunks = new Array();\n    }\n\n    public async drainLogStream() {\n        if (!this.logStream)\n            return;\n        \n        const handle = this;\n        const stream = this.logStream;\n\n        await new Promise(function(resolve) {\n            stream.on(\"data\", function(data) { handle.logChunks.push(data.toString()); });\n            stream.on(\"end\", resolve);\n        });\n    }\n\n    public get Handle() { return this.handle; }\n    public get LogChunks() { return this.logChunks; }\n}","import Modem, { ModemDialOptions, ModemDialStreamResult } from \"../api/Modem\";\nimport { ContainerConfig } from \"../container/container\";\nimport HandleLogWrapper from \"../utils/HandleLogWrapper\";\nimport ImageHandle, { ImageId, ImageSummary } from \"./image\";\n\ntype ImageListFilterType = \"before\" | \"dangling\" | \"label\" | \"reference\" | \"since\" | \"until\";\ntype ImageBuildPruneFilterType = \"until\" | \"id\" | \"parent\" | \"type\" | \"description\" | \"inuse\" | \"shared\" | \"private\";\ntype ImageSearchFilterTypes = \"is-official\" | \"stars\";\ntype ImagePruneFilterType = \"dangling\" | \"until\" | \"label\";\n\nexport type ImageListFilters = Map<ImageListFilterType, Array<string>>;\nexport type ImageBuildPruneFilters = Map<ImageBuildPruneFilterType, Array<string>>;\nexport type ImageSearchFilters = Map<ImageSearchFilterTypes, Array<string>>;\nexport type ImagePruneFilters = Map<ImagePruneFilterType, Array<string>>;\n\nexport type ImageListQueryOptions = {\n    all?: boolean,\n    filters?: ImageListFilters,\n    sharedSize?: boolean,\n    digests?: boolean\n};\n\nexport type ImageBuildPruneQueryOptions = {\n    keepStorage: number,\n    all: boolean,\n    filters?: ImageBuildPruneFilters\n}\n\nexport type ImagePullQueryOptions = {\n    fromImage: string,\n    tag?: string,\n    changes?: Array<string>\n    platform?: string\n};\n\nexport type ImageImportQueryOptions = {\n    fromSrc: string,\n    repo: string,\n    message?: string,\n    changes?: Array<string>,\n    platform?: string\n};\n\nexport type ImageSearchQueryOptions = {\n    term: string,\n    limit: number,\n    filters?: ImageSearchFilters\n};\n\nexport type ImageCommitQueryOptions = {\n    container?: string,\n    repo: string,\n    tag?: string,\n    comment?: string,\n    author?: string,\n    pause?: boolean,\n    changes?: string\n};\n\nexport type ImageListResult = Array<ImageSummary>;\n\nexport type ImageBuildPruneResult = {\n    CachesDeleted: Array<string>,\n    SpaceReclaimed: number\n};\n\nexport type ImagePruneResultImageDeleted = {\n    Untagged: string,\n    Deleted: string\n};\n\nexport type ImageSearchResult = Array<{\n    description: string,\n    is_official: boolean,\n    name: string,\n    star_count: number\n}>;\n\nexport type ImagePruneResult = {\n    ImagesDeleted: Array<ImagePruneResultImageDeleted>,\n    SpaceReclaimed: number\n};\n\nexport type ImageCommitResult = {\n    Id: string\n};\n\nexport default class Images {\n    static async list(modem: Modem, queryOptions: ImageListQueryOptions = {}) {\n        const query = new Map();\n        if (queryOptions.all) query.set(\"all\", queryOptions.all ? \"true\" : \"false\");\n        if (queryOptions.filters) query.set(\"filters\", JSON.stringify(Object.fromEntries(queryOptions.filters)));\n        if (queryOptions.sharedSize) query.set(\"shared-size\", queryOptions.sharedSize ? \"true\" : \"false\");\n        if (queryOptions.digests) query.set(\"digests\", queryOptions.digests ? \"true\" : \"false\");\n\n        const call: ModemDialOptions = {\n            path: \"/images/json\",\n            method: \"GET\",\n            query: query\n        };\n\n        return await modem.dial(call) as ImageListResult;\n    }\n\n    // TODO build image\n\n    static async pruneBuilderCache(modem: Modem, queryOptions: ImageBuildPruneQueryOptions) {\n        const query = new Map();\n        query.set(\"keep-storage\", queryOptions.keepStorage);\n        query.set(\"all\", queryOptions.all ? \"true\" : \"false\");\n        if (queryOptions.filters) query.set(\"filters\", JSON.stringify(Object.fromEntries(queryOptions.filters)));\n\n        const call: ModemDialOptions = {\n            path: \"/build/prune\",\n            method: \"POST\",\n            query: query\n        };\n\n        return await modem.dial(call) as ImageBuildPruneResult;\n    }\n\n    /**\n     * @see https://docs.docker.com/reference/api/engine/version/v1.44/#tag/Image/operation/ImageCreate\n     * \n     * @param modem \n     * @param queryOptions \n     * @param registryAuth \n     * @returns \n     */\n    static async pull(modem: Modem, queryOptions: ImagePullQueryOptions, registryAuth?: string) {\n        const headers = new Map();\n        if (registryAuth) headers.set(\"X-Registry-Auth\", registryAuth);\n\n        const query = new Map();\n        query.set(\"fromImage\", queryOptions.fromImage);\n\n        if (queryOptions.tag) query.set(\"tag\", queryOptions.tag);\n        if (queryOptions.changes) query.set(\"changes\", queryOptions.changes);\n        if (queryOptions.platform) query.set(\"platform\", queryOptions.platform);\n\n        const call: ModemDialOptions = {\n            path: \"/images/create\",\n            method: \"POST\",\n            headers: headers,\n            query: query,\n            isStream: true\n        };\n\n        const stream = await modem.dial(call) as ModemDialStreamResult;\n        const handle = new ImageHandle(modem, queryOptions.fromImage);\n        const logWrapper = new HandleLogWrapper(handle, stream);\n\n        await logWrapper.drainLogStream();\n        return logWrapper;\n    }\n\n    /**\n     * @see https://docs.docker.com/reference/api/engine/version/v1.44/#tag/Image/operation/ImageCreate\n     * \n     * @param modem \n     * @param queryOptions \n     * @param image \n     * @returns \n     */\n    static async import(modem: Modem, queryOptions: ImageImportQueryOptions, image?: string) {\n        const query = new Map();\n        query.set(\"fromSrc\", queryOptions.fromSrc);\n        query.set(\"repo\", queryOptions.repo);\n\n        if (queryOptions.message) query.set(\"message\", queryOptions.message);\n        if (queryOptions.changes) query.set(\"changes\", queryOptions.changes);\n        if (queryOptions.platform) query.set(\"platform\", queryOptions.platform);\n\n        const call: ModemDialOptions = {\n            path: \"/images/create\",\n            method: \"POST\",\n            query: query,\n            body: image,\n            isStream: true\n        };\n\n        const stream = await modem.dial(call) as ModemDialStreamResult;\n        const handle = new ImageHandle(modem, queryOptions.repo);\n        const logWrapper = new HandleLogWrapper(handle, stream);\n\n        await logWrapper.drainLogStream();\n        return logWrapper;\n    }\n\n    static async search(modem: Modem, queryOptions: ImageSearchQueryOptions) {\n        const query = new Map();\n        query.set(\"term\", queryOptions.term);\n        query.set(\"limit\", queryOptions.limit);\n        if (queryOptions.filters) query.set(\"filters\", JSON.stringify(Object.fromEntries(queryOptions.filters)));\n\n        const call: ModemDialOptions = {\n            path: \"/images/search\",\n            method: \"GET\",\n            query: query\n        };\n\n        return await modem.dial(call) as ImageSearchResult;\n    }\n\n    static async prune(modem: Modem, filters?: ImagePruneFilters) {\n        const query = new Map();\n        if (filters) query.set(\"filters\", JSON.stringify(Object.fromEntries(filters)));\n\n        const call: ModemDialOptions = {\n            path: \"/images/prune\",\n            method: \"POST\",\n            query: query\n        };\n\n        return await modem.dial(call) as ImagePruneResult;\n    }\n\n    /**\n     * Creates a new image based on a container configuration\n     * @param modem the modem to communicate with docker\n     * @param queryOptions query specific options\n     * @param containerConfig configuration of the container for the image\n     */\n    static async commit(modem: Modem, queryOptions: ImageCommitQueryOptions, containerConfig?: ContainerConfig) {\n        if (!containerConfig && !queryOptions.container)\n            throw new Error(\"Either containerConfig or queryOption 'container' must be specified\");\n\n        const query = new Map();\n        query.set(\"repo\", queryOptions.repo);\n        query.set(\"tag\", queryOptions.tag ?? \"\");\n        query.set(\"comment\", queryOptions.comment ?? \"\");\n        query.set(\"author\", queryOptions.author ?? \"\");\n        query.set(\"pause\", queryOptions.pause ? \"true\" : \"false\");\n\n        if (queryOptions.container) query.set(\"container\", queryOptions.container);\n        if (queryOptions.changes) query.set(\"changes\", queryOptions.changes);\n\n        const call: ModemDialOptions = {\n            path: \"/commit\",\n            method: \"POST\",\n            query: query,\n            body: containerConfig\n        };\n\n        return await modem.dial(call) as ImageCommitResult;\n    }\n\n    // TODO export image\n    // TODO export multiple images\n    // TODO import multiple images\n    \n    static getHandle(modem: Modem, id: ImageId) {\n        return new ImageHandle(modem, id);\n    }\n}","import Modem, { ModemDialOptions } from \"../api/Modem\";\nimport { DOCKER_STACK_NAMESPACE_LABEL } from \"../stack/stackDeps\";\nimport Handle from \"../utils/Handle\";\nimport Stackable from \"../utils/Stackable\";\nimport { DockerOptions, DockerLabels, IPAM, EndpointSpec, EndpointSettings } from \"../utils/types\";\n\nexport type NetworkId = string;\ntype NetworkScope = \"local\" | \"global\" | \"swarm\";\n\nexport type NetworkContainer = {\n    Name: string,\n    EndpointID: string,\n    MacAddress: string,\n    IPv4Address: string,\n    IPv6Address: string\n};\n\ntype NetworkContainers = {\n    [name: string]: NetworkContainer\n};\n\ntype NetworkConfigFrom = {\n    Network: NetworkId\n};\n\nexport interface NetworkSpec {\n    Name: string,\n    Driver?: string,\n    EnableIPv6?: boolean,\n    IPAM?: IPAM,\n    Internal?: boolean,\n    Attachable?: boolean,\n    Ingress?: boolean,\n    Options?: DockerOptions,\n    Labels?: DockerLabels,\n    Scope?: NetworkScope,\n    ConfigOnly?: boolean,\n    ConfigFrom?: NetworkConfigFrom\n}\n\nexport interface Network extends NetworkSpec {\n    Id: NetworkId,\n    Created: string,\n    Containers: NetworkContainers,\n}\n\nexport type NetworkInspectQueryOptions = {\n    verbose?: boolean,\n    scope?: NetworkScope\n};\n\nexport type NetworkConnectContainerConfig = {\n    Container: string,\n    EndpointConfig: EndpointSettings\n};\n\nexport type NetworkDisconnectContainerConfig = {\n    Container: string,\n    Force: boolean\n};\n\nexport default class NetworkHandle extends Handle implements Stackable {\n    /**\n     * @see https://docs.docker.com/engine/api/v1.44/#tag/Network/operation/NetworkInspect\n     * @param queryOptions query options to use \n     */\n    public async inspect(queryOptions: NetworkInspectQueryOptions = {}) {\n        const query = new Map();\n        query.set(\"verbose\", queryOptions.verbose ? \"true\" : \"false\");\n        if (queryOptions.scope) query.set(\"scope\", queryOptions.scope);\n\n        const call: ModemDialOptions = {\n            path: \"/networks/\" + this.id,\n            method: \"GET\",\n            query: query\n        };\n\n        return await this.modem.dial(call) as Network;\n    }\n\n    public async remove() {\n        const current = await this.inspect();\n\n        if (this.shouldThrowStackError() && NetworkHandle.isPartOfStack(current))\n            throw new Error(\"The current network was created by a stack, it can not be removed individually\");\n\n        const call: ModemDialOptions = {\n            path: \"/networks/\" + this.id,\n            method: \"DELETE\"\n        };\n\n        await this.modem.dial(call);\n    }\n\n    public async connectContainer(connectConfig: NetworkConnectContainerConfig) {\n        const call: ModemDialOptions = {\n            path: `/networks/${this.id}/connect`,\n            method: \"POST\",\n            body: connectConfig\n        };\n\n        return await this.modem.dial(call);\n    }\n\n    public async disconnectContainer(disconnectConfig: NetworkDisconnectContainerConfig) {\n        const call: ModemDialOptions = {\n            path: `/networks/${this.id}/disconnect`,\n            method: \"POST\",\n            body: disconnectConfig\n        };\n\n        return await this.modem.dial(call);\n    }\n\n    public shouldThrowStackError() {\n        return true;\n    }\n\n    public static isPartOfStack(network: Network) {\n        return network.Labels && DOCKER_STACK_NAMESPACE_LABEL in network.Labels;\n    }\n\n    public static fromNetwork(modem: Modem, network: Network) {\n        const id = network.Id;\n        return new NetworkHandle(modem, id);\n    }\n}","import Modem, { ModemDialOptions } from \"../api/Modem\";\nimport NetworkHandle, { Network, NetworkId, NetworkSpec } from \"./network\";\n\ntype NetworkListFilterType = \"dangling\" | \"driver\" | \"id\" | \"label\" | \"name\" | \"scope\" | \"type\";\ntype NetworkPruneFilterType = \"until\" | \"label\";\n\nexport type NetworkListFilters = Map<NetworkListFilterType, Array<string>>;\nexport type NetworkPruneFilters = Map<NetworkPruneFilterType, Array<string>>;\n\nexport type NetworkListQueryOptions = {\n    filters?: NetworkListFilters\n};\n\nexport type NetworkPruneQueryOptions = {\n    filters?: NetworkPruneFilters\n};\n\nexport type NetworkListResult = Array<Network>;\ntype NetworkCreateResult = {\n    Id: NetworkId,\n    Warning: string\n};\ntype NetworkPruneResult = {\n    NetworksDeleted: Array<string>\n};\n\nexport default class Networks {\n    /**\n     * @see https://docs.docker.com/engine/api/v1.44/#tag/Network/operation/NetworkList\n     */\n    static async list(modem: Modem, queryOptions: NetworkListQueryOptions = {}) {\n        const query = new Map();\n        if (queryOptions.filters) query.set(\"filters\", JSON.stringify(Object.fromEntries(queryOptions.filters)));\n\n        const call: ModemDialOptions = {\n            path: \"/networks\",\n            method: \"GET\",\n            query: query\n        };\n\n        return await modem.dial(call) as NetworkListResult;\n    }\n\n    /**\n     * @see https://docs.docker.com/engine/api/v1.44/#tag/Network/operation/NetworkCreate\n     * \n     * @param modem the modem to use\n     * @param spec the spec to use to create the network\n     */\n    static async create(modem: Modem, spec: NetworkSpec) {\n        const call: ModemDialOptions = {\n            path: \"/networks/create\",\n            method: \"POST\",\n            body: spec\n        };\n\n        const result = await modem.dial(call) as NetworkCreateResult;\n        return new NetworkHandle(modem, result.Id);\n    }\n\n    static async prune(modem: Modem, queryOptions: NetworkPruneQueryOptions = {}) {\n        const query = new Map();\n        if (queryOptions.filters) query.set(\"filters\", JSON.stringify(Object.fromEntries(queryOptions.filters)));\n\n        const call: ModemDialOptions = {\n            path: \"/networks/prune\",\n            method: \"POST\",\n            query: query\n        };\n\n        return await modem.dial(call) as NetworkPruneResult;\n    }\n\n    static getHandle(modem: Modem, id: NetworkId) {\n        return new NetworkHandle(modem, id);\n    }\n}","import Modem, { ModemDialOptions } from \"../api/Modem\";\nimport Handle from \"../utils/Handle\";\nimport { DockerLabels, EngineDescription, Platform, ResourceObject, SwarmBase, TLSInfo } from \"../utils/types\";\n\nexport type NodeId = string;\n\ntype NodeRole = \"worker\" | \"manager\";\ntype NodeAvailability = \"active\" | \"pause\" | \"drain\";\n\nexport type NodeSpec = {\n    Name: string,\n    Labels?: DockerLabels,\n    Role: NodeRole,\n    Availability: NodeAvailability\n};\n\ntype NodeDescription = {\n    Hostname: string,\n    Platform: Platform,\n    Resources: ResourceObject,\n    Engine: EngineDescription,\n    TLSInfo: TLSInfo\n};\n\ntype NodeState = \"unknown\" | \"down\" | \"ready\" | \"disconnected\";\ntype NodeStatus = {\n    State: NodeState,\n    Message: string,\n    Addr: string\n};\n\ntype NodeManagerStatusReachability = \"unknown\" | \"unreachable\" | \"reachable\";\ntype NodeManagerStatus = {\n    Leader: boolean,\n    Reachability: NodeManagerStatusReachability,\n    Addr: string\n};\n\nexport interface Node extends SwarmBase<NodeId> {\n    Spec: NodeSpec,\n    Description: NodeDescription,\n    Status: NodeStatus,\n    ManagerStatus: NodeManagerStatus\n};\n\nexport type NodeRemoveQueryOptions = {\n    force?: boolean\n};\n\nexport default class NodeHandle extends Handle {\n    async inspect() {\n        const call: ModemDialOptions = {\n            path: \"/nodes/\" + this.id,\n            method: \"GET\"\n        };\n\n        return await this.modem.dial(call) as Node;\n    }\n\n    async update(newSpec: NodeSpec) {\n        const current = await this.inspect();\n        const version = current.Version.Index;\n\n        const query = new Map();\n        query.set(\"version\", version);\n\n        const call: ModemDialOptions = {\n            path: \"/nodes/\" + this.id + \"/update\",\n            method: \"POST\",\n            query: query,\n            body: newSpec\n        };\n\n        await this.modem.dial(call);\n    }\n\n    async remove(queryOptions: NodeRemoveQueryOptions) {\n        const query = new Map();\n        query.set(\"force\", queryOptions.force ? \"true\" : \"false\");\n\n        const call: ModemDialOptions = {\n            path: \"/nodes/\" + this.id,\n            method: \"DELETE\",\n            query: query\n        };\n\n        await this.modem.dial(call);\n    }\n\n    static fromNode(modem: Modem, node: Node) {\n        const id = node.ID;\n        return new NodeHandle(modem, id);\n    }\n}","import Modem, { ModemDialOptions } from \"../api/Modem\";\nimport NodeHandle, { Node, NodeId } from \"./node\";\n\ntype NodeListFilterType = \"id\" | \"label\" | \"membership\" | \"name\" | \"node.label\" | \"role\";\n\nexport type NodeListFilters = Map<NodeListFilterType, Array<string>>;\nexport type NodeListResult = Array<Node>;\n\nexport type NodeListQueryOptions = {\n    filters?: NodeListFilters\n};\n\nexport default class Nodes {\n    static async list(modem: Modem, queryOptions: NodeListQueryOptions = {}) {\n        const query = new Map();\n        if (queryOptions.filters) query.set(\"filters\", JSON.stringify(Object.fromEntries(queryOptions.filters)));\n\n        const call: ModemDialOptions = {\n            path: \"/nodes\",\n            method: \"GET\",\n            query: query\n        };\n\n        return await modem.dial(call) as NodeListResult;\n    }\n\n    static getHandle(modem: Modem, id: NodeId) {\n        return new NodeHandle(modem, id);\n    }\n}","import Modem, { ModemDialOptions } from \"../api/Modem\";\nimport Handle from \"../utils/Handle\";\n\nexport type PluginId = string;\n\ntype PluginMount = {\n    Name: string,\n    Description: string,\n    Settable: Array<string>,\n    Source: string,\n    Destination: string,\n    Type: string,\n    Options: Array<string>\n};\n\ntype PluginDevice = {\n    Name: string,\n    Description: string,\n    Settable: Array<string>,\n    Path: string\n};\n\ntype PluginSettings = {\n    Mounts: Array<PluginMount>,\n    Env: Array<string>,\n    Args: Array<string>,\n    Devices: Array<PluginDevice>\n};\n\ntype PluginInterfaceType = {\n    Prefix: string,\n    Capability: string,\n    Version: string\n};\n\ntype PluginInterfaceProtocolScheme = \"\" | \"moby.plugins.http/v1\";\ntype PluginInterface = {\n    Types: Array<PluginInterfaceType>,\n    Socket: string,\n    ProtocolScheme: PluginInterfaceProtocolScheme\n};\n\ntype PluginUser = {\n    UID: number,\n    GID: number\n};\n\ntype PluginNetwork = {\n    Type: string\n};\n\ntype PluginLinux = {\n    Capabilities: Array<string>,\n    AllowAllDevices: boolean,\n    Devices: Array<PluginDevice>\n};\n\ntype PluginEnv = {\n    Name: string,\n    Description: string,\n    Settable: Array<string>,\n    Value: string\n};\n\ntype PluginArgs = {\n    Name: string,\n    Description: string,\n    Settable: Array<string>,\n    Value: Array<string>\n};\n\ntype PluginRootfs = {\n    type: string,\n    diff_ids: Array<string>\n};\n\ntype PluginConfig = {\n    Docker: string,\n    Description: string,\n    Documentation: string,\n    Interface: PluginInterface,\n    Entrypoint: Array<string>,\n    WorkDir: string,\n    User: PluginUser,\n    Network: PluginNetwork,\n    Linux: PluginLinux,\n    PopagatedMount: string,\n    IpcHost: boolean,\n    PidHost: boolean,\n    Mounts: Array<PluginMount>,\n    Env: Array<PluginEnv>,\n    Args: PluginArgs,\n    rootfs: PluginRootfs\n};\n\nexport interface Plugin {\n    Id: PluginId,\n    Name: string,\n    Enabled: boolean,\n    Settings: PluginSettings,\n    PluginReference: string,\n    Config: PluginConfig\n};\n\nexport type PluginRemoveQueryOptions = {\n    force?: boolean\n};\n\nexport type PluginEnableQueryOptions = {\n    timeout?: number\n};\n\nexport type PluginDisableQueryOptions = {\n    force?: boolean\n};\n\nexport default class PluginHandle extends Handle {\n    async inspect() {\n        const call: ModemDialOptions = {\n            path: \"/plugins/\" + this.id + \"/json\",\n            method: \"GET\"\n        };\n\n        return await this.modem.dial(call) as Plugin;\n    }\n\n    async remove(queryOptions: PluginRemoveQueryOptions = {}) {\n        const query = new Map();\n        query.set(\"force\", queryOptions.force ? \"true\" : \"false\");\n\n        const call: ModemDialOptions = {\n            path: \"/plugins/\" + this.id,\n            method: \"DELETE\",\n            query: query\n        };\n\n        await this.modem.dial(call);\n    }\n\n    async enable(queryOptions: PluginEnableQueryOptions = {}) {\n        const query = new Map();\n        query.set(\"timeout\", queryOptions.timeout ? queryOptions.timeout : 0);\n\n        const call: ModemDialOptions = {\n            path: \"/plugins/\" + this.id + \"/enable\",\n            method: \"POST\",\n            query: query\n        };\n\n        await this.modem.dial(call);\n    }\n\n    async disable(queryOptions: PluginDisableQueryOptions = {}) {\n        const query = new Map();\n        query.set(\"force\", queryOptions.force ? \"true\" : \"false\");\n\n        const call: ModemDialOptions = {\n            path: \"/plugins/\" + this.id + \"/disable\",\n            method: \"POST\",\n            query: query\n        };\n\n        await this.modem.dial(call);\n    }\n\n    static fromPlugin(modem: Modem, plugin: Plugin) {\n        const id = plugin.Id;\n        return new PluginHandle(modem, id);\n    }\n}","import Modem, { ModemDialOptions, ModemDialStreamResult } from \"../api/Modem\";\nimport HandleLogWrapper from \"../utils/HandleLogWrapper\";\nimport { PluginPrivilege } from \"../utils/types\";\nimport PluginHandle, { PluginId, Plugin } from \"./plugin\";\n\ntype PluginListFilterType = \"capability\" | \"enable\";\n\nexport type PluginListFilters = Map<PluginListFilterType, Array<string>>;\nexport type PluginListResult = Array<Plugin>;\n\nexport type PluginListQueryOptions = {\n    filters?: PluginListFilters\n};\n\nexport type PluginGetPrivilegesQueryOptions = {\n    remote: string\n};\n\ntype PluginGetPrivilegesResult = Array<PluginPrivilege>;\n\nexport type PluginInstallQueryOptions = PluginGetPrivilegesQueryOptions & {\n    name?: string\n};\n\nexport default class Plugins {\n    static async list(modem: Modem, queryOptions: PluginListQueryOptions = {}) {\n        const query = new Map();\n        if (queryOptions.filters) query.set(\"filter\", JSON.stringify(Object.fromEntries(queryOptions.filters)));\n\n        const call: ModemDialOptions = {\n            path: \"/plugins\",\n            method: \"GET\",\n            query: query\n        };\n\n        return await modem.dial(call) as PluginListResult;\n    }\n\n    /**\n     * \n     * @param modem modem to use\n     * @param queryOptions query options to use\n     * @param registryAuth is not included in docker api docs but is required for private repos to correctly return privileges\n     * @returns \n     */\n    static async getPrivileges(modem: Modem, queryOptions: PluginGetPrivilegesQueryOptions, registryAuth?: string) {\n        const headers = new Map();\n        if (registryAuth) headers.set(\"X-Registry-Auth\", registryAuth);\n\n        const query = new Map();\n        query.set(\"remote\", queryOptions.remote);\n\n        const call: ModemDialOptions = {\n            path: \"/plugins/privileges\",\n            method: \"GET\",\n            headers: headers,\n            query: query\n        };\n\n        return await modem.dial(call) as PluginGetPrivilegesResult;\n    }\n\n    static async install(modem: Modem, queryOptions: PluginInstallQueryOptions, privileges: Array<PluginPrivilege>, registryAuth?: string) {\n        const headers = new Map();\n        if (registryAuth) headers.set(\"X-Registry-Auth\", registryAuth);\n\n        const query = new Map();\n        query.set(\"remote\", queryOptions.remote);\n        if (queryOptions.name) query.set(\"name\", queryOptions.name);\n\n        const call: ModemDialOptions = {\n            path: \"/plugins/pull\",\n            method: \"POST\",\n            headers: headers,\n            query: query,\n            body: privileges,\n            isStream: true // needed here because the endpoint streams the stdout of the plugin install process\n        };\n\n        const name = queryOptions.name ? queryOptions.name : queryOptions.remote;\n\n        // TODO do do someting with the stdout from this endpoint\n        // throw an error if it could not install\n        const stream = await modem.dial(call) as ModemDialStreamResult;\n        const handle = new PluginHandle(modem, name);\n        const logWrapper = new HandleLogWrapper(handle, stream);\n\n        await logWrapper.drainLogStream();\n        return logWrapper;\n    }\n\n    static async installGrantAllPrivileges(modem: Modem, queryOptions: PluginInstallQueryOptions, registryAuth?: string) {\n        const privileges = await Plugins.getPrivileges(modem, queryOptions as PluginGetPrivilegesQueryOptions, registryAuth);\n        return await Plugins.install(modem, queryOptions, privileges, registryAuth);\n    }\n\n    static getHandle(modem: Modem, id: PluginId) {\n        return new PluginHandle(modem, id);\n    }\n}\n\n// IDEA maybe add creating plugins\n// IDEA maybe add upgrading plugins\n// IDEA maybe add pushing plugins\n// IDEA maybe add configuring plugins","import Modem, { ModemDialOptions } from \"../api/Modem\";\nimport { DockerLabels, DockerOptions, Driver, SwarmBase, TLSInfo } from \"../utils/types\";\n\ntype SwarmSpecOrchestration = {\n    TaskHistoryRetentionLimit: number\n};\n\ntype SwarmSpecRaft = {\n    SnapshotInterval: number,\n    KeepOldSnapshots: number,\n    LogEntriesForSlowFollowers: number,\n    ElectionTick: number,\n    HeartbeatTick: number\n};\n\ntype SwarmSpecDispatcher = {\n    HeartbeatPeriod: number\n};\n\ntype SwamSpecCAConfigExternalCAProtocol = \"cfssl\";\ntype SwamSpecCAConfigExternalCA = {\n    Protocol: SwamSpecCAConfigExternalCAProtocol,\n    URL: string,\n    Options: DockerOptions,\n    CACert: string\n};\n\ntype SwarmSpecCAConfig = {\n    NodeCertExpiry: number,\n    ExternalCAs: Array<SwamSpecCAConfigExternalCA>,\n    SigningCACert: string,\n    SigningCAKey: string,\n    ForceRotate: number\n};\n\ntype SwarmSpecEncryptionConfig = {\n    AutoLockManagers: boolean\n};\n\ntype SwarmSpecTaskDefaults = {\n    LogDriver: Driver\n};\n\ntype SwarmSpec = {\n    Name: string,\n    Labels: DockerLabels,\n    Orchestration: SwarmSpecOrchestration | null,\n    Raft: SwarmSpecRaft,\n    Dispatcher: SwarmSpecDispatcher,\n    CAConfig: SwarmSpecCAConfig,\n    EncryptionConfig: SwarmSpecEncryptionConfig,\n    TaskDefaults: SwarmSpecTaskDefaults\n};\n\nexport interface SwarmCluster extends SwarmBase<string> {\n    Spec: SwarmSpec,\n    TLSInfo: TLSInfo,\n    RootRotationInProgress: boolean,\n    DataPathPort: number,\n    DefaultAddrPool: Array<Array<string>>,\n    SubnetSize: number\n}\n\ntype SwarmInitSpecBase = {\n    ListenAddr: string,\n    AdvertiseAddr: string,\n    DataPathAddr?: string\n};\n\nexport type SwarmInitSpec = SwarmInitSpecBase & {\n    DataPathPort: number,\n    DefaultAddrPool: Array<string>,\n    ForceNewCluster: boolean,\n    SubnetSize: number,\n    Spec: SwarmSpec\n};\n\nexport type SwarmJoinSpec = SwarmInitSpecBase & {\n    RemoteAddrs: Array<string>,\n    JoinToken: string\n};\n\nexport type SwarmLeaveQueryOptions = {\n    force?: boolean\n};\n\nexport type SwarmUpdateQueryOptions = {\n    rotateWorkerToken?: boolean,\n    rotateManagerToken?: boolean,\n    rotateManagerUnlockKey?: boolean\n};\n\nexport type SwarmUnlockSpec = {\n    UnlockKey: string\n};\n\nexport default class Swarm {\n    static async inspect(modem: Modem) {\n        const call: ModemDialOptions = {\n            path: \"/swarm\",\n            method: \"GET\"\n        };\n\n        return await modem.dial(call) as SwarmCluster;\n    }\n\n    static async initialize(modem: Modem, initSpec: SwarmInitSpec) {\n        const call: ModemDialOptions = {\n            path: \"/swarm/init\",\n            method: \"POST\",\n            body: initSpec\n        };\n\n        return await modem.dial(call);\n    }\n    \n    static async join(modem: Modem, joinSpec: SwarmJoinSpec) {\n        const call: ModemDialOptions = {\n            path: \"/swarm/join\",\n            method: \"POST\",\n            body: joinSpec\n        };\n\n        return await modem.dial(call);\n    }\n\n    static async leave(modem: Modem, queryOptions: SwarmLeaveQueryOptions = {}) {\n        const query = new Map();\n        query.set(\"force\", queryOptions.force ? \"true\" : \"false\");\n\n        const call: ModemDialOptions = {\n            path: \"/swarm/leave\",\n            method: \"POST\",\n            query: query\n        };\n\n        return await modem.dial(call);\n    }\n\n    static async update(modem: Modem, queryOptions: SwarmUpdateQueryOptions = {}, spec: SwarmSpec) {\n        const current = await Swarm.inspect(modem);\n        const version = current.Version.Index;\n\n        const query = new Map();\n        query.set(\"version\", version);\n        query.set(\"rotateWorkerToken\", queryOptions.rotateWorkerToken ? \"true\" : \"false\");\n        query.set(\"rotateManagerToken\", queryOptions.rotateManagerToken ? \"true\" : \"false\");\n        query.set(\"rotateManagerUnlockKey\", queryOptions.rotateManagerUnlockKey ? \"true\" : \"false\");\n\n        const call: ModemDialOptions = {\n            path: \"/swarm/update\",\n            method: \"POST\",\n            query: query,\n            body: spec\n        };\n\n        return await modem.dial(call);\n    }\n\n    static async getUnlockKey(modem: Modem) {\n        const call: ModemDialOptions = {\n            path: \"/swarm/unlockkey\",\n            method: \"GET\"\n        };\n\n        return await modem.dial(call);\n    }\n\n    static async unlock(modem: Modem, unlockSpec: SwarmUnlockSpec) {\n        const call: ModemDialOptions = {\n            path: \"/swarm/unlock\",\n            method: \"POST\",\n            body: unlockSpec\n        };\n\n        return await modem.dial(call);\n    }\n}","import Modem, { ModemDialOptions } from \"../api/Modem\";\nimport { DOCKER_STACK_NAMESPACE_LABEL } from \"../stack/stackDeps\";\nimport Handle from \"../utils/Handle\";\nimport Stackable from \"../utils/Stackable\";\nimport { DockerLabels, Driver, SwarmBase } from \"../utils/types\";\n\nexport type SecretId = string;\n\ninterface SecretSpecBase {\n    Name: string,\n    Labels?: DockerLabels,\n    Driver?: Driver,\n    Templating?: Driver\n}\n\nexport interface SecretSpec extends SecretSpecBase {\n    Data: string,\n};\n\nexport interface Secret extends SwarmBase<SecretId> {\n    Spec: SecretSpecBase\n}\n\nexport default class SecretHandle extends Handle implements Stackable {\n    async inspect() {\n        const call: ModemDialOptions = {\n            path: \"/secrets/\" + this.id,\n            method: \"GET\"\n        };\n\n        return await this.modem.dial(call) as Secret;\n    }\n\n    /**\n     * @see https://docs.docker.com/engine/api/v1.44/#tag/Secret/operation/SecretUpdate\n     * @param spec \n     */\n    async update(spec: SecretSpec) {\n        const current = await this.inspect();\n        const version = current.Version.Index;\n\n        const query = new Map();\n        query.set(\"version\", version);\n\n        const newSpec = current.Spec;\n        newSpec.Labels = spec.Labels;\n\n        const call: ModemDialOptions = {\n            path: \"/secrets/\" + this.id + \"/update\",\n            method: \"POST\",\n            query: query,\n            body: newSpec\n        };\n\n        await this.modem.dial(call);\n    }\n\n    async remove() {\n        const current = await this.inspect();\n\n        if (this.shouldThrowStackError() && SecretHandle.isPartOfStack(current))\n            throw new Error(\"The current secret was created by a stack, it can not be removed individually\");\n\n        const call: ModemDialOptions = {\n            path: \"/secrets/\" + this.id,\n            method: \"DELETE\"\n        };\n\n        await this.modem.dial(call);\n    }\n\n    public shouldThrowStackError() {\n        return true;\n    }\n\n    static isPartOfStack(secret: Secret) {\n        return secret.Spec.Labels && DOCKER_STACK_NAMESPACE_LABEL in secret.Spec.Labels;\n    }\n\n    static fromSecret(modem: Modem, secret: Secret) {\n        const id = secret.ID;\n        return new SecretHandle(modem, id);\n    }\n}","import Modem, { ModemDialOptions } from \"../api/Modem\";\nimport SecretHandle, { Secret, SecretId, SecretSpec } from \"./secret\";\n\ntype SecretListFilterType = \"id\" | \"label\" | \"name\" | \"names\";\n\nexport type SecretListFilters = Map<SecretListFilterType, Array<string>>;\nexport type SecretListResult = Array<Secret>;\n\nexport type SecretListQueryOptions = {\n    filters?: SecretListFilters\n};\n\ntype SecretCreateResult = {\n    ID: SecretId\n};\n\nexport default class Secrets {\n    static async list(modem: Modem, queryOptions: SecretListQueryOptions = {}) {\n        const query = new Map();\n        if (queryOptions.filters) query.set(\"filters\", JSON.stringify(Object.fromEntries(queryOptions.filters)));\n\n        const call: ModemDialOptions = {\n            path: \"/secrets\",\n            method: \"GET\",\n            query: query\n        };\n\n        return await modem.dial(call) as SecretListResult;\n    }\n\n    static async create(modem: Modem, spec: SecretSpec) {\n        const call: ModemDialOptions = {\n            path: \"/secrets/create\",\n            method: \"POST\",\n            body: spec\n        };\n\n        const result = await modem.dial(call) as SecretCreateResult;\n        return new SecretHandle(modem, result.ID);\n    }\n\n    static getHandle(modem: Modem, id: SecretId) {\n        return new SecretHandle(modem, id);\n    }\n}","import Modem, { ModemDialOptions } from \"../api/Modem\";\nimport ServiceHandle, { Service, ServiceId, ServiceSpec } from \"./service\";\n\ntype ServiceListFilterType = \"id\" | \"label\" | \"mode\" | \"name\";\n\nexport type ServiceListFilters = Map<ServiceListFilterType, Array<string>>;\nexport type ServiceListResult = Array<Service>;\n\nexport type ServiceListQueryOptions = {\n    filters?: ServiceListFilters\n    status?: boolean\n};\n\ntype ServiceCreateResult = {\n    ID: ServiceId,\n    Warnings: Array<string>\n};\n\nexport default class Services {\n    /**\n     * @see https://docs.docker.com/engine/api/v1.44/#tag/Service/operation/ServiceList\n     * \n     * @param modem the modem to use \n     * @param filters the filters to use \n     * @param status include service status \n     */\n    static async list(modem: Modem, queryOptions: ServiceListQueryOptions = {}) {\n        const status = typeof queryOptions.status === \"undefined\" ? true : queryOptions.status;\n        \n        const query = new Map();\n        query.set(\"status\", status ? \"true\" : \"false\");\n        if (queryOptions.filters) query.set(\"filters\", JSON.stringify(Object.fromEntries(queryOptions.filters)));\n\n        const call: ModemDialOptions = {\n            path: \"/services\",\n            method: \"GET\",\n            query: query\n        };\n\n        return await modem.dial(call) as ServiceListResult;\n    }\n\n    static async create(modem: Modem, spec: ServiceSpec, registryAuth?: string) {\n        const headers = new Map();\n        if (registryAuth) headers.set(\"X-Registry-Auth\", registryAuth);\n\n        const call: ModemDialOptions = {\n            path: \"/services/create\",\n            method: \"POST\",\n            headers: headers,\n            body: spec\n        };\n\n        const result = await modem.dial(call) as ServiceCreateResult;\n        return new ServiceHandle(modem, result.ID);\n    }\n\n    static getHandle(modem: Modem, id: ServiceId) {\n        return new ServiceHandle(modem, id);\n    }\n}","import Modem, { ModemDialOptions, ModemDialStreamResult } from \"../api/Modem\";\nimport { NetworkId } from \"../network/network\";\nimport { DOCKER_STACK_NAMESPACE_LABEL } from \"../stack/stackDeps\";\nimport { TaskSpec } from \"../task/task\";\nimport Handle from \"../utils/Handle\";\nimport Stackable from \"../utils/Stackable\";\nimport { ALLXOR, DockerLabels, EndpointPortConfig, EndpointSpec, NetworkAttachementConfig, ObjectVersion, SwarmBase } from \"../utils/types\";\nimport Services from \"./services\";\n\nexport type ServiceId = string;\n\ntype ServiceModeReplicated = {\n    Replicas: number\n};\n\ntype ServiceModeReplicatedJob = {\n    MaxConcurrent: number, // default 1\n    TotalCompletions: number\n};\n\ntype ServiceModeReplicatedWrapper = {\n    Replicated: ServiceModeReplicated\n};\ntype ServiceModeReplicatedJobWrapper = {\n    ReplicatedJob: ServiceModeReplicatedJob\n}\ntype ServiceModeGlobalWrapper = {\n    Global: object;\n};\ntype ServiceModeGlobalJobWrapper = {\n    GlobalJob: object;\n};\n\ntype ServiceMode = ALLXOR<[ServiceModeReplicatedWrapper, ServiceModeReplicatedJobWrapper, ServiceModeGlobalWrapper, ServiceModeGlobalJobWrapper]>;\n\ntype ServiceConfigOrder = \"stop-first\" | \"start-first\";\nexport interface ServiceConfig<FailureActionType extends string> {\n    Parallelism: number, // 0 = unlimited\n    Delay: number,\n    FailureAction: FailureActionType,\n    Monitor: number,\n    MaxFailureRatio: number,\n    Order: ServiceConfigOrder\n}\n\ntype ServiceUpdateConfigFailureAction = \"continue\" | \"pause\" | \"rollback\";\ntype ServiceRollbackConfigFailureAction = \"continue\" | \"pause\";\n\nexport type ServiceSpec = {\n    Name?: string,\n    Labels?: DockerLabels,\n    TaskTemplate: TaskSpec,\n    Mode?: ServiceMode,\n    UpdateConfig?: ServiceConfig<ServiceUpdateConfigFailureAction>,\n    RollbackConfig?: ServiceConfig<ServiceRollbackConfigFailureAction>,\n    Networks?: Array<NetworkAttachementConfig>,\n    EndpointSpec?: EndpointSpec,\n};\n\nexport type ServiceEndpointVirtualIP = {\n    NetworkID: NetworkId,\n    Addr: string\n};\n\ntype ServiceEndpoint = {\n    Spec: EndpointSpec,\n    Ports?: Array<EndpointPortConfig>,\n    VirtualIPs?: Array<ServiceEndpointVirtualIP>\n};\n\ntype ServiceUpdateStatusState = \"updating\" | \"paused\" | \"completed\";\ntype ServiceUpdateStatus = {\n    State: ServiceUpdateStatusState,\n    StartedAt: string,\n    CompletedAt: string,\n    Message: string\n};\n\ntype ServiceServiceStatus = {\n    RunningTasks: number,\n    DesiredTasks: number,\n    CompletedTasks: number\n};\n\ntype ServiceJobStatus = {\n    JobIteration: ObjectVersion,\n    LastExecution: string\n};\n\nexport interface Service extends SwarmBase<ServiceId> {\n    Spec: ServiceSpec,\n    PreviousSpec?: ServiceSpec,\n    Endpoint: ServiceEndpoint,\n    UpdateStatus: ServiceUpdateStatus,\n    ServiceStatus: ServiceServiceStatus,\n    JobStatus: ServiceJobStatus\n};\n\nexport type ServiceInspectQueryOptions = {\n    insertDefaults?: boolean\n};\n\nexport type ServiceLogsQueryOptions = {\n    details?: boolean,\n    follow?: boolean,\n    stdout?: boolean,\n    stderr?: boolean,\n    since?: number,\n    timestamps?: boolean,\n    tail?: number | \"all\"\n};\n\ntype ServiceUpdateQueryOptionsRegistryAuthFrom = \"spec\" | \"previous-spec\";\nexport type ServiceRollbackQueryOptions = {\n    registryAuthFrom?: ServiceUpdateQueryOptionsRegistryAuthFrom\n};\n\nexport type ServiceUpdateQueryOptions = ServiceRollbackQueryOptions & {\n    rollback?: string\n};\n\ntype ServiceUpdateResult = {\n    Warnings: Array<string>\n};\n\nexport default class ServiceHandle extends Handle implements Stackable {\n    async inspect(queryOptions: ServiceInspectQueryOptions = {}) {\n        const query = new Map();\n        query.set(\"insertDefaults\", queryOptions.insertDefaults ? \"true\" : \"false\");\n\n        const call: ModemDialOptions = {\n            path: \"/services/\" + this.id,\n            method: \"GET\",\n            query: query\n        };\n\n        return await this.modem.dial(call) as Service;\n    }\n\n    /**\n     * @see https://docs.docker.com/engine/api/v1.44/#tag/Service/operation/ServiceLogs\n     * \n     * @param queryOptions the query options to use\n     */\n    async getLogs(queryOptions: ServiceLogsQueryOptions = {}) {\n        const query = new Map();\n        query.set(\"details\", queryOptions.details ? \"true\" : \"false\");\n        query.set(\"follow\", queryOptions.follow ? \"true\" : \"false\");\n        query.set(\"stdout\", queryOptions.stdout ? \"true\" : \"false\");\n        query.set(\"stderr\", queryOptions.stdout ? \"true\" : \"false\");\n        query.set(\"since\", queryOptions.since || 0);\n        query.set(\"timestamps\", queryOptions.timestamps ? \"true\" : \"false\");\n        query.set(\"tail\", queryOptions.tail || \"all\");\n\n        const call: ModemDialOptions = {\n            path: \"/services/\" + this.id + \"/logs\",\n            method: \"GET\",\n            query: query\n        };\n\n        return await this.modem.dial(call) as ModemDialStreamResult;\n    }\n\n    /**\n     * @see https://docs.docker.com/engine/api/v1.44/#tag/Service/operation/ServiceUpdate\n     * \n     * @param newSpec the new spec for the service\n     * @param queryOptions the query options to use\n     * @param registryAuth the authentication to connect to a private registry if needed\n     */\n    async update(newSpec: ServiceSpec, queryOptions: ServiceUpdateQueryOptions = {}, registryAuth?: string) {\n        const current = await this.inspect();\n        const version = current.Version.Index;\n\n        const headers = new Map();\n        if (registryAuth) headers.set(\"X-Registry-Auth\", registryAuth);\n\n        const query = new Map();\n        query.set(\"version\", version);\n        query.set(\"registryAuthFrom\", queryOptions.registryAuthFrom || \"spec\");\n\n        if (queryOptions.rollback) query.set(\"rollback\", queryOptions.rollback);\n\n        const body = newSpec;\n        const call: ModemDialOptions = {\n            path: \"/services/\" + this.id + \"/update\",\n            method: \"POST\",\n            headers: headers,\n            query: query,\n            body: body\n        };\n\n        return await this.modem.dial(call) as ServiceUpdateResult;\n    }\n\n    /**\n     * Removes this service and creates a new one with the same spec\n     * @param registryAuth \n     */\n    async redeploy(registryAuth?: string) {\n        const current = await this.inspect({ insertDefaults: true });\n\n        if (this.shouldThrowStackError() && ServiceHandle.isPartOfStack(current))\n            throw new Error(\"The current service was created by a stack, consider redeploying the stack\");\n\n        const spec = current.Spec;\n\n        await this.remove();\n        return await Services.create(this.modem, spec, registryAuth);\n    }\n\n    async rollback(queryOptions: ServiceRollbackQueryOptions = { registryAuthFrom: \"spec\" }, registryAuth?: string) {\n        const current = await this.inspect();\n\n        const rollbackQueryOptions: ServiceUpdateQueryOptions = Object.assign(queryOptions, {\n            rollback: \"previous\"\n        });\n\n        return await this.update(current.Spec, rollbackQueryOptions, registryAuth);\n    }\n\n    async stop() {\n        const current = await this.inspect();\n        const spec = current.Spec;\n\n        if (spec.Mode?.Replicated && spec.Mode.Replicated.Replicas > 0) {\n            spec.Mode.Replicated.Replicas = 0;\n\n            return await this.update(spec);\n        } else if (spec.Mode?.Replicated && spec.Mode.Replicated.Replicas <= 0)\n            throw new Error(\"This service is already stoppped\");\n\n        throw new Error(\"The service is not a replicated service and can not be stopped\");\n    }\n\n    /**\n     * This will start a stopped service.  \n     * Be careful tho, because it does a server side redeploy to the last running spec.  \n     * And it only does that if the service is not running\n     */\n    async start() {\n        const current = await this.inspect();\n        const spec = current.Spec;\n        const prev = current.PreviousSpec;\n\n        if (prev && prev.Mode?.Replicated && prev.Mode.Replicated.Replicas > 0 && spec.Mode?.Replicated && spec.Mode.Replicated.Replicas <= 0)\n            return await this.rollback();\n        else if (prev && prev.Mode?.Replicated && prev.Mode.Replicated.Replicas > 0 &&  spec.Mode?.Replicated && spec.Mode.Replicated.Replicas > 0)\n            throw new Error(\"This service is not stoppped\");\n        else if (prev && prev.Mode?.Replicated && prev.Mode.Replicated.Replicas <= 0)\n            throw new Error(\"This service can not be started, scale it to any number\");\n        else if (!prev)\n            throw new Error(\"This service never started, scale it to any number first\");\n        else\n            throw new Error(\"Unexpected error\");\n    }\n\n    async remove() {\n        const current = await this.inspect({ insertDefaults: true });\n\n        if (this.shouldThrowStackError() && ServiceHandle.isPartOfStack(current))\n            throw new Error(\"The current service was created by a stack, it can not be removed individually\");\n\n        const call: ModemDialOptions = {\n            path: \"/services/\" + this.id,\n            method: \"DELETE\"\n        };\n\n        return await this.modem.dial(call);\n    }\n\n    public shouldThrowStackError() {\n        return true;\n    }\n\n    static isPartOfStack(service: Service) {\n        return service.Spec.Labels && DOCKER_STACK_NAMESPACE_LABEL in service.Spec.Labels;\n    }\n\n    static fromService(modem: Modem, service: Service) {\n        const id = service.ID;\n        return new ServiceHandle(modem, id);\n    }\n}","import Modem, { ModemDialOptions, ModemDialStreamResult } from \"../api/Modem\";\nimport { ContainerSummary } from \"../container/container\";\nimport { ImageSummary } from \"../image/image\";\nimport { SwarmCluster } from \"../swarm/swarm\";\nimport { DockerOptions, DockerLabels, GenericResource, ObjectVersion, PeerNode, Runtime, Driver, TLSInfo, Isolation, Commit, BuildCache } from \"../utils/types\";\nimport { ClusterVolume } from \"../volume/clusterVolume\";\nimport { Volume } from \"../volume/volume\";\n\nexport interface AuthCredentials {\n    username: string,\n    password: string,\n    email: string,\n    serveraddress: string\n}\n\ntype AuthResult = {\n    Status: string,\n    IdentityToken: string\n};\n\ntype SystemPluginsInfo = {\n    Volume: Array<string>,\n    Network: Array<string>,\n    Authroization: Array<string>,\n    Log: Array<string>\n};\n\ntype SystemCgroupDriver = \"cgroupfs\" | \"systemd\" | \"none\";\ntype SystemCgroupVersion = \"1\" | \"2\";\n\ntype SystemRegistryServiceConfigIndexConfig = {\n    [name: string]: object | null\n};\n\ntype SystemRegistryServiceConfig = {\n    AllowNondistributableArtifactsCIDRs: Array<string>,\n    AllowNondistributableArtifactsHostnames: Array<string>,\n    InsecureRegistryCIDRs: Array<string>,\n    IndexConfig: SystemRegistryServiceConfigIndexConfig,\n    Mirrors: Array<string>\n};\n\ntype SystemRuntimes = {\n    [name: string]: Runtime\n};\n\ntype SystemSwarmInfoLocalNodeState = \"\" | \"inactive\" | \"pending\" | \"active\" | \"error\" | \"locked\";\ntype SystemSwarmInfo = {\n    NodeID: string,\n    NodeAddr: string,\n    LocalNodeState: SystemSwarmInfoLocalNodeState,\n    ControlAvailable: boolean,\n    Error: string,\n    RemoteManagers: Array<PeerNode> | null,\n    Nodes: number | null,\n    Managers: number | null,\n    Cluster: SwarmCluster\n};\n\ntype SystemDefaultAddressPool = {\n    Base: string,\n    Site: number\n};\n\ntype SystemInformation = {\n    ID: string,\n    Containers: number,\n    ContainersRunning: number,\n    ContainersPaused: number,\n    ContainersStopped: number,\n    Images: number,\n    Driver: string,\n    DriverStatus: Array<Array<string>>,\n    DockerRootDir: string,\n    Plugins: SystemPluginsInfo,\n    MemoryLimit: boolean,\n    SwapLimit: boolean,\n    KernelMemoryTCP: boolean,\n    CpuCfsPeriod: boolean,\n    CpuCfsQuota: boolean,\n    CPUShares: boolean,\n    CPUSet: boolean,\n    PidsLimit: boolean,\n    OomKillDisable: boolean,\n    IPv4Forwarding: boolean,\n    BridgeNfIptables: boolean,\n    BridgeNfIp6tables: boolean,\n    Debug: boolean,\n    NFd: number,\n    NGoroutines: number,\n    SystemTime: string,\n    LoggingDriver: string,\n    CgroupDriver: SystemCgroupDriver,\n    CgroupVersion: SystemCgroupVersion,\n    NEventsListener: number,\n    KernelVersion: string,\n    OperatingSystem: string,\n    OSVersion: string,\n    OSType: string,\n    Architecture: string,\n    NCPU: number,\n    MemTotal: number,\n    IndexServerAddress: string,\n    RegistryConfig: SystemRegistryServiceConfig,\n    GenericResources: Array<GenericResource>,\n    HttpProxy: string,\n    HttpsProxy: string,\n    NoProxy: string,\n    Name: string,\n    Labels: Array<string>,\n    ExperimentalBuild: boolean,\n    ServerVersion: string,\n    Runtimes: SystemRuntimes,\n    DefaultRuntime: string,\n    Swarm: SystemSwarmInfo,\n    LiveRestoreEnabled: boolean,\n    Isolation: Isolation,\n    InitBinary: string,\n    ContainerdCommit: Commit,\n    RuncCommit: Commit,\n    InitCommit: Commit,\n    SecurityOptions: Array<string>,\n    ProductLicense: string,\n    DefaultAddressPools: Array<SystemDefaultAddressPool>,\n    Warnings: Array<string>,\n    CDISpecDirs: Array<string>\n};\n\ntype SystemVersionPlatform = {\n    Name: string\n};\n\ntype SystemVersionComponent = {\n    Name: string,\n    Version: string,\n    Details: object | null\n;}\n\nexport interface SystemVersion {\n    Platform: SystemVersionPlatform,\n    Components: Array<SystemVersionComponent>,\n    Version: string,\n    ApiVersion: string,\n    MinAPIVersion: string,\n    GitCommit: string,\n    GoVersion: string,\n    Os: string,\n    Arch: string,\n    KernelVersion: string,\n    Experimental: boolean,\n    BuildTime: string\n};\n\ntype SystemPingDataSwarm = \"inactive\" | \"pending\" | \"error\" | \"locked\" | \"active/worker\" | \"active/manager\";\ntype SystemPingDataCacheControl = \"no-cache\" | \"no-store\" | \"must-revalidate\";\nexport interface SystemPingData {\n    \"API-Version\": string,\n    \"Builder-Version\": string,\n    \"Docker-Experimental\": boolean,\n    Swarm: SystemPingDataSwarm,\n    \"Cache-Control\": SystemPingDataCacheControl,\n    Pragma: string\n}\n\nexport type SystemUsageDataType = \"container\" | \"image\" | \"volume\" | \"build-cache\";\nexport type SystemUsageDataQueryOptions = {\n    type?: Array<SystemUsageDataType>\n};\n\nexport type SystemMonitorEventsFilterType = \"config\" | \"container\" | \"daemon\" | \"event\" | \"image\" | \"label\" | \"network\" | \"node\" | \"plugin\" | \"scope\" | \"secret\" | \"service\" | \"type\" | \"volume\";\n/**\n * Query options for minitoring events\n * @see https://docs.docker.com/reference/api/engine/version/v1.44/#tag/System/operation/SystemEvents\n */\nexport type SystemMonitorEventsQueryOptions = {\n    since?: string,\n    until?: string,\n    filters?: Map<SystemMonitorEventsFilterType, Array<string>>\n};\n\ntype SystemMonitorEventsActorAttributes = {\n    [name: string]: string\n};\n\ntype SystemMonitorEventsActor = {\n    ID: string,\n    Attributes: SystemMonitorEventsActorAttributes\n};\n\nexport type SystemMonitorEventsResultType = \"builder\" | \"config\" | \"container\" | \"daemon\" | \"image\" | \"network\" | \"node\" | \"plugin\" | \"secret\" | \"service\" | \"volume\";\nexport type SystemMonitorEventsScope = \"local\" | \"swarm\";\nexport type SystemMonitorEventsResult = {\n    Type: SystemMonitorEventsResultType,\n    Action: string,\n    Actor: SystemMonitorEventsActor,\n    scope: SystemMonitorEventsScope,\n    time: number,\n    timeName: number\n}\n\ntype SystemUsageData = {\n    LayerSize: number,\n    Images: Array<ImageSummary>,\n    Containers: Array<ContainerSummary>,\n    Volumes: Array<Volume | ClusterVolume>,\n    BuildCache: Array<BuildCache>\n};\n\nexport default class System {\n    static async auth(modem: Modem, credentials: AuthCredentials) {\n        const call: ModemDialOptions = {\n            path: \"/auth\",\n            method: \"POST\",\n            body: credentials\n        };\n\n        return await modem.dial(call) as AuthResult;\n    }\n\n    static async info(modem: Modem) {\n        const call: ModemDialOptions = {\n            path: \"/info\",\n            method: \"GET\"\n        };\n\n        return await modem.dial(call) as SystemInformation;\n    }\n\n    static async version(modem: Modem) {\n        const call: ModemDialOptions = {\n            path: \"/version\",\n            method: \"GET\"\n        };\n\n        return await modem.dial(call) as SystemVersion;\n    }\n\n    static async ping(modem: Modem) {\n        const call: ModemDialOptions = {\n            path: \"/_ping\",\n            method: \"GET\"\n        };\n\n        await modem.dial(call) as SystemPingData;\n    }\n\n    /**\n     * @see https://docs.docker.com/engine/api/v1.44/#tag/System/operation/SystemEvents\n     * \n     * @param modem \n     * @param queryOptions \n     */\n    static async monitorEvents(modem: Modem, queryOptions: SystemMonitorEventsQueryOptions = {}) {\n        const query = new Map();\n        if (queryOptions.since) query.set(\"since\", queryOptions.since);\n        if (queryOptions.until) query.set(\"until\", queryOptions.until);\n        if (queryOptions.filters) query.set(\"filters\", JSON.stringify(Object.fromEntries(queryOptions.filters)));\n        \n        const call: ModemDialOptions = {\n            path: \"/events\",\n            method: \"GET\",\n            query: query,\n            isStream: true\n        };\n\n        return await modem.dial(call) as ModemDialStreamResult;\n    }\n\n    static async usageData(modem: Modem, queryOptions: SystemUsageDataQueryOptions = {}) {\n        const query = new Map();\n        if (queryOptions.type) query.set(\"type\", JSON.stringify(queryOptions.type));\n\n        const call: ModemDialOptions = {\n            path: \"/system/df\",\n            method: \"GET\",\n            query: query\n        };\n\n        return await modem.dial(call) as SystemUsageData;\n    }\n}","import Modem, { ModemDialOptions, ModemDialStreamResult } from \"../api/Modem\";\nimport { ContainerId, ContainerStatus } from \"../container/container\";\nimport { NodeId } from \"../node/node\";\nimport { ServiceId } from \"../service/service\";\nimport Handle from \"../utils/Handle\";\nimport { ALLXOR, DockerLabels, DockerResources, HealthConfig, Driver, Mount, NetworkAttachementConfig, Platform, PluginPrivilege, Isolation, ObjectVersion, GenericResource, PortStatus, XOR, SwarmBase } from \"../utils/types\";\n\nexport type TaskId = string;\n\ntype TaskPluginSpec = {\n    Name: string,\n    Remote: string,\n    Disabled: boolean,\n    PluginPrivileges: Array<PluginPrivilege>\n};\n\ntype TaskContainerPrivilegesCredentialSpec = {\n    Config: string,\n    File: string,\n    Registry: string\n};\n\ntype TaskContainerPrivilegesSELinuxContext = {\n    Disable: boolean,\n    User: string,\n    Role: string,\n    Type: string,\n    Level: string\n};\n\ntype TaskContainerPrivilegesSeccompMode = \"default\" | \"unconfined\" | \"custom\";\ntype TaskContainerPrivilegesSeccomp = {\n    Mode: TaskContainerPrivilegesSeccompMode,\n    Profile: string\n};\n\ntype TaskContainerPrivilegesAppArmorMode = \"default\" | \"disabled\";\ntype TaskContainerPrivilegesAppArmor = {\n    Mode: TaskContainerPrivilegesAppArmorMode\n};\n\ntype TaskContainerPrivileges = {\n    CredentialSpec: TaskContainerPrivilegesCredentialSpec,\n    SELinuxContext: TaskContainerPrivilegesSELinuxContext,\n    Seccomp: TaskContainerPrivilegesSeccomp,\n    AppArmor: TaskContainerPrivilegesAppArmor,\n    NoNewPrivileges: boolean\n};\n\ntype TaskContainerDNSConfig = {\n    NameServers: Array<string>,\n    Search: Array<string>,\n    Options: Array<string>\n};\n\ntype TaskContainerFile = {\n    Name: string,\n    UID: string,\n    GID: string,\n    Mode: number\n};\n\nexport type TaskContainerSecret = {\n    File: TaskContainerFile,\n    SecretID: string,\n    SecretName: string\n};\n\ntype TaskContainerConfigFile = { File: TaskContainerFile };\ntype TaskContainerConfigRuntime = { Runtime: object };\n\ntype TaskContainerConfigBase = {\n    ConfigID: string,\n    ConfigName: string\n}\n\nexport type TaskContainerConfig = XOR<TaskContainerConfigFile, TaskContainerConfigRuntime> & TaskContainerConfigBase;\n\ntype TaskContainerSysctls = {\n    [name: string]: string\n};\n\ntype TaskContainerUlimit = {\n    Name: string,\n    Soft: number,\n    Hard: number\n};\n\ntype TaskContainerSpec = {\n    Image: string,\n    Labels?: DockerLabels,\n    Command?: Array<string>,\n    Args?: Array<string>,\n    Hostname?: string,\n    Env?: Array<string>,\n    Dir?: string,\n    User?: string,\n    Groups?: Array<string>,\n    Privileges?: TaskContainerPrivileges,\n    TTY?: boolean,\n    OpenStdin?: boolean,\n    ReadOnly?: boolean,\n    Mounts?: Array<Mount>,\n    StopSignal?: string,\n    StopGracePeriod?: number,\n    HealthCheck?: HealthConfig,\n    Hosts?: Array<string>,\n    DNSConfig?: TaskContainerDNSConfig,\n    Secrets?: Array<TaskContainerSecret>,\n    Configs?: Array<TaskContainerConfig>,\n    Isolation?: Isolation,\n    Init?: boolean | null,\n    Sysctls?: TaskContainerSysctls,\n    CapabilityAdd?: Array<string>,\n    CapabilityDrop?: Array<string>,\n    Ulimits?: Array<TaskContainerUlimit>\n};\n\ntype TaskNetworkAttachmentSpec = {\n    ContainerID: ContainerId\n};\n\ntype TaskRestartPolicyCondition = \"none\" | \"on-failure\" | \"any\";\ntype TaskRestartPolicy = {\n    Condition: TaskRestartPolicyCondition,\n    Delay: number,\n    MaxAttempts: number, // 0 = ignored\n    Window: number // 0 = unbound\n};\n\ntype TaskPlacementPreferenceSpread = {\n    SpreadDescriptor: string\n};\n\nexport type TaskPlacementPreference = {\n    Spread: TaskPlacementPreferenceSpread\n};\n\n/**\n * @see https://docs.docker.com/engine/api/v1.44/#tag/Service/operation/ServiceList\n */\nexport type TaskPlacement = {\n    Constraints: Array<string>,\n    Preferences: Array<TaskPlacementPreference>,\n    MaxReplicas: number, // 0 = unlimited\n    Platforms: Array<Platform>\n};\n\ntype TaskSpecBase = {\n    Resources?: DockerResources,\n    RestartPolicy?: TaskRestartPolicy,\n    Placement?: TaskPlacement,\n    ForceUpdate?: number,\n    Runtime?: string,\n    Networks?: Array<NetworkAttachementConfig>,\n    LogDriver?: Driver\n};\n\ntype PluginTaskSpec = { PluginSpec: TaskPluginSpec };\ntype ContainerTaskSpec = { ContainerSpec: TaskContainerSpec };\ntype NetworkAttachmentTaskSpec = { NetworkAttachmentSpec: TaskNetworkAttachmentSpec };\n\nexport type TaskSpec = ALLXOR<[PluginTaskSpec, ContainerTaskSpec, NetworkAttachmentTaskSpec]> & TaskSpecBase;\n\ntype TaskState = \"new\" | \"allocated\" | \"pending\" | \"assigned\" | \"accepted\" | \"preparing\" | \"ready\" | \"starting\" | \"running\" | \"complete\" | \"shutdown\" | \"failed\" | \"rejected\" | \"remove\" | \"orphaned\";\ntype TaskStatus = {\n    Timestamp: string,\n    State: TaskState,\n    Message: string,\n    Err: string,\n    ContainerStatus?: ContainerStatus,\n    PortStatus: PortStatus,\n};\n\nexport interface Task extends SwarmBase<TaskId> {\n    Name: string,\n    Labels: DockerLabels,\n    Spec: TaskSpec,\n    ServiceID: ServiceId,\n    Slot: number,\n    NodeID: NodeId,\n    AssignedGenericResources: Array<GenericResource>,\n    Status: TaskStatus,\n    Desired: TaskState,\n    JobIteration: ObjectVersion\n}\n\nexport type TaskLogsQueryOptions = {\n    details?: boolean,\n    follow?: boolean,\n    stdout?: boolean,\n    stderr?: boolean,\n    since?: number,\n    timestamps?: boolean,\n    tail?: string | \"all\"\n};\n\nexport default class TaskHandle extends Handle {\n    async inspect() {\n        const call: ModemDialOptions = {\n            path: \"/tasks/\" + this.id,\n            method: \"GET\"\n        };\n\n        return await this.modem.dial(call) as Task;\n    }\n\n    async getLogs(queryOptions: TaskLogsQueryOptions = {}) {\n        const query = new Map();\n        query.set(\"details\", queryOptions.details ? \"true\" : \"false\");\n        query.set(\"follow\", queryOptions.follow ? \"true\" : \"false\");\n        query.set(\"stdout\", queryOptions.stdout ? \"true\" : \"false\");\n        query.set(\"stderr\", queryOptions.stderr ? \"true\" : \"false\");\n        query.set(\"since\", queryOptions.since ? queryOptions.since : 0);\n        query.set(\"timestamps\", queryOptions.timestamps ? \"true\" : \"false\");\n        query.set(\"tail\", queryOptions.tail);\n\n        const call: ModemDialOptions = {\n            path: \"/tasks/\" + this.id + \"/logs\",\n            method: \"GET\",\n            query: query\n        };\n\n        return await this.modem.dial(call) as ModemDialStreamResult;\n    }\n\n    static fromTask(modem: Modem, task: Task) {\n        const id = task.ID;\n        return new TaskHandle(modem, id);\n    }\n}","import Modem, { ModemDialOptions } from \"../api/Modem\";\nimport TaskHandle, { Task, TaskId } from \"./task\";\n\ntype TaskListFilterType = \"desired-state\" | \"id\" | \"label\" | \"name\" | \"node\" | \"service\";\nexport type TaskListFilters = Map<TaskListFilterType, Array<string>>;\n\nexport type TaskListQueryOptions = {\n    filters?: TaskListFilters\n};\n\nexport type TaskListResult = Array<Task>;\n\nexport default class Tasks {\n    static async list(modem: Modem, queryOptions: TaskListQueryOptions = {}) {\n        const query = new Map();\n        if (queryOptions.filters) query.set(\"filters\", JSON.stringify(Object.fromEntries(queryOptions.filters)));\n\n        const call: ModemDialOptions = {\n            path: \"/tasks\",\n            method: \"GET\",\n            query: query\n        };\n\n        return await modem.dial(call) as TaskListResult;\n    }\n\n    static getHandle(modem: Modem, id: TaskId) {\n        return new TaskHandle(modem, id);\n    }\n}","import Modem, { ModemDialOptions } from \"../api/Modem\";\nimport { DOCKER_STACK_NAMESPACE_LABEL } from \"../stack/stackDeps\";\nimport Handle from \"../utils/Handle\";\nimport { DockerOptions, DockerLabels } from \"../utils/types\";\n\ntype DockerVolumeStatus = {\n    [key: string]: string\n};\n\ntype VolumeScope = \"local\" | \"global\";\ntype VolumeUsageData = {\n    Size: number,\n    RefCount: number\n};\n\nexport interface VolumeSpec {\n    Name?: string,\n    Driver?: string,\n    DriverOpts?: DockerOptions,\n    Labels?: DockerLabels\n}\n\nexport interface Volume {\n    Name: string,\n    Driver: string,\n    Mountpoint: string,\n    CreatedAt: string,\n    Status: DockerVolumeStatus,\n    Labels: DockerLabels,\n    Scope: VolumeScope,\n    Options: DockerOptions,\n    UsageData: VolumeUsageData | null\n}\n\nexport type VolumeRemoveQueryOptions = {\n    force?: boolean\n};\n\nexport default class VolumeHandle extends Handle {\n    constructor(modem: Modem, name: string) {\n        super(modem, name);\n    }\n\n    protected async inspectResult() {\n        const query = new Map();\n        query.set(\"name\", this.id);\n\n        const call: ModemDialOptions = {\n            path: \"/volumes/\" + this.id,\n            method: \"GET\",\n            query: query\n        };\n\n        return await this.modem.dial(call);\n    }\n\n    async inspect() {\n        return await this.inspectResult() as Volume;\n    }\n\n    async remove(queryOptions: VolumeRemoveQueryOptions = {}) {\n        const current = await this.inspect();\n        \n        if (this.shouldThrowStackError() && VolumeHandle.isPartOfStack(current))\n            throw new Error(\"The current volume was created by a stack, it can not be removed individually\");\n\n        const query = new Map();\n        query.set(\"force\", queryOptions.force ? \"true\" : \"false\");\n\n        const call: ModemDialOptions = {\n            path: \"/volumes/\" + this.id,\n            method: \"DELETE\",\n            query: query\n        };\n\n        await this.modem.dial(call);\n    }\n\n    protected shouldThrowStackError() {\n        return true;\n    }\n\n    static isPartOfStack(volume: Volume) {\n        return volume.Labels && DOCKER_STACK_NAMESPACE_LABEL in volume.Labels;\n    }\n\n    static fromVolume(modem: Modem, volume: Volume) {\n        const id = volume.Name;\n        return new VolumeHandle(modem, id);\n    }\n}","import VolumeHandle, { Volume, VolumeRemoveQueryOptions, VolumeSpec } from \"./volume\";\nimport Modem, { ModemDialOptions } from \"../api/Modem\";\nimport { SwarmBase, Topology, XOR } from \"../utils/types\";\nimport { DOCKER_STACK_NAMESPACE_LABEL } from \"../stack/stackDeps\";\n\nexport type ClusterVolumeId = string;\n\nexport type ClusterVolumeAccesModeScope = \"single\" | \"multi\";\nexport type ClusterVolumeAccesModeSharing = \"none\" | \"readonly\" | \"onewriter\" | \"all\";\nexport type ClusterVolumeAvailability = \"active\" | \"pause\" | \"drain\";\ntype ClusterVolumeDataPublishStatusState = \"pending-publish\" | \"published\" | \"pending-node-unpublish\" | \"pending-controller-unpublish\";\n\ntype ClusterVolumeAccessModeBase = {\n    Scope?: ClusterVolumeAccesModeScope,\n    Sharing?: ClusterVolumeAccesModeSharing\n};\n\ntype ClusterVolumeAccessModeMountVolume = { MountVolume: object };\ntype ClusterVolumeAccessModeBlockVolume = { BlockVolume: object };\n\ntype ClusterVolumeAccessMode = ClusterVolumeAccessModeBase & XOR<ClusterVolumeAccessModeMountVolume, ClusterVolumeAccessModeBlockVolume>;\nexport type ClusterVolumeSecret = {\n    Key: string,\n    Secret: string\n};\n\ntype ClusterVolumeAccessibilityRequirements = {\n    Requisite: Array<object>,\n    Preferred: Array<object>\n};\n\ntype ClusterVolumeCapacityRange = {\n    RequiredBytes: number,\n    LimitBytes: number\n};\n\ntype ClusterVolumeSpecBase = {\n    Group?: string,\n    AccessMode: ClusterVolumeAccessMode,\n    Secrets?: Array<ClusterVolumeSecret>,\n    AccessibilityRequirements?: ClusterVolumeAccessibilityRequirements,\n    CapacityRange?: ClusterVolumeCapacityRange,\n    Availability?: ClusterVolumeAvailability\n};\n\ntype ClusterVolumeDataInfo = {\n    CapacityBytes: number,\n    VolumeContext: object,\n    VolumeID: string,\n    AccessibleTopology: Array<Topology>\n};\ntype ClusterVolumeDataPublishStatusContext = {\n    [name: string]: string\n};\ntype ClusterVolumeDataPublishStatus = {\n    NodeID: string,\n    State: ClusterVolumeDataPublishStatusState,\n    PublishContext: ClusterVolumeDataPublishStatusContext\n};\n\ninterface ClusterVolumeData extends SwarmBase<ClusterVolumeId> {\n    Spec: ClusterVolumeSpecBase,\n    Info: ClusterVolumeDataInfo,\n    PublishStatus: Array<ClusterVolumeDataPublishStatus>\n}\n\nexport interface ClusterVolumeSpec extends VolumeSpec {\n    ClusterVolumeSpec: ClusterVolumeSpecBase\n}\n\nexport interface ClusterVolume extends Volume {\n    ClusterVolume: ClusterVolumeData\n}\n\nexport default class ClusterVolumeHandle extends VolumeHandle {\n    async inspect() {\n        return await super.inspectResult() as ClusterVolume;\n    }\n\n    /**\n     * CHECK when docker implements options to change more settings maybe update this to accept a ClusterVolumeSpec object\n     */\n    async update(spec: ClusterVolumeSpec) {\n        const current = await this.inspect();\n        const version = current.ClusterVolume.Version.Index;\n        const body = {\n            Spec: current.ClusterVolume.Spec\n        };\n\n        const query = new Map();\n        query.set(\"version\", version.toString());\n\n        body.Spec.Availability = spec.ClusterVolumeSpec.Availability;\n\n        const call: ModemDialOptions = {\n            path: \"/volumes/\" + this.id,\n            method: \"PUT\",\n            query: query,\n            body: body\n        };\n\n        await this.modem.dial(call);\n    }\n\n    async remove() {\n        const current = await this.inspect();\n\n        if (this.shouldThrowStackError() && ClusterVolumeHandle.isPartOfStack(current))\n            throw new Error(\"The current cluster-volume was created by a stack, it can not be removed individually\");\n\n        const options: VolumeRemoveQueryOptions = {\n            force: true\n        };\n\n        await super.remove(options);\n    }\n\n    static isPartOfStack(volume: ClusterVolume) {\n        return volume.Labels && DOCKER_STACK_NAMESPACE_LABEL in volume.Labels;\n    }\n\n    static fromClusterVolume(modem: Modem, clusterVolume: ClusterVolume) {\n        const id = clusterVolume.ClusterVolume.ID;\n        return new ClusterVolumeHandle(modem, id);\n    }\n}","import Modem, { ModemDialOptions } from \"../api/Modem\";\nimport ClusterVolumeHandle, { ClusterVolume, ClusterVolumeSpec } from \"./clusterVolume\";\nimport VolumeHandle, { Volume, VolumeSpec } from \"./volume\";\n\ntype VolumeListFilterType = \"dangling\" | \"driver\" | \"label\" | \"name\";\ntype VolumePruneFilterType = \"label\" | \"all\";\n\nexport type VolumeListFilters = Map<VolumeListFilterType, Array<string>>;\nexport type VolumePruneFilters = Map<VolumePruneFilterType, Array<string>>;\n\nexport type VolumeListQueryOptions = {\n    filters?: VolumeListFilters\n};\n\nexport type VolumePruneQueryOptions = {\n    filters?: VolumePruneFilters\n};\n\nexport type VolumesListResult<ListType extends Volume | ClusterVolume = Volume | ClusterVolume> = {\n    Volumes: Array<ListType>,\n    Warnings: Array<string>\n}\n\ntype VolumePruneResult = {\n    VolumesDeleted: Array<string>,\n    SpaceReclaimed: number\n}\n\nexport default class Volumes {\n    private static async _list<ListType extends Volume | ClusterVolume>(modem: Modem, typeFilter: (volume: Volume | ClusterVolume) => boolean, queryOptions: VolumeListQueryOptions = {}) {\n        const query = new Map();\n        if (queryOptions.filters) query.set(\"filters\", JSON.stringify(Object.fromEntries(queryOptions.filters)));\n\n        const call: ModemDialOptions = {\n            path: \"/volumes\",\n            method: \"GET\",\n            query: query\n        };\n\n        const result = await modem.dial(call) as VolumesListResult<ListType>;\n        result.Volumes = result.Volumes.filter(typeFilter);\n        return result;\n    }\n\n    private static async _create<T extends VolumeSpec>(modem: Modem, spec: T) {\n        const call: ModemDialOptions = {\n            path: \"/volumes/create\",\n            method: \"POST\",\n            body: spec\n        };\n\n        return await modem.dial(call);\n    }\n    \n    /**\n     * @see https://docs.docker.com/engine/api/v1.44/#tag/Volume/operation/VolumeList\n     * \n     * @param modem the modem to use\n     * @param filters a map of filters to use\n     * @returns \n     */\n    static async list(modem: Modem, queryOptions: VolumeListQueryOptions = {}) {\n        const typeFilter = (volume: Volume | ClusterVolume) => !(\"ClusterVolume\" in volume);\n        return Volumes._list<Volume>(modem, typeFilter, queryOptions);\n    }\n\n    static async listCluster(modem: Modem, queryOptions: VolumeListQueryOptions = {}) {\n        const typeFilter = (volume: Volume | ClusterVolume) => \"ClusterVolume\" in volume;\n        return Volumes._list<ClusterVolume>(modem, typeFilter, queryOptions);\n    }\n\n    static async create(modem: Modem, spec: VolumeSpec) {\n        const result = await Volumes._create(modem, spec) as Volume;\n        return new VolumeHandle(modem, result.Name);\n    }\n\n    static async createCluster(modem: Modem, spec: ClusterVolumeSpec) {\n        const result = await Volumes._create(modem, spec) as ClusterVolume;\n        return new ClusterVolumeHandle(modem, result.ClusterVolume.ID);\n    }\n\n    static async prune(modem: Modem, queryOptions: VolumePruneQueryOptions = {}) {\n        const query = new Map();\n        if (queryOptions.filters) query.set(\"filters\", JSON.stringify(Object.fromEntries(queryOptions.filters)));\n\n        const call: ModemDialOptions = {\n            path: \"/volumes/prune\",\n            method: \"POST\",\n            query: query\n        };\n\n        return await modem.dial(call) as VolumePruneResult;\n    }\n\n    static getHandle(modem: Modem, name: string) {\n        return new VolumeHandle(modem, name);\n    }\n\n    static getClusterHandle(modem: Modem, name: string) {\n        return new ClusterVolumeHandle(modem, name);\n    }\n}","import Modem from \"../api/Modem\";\nimport ConfigHandle, { Config } from \"../conf/config\";\nimport Configs from \"../conf/configs\";\nimport NetworkHandle, { Network } from \"../network/network\";\nimport Networks from \"../network/networks\";\nimport SecretHandle, { Secret } from \"../secret/secret\";\nimport Secrets from \"../secret/secrets\";\nimport ServiceHandle, { Service } from \"../service/service\";\nimport Services from \"../service/services\";\nimport Handle from \"../utils/Handle\";\nimport ClusterVolumeHandle, { ClusterVolume } from \"../volume/clusterVolume\";\nimport { Volume } from \"../volume/volume\";\nimport Volumes from \"../volume/volumes\";\nimport { DOCKER_STACK_NAMESPACE_LABEL } from \"./stackDeps\";\n\nexport type StackServices = Array<Service>;\nexport type StackConfigs = Array<Config>;\nexport type StackNetworks = Array<Network>;\nexport type StackSecrets = Array<Secret>;\nexport type StackVolumes = Array<Volume>;\nexport type StackClusterVolumes = Array<ClusterVolume>;\n\nexport type StackSpec = {\n    Name: string,\n    Yaml?: string\n};\n\nexport interface Stack {\n    Spec: StackSpec,\n    Services: StackServices,\n    Networks: StackNetworks,\n    Configs: StackConfigs,\n    Secrets: StackSecrets,\n    Volumes: StackVolumes,\n    ClusterVolumes: StackClusterVolumes\n}\n\nclass StackServiceHandle extends ServiceHandle {\n    public shouldThrowStackError() {\n        return false;\n    }\n\n    public static fromService(modem: Modem, service: Service) {\n        const id = service.ID;\n        return new StackServiceHandle(modem, id);\n    }\n}\n\nclass StackNetworkHandle extends NetworkHandle {\n    public shouldThrowStackError() {\n        return false;\n    }\n\n    public static fromNetwork(modem: Modem, network: Network) {\n        const id = network.Id;\n        return new StackNetworkHandle(modem, id);\n    }\n}\n\nclass StackConfigHandle extends ConfigHandle {\n    public shouldThrowStackError() {\n        return false;\n    }\n\n    public static fromConfig(modem: Modem, config: Config) {\n        const id = config.ID;\n        return new StackConfigHandle(modem, id);\n    }\n}\n\nclass StackSecretHandle extends SecretHandle {\n    public shouldThrowStackError() {\n        return false;\n    }\n\n    public static fromSecret(modem: Modem, secret: Secret) {\n        const id = secret.ID;\n        return new StackSecretHandle(modem, id);\n    }\n}\n\nclass StackClusterVolumeHandle extends ClusterVolumeHandle {\n    public shouldThrowStackError() {\n        return false;\n    }\n\n    public static fromClusterVolume(modem: Modem, clusterVolume: ClusterVolume) {\n        const id = clusterVolume.ClusterVolume.ID;\n        return new StackClusterVolumeHandle(modem, id);\n    }\n}\n\nexport default class StackHandle extends Handle {\n    public constructor(modem: Modem, name: string) {\n        super(modem, name);\n    }\n\n    public async inspect(): Promise<Stack> {\n        const labelFilter = new Map();\n        labelFilter.set(\"label\", Array.of(DOCKER_STACK_NAMESPACE_LABEL + \"=\" + this.id));\n\n        const labelListQueryOptions = {\n            filters: labelFilter\n        };\n\n        const serviceList = await Services.list(this.modem, labelListQueryOptions);\n        const configList = await Configs.list(this.modem, labelListQueryOptions);\n        const secretList = await Secrets.list(this.modem, labelListQueryOptions);\n        const networkList = await Networks.list(this.modem, labelListQueryOptions);\n        const volumeList = (await Volumes.list(this.modem, labelListQueryOptions)).Volumes;\n        const clusterVolumeList = (await Volumes.listCluster(this.modem, labelListQueryOptions)).Volumes;\n\n        return {\n            Spec: {\n                Name: this.id\n            },\n            Services: serviceList,\n            Configs: configList,\n            Secrets: secretList,\n            Networks: networkList,\n            Volumes: volumeList,\n            ClusterVolumes: clusterVolumeList\n        }\n    }\n\n    public async remove() {\n        const stackFilter = new Map();\n        stackFilter.set(\"label\", Array.of(DOCKER_STACK_NAMESPACE_LABEL + \"=\" + this.id));\n\n        const stackQueryOptions = {\n            filters: stackFilter\n        };\n\n        // remove all services\n        const services = await Services.list(this.modem, stackQueryOptions);\n        const serviceHandles = services.map(service => { return StackServiceHandle.fromService(this.modem, service); });\n        const servicePromises = serviceHandles.map(async handle => { await handle.remove(); });\n\n        // IDEA maybe find a way to remove all local volumes on all nodes for the stack\n\n        // remove networks\n        const networks = await Networks.list(this.modem, stackQueryOptions);\n        const networkHandles = networks.map(network => { return StackNetworkHandle.fromNetwork(this.modem, network); });\n        const networkRemovePromises = networkHandles.map(async handle => { await handle.remove(); });\n\n        // remove configs\n        const configs = await Configs.list(this.modem, stackQueryOptions);\n        const configHandles = configs.map(config => { return StackConfigHandle.fromConfig(this.modem, config); });\n        const configRemovePromises = configHandles.map(async handle => { await handle.remove(); });\n\n        // remove secrets\n        const secrets = await Secrets.list(this.modem, stackQueryOptions);\n        const secretHandles = secrets.map(secret => { return StackSecretHandle.fromSecret(this.modem, secret); });\n        const secretRemovePromises = secretHandles.map(async handle => { await handle.remove(); });\n\n        // remove cluster volumes\n        const clusterVolumes = await Volumes.listCluster(this.modem, stackQueryOptions);\n        const clusterVolumeHandles = clusterVolumes.Volumes.map(clusterVolume => { return StackClusterVolumeHandle.fromClusterVolume(this.modem, clusterVolume as ClusterVolume); });\n        const clusterVolumePromises = clusterVolumeHandles.map(async handle => { await handle.remove(); });\n\n        await Promise.all(servicePromises);\n        await Promise.all(Array.of(\n            ...networkRemovePromises,\n            ...configRemovePromises,\n            ...secretRemovePromises,\n            ...clusterVolumePromises\n        ));\n    }\n}","import Modem from \"../api/Modem\";\nimport { Config } from \"../conf/config\";\nimport Configs, { ConfigListResult } from \"../conf/configs\";\nimport { Network } from \"../network/network\";\nimport Networks from \"../network/networks\";\nimport { Secret } from \"../secret/secret\";\nimport Secrets, { SecretListResult } from \"../secret/secrets\";\nimport { Service } from \"../service/service\";\nimport Services, { ServiceListResult } from \"../service/services\";\nimport { ClusterVolume } from \"../volume/clusterVolume\";\nimport Volumes from \"../volume/volumes\";\nimport StackHandle, { Stack, StackSpec } from \"./stack\";\nimport { DOCKER_STACK_NAMESPACE_LABEL } from \"./stackDeps\";\nimport { Volume } from \"../volume/volume\";\n\nimport { execFile } from 'child_process';\nimport { Readable } from \"stream\";\n\ntype StackObjectListResult = Promise<ServiceListResult | ConfigListResult | SecretListResult>;\ntype StackObject = Service | Config | Secret;\n\nexport type StackListResult = Array<Stack>;\n\nfunction stackMapReducer(map: Map<string, Array<any>>, object: any): Map<string, Array<StackObject>> {\n    if (!object.Labels || !(DOCKER_STACK_NAMESPACE_LABEL in object.Labels))\n        return map;\n\n    const stackName = object.Labels![DOCKER_STACK_NAMESPACE_LABEL];\n\n    if (!map.has(stackName))\n        map.set(stackName, new Array());\n\n    map.get(stackName)!.push(object);\n    return map;\n}\n\nfunction stackMapSpecReducer(map: Map<string, Array<StackObject>>, object: StackObject): Map<string, Array<StackObject>> {\n    if (!object.Spec.Labels || !(DOCKER_STACK_NAMESPACE_LABEL in object.Spec.Labels))\n        return map;\n\n    const stackName = object.Spec.Labels![DOCKER_STACK_NAMESPACE_LABEL];\n\n    if (!map.has(stackName))\n        map.set(stackName, new Array());\n\n    map.get(stackName)!.push(object);\n    return map;\n}\n\nexport default class Stacks {\n    public static async list(modem: Modem) {\n        const labelFilter = new Map();\n        labelFilter.set(\"label\", Array.of(DOCKER_STACK_NAMESPACE_LABEL));\n        \n        const labelListQueryOptions = {\n            filters: labelFilter\n        };\n\n        const serviceListPromise = Services.list(modem, labelListQueryOptions) as StackObjectListResult;\n        const configListPromise = Configs.list(modem, labelListQueryOptions) as StackObjectListResult;\n        const secretListPromise = Secrets.list(modem, labelListQueryOptions) as StackObjectListResult;\n        const networkListPromise = Networks.list(modem, labelListQueryOptions);\n        const volumeListPromise = Volumes.list(modem, labelListQueryOptions);\n        const clusterVolumeListPromise = Volumes.listCluster(modem, labelListQueryOptions);\n\n        const promises = Array.of(\n            serviceListPromise,\n            configListPromise,\n            secretListPromise\n        );\n        \n        const results = await Promise.all(promises);\n        const serviceMap: Map<string, Array<StackObject>> = results[0].reduce(stackMapSpecReducer, new Map());\n        const configMap: Map<string, Array<StackObject>> = results[1].reduce(stackMapSpecReducer, new Map());\n        const secretMap: Map<string, Array<StackObject>> = results[2].reduce(stackMapSpecReducer, new Map());\n\n        const networkMap: Map<string, Array<Network>> = (await networkListPromise).reduce(stackMapReducer, new Map());\n        const volumeMap: Map<string, Array<Volume>> = (await volumeListPromise).Volumes.reduce(stackMapReducer, new Map());\n        const clusterVolumeMap: Map<string, Array<ClusterVolume>> = (await clusterVolumeListPromise).Volumes.reduce(stackMapReducer, new Map());\n        \n        const stackLabels = Array.of(\n            ...Array.from(serviceMap.keys()),\n            ...Array.from(configMap.keys()),\n            ...Array.from(secretMap.keys()),\n            ...Array.from(networkMap.keys()),\n            ...Array.from(volumeMap.keys()),\n            ...Array.from(clusterVolumeMap.keys())\n        );\n        \n        const stackNames = new Set(stackLabels);\n        const stacks = Array.from(stackNames).map<Stack>(name => {\n            return {\n                Spec: {\n                    Name: name\n                },\n                Services: serviceMap.has(name) ? Array.from(serviceMap.get(name)!) : new Array(),\n                Configs: configMap.has(name) ? Array.from(configMap.get(name)!) : new Array(),\n                Secrets: secretMap.has(name) ? Array.from(secretMap.get(name)!) : new Array(),\n                Networks: networkMap.has(name) ? Array.from(networkMap.get(name)!) : new Array(),\n                Volumes: volumeMap.has(name) ? Array.from(volumeMap.get(name)!) : new Array(),\n                ClusterVolumes: clusterVolumeMap.has(name) ? Array.from(clusterVolumeMap.get(name)!) : new Array()\n            };\n        });\n\n        return stacks as StackListResult;\n    }\n\n    public static async create(modem: Modem, spec: StackSpec) {\n        await new Promise(function(resolve, reject) {\n            if (!spec.Yaml) {\n                reject(new Error(\"Stack cannot be created without valid compose data\"));\n                return;\n            }\n\n            const child = execFile(\"docker\", [\"stack\", \"deploy\", \"-d\", \"--compose-file -\", spec.Name], function(err, stdout, stderr) {\n                if (err)\n                    reject(err);\n\n                // TODO maybe do something with the stdout and stderr\n            });\n\n            const stream = new Readable();\n            stream.push(spec.Yaml);\n            stream.push(null);\n\n            if (child.stdin)\n                stream.pipe(child.stdin);\n\n            resolve(true);\n        });\n        \n        return new StackHandle(modem, spec.Name);\n    }\n\n    public static getHandle(modem: Modem, name: string) {\n        return new StackHandle(modem, name);\n    }\n}"],"mappings":"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","names":["http","querystring","_Modem","socketPath","response","contentType","raw","query","querystring","options","__async","path","body","headers","resolve","reject","finished","requestOptions","request","http","socket","head","status","rawHandler","isOk","chunks","pushChunk","chunk","responseEnd","parsed","err","Modem","Handle","modem","id","DOCKER_STACK_NAMESPACE_LABEL","ConfigHandle","_ConfigHandle","Handle","__async","call","spec","current","version","query","newSpec","config","DOCKER_STACK_NAMESPACE_LABEL","modem","id","Configs","_0","__async","modem","queryOptions","query","call","spec","result","ConfigHandle","id","ContainerHandle","_ContainerHandle","Handle","__async","queryOptions","query","call","_a","_b","_c","updateConfig","modem","container","Containers","_0","__async","modem","queryOptions","query","call","spec","result","ContainerHandle","id","ImageHandle","_ImageHandle","Handle","__async","call","queryOptions","registryAuth","headers","query","modem","image","HandleLogWrapper","handle","logStream","__async","stream","resolve","data","Images","_0","__async","modem","queryOptions","query","call","registryAuth","headers","stream","handle","ImageHandle","logWrapper","HandleLogWrapper","image","filters","containerConfig","_a","_b","_c","id","NetworkHandle","_NetworkHandle","Handle","__async","queryOptions","query","call","current","connectConfig","disconnectConfig","network","DOCKER_STACK_NAMESPACE_LABEL","modem","id","Networks","_0","__async","modem","queryOptions","query","call","spec","result","NetworkHandle","id","NodeHandle","_NodeHandle","Handle","__async","call","newSpec","version","query","queryOptions","modem","node","id","Nodes","_0","__async","modem","queryOptions","query","call","id","NodeHandle","PluginHandle","_PluginHandle","Handle","__async","call","queryOptions","query","modem","plugin","id","Plugins","_Plugins","_0","__async","modem","queryOptions","query","call","registryAuth","headers","privileges","name","stream","handle","PluginHandle","logWrapper","HandleLogWrapper","id","Swarm","_Swarm","modem","__async","call","initSpec","joinSpec","_0","queryOptions","query","spec","version","unlockSpec","SecretHandle","_SecretHandle","Handle","__async","call","spec","current","version","query","newSpec","secret","DOCKER_STACK_NAMESPACE_LABEL","modem","id","Secrets","_0","__async","modem","queryOptions","query","call","spec","result","SecretHandle","id","Services","_0","__async","modem","queryOptions","status","query","call","spec","registryAuth","headers","result","ServiceHandle","id","ServiceHandle","_ServiceHandle","Handle","__async","queryOptions","query","call","_0","newSpec","registryAuth","version","headers","body","current","spec","Services","rollbackQueryOptions","_a","_b","_c","_d","_e","prev","service","DOCKER_STACK_NAMESPACE_LABEL","modem","id","System","modem","credentials","__async","call","_0","queryOptions","query","TaskHandle","_TaskHandle","Handle","__async","call","queryOptions","query","modem","task","id","Tasks","_0","__async","modem","queryOptions","query","call","id","TaskHandle","VolumeHandle","_VolumeHandle","Handle","modem","name","__async","query","call","queryOptions","current","volume","DOCKER_STACK_NAMESPACE_LABEL","id","ClusterVolumeHandle","_ClusterVolumeHandle","VolumeHandle","__async","__superGet","spec","current","version","body","query","call","options","volume","DOCKER_STACK_NAMESPACE_LABEL","modem","clusterVolume","id","Volumes","_Volumes","_0","_1","__async","modem","typeFilter","queryOptions","query","call","result","spec","volume","VolumeHandle","ClusterVolumeHandle","name","StackServiceHandle","_StackServiceHandle","ServiceHandle","modem","service","id","StackNetworkHandle","_StackNetworkHandle","NetworkHandle","network","StackConfigHandle","_StackConfigHandle","ConfigHandle","config","StackSecretHandle","_StackSecretHandle","SecretHandle","secret","StackClusterVolumeHandle","_StackClusterVolumeHandle","ClusterVolumeHandle","clusterVolume","StackHandle","Handle","name","__async","labelFilter","DOCKER_STACK_NAMESPACE_LABEL","labelListQueryOptions","serviceList","Services","configList","Configs","secretList","Secrets","networkList","Networks","volumeList","Volumes","clusterVolumeList","stackFilter","stackQueryOptions","servicePromises","handle","networkRemovePromises","configRemovePromises","secretRemovePromises","clusterVolumePromises","execFile","Readable","stackMapReducer","map","object","DOCKER_STACK_NAMESPACE_LABEL","stackName","stackMapSpecReducer","Stacks","modem","__async","labelFilter","labelListQueryOptions","serviceListPromise","Services","configListPromise","Configs","secretListPromise","Secrets","networkListPromise","Networks","volumeListPromise","Volumes","clusterVolumeListPromise","promises","results","serviceMap","configMap","secretMap","networkMap","volumeMap","clusterVolumeMap","stackLabels","stackNames","name","spec","resolve","reject","child","execFile","err","stdout","stderr","stream","Readable","StackHandle"]}