effect 3.1.5 → 3.2.0

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 (115) hide show
  1. package/dist/cjs/Array.js +139 -2
  2. package/dist/cjs/Array.js.map +1 -1
  3. package/dist/cjs/Cause.js +8 -1
  4. package/dist/cjs/Cause.js.map +1 -1
  5. package/dist/cjs/Chunk.js +18 -1
  6. package/dist/cjs/Chunk.js.map +1 -1
  7. package/dist/cjs/Config.js.map +1 -1
  8. package/dist/cjs/Data.js +11 -8
  9. package/dist/cjs/Data.js.map +1 -1
  10. package/dist/cjs/Effect.js +106 -18
  11. package/dist/cjs/Effect.js.map +1 -1
  12. package/dist/cjs/Stream.js +19 -1
  13. package/dist/cjs/Stream.js.map +1 -1
  14. package/dist/cjs/Tracer.js.map +1 -1
  15. package/dist/cjs/internal/cause.js +55 -48
  16. package/dist/cjs/internal/cause.js.map +1 -1
  17. package/dist/cjs/internal/channel.js +11 -1
  18. package/dist/cjs/internal/channel.js.map +1 -1
  19. package/dist/cjs/internal/core-effect.js +51 -9
  20. package/dist/cjs/internal/core-effect.js.map +1 -1
  21. package/dist/cjs/internal/core.js +8 -4
  22. package/dist/cjs/internal/core.js.map +1 -1
  23. package/dist/cjs/internal/fiberRuntime.js +27 -14
  24. package/dist/cjs/internal/fiberRuntime.js.map +1 -1
  25. package/dist/cjs/internal/layer/circular.js +4 -1
  26. package/dist/cjs/internal/layer/circular.js.map +1 -1
  27. package/dist/cjs/internal/layer.js +11 -1
  28. package/dist/cjs/internal/layer.js.map +1 -1
  29. package/dist/cjs/internal/runtime.js +9 -4
  30. package/dist/cjs/internal/runtime.js.map +1 -1
  31. package/dist/cjs/internal/schedule.js +2 -2
  32. package/dist/cjs/internal/schedule.js.map +1 -1
  33. package/dist/cjs/internal/stream.js +27 -9
  34. package/dist/cjs/internal/stream.js.map +1 -1
  35. package/dist/cjs/internal/tracer.js +31 -1
  36. package/dist/cjs/internal/tracer.js.map +1 -1
  37. package/dist/cjs/internal/version.js +1 -1
  38. package/dist/dts/Array.d.ts +199 -0
  39. package/dist/dts/Array.d.ts.map +1 -1
  40. package/dist/dts/Cause.d.ts +15 -0
  41. package/dist/dts/Cause.d.ts.map +1 -1
  42. package/dist/dts/Chunk.d.ts +20 -0
  43. package/dist/dts/Chunk.d.ts.map +1 -1
  44. package/dist/dts/Config.d.ts +6 -2
  45. package/dist/dts/Config.d.ts.map +1 -1
  46. package/dist/dts/Data.d.ts +46 -13
  47. package/dist/dts/Data.d.ts.map +1 -1
  48. package/dist/dts/Effect.d.ts +122 -15
  49. package/dist/dts/Effect.d.ts.map +1 -1
  50. package/dist/dts/Stream.d.ts +23 -1
  51. package/dist/dts/Stream.d.ts.map +1 -1
  52. package/dist/dts/Tracer.d.ts +1 -0
  53. package/dist/dts/Tracer.d.ts.map +1 -1
  54. package/dist/dts/internal/core-effect.d.ts +7 -1
  55. package/dist/dts/internal/core-effect.d.ts.map +1 -1
  56. package/dist/dts/internal/core.d.ts.map +1 -1
  57. package/dist/dts/internal/stream.d.ts.map +1 -1
  58. package/dist/esm/Array.js +182 -0
  59. package/dist/esm/Array.js.map +1 -1
  60. package/dist/esm/Cause.js +7 -0
  61. package/dist/esm/Cause.js.map +1 -1
  62. package/dist/esm/Chunk.js +16 -0
  63. package/dist/esm/Chunk.js.map +1 -1
  64. package/dist/esm/Config.js.map +1 -1
  65. package/dist/esm/Data.js +11 -8
  66. package/dist/esm/Data.js.map +1 -1
  67. package/dist/esm/Effect.js +103 -15
  68. package/dist/esm/Effect.js.map +1 -1
  69. package/dist/esm/Stream.js +18 -0
  70. package/dist/esm/Stream.js.map +1 -1
  71. package/dist/esm/Tracer.js.map +1 -1
  72. package/dist/esm/internal/cause.js +54 -47
  73. package/dist/esm/internal/cause.js.map +1 -1
  74. package/dist/esm/internal/channel.js +10 -1
  75. package/dist/esm/internal/channel.js.map +1 -1
  76. package/dist/esm/internal/core-effect.js +47 -7
  77. package/dist/esm/internal/core-effect.js.map +1 -1
  78. package/dist/esm/internal/core.js +7 -3
  79. package/dist/esm/internal/core.js.map +1 -1
  80. package/dist/esm/internal/fiberRuntime.js +26 -14
  81. package/dist/esm/internal/fiberRuntime.js.map +1 -1
  82. package/dist/esm/internal/layer/circular.js +4 -1
  83. package/dist/esm/internal/layer/circular.js.map +1 -1
  84. package/dist/esm/internal/layer.js +10 -1
  85. package/dist/esm/internal/layer.js.map +1 -1
  86. package/dist/esm/internal/runtime.js +9 -4
  87. package/dist/esm/internal/runtime.js.map +1 -1
  88. package/dist/esm/internal/schedule.js +2 -2
  89. package/dist/esm/internal/schedule.js.map +1 -1
  90. package/dist/esm/internal/stream.js +23 -7
  91. package/dist/esm/internal/stream.js.map +1 -1
  92. package/dist/esm/internal/tracer.js +29 -0
  93. package/dist/esm/internal/tracer.js.map +1 -1
  94. package/dist/esm/internal/version.js +1 -1
  95. package/package.json +1 -1
  96. package/src/Array.ts +214 -0
  97. package/src/Cause.ts +17 -0
  98. package/src/Chunk.ts +30 -0
  99. package/src/Config.ts +8 -6
  100. package/src/Data.ts +121 -48
  101. package/src/Effect.ts +126 -15
  102. package/src/Stream.ts +31 -1
  103. package/src/Tracer.ts +1 -0
  104. package/src/internal/cause.ts +70 -52
  105. package/src/internal/channel.ts +32 -14
  106. package/src/internal/core-effect.ts +74 -25
  107. package/src/internal/core.ts +8 -3
  108. package/src/internal/fiberRuntime.ts +22 -11
  109. package/src/internal/layer/circular.ts +4 -2
  110. package/src/internal/layer.ts +37 -14
  111. package/src/internal/runtime.ts +10 -5
  112. package/src/internal/schedule.ts +2 -2
  113. package/src/internal/stream.ts +37 -13
  114. package/src/internal/tracer.ts +21 -0
  115. package/src/internal/version.ts +1 -1
