@effect/platform 0.64.0 → 0.65.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 (103) hide show
  1. package/FetchHttpClient/package.json +6 -0
  2. package/README.md +175 -611
  3. package/dist/cjs/Command.js +3 -3
  4. package/dist/cjs/Command.js.map +1 -1
  5. package/dist/cjs/FetchHttpClient.js +32 -0
  6. package/dist/cjs/FetchHttpClient.js.map +1 -0
  7. package/dist/cjs/HttpApiClient.js +1 -1
  8. package/dist/cjs/HttpApiClient.js.map +1 -1
  9. package/dist/cjs/HttpClient.js +5 -36
  10. package/dist/cjs/HttpClient.js.map +1 -1
  11. package/dist/cjs/HttpClientRequest.js +11 -11
  12. package/dist/cjs/HttpClientRequest.js.map +1 -1
  13. package/dist/cjs/HttpClientResponse.js +2 -61
  14. package/dist/cjs/HttpClientResponse.js.map +1 -1
  15. package/dist/cjs/HttpIncomingMessage.js +2 -29
  16. package/dist/cjs/HttpIncomingMessage.js.map +1 -1
  17. package/dist/cjs/Runtime.js +1 -1
  18. package/dist/cjs/Runtime.js.map +1 -1
  19. package/dist/cjs/Socket.js +42 -53
  20. package/dist/cjs/Socket.js.map +1 -1
  21. package/dist/cjs/index.js +3 -1
  22. package/dist/cjs/internal/command.js +2 -2
  23. package/dist/cjs/internal/command.js.map +1 -1
  24. package/dist/cjs/internal/fetchHttpClient.js +52 -0
  25. package/dist/cjs/internal/fetchHttpClient.js.map +1 -0
  26. package/dist/cjs/internal/httpClient.js +82 -71
  27. package/dist/cjs/internal/httpClient.js.map +1 -1
  28. package/dist/cjs/internal/httpClientRequest.js +13 -13
  29. package/dist/cjs/internal/httpClientRequest.js.map +1 -1
  30. package/dist/cjs/internal/httpClientResponse.js +1 -33
  31. package/dist/cjs/internal/httpClientResponse.js.map +1 -1
  32. package/dist/cjs/internal/worker.js +21 -29
  33. package/dist/cjs/internal/worker.js.map +1 -1
  34. package/dist/dts/Command.d.ts +4 -4
  35. package/dist/dts/Command.d.ts.map +1 -1
  36. package/dist/dts/FetchHttpClient.d.ts +27 -0
  37. package/dist/dts/FetchHttpClient.d.ts.map +1 -0
  38. package/dist/dts/HttpApiClient.d.ts +2 -2
  39. package/dist/dts/HttpClient.d.ts +53 -61
  40. package/dist/dts/HttpClient.d.ts.map +1 -1
  41. package/dist/dts/HttpClientRequest.d.ts +11 -11
  42. package/dist/dts/HttpClientRequest.d.ts.map +1 -1
  43. package/dist/dts/HttpClientResponse.d.ts +4 -90
  44. package/dist/dts/HttpClientResponse.d.ts.map +1 -1
  45. package/dist/dts/HttpIncomingMessage.d.ts +0 -16
  46. package/dist/dts/HttpIncomingMessage.d.ts.map +1 -1
  47. package/dist/dts/HttpServer.d.ts +1 -1
  48. package/dist/dts/Socket.d.ts +3 -3
  49. package/dist/dts/Socket.d.ts.map +1 -1
  50. package/dist/dts/index.d.ts +4 -0
  51. package/dist/dts/index.d.ts.map +1 -1
  52. package/dist/dts/internal/fetchHttpClient.d.ts +2 -0
  53. package/dist/dts/internal/fetchHttpClient.d.ts.map +1 -0
  54. package/dist/esm/Command.js +3 -3
  55. package/dist/esm/Command.js.map +1 -1
  56. package/dist/esm/FetchHttpClient.js +21 -0
  57. package/dist/esm/FetchHttpClient.js.map +1 -0
  58. package/dist/esm/HttpApiClient.js +1 -1
  59. package/dist/esm/HttpApiClient.js.map +1 -1
  60. package/dist/esm/HttpClient.js +4 -35
  61. package/dist/esm/HttpClient.js.map +1 -1
  62. package/dist/esm/HttpClientRequest.js +10 -10
  63. package/dist/esm/HttpClientRequest.js.map +1 -1
  64. package/dist/esm/HttpClientResponse.js +1 -63
  65. package/dist/esm/HttpClientResponse.js.map +1 -1
  66. package/dist/esm/HttpIncomingMessage.js +0 -24
  67. package/dist/esm/HttpIncomingMessage.js.map +1 -1
  68. package/dist/esm/Runtime.js +1 -1
  69. package/dist/esm/Runtime.js.map +1 -1
  70. package/dist/esm/Socket.js +42 -53
  71. package/dist/esm/Socket.js.map +1 -1
  72. package/dist/esm/index.js +4 -0
  73. package/dist/esm/index.js.map +1 -1
  74. package/dist/esm/internal/command.js +2 -2
  75. package/dist/esm/internal/command.js.map +1 -1
  76. package/dist/esm/internal/fetchHttpClient.js +44 -0
  77. package/dist/esm/internal/fetchHttpClient.js.map +1 -0
  78. package/dist/esm/internal/httpClient.js +79 -69
  79. package/dist/esm/internal/httpClient.js.map +1 -1
  80. package/dist/esm/internal/httpClientRequest.js +11 -11
  81. package/dist/esm/internal/httpClientRequest.js.map +1 -1
  82. package/dist/esm/internal/httpClientResponse.js +0 -24
  83. package/dist/esm/internal/httpClientResponse.js.map +1 -1
  84. package/dist/esm/internal/worker.js +21 -29
  85. package/dist/esm/internal/worker.js.map +1 -1
  86. package/package.json +11 -3
  87. package/src/Command.ts +7 -8
  88. package/src/FetchHttpClient.ts +25 -0
  89. package/src/HttpApiClient.ts +5 -5
  90. package/src/HttpClient.ts +79 -85
  91. package/src/HttpClientRequest.ts +21 -21
  92. package/src/HttpClientResponse.ts +4 -162
  93. package/src/HttpIncomingMessage.ts +0 -43
  94. package/src/HttpServer.ts +1 -1
  95. package/src/Runtime.ts +1 -1
  96. package/src/Socket.ts +42 -58
  97. package/src/index.ts +5 -0
  98. package/src/internal/command.ts +4 -3
  99. package/src/internal/fetchHttpClient.ts +53 -0
  100. package/src/internal/httpClient.ts +149 -125
  101. package/src/internal/httpClientRequest.ts +12 -12
  102. package/src/internal/httpClientResponse.ts +6 -96
  103. package/src/internal/worker.ts +40 -55
