@effect/platform 0.37.4 → 0.37.6

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 (40) hide show
  1. package/dist/cjs/Http/Headers.js +19 -4
  2. package/dist/cjs/Http/Headers.js.map +1 -1
  3. package/dist/cjs/Http/Platform.js.map +1 -1
  4. package/dist/cjs/Http/UrlParams.js +13 -15
  5. package/dist/cjs/Http/UrlParams.js.map +1 -1
  6. package/dist/cjs/WorkerRunner.js.map +1 -1
  7. package/dist/cjs/internal/http/middleware.js +2 -1
  8. package/dist/cjs/internal/http/middleware.js.map +1 -1
  9. package/dist/cjs/internal/http/platform.js +5 -7
  10. package/dist/cjs/internal/http/platform.js.map +1 -1
  11. package/dist/cjs/internal/workerRunner.js +16 -4
  12. package/dist/cjs/internal/workerRunner.js.map +1 -1
  13. package/dist/dts/Http/Headers.d.ts +29 -3
  14. package/dist/dts/Http/Headers.d.ts.map +1 -1
  15. package/dist/dts/Http/Platform.d.ts +3 -2
  16. package/dist/dts/Http/Platform.d.ts.map +1 -1
  17. package/dist/dts/Http/UrlParams.d.ts +2 -3
  18. package/dist/dts/Http/UrlParams.d.ts.map +1 -1
  19. package/dist/dts/WorkerRunner.d.ts +26 -10
  20. package/dist/dts/WorkerRunner.d.ts.map +1 -1
  21. package/dist/esm/Http/Headers.js +19 -4
  22. package/dist/esm/Http/Headers.js.map +1 -1
  23. package/dist/esm/Http/Platform.js.map +1 -1
  24. package/dist/esm/Http/UrlParams.js +13 -15
  25. package/dist/esm/Http/UrlParams.js.map +1 -1
  26. package/dist/esm/WorkerRunner.js.map +1 -1
  27. package/dist/esm/internal/http/middleware.js +2 -1
  28. package/dist/esm/internal/http/middleware.js.map +1 -1
  29. package/dist/esm/internal/http/platform.js +5 -7
  30. package/dist/esm/internal/http/platform.js.map +1 -1
  31. package/dist/esm/internal/workerRunner.js +16 -4
  32. package/dist/esm/internal/workerRunner.js.map +1 -1
  33. package/package.json +1 -1
  34. package/src/Http/Headers.ts +40 -6
  35. package/src/Http/Platform.ts +3 -2
  36. package/src/Http/UrlParams.ts +17 -19
  37. package/src/WorkerRunner.ts +43 -25
  38. package/src/internal/http/middleware.ts +2 -1
  39. package/src/internal/http/platform.ts +12 -12
  40. package/src/internal/workerRunner.ts +45 -40
@@ -1,40 +1,38 @@
1
1
  /**
2
2
  * @since 1.0.0
3
3
  */
4
- import * as Chunk from "effect/Chunk"
5
4
  import * as Effect from "effect/Effect"
6
5
  import { dual } from "effect/Function"
6
+ import * as ReadonlyArray from "effect/ReadonlyArray"
7
7
 
8
8
  /**
9
9
  * @since 1.0.0
10
10
  * @category models
11
11
  */
12
- export interface UrlParams extends Chunk.Chunk<[string, string]> {}
12
+ export interface UrlParams extends ReadonlyArray<readonly [string, string]> {}
13
13
 
14
14
  /**
15
15
  * @since 1.0.0
16
16
  * @category models
17
17
  */
18
- export type Input = UrlParams | Readonly<Record<string, string>> | Iterable<readonly [string, string]> | URLSearchParams
18
+ export type Input = Readonly<Record<string, string>> | Iterable<readonly [string, string]> | URLSearchParams
19
19
 
20
20
  /**
21
21
  * @since 1.0.0
22
22
  * @category constructors
23
23
  */
