effect 4.0.0-beta.92 → 4.0.0-beta.93
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/Cause.d.ts +3 -1
- package/dist/Cause.d.ts.map +1 -1
- package/dist/Cause.js.map +1 -1
- package/dist/Schema.d.ts.map +1 -1
- package/dist/Schema.js +3 -0
- package/dist/Schema.js.map +1 -1
- package/dist/internal/core.js +1 -1
- package/dist/internal/effect.js +8 -6
- package/dist/internal/effect.js.map +1 -1
- package/dist/unstable/http/HttpBody.d.ts +1 -1
- package/dist/unstable/http/HttpBody.d.ts.map +1 -1
- package/dist/unstable/http/HttpBody.js +1 -1
- package/dist/unstable/http/HttpBody.js.map +1 -1
- package/dist/unstable/http/HttpClient.js +2 -2
- package/dist/unstable/http/HttpClient.js.map +1 -1
- package/dist/unstable/http/HttpClientRequest.d.ts +5 -4
- package/dist/unstable/http/HttpClientRequest.d.ts.map +1 -1
- package/dist/unstable/http/HttpClientRequest.js +5 -4
- package/dist/unstable/http/HttpClientRequest.js.map +1 -1
- package/dist/unstable/http/Url.d.ts +29 -4
- package/dist/unstable/http/Url.d.ts.map +1 -1
- package/dist/unstable/http/Url.js +44 -2
- package/dist/unstable/http/Url.js.map +1 -1
- package/dist/unstable/http/UrlParams.d.ts +2 -28
- package/dist/unstable/http/UrlParams.d.ts.map +1 -1
- package/dist/unstable/http/UrlParams.js +4 -46
- package/dist/unstable/http/UrlParams.js.map +1 -1
- package/dist/unstable/httpapi/HttpApiBuilder.d.ts.map +1 -1
- package/dist/unstable/httpapi/HttpApiBuilder.js +30 -15
- package/dist/unstable/httpapi/HttpApiBuilder.js.map +1 -1
- package/dist/unstable/observability/OtlpTracer.d.ts.map +1 -1
- package/dist/unstable/observability/OtlpTracer.js +4 -3
- package/dist/unstable/observability/OtlpTracer.js.map +1 -1
- package/package.json +1 -1
- package/src/Cause.ts +3 -1
- package/src/Schema.ts +3 -0
- package/src/internal/core.ts +1 -1
- package/src/internal/effect.ts +14 -6
- package/src/unstable/http/HttpBody.ts +2 -2
- package/src/unstable/http/HttpClient.ts +2 -2
- package/src/unstable/http/HttpClientRequest.ts +8 -7
- package/src/unstable/http/Url.ts +62 -7
- package/src/unstable/http/UrlParams.ts +5 -58
- package/src/unstable/httpapi/HttpApiBuilder.ts +33 -21
- package/src/unstable/observability/OtlpTracer.ts +4 -3
|
@@ -15,7 +15,6 @@ import * as Config from "../../Config.js";
|
|
|
15
15
|
import * as Duration from "../../Duration.js";
|
|
16
16
|
import * as Effect from "../../Effect.js";
|
|
17
17
|
import { flow } from "../../Function.js";
|
|
18
|
-
import { renderPrettyError } from "../../internal/effect.js";
|
|
19
18
|
import * as Layer from "../../Layer.js";
|
|
20
19
|
import * as Option from "../../Option.js";
|
|
21
20
|
import * as Tracer from "../../Tracer.js";
|
|
@@ -204,7 +203,9 @@ const makeOtlpSpan = self => {
|
|
|
204
203
|
}
|
|
205
204
|
});
|
|
206
205
|
} else {
|
|
207
|
-
const errors = Cause.prettyErrors(status.exit.cause
|
|
206
|
+
const errors = Cause.prettyErrors(status.exit.cause, {
|
|
207
|
+
includeCauseInStack: true
|
|
208
|
+
});
|
|
208
209
|
otelStatus = {
|
|
209
210
|
code: StatusCode.Error
|
|
210
211
|
};
|
|
@@ -228,7 +229,7 @@ const makeOtlpSpan = self => {
|
|
|
228
229
|
}, {
|
|
229
230
|
"key": "exception.stacktrace",
|
|
230
231
|
"value": {
|
|
231
|
-
"stringValue":
|
|
232
|
+
"stringValue": error.stack ?? "No stack trace available"
|
|
232
233
|
}
|
|
233
234
|
}]
|
|
234
235
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OtlpTracer.js","names":["Cause","Config","Duration","Effect","flow","
|
|
1
|
+
{"version":3,"file":"OtlpTracer.js","names":["Cause","Config","Duration","Effect","flow","Layer","Option","Tracer","OtlpEnv","Exporter","entriesToAttributes","OtlpResource","OtlpSerialization","make","fnUntraced","options","otelResource","fromConfig","resource","serialization","scope","name","serviceNameUnsafe","exporter","label","url","headers","exportInterval","seconds","maxBatchSize","body","spans","data","resourceSpans","scopeSpans","traces","shutdownTimeout","exportFn","span","sampled","push","makeOtlpSpan","makeSpan","status","_tag","startTime","attributes","Map","export","context","primitive","fiber","currentSpan","undefined","layer","effect","layerFromConfig","gen","disabled","endpoint","exporters","all","boolean","pipe","withDefault","includes","empty","baseTimeout","tracesTimeout","exportTimeout","scheduleDelay","option","int","map","millis","firstSomeOf","_","toString","getOrUndefined","orDie","unwrap","SpanProto","end","endTime","exit","attribute","key","value","set","event","events","addLinks","links","self","Object","assign","create","isSome","parent","traceId","generateId","spanId","len","chars","result","i","Math","floor","random","length","entries","timeUnixNano","String","droppedAttributesCount","otelStatus","constOtelStatusSuccess","hasInterruptsOnly","cause","code","StatusCode","Ok","message","stringValue","boolValue","errors","prettyErrors","includeCauseInStack","Error","error","stack","parentSpanId","match","onNone","onSome","kind","SpanKind","startTimeUnixNano","endTimeUnixNano","droppedEventsCount","link","droppedLinksCount","Unset","unspecified","internal","server","client","producer","consumer"],"sources":["../../../src/unstable/observability/OtlpTracer.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
package/src/Cause.ts
CHANGED
|
@@ -1234,7 +1234,9 @@ export const filterInterruptors: <E>(self: Cause<E>) => Result.Result<Set<number
|
|
|
1234
1234
|
* @category rendering
|
|
1235
1235
|
* @since 3.2.0
|
|
1236
1236
|
*/
|
|
1237
|
-
export const prettyErrors: <E>(self: Cause<E
|
|
1237
|
+
export const prettyErrors: <E>(self: Cause<E>, options?: {
|
|
1238
|
+
readonly includeCauseInStack?: boolean | undefined
|
|
1239
|
+
}) => Array<Error> = effect.causePrettyErrors
|
|
1238
1240
|
|
|
1239
1241
|
/**
|
|
1240
1242
|
* Formats a `Cause` as a human-readable string for logging or debugging.
|
package/src/Schema.ts
CHANGED
|
@@ -10981,7 +10981,10 @@ export interface fromJsonString<S extends Constraint> extends decodeTo<S, String
|
|
|
10981
10981
|
* @since 4.0.0
|
|
10982
10982
|
*/
|
|
10983
10983
|
export function fromJsonString<S extends Constraint>(schema: S): fromJsonString<S> {
|
|
10984
|
+
const identifier = SchemaAST.resolveIdentifier(schema.ast)
|
|
10984
10985
|
return String.annotate({
|
|
10986
|
+
// Give the transport wrapper its own name so the decoded payload keeps its identifier.
|
|
10987
|
+
identifier: identifier === undefined ? undefined : `${identifier}JsonString`,
|
|
10985
10988
|
expected: "a string that will be decoded as JSON",
|
|
10986
10989
|
contentMediaType: "application/json",
|
|
10987
10990
|
contentSchema: SchemaAST.toEncoded(schema.ast)
|
package/src/internal/core.ts
CHANGED
|
@@ -87,7 +87,7 @@ export const StructuralProto = {
|
|
|
87
87
|
const thatKeys = Object.keys(that)
|
|
88
88
|
if (selfKeys.length !== thatKeys.length) return false
|
|
89
89
|
for (let i = 0; i < selfKeys.length; i++) {
|
|
90
|
-
if (selfKeys[i] !== thatKeys[i]
|
|
90
|
+
if (selfKeys[i] !== thatKeys[i] || !Equal.equals(this[selfKeys[i]], that[selfKeys[i]])) {
|
|
91
91
|
return false
|
|
92
92
|
}
|
|
93
93
|
}
|
package/src/internal/effect.ts
CHANGED
|
@@ -310,7 +310,9 @@ export const causeSquash = <E>(self: Cause.Cause<E>): unknown => {
|
|
|
310
310
|
}
|
|
311
311
|
|
|
312
312
|
/** @internal */
|
|
313
|
-
export const causePrettyErrors = <E>(self: Cause.Cause<E
|
|
313
|
+
export const causePrettyErrors = <E>(self: Cause.Cause<E>, options?: {
|
|
314
|
+
readonly includeCauseInStack?: boolean | undefined
|
|
315
|
+
}): Array<Error> => {
|
|
314
316
|
const errors: Array<Error> = []
|
|
315
317
|
const interrupts: Array<Cause.Interrupt> = []
|
|
316
318
|
if (self.reasons.length === 0) return errors
|
|
@@ -326,7 +328,8 @@ export const causePrettyErrors = <E>(self: Cause.Cause<E>): Array<Error> => {
|
|
|
326
328
|
errors.push(
|
|
327
329
|
causePrettyError(
|
|
328
330
|
failure._tag === "Die" ? failure.defect : failure.error as any,
|
|
329
|
-
failure.annotations
|
|
331
|
+
failure.annotations,
|
|
332
|
+
options
|
|
330
333
|
)
|
|
331
334
|
)
|
|
332
335
|
}
|
|
@@ -337,7 +340,7 @@ export const causePrettyErrors = <E>(self: Cause.Cause<E>): Array<Error> => {
|
|
|
337
340
|
const error = new globalThis.Error("All fibers interrupted without error", { cause })
|
|
338
341
|
error.name = "InterruptError"
|
|
339
342
|
error.stack = `${error.name}: ${error.message}`
|
|
340
|
-
errors.push(causePrettyError(error, interrupts[0].annotations))
|
|
343
|
+
errors.push(causePrettyError(error, interrupts[0].annotations, options))
|
|
341
344
|
}
|
|
342
345
|
|
|
343
346
|
setStackTraceLimit(prevStackLimit)
|
|
@@ -347,7 +350,10 @@ export const causePrettyErrors = <E>(self: Cause.Cause<E>): Array<Error> => {
|
|
|
347
350
|
/** @internal */
|
|
348
351
|
export const causePrettyError = (
|
|
349
352
|
original: Record<string, unknown> | Error,
|
|
350
|
-
annotations?: ReadonlyMap<string, unknown
|
|
353
|
+
annotations?: ReadonlyMap<string, unknown>,
|
|
354
|
+
options?: {
|
|
355
|
+
readonly includeCauseInStack?: boolean | undefined
|
|
356
|
+
}
|
|
351
357
|
): Error => {
|
|
352
358
|
const kind = typeof original
|
|
353
359
|
let error: Error
|
|
@@ -364,6 +370,9 @@ export const causePrettyError = (
|
|
|
364
370
|
const stack = `${error.name}: ${error.message}`
|
|
365
371
|
error.stack = annotations ? addStackAnnotations(stack, annotations) : stack
|
|
366
372
|
}
|
|
373
|
+
if (options?.includeCauseInStack) {
|
|
374
|
+
error.stack = renderPrettyError(error)!
|
|
375
|
+
}
|
|
367
376
|
for (const key of Object.keys(original)) {
|
|
368
377
|
if (!(key in error)) {
|
|
369
378
|
;(error as any)[key] = (original as any)[key]
|
|
@@ -461,8 +470,7 @@ const currentStackTrace = (frame: StackFrame): string => {
|
|
|
461
470
|
export const causePretty = <E>(cause: Cause.Cause<E>): string =>
|
|
462
471
|
causePrettyErrors<E>(cause).map(renderPrettyError).join("\n")
|
|
463
472
|
|
|
464
|
-
|
|
465
|
-
export const renderPrettyError = (e: Error): string | undefined =>
|
|
473
|
+
const renderPrettyError = (e: Error): string | undefined =>
|
|
466
474
|
e.cause ? `${e.stack} {\n${renderErrorCause(e.cause as Error, " ")}\n}` : e.stack
|
|
467
475
|
|
|
468
476
|
const renderErrorCause = (cause: Error, prefix: string) => {
|
|
@@ -335,8 +335,8 @@ export const jsonSchema = <S extends Schema.Constraint>(
|
|
|
335
335
|
* @category constructors
|
|
336
336
|
* @since 4.0.0
|
|
337
337
|
*/
|
|
338
|
-
export const urlParams = (urlParams: UrlParams.
|
|
339
|
-
text(UrlParams.toString(urlParams), contentType ?? "application/x-www-form-urlencoded")
|
|
338
|
+
export const urlParams = (urlParams: UrlParams.Input, contentType?: string): Uint8Array =>
|
|
339
|
+
text(UrlParams.toString(UrlParams.fromInput(urlParams)), contentType ?? "application/x-www-form-urlencoded")
|
|
340
340
|
|
|
341
341
|
/**
|
|
342
342
|
* HTTP body variant backed by Web `FormData`.
|
|
@@ -40,7 +40,7 @@ import * as HttpClientResponse from "./HttpClientResponse.ts"
|
|
|
40
40
|
import * as HttpIncomingMessage from "./HttpIncomingMessage.ts"
|
|
41
41
|
import * as HttpMethod from "./HttpMethod.ts"
|
|
42
42
|
import * as TraceContext from "./HttpTraceContext.ts"
|
|
43
|
-
import * as
|
|
43
|
+
import * as Url from "./Url.ts"
|
|
44
44
|
|
|
45
45
|
const TypeId = "~effect/http/HttpClient"
|
|
46
46
|
|
|
@@ -790,7 +790,7 @@ export const make = (
|
|
|
790
790
|
Effect.withFiber((fiber) => {
|
|
791
791
|
const scopedController = scopedRequests.get(request)
|
|
792
792
|
const controller = scopedController ?? new AbortController()
|
|
793
|
-
const urlResult =
|
|
793
|
+
const urlResult = Url.make(request.url, request.urlParams, Option.getOrUndefined(request.hash))
|
|
794
794
|
if (Result.isFailure(urlResult)) {
|
|
795
795
|
return Effect.fail(
|
|
796
796
|
new Error.HttpClientError({
|
|
@@ -28,6 +28,7 @@ import * as Stream from "../../Stream.ts"
|
|
|
28
28
|
import * as Headers from "./Headers.ts"
|
|
29
29
|
import * as HttpBody from "./HttpBody.ts"
|
|
30
30
|
import { hasBody, type HttpMethod } from "./HttpMethod.ts"
|
|
31
|
+
import * as Url from "./Url.ts"
|
|
31
32
|
import * as UrlParams from "./UrlParams.ts"
|
|
32
33
|
|
|
33
34
|
const TypeId = "~effect/http/HttpClientRequest"
|
|
@@ -116,7 +117,7 @@ const Proto = {
|
|
|
116
117
|
export function makeWith(
|
|
117
118
|
method: HttpMethod,
|
|
118
119
|
url: string,
|
|
119
|
-
urlParams: UrlParams.
|
|
120
|
+
urlParams: UrlParams.Input,
|
|
120
121
|
hash: Option.Option<string>,
|
|
121
122
|
headers: Headers.Headers,
|
|
122
123
|
body: HttpBody.HttpBody
|
|
@@ -1180,7 +1181,7 @@ export const bodyFile: {
|
|
|
1180
1181
|
* @since 4.0.0
|
|
1181
1182
|
*/
|
|
1182
1183
|
export function toUrl(self: HttpClientRequest): Option.Option<URL> {
|
|
1183
|
-
const r =
|
|
1184
|
+
const r = Url.make(self.url, self.urlParams, Option.getOrUndefined(self.hash))
|
|
1184
1185
|
if (Result.isSuccess(r)) {
|
|
1185
1186
|
return Option.some(r.success)
|
|
1186
1187
|
}
|
|
@@ -1230,8 +1231,8 @@ const parseContentLength = (contentLength: string | null): number | undefined =>
|
|
|
1230
1231
|
export const toWebResult = (self: HttpClientRequest, options?: {
|
|
1231
1232
|
readonly signal?: AbortSignal | undefined
|
|
1232
1233
|
readonly context?: Context.Context<never> | undefined
|
|
1233
|
-
}): Result.Result<Request,
|
|
1234
|
-
const url =
|
|
1234
|
+
}): Result.Result<Request, Url.UrlError> => {
|
|
1235
|
+
const url = Url.make(self.url, self.urlParams, Option.getOrUndefined(self.hash))
|
|
1235
1236
|
if (Result.isFailure(url)) {
|
|
1236
1237
|
return Result.fail(url.failure)
|
|
1237
1238
|
}
|
|
@@ -1271,7 +1272,7 @@ export const toWebResult = (self: HttpClientRequest, options?: {
|
|
|
1271
1272
|
}
|
|
1272
1273
|
return Result.try({
|
|
1273
1274
|
try: () => new Request(url.success, requestInit),
|
|
1274
|
-
catch: (cause) => new
|
|
1275
|
+
catch: (cause) => new Url.UrlError({ cause })
|
|
1275
1276
|
})
|
|
1276
1277
|
}
|
|
1277
1278
|
|
|
@@ -1279,14 +1280,14 @@ const isReadableStream = (u: unknown): u is ReadableStream<Uint8Array> =>
|
|
|
1279
1280
|
typeof ReadableStream !== "undefined" && u instanceof ReadableStream
|
|
1280
1281
|
|
|
1281
1282
|
/**
|
|
1282
|
-
* Converts an `HttpClientRequest` to a Web `Request`, failing with `
|
|
1283
|
+
* Converts an `HttpClientRequest` to a Web `Request`, failing with `UrlError` when the request URL is invalid.
|
|
1283
1284
|
*
|
|
1284
1285
|
* @category converting
|
|
1285
1286
|
* @since 4.0.0
|
|
1286
1287
|
*/
|
|
1287
1288
|
export const toWeb = (self: HttpClientRequest, options?: {
|
|
1288
1289
|
readonly signal?: AbortSignal | undefined
|
|
1289
|
-
}): Effect.Effect<Request,
|
|
1290
|
+
}): Effect.Effect<Request, Url.UrlError> =>
|
|
1290
1291
|
Effect.contextWith((context) =>
|
|
1291
1292
|
Effect.fromResult(toWebResult(self, {
|
|
1292
1293
|
context: context,
|
package/src/unstable/http/Url.ts
CHANGED
|
@@ -9,11 +9,66 @@
|
|
|
9
9
|
* @since 4.0.0
|
|
10
10
|
*/
|
|
11
11
|
import * as Cause from "../../Cause.ts"
|
|
12
|
+
import * as Data from "../../Data.ts"
|
|
12
13
|
import { dual } from "../../Function.ts"
|
|
13
14
|
import * as Redacted from "../../Redacted.ts"
|
|
14
15
|
import * as Result from "../../Result.ts"
|
|
15
16
|
import * as UrlParams from "./UrlParams.ts"
|
|
16
17
|
|
|
18
|
+
/**
|
|
19
|
+
* Error returned when constructing a `URL` fails.
|
|
20
|
+
*
|
|
21
|
+
* @category errors
|
|
22
|
+
* @since 4.0.0
|
|
23
|
+
*/
|
|
24
|
+
export class UrlError extends Data.TaggedError("UrlError")<{
|
|
25
|
+
readonly cause: unknown
|
|
26
|
+
}> {}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Creates a `URL` safely by appending `UrlParams` and an optional hash to a URL string.
|
|
30
|
+
*
|
|
31
|
+
* **Details**
|
|
32
|
+
*
|
|
33
|
+
* Returns a `Result` that fails with `UrlError` if the URL cannot be constructed.
|
|
34
|
+
*
|
|
35
|
+
* @category constructors
|
|
36
|
+
* @since 4.0.0
|
|
37
|
+
*/
|
|
38
|
+
export const make = (
|
|
39
|
+
url: string,
|
|
40
|
+
params: UrlParams.UrlParams,
|
|
41
|
+
hash: string | undefined
|
|
42
|
+
): Result.Result<URL, UrlError> =>
|
|
43
|
+
Result.try({
|
|
44
|
+
try: () => {
|
|
45
|
+
const urlInstance = new URL(url, baseUrl())
|
|
46
|
+
for (let i = 0; i < params.params.length; i++) {
|
|
47
|
+
const [key, value] = params.params[i]
|
|
48
|
+
if (value !== undefined) {
|
|
49
|
+
urlInstance.searchParams.append(key, value)
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (hash !== undefined) {
|
|
53
|
+
urlInstance.hash = hash
|
|
54
|
+
}
|
|
55
|
+
return urlInstance
|
|
56
|
+
},
|
|
57
|
+
catch: (cause) => new UrlError({ cause })
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
const baseUrl = (): string | undefined => {
|
|
61
|
+
if (
|
|
62
|
+
"location" in globalThis &&
|
|
63
|
+
globalThis.location !== undefined &&
|
|
64
|
+
globalThis.location.origin !== undefined &&
|
|
65
|
+
globalThis.location.pathname !== undefined
|
|
66
|
+
) {
|
|
67
|
+
return location.origin + location.pathname
|
|
68
|
+
}
|
|
69
|
+
return undefined
|
|
70
|
+
}
|
|
71
|
+
|
|
17
72
|
/**
|
|
18
73
|
* Parses a URL string safely into a `URL` object, returning a `Result` type for
|
|
19
74
|
* error handling.
|
|
@@ -502,7 +557,7 @@ export const setUrlParams: {
|
|
|
502
557
|
* @category setters
|
|
503
558
|
* @since 4.0.0
|
|
504
559
|
*/
|
|
505
|
-
(urlParams: UrlParams.
|
|
560
|
+
(urlParams: UrlParams.Input): (url: URL) => URL
|
|
506
561
|
/**
|
|
507
562
|
* Updates the query parameters of a URL.
|
|
508
563
|
*
|
|
@@ -532,10 +587,10 @@ export const setUrlParams: {
|
|
|
532
587
|
* @category setters
|
|
533
588
|
* @since 4.0.0
|
|
534
589
|
*/
|
|
535
|
-
(url: URL, urlParams: UrlParams.
|
|
536
|
-
} = dual(2, (url: URL,
|
|
590
|
+
(url: URL, urlParams: UrlParams.Input): URL
|
|
591
|
+
} = dual(2, (url: URL, urlParams: UrlParams.Input) =>
|
|
537
592
|
mutate(url, (url) => {
|
|
538
|
-
url.search = UrlParams.toString(
|
|
593
|
+
url.search = UrlParams.toString(UrlParams.fromInput(urlParams))
|
|
539
594
|
}))
|
|
540
595
|
|
|
541
596
|
/**
|
|
@@ -619,7 +674,7 @@ export const modifyUrlParams: {
|
|
|
619
674
|
* @category modifiers
|
|
620
675
|
* @since 4.0.0
|
|
621
676
|
*/
|
|
622
|
-
(f: (urlParams: UrlParams.UrlParams) => UrlParams.
|
|
677
|
+
(f: (urlParams: UrlParams.UrlParams) => UrlParams.Input): (url: URL) => URL
|
|
623
678
|
/**
|
|
624
679
|
* Reads the query parameters of a URL, modifies them, and updates the URL.
|
|
625
680
|
*
|
|
@@ -646,8 +701,8 @@ export const modifyUrlParams: {
|
|
|
646
701
|
* @category modifiers
|
|
647
702
|
* @since 4.0.0
|
|
648
703
|
*/
|
|
649
|
-
(url: URL, f: (urlParams: UrlParams.UrlParams) => UrlParams.
|
|
650
|
-
} = dual(2, (url: URL, f: (urlParams: UrlParams.UrlParams) => UrlParams.
|
|
704
|
+
(url: URL, f: (urlParams: UrlParams.UrlParams) => UrlParams.Input): URL
|
|
705
|
+
} = dual(2, (url: URL, f: (urlParams: UrlParams.UrlParams) => UrlParams.Input) =>
|
|
651
706
|
mutate(url, (url) => {
|
|
652
707
|
const params = f(UrlParams.fromInput(url.searchParams))
|
|
653
708
|
url.search = UrlParams.toString(params)
|
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
* @since 4.0.0
|
|
10
10
|
*/
|
|
11
11
|
import * as Arr from "../../Array.ts"
|
|
12
|
-
import * as Data from "../../Data.ts"
|
|
13
12
|
import * as Effect from "../../Effect.ts"
|
|
14
13
|
import * as Equal from "../../Equal.ts"
|
|
15
14
|
import * as Equ from "../../Equivalence.ts"
|
|
@@ -21,7 +20,6 @@ import * as Option from "../../Option.ts"
|
|
|
21
20
|
import type { Pipeable } from "../../Pipeable.ts"
|
|
22
21
|
import { hasProperty } from "../../Predicate.ts"
|
|
23
22
|
import type { ReadonlyRecord } from "../../Record.ts"
|
|
24
|
-
import * as Result from "../../Result.ts"
|
|
25
23
|
import * as Schema from "../../Schema.ts"
|
|
26
24
|
import * as SchemaIssue from "../../SchemaIssue.ts"
|
|
27
25
|
import * as SchemaTransformation from "../../SchemaTransformation.ts"
|
|
@@ -65,6 +63,7 @@ export const isUrlParams = (u: unknown): u is UrlParams => hasProperty(u, TypeId
|
|
|
65
63
|
* @since 4.0.0
|
|
66
64
|
*/
|
|
67
65
|
export type Input =
|
|
66
|
+
| UrlParams
|
|
68
67
|
| CoercibleRecordInput
|
|
69
68
|
| Iterable<readonly [string, Coercible]>
|
|
70
69
|
| URLSearchParams
|
|
@@ -157,6 +156,9 @@ export const make = (params: ReadonlyArray<readonly [string, string]>): UrlParam
|
|
|
157
156
|
* @since 4.0.0
|
|
158
157
|
*/
|
|
159
158
|
export const fromInput = (input: Input): UrlParams => {
|
|
159
|
+
if (isUrlParams(input)) {
|
|
160
|
+
return input
|
|
161
|
+
}
|
|
160
162
|
const parsed = fromInputNested(input)
|
|
161
163
|
const out: Array<[string, string]> = []
|
|
162
164
|
for (let i = 0; i < parsed.length; i++) {
|
|
@@ -634,68 +636,13 @@ export const remove: {
|
|
|
634
636
|
(self: UrlParams, key: string): UrlParams
|
|
635
637
|
} = dual(2, (self: UrlParams, key: string): UrlParams => transform(self, Arr.filter(([k]) => k !== key)))
|
|
636
638
|
|
|
637
|
-
/**
|
|
638
|
-
* Error returned when constructing a `URL` from `UrlParams` fails.
|
|
639
|
-
*
|
|
640
|
-
* @category errors
|
|
641
|
-
* @since 4.0.0
|
|
642
|
-
*/
|
|
643
|
-
export class UrlParamsError extends Data.TaggedError("UrlParamsError")<{
|
|
644
|
-
cause: unknown
|
|
645
|
-
}> {}
|
|
646
|
-
|
|
647
|
-
/**
|
|
648
|
-
* Creates a `URL` safely by appending `UrlParams` and an optional hash to a URL string.
|
|
649
|
-
*
|
|
650
|
-
* **Details**
|
|
651
|
-
*
|
|
652
|
-
* Returns a `Result` that fails with `UrlParamsError` if the URL cannot be
|
|
653
|
-
* constructed.
|
|
654
|
-
*
|
|
655
|
-
* @category converting
|
|
656
|
-
* @since 4.0.0
|
|
657
|
-
*/
|
|
658
|
-
export const makeUrl = (
|
|
659
|
-
url: string,
|
|
660
|
-
params: UrlParams,
|
|
661
|
-
hash: string | undefined
|
|
662
|
-
): Result.Result<URL, UrlParamsError> => {
|
|
663
|
-
try {
|
|
664
|
-
const urlInstance = new URL(url, baseUrl())
|
|
665
|
-
for (let i = 0; i < params.params.length; i++) {
|
|
666
|
-
const [key, value] = params.params[i]
|
|
667
|
-
if (value !== undefined) {
|
|
668
|
-
urlInstance.searchParams.append(key, value)
|
|
669
|
-
}
|
|
670
|
-
}
|
|
671
|
-
if (hash !== undefined) {
|
|
672
|
-
urlInstance.hash = hash
|
|
673
|
-
}
|
|
674
|
-
return Result.succeed(urlInstance)
|
|
675
|
-
} catch (e) {
|
|
676
|
-
return Result.fail(new UrlParamsError({ cause: e }))
|
|
677
|
-
}
|
|
678
|
-
}
|
|
679
|
-
|
|
680
639
|
/**
|
|
681
640
|
* Serializes `UrlParams` to a URL query string without a leading question mark.
|
|
682
641
|
*
|
|
683
642
|
* @category converting
|
|
684
643
|
* @since 4.0.0
|
|
685
644
|
*/
|
|
686
|
-
export const toString = (
|
|
687
|
-
|
|
688
|
-
const baseUrl = (): string | undefined => {
|
|
689
|
-
if (
|
|
690
|
-
"location" in globalThis &&
|
|
691
|
-
globalThis.location !== undefined &&
|
|
692
|
-
globalThis.location.origin !== undefined &&
|
|
693
|
-
globalThis.location.pathname !== undefined
|
|
694
|
-
) {
|
|
695
|
-
return location.origin + location.pathname
|
|
696
|
-
}
|
|
697
|
-
return undefined
|
|
698
|
-
}
|
|
645
|
+
export const toString = (input: Input): string => new URLSearchParams(fromInput(input).params as any).toString()
|
|
699
646
|
|
|
700
647
|
/**
|
|
701
648
|
* Builds a `Record` containing all the key-value pairs in the given `UrlParams`
|
|
@@ -21,6 +21,7 @@ import * as Layer from "../../Layer.ts"
|
|
|
21
21
|
import * as Option from "../../Option.ts"
|
|
22
22
|
import type { Path } from "../../Path.ts"
|
|
23
23
|
import { type Pipeable, pipeArguments } from "../../Pipeable.ts"
|
|
24
|
+
import { hasProperty } from "../../Predicate.ts"
|
|
24
25
|
import * as Redacted from "../../Redacted.ts"
|
|
25
26
|
import * as Result from "../../Result.ts"
|
|
26
27
|
import * as Schema from "../../Schema.ts"
|
|
@@ -603,13 +604,20 @@ function decodePayload(
|
|
|
603
604
|
)
|
|
604
605
|
}
|
|
605
606
|
case "Json":
|
|
606
|
-
|
|
607
|
+
return Effect.flatMap(Effect.orDie(httpRequest.text), (text) => {
|
|
607
608
|
if (text === "") {
|
|
608
|
-
return existing.nullOnEmpty ?
|
|
609
|
+
return decode(existing.nullOnEmpty ? null : undefined)
|
|
609
610
|
}
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
611
|
+
try {
|
|
612
|
+
return decode(JSON.parse(text))
|
|
613
|
+
} catch (cause) {
|
|
614
|
+
return Effect.fail(
|
|
615
|
+
new Schema.SchemaError(
|
|
616
|
+
new SchemaIssue.InvalidValue(Option.some(text), { message: `Invalid JSON: ${cause}` })
|
|
617
|
+
)
|
|
618
|
+
)
|
|
619
|
+
}
|
|
620
|
+
})
|
|
613
621
|
case "Text":
|
|
614
622
|
return Effect.flatMap(Effect.orDie(httpRequest.text), decode)
|
|
615
623
|
case "FormUrlEncoded": {
|
|
@@ -766,6 +774,7 @@ const makeSecurityMiddleware = (
|
|
|
766
774
|
readonly group: HttpApiGroup.AnyWithProps
|
|
767
775
|
readonly endpoint: HttpApiEndpoint.AnyWithProps
|
|
768
776
|
}) {
|
|
777
|
+
handler = Effect.mapError(handler, (error) => new HandlerError(error))
|
|
769
778
|
let lastResult: Result.Result<any, any> | undefined
|
|
770
779
|
for (let i = 0; i < entries.length; i++) {
|
|
771
780
|
const { decode, middleware } = entries[i]
|
|
@@ -776,6 +785,9 @@ const makeSecurityMiddleware = (
|
|
|
776
785
|
group: options.group
|
|
777
786
|
})))
|
|
778
787
|
if (Result.isFailure(result)) {
|
|
788
|
+
if (isHandlerError(result.failure)) {
|
|
789
|
+
return yield* Effect.fail(result.failure.error)
|
|
790
|
+
}
|
|
779
791
|
lastResult = result
|
|
780
792
|
continue
|
|
781
793
|
}
|
|
@@ -788,6 +800,16 @@ const makeSecurityMiddleware = (
|
|
|
788
800
|
return middleware
|
|
789
801
|
}
|
|
790
802
|
|
|
803
|
+
const HandlerErrorTypeId = "~effect/httpapi/HttpApiBuilder/HandlerError" as const
|
|
804
|
+
class HandlerError {
|
|
805
|
+
readonly [HandlerErrorTypeId] = HandlerErrorTypeId
|
|
806
|
+
readonly error: unknown
|
|
807
|
+
constructor(error: unknown) {
|
|
808
|
+
this.error = error
|
|
809
|
+
}
|
|
810
|
+
}
|
|
811
|
+
const isHandlerError = (value: unknown): value is HandlerError => hasProperty(value, HandlerErrorTypeId)
|
|
812
|
+
|
|
791
813
|
const $HttpServerResponse = Schema.declare(Response.isHttpServerResponse)
|
|
792
814
|
|
|
793
815
|
type StreamEncoder = (response: unknown, context: Context.Context<never>) =>
|
|
@@ -807,7 +829,9 @@ function makeStreamEncoder(endpoint: HttpApiEndpoint.AnyWithProps): StreamEncode
|
|
|
807
829
|
if (HttpApiSchema.isStreamUint8Array(streamSchema)) {
|
|
808
830
|
return (response, context) => {
|
|
809
831
|
if (!Stream.isStream(response)) {
|
|
810
|
-
return hasBuffered ? undefined :
|
|
832
|
+
return hasBuffered ? undefined : new Schema.SchemaError(
|
|
833
|
+
new SchemaIssue.InvalidValue(Option.some(response), { message: "Expected a streaming response" })
|
|
834
|
+
)
|
|
811
835
|
}
|
|
812
836
|
|
|
813
837
|
return Effect.succeed(Response.stream(
|
|
@@ -824,7 +848,9 @@ function makeStreamEncoder(endpoint: HttpApiEndpoint.AnyWithProps): StreamEncode
|
|
|
824
848
|
|
|
825
849
|
return (response, context) => {
|
|
826
850
|
if (!Stream.isStream(response)) {
|
|
827
|
-
return hasBuffered ? undefined :
|
|
851
|
+
return hasBuffered ? undefined : new Schema.SchemaError(
|
|
852
|
+
new SchemaIssue.InvalidValue(Option.some(response), { message: "Expected a streaming response" })
|
|
853
|
+
)
|
|
828
854
|
}
|
|
829
855
|
|
|
830
856
|
return Effect.succeed(Response.stream(
|
|
@@ -852,16 +878,6 @@ function hasBufferedSuccess(endpoint: HttpApiEndpoint.AnyWithProps): boolean {
|
|
|
852
878
|
return endpoint.success.size === 0
|
|
853
879
|
}
|
|
854
880
|
|
|
855
|
-
function expectedStreamResponse(response: unknown) {
|
|
856
|
-
return Effect.fail(
|
|
857
|
-
makeSchemaError(
|
|
858
|
-
new SchemaIssue.InvalidValue(Option.some(response), {
|
|
859
|
-
message: "Expected a streaming response"
|
|
860
|
-
})
|
|
861
|
-
)
|
|
862
|
-
)
|
|
863
|
-
}
|
|
864
|
-
|
|
865
881
|
interface SseStreamEncoder {
|
|
866
882
|
readonly sseMode: HttpApiSchema.StreamSseMode
|
|
867
883
|
readonly encodeEvents: (
|
|
@@ -922,10 +938,6 @@ function renderSseEvent(event: Sse.EventEncoded) {
|
|
|
922
938
|
})
|
|
923
939
|
}
|
|
924
940
|
|
|
925
|
-
function makeSchemaError(issue: SchemaIssue.Issue): Schema.SchemaError {
|
|
926
|
-
return new Schema.SchemaError(issue)
|
|
927
|
-
}
|
|
928
|
-
|
|
929
941
|
const toResponseSuccessSchema = toResponseSchema(HttpApiSchema.getStatusSuccess)
|
|
930
942
|
const toResponseErrorSchema = toResponseSchema(HttpApiSchema.getStatusError)
|
|
931
943
|
|
|
@@ -17,7 +17,6 @@ import * as Duration from "../../Duration.ts"
|
|
|
17
17
|
import * as Effect from "../../Effect.ts"
|
|
18
18
|
import type * as Exit from "../../Exit.ts"
|
|
19
19
|
import { flow } from "../../Function.ts"
|
|
20
|
-
import { renderPrettyError } from "../../internal/effect.ts"
|
|
21
20
|
import * as Layer from "../../Layer.ts"
|
|
22
21
|
import * as Option from "../../Option.ts"
|
|
23
22
|
import type * as Scope from "../../Scope.ts"
|
|
@@ -285,7 +284,9 @@ const makeOtlpSpan = (self: SpanImpl): OtlpSpan => {
|
|
|
285
284
|
value: { boolValue: true }
|
|
286
285
|
})
|
|
287
286
|
} else {
|
|
288
|
-
const errors = Cause.prettyErrors(status.exit.cause
|
|
287
|
+
const errors = Cause.prettyErrors(status.exit.cause, {
|
|
288
|
+
includeCauseInStack: true
|
|
289
|
+
})
|
|
289
290
|
otelStatus = {
|
|
290
291
|
code: StatusCode.Error
|
|
291
292
|
}
|
|
@@ -312,7 +313,7 @@ const makeOtlpSpan = (self: SpanImpl): OtlpSpan => {
|
|
|
312
313
|
{
|
|
313
314
|
"key": "exception.stacktrace",
|
|
314
315
|
"value": {
|
|
315
|
-
"stringValue":
|
|
316
|
+
"stringValue": error.stack ?? "No stack trace available"
|
|
316
317
|
}
|
|
317
318
|
}
|
|
318
319
|
]
|