@@ -1335,7 +1335,7 @@ export class FiberRuntime<in out A, in out E = never> implements Fiber.RuntimeFi
1335
1335
  internalCause.sequential(internalCause.die(e), internalCause.interrupt(FiberId.none))
1336
1336
  )
1337
1337
  } else {
1338
- cur = core.exitFailCause(internalCause.die(e))
1338
+ cur = core.die(e)
1339
1339
  }
1340
1340
  }
1341
1341
  }
@@ -3622,8 +3622,9 @@ export const interruptWhenPossible = dual<
3622
3622
  export const makeSpanScoped = (
3623
3623
  name: string,
3624
3624
  options?: Tracer.SpanOptions | undefined
3625
- ): Effect.Effect<Tracer.Span, never, Scope.Scope> =>
3626
- core.uninterruptible(
3625
+ ): Effect.Effect<Tracer.Span, never, Scope.Scope> => {
3626
+ options = tracer.addSpanStackTrace(options)
3627
+ return core.uninterruptible(
3627
3628
  core.withFiberRuntime((fiber) => {
3628
3629
  const scope = Context.unsafeGet(fiber.getFiberRef(core.currentContext), scopeTag)
3629
3630
  const span = internalEffect.unsafeMakeSpan(fiber, name, options)
@@ -3641,27 +3642,37 @@ export const makeSpanScoped = (
3641
3642
  )
3642
3643
  })
3643
3644
  )
3645
+ }
3644
3646
 