24
24
  export const fromInput = (input: Input): UrlParams => {
25
- if (Chunk.isChunk(input)) {
26
- return input
27
- } else if (Symbol.iterator in input) {
28
- return Chunk.fromIterable(input) as UrlParams
25
+ if (Symbol.iterator in input) {
26
+ return ReadonlyArray.fromIterable(input)
29
27
  }
30
- return Chunk.fromIterable(Object.entries(input))
28
+ return ReadonlyArray.fromIterable(Object.entries(input))
31
29
  }
32
30
 
33
31
  /**
34
32
  * @since 1.0.0
35
33
  * @category constructors
36
34
  */
37
- export const empty: UrlParams = Chunk.empty()
35
+ export const empty: UrlParams = []
38
36
 
39
37
  /**
40
38
  * @since 1.0.0
@@ -47,8 +45,8 @@ export const set: {
47
45
  (key: string, value: string) => (self: UrlParams) => UrlParams,
48
46
  (self: UrlParams, key: string, value: string) => UrlParams
49
47
  >(3, (self, key, value) =>
50
- Chunk.append(
51
- Chunk.filter(self, ([k]) => k !== key),
48
+ ReadonlyArray.append(
49
+ ReadonlyArray.filter(self, ([k]) => k !== key),
52
50
  [key, value]
53
51
  ))
54
52
 
@@ -64,9 +62,9 @@ export const setAll: {
64
62
  (self: UrlParams, input: Input) => UrlParams
65
63
  >(2, (self, input) => {
66
64
  const toSet = fromInput(input)
67
- const keys = Chunk.toReadonlyArray(toSet).map(([k]) => k)
68
- return Chunk.appendAll(
69
- Chunk.filter(self, ([k]) => keys.includes(k)),
65
+ const keys = toSet.map(([k]) => k)
66
+ return ReadonlyArray.appendAll(
67
+ ReadonlyArray.filter(self, ([k]) => keys.includes(k)),
70
68
  toSet
71
69
  )
72
70
  })
@@ -82,7 +80,7 @@ export const append: {
82
80
  (key: string, value: string) => (self: UrlParams) => UrlParams,
83
81
  (self: UrlParams, key: string, value: string) => UrlParams
84
82
  >(3, (self, key, value) =>
85
- Chunk.append(
83
+ ReadonlyArray.append(
86
84
  self,
87
85
  [key, value]
88
86
  ))
@@ -98,7 +96,7 @@ export const appendAll: {
98
96
  (input: Input) => (self: UrlParams) => UrlParams,
99
97
  (self: UrlParams, input: Input) => UrlParams
100
98
  >(2, (self, input) =>
101
- Chunk.appendAll(
99
+ ReadonlyArray.appendAll(
102
100
  self,
103
101
  fromInput(input)
104
102
  ))
@@ -113,13 +111,13 @@ export const remove: {
113
111
  } = dual<
114
112
  (key: string) => (self: UrlParams) => UrlParams,
115
113
  (self: UrlParams, key: string) => UrlParams
116
- >(2, (self, key) => Chunk.filter(self, ([k]) => k !== key))
114
+ >(2, (self, key) => ReadonlyArray.filter(self, ([k]) => k !== key))
117
115
 
118
116
  /**
119
117
  * @since 1.0.0
120
118
  * @category combinators
121
119
  */
122
- export const toString = (self: UrlParams): string => new URLSearchParams(Chunk.toReadonlyArray(self) as any).toString()
120
+ export const toString = (self: UrlParams): string => new URLSearchParams(self as any).toString()
123
121
 
124
122
  /**
125
123
  * @since 1.0.0
@@ -129,7 +127,7 @@ export const makeUrl = <E>(url: string, params: UrlParams, onError: (e: unknown)
129
127
  Effect.try({
130
128
  try: () => {
131
129
  const urlInstance = new URL(url, baseUrl())
132
- Chunk.forEach(params, ([key, value]) => {
130
+ ReadonlyArray.forEach(params, ([key, value]) => {
133
131
  if (value !== undefined) {
134
132
  urlInstance.searchParams.append(key, value)
135
133
  }
@@ -95,6 +95,43 @@ export const layer: <I, R, E, O>(
95
95
  options?: Runner.Options<I, E, O> | undefined
96
96
  ) => Layer.Layer<R | PlatformRunner, WorkerError, never> = internal.layer
97
97
 
98
+ /**
99
+ * @since 1.0.0
100
+ * @category models
101
+ */
102
+ export declare namespace SerializedRunner {
103
+ /**
104
+ * @since 1.0.0
105
+ */
106
+ export type Handlers<A extends Schema.TaggedRequest.Any> = {
107
+ readonly [K in A["_tag"]]: Extract<A, { readonly _tag: K }> extends
108
+ Serializable.SerializableWithResult<infer _IS, infer S, infer _IE, infer E, infer _IO, infer O> ? (
109
+ _: S
110
+ ) =>
111
+ | Stream.Stream<any, E, O>
112
+ | Effect.Effect<any, E, O>
113
+ | Layer.Layer<any, E, any>
114
+ | Layer.Layer<any, E, never>
115
+ : never
116
+ }
117
+
118
+ /**
119
+ * @since 1.0.0
120
+ */
121
+ export type HandlersContext<Handlers extends Record<string, (...args: ReadonlyArray<any>) => any>> =
122
+ | Exclude<
123
+ {
124
+ [K in keyof Handlers]: ReturnType<Handlers[K]> extends Stream.Stream<infer R, infer _E, infer _A> ? R : never
125
+ }[keyof Handlers],
126
+ {
127
+ [K in keyof Handlers]: ReturnType<Handlers[K]> extends Layer.Layer<infer _R, infer _E, infer A> ? A : never
128
+ }[keyof Handlers]
129
+ >
130
+ | {
131
+ [K in keyof Handlers]: ReturnType<Handlers[K]> extends Layer.Layer<infer R, infer _E, infer _A> ? R : never
132
+ }[keyof Handlers]
133
+ }
134
+
98
135
  /**
99
136
  * @since 1.0.0
100
137
  * @category constructors
@@ -102,22 +139,12 @@ export const layer: <I, R, E, O>(
102
139
  export const makeSerialized: <
103
140
  I,
104
141
  A extends Schema.TaggedRequest.Any,
105
- const Handlers extends {
106
- readonly [K in A["_tag"]]: Extract<A, { readonly _tag: K }> extends
107
- Serializable.SerializableWithResult<infer _IS, infer S, infer _IE, infer E, infer _IO, infer O>
108
- ? (_: S) => Stream.Stream<any, E, O> | Effect.Effect<any, E, O> :
109
- never
110
- }
142
+ const Handlers extends SerializedRunner.Handlers<A>
111
143
  >(
112
144
  schema: Schema.Schema<I, A>,
113
145
  handlers: Handlers
114
- ) => Effect.Effect<
115
- | PlatformRunner
116
- | Scope.Scope
117
- | (ReturnType<Handlers[keyof Handlers]> extends Stream.Stream<infer R, infer _E, infer _A> ? R : never),
118
- WorkerError,
119
- void
120
- > = internal.makeSerialized
146
+ ) => Effect.Effect<PlatformRunner | Scope.Scope | SerializedRunner.HandlersContext<Handlers>, WorkerError, void> =
147
+ internal.makeSerialized
121
148
 
122
149
  /**
123
150
  * @since 1.0.0
@@ -126,18 +153,9 @@ export const makeSerialized: <
126
153
  export const layerSerialized: <
127
154
  I,
128
155
  A extends Schema.TaggedRequest.Any,
129
- const Handlers extends {
130
- readonly [K in A["_tag"]]: Extract<A, { readonly _tag: K }> extends
131
- Serializable.SerializableWithResult<infer _IS, infer S, infer _IE, infer E, infer _IO, infer O>
132
- ? (_: S) => Stream.Stream<any, E, O> | Effect.Effect<any, E, O> :
133
- never
134
- }
156
+ const Handlers extends SerializedRunner.Handlers<A>
135
157
  >(
136
158
  schema: Schema.Schema<I, A>,
137
159
  handlers: Handlers
138
- ) => Layer.Layer<
139
- | PlatformRunner
140
- | (ReturnType<Handlers[keyof Handlers]> extends Stream.Stream<infer R, infer _E, infer _A> ? R : never),
141
- WorkerError,
142
- never
143
- > = internal.layerSerialized
160
+ ) => Layer.Layer<PlatformRunner | SerializedRunner.HandlersContext<Handlers>, WorkerError, never> =
161
+ internal.layerSerialized
@@ -1,3 +1,4 @@
1
+ import * as Cause from "effect/Cause"
1
2
  import * as Effect from "effect/Effect"
2
3
  import * as FiberRef from "effect/FiberRef"
3
4
  import * as Function from "effect/Function"
@@ -59,7 +60,7 @@ export const logger = make((httpApp) => {
59
60
  Effect.annotateLogs(Effect.log(exit.cause), {
60
61
  "http.method": request.method,
61
62
  "http.url": request.url,
62
- "http.status": 500
63
+ "http.status": Cause.isInterruptedOnly(exit.cause) ? 499 : 500
63
64
  }) :
64
65
  Effect.annotateLogs(Effect.log(""), {
65
66
  "http.method": request.method,
@@ -4,6 +4,7 @@ import { pipe } from "effect/Function"
4
4
  import * as FileSystem from "../../FileSystem.js"
5
5
  import type * as Body from "../../Http/Body.js"
6
6
  import * as Etag from "../../Http/Etag.js"
7
+ import * as Headers from "../../Http/Headers.js"
7
8
  import type * as Platform from "../../Http/Platform.js"
8
9
  import type * as ServerResponse from "../../Http/ServerResponse.js"
9
10
 
@@ -19,7 +20,7 @@ export const make = (impl: {
19
20
  path: string,
20
21
  status: number,
21
22
  statusText: string | undefined,
22
- headers: Record<string, string>,
23
+ headers: Headers.Headers,
23
24
  start: number,
24
25
  end: number | undefined,
25
26
  contentLength: number
@@ -28,7 +29,7 @@ export const make = (impl: {
28
29
  file: Body.Body.FileLike,
29
30
  status: number,
30
31
  statusText: string | undefined,
31
- headers: Record<string, string>,
32
+ headers: Headers.Headers,
32
33
  options?: FileSystem.StreamOptions
33
34
  ) => ServerResponse.ServerResponse
34
35
  }): Effect.Effect<FileSystem.FileSystem | Etag.Generator, never, Platform.Platform> =>
@@ -45,12 +46,9 @@ export const make = (impl: {
45
46
  Effect.map(({ etag, info }) => {
46
47
  const start = Number(options?.offset ?? 0)
47
48
  const end = options?.bytesToRead !== undefined ? start + Number(options.bytesToRead) : undefined
48
- const headers: Record<string, string> = {
49
- ...(options?.headers ?? {}),
50
- etag: Etag.toString(etag)
51
- }
49
+ const headers = Headers.set(options?.headers ?? Headers.empty, "etag", Etag.toString(etag))
52
50
  if (info.mtime._tag === "Some") {
53
- headers["last-modified"] = info.mtime.value.toUTCString()
51
+ ;(headers as any)["last-modified"] = info.mtime.value.toUTCString()
54
52
  }
55
53
  const contentLength = end !== undefined ? end - start : Number(info.size) - start
56
54
  return impl.fileResponse(
@@ -67,11 +65,13 @@ export const make = (impl: {
67
65
  },
68
66
  fileWebResponse(file, options) {
69
67
  return Effect.map(etagGen.fromFileWeb(file), (etag) => {
70
- const headers: Record<string, string> = {
71
- ...(options?.headers ?? {}),
72
- etag: Etag.toString(etag),
73
- "last-modified": new Date(file.lastModified).toUTCString()
74
- }
68
+ const headers = Headers.merge(
69
+ options?.headers ?? Headers.empty,
70
+ Headers.unsafeFromRecord({
71
+ etag: Etag.toString(etag),
72
+ "last-modified": new Date(file.lastModified).toUTCString()
73
+ })
74
+ )
75
75
  return impl.fileWebResponse(
76
76
  file,
77
77
  options?.status ?? 200,
@@ -142,64 +142,69 @@ export const layer = <I, R, E, O>(
142
142
  export const makeSerialized = <
143
143
  I,
144
144
  A extends Schema.TaggedRequest.Any,
145
- const Handlers extends {
146
- readonly [K in A["_tag"]]: Extract<A, { readonly _tag: K }> extends
147
- Serializable.SerializableWithResult<infer _IS, infer S, infer _IE, infer E, infer _IO, infer O>
148
- ? (_: S) => Stream.Stream<any, E, O> | Effect.Effect<any, E, O> :
149
- never
150
- }
145
+ const Handlers extends WorkerRunner.SerializedRunner.Handlers<A>
151
146
  >(
152
147
  schema: Schema.Schema<I, A>,
153
148
  handlers: Handlers
154
149
  ): Effect.Effect<
155
150
  | WorkerRunner.PlatformRunner
156
151
  | Scope.Scope
157
- | (ReturnType<Handlers[keyof Handlers]> extends Stream.Stream<infer R, infer _E, infer _A> ? R : never),
152
+ | WorkerRunner.SerializedRunner.HandlersContext<Handlers>,
158
153
  WorkerError.WorkerError,
159
154
  void
160
- > => {
161
- const parseRequest = Schema.parse(schema)
162
- return make((request: A) => (handlers as any)[request._tag](request), {
163
- transfers(message) {
164
- return Transferable.get(message)
165
- },
166
- decode(message) {
167
- return Effect.mapError(
168
- parseRequest(message),
169
- (error) => WorkerError.WorkerError("decode", error)
170
- )
171
- },
172
- encodeError(request, message) {
173
- return Effect.mapError(
174
- Serializable.serializeFailure(request as any, message),
175
- (error) => WorkerError.WorkerError("encode", error)
176
- )
177
- },
178
- encodeOutput(request, message) {
179
- return Effect.mapError(
180
- Serializable.serializeSuccess(request as any, message),
181
- (error) => WorkerError.WorkerError("encode", error)
182
- )
183
- }
184
- })
185
- }
155
+ > =>
156
+ Effect.gen(function*(_) {
157
+ const scope = yield* _(Effect.scope)
158
+ let context = Context.empty() as Context.Context<any>
159
+ const parseRequest = Schema.parse(schema)
160
+
161
+ return yield* _(make((request: A) => {
162
+ const result = (handlers as any)[request._tag](request)
163
+ if (Layer.isLayer(result)) {
164
+ return Effect.flatMap(Layer.buildWithScope(result, scope), (_) =>
165
+ Effect.sync(() => {
166
+ context = Context.merge(context, _)
167
+ }))
168
+ } else if (Effect.isEffect(result)) {
169
+ return Effect.provide(result, context)
170
+ }
171
+ return Stream.provideContext(result as any, context)
172
+ }, {
173
+ transfers(message) {
174
+ return Transferable.get(message)
175
+ },
176
+ decode(message) {
177
+ return Effect.mapError(
178
+ parseRequest(message),
179
+ (error) => WorkerError.WorkerError("decode", error)
180
+ )
181
+ },
182
+ encodeError(request, message) {
183
+ return Effect.mapError(
184
+ Serializable.serializeFailure(request as any, message),
185
+ (error) => WorkerError.WorkerError("encode", error)
186
+ )
187
+ },
188
+ encodeOutput(request, message) {
189
+ return Effect.mapError(
190
+ Serializable.serializeSuccess(request as any, message),
191
+ (error) => WorkerError.WorkerError("encode", error)
192
+ )
193
+ }
194
+ }))
195
+ }) as any
186
196
 
187
197
  /** @internal */
188
198
  export const layerSerialized = <
189
199
  I,
190
200
  A extends Schema.TaggedRequest.Any,
191
- const Handlers extends {
192
- readonly [K in A["_tag"]]: Extract<A, { readonly _tag: K }> extends
193
- Serializable.SerializableWithResult<infer _IS, infer S, infer _IE, infer E, infer _IO, infer O>
194
- ? (_: S) => Stream.Stream<any, E, O> | Effect.Effect<any, E, O> :
195
- never
196
- }
201
+ const Handlers extends WorkerRunner.SerializedRunner.Handlers<A>
197
202
  >(
198
203
  schema: Schema.Schema<I, A>,
199
204
  handlers: Handlers
200
205
  ): Layer.Layer<
201
206
  | WorkerRunner.PlatformRunner
202
- | (ReturnType<Handlers[keyof Handlers]> extends Stream.Stream<infer R, infer _E, infer _A> ? R : never),
207
+ | WorkerRunner.SerializedRunner.HandlersContext<Handlers>,
203
208
  WorkerError.WorkerError,
204
209
  never
205
210
  > => Layer.scopedDiscard(makeSerialized(schema, handlers))