UNPKG

the-moby-effect

Version:
72 lines 3.71 kB
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