3645
3647
  /* @internal */
3646
3648
  export const withTracerScoped = (value: Tracer.Tracer): Effect.Effect<void, never, Scope.Scope> =>
3647
3649
  fiberRefLocallyScopedWith(defaultServices.currentServices, Context.add(tracer.tracerTag, value))
3648
3650
 
3649
3651
  /** @internal */
3650
- export const withSpanScoped = dual<
3652
+ export const withSpanScoped: {
3651
3653
  (
3652
3654
  name: string,
3653
3655
  options?: Tracer.SpanOptions
3654
- ) => <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E, Exclude<R, Tracer.ParentSpan> | Scope.Scope>,
3656
+ ): <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E, Scope.Scope | Exclude<R, Tracer.ParentSpan>>
3655
3657
  <A, E, R>(
3656
3658
  self: Effect.Effect<A, E, R>,
3657
3659
  name: string,
3658
3660
  options?: Tracer.SpanOptions
3659
- ) => Effect.Effect<A, E, Exclude<R, Tracer.ParentSpan> | Scope.Scope>
3660
- >(
3661
- (args) => typeof args[0] !== "string",
3662
- (self, name, options) =>
3661
+ ): Effect.Effect<A, E, Scope.Scope | Exclude<R, Tracer.ParentSpan>>
3662
+ } = function() {
3663
+ const dataFirst = typeof arguments[0] !== "string"
3664
+ const name = dataFirst ? arguments[1] : arguments[0]
3665
+ const options = tracer.addSpanStackTrace(dataFirst ? arguments[2] : arguments[1])
3666
+ if (dataFirst) {
3667
+ const self = arguments[0]
3668
+ return core.flatMap(
3669
+ makeSpanScoped(name, tracer.addSpanStackTrace(options)),
3670
+ (span) => internalEffect.provideService(self, tracer.spanTag, span)
3671
+ )
3672
+ }
3673
+ return (self: Effect.Effect<any, any, any>) =>
3663
3674
  core.flatMap(
3664
- makeSpanScoped(name, options),
3675
+ makeSpanScoped(name, tracer.addSpanStackTrace(options)),
3665
3676
  (span) => internalEffect.provideService(self, tracer.spanTag, span)
3666
3677
  )
3667
- )
3678
+ } as any
@@ -196,8 +196,9 @@ export const span = (
196
196
  | ((span: Tracer.Span, exit: Exit.Exit<unknown, unknown>) => Effect.Effect<void>)
197
197
  | undefined
198
198
  }
