effect 4.0.7 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/BigDecimal.d.ts.map +1 -1
- package/dist/BigDecimal.js +3 -0
- package/dist/BigDecimal.js.map +1 -1
- package/dist/Channel.d.ts +12 -6
- package/dist/Channel.d.ts.map +1 -1
- package/dist/Channel.js +9 -3
- package/dist/Channel.js.map +1 -1
- package/dist/Config.d.ts +7 -1
- package/dist/Config.d.ts.map +1 -1
- package/dist/Config.js.map +1 -1
- package/dist/Context.d.ts +18 -1
- package/dist/Context.d.ts.map +1 -1
- package/dist/Context.js +27 -8
- package/dist/Context.js.map +1 -1
- package/dist/Cron.d.ts +81 -11
- package/dist/Cron.d.ts.map +1 -1
- package/dist/Cron.js +101 -26
- package/dist/Cron.js.map +1 -1
- package/dist/Duration.d.ts +78 -0
- package/dist/Duration.d.ts.map +1 -1
- package/dist/Duration.js +123 -0
- package/dist/Duration.js.map +1 -1
- package/dist/Effect.d.ts +164 -7
- package/dist/Effect.d.ts.map +1 -1
- package/dist/Effect.js +11 -1
- package/dist/Effect.js.map +1 -1
- package/dist/FileSystem.d.ts +59 -4
- package/dist/FileSystem.d.ts.map +1 -1
- package/dist/FileSystem.js +9 -2
- package/dist/FileSystem.js.map +1 -1
- package/dist/Glob.d.ts +165 -0
- package/dist/Glob.d.ts.map +1 -0
- package/dist/Glob.js +127 -0
- package/dist/Glob.js.map +1 -0
- package/dist/Match.d.ts +86 -0
- package/dist/Match.d.ts.map +1 -1
- package/dist/Match.js +72 -0
- package/dist/Match.js.map +1 -1
- package/dist/Pool.d.ts +51 -0
- package/dist/Pool.d.ts.map +1 -1
- package/dist/Pool.js +59 -9
- package/dist/Pool.js.map +1 -1
- package/dist/Random.d.ts.map +1 -1
- package/dist/Random.js +3 -3
- package/dist/Random.js.map +1 -1
- package/dist/RcMap.d.ts.map +1 -1
- package/dist/RcMap.js +8 -2
- package/dist/RcMap.js.map +1 -1
- package/dist/Schedule.d.ts +18 -1
- package/dist/Schedule.d.ts.map +1 -1
- package/dist/Schedule.js +7 -2
- package/dist/Schedule.js.map +1 -1
- package/dist/Schema.d.ts +666 -41
- package/dist/Schema.d.ts.map +1 -1
- package/dist/Schema.js +650 -0
- package/dist/Schema.js.map +1 -1
- package/dist/SchemaGetter.d.ts +6 -1
- package/dist/SchemaGetter.d.ts.map +1 -1
- package/dist/SchemaGetter.js +22 -11
- package/dist/SchemaGetter.js.map +1 -1
- package/dist/SchemaRepresentation.d.ts +14 -0
- package/dist/SchemaRepresentation.d.ts.map +1 -1
- package/dist/SchemaRepresentation.js +16 -0
- package/dist/SchemaRepresentation.js.map +1 -1
- package/dist/SchemaTransformation.d.ts +8 -3
- package/dist/SchemaTransformation.d.ts.map +1 -1
- package/dist/SchemaTransformation.js +6 -3
- package/dist/SchemaTransformation.js.map +1 -1
- package/dist/ScopedCache.d.ts.map +1 -1
- package/dist/ScopedCache.js +5 -7
- package/dist/ScopedCache.js.map +1 -1
- package/dist/Semaphore.d.ts +130 -0
- package/dist/Semaphore.d.ts.map +1 -1
- package/dist/Semaphore.js +40 -0
- package/dist/Semaphore.js.map +1 -1
- package/dist/Stream.d.ts +13 -4
- package/dist/Stream.d.ts.map +1 -1
- package/dist/Stream.js +9 -0
- package/dist/Stream.js.map +1 -1
- package/dist/Terminal.d.ts +18 -1
- package/dist/Terminal.d.ts.map +1 -1
- package/dist/Terminal.js +1 -1
- package/dist/Terminal.js.map +1 -1
- package/dist/ai/AiError.d.ts +43 -116
- package/dist/ai/AiError.d.ts.map +1 -1
- package/dist/ai/AiError.js +53 -72
- package/dist/ai/AiError.js.map +1 -1
- package/dist/ai/Decision.d.ts +196 -15
- package/dist/ai/Decision.d.ts.map +1 -1
- package/dist/ai/Decision.js +130 -0
- package/dist/ai/Decision.js.map +1 -1
- package/dist/ai/DecisionModel.d.ts +54 -13
- package/dist/ai/DecisionModel.d.ts.map +1 -1
- package/dist/ai/DecisionModel.js +123 -12
- package/dist/ai/DecisionModel.js.map +1 -1
- package/dist/ai/McpServer.d.ts +630 -29
- package/dist/ai/McpServer.d.ts.map +1 -1
- package/dist/ai/McpServer.js +562 -116
- package/dist/ai/McpServer.js.map +1 -1
- package/dist/ai/McpTest.d.ts +130 -0
- package/dist/ai/McpTest.d.ts.map +1 -0
- package/dist/ai/McpTest.js +237 -0
- package/dist/ai/McpTest.js.map +1 -0
- package/dist/ai/Response.d.ts +1 -25
- package/dist/ai/Response.d.ts.map +1 -1
- package/dist/ai/Response.js +1 -10
- package/dist/ai/Response.js.map +1 -1
- package/dist/ai/Tool.d.ts +19 -1
- package/dist/ai/Tool.d.ts.map +1 -1
- package/dist/ai/Tool.js.map +1 -1
- package/dist/ai/index.d.ts +5 -0
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +5 -0
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/internal/mcpCore.js +17 -12
- package/dist/ai/internal/mcpCore.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2024_11_05.js +4 -5
- package/dist/ai/internal/mcpProtocol/v2024_11_05.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2025_03_26.js +4 -5
- package/dist/ai/internal/mcpProtocol/v2025_03_26.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2025_06_18.js +4 -5
- package/dist/ai/internal/mcpProtocol/v2025_06_18.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2025_11_25.js +4 -5
- package/dist/ai/internal/mcpProtocol/v2025_11_25.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2026_07_28.js +18 -10
- package/dist/ai/internal/mcpProtocol/v2026_07_28.js.map +1 -1
- package/dist/ai/internal/mcpProtocol.js +13 -0
- package/dist/ai/internal/mcpProtocol.js.map +1 -1
- package/dist/ai/internal/mcpRuntime.js +5 -3
- package/dist/ai/internal/mcpRuntime.js.map +1 -1
- package/dist/ai/internal/mcpStatefulRuntime.js +6 -1
- package/dist/ai/internal/mcpStatefulRuntime.js.map +1 -1
- package/dist/cli/Argument.d.ts +6 -0
- package/dist/cli/Argument.d.ts.map +1 -1
- package/dist/cli/Argument.js +2 -0
- package/dist/cli/Argument.js.map +1 -1
- package/dist/cli/CliOutput.d.ts +65 -1
- package/dist/cli/CliOutput.d.ts.map +1 -1
- package/dist/cli/CliOutput.js +94 -37
- package/dist/cli/CliOutput.js.map +1 -1
- package/dist/cli/Command.d.ts +23 -0
- package/dist/cli/Command.d.ts.map +1 -1
- package/dist/cli/Command.js +8 -0
- package/dist/cli/Command.js.map +1 -1
- package/dist/cli/Flag.d.ts +107 -0
- package/dist/cli/Flag.d.ts.map +1 -1
- package/dist/cli/Flag.js +37 -0
- package/dist/cli/Flag.js.map +1 -1
- package/dist/cli/HelpDoc.d.ts +15 -1
- package/dist/cli/HelpDoc.d.ts.map +1 -1
- package/dist/cli/Param.d.ts +6 -0
- package/dist/cli/Param.d.ts.map +1 -1
- package/dist/cli/Param.js +2 -0
- package/dist/cli/Param.js.map +1 -1
- package/dist/cli/Primitive.d.ts +14 -0
- package/dist/cli/Primitive.d.ts.map +1 -1
- package/dist/cli/Primitive.js +15 -1
- package/dist/cli/Primitive.js.map +1 -1
- package/dist/cli/Prompt.d.ts +1 -0
- package/dist/cli/Prompt.d.ts.map +1 -1
- package/dist/cli/Prompt.js +1 -0
- package/dist/cli/Prompt.js.map +1 -1
- package/dist/cli/internal/help.d.ts.map +1 -1
- package/dist/cli/internal/help.js +17 -10
- package/dist/cli/internal/help.js.map +1 -1
- package/dist/cluster/Sharding.d.ts.map +1 -1
- package/dist/cluster/Sharding.js +90 -28
- package/dist/cluster/Sharding.js.map +1 -1
- package/dist/cluster/ShardingConfig.d.ts +72 -6
- package/dist/cluster/ShardingConfig.d.ts.map +1 -1
- package/dist/cluster/ShardingConfig.js +4 -0
- package/dist/cluster/ShardingConfig.js.map +1 -1
- package/dist/cluster/SingleRunner.d.ts +3 -3
- package/dist/cluster/SingleRunner.d.ts.map +1 -1
- package/dist/cluster/SingleRunner.js +1 -1
- package/dist/cluster/SqlMessageStorage.d.ts +37 -6
- package/dist/cluster/SqlMessageStorage.d.ts.map +1 -1
- package/dist/cluster/SqlMessageStorage.js +34 -7
- package/dist/cluster/SqlMessageStorage.js.map +1 -1
- package/dist/cluster/SqlRunnerStorage.d.ts.map +1 -1
- package/dist/cluster/SqlRunnerStorage.js +23 -8
- package/dist/cluster/SqlRunnerStorage.js.map +1 -1
- package/dist/crypto/Aead.d.ts +322 -0
- package/dist/crypto/Aead.d.ts.map +1 -0
- package/dist/crypto/Aead.js +331 -0
- package/dist/crypto/Aead.js.map +1 -0
- package/dist/crypto/Cipher.d.ts +235 -0
- package/dist/crypto/Cipher.d.ts.map +1 -0
- package/dist/crypto/Cipher.js +233 -0
- package/dist/crypto/Cipher.js.map +1 -0
- package/dist/crypto/CryptoError.d.ts +212 -0
- package/dist/crypto/CryptoError.d.ts.map +1 -0
- package/dist/crypto/CryptoError.js +202 -0
- package/dist/crypto/CryptoError.js.map +1 -0
- package/dist/crypto/Digest.d.ts +143 -0
- package/dist/crypto/Digest.d.ts.map +1 -0
- package/dist/crypto/Digest.js +146 -0
- package/dist/crypto/Digest.js.map +1 -0
- package/dist/crypto/Kdf.d.ts +220 -0
- package/dist/crypto/Kdf.d.ts.map +1 -0
- package/dist/crypto/Kdf.js +212 -0
- package/dist/crypto/Kdf.js.map +1 -0
- package/dist/crypto/KeyAgreement.d.ts +323 -0
- package/dist/crypto/KeyAgreement.d.ts.map +1 -0
- package/dist/crypto/KeyAgreement.js +303 -0
- package/dist/crypto/KeyAgreement.js.map +1 -0
- package/dist/crypto/KeyFormat.d.ts +309 -0
- package/dist/crypto/KeyFormat.d.ts.map +1 -0
- package/dist/crypto/KeyFormat.js +556 -0
- package/dist/crypto/KeyFormat.js.map +1 -0
- package/dist/crypto/KeyWrap.d.ts +389 -0
- package/dist/crypto/KeyWrap.d.ts.map +1 -0
- package/dist/crypto/KeyWrap.js +381 -0
- package/dist/crypto/KeyWrap.js.map +1 -0
- package/dist/crypto/Mac.d.ts +277 -0
- package/dist/crypto/Mac.d.ts.map +1 -0
- package/dist/crypto/Mac.js +288 -0
- package/dist/crypto/Mac.js.map +1 -0
- package/dist/crypto/SecureRandom.d.ts +340 -0
- package/dist/crypto/SecureRandom.d.ts.map +1 -0
- package/dist/crypto/SecureRandom.js +257 -0
- package/dist/crypto/SecureRandom.js.map +1 -0
- package/dist/crypto/Signature.d.ts +448 -0
- package/dist/crypto/Signature.d.ts.map +1 -0
- package/dist/crypto/Signature.js +484 -0
- package/dist/crypto/Signature.js.map +1 -0
- package/dist/crypto/WebCrypto.d.ts +61 -0
- package/dist/crypto/WebCrypto.d.ts.map +1 -0
- package/dist/crypto/WebCrypto.js +63 -0
- package/dist/crypto/WebCrypto.js.map +1 -0
- package/dist/crypto/index.d.ts +65 -0
- package/dist/crypto/index.d.ts.map +1 -0
- package/dist/crypto/index.js +66 -0
- package/dist/crypto/index.js.map +1 -0
- package/dist/crypto/internal/asymmetric.d.ts +2 -0
- package/dist/crypto/internal/asymmetric.d.ts.map +1 -0
- package/dist/crypto/internal/asymmetric.js +210 -0
- package/dist/crypto/internal/asymmetric.js.map +1 -0
- package/dist/crypto/internal/chacha.d.ts +46 -0
- package/dist/crypto/internal/chacha.d.ts.map +1 -0
- package/dist/crypto/internal/chacha.js +885 -0
- package/dist/crypto/internal/chacha.js.map +1 -0
- package/dist/crypto/internal/der.d.ts +6 -0
- package/dist/crypto/internal/der.d.ts.map +1 -0
- package/dist/crypto/internal/der.js +86 -0
- package/dist/crypto/internal/der.js.map +1 -0
- package/dist/crypto/internal/digest.d.ts +2 -0
- package/dist/crypto/internal/digest.d.ts.map +1 -0
- package/dist/crypto/internal/digest.js +15 -0
- package/dist/crypto/internal/digest.js.map +1 -0
- package/dist/crypto/internal/key.d.ts +2 -0
- package/dist/crypto/internal/key.d.ts.map +1 -0
- package/dist/crypto/internal/key.js +170 -0
- package/dist/crypto/internal/key.js.map +1 -0
- package/dist/crypto/internal/md5.d.ts +39 -0
- package/dist/crypto/internal/md5.d.ts.map +1 -0
- package/dist/crypto/internal/md5.js +179 -0
- package/dist/crypto/internal/md5.js.map +1 -0
- package/dist/crypto/internal/webCrypto.d.ts +2 -0
- package/dist/crypto/internal/webCrypto.d.ts.map +1 -0
- package/dist/crypto/internal/webCrypto.js +111 -0
- package/dist/crypto/internal/webCrypto.js.map +1 -0
- package/dist/encoding/Base64Url.d.ts.map +1 -1
- package/dist/encoding/Base64Url.js +3 -2
- package/dist/encoding/Base64Url.js.map +1 -1
- package/dist/encoding/Csv.d.ts +608 -0
- package/dist/encoding/Csv.d.ts.map +1 -0
- package/dist/encoding/Csv.js +718 -0
- package/dist/encoding/Csv.js.map +1 -0
- package/dist/encoding/Hex.d.ts +3 -2
- package/dist/encoding/Hex.d.ts.map +1 -1
- package/dist/encoding/Hex.js +3 -2
- package/dist/encoding/Hex.js.map +1 -1
- package/dist/encoding/SchemaBinary.d.ts.map +1 -1
- package/dist/encoding/SchemaBinary.js +42 -4
- package/dist/encoding/SchemaBinary.js.map +1 -1
- package/dist/encoding/Toml.d.ts +17 -3
- package/dist/encoding/Toml.d.ts.map +1 -1
- package/dist/encoding/Toml.js +104 -16
- package/dist/encoding/Toml.js.map +1 -1
- package/dist/encoding/Yaml.d.ts +8 -1
- package/dist/encoding/Yaml.d.ts.map +1 -1
- package/dist/encoding/Yaml.js +54 -18
- package/dist/encoding/Yaml.js.map +1 -1
- package/dist/encoding/index.d.ts +5 -0
- package/dist/encoding/index.d.ts.map +1 -1
- package/dist/encoding/index.js +5 -0
- package/dist/encoding/index.js.map +1 -1
- package/dist/eventlog/EventJournal.d.ts.map +1 -1
- package/dist/eventlog/EventJournal.js +6 -3
- package/dist/eventlog/EventJournal.js.map +1 -1
- package/dist/eventlog/EventLog.d.ts +119 -4
- package/dist/eventlog/EventLog.d.ts.map +1 -1
- package/dist/eventlog/EventLog.js +200 -12
- package/dist/eventlog/EventLog.js.map +1 -1
- package/dist/eventlog/EventLogEncryption.d.ts +41 -4
- package/dist/eventlog/EventLogEncryption.d.ts.map +1 -1
- package/dist/eventlog/EventLogEncryption.js +83 -64
- package/dist/eventlog/EventLogEncryption.js.map +1 -1
- package/dist/eventlog/EventLogMessage.d.ts +279 -0
- package/dist/eventlog/EventLogMessage.d.ts.map +1 -1
- package/dist/eventlog/EventLogMessage.js +217 -1
- package/dist/eventlog/EventLogMessage.js.map +1 -1
- package/dist/eventlog/EventLogRemote.d.ts +200 -28
- package/dist/eventlog/EventLogRemote.d.ts.map +1 -1
- package/dist/eventlog/EventLogRemote.js +186 -16
- package/dist/eventlog/EventLogRemote.js.map +1 -1
- package/dist/eventlog/EventLogServer.d.ts +3 -0
- package/dist/eventlog/EventLogServer.d.ts.map +1 -1
- package/dist/eventlog/EventLogServer.js +18 -10
- package/dist/eventlog/EventLogServer.js.map +1 -1
- package/dist/eventlog/EventLogServerEncrypted.d.ts +326 -5
- package/dist/eventlog/EventLogServerEncrypted.d.ts.map +1 -1
- package/dist/eventlog/EventLogServerEncrypted.js +769 -14
- package/dist/eventlog/EventLogServerEncrypted.js.map +1 -1
- package/dist/eventlog/EventLogSessionAuth.d.ts +5 -3
- package/dist/eventlog/EventLogSessionAuth.d.ts.map +1 -1
- package/dist/eventlog/EventLogSessionAuth.js +41 -64
- package/dist/eventlog/EventLogSessionAuth.js.map +1 -1
- package/dist/eventlog/EventRow.d.ts +4 -0
- package/dist/eventlog/EventRow.d.ts.map +1 -1
- package/dist/eventlog/EventRow.js +12 -2
- package/dist/eventlog/EventRow.js.map +1 -1
- package/dist/eventlog/SqlEventJournal.js +2 -2
- package/dist/eventlog/SqlEventJournal.js.map +1 -1
- package/dist/eventlog/SqlEventLogServerEncrypted.d.ts +21 -5
- package/dist/eventlog/SqlEventLogServerEncrypted.d.ts.map +1 -1
- package/dist/eventlog/SqlEventLogServerEncrypted.js +1048 -113
- package/dist/eventlog/SqlEventLogServerEncrypted.js.map +1 -1
- package/dist/eventlog/SqlEventLogServerUnencrypted.js +2 -2
- package/dist/eventlog/SqlEventLogServerUnencrypted.js.map +1 -1
- package/dist/eventlog/internal/batches.d.ts +12 -0
- package/dist/eventlog/internal/batches.d.ts.map +1 -0
- package/dist/eventlog/internal/batches.js +26 -0
- package/dist/eventlog/internal/batches.js.map +1 -0
- package/dist/eventlog/internal/compaction.d.ts +38 -0
- package/dist/eventlog/internal/compaction.d.ts.map +1 -0
- package/dist/eventlog/internal/compaction.js +33 -0
- package/dist/eventlog/internal/compaction.js.map +1 -0
- package/dist/eventlog/internal/identityRootSecretDerivation.js +66 -67
- package/dist/eventlog/internal/identityRootSecretDerivation.js.map +1 -1
- package/dist/eventlog/internal/remoteCompaction.d.ts +31 -0
- package/dist/eventlog/internal/remoteCompaction.d.ts.map +1 -0
- package/dist/eventlog/internal/remoteCompaction.js +76 -0
- package/dist/eventlog/internal/remoteCompaction.js.map +1 -0
- package/dist/http/Cookies.d.ts +172 -0
- package/dist/http/Cookies.d.ts.map +1 -1
- package/dist/http/Cookies.js +143 -1
- package/dist/http/Cookies.js.map +1 -1
- package/dist/http/FetchHttpClient.d.ts +26 -2
- package/dist/http/FetchHttpClient.d.ts.map +1 -1
- package/dist/http/FetchHttpClient.js +78 -15
- package/dist/http/FetchHttpClient.js.map +1 -1
- package/dist/http/HttpClient.d.ts +79 -8
- package/dist/http/HttpClient.d.ts.map +1 -1
- package/dist/http/HttpClient.js +65 -5
- package/dist/http/HttpClient.js.map +1 -1
- package/dist/http/HttpClientRequest.d.ts +9 -5
- package/dist/http/HttpClientRequest.d.ts.map +1 -1
- package/dist/http/HttpClientRequest.js +2 -3
- package/dist/http/HttpClientRequest.js.map +1 -1
- package/dist/http/HttpClientResponse.d.ts.map +1 -1
- package/dist/http/HttpClientResponse.js +3 -2
- package/dist/http/HttpClientResponse.js.map +1 -1
- package/dist/http/HttpMethod.d.ts +7 -1
- package/dist/http/HttpMethod.d.ts.map +1 -1
- package/dist/http/HttpMethod.js +3 -8
- package/dist/http/HttpMethod.js.map +1 -1
- package/dist/http/HttpServerRequest.d.ts +5 -2
- package/dist/http/HttpServerRequest.d.ts.map +1 -1
- package/dist/http/HttpServerRequest.js +6 -17
- package/dist/http/HttpServerRequest.js.map +1 -1
- package/dist/http/HttpServerResponse.d.ts.map +1 -1
- package/dist/http/HttpServerResponse.js +3 -2
- package/dist/http/HttpServerResponse.js.map +1 -1
- package/dist/http/HttpTraceContext.d.ts +2 -1
- package/dist/http/HttpTraceContext.d.ts.map +1 -1
- package/dist/http/HttpTraceContext.js +7 -5
- package/dist/http/HttpTraceContext.js.map +1 -1
- package/dist/http/ProblemDetails.d.ts +96 -0
- package/dist/http/ProblemDetails.d.ts.map +1 -0
- package/dist/http/ProblemDetails.js +98 -0
- package/dist/http/ProblemDetails.js.map +1 -0
- package/dist/http/index.d.ts +5 -0
- package/dist/http/index.d.ts.map +1 -1
- package/dist/http/index.js +5 -0
- package/dist/http/index.js.map +1 -1
- package/dist/http/internal/decompression.js +3 -2
- package/dist/http/internal/decompression.js.map +1 -1
- package/dist/http/internal/urlParams.js +8 -0
- package/dist/http/internal/urlParams.js.map +1 -1
- package/dist/http-api/HttpApiBuilder.js +19 -5
- package/dist/http-api/HttpApiBuilder.js.map +1 -1
- package/dist/http-api/HttpApiClient.d.ts +63 -0
- package/dist/http-api/HttpApiClient.d.ts.map +1 -1
- package/dist/http-api/HttpApiClient.js +51 -0
- package/dist/http-api/HttpApiClient.js.map +1 -1
- package/dist/http-api/HttpApiEndpoint.d.ts.map +1 -1
- package/dist/http-api/HttpApiEndpoint.js +14 -5
- package/dist/http-api/HttpApiEndpoint.js.map +1 -1
- package/dist/http-api/HttpApiError.d.ts +185 -13
- package/dist/http-api/HttpApiError.d.ts.map +1 -1
- package/dist/http-api/HttpApiError.js +128 -0
- package/dist/http-api/HttpApiError.js.map +1 -1
- package/dist/http-api/HttpApiMiddleware.d.ts +64 -17
- package/dist/http-api/HttpApiMiddleware.d.ts.map +1 -1
- package/dist/http-api/HttpApiMiddleware.js +85 -1
- package/dist/http-api/HttpApiMiddleware.js.map +1 -1
- package/dist/http-api/HttpApiSchema.d.ts +76 -14
- package/dist/http-api/HttpApiSchema.d.ts.map +1 -1
- package/dist/http-api/HttpApiSchema.js +53 -0
- package/dist/http-api/HttpApiSchema.js.map +1 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/dist/internal/effect.js +25 -14
- package/dist/internal/effect.js.map +1 -1
- package/dist/internal/glob.d.ts +2 -0
- package/dist/internal/glob.d.ts.map +1 -0
- package/dist/internal/glob.js +630 -0
- package/dist/internal/glob.js.map +1 -0
- package/dist/internal/matcher.js +10 -0
- package/dist/internal/matcher.js.map +1 -1
- package/dist/internal/persistence.js +9 -0
- package/dist/internal/persistence.js.map +1 -1
- package/dist/internal/rcRef.js +4 -1
- package/dist/internal/rcRef.js.map +1 -1
- package/dist/internal/schema/toCodeDocument.js +6 -3
- package/dist/internal/schema/toCodeDocument.js.map +1 -1
- package/dist/internal/trie.js +42 -13
- package/dist/internal/trie.js.map +1 -1
- package/dist/internal/ulid.js +41 -0
- package/dist/internal/ulid.js.map +1 -1
- package/dist/internal/uuid.js +52 -8
- package/dist/internal/uuid.js.map +1 -1
- package/dist/internal/version.js +1 -1
- package/dist/observability/Otlp.d.ts +15 -4
- package/dist/observability/Otlp.d.ts.map +1 -1
- package/dist/observability/Otlp.js +10 -0
- package/dist/observability/Otlp.js.map +1 -1
- package/dist/observability/OtlpResource.d.ts +7 -0
- package/dist/observability/OtlpResource.d.ts.map +1 -1
- package/dist/observability/OtlpResource.js +11 -1
- package/dist/observability/OtlpResource.js.map +1 -1
- package/dist/persistence/KeyValueStore.d.ts +47 -2
- package/dist/persistence/KeyValueStore.d.ts.map +1 -1
- package/dist/persistence/KeyValueStore.js +129 -18
- package/dist/persistence/KeyValueStore.js.map +1 -1
- package/dist/persistence/PersistedQueue.d.ts +9 -0
- package/dist/persistence/PersistedQueue.d.ts.map +1 -1
- package/dist/persistence/PersistedQueue.js +94 -52
- package/dist/persistence/PersistedQueue.js.map +1 -1
- package/dist/persistence/Persistence.d.ts +10 -4
- package/dist/persistence/Persistence.d.ts.map +1 -1
- package/dist/persistence/Persistence.js +18 -11
- package/dist/persistence/Persistence.js.map +1 -1
- package/dist/process/ChildProcess.d.ts +207 -67
- package/dist/process/ChildProcess.d.ts.map +1 -1
- package/dist/process/ChildProcess.js +56 -158
- package/dist/process/ChildProcess.js.map +1 -1
- package/dist/process/ChildProcessSpawner.d.ts +5 -0
- package/dist/process/ChildProcessSpawner.d.ts.map +1 -1
- package/dist/process/ChildProcessSpawner.js.map +1 -1
- package/dist/process/CommandLine.d.ts +294 -0
- package/dist/process/CommandLine.d.ts.map +1 -0
- package/dist/process/CommandLine.js +481 -0
- package/dist/process/CommandLine.js.map +1 -0
- package/dist/process/index.d.ts +5 -0
- package/dist/process/index.d.ts.map +1 -1
- package/dist/process/index.js +5 -0
- package/dist/process/index.js.map +1 -1
- package/dist/reactivity/Atom.d.ts +2 -1
- package/dist/reactivity/Atom.d.ts.map +1 -1
- package/dist/reactivity/Atom.js +3 -4
- package/dist/reactivity/Atom.js.map +1 -1
- package/dist/reactivity/AtomRegistry.js.map +1 -1
- package/dist/rpc/RpcClient.d.ts +16 -1
- package/dist/rpc/RpcClient.d.ts.map +1 -1
- package/dist/rpc/RpcClient.js +50 -16
- package/dist/rpc/RpcClient.js.map +1 -1
- package/dist/rpc/RpcMessage.d.ts +10 -1
- package/dist/rpc/RpcMessage.d.ts.map +1 -1
- package/dist/rpc/RpcMessage.js +1 -0
- package/dist/rpc/RpcMessage.js.map +1 -1
- package/dist/rpc/RpcSerialization.d.ts.map +1 -1
- package/dist/rpc/RpcSerialization.js +6 -0
- package/dist/rpc/RpcSerialization.js.map +1 -1
- package/dist/rpc/RpcServer.d.ts +31 -0
- package/dist/rpc/RpcServer.d.ts.map +1 -1
- package/dist/rpc/RpcServer.js +139 -66
- package/dist/rpc/RpcServer.js.map +1 -1
- package/dist/schema/Model.d.ts +14 -0
- package/dist/schema/Model.d.ts.map +1 -1
- package/dist/schema/Model.js +18 -3
- package/dist/schema/Model.js.map +1 -1
- package/dist/sql/Migrator.d.ts +0 -19
- package/dist/sql/Migrator.d.ts.map +1 -1
- package/dist/sql/Migrator.js +3 -48
- package/dist/sql/Migrator.js.map +1 -1
- package/dist/sql/MigratorFileSystem.d.ts +21 -0
- package/dist/sql/MigratorFileSystem.d.ts.map +1 -0
- package/dist/sql/MigratorFileSystem.js +57 -0
- package/dist/sql/MigratorFileSystem.js.map +1 -0
- package/dist/sql/SqlClient.d.ts.map +1 -1
- package/dist/sql/SqlClient.js +5 -9
- package/dist/sql/SqlClient.js.map +1 -1
- package/dist/sql/Statement.d.ts +20 -6
- package/dist/sql/Statement.d.ts.map +1 -1
- package/dist/sql/Statement.js +0 -13
- package/dist/sql/Statement.js.map +1 -1
- package/dist/sql/index.js +1 -1
- package/dist/testing/index.d.ts +0 -5
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +0 -5
- package/dist/testing/index.js.map +1 -1
- package/dist/workflow/internal/crypto.js +9 -8
- package/dist/workflow/internal/crypto.js.map +1 -1
- package/package.json +3 -1
- package/src/BigDecimal.ts +3 -0
- package/src/Channel.ts +17 -11
- package/src/Config.ts +7 -1
- package/src/Context.ts +34 -10
- package/src/Cron.ts +178 -29
- package/src/Duration.ts +140 -0
- package/src/Effect.ts +914 -85
- package/src/FileSystem.ts +65 -4
- package/src/Glob.ts +205 -0
- package/src/Match.ts +127 -0
- package/src/Pool.ts +73 -15
- package/src/Random.ts +3 -3
- package/src/RcMap.ts +5 -1
- package/src/Schedule.ts +26 -3
- package/src/Schema.ts +1189 -62
- package/src/SchemaGetter.ts +27 -11
- package/src/SchemaRepresentation.ts +19 -0
- package/src/SchemaTransformation.ts +8 -3
- package/src/ScopedCache.ts +5 -9
- package/src/Semaphore.ts +141 -0
- package/src/Stream.ts +15 -6
- package/src/Terminal.ts +19 -1
- package/src/ai/AiError.ts +56 -80
- package/src/ai/Decision.ts +257 -6
- package/src/ai/DecisionModel.ts +171 -28
- package/src/ai/McpServer.ts +1269 -286
- package/src/ai/McpTest.ts +380 -0
- package/src/ai/Response.ts +2 -22
- package/src/ai/Tool.ts +27 -8
- package/src/ai/index.ts +6 -0
- package/src/ai/internal/mcpCore.ts +78 -44
- package/src/ai/internal/mcpProtocol/v2024_11_05.ts +4 -7
- package/src/ai/internal/mcpProtocol/v2025_03_26.ts +4 -7
- package/src/ai/internal/mcpProtocol/v2025_06_18.ts +4 -7
- package/src/ai/internal/mcpProtocol/v2025_11_25.ts +4 -7
- package/src/ai/internal/mcpProtocol/v2026_07_28.ts +15 -10
- package/src/ai/internal/mcpProtocol.ts +29 -0
- package/src/ai/internal/mcpRuntime.ts +9 -5
- package/src/ai/internal/mcpStatefulRuntime.ts +14 -2
- package/src/cli/Argument.ts +6 -0
- package/src/cli/CliOutput.ts +117 -49
- package/src/cli/Command.ts +23 -0
- package/src/cli/Flag.ts +107 -0
- package/src/cli/HelpDoc.ts +18 -1
- package/src/cli/Param.ts +6 -0
- package/src/cli/Primitive.ts +16 -1
- package/src/cli/Prompt.ts +1 -0
- package/src/cli/internal/help.ts +21 -9
- package/src/cluster/Sharding.ts +93 -26
- package/src/cluster/ShardingConfig.ts +41 -3
- package/src/cluster/SingleRunner.ts +3 -3
- package/src/cluster/SqlMessageStorage.ts +49 -17
- package/src/cluster/SqlRunnerStorage.ts +37 -27
- package/src/crypto/Aead.ts +517 -0
- package/src/crypto/Cipher.ts +326 -0
- package/src/crypto/CryptoError.ts +242 -0
- package/src/crypto/Digest.ts +167 -0
- package/src/crypto/Kdf.ts +315 -0
- package/src/crypto/KeyAgreement.ts +489 -0
- package/src/crypto/KeyFormat.ts +712 -0
- package/src/crypto/KeyWrap.ts +639 -0
- package/src/crypto/Mac.ts +386 -0
- package/src/crypto/SecureRandom.ts +459 -0
- package/src/crypto/Signature.ts +673 -0
- package/src/crypto/WebCrypto.ts +64 -0
- package/src/crypto/index.ts +78 -0
- package/src/crypto/internal/asymmetric.ts +329 -0
- package/src/crypto/internal/chacha.ts +1088 -0
- package/src/crypto/internal/der.ts +110 -0
- package/src/crypto/internal/digest.ts +16 -0
- package/src/crypto/internal/key.ts +235 -0
- package/src/crypto/internal/md5.ts +170 -0
- package/src/crypto/internal/webCrypto.ts +150 -0
- package/src/encoding/Base64Url.ts +5 -2
- package/src/encoding/Csv.ts +1298 -0
- package/src/encoding/Hex.ts +3 -2
- package/src/encoding/SchemaBinary.ts +40 -4
- package/src/encoding/Toml.ts +85 -20
- package/src/encoding/Yaml.ts +61 -18
- package/src/encoding/index.ts +6 -0
- package/src/eventlog/EventJournal.ts +4 -3
- package/src/eventlog/EventLog.ts +340 -15
- package/src/eventlog/EventLogEncryption.ts +118 -110
- package/src/eventlog/EventLogMessage.ts +273 -1
- package/src/eventlog/EventLogRemote.ts +367 -23
- package/src/eventlog/EventLogServer.ts +23 -8
- package/src/eventlog/EventLogServerEncrypted.ts +1130 -67
- package/src/eventlog/EventLogSessionAuth.ts +56 -70
- package/src/eventlog/EventRow.ts +12 -3
- package/src/eventlog/SqlEventJournal.ts +2 -2
- package/src/eventlog/SqlEventLogServerEncrypted.ts +1244 -136
- package/src/eventlog/SqlEventLogServerUnencrypted.ts +2 -2
- package/src/eventlog/internal/batches.ts +30 -0
- package/src/eventlog/internal/compaction.ts +64 -0
- package/src/eventlog/internal/identityRootSecretDerivation.ts +93 -123
- package/src/eventlog/internal/remoteCompaction.ts +92 -0
- package/src/http/Cookies.ts +281 -1
- package/src/http/FetchHttpClient.ts +88 -16
- package/src/http/HttpClient.ts +89 -22
- package/src/http/HttpClientRequest.ts +12 -9
- package/src/http/HttpClientResponse.ts +3 -2
- package/src/http/HttpMethod.ts +10 -2
- package/src/http/HttpServerRequest.ts +15 -30
- package/src/http/HttpServerResponse.ts +3 -2
- package/src/http/HttpTraceContext.ts +7 -4
- package/src/http/ProblemDetails.ts +149 -0
- package/src/http/index.ts +6 -0
- package/src/http/internal/decompression.ts +4 -4
- package/src/http/internal/urlParams.ts +8 -0
- package/src/http-api/HttpApiBuilder.ts +24 -12
- package/src/http-api/HttpApiClient.ts +67 -1
- package/src/http-api/HttpApiEndpoint.ts +14 -5
- package/src/http-api/HttpApiError.ts +250 -0
- package/src/http-api/HttpApiMiddleware.ts +95 -1
- package/src/http-api/HttpApiSchema.ts +105 -14
- package/src/index.ts +6 -6
- package/src/internal/effect.ts +34 -18
- package/src/internal/glob.ts +736 -0
- package/src/internal/matcher.ts +17 -0
- package/src/internal/persistence.ts +11 -0
- package/src/internal/rcRef.ts +4 -1
- package/src/internal/schema/toCodeDocument.ts +7 -3
- package/src/internal/trie.ts +43 -14
- package/src/internal/ulid.ts +44 -0
- package/src/internal/uuid.ts +57 -16
- package/src/internal/version.ts +1 -1
- package/src/observability/Otlp.ts +21 -4
- package/src/observability/OtlpResource.ts +9 -1
- package/src/persistence/KeyValueStore.ts +219 -22
- package/src/persistence/PersistedQueue.ts +128 -59
- package/src/persistence/Persistence.ts +20 -13
- package/src/process/ChildProcess.ts +255 -260
- package/src/process/ChildProcessSpawner.ts +5 -0
- package/src/process/CommandLine.ts +630 -0
- package/src/process/index.ts +6 -0
- package/src/reactivity/Atom.ts +5 -5
- package/src/reactivity/AtomRegistry.ts +1 -1
- package/src/rpc/RpcClient.ts +62 -26
- package/src/rpc/RpcMessage.ts +10 -1
- package/src/rpc/RpcSerialization.ts +3 -0
- package/src/rpc/RpcServer.ts +176 -78
- package/src/schema/Model.ts +26 -3
- package/src/sql/Migrator.ts +4 -63
- package/src/sql/MigratorFileSystem.ts +71 -0
- package/src/sql/SqlClient.ts +2 -16
- package/src/sql/Statement.ts +8 -7
- package/src/sql/index.ts +1 -1
- package/src/testing/index.ts +0 -6
- package/src/workflow/internal/crypto.ts +15 -11
- package/dist/Crypto.d.ts +0 -244
- package/dist/Crypto.d.ts.map +0 -1
- package/dist/Crypto.js +0 -139
- package/dist/Crypto.js.map +0 -1
- package/dist/testing/TestCrypto.d.ts +0 -73
- package/dist/testing/TestCrypto.d.ts.map +0 -1
- package/dist/testing/TestCrypto.js +0 -87
- package/dist/testing/TestCrypto.js.map +0 -1
- package/src/Crypto.ts +0 -347
- package/src/testing/TestCrypto.ts +0 -94
|
@@ -521,12 +521,12 @@ export const makeStorage = Effect.fnUntraced(function*(options?: StorageOptions)
|
|
|
521
521
|
primary_key: entry.primaryKey,
|
|
522
522
|
payload: entry.payload
|
|
523
523
|
})
|
|
524
|
-
if (rowsForInsert.length >= insertBatchSize) {
|
|
524
|
+
if (rowsForInsert.length >= insertBatchSize && Arr.isArrayNonEmpty(rowsForInsert)) {
|
|
525
525
|
yield* sql`INSERT INTO ${entriesTableSql} ${sql.insert(rowsForInsert)}`
|
|
526
526
|
rowsForInsert = []
|
|
527
527
|
}
|
|
528
528
|
}
|
|
529
|
-
if (rowsForInsert
|
|
529
|
+
if (Arr.isArrayNonEmpty(rowsForInsert)) {
|
|
530
530
|
yield* sql`INSERT INTO ${entriesTableSql} ${sql.insert(rowsForInsert)}`
|
|
531
531
|
}
|
|
532
532
|
const nextSequence = currentNextSequence + entries.length
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { NonEmptyArray } from "../../Array.ts"
|
|
2
|
+
import type { Entry } from "../EventJournal.ts"
|
|
3
|
+
|
|
4
|
+
/** The most entries a remote batch holds. */
|
|
5
|
+
export const maxBatchEntries = 100
|
|
6
|
+
|
|
7
|
+
/** The most payload bytes a remote batch holds, unless it is a single entry. */
|
|
8
|
+
export const maxBatchPayloadBytes = 256 * 1024
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Packs entries into batches of at most `maxBatchEntries` entries and
|
|
12
|
+
* `maxBatchPayloadBytes` of payload. A larger entry is a batch on its own.
|
|
13
|
+
*/
|
|
14
|
+
export const toBatches = (entries: ReadonlyArray<Entry>): Array<NonEmptyArray<Entry>> => {
|
|
15
|
+
const batches: Array<NonEmptyArray<Entry>> = []
|
|
16
|
+
let current: Array<Entry> = []
|
|
17
|
+
let bytes = 0
|
|
18
|
+
for (const entry of entries) {
|
|
19
|
+
const size = entry.payload.byteLength
|
|
20
|
+
if (current.length > 0 && (current.length === maxBatchEntries || bytes + size > maxBatchPayloadBytes)) {
|
|
21
|
+
batches.push(current as NonEmptyArray<Entry>)
|
|
22
|
+
current = []
|
|
23
|
+
bytes = 0
|
|
24
|
+
}
|
|
25
|
+
current.push(entry)
|
|
26
|
+
bytes += size
|
|
27
|
+
}
|
|
28
|
+
if (current.length > 0) batches.push(current as NonEmptyArray<Entry>)
|
|
29
|
+
return batches
|
|
30
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import * as Effect from "../../Effect.ts"
|
|
2
|
+
import type { StoreId } from "../EventLogMessage.ts"
|
|
3
|
+
|
|
4
|
+
/** Rules and audit logs shared by the memory and SQL compaction storages. */
|
|
5
|
+
|
|
6
|
+
export const hourMillis = 60 * 60 * 1000
|
|
7
|
+
|
|
8
|
+
/** The newest storage-time hour that ended at least `lagMillis` ago. */
|
|
9
|
+
export const lagHour = (now: number, lagMillis: number): number => Math.floor((now - lagMillis) / hourMillis) - 1
|
|
10
|
+
|
|
11
|
+
/** A staged batch's position packs its segment index and its index in the segment. */
|
|
12
|
+
export const positionsPerSegment = 2 ** 20
|
|
13
|
+
export const maxSegments = Math.floor(Number.MAX_SAFE_INTEGER / positionsPerSegment)
|
|
14
|
+
|
|
15
|
+
const service = "EventLogServerEncrypted"
|
|
16
|
+
|
|
17
|
+
export const logCommit = (options: {
|
|
18
|
+
readonly publicKey: string
|
|
19
|
+
readonly storeId: StoreId
|
|
20
|
+
readonly result: "Committed" | "Superseded"
|
|
21
|
+
readonly through: number
|
|
22
|
+
readonly keptCount: number
|
|
23
|
+
readonly activationId: string | undefined
|
|
24
|
+
}): Effect.Effect<void> =>
|
|
25
|
+
Effect.logInfo(
|
|
26
|
+
options.result === "Committed" ? "Committed compaction snapshot" : "Compaction snapshot superseded"
|
|
27
|
+
).pipe(
|
|
28
|
+
Effect.annotateLogs({
|
|
29
|
+
service,
|
|
30
|
+
publicKey: options.publicKey,
|
|
31
|
+
storeId: options.storeId,
|
|
32
|
+
keptCount: options.keptCount,
|
|
33
|
+
through: options.through,
|
|
34
|
+
activationId: options.activationId
|
|
35
|
+
})
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
export const logNoOp = (options: {
|
|
39
|
+
readonly publicKey: string
|
|
40
|
+
readonly storeId: StoreId
|
|
41
|
+
readonly stageId: string
|
|
42
|
+
readonly through: number
|
|
43
|
+
}): Effect.Effect<void> =>
|
|
44
|
+
Effect.logInfo("Committed compaction no-op").pipe(Effect.annotateLogs({ service, ...options }))
|
|
45
|
+
|
|
46
|
+
export const logRollback = (options: {
|
|
47
|
+
readonly publicKey: string
|
|
48
|
+
readonly storeId: StoreId
|
|
49
|
+
readonly activation: { readonly id: string; readonly base: number; readonly keptCount: number | undefined }
|
|
50
|
+
readonly withdrawn: { readonly id: string; readonly base: number; readonly keptCount: number | undefined }
|
|
51
|
+
}): Effect.Effect<void> =>
|
|
52
|
+
Effect.logInfo("Rolled back compaction snapshot").pipe(
|
|
53
|
+
Effect.annotateLogs({
|
|
54
|
+
service,
|
|
55
|
+
publicKey: options.publicKey,
|
|
56
|
+
storeId: options.storeId,
|
|
57
|
+
keptCount: options.activation.keptCount,
|
|
58
|
+
base: options.activation.base,
|
|
59
|
+
activationId: options.activation.id,
|
|
60
|
+
withdrawnActivationId: options.withdrawn.id,
|
|
61
|
+
withdrawnBase: options.withdrawn.base,
|
|
62
|
+
withdrawnKeptCount: options.withdrawn.keptCount
|
|
63
|
+
})
|
|
64
|
+
)
|
|
@@ -1,30 +1,16 @@
|
|
|
1
|
+
import * as Aead from "../../crypto/Aead.ts"
|
|
2
|
+
import * as Digest from "../../crypto/Digest.ts"
|
|
3
|
+
import * as KeyFormat from "../../crypto/KeyFormat.ts"
|
|
4
|
+
import * as SecureRandom from "../../crypto/SecureRandom.ts"
|
|
5
|
+
import * as Signature from "../../crypto/Signature.ts"
|
|
6
|
+
import * as WebCrypto from "../../crypto/WebCrypto.ts"
|
|
1
7
|
import * as Effect from "../../Effect.ts"
|
|
8
|
+
import * as Layer from "../../Layer.ts"
|
|
2
9
|
import * as Redacted from "../../Redacted.ts"
|
|
3
10
|
import type { Identity } from "../EventLog.ts"
|
|
4
11
|
|
|
5
12
|
const textEncoder = new TextEncoder()
|
|
6
13
|
|
|
7
|
-
const Ed25519PublicKeyLength = 32
|
|
8
|
-
|
|
9
|
-
const Ed25519Pkcs8SeedPrefix = Uint8Array.from([
|
|
10
|
-
0x30,
|
|
11
|
-
0x2e,
|
|
12
|
-
0x02,
|
|
13
|
-
0x01,
|
|
14
|
-
0x00,
|
|
15
|
-
0x30,
|
|
16
|
-
0x05,
|
|
17
|
-
0x06,
|
|
18
|
-
0x03,
|
|
19
|
-
0x2b,
|
|
20
|
-
0x65,
|
|
21
|
-
0x70,
|
|
22
|
-
0x04,
|
|
23
|
-
0x22,
|
|
24
|
-
0x04,
|
|
25
|
-
0x20
|
|
26
|
-
])
|
|
27
|
-
|
|
28
14
|
/**
|
|
29
15
|
* @internal
|
|
30
16
|
*/
|
|
@@ -40,124 +26,108 @@ export const SigningDerivationLabelV1 = "effect/eventlog/identity/v1/signing"
|
|
|
40
26
|
*/
|
|
41
27
|
export interface IdentityRootSecretMaterial {
|
|
42
28
|
readonly encryptionKeyMaterial: Uint8Array<ArrayBuffer>
|
|
43
|
-
readonly encryptionKey:
|
|
29
|
+
readonly encryptionKey: Aead.Key<Aead.AesGcm>
|
|
44
30
|
readonly signingPublicKey: Uint8Array<ArrayBuffer>
|
|
31
|
+
/**
|
|
32
|
+
* The PKCS#8 encoding of the Ed25519 signing key.
|
|
33
|
+
*/
|
|
45
34
|
readonly signingPrivateKey: Redacted.Redacted<Uint8Array<ArrayBuffer>>
|
|
46
35
|
}
|
|
47
36
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
for (let i = 0; i < decoded.length; i++) {
|
|
61
|
-
bytes[i] = decoded.charCodeAt(i)
|
|
62
|
-
}
|
|
63
|
-
return bytes
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
const makeEd25519Pkcs8FromSeed = (seed: Uint8Array): Uint8Array<ArrayBuffer> => {
|
|
67
|
-
const key = new Uint8Array(Ed25519Pkcs8SeedPrefix.byteLength + seed.byteLength)
|
|
68
|
-
key.set(Ed25519Pkcs8SeedPrefix, 0)
|
|
69
|
-
key.set(seed, Ed25519Pkcs8SeedPrefix.byteLength)
|
|
70
|
-
return key
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
const deriveSecretBytes = Effect.fnUntraced(function*(options: {
|
|
74
|
-
readonly crypto: Crypto
|
|
75
|
-
readonly rootSecret: Uint8Array
|
|
76
|
-
readonly label: string
|
|
77
|
-
}) {
|
|
78
|
-
const labelBytes = textEncoder.encode(options.label)
|
|
79
|
-
const derivationInput = new Uint8Array(labelBytes.byteLength + 1 + options.rootSecret.byteLength)
|
|
80
|
-
derivationInput.set(labelBytes, 0)
|
|
81
|
-
derivationInput[labelBytes.byteLength] = 0
|
|
82
|
-
derivationInput.set(options.rootSecret, labelBytes.byteLength + 1)
|
|
83
|
-
|
|
84
|
-
const digest = yield* Effect.promise(() => options.crypto.subtle.digest("SHA-256", toArrayBuffer(derivationInput)))
|
|
37
|
+
// The crypto services return fresh arrays over an `ArrayBuffer`.
|
|
38
|
+
const toArrayBufferBytes = (bytes: Uint8Array) => bytes as Uint8Array<ArrayBuffer>
|
|
39
|
+
|
|
40
|
+
// Each secret is SHA-256(label || 0x00 || root secret).
|
|
41
|
+
const deriveSecretBytes = (rootSecret: Uint8Array, label: string): Effect.Effect<Uint8Array, never, Digest.Digest> =>
|
|
42
|
+
Digest.Digest.use((digest) => {
|
|
43
|
+
const labelBytes = textEncoder.encode(label)
|
|
44
|
+
const derivationInput = new Uint8Array(labelBytes.byteLength + 1 + rootSecret.byteLength)
|
|
45
|
+
derivationInput.set(labelBytes, 0)
|
|
46
|
+
derivationInput.set(rootSecret, labelBytes.byteLength + 1)
|
|
47
|
+
return digest.digest(Digest.sha256, derivationInput)
|
|
48
|
+
})
|
|
85
49
|
|
|
86
|
-
|
|
50
|
+
/**
|
|
51
|
+
* Derives the AES-256-GCM key that encrypts an identity's entries.
|
|
52
|
+
*
|
|
53
|
+
* @internal
|
|
54
|
+
*/
|
|
55
|
+
export const deriveEncryptionKey = Effect.fnUntraced(function*(rootSecret: Uint8Array) {
|
|
56
|
+
const encryptionKeyMaterial = yield* deriveSecretBytes(rootSecret, EncryptionDerivationLabelV1)
|
|
57
|
+
const encryptionKey = yield* Effect.orDie(Aead.key(Aead.aes256Gcm, encryptionKeyMaterial))
|
|
58
|
+
return { encryptionKeyMaterial: toArrayBufferBytes(encryptionKeyMaterial), encryptionKey }
|
|
87
59
|
})
|
|
88
60
|
|
|
89
61
|
/**
|
|
62
|
+
* Derives the Ed25519 key an identity signs session authentication payloads
|
|
63
|
+
* with.
|
|
64
|
+
*
|
|
90
65
|
* @internal
|
|
91
66
|
*/
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
const
|
|
97
|
-
|
|
98
|
-
rootSecret: options.rootSecret,
|
|
99
|
-
label: EncryptionDerivationLabelV1
|
|
100
|
-
})
|
|
101
|
-
const signingSeed = yield* deriveSecretBytes({
|
|
102
|
-
crypto: options.crypto,
|
|
103
|
-
rootSecret: options.rootSecret,
|
|
104
|
-
label: SigningDerivationLabelV1
|
|
105
|
-
})
|
|
106
|
-
|
|
107
|
-
const signingPrivateKeyBytes = makeEd25519Pkcs8FromSeed(signingSeed)
|
|
108
|
-
|
|
109
|
-
const encryptionKey = yield* Effect.promise(() =>
|
|
110
|
-
options.crypto.subtle.importKey("raw", toArrayBuffer(encryptionKeyMaterial), "AES-GCM", true, [
|
|
111
|
-
"encrypt",
|
|
112
|
-
"decrypt"
|
|
113
|
-
])
|
|
114
|
-
)
|
|
115
|
-
const signingPrivateKey = yield* Effect.promise(() =>
|
|
116
|
-
options.crypto.subtle.importKey("pkcs8", toArrayBuffer(signingPrivateKeyBytes), "Ed25519", true, ["sign"])
|
|
117
|
-
)
|
|
118
|
-
const signingJwk = yield* Effect.promise(() => options.crypto.subtle.exportKey("jwk", signingPrivateKey))
|
|
119
|
-
|
|
120
|
-
if (typeof signingJwk.x !== "string") {
|
|
121
|
-
return yield* Effect.die(new Error("Unable to export deterministic Ed25519 public key"))
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
const signingPublicKey = decodeBase64Url(signingJwk.x)
|
|
125
|
-
|
|
126
|
-
if (signingPublicKey.byteLength !== Ed25519PublicKeyLength) {
|
|
127
|
-
return yield* Effect.die(
|
|
128
|
-
new Error(`Expected derived signing public key to be ${Ed25519PublicKeyLength} bytes`)
|
|
129
|
-
)
|
|
130
|
-
}
|
|
131
|
-
|
|
67
|
+
const deriveSigningKey = Effect.fnUntraced(function*(rootSecret: Uint8Array) {
|
|
68
|
+
const signature = yield* Signature.Signature
|
|
69
|
+
const seed = yield* deriveSecretBytes(rootSecret, SigningDerivationLabelV1)
|
|
70
|
+
const privateKey = yield* Signature.privateKey(Signature.ed25519, seed)
|
|
71
|
+
const signingPublicKey = yield* Effect.flatMap(signature.publicKeyOf(privateKey), Signature.toBytes)
|
|
72
|
+
const signingPrivateKey = yield* KeyFormat.encode(KeyFormat.pkcs8, privateKey)
|
|
132
73
|
return {
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
} satisfies IdentityRootSecretMaterial
|
|
138
|
-
})
|
|
74
|
+
signingPublicKey: toArrayBufferBytes(signingPublicKey),
|
|
75
|
+
signingPrivateKey: Redacted.make(toArrayBufferBytes(signingPrivateKey))
|
|
76
|
+
}
|
|
77
|
+
}, Effect.orDie)
|
|
139
78
|
|
|
140
79
|
/**
|
|
141
80
|
* @internal
|
|
142
81
|
*/
|
|
143
|
-
export const
|
|
144
|
-
|
|
82
|
+
export const deriveIdentityRootSecretMaterial = (
|
|
83
|
+
rootSecret: Uint8Array
|
|
84
|
+
): Effect.Effect<IdentityRootSecretMaterial, never, Digest.Digest | Signature.Signature> =>
|
|
85
|
+
Effect.zipWith(deriveEncryptionKey(rootSecret), deriveSigningKey(rootSecret), (encryption, signing) => ({
|
|
86
|
+
...encryption,
|
|
87
|
+
...signing
|
|
88
|
+
}))
|
|
145
89
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
90
|
+
/**
|
|
91
|
+
* Memoizes a derivation from an identity's root secret per identity instance.
|
|
92
|
+
*
|
|
93
|
+
* @internal
|
|
94
|
+
*/
|
|
95
|
+
export const cachedByIdentity = <A, R>(
|
|
96
|
+
derive: (rootSecret: Uint8Array) => Effect.Effect<A, never, R>
|
|
97
|
+
) => {
|
|
98
|
+
const cache = new WeakMap<Identity["Service"], A>()
|
|
99
|
+
return (identity: Identity["Service"]): Effect.Effect<A, never, R> =>
|
|
100
|
+
Effect.suspend(() => {
|
|
101
|
+
const cached = cache.get(identity)
|
|
102
|
+
if (cached !== undefined) {
|
|
103
|
+
return Effect.succeed(cached)
|
|
104
|
+
}
|
|
105
|
+
return Effect.tap(derive(Redacted.value(identity.privateKey)), (derived) =>
|
|
106
|
+
Effect.sync(() => {
|
|
107
|
+
cache.set(identity, derived)
|
|
108
|
+
}))
|
|
155
109
|
})
|
|
110
|
+
}
|
|
156
111
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
112
|
+
const layerWebCrypto = Layer.mergeAll(Digest.layerWebCrypto, Signature.layerWebCrypto).pipe(
|
|
113
|
+
Layer.provide(SecureRandom.layerWebCrypto)
|
|
114
|
+
)
|
|
160
115
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
116
|
+
/**
|
|
117
|
+
* Derives identity material on the Web Crypto layers, using `crypto` when it
|
|
118
|
+
* is given and the `WebCrypto` reference otherwise.
|
|
119
|
+
*
|
|
120
|
+
* @internal
|
|
121
|
+
*/
|
|
122
|
+
export const makeGetIdentityRootSecretMaterial = (crypto?: Crypto) =>
|
|
123
|
+
cachedByIdentity((rootSecret) =>
|
|
124
|
+
crypto === undefined
|
|
125
|
+
? Effect.provide(deriveIdentityRootSecretMaterial(rootSecret), layerWebCrypto)
|
|
126
|
+
// `local` keeps enclosing Web Crypto layers, built on another `Crypto`,
|
|
127
|
+
// from being reused.
|
|
128
|
+
: Effect.provide(
|
|
129
|
+
deriveIdentityRootSecretMaterial(rootSecret),
|
|
130
|
+
Layer.provideMerge(layerWebCrypto, WebCrypto.layer(crypto)),
|
|
131
|
+
{ local: true }
|
|
132
|
+
)
|
|
133
|
+
)
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import * as Data from "../../Data.ts"
|
|
2
|
+
import * as Effect from "../../Effect.ts"
|
|
3
|
+
import * as Stream from "../../Stream.ts"
|
|
4
|
+
import type { Entry } from "../EventJournal.ts"
|
|
5
|
+
import type { Registry } from "../EventLog.ts"
|
|
6
|
+
|
|
7
|
+
/** A second pass over the kept set dropped `entries`, so a compactor does not compose. */
|
|
8
|
+
export class IdempotenceError extends Data.TaggedError("IdempotenceError")<{
|
|
9
|
+
readonly entries: ReadonlyArray<Entry>
|
|
10
|
+
}> {}
|
|
11
|
+
|
|
12
|
+
type Compactor = Registry["Service"]["compactors"] extends ReadonlyMap<string, infer A> ? A : never
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Folds the opted-in compactors over `entries`, which arrive in input order
|
|
16
|
+
* without repeated ids, and returns the kept entries in input order.
|
|
17
|
+
*
|
|
18
|
+
* Each step folds a chunk into the kept set. The chunk starts at `chunkSize`
|
|
19
|
+
* and grows to the size of the kept set, so a run stays linear when little is
|
|
20
|
+
* dropped and memory stays at about twice the kept set. A compactor that
|
|
21
|
+
* composes keeps the same entries at any chunking.
|
|
22
|
+
*
|
|
23
|
+
* Fails with `IdempotenceError` when a second pass over the kept set drops
|
|
24
|
+
* more. A compactor defect fails the run.
|
|
25
|
+
*/
|
|
26
|
+
export const run = <E, R>(options: {
|
|
27
|
+
readonly compactors: Registry["Service"]["compactors"]
|
|
28
|
+
readonly entries: Stream.Stream<Entry, E, R>
|
|
29
|
+
readonly chunkSize: number
|
|
30
|
+
}): Effect.Effect<ReadonlyArray<Entry>, E | IdempotenceError, R> => {
|
|
31
|
+
const drop = Effect.fnUntraced(function*(entries: ReadonlyArray<Entry>) {
|
|
32
|
+
const kept = new Set<Entry>()
|
|
33
|
+
const calls = new Map<Compactor, Array<Entry>>()
|
|
34
|
+
for (const entry of entries) {
|
|
35
|
+
const compactor = options.compactors.get(entry.event)
|
|
36
|
+
if (compactor === undefined || !compactor.remote) {
|
|
37
|
+
kept.add(entry)
|
|
38
|
+
continue
|
|
39
|
+
}
|
|
40
|
+
const input = calls.get(compactor)
|
|
41
|
+
if (input === undefined) calls.set(compactor, [entry])
|
|
42
|
+
else input.push(entry)
|
|
43
|
+
}
|
|
44
|
+
for (const [compactor, input] of calls) {
|
|
45
|
+
const inputs = new Set(input)
|
|
46
|
+
const forwarded = new Set<Entry>()
|
|
47
|
+
let replaced = false
|
|
48
|
+
yield* compactor.effect({
|
|
49
|
+
entries: input,
|
|
50
|
+
remote: true,
|
|
51
|
+
write: (entry) =>
|
|
52
|
+
Effect.sync(() => {
|
|
53
|
+
if (inputs.has(entry)) forwarded.add(entry)
|
|
54
|
+
else replaced = true
|
|
55
|
+
})
|
|
56
|
+
})
|
|
57
|
+
// Only forwarded input entries can be kept verbatim, so a call that
|
|
58
|
+
// outputs anything else keeps its whole input.
|
|
59
|
+
if (replaced) {
|
|
60
|
+
yield* Effect.logWarning("A remote compactor wrote an entry it was not given, so its input is kept").pipe(
|
|
61
|
+
Effect.annotateLogs({ events: [...compactor.events] })
|
|
62
|
+
)
|
|
63
|
+
}
|
|
64
|
+
for (const entry of replaced ? input : forwarded) kept.add(entry)
|
|
65
|
+
}
|
|
66
|
+
return entries.filter((entry) => kept.has(entry))
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
return Effect.gen(function*() {
|
|
70
|
+
let kept: ReadonlyArray<Entry> = []
|
|
71
|
+
let pending: Array<Entry> = []
|
|
72
|
+
yield* options.entries.pipe(
|
|
73
|
+
Stream.grouped(options.chunkSize),
|
|
74
|
+
Stream.runForEach((group) => {
|
|
75
|
+
for (const entry of group) pending.push(entry)
|
|
76
|
+
if (pending.length < Math.max(options.chunkSize, kept.length)) return Effect.void
|
|
77
|
+
const input = kept.concat(pending)
|
|
78
|
+
pending = []
|
|
79
|
+
return Effect.map(drop(input), (next) => {
|
|
80
|
+
kept = next
|
|
81
|
+
})
|
|
82
|
+
})
|
|
83
|
+
)
|
|
84
|
+
if (pending.length > 0) kept = yield* drop(kept.concat(pending))
|
|
85
|
+
const again = yield* drop(kept)
|
|
86
|
+
if (again.length !== kept.length) {
|
|
87
|
+
const survivors = new Set(again)
|
|
88
|
+
return yield* new IdempotenceError({ entries: kept.filter((entry) => !survivors.has(entry)) })
|
|
89
|
+
}
|
|
90
|
+
return kept
|
|
91
|
+
})
|
|
92
|
+
}
|