@effect/platform 0.21.0 → 0.22.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Http/App/dist/effect-platform-Http-App.cjs.dev.js +22 -1
- package/Http/App/dist/effect-platform-Http-App.cjs.mjs +1 -0
- package/Http/App/dist/effect-platform-Http-App.cjs.prod.js +22 -1
- package/Http/App/dist/effect-platform-Http-App.esm.js +21 -1
- package/Http/Client/dist/effect-platform-Http-Client.cjs.dev.js +12 -12
- package/Http/Client/dist/effect-platform-Http-Client.cjs.mjs +2 -2
- package/Http/Client/dist/effect-platform-Http-Client.cjs.prod.js +12 -12
- package/Http/Client/dist/effect-platform-Http-Client.esm.js +12 -12
- package/Http/ClientRequest/dist/effect-platform-Http-ClientRequest.esm.js +2 -2
- package/Http/Middleware/dist/effect-platform-Http-Middleware.cjs.dev.js +5 -13
- package/Http/Middleware/dist/effect-platform-Http-Middleware.cjs.mjs +0 -2
- package/Http/Middleware/dist/effect-platform-Http-Middleware.cjs.prod.js +5 -13
- package/Http/Middleware/dist/effect-platform-Http-Middleware.esm.js +7 -13
- package/Http/Router/dist/effect-platform-Http-Router.cjs.dev.js +1 -1
- package/Http/Router/dist/effect-platform-Http-Router.cjs.prod.js +1 -1
- package/Http/Router/dist/effect-platform-Http-Router.esm.js +3 -3
- package/Http/ServerError/dist/effect-platform-Http-ServerError.esm.js +1 -1
- package/Http/ServerRequest/dist/effect-platform-Http-ServerRequest.cjs.dev.js +1 -1
- package/Http/ServerRequest/dist/effect-platform-Http-ServerRequest.cjs.prod.js +1 -1
- package/Http/ServerRequest/dist/effect-platform-Http-ServerRequest.esm.js +2 -2
- package/Http/ServerResponse/dist/effect-platform-Http-ServerResponse.esm.js +1 -1
- package/HttpClient/dist/effect-platform-HttpClient.cjs.dev.js +5 -5
- package/HttpClient/dist/effect-platform-HttpClient.cjs.prod.js +5 -5
- package/HttpClient/dist/effect-platform-HttpClient.esm.js +6 -6
- package/HttpServer/dist/effect-platform-HttpServer.cjs.dev.js +12 -11
- package/HttpServer/dist/effect-platform-HttpServer.cjs.prod.js +12 -11
- package/HttpServer/dist/effect-platform-HttpServer.esm.js +14 -13
- package/Worker/dist/effect-platform-Worker.cjs.d.mts +2 -0
- package/Worker/dist/effect-platform-Worker.cjs.d.mts.map +1 -0
- package/Worker/dist/effect-platform-Worker.cjs.d.ts +2 -0
- package/Worker/dist/effect-platform-Worker.cjs.d.ts.map +1 -0
- package/Worker/dist/effect-platform-Worker.cjs.dev.js +291 -0
- package/Worker/dist/effect-platform-Worker.cjs.js +7 -0
- package/Worker/dist/effect-platform-Worker.cjs.mjs +10 -0
- package/Worker/dist/effect-platform-Worker.cjs.prod.js +291 -0
- package/Worker/dist/effect-platform-Worker.esm.js +252 -0
- package/Worker/package.json +4 -0
- package/WorkerError/dist/effect-platform-WorkerError.cjs.d.mts +2 -0
- package/WorkerError/dist/effect-platform-WorkerError.cjs.d.mts.map +1 -0
- package/WorkerError/dist/effect-platform-WorkerError.cjs.d.ts +2 -0
- package/WorkerError/dist/effect-platform-WorkerError.cjs.d.ts.map +1 -0
- package/WorkerError/dist/effect-platform-WorkerError.cjs.dev.js +65 -0
- package/WorkerError/dist/effect-platform-WorkerError.cjs.js +7 -0
- package/WorkerError/dist/effect-platform-WorkerError.cjs.mjs +4 -0
- package/WorkerError/dist/effect-platform-WorkerError.cjs.prod.js +65 -0
- package/WorkerError/dist/effect-platform-WorkerError.esm.js +40 -0
- package/WorkerError/package.json +4 -0
- package/WorkerRunner/dist/effect-platform-WorkerRunner.cjs.d.mts +2 -0
- package/WorkerRunner/dist/effect-platform-WorkerRunner.cjs.d.mts.map +1 -0
- package/WorkerRunner/dist/effect-platform-WorkerRunner.cjs.d.ts +2 -0
- package/WorkerRunner/dist/effect-platform-WorkerRunner.cjs.d.ts.map +1 -0
- package/WorkerRunner/dist/effect-platform-WorkerRunner.cjs.dev.js +129 -0
- package/WorkerRunner/dist/effect-platform-WorkerRunner.cjs.js +7 -0
- package/WorkerRunner/dist/effect-platform-WorkerRunner.cjs.mjs +5 -0
- package/WorkerRunner/dist/effect-platform-WorkerRunner.cjs.prod.js +129 -0
- package/WorkerRunner/dist/effect-platform-WorkerRunner.esm.js +97 -0
- package/WorkerRunner/package.json +4 -0
- package/dist/{App-1ca51fa7.esm.js → App-2d206a13.esm.js} +9 -1
- package/dist/{App-d8b904fa.cjs.prod.js → App-7ef679dc.cjs.prod.js} +9 -0
- package/dist/{App-18152f12.cjs.dev.js → App-bad10dc1.cjs.dev.js} +9 -0
- package/dist/{Client-3938c9f5.cjs.dev.js → Client-0146412d.cjs.dev.js} +16 -19
- package/dist/{Client-e8ebeb3a.esm.js → Client-4f8f804b.esm.js} +18 -21
- package/dist/{Client-5497adf2.cjs.prod.js → Client-e9835f16.cjs.prod.js} +16 -19
- package/dist/{ClientRequest-490c76cd.esm.js → ClientRequest-27630c54.esm.js} +1 -1
- package/dist/Middleware-934a0c8f.esm.js +41 -0
- package/dist/Middleware-a2c50c35.cjs.dev.js +46 -0
- package/dist/Middleware-e53794a3.cjs.prod.js +46 -0
- package/dist/{Router-3112d780.esm.js → Router-2505b5dd.esm.js} +2 -2
- package/dist/{Router-2c0b718b.cjs.prod.js → Router-3645c2b3.cjs.prod.js} +3 -3
- package/dist/{Router-06c5cb9a.cjs.dev.js → Router-b9feed01.cjs.dev.js} +3 -3
- package/dist/{ServerError-04ad5b57.esm.js → ServerError-97730ed2.esm.js} +1 -1
- package/dist/{ServerRequest-41c7e979.esm.js → ServerRequest-078a4bb2.esm.js} +2 -2
- package/dist/ServerRequest-705b12bb.cjs.prod.js +2 -2
- package/dist/ServerRequest-8e9629a5.cjs.dev.js +2 -2
- package/dist/{ServerResponse-03c252ea.esm.js → ServerResponse-de572c21.esm.js} +1 -1
- package/dist/{clientRequest-6121a7f6.esm.js → clientRequest-fe7578cf.esm.js} +1 -1
- package/dist/declarations/src/Error.d.ts +1 -1
- package/dist/declarations/src/Error.d.ts.map +1 -1
- package/dist/declarations/src/Http/App.d.ts +5 -0
- package/dist/declarations/src/Http/App.d.ts.map +1 -1
- package/dist/declarations/src/Http/Client.d.ts +5 -6
- package/dist/declarations/src/Http/Client.d.ts.map +1 -1
- package/dist/declarations/src/Http/Middleware.d.ts +0 -10
- package/dist/declarations/src/Http/Middleware.d.ts.map +1 -1
- package/dist/declarations/src/Worker.d.ts +170 -0
- package/dist/declarations/src/Worker.d.ts.map +1 -0
- package/dist/declarations/src/WorkerError.d.ts +30 -0
- package/dist/declarations/src/WorkerError.d.ts.map +1 -0
- package/dist/declarations/src/WorkerRunner.d.ts +72 -0
- package/dist/declarations/src/WorkerRunner.d.ts.map +1 -0
- package/dist/declarations/src/index.d.ts +12 -0
- package/dist/declarations/src/index.d.ts.map +1 -1
- package/dist/effect-platform.cjs.dev.js +9 -0
- package/dist/effect-platform.cjs.mjs +4 -1
- package/dist/effect-platform.cjs.prod.js +9 -0
- package/dist/effect-platform.esm.js +6 -0
- package/dist/middleware-85768a1e.cjs.prod.js +66 -0
- package/dist/middleware-98794cc2.cjs.dev.js +66 -0
- package/dist/middleware-ea618e68.esm.js +41 -0
- package/package.json +24 -3
- package/src/Error.ts +1 -1
- package/src/Http/App.ts +9 -0
- package/src/Http/Client.ts +10 -8
- package/src/Http/Middleware.ts +0 -12
- package/src/Worker.ts +207 -0
- package/src/WorkerError.ts +34 -0
- package/src/WorkerRunner.ts +83 -0
- package/src/index.ts +15 -0
- package/src/internal/http/client.ts +33 -33
- package/src/internal/http/middleware.ts +4 -26
- package/src/internal/worker.ts +262 -0
- package/src/internal/workerError.ts +16 -0
- package/src/internal/workerRunner.ts +83 -0
- package/dist/Middleware-04ddadf1.esm.js +0 -100
- package/dist/Middleware-3e264366.cjs.dev.js +0 -127
- package/dist/Middleware-8b05423d.cjs.prod.js +0 -127
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import * as Effect from 'effect/Effect';
|
|
2
|
+
import { s as set } from './Headers-58b56a08.esm.js';
|
|
3
|
+
import { schemaExternalSpan } from '../Http/IncomingMessage/dist/effect-platform-Http-IncomingMessage.esm.js';
|
|
4
|
+
import { S as ServerRequest } from './ServerRequest-078a4bb2.esm.js';
|
|
5
|
+
|
|
6
|
+
/** @internal */
|
|
7
|
+
const make = middleware => middleware;
|
|
8
|
+
|
|
9
|
+
/** @internal */
|
|
10
|
+
const logger = /*#__PURE__*/make(httpApp => {
|
|
11
|
+
let counter = 0;
|
|
12
|
+
return Effect.flatMap(ServerRequest, request => Effect.withLogSpan(Effect.onExit(httpApp, exit => exit._tag === "Failure" ? Effect.annotateLogs(Effect.log(exit.cause), {
|
|
13
|
+
"http.method": request.method,
|
|
14
|
+
"http.url": request.url,
|
|
15
|
+
"http.status": 500
|
|
16
|
+
}) : Effect.annotateLogs(Effect.log(""), {
|
|
17
|
+
"http.method": request.method,
|
|
18
|
+
"http.url": request.url,
|
|
19
|
+
"http.status": exit.value.status
|
|
20
|
+
})), `http.span.${++counter}`));
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
/** @internal */
|
|
24
|
+
const tracer = /*#__PURE__*/make(httpApp => {
|
|
25
|
+
const appWithStatus = Effect.tap(httpApp, response => Effect.annotateCurrentSpan("http.status", response.status));
|
|
26
|
+
return Effect.flatMap(ServerRequest, request => Effect.flatMap(request.headers["x-b3-traceid"] || request.headers["b3"] ? Effect.orElseSucceed(schemaExternalSpan(request), () => undefined) : Effect.succeed(undefined), parent => Effect.withSpan(appWithStatus, `http ${request.method}`, {
|
|
27
|
+
attributes: {
|
|
28
|
+
"http.method": request.method,
|
|
29
|
+
"http.url": request.url
|
|
30
|
+
},
|
|
31
|
+
parent
|
|
32
|
+
})));
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
/** @internal */
|
|
36
|
+
const xForwardedHeaders = /*#__PURE__*/make(httpApp => Effect.updateService(httpApp, ServerRequest, request => request.headers["x-forwarded-host"] ? request.modify({
|
|
37
|
+
headers: set(request.headers, "host", request.headers["x-forwarded-host"]),
|
|
38
|
+
remoteAddress: request.headers["x-forwarded-for"]?.split(",")[0].trim()
|
|
39
|
+
}) : request));
|
|
40
|
+
|
|
41
|
+
export { logger as l, make as m, tracer as t, xForwardedHeaders as x };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect/platform",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.22.1",
|
|
4
4
|
"description": "Unified interfaces for common platform-specific services",
|
|
5
5
|
"main": "dist/effect-platform.cjs.js",
|
|
6
6
|
"module": "dist/effect-platform.esm.js",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"path-browserify": "^1.0.1"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
|
-
"@effect/schema": "^0.43.
|
|
37
|
+
"@effect/schema": "^0.43.2",
|
|
38
38
|
"@types/path-browserify": "^1.0.0",
|
|
39
39
|
"effect": "2.0.0-next.48"
|
|
40
40
|
},
|
|
@@ -55,7 +55,10 @@
|
|
|
55
55
|
"HttpServer",
|
|
56
56
|
"KeyValueStore",
|
|
57
57
|
"Path",
|
|
58
|
-
"Runtime"
|
|
58
|
+
"Runtime",
|
|
59
|
+
"Worker",
|
|
60
|
+
"WorkerError",
|
|
61
|
+
"WorkerRunner"
|
|
59
62
|
],
|
|
60
63
|
"exports": {
|
|
61
64
|
".": {
|
|
@@ -238,6 +241,24 @@
|
|
|
238
241
|
"module": "./Runtime/dist/effect-platform-Runtime.esm.js",
|
|
239
242
|
"import": "./Runtime/dist/effect-platform-Runtime.cjs.mjs",
|
|
240
243
|
"default": "./Runtime/dist/effect-platform-Runtime.cjs.js"
|
|
244
|
+
},
|
|
245
|
+
"./Worker": {
|
|
246
|
+
"types": "./dist/declarations/src/Worker.d.ts",
|
|
247
|
+
"module": "./Worker/dist/effect-platform-Worker.esm.js",
|
|
248
|
+
"import": "./Worker/dist/effect-platform-Worker.cjs.mjs",
|
|
249
|
+
"default": "./Worker/dist/effect-platform-Worker.cjs.js"
|
|
250
|
+
},
|
|
251
|
+
"./WorkerError": {
|
|
252
|
+
"types": "./dist/declarations/src/WorkerError.d.ts",
|
|
253
|
+
"module": "./WorkerError/dist/effect-platform-WorkerError.esm.js",
|
|
254
|
+
"import": "./WorkerError/dist/effect-platform-WorkerError.cjs.mjs",
|
|
255
|
+
"default": "./WorkerError/dist/effect-platform-WorkerError.cjs.js"
|
|
256
|
+
},
|
|
257
|
+
"./WorkerRunner": {
|
|
258
|
+
"types": "./dist/declarations/src/WorkerRunner.d.ts",
|
|
259
|
+
"module": "./WorkerRunner/dist/effect-platform-WorkerRunner.esm.js",
|
|
260
|
+
"import": "./WorkerRunner/dist/effect-platform-WorkerRunner.cjs.mjs",
|
|
261
|
+
"default": "./WorkerRunner/dist/effect-platform-WorkerRunner.cjs.js"
|
|
241
262
|
}
|
|
242
263
|
},
|
|
243
264
|
"scripts": {
|
package/src/Error.ts
CHANGED
|
@@ -33,7 +33,7 @@ export declare namespace PlatformError {
|
|
|
33
33
|
export interface Base extends Data.Case {
|
|
34
34
|
readonly [PlatformErrorTypeId]: typeof PlatformErrorTypeId
|
|
35
35
|
readonly _tag: string
|
|
36
|
-
readonly module: "Command" | "FileSystem" | "Path" | "KeyValueStore" | "Clipboard"
|
|
36
|
+
readonly module: "Command" | "FileSystem" | "Path" | "KeyValueStore" | "Clipboard" | "Stream"
|
|
37
37
|
readonly method: string
|
|
38
38
|
readonly message: string
|
|
39
39
|
}
|
package/src/Http/App.ts
CHANGED
|
@@ -6,6 +6,7 @@ import * as FiberRef from "effect/FiberRef"
|
|
|
6
6
|
import { dual } from "effect/Function"
|
|
7
7
|
import { globalValue } from "effect/GlobalValue"
|
|
8
8
|
import * as ReadonlyArray from "effect/ReadonlyArray"
|
|
9
|
+
import * as internalMiddleware from "../internal/http/middleware"
|
|
9
10
|
import type * as ServerError from "./ServerError"
|
|
10
11
|
import type * as ServerRequest from "./ServerRequest"
|
|
11
12
|
import type * as ServerResponse from "./ServerResponse"
|
|
@@ -22,6 +23,14 @@ export interface HttpApp<R, E, A> extends Effect.Effect<R | ServerRequest.Server
|
|
|
22
23
|
*/
|
|
23
24
|
export type Default<R, E> = HttpApp<R, E, ServerResponse.ServerResponse>
|
|
24
25
|
|
|
26
|
+
/**
|
|
27
|
+
* @since 1.0.0
|
|
28
|
+
* @category combinators
|
|
29
|
+
*/
|
|
30
|
+
export const withDefaultMiddleware = <R, E>(
|
|
31
|
+
self: Default<R, E>
|
|
32
|
+
): Default<R, E> => internalMiddleware.tracer(self)
|
|
33
|
+
|
|
25
34
|
/**
|
|
26
35
|
* @since 1.0.0
|
|
27
36
|
* @category models
|
package/src/Http/Client.ts
CHANGED
|
@@ -9,7 +9,6 @@ import type * as Layer from "effect/Layer"
|
|
|
9
9
|
import type { Pipeable } from "effect/Pipeable"
|
|
10
10
|
import type * as Predicate from "effect/Predicate"
|
|
11
11
|
import type * as Schedule from "effect/Schedule"
|
|
12
|
-
import type * as Scope from "effect/Scope"
|
|
13
12
|
import * as internal from "../internal/http/client"
|
|
14
13
|
import type * as Error from "./ClientError"
|
|
15
14
|
import type * as ClientRequest from "./ClientRequest"
|
|
@@ -206,6 +205,16 @@ export const filterStatusOk: <R, E>(
|
|
|
206
205
|
export const make: <R, E, A>(f: (request: ClientRequest.ClientRequest) => Effect.Effect<R, E, A>) => Client<R, E, A> =
|
|
207
206
|
internal.make
|
|
208
207
|
|
|
208
|
+
/**
|
|
209
|
+
* @since 1.0.0
|
|
210
|
+
* @category constructors
|
|
211
|
+
*/
|
|
212
|
+
export const makeDefault: (
|
|
213
|
+
f: (
|
|
214
|
+
request: ClientRequest.ClientRequest
|
|
215
|
+
) => Effect.Effect<never, Error.HttpClientError, ClientResponse.ClientResponse>
|
|
216
|
+
) => Client.Default = internal.makeDefault
|
|
217
|
+
|
|
209
218
|
/**
|
|
210
219
|
* @since 1.0.0
|
|
211
220
|
* @category mapping & sequencing
|
|
@@ -306,13 +315,6 @@ export const schemaFunction: {
|
|
|
306
315
|
) => (a: SA) => Effect.Effect<R, Error.RequestError | ParseResult.ParseError | E, A>
|
|
307
316
|
} = internal.schemaFunction
|
|
308
317
|
|
|
309
|
-
/**
|
|
310
|
-
* @since 1.0.0
|
|
311
|
-
* @category tracing
|
|
312
|
-
*/
|
|
313
|
-
export const withB3Propagation: <R, E>(self: Client.WithResponse<R, E>) => Client.WithResponse<R | Scope.Scope, E> =
|
|
314
|
-
internal.withB3Propagation
|
|
315
|
-
|
|
316
318
|
/**
|
|
317
319
|
* @since 1.0.0
|
|
318
320
|
* @category mapping & sequencing
|
package/src/Http/Middleware.ts
CHANGED
|
@@ -36,18 +36,6 @@ export const make: <M extends Middleware>(middleware: M) => M = internal.make
|
|
|
36
36
|
*/
|
|
37
37
|
export const logger: <R, E>(httpApp: App.Default<R, E>) => App.Default<R, E> = internal.logger
|
|
38
38
|
|
|
39
|
-
/**
|
|
40
|
-
* @since 1.0.0
|
|
41
|
-
* @category constructors
|
|
42
|
-
*/
|
|
43
|
-
export const tracer: <R, E>(httpApp: App.Default<R, E>) => App.Default<R, E> = internal.tracer
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* @since 1.0.0
|
|
47
|
-
* @category constructors
|
|
48
|
-
*/
|
|
49
|
-
export const loggerTracer: <R, E>(httpApp: App.Default<R, E>) => App.Default<R, E> = internal.loggerTracer
|
|
50
|
-
|
|
51
39
|
/**
|
|
52
40
|
* @since 1.0.0
|
|
53
41
|
* @category constructors
|
package/src/Worker.ts
ADDED
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
import type { Effect } from "effect"
|
|
5
|
+
import type * as Context from "effect/Context"
|
|
6
|
+
import type * as Duration from "effect/Duration"
|
|
7
|
+
import type * as Layer from "effect/Layer"
|
|
8
|
+
import type * as Pool from "effect/Pool"
|
|
9
|
+
import type * as Queue from "effect/Queue"
|
|
10
|
+
import type * as Scope from "effect/Scope"
|
|
11
|
+
import type * as Stream from "effect/Stream"
|
|
12
|
+
import * as internal from "./internal/worker"
|
|
13
|
+
import type { WorkerError } from "./WorkerError"
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @since 1.0.0
|
|
17
|
+
* @category models
|
|
18
|
+
*/
|
|
19
|
+
export interface BackingWorker<I, O> {
|
|
20
|
+
readonly join: Effect.Effect<never, WorkerError, never>
|
|
21
|
+
readonly send: (message: I, transfers?: ReadonlyArray<unknown>) => Effect.Effect<never, never, void>
|
|
22
|
+
readonly queue: Queue.Dequeue<BackingWorker.Message<O>>
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* @since 1.0.0
|
|
27
|
+
* @category models
|
|
28
|
+
*/
|
|
29
|
+
export declare namespace BackingWorker {
|
|
30
|
+
/**
|
|
31
|
+
* @since 1.0.0
|
|
32
|
+
* @category models
|
|
33
|
+
*/
|
|
34
|
+
export type Message<O> = readonly [ready: 0] | readonly [data: 1, O]
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* @since 1.0.0
|
|
39
|
+
* @category type ids
|
|
40
|
+
*/
|
|
41
|
+
export const PlatformWorkerTypeId: unique symbol = internal.PlatformWorkerTypeId
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* @since 1.0.0
|
|
45
|
+
* @category type ids
|
|
46
|
+
*/
|
|
47
|
+
export type PlatformWorkerTypeId = typeof PlatformWorkerTypeId
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* @since 1.0.0
|
|
51
|
+
* @category models
|
|
52
|
+
*/
|
|
53
|
+
export interface PlatformWorker {
|
|
54
|
+
readonly [PlatformWorkerTypeId]: PlatformWorkerTypeId
|
|
55
|
+
readonly spawn: <I, O>(worker: unknown) => Effect.Effect<Scope.Scope, WorkerError, BackingWorker<I, O>>
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* @since 1.0.0
|
|
60
|
+
* @category tags
|
|
61
|
+
*/
|
|
62
|
+
export const PlatformWorker: Context.Tag<PlatformWorker, PlatformWorker> = internal.PlatformWorker
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* @since 1.0.0
|
|
66
|
+
* @category models
|
|
67
|
+
*/
|
|
68
|
+
export interface Worker<I, E, O> {
|
|
69
|
+
readonly id: number
|
|
70
|
+
readonly join: Effect.Effect<never, WorkerError, never>
|
|
71
|
+
readonly execute: (message: I) => Stream.Stream<never, E, O>
|
|
72
|
+
readonly executeEffect: (message: I) => Effect.Effect<never, E, O>
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* @since 1.0.0
|
|
77
|
+
* @category models
|
|
78
|
+
*/
|
|
79
|
+
export declare namespace Worker {
|
|
80
|
+
/**
|
|
81
|
+
* @since 1.0.0
|
|
82
|
+
* @category models
|
|
83
|
+
*/
|
|
84
|
+
export interface Options<I, W = unknown> {
|
|
85
|
+
readonly spawn: (id: number) => W
|
|
86
|
+
readonly transfers?: (message: I) => ReadonlyArray<unknown>
|
|
87
|
+
readonly permits?: number
|
|
88
|
+
readonly queue?: WorkerQueue<I>
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* @since 1.0.0
|
|
93
|
+
* @category models
|
|
94
|
+
*/
|
|
95
|
+
export type Request<I> = readonly [id: number, data: 0, I] | readonly [id: number, interrupt: 1]
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* @since 1.0.0
|
|
99
|
+
* @category models
|
|
100
|
+
*/
|
|
101
|
+
export type Response<E, O> =
|
|
102
|
+
| readonly [id: number, data: 0, O]
|
|
103
|
+
| readonly [id: number, end: 1]
|
|
104
|
+
| readonly [id: number, end: 1, O]
|
|
105
|
+
| readonly [id: number, error: 2, E]
|
|
106
|
+
| readonly [id: number, defect: 3, unknown]
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* @since 1.0.0
|
|
111
|
+
* @category models
|
|
112
|
+
*/
|
|
113
|
+
export interface WorkerPool<I, E, O> {
|
|
114
|
+
readonly backing: Pool.Pool<WorkerError, Worker<I, E, O>>
|
|
115
|
+
readonly execute: (message: I) => Stream.Stream<never, E | WorkerError, O>
|
|
116
|
+
readonly executeEffect: (message: I) => Effect.Effect<never, E | WorkerError, O>
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* @since 1.0.0
|
|
121
|
+
* @category models
|
|
122
|
+
*/
|
|
123
|
+
export declare namespace WorkerPool {
|
|
124
|
+
/**
|
|
125
|
+
* @since 1.0.0
|
|
126
|
+
* @category models
|
|
127
|
+
*/
|
|
128
|
+
export type Options<I, W = unknown> =
|
|
129
|
+
& Worker.Options<I, W>
|
|
130
|
+
& ({
|
|
131
|
+
readonly size: number
|
|
132
|
+
} | {
|
|
133
|
+
readonly minSize: number
|
|
134
|
+
readonly maxSize: number
|
|
135
|
+
readonly timeToLive: Duration.DurationInput
|
|
136
|
+
})
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* @category models
|
|
141
|
+
* @since 1.0.0
|
|
142
|
+
*/
|
|
143
|
+
export interface WorkerQueue<I> {
|
|
144
|
+
readonly offer: (id: number, item: I) => Effect.Effect<never, never, void>
|
|
145
|
+
readonly take: Effect.Effect<never, never, readonly [id: number, item: I]>
|
|
146
|
+
readonly shutdown: Effect.Effect<never, never, void>
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* @since 1.0.0
|
|
151
|
+
* @category type ids
|
|
152
|
+
*/
|
|
153
|
+
export const WorkerManagerTypeId: unique symbol = internal.WorkerManagerTypeId
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* @since 1.0.0
|
|
157
|
+
* @category type ids
|
|
158
|
+
*/
|
|
159
|
+
export type WorkerManagerTypeId = typeof WorkerManagerTypeId
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* @since 1.0.0
|
|
163
|
+
* @category models
|
|
164
|
+
*/
|
|
165
|
+
export interface WorkerManager {
|
|
166
|
+
readonly [WorkerManagerTypeId]: WorkerManagerTypeId
|
|
167
|
+
readonly spawn: <I, E, O>(
|
|
168
|
+
options: Worker.Options<I>
|
|
169
|
+
) => Effect.Effect<Scope.Scope, WorkerError, Worker<I, E, O>>
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* @since 1.0.0
|
|
174
|
+
* @category tags
|
|
175
|
+
*/
|
|
176
|
+
export const WorkerManager: Context.Tag<WorkerManager, WorkerManager> = internal.WorkerManager
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* @since 1.0.0
|
|
180
|
+
* @category constructors
|
|
181
|
+
*/
|
|
182
|
+
export const makeManager: Effect.Effect<PlatformWorker, never, WorkerManager> = internal.makeManager
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* @since 1.0.0
|
|
186
|
+
* @category layers
|
|
187
|
+
*/
|
|
188
|
+
export const layerManager: Layer.Layer<PlatformWorker, never, WorkerManager> = internal.layerManager
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* @since 1.0.0
|
|
192
|
+
* @category constructors
|
|
193
|
+
*/
|
|
194
|
+
export const makePool: <W>() => <I, E, O>(
|
|
195
|
+
options: WorkerPool.Options<I, W>
|
|
196
|
+
) => Effect.Effect<WorkerManager | Scope.Scope, never, WorkerPool<I, E, O>> = internal.makePool
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* @since 1.0.0
|
|
200
|
+
* @category constructors
|
|
201
|
+
*/
|
|
202
|
+
export const makePoolLayer: <W>(
|
|
203
|
+
managerLayer: Layer.Layer<never, never, WorkerManager>
|
|
204
|
+
) => <Tag, I, E, O>(
|
|
205
|
+
tag: Context.Tag<Tag, WorkerPool<I, E, O>>,
|
|
206
|
+
options: WorkerPool.Options<I, W>
|
|
207
|
+
) => Layer.Layer<never, never, Tag> = internal.makePoolLayer
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
import type * as Data from "effect/Data"
|
|
5
|
+
import * as internal from "./internal/workerError"
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @since 1.0.0
|
|
9
|
+
* @category type ids
|
|
10
|
+
*/
|
|
11
|
+
export const WorkerErrorTypeId: unique symbol = internal.WorkerErrorTypeId
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @since 1.0.0
|
|
15
|
+
* @category type ids
|
|
16
|
+
*/
|
|
17
|
+
export type WorkerErrorTypeId = typeof WorkerErrorTypeId
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @since 1.0.0
|
|
21
|
+
* @category errors
|
|
22
|
+
*/
|
|
23
|
+
export interface WorkerError extends Data.Case {
|
|
24
|
+
readonly [WorkerErrorTypeId]: WorkerErrorTypeId
|
|
25
|
+
readonly _tag: "WorkerError"
|
|
26
|
+
readonly reason: "spawn" | "decode" | "unknown"
|
|
27
|
+
readonly error: unknown
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* @since 1.0.0
|
|
32
|
+
* @category errors
|
|
33
|
+
*/
|
|
34
|
+
export const WorkerError: (reason: "spawn" | "decode" | "unknown", error: unknown) => WorkerError = internal.WorkerError
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
import type { Effect } from "effect"
|
|
5
|
+
import type * as Context from "effect/Context"
|
|
6
|
+
import type * as Fiber from "effect/Fiber"
|
|
7
|
+
import type * as Queue from "effect/Queue"
|
|
8
|
+
import type * as Scope from "effect/Scope"
|
|
9
|
+
import type * as Stream from "effect/Stream"
|
|
10
|
+
import * as internal from "./internal/workerRunner"
|
|
11
|
+
import type { WorkerError } from "./WorkerError"
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @since 1.0.0
|
|
15
|
+
* @category models
|
|
16
|
+
*/
|
|
17
|
+
export interface BackingRunner<I, O> {
|
|
18
|
+
readonly fiber: Fiber.Fiber<WorkerError, void>
|
|
19
|
+
readonly queue: Queue.Dequeue<I>
|
|
20
|
+
readonly send: (message: O, transfers?: ReadonlyArray<unknown>) => Effect.Effect<never, never, void>
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @since 1.0.0
|
|
25
|
+
* @category models
|
|
26
|
+
*/
|
|
27
|
+
export declare namespace BackingRunner {
|
|
28
|
+
/**
|
|
29
|
+
* @since 1.0.0
|
|
30
|
+
* @category models
|
|
31
|
+
*/
|
|
32
|
+
export type Message<I> = readonly [request: 0, I] | readonly [close: 1]
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* @since 1.0.0
|
|
37
|
+
* @category type ids
|
|
38
|
+
*/
|
|
39
|
+
export const PlatformRunnerTypeId: unique symbol = internal.PlatformRunnerTypeId
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* @since 1.0.0
|
|
43
|
+
* @category type ids
|
|
44
|
+
*/
|
|
45
|
+
export type PlatformRunnerTypeId = typeof PlatformRunnerTypeId
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* @since 1.0.0
|
|
49
|
+
* @category models
|
|
50
|
+
*/
|
|
51
|
+
export interface PlatformRunner {
|
|
52
|
+
readonly [PlatformRunnerTypeId]: PlatformRunnerTypeId
|
|
53
|
+
readonly start: <I, O>() => Effect.Effect<Scope.Scope, WorkerError, BackingRunner<I, O>>
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* @since 1.0.0
|
|
58
|
+
* @category tags
|
|
59
|
+
*/
|
|
60
|
+
export const PlatformRunner: Context.Tag<PlatformRunner, PlatformRunner> = internal.PlatformRunner
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* @since 1.0.0
|
|
64
|
+
* @category models
|
|
65
|
+
*/
|
|
66
|
+
export declare namespace Runner {
|
|
67
|
+
/**
|
|
68
|
+
* @since 1.0.0
|
|
69
|
+
* @category models
|
|
70
|
+
*/
|
|
71
|
+
export interface Options<O> {
|
|
72
|
+
readonly transfers?: (message: O) => ReadonlyArray<unknown>
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* @since 1.0.0
|
|
78
|
+
* @category constructors
|
|
79
|
+
*/
|
|
80
|
+
export const make: <I, R, E, O>(
|
|
81
|
+
process: (request: I) => Stream.Stream<R, E, O> | Effect.Effect<R, E, O>,
|
|
82
|
+
options?: Runner.Options<O> | undefined
|
|
83
|
+
) => Effect.Effect<Scope.Scope | R | PlatformRunner, WorkerError, void> = internal.make
|
package/src/index.ts
CHANGED
|
@@ -47,3 +47,18 @@ export * as Path from "@effect/platform/Path"
|
|
|
47
47
|
* @since 1.0.0
|
|
48
48
|
*/
|
|
49
49
|
export * as Runtime from "@effect/platform/Runtime"
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* @since 1.0.0
|
|
53
|
+
*/
|
|
54
|
+
export * as Worker from "@effect/platform/Worker"
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* @since 1.0.0
|
|
58
|
+
*/
|
|
59
|
+
export * as WorkerError from "@effect/platform/WorkerError"
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* @since 1.0.0
|
|
63
|
+
*/
|
|
64
|
+
export * as WorkerRunner from "@effect/platform/WorkerRunner"
|
|
@@ -2,19 +2,18 @@ import type * as ParseResult from "@effect/schema/ParseResult"
|
|
|
2
2
|
import * as Schema from "@effect/schema/Schema"
|
|
3
3
|
import * as Context from "effect/Context"
|
|
4
4
|
import * as Effect from "effect/Effect"
|
|
5
|
-
import { dual
|
|
5
|
+
import { dual } from "effect/Function"
|
|
6
6
|
import * as Layer from "effect/Layer"
|
|
7
7
|
import * as Option from "effect/Option"
|
|
8
8
|
import { pipeArguments } from "effect/Pipeable"
|
|
9
9
|
import type * as Predicate from "effect/Predicate"
|
|
10
10
|
import type * as Schedule from "effect/Schedule"
|
|
11
|
-
import type * as Scope from "effect/Scope"
|
|
12
11
|
import * as Stream from "effect/Stream"
|
|
13
12
|
import type * as Body from "../../Http/Body"
|
|
14
13
|
import type * as Client from "../../Http/Client"
|
|
15
14
|
import type * as Error from "../../Http/ClientError"
|
|
16
15
|
import type * as ClientRequest from "../../Http/ClientRequest"
|
|
17
|
-
import * as
|
|
16
|
+
import type * as ClientResponse from "../../Http/ClientResponse"
|
|
18
17
|
import * as Method from "../../Http/Method"
|
|
19
18
|
import * as UrlParams from "../../Http/UrlParams"
|
|
20
19
|
import * as internalBody from "./body"
|
|
@@ -43,11 +42,41 @@ export const make = <R, E, A>(
|
|
|
43
42
|
return f as Client.Client<R, E, A>
|
|
44
43
|
}
|
|
45
44
|
|
|
45
|
+
const withB3Propagation = <R, E>(
|
|
46
|
+
self: Client.Client.WithResponse<R, E>
|
|
47
|
+
): Client.Client.WithResponse<R, E> =>
|
|
48
|
+
make((req) =>
|
|
49
|
+
Effect.flatMap(
|
|
50
|
+
Effect.map(
|
|
51
|
+
Effect.currentSpan,
|
|
52
|
+
Option.match({
|
|
53
|
+
onNone: () => req,
|
|
54
|
+
onSome: (span) =>
|
|
55
|
+
internalRequest.setHeader(
|
|
56
|
+
req,
|
|
57
|
+
"b3",
|
|
58
|
+
`${span.traceId}-${span.spanId}-${span.sampled ? "1" : "0"}${
|
|
59
|
+
span.parent._tag === "Some" ? `-${span.parent.value.spanId}` : ""
|
|
60
|
+
}`
|
|
61
|
+
)
|
|
62
|
+
})
|
|
63
|
+
),
|
|
64
|
+
self
|
|
65
|
+
)
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
/** @internal */
|
|
69
|
+
export const makeDefault = (
|
|
70
|
+
f: (
|
|
71
|
+
request: ClientRequest.ClientRequest
|
|
72
|
+
) => Effect.Effect<never, Error.HttpClientError, ClientResponse.ClientResponse>
|
|
73
|
+
): Client.Client.Default => withB3Propagation(make(f))
|
|
74
|
+
|
|
46
75
|
/** @internal */
|
|
47
76
|
export const fetch = (
|
|
48
77
|
options: RequestInit = {}
|
|
49
78
|
): Client.Client.Default =>
|
|
50
|
-
|
|
79
|
+
makeDefault((request) =>
|
|
51
80
|
Effect.flatMap(
|
|
52
81
|
UrlParams.makeUrl(request.url, request.urlParams, (_) =>
|
|
53
82
|
internalError.requestError({
|
|
@@ -378,35 +407,6 @@ export const mapRequestEffect = dual<
|
|
|
378
407
|
) => Client.Client<R | R2, E | E2, A>
|
|
379
408
|
>(2, (self, f) => make((request) => Effect.flatMap(f(request), self)))
|
|
380
409
|
|
|
381
|
-
/** @internal */
|
|
382
|
-
export const withB3Propagation = <R, E>(
|
|
383
|
-
self: Client.Client.WithResponse<R, E>
|
|
384
|
-
): Client.Client.WithResponse<R | Scope.Scope, E> =>
|
|
385
|
-
make((req) =>
|
|
386
|
-
pipe(
|
|
387
|
-
Effect.map(
|
|
388
|
-
Effect.currentSpan,
|
|
389
|
-
Option.match({
|
|
390
|
-
onNone: () => req,
|
|
391
|
-
onSome: (span) => {
|
|
392
|
-
const parentId = span.parent._tag === "Some" ? `-${span.parent.value.spanId}` : ""
|
|
393
|
-
return internalRequest.setHeader(
|
|
394
|
-
req,
|
|
395
|
-
"b3",
|
|
396
|
-
`${span.traceId}-${span.spanId}-1${parentId}`
|
|
397
|
-
)
|
|
398
|
-
}
|
|
399
|
-
})
|
|
400
|
-
),
|
|
401
|
-
Effect.flatMap(self),
|
|
402
|
-
Effect.tap((res) =>
|
|
403
|
-
Effect.ignore(
|
|
404
|
-
Effect.flatMap(IncomingMessage.schemaExternalSpan(res), Effect.setParentSpan)
|
|
405
|
-
)
|
|
406
|
-
)
|
|
407
|
-
)
|
|
408
|
-
)
|
|
409
|
-
|
|
410
410
|
/** @internal */
|
|
411
411
|
export const retry: {
|
|
412
412
|
<R1, E extends E0, E0, B>(policy: Schedule.Schedule<R1, E0, B>): <R, A>(
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
import * as Effect from "effect/Effect"
|
|
2
|
-
import { flow } from "effect/Function"
|
|
3
|
-
import * as App from "../../Http/App"
|
|
4
2
|
import * as Headers from "../../Http/Headers"
|
|
5
3
|
import * as IncomingMessage from "../../Http/IncomingMessage"
|
|
6
4
|
import type * as Middleware from "../../Http/Middleware"
|
|
7
5
|
import * as ServerRequest from "../../Http/ServerRequest"
|
|
8
|
-
import * as ServerResponse from "../../Http/ServerResponse"
|
|
9
6
|
|
|
10
7
|
/** @internal */
|
|
11
8
|
export const make = <M extends Middleware.Middleware>(middleware: M): M => middleware
|
|
@@ -37,17 +34,16 @@ export const logger = make((httpApp) => {
|
|
|
37
34
|
/** @internal */
|
|
38
35
|
export const tracer = make((httpApp) => {
|
|
39
36
|
const appWithStatus = Effect.tap(
|
|
40
|
-
|
|
41
|
-
App.appendPreResponseHandler(b3Response),
|
|
42
|
-
httpApp
|
|
43
|
-
),
|
|
37
|
+
httpApp,
|
|
44
38
|
(response) => Effect.annotateCurrentSpan("http.status", response.status)
|
|
45
39
|
)
|
|
46
40
|
return Effect.flatMap(
|
|
47
41
|
ServerRequest.ServerRequest,
|
|
48
42
|
(request) =>
|
|
49
43
|
Effect.flatMap(
|
|
50
|
-
|
|
44
|
+
request.headers["x-b3-traceid"] || request.headers["b3"] ?
|
|
45
|
+
Effect.orElseSucceed(IncomingMessage.schemaExternalSpan(request), () => undefined) :
|
|
46
|
+
Effect.succeed(undefined),
|
|
51
47
|
(parent) =>
|
|
52
48
|
Effect.withSpan(
|
|
53
49
|
appWithStatus,
|
|
@@ -58,21 +54,6 @@ export const tracer = make((httpApp) => {
|
|
|
58
54
|
)
|
|
59
55
|
})
|
|
60
56
|
|
|
61
|
-
const b3Response: App.PreResponseHandler = (_request, response) =>
|
|
62
|
-
Effect.flatMap(
|
|
63
|
-
Effect.currentSpan,
|
|
64
|
-
(span) =>
|
|
65
|
-
span._tag === "Some"
|
|
66
|
-
? ServerResponse.setHeader(
|
|
67
|
-
response,
|
|
68
|
-
"b3",
|
|
69
|
-
`${span.value.traceId}-${span.value.spanId}-1${
|
|
70
|
-
span.value.parent._tag === "Some" ? `-${span.value.parent.value.spanId}` : ""
|
|
71
|
-
}`
|
|
72
|
-
)
|
|
73
|
-
: response
|
|
74
|
-
)
|
|
75
|
-
|
|
76
57
|
/** @internal */
|
|
77
58
|
export const xForwardedHeaders = make((httpApp) =>
|
|
78
59
|
Effect.updateService(httpApp, ServerRequest.ServerRequest, (request) =>
|
|
@@ -87,6 +68,3 @@ export const xForwardedHeaders = make((httpApp) =>
|
|
|
87
68
|
})
|
|
88
69
|
: request)
|
|
89
70
|
)
|
|
90
|
-
|
|
91
|
-
/** @internal */
|
|
92
|
-
export const loggerTracer = flow(tracer, logger)
|