199
- ): Layer.Layer<Tracer.ParentSpan> =>
200
- layer.scoped(
199
+ ): Layer.Layer<Tracer.ParentSpan> => {
200
+ options = tracer.addSpanStackTrace(options) as any
201
+ return layer.scoped(
201
202
  tracer.spanTag,
202
203
  options?.onEnd
203
204
  ? core.tap(
@@ -206,6 +207,7 @@ export const span = (
206
207
  )
207
208
  : fiberRuntime.makeSpanScoped(name, options)
208
209
  )
210
+ }
209
211
 
210
212
  /** @internal */
211
213
  export const setTracer = (tracer: Tracer.Tracer): Layer.Layer<never> =>
@@ -1113,7 +1113,7 @@ export const unwrapScoped = <A, E1, R1, E, R>(
1113
1113
  // -----------------------------------------------------------------------------
1114
1114
 
1115
1115
  /** @internal */
1116
- export const withSpan = dual<
1116
+ export const withSpan: {
1117
1117
  (
1118
1118
  name: string,
1119
1119
  options?: Tracer.SpanOptions & {
@@ -1121,7 +1121,7 @@ export const withSpan = dual<
1121
1121
  | ((span: Tracer.Span, exit: Exit.Exit<unknown, unknown>) => Effect.Effect<void>)
1122
1122
  | undefined
1123
1123
  }
1124
- ) => <A, E, R>(self: Layer.Layer<A, E, R>) => Layer.Layer<A, E, Exclude<R, Tracer.ParentSpan>>,
1124
+ ): <A, E, R>(self: Layer.Layer<A, E, R>) => Layer.Layer<A, E, Exclude<R, Tracer.ParentSpan>>
1125
1125
  <A, E, R>(
1126
1126
  self: Layer.Layer<A, E, R>,
1127
1127
  name: string,
@@ -1130,19 +1130,42 @@ export const withSpan = dual<
1130
1130
  | ((span: Tracer.Span, exit: Exit.Exit<unknown, unknown>) => Effect.Effect<void>)
1131
1131
  | undefined
1132
1132
  }
1133
- ) => Layer.Layer<A, E, Exclude<R, Tracer.ParentSpan>>
1134
- >((args) => isLayer(args[0]), (self, name, options) =>
1135
- unwrapScoped(
1136
- core.map(
1137
- options?.onEnd
1138
- ? core.tap(
1139
- fiberRuntime.makeSpanScoped(name, options),
1140
- (span) => fiberRuntime.addFinalizer((exit) => options.onEnd!(span, exit))
1141
- )
1142
- : fiberRuntime.makeSpanScoped(name, options),
1143
- (span) => withParentSpan(self, span)
1133
+ ): Layer.Layer<A, E, Exclude<R, Tracer.ParentSpan>>
1134
+ } = function() {
1135
+ const dataFirst = typeof arguments[0] !== "string"
1136
+ const name = dataFirst ? arguments[1] : arguments[0]
1137
+ const options = tracer.addSpanStackTrace(dataFirst ? arguments[2] : arguments[1]) as Tracer.SpanOptions & {
1138
+ readonly onEnd?:
1139
+ | ((span: Tracer.Span, exit: Exit.Exit<unknown, unknown>) => Effect.Effect<void>)
1140
+ | undefined
1141
+ }
1142
+ if (dataFirst) {
1143
+ const self = arguments[0]
1144
+ return unwrapScoped(
1145
+ core.map(
1146
+ options?.onEnd
1147
+ ? core.tap(
1148
+ fiberRuntime.makeSpanScoped(name, options),
1149
+ (span) => fiberRuntime.addFinalizer((exit) => options.onEnd!(span, exit))
1150
+ )
1151
+ : fiberRuntime.makeSpanScoped(name, options),
1152
+ (span) => withParentSpan(self, span)
1153
+ )
1144
1154
  )
1145
- ))
1155
+ }
1156
+ return (self: Layer.Layer<any, any, any>) =>
1157
+ unwrapScoped(
1158
+ core.map(
1159
+ options?.onEnd
1160
+ ? core.tap(
1161
+ fiberRuntime.makeSpanScoped(name, options),
1162
+ (span) => fiberRuntime.addFinalizer((exit) => options.onEnd!(span, exit))
1163
+ )
1164
+ : fiberRuntime.makeSpanScoped(name, options),
1165
+ (span) => withParentSpan(self, span)
1166
+ )
1167
+ )
1168
+ } as any
1146
1169
 
1147
1170
  /** @internal */
1148
1171
  export const withParentSpan = dual<
@@ -173,12 +173,16 @@ class FiberFailureImpl extends Error implements Runtime.FiberFailure {
173
173
  const prettyErrors = InternalCause.prettyErrors(cause)
174
174
  if (prettyErrors.length > 0) {
175
175
  const head = prettyErrors[0]
176
- this.name = head.message.split(":")[0]
177
- this.message = head.message.substring(this.name.length + 2)
178
- this.stack = InternalCause.pretty(cause)
176
+ this.name = head.name
177
+ this.message = head.message
178
+ this.stack = head.stack!
179
179
  }
180
180
 
181
181
  this.name = `(FiberFailure) ${this.name}`
182
+
183
+ if (this.message === undefined || this.message.length === 0) {
184
+ this.message = "An error has occurred"
185
+ }
182
186
  }
183
187
 
184
188
  toJSON(): unknown {
@@ -187,8 +191,9 @@ class FiberFailureImpl extends Error implements Runtime.FiberFailure {
187
191
  cause: this[FiberFailureCauseId].toJSON()
188
192
  }
189
193
  }
