@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.
Files changed (116) hide show
  1. package/Http/App/dist/effect-platform-Http-App.cjs.dev.js +22 -1
  2. package/Http/App/dist/effect-platform-Http-App.cjs.mjs +1 -0
  3. package/Http/App/dist/effect-platform-Http-App.cjs.prod.js +22 -1
  4. package/Http/App/dist/effect-platform-Http-App.esm.js +21 -1
  5. package/Http/Client/dist/effect-platform-Http-Client.cjs.dev.js +12 -12
  6. package/Http/Client/dist/effect-platform-Http-Client.cjs.mjs +2 -2
  7. package/Http/Client/dist/effect-platform-Http-Client.cjs.prod.js +12 -12
  8. package/Http/Client/dist/effect-platform-Http-Client.esm.js +12 -12
  9. package/Http/ClientRequest/dist/effect-platform-Http-ClientRequest.esm.js +2 -2
  10. package/Http/Middleware/dist/effect-platform-Http-Middleware.cjs.dev.js +5 -13
  11. package/Http/Middleware/dist/effect-platform-Http-Middleware.cjs.mjs +0 -2
  12. package/Http/Middleware/dist/effect-platform-Http-Middleware.cjs.prod.js +5 -13
  13. package/Http/Middleware/dist/effect-platform-Http-Middleware.esm.js +7 -13
  14. package/Http/Router/dist/effect-platform-Http-Router.cjs.dev.js +1 -1
  15. package/Http/Router/dist/effect-platform-Http-Router.cjs.prod.js +1 -1
  16. package/Http/Router/dist/effect-platform-Http-Router.esm.js +3 -3
  17. package/Http/ServerError/dist/effect-platform-Http-ServerError.esm.js +1 -1
  18. package/Http/ServerRequest/dist/effect-platform-Http-ServerRequest.cjs.dev.js +1 -1
  19. package/Http/ServerRequest/dist/effect-platform-Http-ServerRequest.cjs.prod.js +1 -1
  20. package/Http/ServerRequest/dist/effect-platform-Http-ServerRequest.esm.js +2 -2
  21. package/Http/ServerResponse/dist/effect-platform-Http-ServerResponse.esm.js +1 -1
  22. package/HttpClient/dist/effect-platform-HttpClient.cjs.dev.js +5 -5
  23. package/HttpClient/dist/effect-platform-HttpClient.cjs.prod.js +5 -5
  24. package/HttpClient/dist/effect-platform-HttpClient.esm.js +6 -6
  25. package/HttpServer/dist/effect-platform-HttpServer.cjs.dev.js +12 -11
  26. package/HttpServer/dist/effect-platform-HttpServer.cjs.prod.js +12 -11
  27. package/HttpServer/dist/effect-platform-HttpServer.esm.js +14 -13
  28. package/Worker/dist/effect-platform-Worker.cjs.d.mts +2 -0
  29. package/Worker/dist/effect-platform-Worker.cjs.d.mts.map +1 -0
  30. package/Worker/dist/effect-platform-Worker.cjs.d.ts +2 -0
  31. package/Worker/dist/effect-platform-Worker.cjs.d.ts.map +1 -0
  32. package/Worker/dist/effect-platform-Worker.cjs.dev.js +291 -0
  33. package/Worker/dist/effect-platform-Worker.cjs.js +7 -0
  34. package/Worker/dist/effect-platform-Worker.cjs.mjs +10 -0
  35. package/Worker/dist/effect-platform-Worker.cjs.prod.js +291 -0
  36. package/Worker/dist/effect-platform-Worker.esm.js +252 -0
  37. package/Worker/package.json +4 -0
  38. package/WorkerError/dist/effect-platform-WorkerError.cjs.d.mts +2 -0
  39. package/WorkerError/dist/effect-platform-WorkerError.cjs.d.mts.map +1 -0
  40. package/WorkerError/dist/effect-platform-WorkerError.cjs.d.ts +2 -0
  41. package/WorkerError/dist/effect-platform-WorkerError.cjs.d.ts.map +1 -0
  42. package/WorkerError/dist/effect-platform-WorkerError.cjs.dev.js +65 -0
  43. package/WorkerError/dist/effect-platform-WorkerError.cjs.js +7 -0
  44. package/WorkerError/dist/effect-platform-WorkerError.cjs.mjs +4 -0
  45. package/WorkerError/dist/effect-platform-WorkerError.cjs.prod.js +65 -0
  46. package/WorkerError/dist/effect-platform-WorkerError.esm.js +40 -0
  47. package/WorkerError/package.json +4 -0
  48. package/WorkerRunner/dist/effect-platform-WorkerRunner.cjs.d.mts +2 -0
  49. package/WorkerRunner/dist/effect-platform-WorkerRunner.cjs.d.mts.map +1 -0
  50. package/WorkerRunner/dist/effect-platform-WorkerRunner.cjs.d.ts +2 -0
  51. package/WorkerRunner/dist/effect-platform-WorkerRunner.cjs.d.ts.map +1 -0
  52. package/WorkerRunner/dist/effect-platform-WorkerRunner.cjs.dev.js +129 -0
  53. package/WorkerRunner/dist/effect-platform-WorkerRunner.cjs.js +7 -0
  54. package/WorkerRunner/dist/effect-platform-WorkerRunner.cjs.mjs +5 -0
  55. package/WorkerRunner/dist/effect-platform-WorkerRunner.cjs.prod.js +129 -0
  56. package/WorkerRunner/dist/effect-platform-WorkerRunner.esm.js +97 -0
  57. package/WorkerRunner/package.json +4 -0
  58. package/dist/{App-1ca51fa7.esm.js → App-2d206a13.esm.js} +9 -1
  59. package/dist/{App-d8b904fa.cjs.prod.js → App-7ef679dc.cjs.prod.js} +9 -0
  60. package/dist/{App-18152f12.cjs.dev.js → App-bad10dc1.cjs.dev.js} +9 -0
  61. package/dist/{Client-3938c9f5.cjs.dev.js → Client-0146412d.cjs.dev.js} +16 -19
  62. package/dist/{Client-e8ebeb3a.esm.js → Client-4f8f804b.esm.js} +18 -21
  63. package/dist/{Client-5497adf2.cjs.prod.js → Client-e9835f16.cjs.prod.js} +16 -19
  64. package/dist/{ClientRequest-490c76cd.esm.js → ClientRequest-27630c54.esm.js} +1 -1
  65. package/dist/Middleware-934a0c8f.esm.js +41 -0
  66. package/dist/Middleware-a2c50c35.cjs.dev.js +46 -0
  67. package/dist/Middleware-e53794a3.cjs.prod.js +46 -0
  68. package/dist/{Router-3112d780.esm.js → Router-2505b5dd.esm.js} +2 -2
  69. package/dist/{Router-2c0b718b.cjs.prod.js → Router-3645c2b3.cjs.prod.js} +3 -3
  70. package/dist/{Router-06c5cb9a.cjs.dev.js → Router-b9feed01.cjs.dev.js} +3 -3
  71. package/dist/{ServerError-04ad5b57.esm.js → ServerError-97730ed2.esm.js} +1 -1
  72. package/dist/{ServerRequest-41c7e979.esm.js → ServerRequest-078a4bb2.esm.js} +2 -2
  73. package/dist/ServerRequest-705b12bb.cjs.prod.js +2 -2
  74. package/dist/ServerRequest-8e9629a5.cjs.dev.js +2 -2
  75. package/dist/{ServerResponse-03c252ea.esm.js → ServerResponse-de572c21.esm.js} +1 -1
  76. package/dist/{clientRequest-6121a7f6.esm.js → clientRequest-fe7578cf.esm.js} +1 -1
  77. package/dist/declarations/src/Error.d.ts +1 -1
  78. package/dist/declarations/src/Error.d.ts.map +1 -1
  79. package/dist/declarations/src/Http/App.d.ts +5 -0
  80. package/dist/declarations/src/Http/App.d.ts.map +1 -1
  81. package/dist/declarations/src/Http/Client.d.ts +5 -6
  82. package/dist/declarations/src/Http/Client.d.ts.map +1 -1
  83. package/dist/declarations/src/Http/Middleware.d.ts +0 -10
  84. package/dist/declarations/src/Http/Middleware.d.ts.map +1 -1
  85. package/dist/declarations/src/Worker.d.ts +170 -0
  86. package/dist/declarations/src/Worker.d.ts.map +1 -0
  87. package/dist/declarations/src/WorkerError.d.ts +30 -0
  88. package/dist/declarations/src/WorkerError.d.ts.map +1 -0
  89. package/dist/declarations/src/WorkerRunner.d.ts +72 -0
  90. package/dist/declarations/src/WorkerRunner.d.ts.map +1 -0
  91. package/dist/declarations/src/index.d.ts +12 -0
  92. package/dist/declarations/src/index.d.ts.map +1 -1
  93. package/dist/effect-platform.cjs.dev.js +9 -0
  94. package/dist/effect-platform.cjs.mjs +4 -1
  95. package/dist/effect-platform.cjs.prod.js +9 -0
  96. package/dist/effect-platform.esm.js +6 -0
  97. package/dist/middleware-85768a1e.cjs.prod.js +66 -0
  98. package/dist/middleware-98794cc2.cjs.dev.js +66 -0
  99. package/dist/middleware-ea618e68.esm.js +41 -0
  100. package/package.json +24 -3
  101. package/src/Error.ts +1 -1
  102. package/src/Http/App.ts +9 -0
  103. package/src/Http/Client.ts +10 -8
  104. package/src/Http/Middleware.ts +0 -12
  105. package/src/Worker.ts +207 -0
  106. package/src/WorkerError.ts +34 -0
  107. package/src/WorkerRunner.ts +83 -0
  108. package/src/index.ts +15 -0
  109. package/src/internal/http/client.ts +33 -33
  110. package/src/internal/http/middleware.ts +4 -26
  111. package/src/internal/worker.ts +262 -0
  112. package/src/internal/workerError.ts +16 -0
  113. package/src/internal/workerRunner.ts +83 -0
  114. package/dist/Middleware-04ddadf1.esm.js +0 -100
  115. package/dist/Middleware-3e264366.cjs.dev.js +0 -127
  116. 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.21.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.0",
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
@@ -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
@@ -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, pipe } from "effect/Function"
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 IncomingMessage from "../../Http/IncomingMessage"
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
- make((request) =>
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
- Effect.zipRight(
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
- Effect.orElseSucceed(IncomingMessage.schemaExternalSpan(request), () => undefined),
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)