@effect/platform 0.40.0 → 0.40.2

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.
@@ -1,5 +1,6 @@
1
1
  import * as Schema from "@effect/schema/Schema"
2
2
  import * as Serializable from "@effect/schema/Serializable"
3
+ import { Tracer } from "effect"
3
4
  import * as Cause from "effect/Cause"
4
5
  import * as Channel from "effect/Channel"
5
6
  import * as Chunk from "effect/Chunk"
@@ -10,6 +11,7 @@ import * as Exit from "effect/Exit"
10
11
  import * as Fiber from "effect/Fiber"
11
12
  import { identity, pipe } from "effect/Function"
12
13
  import * as Layer from "effect/Layer"
14
+ import * as Option from "effect/Option"
13
15
  import * as Pool from "effect/Pool"
14
16
  import * as Queue from "effect/Queue"
15
17
  import * as ReadonlyArray from "effect/ReadonlyArray"
@@ -23,9 +25,9 @@ import { WorkerError } from "../WorkerError.js"
23
25
  /** @internal */
24
26
  export const defaultQueue = <I>() =>
25
27
  Effect.map(
26
- Queue.unbounded<readonly [id: number, item: I]>(),
28
+ Queue.unbounded<readonly [id: number, item: I, span: Option.Option<Tracer.Span>]>(),
27
29
  (queue): Worker.WorkerQueue<I> => ({
28
- offer: (id, item) => Queue.offer(queue, [id, item]),
30
+ offer: (id, item, span) => Queue.offer(queue, [id, item, span]),
29
31
  take: Queue.take(queue),
30
32
  shutdown: Queue.shutdown(queue)
31
33
  })
@@ -170,12 +172,16 @@ export const makeManager = Effect.gen(function*(_) {
170
172
  Effect.all([
171
173
  Effect.sync(() => requestIdCounter++),
172
174
  Queue.unbounded<Exit.Exit<E | WorkerError, ReadonlyArray<O>>>(),
173
- Deferred.make<never, void>()
175
+ Deferred.make<never, void>(),
176
+ Effect.map(
177
+ Effect.serviceOption(Tracer.ParentSpan),
178
+ Option.filter((span): span is Tracer.Span => span._tag === "Span")
179
+ )
174
180
  ]),
175
- ([id, queue, deferred]) =>
181
+ ([id, queue, deferred, span]) =>
176
182
  Effect.suspend(() => {
177
183
  requestMap.set(id, [queue, deferred])
178
- return outbound.offer(id, request)
184
+ return outbound.offer(id, request, span)
179
185
  })
180
186
  )
181
187
 
@@ -183,7 +189,8 @@ export const makeManager = Effect.gen(function*(_) {
183
189
  [id, , deferred]: [
184
190
  number,
185
191
  Queue.Queue<Exit.Exit<E | WorkerError, ReadonlyArray<O>>>,
186
- Deferred.Deferred<never, void>
192
+ Deferred.Deferred<never, void>,
193
+ Option.Option<Tracer.Span>
187
194
  ],
188
195
  exit: Exit.Exit<unknown, unknown>
189
196
  ) => {
@@ -225,16 +232,19 @@ export const makeManager = Effect.gen(function*(_) {
225
232
  yield* _(
226
233
  semaphore.take(1),
227
234
  Effect.zipRight(outbound.take),
228
- Effect.flatMap(([id, request]) =>
235
+ Effect.flatMap(([id, request, span]) =>
229
236
  pipe(
230
237
  Effect.suspend(() => {
231
238
  const result = requestMap.get(id)
232
239
  if (!result) return Effect.unit
233
240
  const transferables = transfers(request)
241
+ const spanTuple = Option.getOrUndefined(
242
+ Option.map(span, (span) => [span.traceId, span.spanId, span.sampled] as const)
243
+ )
234
244
  return pipe(
235
245
  Effect.flatMap(
236
246
  encode ? encode(request) : Effect.succeed(request),
237
- (payload) => sendQueue.offer([[id, 0, payload], transferables])
247
+ (payload) => sendQueue.offer([[id, 0, payload, spanTuple], transferables])
238
248
  ),
239
249
  Effect.catchAllCause((cause) => Queue.offer(result[0], Exit.failCause(cause))),
240
250
  Effect.zipRight(Deferred.await(result[1]))
@@ -44,7 +44,7 @@ export const make = <I, R, E, O>(
44
44
  return Effect.succeed(req)
45
45
  }
46
46
 
47
- return Effect.map(options.decode!(req[2]), (data) => [req[0], req[1], data])
47
+ return Effect.map(options.decode!(req[2]), (data) => [req[0], req[1], data, req[3]])
48
48
  }) :
49
49
  identity,
50
50
  Effect.tap((req) => {
@@ -57,7 +57,7 @@ export const make = <I, R, E, O>(
57
57
 
58
58
  const stream = process(req[2])
59
59
 
60
- const effect = Effect.isEffect(stream) ?
60
+ let effect = Effect.isEffect(stream) ?
61
61
  Effect.matchCauseEffect(stream, {
62
62
  onFailure: (cause) =>
63
63
  Either.match(Cause.failureOrCause(cause), {
@@ -119,6 +119,17 @@ export const make = <I, R, E, O>(
119
119
  })
120
120
  )
121
121
 
122
+ if (req[3]) {
123
+ const [traceId, spanId, sampled] = req[3]
124
+ effect = Effect.withParentSpan(effect, {
125
+ _tag: "ExternalSpan",
126
+ traceId,
127
+ spanId,
128
+ sampled,
129
+ context: Context.empty()
130
+ })
131
+ }
132
+
122
133
  return pipe(
123
134
  effect,
124
135
  Effect.ensuring(Effect.sync(() => fiberMap.delete(id))),