effect 4.1.0 → 4.1.1
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/README.md +30 -0
- package/THIRD_PARTY_NOTICES.md +62 -0
- package/dist/BigDecimal.d.ts +139 -7
- package/dist/BigDecimal.d.ts.map +1 -1
- package/dist/BigDecimal.js +83 -14
- package/dist/BigDecimal.js.map +1 -1
- package/dist/Equal.d.ts +2 -2
- package/dist/Equal.d.ts.map +1 -1
- package/dist/Equal.js +3 -3
- package/dist/Equal.js.map +1 -1
- package/dist/Hash.d.ts +3 -2
- package/dist/Hash.d.ts.map +1 -1
- package/dist/Hash.js +5 -4
- package/dist/Hash.js.map +1 -1
- package/dist/Iterable.d.ts.map +1 -1
- package/dist/Iterable.js +11 -8
- package/dist/Iterable.js.map +1 -1
- package/dist/Path.d.ts.map +1 -1
- package/dist/Path.js +5 -1
- package/dist/Path.js.map +1 -1
- package/dist/Pool.d.ts.map +1 -1
- package/dist/Pool.js +2 -1
- package/dist/Pool.js.map +1 -1
- package/dist/Schema.d.ts +2 -1
- package/dist/Schema.d.ts.map +1 -1
- package/dist/Schema.js +2 -1
- package/dist/Schema.js.map +1 -1
- package/dist/SchemaRepresentation.d.ts +4 -2
- package/dist/SchemaRepresentation.d.ts.map +1 -1
- package/dist/SchemaRepresentation.js +4 -2
- package/dist/SchemaRepresentation.js.map +1 -1
- package/dist/SchemaTransformation.d.ts +2 -2
- package/dist/SchemaTransformation.js +2 -2
- package/dist/ai/McpClient.d.ts +171 -19
- package/dist/ai/McpClient.d.ts.map +1 -1
- package/dist/ai/McpClient.js +277 -66
- package/dist/ai/McpClient.js.map +1 -1
- package/dist/ai/McpSchema.d.ts +108 -0
- package/dist/ai/McpSchema.d.ts.map +1 -1
- package/dist/ai/McpSchema.js +99 -0
- package/dist/ai/McpSchema.js.map +1 -1
- package/dist/ai/McpServer.d.ts +120 -6
- package/dist/ai/McpServer.d.ts.map +1 -1
- package/dist/ai/McpServer.js +215 -34
- package/dist/ai/McpServer.js.map +1 -1
- package/dist/ai/Prompt.d.ts.map +1 -1
- package/dist/ai/Prompt.js +20 -11
- package/dist/ai/Prompt.js.map +1 -1
- package/dist/ai/Tool.d.ts.map +1 -1
- package/dist/ai/Tool.js +5 -7
- package/dist/ai/Tool.js.map +1 -1
- package/dist/ai/internal/mcpCore.js +72 -3
- package/dist/ai/internal/mcpCore.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2024_11_05.js +3 -1
- package/dist/ai/internal/mcpProtocol/v2024_11_05.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2025_03_26.js +3 -1
- package/dist/ai/internal/mcpProtocol/v2025_03_26.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2025_06_18.js +3 -1
- package/dist/ai/internal/mcpProtocol/v2025_06_18.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2025_11_25.js +3 -1
- package/dist/ai/internal/mcpProtocol/v2025_11_25.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2026_07_28.js +42 -7
- package/dist/ai/internal/mcpProtocol/v2026_07_28.js.map +1 -1
- package/dist/ai/internal/mcpProtocol.js +12 -0
- package/dist/ai/internal/mcpProtocol.js.map +1 -1
- package/dist/ai/internal/mcpRuntime.js +3 -3
- package/dist/ai/internal/mcpRuntime.js.map +1 -1
- package/dist/ai/internal/mcpSkills.d.ts +2 -0
- package/dist/ai/internal/mcpSkills.d.ts.map +1 -0
- package/dist/ai/internal/mcpSkills.js +428 -0
- package/dist/ai/internal/mcpSkills.js.map +1 -0
- package/dist/cluster/ClusterWorkflowEngine.d.ts.map +1 -1
- package/dist/cluster/ClusterWorkflowEngine.js +15 -5
- package/dist/cluster/ClusterWorkflowEngine.js.map +1 -1
- package/dist/cluster/Reply.d.ts +1 -1
- package/dist/cluster/Reply.d.ts.map +1 -1
- package/dist/cluster/Reply.js.map +1 -1
- package/dist/cluster/Sharding.d.ts.map +1 -1
- package/dist/cluster/Sharding.js +4 -1
- package/dist/cluster/Sharding.js.map +1 -1
- package/dist/cluster/internal/entityManager.js +15 -7
- package/dist/cluster/internal/entityManager.js.map +1 -1
- package/dist/crypto/Aead.d.ts +2 -1
- package/dist/crypto/Aead.d.ts.map +1 -1
- package/dist/crypto/Aead.js +2 -2
- package/dist/crypto/Aead.js.map +1 -1
- package/dist/crypto/Cipher.d.ts +2 -1
- package/dist/crypto/Cipher.d.ts.map +1 -1
- package/dist/crypto/Cipher.js +2 -2
- package/dist/crypto/Cipher.js.map +1 -1
- package/dist/crypto/KeyAgreement.d.ts +3 -2
- package/dist/crypto/KeyAgreement.d.ts.map +1 -1
- package/dist/crypto/KeyAgreement.js +2 -2
- package/dist/crypto/KeyAgreement.js.map +1 -1
- package/dist/crypto/KeyFormat.d.ts +33 -1
- package/dist/crypto/KeyFormat.d.ts.map +1 -1
- package/dist/crypto/KeyFormat.js.map +1 -1
- package/dist/crypto/KeyWrap.d.ts +4 -3
- package/dist/crypto/KeyWrap.d.ts.map +1 -1
- package/dist/crypto/KeyWrap.js +2 -2
- package/dist/crypto/KeyWrap.js.map +1 -1
- package/dist/crypto/Mac.d.ts +2 -1
- package/dist/crypto/Mac.d.ts.map +1 -1
- package/dist/crypto/Mac.js +2 -2
- package/dist/crypto/Mac.js.map +1 -1
- package/dist/crypto/Signature.d.ts +3 -2
- package/dist/crypto/Signature.d.ts.map +1 -1
- package/dist/crypto/Signature.js +2 -2
- package/dist/crypto/Signature.js.map +1 -1
- package/dist/crypto/WebCrypto.d.ts +19 -0
- package/dist/crypto/WebCrypto.d.ts.map +1 -1
- package/dist/crypto/WebCrypto.js.map +1 -1
- package/dist/crypto/internal/asymmetric.js.map +1 -1
- package/dist/crypto/internal/key.js +3 -2
- package/dist/crypto/internal/key.js.map +1 -1
- package/dist/encoding/Base64Url.d.ts.map +1 -1
- package/dist/encoding/Base64Url.js +26 -3
- package/dist/encoding/Base64Url.js.map +1 -1
- package/dist/encoding/Ndjson.d.ts +5 -4
- package/dist/encoding/Ndjson.d.ts.map +1 -1
- package/dist/encoding/Ndjson.js +6 -5
- package/dist/encoding/Ndjson.js.map +1 -1
- package/dist/encoding/Sse.d.ts +3 -1
- package/dist/encoding/Sse.d.ts.map +1 -1
- package/dist/encoding/Sse.js +5 -3
- package/dist/encoding/Sse.js.map +1 -1
- package/dist/eventlog/EventLog.d.ts +7 -0
- package/dist/eventlog/EventLog.d.ts.map +1 -1
- package/dist/eventlog/EventLog.js +7 -0
- package/dist/eventlog/EventLog.js.map +1 -1
- package/dist/eventlog/EventLogServer.d.ts +7 -1
- package/dist/eventlog/EventLogServer.d.ts.map +1 -1
- package/dist/eventlog/EventLogServer.js +27 -12
- package/dist/eventlog/EventLogServer.js.map +1 -1
- package/dist/eventlog/EventLogServerEncrypted.d.ts +10 -0
- package/dist/eventlog/EventLogServerEncrypted.d.ts.map +1 -1
- package/dist/eventlog/EventLogServerEncrypted.js.map +1 -1
- package/dist/eventlog/EventLogServerUnencrypted.d.ts +17 -0
- package/dist/eventlog/EventLogServerUnencrypted.d.ts.map +1 -1
- package/dist/eventlog/EventLogServerUnencrypted.js +14 -2
- package/dist/eventlog/EventLogServerUnencrypted.js.map +1 -1
- package/dist/eventlog/EventLogSessionAuth.d.ts +21 -0
- package/dist/eventlog/EventLogSessionAuth.d.ts.map +1 -1
- package/dist/eventlog/EventLogSessionAuth.js +22 -0
- package/dist/eventlog/EventLogSessionAuth.js.map +1 -1
- package/dist/graphql/GraphQLClient.d.ts +3 -1
- package/dist/graphql/GraphQLClient.d.ts.map +1 -1
- package/dist/graphql/GraphQLClient.js.map +1 -1
- package/dist/graphql/GraphQLClientError.d.ts +14 -9
- package/dist/graphql/GraphQLClientError.d.ts.map +1 -1
- package/dist/graphql/GraphQLClientError.js +14 -21
- package/dist/graphql/GraphQLClientError.js.map +1 -1
- package/dist/graphql/GraphQLProtocol.d.ts +12 -3
- package/dist/graphql/GraphQLProtocol.d.ts.map +1 -1
- package/dist/graphql/GraphQLProtocol.js +4 -1
- package/dist/graphql/GraphQLProtocol.js.map +1 -1
- package/dist/http/HttpClient.d.ts +189 -7
- package/dist/http/HttpClient.d.ts.map +1 -1
- package/dist/http/HttpClient.js +75 -2
- package/dist/http/HttpClient.js.map +1 -1
- package/dist/http/HttpServerRequest.d.ts.map +1 -1
- package/dist/http/HttpServerRequest.js +38 -22
- package/dist/http/HttpServerRequest.js.map +1 -1
- package/dist/http/internal/mimeTypes.d.ts +4 -1
- package/dist/http/internal/mimeTypes.d.ts.map +1 -1
- package/dist/http/internal/mimeTypes.js +4 -1
- package/dist/http/internal/mimeTypes.js.map +1 -1
- package/dist/http-api/HttpApiSchema.js +1 -1
- package/dist/http-api/HttpApiSchema.js.map +1 -1
- package/dist/internal/dateTime.js +49 -24
- package/dist/internal/dateTime.js.map +1 -1
- package/dist/internal/effect.js +10 -0
- package/dist/internal/effect.js.map +1 -1
- package/dist/internal/glob.js +234 -56
- package/dist/internal/glob.js.map +1 -1
- package/dist/internal/graphql.js +21 -7
- package/dist/internal/graphql.js.map +1 -1
- package/dist/internal/graphqlHeaders.d.ts +7 -0
- package/dist/internal/graphqlHeaders.d.ts.map +1 -1
- package/dist/internal/graphqlHeaders.js +11 -0
- package/dist/internal/graphqlHeaders.js.map +1 -1
- package/dist/internal/request.js +29 -42
- package/dist/internal/request.js.map +1 -1
- package/dist/internal/schema/fromJsonSchemaDocument.js +7 -8
- package/dist/internal/schema/fromJsonSchemaDocument.js.map +1 -1
- package/dist/internal/version.js +1 -1
- package/dist/jose/JoseError.d.ts +285 -0
- package/dist/jose/JoseError.d.ts.map +1 -0
- package/dist/jose/JoseError.js +269 -0
- package/dist/jose/JoseError.js.map +1 -0
- package/dist/jose/Jwe.d.ts +128 -0
- package/dist/jose/Jwe.d.ts.map +1 -0
- package/dist/jose/Jwe.js +134 -0
- package/dist/jose/Jwe.js.map +1 -0
- package/dist/jose/Jwk.d.ts +597 -0
- package/dist/jose/Jwk.d.ts.map +1 -0
- package/dist/jose/Jwk.js +503 -0
- package/dist/jose/Jwk.js.map +1 -0
- package/dist/jose/Jwks.d.ts +236 -0
- package/dist/jose/Jwks.d.ts.map +1 -0
- package/dist/jose/Jwks.js +306 -0
- package/dist/jose/Jwks.js.map +1 -0
- package/dist/jose/Jws.d.ts +177 -0
- package/dist/jose/Jws.d.ts.map +1 -0
- package/dist/jose/Jws.js +183 -0
- package/dist/jose/Jws.js.map +1 -0
- package/dist/jose/Jwt.d.ts +270 -0
- package/dist/jose/Jwt.d.ts.map +1 -0
- package/dist/jose/Jwt.js +293 -0
- package/dist/jose/Jwt.js.map +1 -0
- package/dist/jose/index.d.ts +51 -0
- package/dist/jose/index.d.ts.map +1 -0
- package/dist/jose/index.js +52 -0
- package/dist/jose/index.js.map +1 -0
- package/dist/jose/internal/compact.d.ts +2 -0
- package/dist/jose/internal/compact.d.ts.map +1 -0
- package/dist/jose/internal/compact.js +179 -0
- package/dist/jose/internal/compact.js.map +1 -0
- package/dist/net/Host.d.ts.map +1 -1
- package/dist/net/Host.js +5 -10
- package/dist/net/Host.js.map +1 -1
- package/dist/observability/OtlpSerialization.d.ts +1 -1
- package/dist/observability/OtlpSerialization.d.ts.map +1 -1
- package/dist/observability/OtlpSerialization.js +10 -4
- package/dist/observability/OtlpSerialization.js.map +1 -1
- package/dist/observability/internal/otlpProtobuf.js +3 -3
- package/dist/observability/internal/otlpProtobuf.js.map +1 -1
- package/dist/observability/internal/protobuf.js +6 -0
- package/dist/observability/internal/protobuf.js.map +1 -1
- package/dist/persistence/CircuitBreaker.d.ts +98 -38
- package/dist/persistence/CircuitBreaker.d.ts.map +1 -1
- package/dist/persistence/CircuitBreaker.js +67 -29
- package/dist/persistence/CircuitBreaker.js.map +1 -1
- package/dist/persistence/RateLimiter.d.ts +8 -0
- package/dist/persistence/RateLimiter.d.ts.map +1 -1
- package/dist/persistence/RateLimiter.js +63 -12
- package/dist/persistence/RateLimiter.js.map +1 -1
- package/dist/persistence/index.d.ts +1 -1
- package/dist/persistence/index.js +1 -1
- package/dist/reactivity/AtomRegistry.js +17 -7
- package/dist/reactivity/AtomRegistry.js.map +1 -1
- package/dist/rpc/Rpc.d.ts +1 -1
- package/dist/rpc/Rpc.d.ts.map +1 -1
- package/dist/rpc/Rpc.js.map +1 -1
- package/dist/rpc/RpcClient.d.ts +14 -2
- package/dist/rpc/RpcClient.d.ts.map +1 -1
- package/dist/rpc/RpcClient.js +38 -21
- package/dist/rpc/RpcClient.js.map +1 -1
- package/dist/rpc/RpcMessage.d.ts +3 -2
- package/dist/rpc/RpcMessage.d.ts.map +1 -1
- package/dist/rpc/RpcMessage.js.map +1 -1
- package/dist/sql/Migrator.d.ts +9 -1
- package/dist/sql/Migrator.d.ts.map +1 -1
- package/dist/sql/Migrator.js +18 -6
- package/dist/sql/Migrator.js.map +1 -1
- package/dist/sql/SqlClient.d.ts +38 -3
- package/dist/sql/SqlClient.d.ts.map +1 -1
- package/dist/sql/SqlClient.js +4 -3
- package/dist/sql/SqlClient.js.map +1 -1
- package/dist/sql/Statement.d.ts +41 -3
- package/dist/sql/Statement.d.ts.map +1 -1
- package/dist/sql/Statement.js +24 -20
- package/dist/sql/Statement.js.map +1 -1
- package/dist/workflow/Workflow.d.ts +4 -0
- package/dist/workflow/Workflow.d.ts.map +1 -1
- package/dist/workflow/Workflow.js.map +1 -1
- package/dist/workflow/WorkflowEngine.d.ts.map +1 -1
- package/dist/workflow/WorkflowEngine.js +5 -0
- package/dist/workflow/WorkflowEngine.js.map +1 -1
- package/package.json +5 -1
- package/src/BigDecimal.ts +170 -16
- package/src/Equal.ts +3 -3
- package/src/Hash.ts +5 -4
- package/src/Iterable.ts +8 -5
- package/src/Path.ts +6 -1
- package/src/Pool.ts +2 -1
- package/src/Schema.ts +3 -2
- package/src/SchemaRepresentation.ts +4 -2
- package/src/SchemaTransformation.ts +2 -2
- package/src/ai/McpClient.ts +488 -91
- package/src/ai/McpSchema.ts +119 -0
- package/src/ai/McpServer.ts +261 -38
- package/src/ai/Prompt.ts +16 -11
- package/src/ai/Tool.ts +5 -10
- package/src/ai/internal/mcpCore.ts +165 -12
- package/src/ai/internal/mcpProtocol/v2024_11_05.ts +3 -1
- package/src/ai/internal/mcpProtocol/v2025_03_26.ts +3 -1
- package/src/ai/internal/mcpProtocol/v2025_06_18.ts +3 -1
- package/src/ai/internal/mcpProtocol/v2025_11_25.ts +3 -1
- package/src/ai/internal/mcpProtocol/v2026_07_28.ts +41 -7
- package/src/ai/internal/mcpProtocol.ts +15 -0
- package/src/ai/internal/mcpRuntime.ts +6 -3
- package/src/ai/internal/mcpSkills.ts +480 -0
- package/src/cluster/ClusterWorkflowEngine.ts +22 -8
- package/src/cluster/Reply.ts +1 -1
- package/src/cluster/Sharding.ts +4 -1
- package/src/cluster/internal/entityManager.ts +24 -10
- package/src/crypto/Aead.ts +3 -3
- package/src/crypto/Cipher.ts +3 -3
- package/src/crypto/KeyAgreement.ts +4 -4
- package/src/crypto/KeyFormat.ts +30 -1
- package/src/crypto/KeyWrap.ts +6 -6
- package/src/crypto/Mac.ts +3 -3
- package/src/crypto/Signature.ts +4 -4
- package/src/crypto/WebCrypto.ts +20 -0
- package/src/crypto/internal/asymmetric.ts +2 -1
- package/src/crypto/internal/key.ts +12 -5
- package/src/encoding/Base64Url.ts +27 -3
- package/src/encoding/Ndjson.ts +6 -5
- package/src/encoding/Sse.ts +5 -3
- package/src/eventlog/EventLog.ts +7 -0
- package/src/eventlog/EventLogServer.ts +31 -12
- package/src/eventlog/EventLogServerEncrypted.ts +5 -0
- package/src/eventlog/EventLogServerUnencrypted.ts +19 -2
- package/src/eventlog/EventLogSessionAuth.ts +26 -0
- package/src/graphql/GraphQLClient.ts +3 -1
- package/src/graphql/GraphQLClientError.ts +15 -22
- package/src/graphql/GraphQLProtocol.ts +12 -3
- package/src/http/HttpClient.ts +210 -11
- package/src/http/HttpServerRequest.ts +61 -23
- package/src/http/internal/mimeTypes.ts +4 -1
- package/src/http-api/HttpApiSchema.ts +1 -1
- package/src/internal/dateTime.ts +54 -24
- package/src/internal/effect.ts +6 -0
- package/src/internal/glob.ts +279 -63
- package/src/internal/graphql.ts +27 -9
- package/src/internal/graphqlHeaders.ts +13 -0
- package/src/internal/request.ts +51 -58
- package/src/internal/schema/fromJsonSchemaDocument.ts +11 -10
- package/src/internal/version.ts +1 -1
- package/src/jose/JoseError.ts +329 -0
- package/src/jose/Jwe.ts +196 -0
- package/src/jose/Jwk.ts +777 -0
- package/src/jose/Jwks.ts +418 -0
- package/src/jose/Jws.ts +312 -0
- package/src/jose/Jwt.ts +493 -0
- package/src/jose/index.ts +58 -0
- package/src/jose/internal/compact.ts +195 -0
- package/src/net/Host.ts +5 -10
- package/src/observability/OtlpSerialization.ts +13 -5
- package/src/observability/internal/otlpProtobuf.ts +6 -6
- package/src/observability/internal/protobuf.ts +10 -0
- package/src/persistence/CircuitBreaker.ts +113 -48
- package/src/persistence/RateLimiter.ts +84 -15
- package/src/persistence/index.ts +1 -1
- package/src/reactivity/AtomRegistry.ts +19 -8
- package/src/rpc/Rpc.ts +3 -1
- package/src/rpc/RpcClient.ts +44 -24
- package/src/rpc/RpcMessage.ts +3 -2
- package/src/sql/Migrator.ts +35 -18
- package/src/sql/SqlClient.ts +43 -8
- package/src/sql/Statement.ts +52 -22
- package/src/workflow/Workflow.ts +4 -0
- package/src/workflow/WorkflowEngine.ts +5 -0
package/src/internal/request.ts
CHANGED
|
@@ -96,10 +96,10 @@ const makeBatchMap = (resolver: RequestResolver<any>): BatchMap => {
|
|
|
96
96
|
}
|
|
97
97
|
|
|
98
98
|
interface Batch {
|
|
99
|
-
key: unknown
|
|
100
|
-
context: Context.Context<never>
|
|
101
|
-
resolver: RequestResolver<any>
|
|
102
|
-
map: BatchMap
|
|
99
|
+
readonly key: unknown
|
|
100
|
+
readonly context: Context.Context<never>
|
|
101
|
+
readonly resolver: RequestResolver<any>
|
|
102
|
+
readonly map: BatchMap
|
|
103
103
|
readonly entrySet: Set<Request.Entry<any>>
|
|
104
104
|
readonly entries: Set<Request.Entry<any>>
|
|
105
105
|
readonly delayEffect: Effect<void>
|
|
@@ -107,9 +107,53 @@ interface Batch {
|
|
|
107
107
|
fiber?: Fiber<unknown, unknown> | undefined
|
|
108
108
|
}
|
|
109
109
|
|
|
110
|
-
const batchPool: Array<Batch> = []
|
|
111
110
|
const pendingBatches = new WeakMap<RequestResolver<any>, BatchMap>()
|
|
112
111
|
|
|
112
|
+
// Batches are built outside `addEntry` so their callbacks do not share a closure
|
|
113
|
+
// context with per-request entries, which would keep completed requests alive.
|
|
114
|
+
const makeBatch = (
|
|
115
|
+
key: unknown,
|
|
116
|
+
context: Context.Context<never>,
|
|
117
|
+
resolver: RequestResolver<any>,
|
|
118
|
+
map: BatchMap
|
|
119
|
+
): Batch => {
|
|
120
|
+
const batch: Batch = {
|
|
121
|
+
key,
|
|
122
|
+
context,
|
|
123
|
+
resolver,
|
|
124
|
+
map,
|
|
125
|
+
entrySet: new Set(),
|
|
126
|
+
entries: new Set(),
|
|
127
|
+
delayEffect: effect.flatMap(
|
|
128
|
+
withFiber((delayFiber) => {
|
|
129
|
+
// Reentrant delay callbacks may fill the batch and interrupt this fiber.
|
|
130
|
+
batch.fiber = delayFiber
|
|
131
|
+
return batch.resolver.delay
|
|
132
|
+
}),
|
|
133
|
+
(_) => runBatch(batch)
|
|
134
|
+
) as Effect<void>,
|
|
135
|
+
run: effect.onExit(
|
|
136
|
+
effect.suspend(() =>
|
|
137
|
+
batch.resolver.runAll(Array.from(batch.entries) as NonEmptyArray<Request.Entry<any>>, batch.key)
|
|
138
|
+
),
|
|
139
|
+
(exit) => {
|
|
140
|
+
for (const entry of batch.entrySet) {
|
|
141
|
+
entry.completeUnsafe(
|
|
142
|
+
exit._tag === "Success"
|
|
143
|
+
? exitDie(
|
|
144
|
+
new Error("Effect.request: RequestResolver did not complete request", { cause: entry.request })
|
|
145
|
+
)
|
|
146
|
+
: exit
|
|
147
|
+
)
|
|
148
|
+
}
|
|
149
|
+
batch.entries.clear()
|
|
150
|
+
return effect.void
|
|
151
|
+
}
|
|
152
|
+
)
|
|
153
|
+
}
|
|
154
|
+
return batch
|
|
155
|
+
}
|
|
156
|
+
|
|
113
157
|
const addEntry = <A extends Request.Any>(
|
|
114
158
|
resolver: RequestResolver<A>,
|
|
115
159
|
request: A,
|
|
@@ -146,58 +190,7 @@ const addEntry = <A extends Request.Any>(
|
|
|
146
190
|
batch = batchMap.get(key)
|
|
147
191
|
const isNewBatch = batch === undefined
|
|
148
192
|
if (!batch) {
|
|
149
|
-
|
|
150
|
-
batch = batchPool.pop()!
|
|
151
|
-
batch.key = key
|
|
152
|
-
batch.context = fiber.context
|
|
153
|
-
batch.resolver = resolver
|
|
154
|
-
batch.map = batchMap
|
|
155
|
-
} else {
|
|
156
|
-
const newBatch: Batch = {
|
|
157
|
-
key,
|
|
158
|
-
context: fiber.context,
|
|
159
|
-
resolver,
|
|
160
|
-
map: batchMap,
|
|
161
|
-
entrySet: new Set(),
|
|
162
|
-
entries: new Set(),
|
|
163
|
-
delayEffect: effect.flatMap(
|
|
164
|
-
withFiber((delayFiber) => {
|
|
165
|
-
// Reentrant delay callbacks may fill the batch and interrupt this fiber.
|
|
166
|
-
newBatch.fiber = delayFiber
|
|
167
|
-
return newBatch.resolver.delay
|
|
168
|
-
}),
|
|
169
|
-
(_) => runBatch(newBatch)
|
|
170
|
-
) as Effect<void>,
|
|
171
|
-
run: effect.onExit(
|
|
172
|
-
effect.suspend(() =>
|
|
173
|
-
newBatch.resolver.runAll(Array.from(newBatch.entries) as NonEmptyArray<Request.Entry<any>>, newBatch.key)
|
|
174
|
-
),
|
|
175
|
-
(exit) => {
|
|
176
|
-
for (const entry of newBatch.entrySet) {
|
|
177
|
-
entry.completeUnsafe(
|
|
178
|
-
exit._tag === "Success"
|
|
179
|
-
? exitDie(
|
|
180
|
-
new Error("Effect.request: RequestResolver did not complete request", { cause: entry.request })
|
|
181
|
-
)
|
|
182
|
-
: exit
|
|
183
|
-
)
|
|
184
|
-
}
|
|
185
|
-
newBatch.entries.clear()
|
|
186
|
-
if (batchPool.length < 128) {
|
|
187
|
-
newBatch.entrySet.clear()
|
|
188
|
-
newBatch.key = undefined
|
|
189
|
-
newBatch.context = undefined as any
|
|
190
|
-
newBatch.fiber = undefined
|
|
191
|
-
newBatch.resolver = undefined as any
|
|
192
|
-
newBatch.map = undefined as any
|
|
193
|
-
batchPool.push(newBatch)
|
|
194
|
-
}
|
|
195
|
-
return effect.void
|
|
196
|
-
}
|
|
197
|
-
)
|
|
198
|
-
}
|
|
199
|
-
batch = newBatch
|
|
200
|
-
}
|
|
193
|
+
batch = makeBatch(key, fiber.context, resolver, batchMap)
|
|
201
194
|
batchMap.set(key, batch)
|
|
202
195
|
}
|
|
203
196
|
|
|
@@ -205,7 +198,7 @@ const addEntry = <A extends Request.Any>(
|
|
|
205
198
|
batch.entries.add(entry)
|
|
206
199
|
if (isNewBatch) {
|
|
207
200
|
const delayFiber = effect.runForkWith(fiber.context)(batch.delayEffect, { scheduler: fiber.cache.scheduler })
|
|
208
|
-
// A synchronous delay may have already run
|
|
201
|
+
// A synchronous delay may have already run this batch.
|
|
209
202
|
if (completed || batchMap.get(key) !== batch) return entry
|
|
210
203
|
batch.fiber = delayFiber
|
|
211
204
|
}
|
|
@@ -755,8 +755,9 @@ export function fromJsonSchemaMultiDocument(
|
|
|
755
755
|
return out
|
|
756
756
|
}
|
|
757
757
|
case "Union":
|
|
758
|
-
|
|
759
|
-
|
|
758
|
+
// Finite primitive literal sets intersect without expansion, so they can be duplicated across branches.
|
|
759
|
+
return !isLiteralSet(representation) &&
|
|
760
|
+
(representation.types.length > 1 || representation.types.some(hasChoices))
|
|
760
761
|
case "Arrays":
|
|
761
762
|
return representation.elements.some((element) => hasChoices(element.type)) ||
|
|
762
763
|
representation.rest.some(hasChoices)
|
|
@@ -796,18 +797,20 @@ export function fromJsonSchemaMultiDocument(
|
|
|
796
797
|
return representation.literal
|
|
797
798
|
}
|
|
798
799
|
|
|
800
|
+
function isLiteralSet(union: ImportedUnion): boolean {
|
|
801
|
+
return (union.options?.mode ?? "anyOf") === "anyOf" &&
|
|
802
|
+
union.types.every((type) => literalValue(type) !== undefined)
|
|
803
|
+
}
|
|
804
|
+
|
|
799
805
|
function intersectLiteralUnions(
|
|
800
806
|
left: ImportedUnion,
|
|
801
807
|
right: ImportedUnion,
|
|
802
808
|
path: Path
|
|
803
809
|
): ImportedJsonSchemaRepresentation | undefined {
|
|
804
|
-
if ((left
|
|
805
|
-
|
|
806
|
-
}
|
|
807
|
-
const rightByValue = new Map<string | number | boolean | null, ImportedJsonSchemaRepresentation>()
|
|
810
|
+
if (!isLiteralSet(left) || !isLiteralSet(right)) return undefined
|
|
811
|
+
const rightByValue = new Map<ReturnType<typeof literalValue>, ImportedJsonSchemaRepresentation>()
|
|
808
812
|
for (const representation of right.types) {
|
|
809
813
|
const value = literalValue(representation)
|
|
810
|
-
if (value === undefined) return undefined
|
|
811
814
|
const previous = rightByValue.get(value)
|
|
812
815
|
rightByValue.set(value, {
|
|
813
816
|
...representation,
|
|
@@ -816,9 +819,7 @@ export function fromJsonSchemaMultiDocument(
|
|
|
816
819
|
}
|
|
817
820
|
const types: Array<ImportedJsonSchemaRepresentation> = []
|
|
818
821
|
for (const representation of left.types) {
|
|
819
|
-
const
|
|
820
|
-
if (value === undefined) return undefined
|
|
821
|
-
const match = rightByValue.get(value)
|
|
822
|
+
const match = rightByValue.get(literalValue(representation))
|
|
822
823
|
if (match !== undefined) types.push(intersect(representation, annotate(match, right), path))
|
|
823
824
|
}
|
|
824
825
|
return makeUnion(left, types)
|
package/src/internal/version.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/** @internal */
|
|
2
|
-
export const version = "4.1.
|
|
2
|
+
export const version = "4.1.1"
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `JoseError` returned by the `effect/jose` modules, and the reasons it
|
|
3
|
+
* carries.
|
|
4
|
+
*
|
|
5
|
+
* Every failure is one `JoseError` whose `reason` says what went wrong. Reasons
|
|
6
|
+
* for configuration, transport, and key-import problems carry a `description`
|
|
7
|
+
* and, when there is one, a `cause`. Reasons for failed authentication carry
|
|
8
|
+
* nothing: they never describe tokens, claims, plaintext, or key material.
|
|
9
|
+
*
|
|
10
|
+
* **Gotchas**
|
|
11
|
+
*
|
|
12
|
+
* Map the error before it reaches a client, for example
|
|
13
|
+
* `SignatureVerificationFailed` to a 401. Sending verification detail to
|
|
14
|
+
* clients is how oracles leak.
|
|
15
|
+
*
|
|
16
|
+
* @stability unstable
|
|
17
|
+
* @since 4.1.1
|
|
18
|
+
*/
|
|
19
|
+
import * as Data from "../Data.ts"
|
|
20
|
+
import * as Predicate from "../Predicate.ts"
|
|
21
|
+
|
|
22
|
+
const TypeId = "~effect/jose/JoseError" as const
|
|
23
|
+
const ReasonTypeId = "~effect/jose/JoseError/Reason" as const
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Reason for a malformed compact serialization, protected header, or payload,
|
|
27
|
+
* or for header parameters that are not supported, such as `crit`.
|
|
28
|
+
*
|
|
29
|
+
* @stability unstable
|
|
30
|
+
* @category errors
|
|
31
|
+
* @since 4.1.1
|
|
32
|
+
*/
|
|
33
|
+
export class InvalidToken extends Data.TaggedError("InvalidToken")<{
|
|
34
|
+
readonly description: string
|
|
35
|
+
}> {
|
|
36
|
+
/**
|
|
37
|
+
* Marks this value as a `JoseError` reason for runtime guards.
|
|
38
|
+
*
|
|
39
|
+
* @since 4.1.1
|
|
40
|
+
*/
|
|
41
|
+
readonly [ReasonTypeId] = ReasonTypeId
|
|
42
|
+
|
|
43
|
+
override get message(): string {
|
|
44
|
+
return this.description
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Reason for key material that cannot be imported, or that does not fit the
|
|
50
|
+
* selected algorithm or operation.
|
|
51
|
+
*
|
|
52
|
+
* @stability unstable
|
|
53
|
+
* @category errors
|
|
54
|
+
* @since 4.1.1
|
|
55
|
+
*/
|
|
56
|
+
export class InvalidKey extends Data.TaggedError("InvalidKey")<{
|
|
57
|
+
readonly description: string
|
|
58
|
+
readonly cause?: unknown
|
|
59
|
+
}> {
|
|
60
|
+
/**
|
|
61
|
+
* Marks this value as a `JoseError` reason for runtime guards.
|
|
62
|
+
*
|
|
63
|
+
* @since 4.1.1
|
|
64
|
+
*/
|
|
65
|
+
readonly [ReasonTypeId] = ReasonTypeId
|
|
66
|
+
|
|
67
|
+
override get message(): string {
|
|
68
|
+
return this.description
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Reason for an option or configuration value that the operation rejects
|
|
74
|
+
* before doing any work, such as a non-HTTPS key-set URL.
|
|
75
|
+
*
|
|
76
|
+
* @stability unstable
|
|
77
|
+
* @category errors
|
|
78
|
+
* @since 4.1.1
|
|
79
|
+
*/
|
|
80
|
+
export class InvalidArgument extends Data.TaggedError("InvalidArgument")<{
|
|
81
|
+
readonly description: string
|
|
82
|
+
readonly cause?: unknown
|
|
83
|
+
}> {
|
|
84
|
+
/**
|
|
85
|
+
* Marks this value as a `JoseError` reason for runtime guards.
|
|
86
|
+
*
|
|
87
|
+
* @since 4.1.1
|
|
88
|
+
*/
|
|
89
|
+
readonly [ReasonTypeId] = ReasonTypeId
|
|
90
|
+
|
|
91
|
+
override get message(): string {
|
|
92
|
+
return this.description
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Reason for a token whose protected `alg` is not the key's algorithm or is
|
|
98
|
+
* outside the allowlist.
|
|
99
|
+
*
|
|
100
|
+
* @stability unstable
|
|
101
|
+
* @category errors
|
|
102
|
+
* @since 4.1.1
|
|
103
|
+
*/
|
|
104
|
+
export class AlgorithmNotAllowed extends Data.TaggedError("AlgorithmNotAllowed")<{}> {
|
|
105
|
+
/**
|
|
106
|
+
* Marks this value as a `JoseError` reason for runtime guards.
|
|
107
|
+
*
|
|
108
|
+
* @since 4.1.1
|
|
109
|
+
*/
|
|
110
|
+
readonly [ReasonTypeId] = ReasonTypeId
|
|
111
|
+
|
|
112
|
+
override get message(): string {
|
|
113
|
+
return "The token algorithm is not allowed"
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Reason for a signature that does not authenticate the token.
|
|
119
|
+
*
|
|
120
|
+
* @stability unstable
|
|
121
|
+
* @category errors
|
|
122
|
+
* @since 4.1.1
|
|
123
|
+
*/
|
|
124
|
+
export class SignatureVerificationFailed extends Data.TaggedError("SignatureVerificationFailed")<{}> {
|
|
125
|
+
/**
|
|
126
|
+
* Marks this value as a `JoseError` reason for runtime guards.
|
|
127
|
+
*
|
|
128
|
+
* @since 4.1.1
|
|
129
|
+
*/
|
|
130
|
+
readonly [ReasonTypeId] = ReasonTypeId
|
|
131
|
+
|
|
132
|
+
override get message(): string {
|
|
133
|
+
return "Could not verify the signature"
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Reason for ciphertext that fails authenticated decryption.
|
|
139
|
+
*
|
|
140
|
+
* @stability unstable
|
|
141
|
+
* @category errors
|
|
142
|
+
* @since 4.1.1
|
|
143
|
+
*/
|
|
144
|
+
export class DecryptionFailed extends Data.TaggedError("DecryptionFailed")<{}> {
|
|
145
|
+
/**
|
|
146
|
+
* Marks this value as a `JoseError` reason for runtime guards.
|
|
147
|
+
*
|
|
148
|
+
* @since 4.1.1
|
|
149
|
+
*/
|
|
150
|
+
readonly [ReasonTypeId] = ReasonTypeId
|
|
151
|
+
|
|
152
|
+
override get message(): string {
|
|
153
|
+
return "Could not decrypt the token"
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Reason for a key set with no key matching the algorithm and key id.
|
|
159
|
+
*
|
|
160
|
+
* @stability unstable
|
|
161
|
+
* @category errors
|
|
162
|
+
* @since 4.1.1
|
|
163
|
+
*/
|
|
164
|
+
export class KeyNotFound extends Data.TaggedError("KeyNotFound")<{}> {
|
|
165
|
+
/**
|
|
166
|
+
* Marks this value as a `JoseError` reason for runtime guards.
|
|
167
|
+
*
|
|
168
|
+
* @since 4.1.1
|
|
169
|
+
*/
|
|
170
|
+
readonly [ReasonTypeId] = ReasonTypeId
|
|
171
|
+
|
|
172
|
+
override get message(): string {
|
|
173
|
+
return "No key matches the algorithm and key id"
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Reason for a key set with more than one key matching the algorithm and key
|
|
179
|
+
* id.
|
|
180
|
+
*
|
|
181
|
+
* @stability unstable
|
|
182
|
+
* @category errors
|
|
183
|
+
* @since 4.1.1
|
|
184
|
+
*/
|
|
185
|
+
export class AmbiguousKey extends Data.TaggedError("AmbiguousKey")<{}> {
|
|
186
|
+
/**
|
|
187
|
+
* Marks this value as a `JoseError` reason for runtime guards.
|
|
188
|
+
*
|
|
189
|
+
* @since 4.1.1
|
|
190
|
+
*/
|
|
191
|
+
readonly [ReasonTypeId] = ReasonTypeId
|
|
192
|
+
|
|
193
|
+
override get message(): string {
|
|
194
|
+
return "More than one key matches the algorithm and key id"
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Reason for a remote key set that cannot be fetched or read, is cooling down
|
|
200
|
+
* after a failed refresh, or belongs to a closed layer.
|
|
201
|
+
*
|
|
202
|
+
* @stability unstable
|
|
203
|
+
* @category errors
|
|
204
|
+
* @since 4.1.1
|
|
205
|
+
*/
|
|
206
|
+
export class KeySetUnavailable extends Data.TaggedError("KeySetUnavailable")<{
|
|
207
|
+
readonly description: string
|
|
208
|
+
readonly cause?: unknown
|
|
209
|
+
}> {
|
|
210
|
+
/**
|
|
211
|
+
* Marks this value as a `JoseError` reason for runtime guards.
|
|
212
|
+
*
|
|
213
|
+
* @since 4.1.1
|
|
214
|
+
*/
|
|
215
|
+
readonly [ReasonTypeId] = ReasonTypeId
|
|
216
|
+
|
|
217
|
+
override get message(): string {
|
|
218
|
+
return this.description
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Reason for a registered claim or `typ` header that is missing, malformed,
|
|
224
|
+
* different from the expected value, or outside its validity window.
|
|
225
|
+
*
|
|
226
|
+
* @stability unstable
|
|
227
|
+
* @category errors
|
|
228
|
+
* @since 4.1.1
|
|
229
|
+
*/
|
|
230
|
+
export class ClaimValidationFailed extends Data.TaggedError("ClaimValidationFailed")<{
|
|
231
|
+
readonly claim: "iss" | "sub" | "aud" | "exp" | "nbf" | "iat" | "jti" | "typ"
|
|
232
|
+
readonly reason: "invalid" | "missing" | "mismatch" | "expired" | "notYetValid" | "tooOld" | "future"
|
|
233
|
+
}> {
|
|
234
|
+
/**
|
|
235
|
+
* Marks this value as a `JoseError` reason for runtime guards.
|
|
236
|
+
*
|
|
237
|
+
* @since 4.1.1
|
|
238
|
+
*/
|
|
239
|
+
readonly [ReasonTypeId] = ReasonTypeId
|
|
240
|
+
|
|
241
|
+
override get message(): string {
|
|
242
|
+
return `The ${this.claim} claim failed validation: ${this.reason}`
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Union of the reasons carried by `JoseError`.
|
|
248
|
+
*
|
|
249
|
+
* @stability unstable
|
|
250
|
+
* @category errors
|
|
251
|
+
* @since 4.1.1
|
|
252
|
+
*/
|
|
253
|
+
export type JoseErrorReason =
|
|
254
|
+
| InvalidToken
|
|
255
|
+
| InvalidKey
|
|
256
|
+
| InvalidArgument
|
|
257
|
+
| AlgorithmNotAllowed
|
|
258
|
+
| SignatureVerificationFailed
|
|
259
|
+
| DecryptionFailed
|
|
260
|
+
| KeyNotFound
|
|
261
|
+
| AmbiguousKey
|
|
262
|
+
| KeySetUnavailable
|
|
263
|
+
| ClaimValidationFailed
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Error returned by the `effect/jose` modules.
|
|
267
|
+
*
|
|
268
|
+
* **Example** (Rejecting a token with a bad signature)
|
|
269
|
+
*
|
|
270
|
+
* ```ts import.meta.vitest
|
|
271
|
+
* import { Effect } from "effect"
|
|
272
|
+
* import { JoseError } from "effect/jose"
|
|
273
|
+
*
|
|
274
|
+
* const verify = Effect.fail(
|
|
275
|
+
* new JoseError.JoseError({ reason: new JoseError.SignatureVerificationFailed() })
|
|
276
|
+
* )
|
|
277
|
+
*
|
|
278
|
+
* const program = verify.pipe(
|
|
279
|
+
* Effect.catchReason("JoseError", "SignatureVerificationFailed", () => Effect.succeed("rejected"))
|
|
280
|
+
* )
|
|
281
|
+
*
|
|
282
|
+
* await Effect.runPromise(program) // => "rejected"
|
|
283
|
+
* ```
|
|
284
|
+
*
|
|
285
|
+
* @see {@link isJoseError} for narrowing unknown values
|
|
286
|
+
*
|
|
287
|
+
* @stability unstable
|
|
288
|
+
* @category errors
|
|
289
|
+
* @since 4.1.1
|
|
290
|
+
*/
|
|
291
|
+
export class JoseError extends Data.TaggedError("JoseError")<{
|
|
292
|
+
readonly reason: JoseErrorReason
|
|
293
|
+
}> {
|
|
294
|
+
/**
|
|
295
|
+
* Marks this value as a `JoseError` for runtime guards.
|
|
296
|
+
*
|
|
297
|
+
* @since 4.1.1
|
|
298
|
+
*/
|
|
299
|
+
readonly [TypeId] = TypeId
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* The reason's cause, when it has one.
|
|
303
|
+
*
|
|
304
|
+
* @since 4.1.1
|
|
305
|
+
*/
|
|
306
|
+
override readonly cause: unknown = "cause" in this.reason ? this.reason.cause : undefined
|
|
307
|
+
|
|
308
|
+
override get message(): string {
|
|
309
|
+
return this.reason.message
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* Checks whether a value is a `JoseError`.
|
|
315
|
+
*
|
|
316
|
+
* @stability unstable
|
|
317
|
+
* @category guards
|
|
318
|
+
* @since 4.1.1
|
|
319
|
+
*/
|
|
320
|
+
export const isJoseError = (u: unknown): u is JoseError => Predicate.hasProperty(u, TypeId)
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Checks whether a value is one of the reasons carried by `JoseError`.
|
|
324
|
+
*
|
|
325
|
+
* @stability unstable
|
|
326
|
+
* @category guards
|
|
327
|
+
* @since 4.1.1
|
|
328
|
+
*/
|
|
329
|
+
export const isJoseErrorReason = (u: unknown): u is JoseErrorReason => Predicate.hasProperty(u, ReasonTypeId)
|