the-moby-effect
Version:
Moby/Docker API client built using effect-ts
72 lines • 3.71 kB
JavaScript
import * as HttpClient from "@effect/platform/HttpClient";
import * as HttpClientRequest from "@effect/platform/HttpClientRequest";
import * as Socket from "@effect/platform/Socket";
import * as UrlParams from "@effect/platform/UrlParams";
import * as Context from "effect/Context";
import * as Effect from "effect/Effect";
import * as Function from "effect/Function";
import * as Layer from "effect/Layer";
import * as Predicate from "effect/Predicate";
import * as internalConnection from "./connection.js";
/** @internal */
const makeVersionPath = connectionOptions => Predicate.isNotUndefined(connectionOptions.version) ? `/v${connectionOptions.version}` : "";
/** @internal */
const makeHttpRequestUrl = /*#__PURE__*/internalConnection.MobyConnectionOptions.$match({
ssh: options => `http://0.0.0.0${makeVersionPath(options)}`,
socket: options => `http://0.0.0.0${makeVersionPath(options)}`,
http: options => `http://${options.host}:${options.port}${options.path ?? ""}${makeVersionPath(options)}`,
https: options => `https://${options.host}:${options.port}${options.path ?? ""}${makeVersionPath(options)}`
});
/** @internal */
const makeWebsocketRequestUrl = /*#__PURE__*/internalConnection.MobyConnectionOptions.$match({
ssh: options => `ws://0.0.0.0${makeVersionPath(options)}`,
socket: options => `ws+unix://${options.socketPath}${makeVersionPath(options)}:`,
http: options => `ws://${options.host}:${options.port}${options.path ?? ""}${makeVersionPath(options)}`,
https: options => `wss://${options.host}:${options.port}${options.path ?? ""}${makeVersionPath(options)}`
});
/** @internal */
const HttpClientMobyConnectionOptions = /*#__PURE__*/Symbol.for("@the-moby-effect/platforms/Agnostic/HttpClientMobyConnectionOptions");
/** @internal */
export const websocketRequest = request => Effect.gen(function* () {
const client = yield* HttpClient.HttpClient;
const {
hash,
url,
urlParams
} = request;
const {
[HttpClientMobyConnectionOptions]: connectionOptions
} = client;
if (Predicate.isUndefined(connectionOptions)) {
return yield* Effect.dieMessage("What happened to the connection options?");
}
const websocketUrl = yield* UrlParams.makeUrl(`${makeWebsocketRequestUrl(connectionOptions)}${url}`, urlParams, hash);
return yield* Socket.makeWebSocket(websocketUrl.toString());
});
/** @internal */
export const makeAgnosticHttpClientLayer = connectionOptions => Function.pipe(Layer.function(HttpClient.HttpClient, HttpClient.HttpClient, HttpClient.mapRequest(request => {
const httpUrl = makeHttpRequestUrl(connectionOptions);
const urlPrepended = HttpClientRequest.prependUrl(request, httpUrl);
return urlPrepended;
})), Layer.map(context => {
const tag = HttpClient.HttpClient;
const oldClient = Context.get(context, tag);
oldClient[HttpClientMobyConnectionOptions] = connectionOptions;
return Context.make(tag, oldClient);
}));
/** @internal */
export const makeAgnosticWebsocketLayer = connectionOptions => Layer.effect(Socket.WebSocketConstructor, Effect.gen(function* () {
// Only the ws package supports unix socket connection options
if (internalConnection.MobyConnectionOptions.$is("socket")(connectionOptions)) {
const ws = yield* Effect.promise(() => import("ws"));
return (url, protocols) => new ws.WebSocket(url, protocols);
}
return (url, protocols) => new WebSocket(url, protocols);
}));
/** @internal */
export const makeAgnosticLayer = connectionOptions => {
const httpClientLayer = makeAgnosticHttpClientLayer(connectionOptions);
const websocketLayer = makeAgnosticWebsocketLayer(connectionOptions);
return Layer.merge(websocketLayer, httpClientLayer);
};
//# sourceMappingURL=agnostic.js.map