194
+
190
195
  toString(): string {
191
- return "(FiberFailure) " + InternalCause.pretty(this[FiberFailureCauseId])
196
+ return "(FiberFailure) " + (this.stack ?? this.message)
192
197
  }
193
198
  [Inspectable.NodeInspectSymbol](): unknown {
194
199
  return this.toString()
@@ -290,7 +295,7 @@ export const unsafeRunPromiseExit = <R>(runtime: Runtime.Runtime<R>) =>
290
295
  } else {
291
296
  options.signal.addEventListener("abort", () => {
292
297
  fiber.unsafeInterruptAsFork(fiber.id())
293
- })
298
+ }, { once: true })
294
299
  }
295
300
  }
296
301
  })
@@ -672,7 +672,7 @@ export const exponential = (
672
672
  ): Schedule.Schedule<Duration.Duration> => {
673
673
  const base = Duration.decode(baseInput)
674
674
  return delayedSchedule(
675
- map(forever, (i) => Duration.times(base, Math.min(Number.MAX_SAFE_INTEGER, Math.pow(factor, i))))
675
+ map(forever, (i) => Duration.times(base, Math.pow(factor, i)))
676
676
  )
677
677
  }
678
678
 
@@ -1060,7 +1060,7 @@ export const modifyDelayEffect = dual<
1060
1060
  const oldStart = Intervals.start(intervals)
1061
1061
  const newStart = now + Duration.toMillis(duration)
1062
1062
  const delta = newStart - oldStart
1063
- const newEnd = Math.min(Math.max(0, Intervals.end(intervals) + delta), Number.MAX_SAFE_INTEGER)
1063
+ const newEnd = Math.max(0, Intervals.end(intervals) + delta)
1064
1064
  const newInterval = Interval.make(newStart, newEnd)
1065
1065
  return [state, out, ScheduleDecision.continueWith(newInterval)] as const
1066
1066
  })
@@ -50,6 +50,7 @@ import * as SinkEndReason from "./stream/sinkEndReason.js"
50
50
  import * as ZipAllState from "./stream/zipAllState.js"
51
51
  import * as ZipChunksState from "./stream/zipChunksState.js"
52
52
  import * as InternalTake from "./take.js"
53
+ import * as InternalTracer from "./tracer.js"
53
54
 
54
55
  /** @internal */
55
56
  const StreamSymbolKey = "effect/Stream"
@@ -6541,16 +6542,30 @@ export const toQueueOfElements = dual<
6541
6542
  ))
6542
6543
 
6543
6544
  /** @internal */