@@ -5,8 +5,8 @@ import * as Effect from "effect/Effect"
5
5
  import { dual } from "effect/Function"
6
6
  import * as Inspectable from "effect/Inspectable"
7
7
  import * as Option from "effect/Option"
8
- import type { Scope } from "effect/Scope"
9
8
  import * as Stream from "effect/Stream"
9
+ import type { Unify } from "effect/Unify"
10
10
  import * as Cookies from "../Cookies.js"
11
11
  import * as Headers from "../Headers.js"
12
12
  import * as Error from "../HttpClientError.js"
@@ -194,63 +194,10 @@ export const schemaNoBody = <
194
194
  })
195
195
  }
196
196
 
197
- /** @internal */
198
- export const arrayBuffer = <E, R>(effect: Effect.Effect<ClientResponse.HttpClientResponse, E, R>) =>
199
- Effect.scoped(Effect.flatMap(effect, (_) => _.arrayBuffer))
200
-
201
- /** @internal */
202
- export const text = <E, R>(effect: Effect.Effect<ClientResponse.HttpClientResponse, E, R>) =>
203
- Effect.scoped(Effect.flatMap(effect, (_) => _.text))
204
-
205
- /** @internal */
206
- export const json = <E, R>(effect: Effect.Effect<ClientResponse.HttpClientResponse, E, R>) =>
207
- Effect.scoped(Effect.flatMap(effect, (_) => _.json))
208
-
209
- /** @internal */
210
- export const urlParamsBody = <E, R>(effect: Effect.Effect<ClientResponse.HttpClientResponse, E, R>) =>
211
- Effect.scoped(Effect.flatMap(effect, (_) => _.urlParamsBody))
212
-
213
- /** @internal */
214
- export const formData = <E, R>(effect: Effect.Effect<ClientResponse.HttpClientResponse, E, R>) =>
215
- Effect.scoped(Effect.flatMap(effect, (_) => _.formData))
216
-
217
- /** @internal */
218
- export const void_ = <E, R>(effect: Effect.Effect<ClientResponse.HttpClientResponse, E, R>) =>
219
- Effect.scoped(Effect.asVoid(effect))
220
-
221
197
  /** @internal */
