@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.
- package/dist/cjs/Http/Headers.js +19 -4
- package/dist/cjs/Http/Headers.js.map +1 -1
- package/dist/cjs/Http/Platform.js.map +1 -1
- package/dist/cjs/Http/UrlParams.js +13 -15
- package/dist/cjs/Http/UrlParams.js.map +1 -1
- package/dist/cjs/WorkerRunner.js.map +1 -1
- package/dist/cjs/internal/http/middleware.js +2 -1
- package/dist/cjs/internal/http/middleware.js.map +1 -1
- package/dist/cjs/internal/http/platform.js +5 -7
- package/dist/cjs/internal/http/platform.js.map +1 -1
- package/dist/cjs/internal/workerRunner.js +16 -4
- package/dist/cjs/internal/workerRunner.js.map +1 -1
- package/dist/dts/Http/Headers.d.ts +29 -3
- package/dist/dts/Http/Headers.d.ts.map +1 -1
- package/dist/dts/Http/Platform.d.ts +3 -2
- package/dist/dts/Http/Platform.d.ts.map +1 -1
- package/dist/dts/Http/UrlParams.d.ts +2 -3
- package/dist/dts/Http/UrlParams.d.ts.map +1 -1
- package/dist/dts/WorkerRunner.d.ts +26 -10
- package/dist/dts/WorkerRunner.d.ts.map +1 -1
- package/dist/esm/Http/Headers.js +19 -4
- package/dist/esm/Http/Headers.js.map +1 -1
- package/dist/esm/Http/Platform.js.map +1 -1
- package/dist/esm/Http/UrlParams.js +13 -15
- package/dist/esm/Http/UrlParams.js.map +1 -1
- package/dist/esm/WorkerRunner.js.map +1 -1
- package/dist/esm/internal/http/middleware.js +2 -1
- package/dist/esm/internal/http/middleware.js.map +1 -1
- package/dist/esm/internal/http/platform.js +5 -7
- package/dist/esm/internal/http/platform.js.map +1 -1
- package/dist/esm/internal/workerRunner.js +16 -4
- package/dist/esm/internal/workerRunner.js.map +1 -1
- package/package.json +1 -1
- package/src/Http/Headers.ts +40 -6
- package/src/Http/Platform.ts +3 -2
- package/src/Http/UrlParams.ts +17 -19
- package/src/WorkerRunner.ts +43 -25
- package/src/internal/http/middleware.ts +2 -1
- package/src/internal/http/platform.ts +12 -12
- package/src/internal/workerRunner.ts +45 -40
package/src/Http/UrlParams.ts
CHANGED
|
@@ -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
|
|
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 =
|
|
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 (
|
|
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
|
|
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 =
|
|
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
|
-
|
|
51
|
-
|
|
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 =
|
|
68
|
-
return
|
|
69
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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) =>
|
|
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(
|
|
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
|
-
|
|
130
|
+
ReadonlyArray.forEach(params, ([key, value]) => {
|
|
133
131
|
if (value !== undefined) {
|
|
134
132
|
urlInstance.searchParams.append(key, value)
|
|
135
133
|
}
|
package/src/WorkerRunner.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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
|
|
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
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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
|
-
|
|
|
152
|
+
| WorkerRunner.SerializedRunner.HandlersContext<Handlers>,
|
|
158
153
|
WorkerError.WorkerError,
|
|
159
154
|
void
|
|
160
|
-
> =>
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
)
|
|
177
|
-
},
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
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
|
-
|
|
|
207
|
+
| WorkerRunner.SerializedRunner.HandlersContext<Handlers>,
|
|
203
208
|
WorkerError.WorkerError,
|
|
204
209
|
never
|
|
205
210
|
> => Layer.scopedDiscard(makeSerialized(schema, handlers))
|