6544
- export const toReadableStream = <A, E>(source: Stream.Stream<A, E>) => {
6545
- let pull: Effect.Effect<void>
6545
+ export const toReadableStream = <A, E>(self: Stream.Stream<A, E>) =>
6546
+ toReadableStreamRuntime(self, Runtime.defaultRuntime)
6547
+
6548
+ /** @internal */
6549
+ export const toReadableStreamEffect = <A, E, R>(self: Stream.Stream<A, E, R>) =>
6550
+ Effect.map(Effect.runtime<R>(), (runtime) => toReadableStreamRuntime(self, runtime))
6551
+
6552
+ /** @internal */
6553
+ export const toReadableStreamRuntime = dual<
6554
+ <XR>(runtime: Runtime.Runtime<XR>) => <A, E, R extends XR>(self: Stream.Stream<A, E, R>) => ReadableStream<A>,
6555
+ <A, E, XR, R extends XR>(self: Stream.Stream<A, E, R>, runtime: Runtime.Runtime<XR>) => ReadableStream<A>
6556
+ >(2, <A, E, XR, R extends XR>(self: Stream.Stream<A, E, R>, runtime: Runtime.Runtime<XR>): ReadableStream<A> => {
6557
+ const runSync = Runtime.runSync(runtime)
6558
+ const runPromise = Runtime.runPromise(runtime)
6559
+
6560
+ let pull: Effect.Effect<void, never, R>
6546
6561
  let scope: Scope.CloseableScope
6547
6562
  return new ReadableStream<A>({
6548
6563
  start(controller) {
6549
- scope = Effect.runSync(Scope.make())
6564
+ scope = runSync(Scope.make())
6550
6565
  pull = pipe(
6551
- toPull(source),
6552
- Scope.use(scope),
6553
- Effect.runSync,
6566
+ toPull(self),
6567
+ Scope.extend(scope),
6568
+ runSync,
6554
6569
  Effect.tap((chunk) =>
6555
6570
  Effect.sync(() => {
6556
6571
  Chunk.map(chunk, (a) => {
@@ -6573,13 +6588,13 @@ export const toReadableStream = <A, E>(source: Stream.Stream<A, E>) => {
6573
6588
  )
6574
6589
  },
6575
6590
  pull() {
6576
- return Effect.runPromise(pull)
6591
+ return runPromise(pull)
6577
6592
  },
6578
6593
  cancel() {
6579
- return Effect.runPromise(Scope.close(scope, Exit.void))
6594
+ return runPromise(Scope.close(scope, Exit.void))
6580
6595
  }
6581
6596
  })
6582
- }
6597
+ })
6583
6598
 
6584
6599
  /** @internal */
6585
6600
  export const transduce = dual<
@@ -6801,17 +6816,26 @@ export const whenEffect = dual<
6801
6816
  )
6802
6817
 
6803
6818
  /** @internal */
6804
- export const withSpan = dual<
6819
+ export const withSpan: {
6805
6820
  (
6806
6821
  name: string,
6807
6822
  options?: Tracer.SpanOptions
6808
- ) => <A, E, R>(self: Stream.Stream<A, E, R>) => Stream.Stream<A, E, Exclude<R, Tracer.ParentSpan>>,
6823
+ ): <A, E, R>(self: Stream.Stream<A, E, R>) => Stream.Stream<A, E, Exclude<R, Tracer.ParentSpan>>
6809
6824
  <A, E, R>(
6810
6825
  self: Stream.Stream<A, E, R>,
6811
6826
  name: string,
6812
6827
  options?: Tracer.SpanOptions
6813
- ) => Stream.Stream<A, E, Exclude<R, Tracer.ParentSpan>>
6814
- >(3, (self, name, options) => new StreamImpl(channel.withSpan(toChannel(self), name, options)))
6828
+ ): Stream.Stream<A, E, Exclude<R, Tracer.ParentSpan>>
6829
+ } = function() {
6830
+ const dataFirst = typeof arguments[0] !== "string"
6831
+ const name = dataFirst ? arguments[1] : arguments[0]
6832
+ const options = InternalTracer.addSpanStackTrace(dataFirst ? arguments[2] : arguments[1])
6833
+ if (dataFirst) {
6834
+ const self = arguments[0]
6835
+ return new StreamImpl(channel.withSpan(toChannel(self), name, options))
6836
+ }
6837
+ return (self: Stream.Stream<any, any, any>) => new StreamImpl(channel.withSpan(toChannel(self), name, options))
6838
+ } as any
6815
6839
 
6816
6840
  /** @internal */
6817
6841
  export const zip = dual<
@@ -106,3 +106,24 @@ export const externalSpan = (options: {
106
106
  sampled: options.sampled ?? true,
107
107
  context: options.context ?? Context.empty()
108
108
  })
109
+
110
+ /** @internal */
111
+ export const addSpanStackTrace = (options: Tracer.SpanOptions | undefined): Tracer.SpanOptions => {
112
+ if (options?.captureStackTrace === false) {
113
+ return options
114
+ } else if (options?.captureStackTrace !== undefined && typeof options.captureStackTrace !== "boolean") {
115
+ return options
116
+ }
117
+ const limit = Error.stackTraceLimit
118
+ Error.stackTraceLimit = 3
119
+ const traceError = new Error()
120
+ Error.stackTraceLimit = limit
121
+ if (traceError.stack === undefined) {
122
+ return { ...options, captureStackTrace: false }
123
+ }
124
+ const stack = traceError.stack.split("\n")
125
+ if (!stack[3]) {
126
+ return { ...options, captureStackTrace: false }
127
+ }
128
+ return { ...options, captureStackTrace: stack[3].trim() }
129
+ }
@@ -1,4 +1,4 @@
1
- let moduleVersion = "3.1.5"
1
+ let moduleVersion = "3.2.0"
2
2
 
3
3
  export const getCurrentVersion = () => moduleVersion
4
4