222
198
  export const stream = <E, R>(effect: Effect.Effect<ClientResponse.HttpClientResponse, E, R>) =>
223
199
  Stream.unwrapScoped(Effect.map(effect, (_) => _.stream))
224
200
 
225
- /** @internal */
226
- export const schemaJsonScoped = <
227
- R,
228
- I extends {
229
- readonly status?: number | undefined
230
- readonly headers?: Readonly<Record<string, string>> | undefined
231
- readonly body?: unknown | undefined
232
- },
233
- A
234
- >(schema: Schema.Schema<A, I, R>, options?: ParseOptions | undefined) => {
235
- const decode = schemaJson(schema, options)
236
- return <E, R2>(effect: Effect.Effect<ClientResponse.HttpClientResponse, E, R2>) =>
237
- Effect.scoped(Effect.flatMap(effect, decode))
238
- }
239
-
240
- /** @internal */
241
- export const schemaNoBodyScoped = <
242
- R,
243
- I extends {
244
- readonly status?: number | undefined
245
- readonly headers?: Readonly<Record<string, string>> | undefined
246
- },
247
- A
248
- >(schema: Schema.Schema<A, I, R>, options?: ParseOptions | undefined) => {
249
- const decode = schemaNoBody(schema, options)
250
- return <E, R2>(effect: Effect.Effect<ClientResponse.HttpClientResponse, E, R2>) =>
251
- Effect.scoped(Effect.flatMap(effect, decode))
252
- }
253
-
254
201
  /** @internal */
255
202
  export const matchStatus = dual<
256
203
  <
@@ -264,7 +211,7 @@ export const matchStatus = dual<
264
211
  }
265
212
  >(
266
213
  cases: Cases
267
- ) => (self: ClientResponse.HttpClientResponse) => Cases[keyof Cases] extends (_: any) => infer R ? R : never,
214
+ ) => (self: ClientResponse.HttpClientResponse) => Cases[keyof Cases] extends (_: any) => infer R ? Unify<R> : never,
268
215
  <
269
216
  const Cases extends {
270
217
  readonly [status: number]: (_: ClientResponse.HttpClientResponse) => any
@@ -274,7 +221,10 @@ export const matchStatus = dual<
274
221
  readonly "5xx"?: (_: ClientResponse.HttpClientResponse) => any
275
222
  readonly orElse: (_: ClientResponse.HttpClientResponse) => any
276
223
  }
277
- >(self: ClientResponse.HttpClientResponse, cases: Cases) => Cases[keyof Cases] extends (_: any) => infer R ? R : never
224
+ >(
225
+ self: ClientResponse.HttpClientResponse,
226
+ cases: Cases
227
+ ) => Cases[keyof Cases] extends (_: any) => infer R ? Unify<R> : never
278
228
  >(2, (self, cases) => {
279
229
  const status = self.status
280
230
  if (cases[status]) {
@@ -290,43 +240,3 @@ export const matchStatus = dual<
290
240
  }
291
241
  return cases.orElse(self)
292
242
  })
293
-
294
- /** @internal */
295
- export const matchStatusScoped = dual<
296
- <
297
- const Cases extends {
298
- readonly [status: number]: (_: ClientResponse.HttpClientResponse) => Effect.Effect<any, any, any>
299
- readonly "2xx"?: (_: ClientResponse.HttpClientResponse) => Effect.Effect<any, any, any>
300
- readonly "3xx"?: (_: ClientResponse.HttpClientResponse) => Effect.Effect<any, any, any>
301
- readonly "4xx"?: (_: ClientResponse.HttpClientResponse) => Effect.Effect<any, any, any>
302
- readonly "5xx"?: (_: ClientResponse.HttpClientResponse) => Effect.Effect<any, any, any>
303
- readonly orElse: (_: ClientResponse.HttpClientResponse) => Effect.Effect<any, any, any>
304
- }
305
- >(cases: Cases) => <E, R>(self: Effect.Effect<ClientResponse.HttpClientResponse, E, R>) => Effect.Effect<
306
- Cases[keyof Cases] extends (_: any) => Effect.Effect<infer _A, infer _E, infer _R> ? _A : never,
307
- E | (Cases[keyof Cases] extends (_: any) => Effect.Effect<infer _A, infer _E, infer _R> ? _E : never),
308
- Exclude<
309
- R | (Cases[keyof Cases] extends (_: any) => Effect.Effect<infer _A, infer _E, infer _R> ? _R : never),
310
- Scope
311
- >
312
- >,
313
- <
314
- E,
315
- R,
316
- const Cases extends {
317
- readonly [status: number]: (_: ClientResponse.HttpClientResponse) => Effect.Effect<any, any, any>
318
- readonly "2xx"?: (_: ClientResponse.HttpClientResponse) => Effect.Effect<any, any, any>
319
- readonly "3xx"?: (_: ClientResponse.HttpClientResponse) => Effect.Effect<any, any, any>
320
- readonly "4xx"?: (_: ClientResponse.HttpClientResponse) => Effect.Effect<any, any, any>
321
- readonly "5xx"?: (_: ClientResponse.HttpClientResponse) => Effect.Effect<any, any, any>
322
- readonly orElse: (_: ClientResponse.HttpClientResponse) => Effect.Effect<any, any, any>
323
- }
324
- >(self: Effect.Effect<ClientResponse.HttpClientResponse, E, R>, cases: Cases) => Effect.Effect<
325
- Cases[keyof Cases] extends (_: any) => Effect.Effect<infer _A, infer _E, infer _R> ? _A : never,
326
- E | (Cases[keyof Cases] extends (_: any) => Effect.Effect<infer _A, infer _E, infer _R> ? _E : never),
327
- Exclude<
328
- R | (Cases[keyof Cases] extends (_: any) => Effect.Effect<infer _A, infer _E, infer _R> ? _R : never),
329
- Scope
330
- >
331
- >
332
- >(2, (self, cases) => Effect.scoped(Effect.flatMap(self, matchStatus(cases) as any)))
@@ -1,8 +1,6 @@
1
1
  import * as Schema from "@effect/schema/Schema"
2
2
  import * as Serializable from "@effect/schema/Serializable"
3
- import * as Cause from "effect/Cause"
4
3
  import * as Channel from "effect/Channel"
5
- import * as Chunk from "effect/Chunk"
6
4
  import * as Context from "effect/Context"
7
5
  import * as Deferred from "effect/Deferred"
8
6
  import * as Effect from "effect/Effect"
@@ -11,9 +9,9 @@ import * as FiberRef from "effect/FiberRef"
11
9
  import * as FiberSet from "effect/FiberSet"
12
10
  import { identity, pipe } from "effect/Function"
13
11
  import * as Layer from "effect/Layer"
12
+ import * as Mailbox from "effect/Mailbox"
14
13
  import * as Option from "effect/Option"
15
14
  import * as Pool from "effect/Pool"
16
- import * as Queue from "effect/Queue"
17
15
  import * as Schedule from "effect/Schedule"
18
16
  import * as Scope from "effect/Scope"
19
17
  import * as Stream from "effect/Stream"
@@ -62,7 +60,7 @@ export const makeManager = Effect.gen(function*() {
62
60
  let requestIdCounter = 0
63
61
  const requestMap = new Map<
64
62
  number,
65
- Queue.Queue<Exit.Exit<ReadonlyArray<O>, E | WorkerError>> | Deferred.Deferred<O, E | WorkerError>
63
+ Mailbox.Mailbox<O, E | WorkerError> | Deferred.Deferred<O, E | WorkerError>
66
64
  >()
67
65
 
68
66
  const collector = Transferable.unsafeMakeCollector()
@@ -84,10 +82,10 @@ export const makeManager = Effect.gen(function*() {
84
82
  return handleMessage(message[1])
85
83
  }).pipe(
86
84
  Effect.onError((cause) =>
87
- Effect.forEach(requestMap.values(), (queue) =>
88
- Deferred.DeferredTypeId in queue
89
- ? Deferred.failCause(queue, cause)
90
- : Queue.offer(queue, Exit.failCause(cause)))
85
+ Effect.forEach(requestMap.values(), (mailbox) =>
86
+ Deferred.DeferredTypeId in mailbox
87
+ ? Deferred.failCause(mailbox, cause)
88
+ : mailbox.failCause(cause))
91
89
  ),
92
90
  Effect.retry(Schedule.spaced(1000)),
93
91
  Effect.annotateLogs({
@@ -100,10 +98,10 @@ export const makeManager = Effect.gen(function*() {
100
98
 
101
99
  yield* Effect.addFinalizer(() =>
102
100
  Effect.zipRight(
103
- Effect.forEach(requestMap.values(), (queue) =>
104
- Deferred.DeferredTypeId in queue
105
- ? Deferred.interrupt(queue)
106
- : Queue.offer(queue, Exit.failCause(Cause.empty)), {
101
+ Effect.forEach(requestMap.values(), (mailbox) =>
102
+ Deferred.DeferredTypeId in mailbox
103
+ ? Deferred.interrupt(mailbox)
104
+ : mailbox.end, {
107
105
  discard: true
108
106
  }),
109
107
  Effect.sync(() => requestMap.clear())
@@ -112,61 +110,58 @@ export const makeManager = Effect.gen(function*() {
112
110
 
113
111
  const handleMessage = (response: Worker.Worker.Response<E, O>) =>
114
112
  Effect.suspend(() => {
115
- const queue = requestMap.get(response[0])
116
- if (!queue) return Effect.void
113
+ const mailbox = requestMap.get(response[0])
114
+ if (!mailbox) return Effect.void
117
115
 
118
116
  switch (response[1]) {
119
117
  // data
120
118
  case 0: {
121
- return Deferred.DeferredTypeId in queue
122
- ? Deferred.succeed(queue, response[2][0])
123
- : Queue.offer(queue, Exit.succeed(response[2]))
119
+ return Deferred.DeferredTypeId in mailbox
120
+ ? Deferred.succeed(mailbox, response[2][0])
121
+ : mailbox.offerAll(response[2])
124
122
  }
125
123
  // end
126
124
  case 1: {
127
125
  if (response.length === 2) {
128
- return Deferred.DeferredTypeId in queue
129
- ? Deferred.interrupt(queue)
130
- : Queue.offer(queue, Exit.failCause(Cause.empty))
126
+ return Deferred.DeferredTypeId in mailbox
127
+ ? Deferred.interrupt(mailbox)
128
+ : mailbox.end
131
129
  }
132
- return Deferred.DeferredTypeId in queue
133
- ? Deferred.succeed(queue, response[2][0])
134
- : Effect.zipRight(
135
- Queue.offer(queue, Exit.succeed(response[2])),
136
- Queue.offer(queue, Exit.failCause(Cause.empty))
137
- )
130
+ return Deferred.DeferredTypeId in mailbox
131
+ ? Deferred.succeed(mailbox, response[2][0])
132
+ : Effect.zipRight(mailbox.offerAll(response[2]), mailbox.end)
138
133
  }
139
134
  // error / defect
140
135
  case 2:
141
136
  case 3: {
142
137
  if (response[1] === 2) {
143
- return Deferred.DeferredTypeId in queue
144
- ? Deferred.fail(queue, response[2])
145
- : Queue.offer(queue, Exit.fail(response[2]))
138
+ return Deferred.DeferredTypeId in mailbox
139
+ ? Deferred.fail(mailbox, response[2])
140
+ : mailbox.fail(response[2])
146
141
  }
147
142
  const cause = WorkerError.decodeCause(response[2])
148
- return Deferred.DeferredTypeId in queue
149
- ? Deferred.failCause(queue, cause)
150
- : Queue.offer(queue, Exit.failCause(cause))
143
+ return Deferred.DeferredTypeId in mailbox
144
+ ? Deferred.failCause(mailbox, cause)
145
+ : mailbox.failCause(cause)
151
146
  }
152
147
  }
153
148
  })
154
149
 
155
150
  const executeAcquire = <
156
- Q extends Queue.Queue<Exit.Exit<ReadonlyArray<O>, E | WorkerError>> | Deferred.Deferred<O, E | WorkerError>
157
- >(request: I, makeQueue: Effect.Effect<Q>) =>
151
+ Q extends Mailbox.Mailbox<O, E | WorkerError> | Deferred.Deferred<O, E | WorkerError>
152
+ >(request: I, makeMailbox: Effect.Effect<Q>) =>
158
153
  Effect.withFiberRuntime<{
159
154
  readonly id: number
160
- readonly queue: Q
155
+ readonly mailbox: Q
161
156
  }>((fiber) => {
162
157
  const context = fiber.getFiberRef(FiberRef.currentContext)
163
158
  const span = Context.getOption(context, Tracer.ParentSpan).pipe(
164
159
  Option.filter((span): span is Tracer.Span => span._tag === "Span")
165
160
  )
166
161
  const id = requestIdCounter++
167
- return makeQueue.pipe(
168
- Effect.tap((queue) => {
169
- requestMap.set(id, queue)
162
+ return makeMailbox.pipe(
163
+ Effect.tap((mailbox) => {
164
+ requestMap.set(id, mailbox)
170
165
  return wrappedEncode(request).pipe(
171
166
  Effect.tap((payload) =>
172
167
  backing.send([
@@ -177,13 +172,13 @@ export const makeManager = Effect.gen(function*() {
177
172
  ], collector.unsafeRead())
178
173
  ),
179
174
  Effect.catchAllCause((cause) =>
180
- Deferred.DeferredTypeId in queue ?
181
- Deferred.failCause(queue, cause) :
182
- Queue.offer(queue, Exit.failCause(cause))
175
+ Mailbox.isMailbox<O, E | WorkerError>(mailbox)
176
+ ? mailbox.failCause(cause)
177
+ : Deferred.failCause(mailbox, cause)
183
178
  )
184
179
  )
185
180
  }),
186
- Effect.map((queue) => ({ id, queue }))
181
+ Effect.map((mailbox) => ({ id, mailbox }))
187
182
  )
188
183
  })
189
184
 
@@ -197,18 +192,8 @@ export const makeManager = Effect.gen(function*() {
197
192
  const execute = (request: I) =>
198
193
  Stream.fromChannel(
199
194
  Channel.acquireUseRelease(
200
- executeAcquire(request, Queue.unbounded<Exit.Exit<ReadonlyArray<O>, E | WorkerError>>()),
201
- ({ queue }) => {
202
- const loop: Channel.Channel<Chunk.Chunk<O>, unknown, E | WorkerError, unknown, void, unknown> = Channel
203
- .flatMap(
204
- Queue.take(queue),
205
- Exit.match({
206
- onFailure: (cause) => Cause.isEmpty(cause) ? Channel.void : Channel.failCause(cause),
207
- onSuccess: (value) => Channel.flatMap(Channel.write(Chunk.unsafeFromArray(value)), () => loop)
208
- })
209
- )
210
- return loop
211
- },
195
+ executeAcquire(request, Mailbox.make<O, E | WorkerError>()),
196
+ ({ mailbox }) => Mailbox.toChannel(mailbox),
212
197
  executeRelease
213
198
  )
214
199
  )
@@ -216,7 +201,7 @@ export const makeManager = Effect.gen(function*() {
216
201
  const executeEffect = (request: I) =>
217
202
  Effect.acquireUseRelease(
218
203
  executeAcquire(request, Deferred.make<O, WorkerError | E>()),
219
- ({ queue }) => Deferred.await(queue),
204
+ ({ mailbox }) => Deferred.await(mailbox),
220
205
  executeRelease
221
206
  )
222
207