effect 4.0.7 → 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 +31 -1
- 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 +86 -14
- 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/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/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/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/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/Path.d.ts.map +1 -1
- package/dist/Path.js +5 -1
- package/dist/Path.js.map +1 -1
- package/dist/Pool.d.ts +51 -0
- package/dist/Pool.d.ts.map +1 -1
- package/dist/Pool.js +61 -10
- 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 +668 -42
- package/dist/Schema.d.ts.map +1 -1
- package/dist/Schema.js +652 -1
- 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 +18 -2
- package/dist/SchemaRepresentation.d.ts.map +1 -1
- package/dist/SchemaRepresentation.js +20 -2
- package/dist/SchemaRepresentation.js.map +1 -1
- package/dist/SchemaTransformation.d.ts +10 -5
- package/dist/SchemaTransformation.d.ts.map +1 -1
- package/dist/SchemaTransformation.js +8 -5
- 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/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 +744 -29
- package/dist/ai/McpServer.d.ts.map +1 -1
- package/dist/ai/McpServer.js +763 -136
- 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/Prompt.d.ts.map +1 -1
- package/dist/ai/Prompt.js +20 -11
- package/dist/ai/Prompt.js.map +1 -1
- 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 +5 -7
- 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 +89 -15
- package/dist/ai/internal/mcpCore.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2024_11_05.js +7 -6
- package/dist/ai/internal/mcpProtocol/v2024_11_05.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2025_03_26.js +7 -6
- package/dist/ai/internal/mcpProtocol/v2025_03_26.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2025_06_18.js +7 -6
- package/dist/ai/internal/mcpProtocol/v2025_06_18.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2025_11_25.js +7 -6
- package/dist/ai/internal/mcpProtocol/v2025_11_25.js.map +1 -1
- package/dist/ai/internal/mcpProtocol/v2026_07_28.js +60 -17
- package/dist/ai/internal/mcpProtocol/v2026_07_28.js.map +1 -1
- package/dist/ai/internal/mcpProtocol.js +25 -0
- package/dist/ai/internal/mcpProtocol.js.map +1 -1
- package/dist/ai/internal/mcpRuntime.js +8 -6
- 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/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/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 +93 -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/cluster/internal/entityManager.js +15 -7
- package/dist/cluster/internal/entityManager.js.map +1 -1
- package/dist/crypto/Aead.d.ts +323 -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 +236 -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 +324 -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 +341 -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 +390 -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 +278 -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 +449 -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 +80 -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 +171 -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 +29 -5
- 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/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/SchemaBinary.d.ts.map +1 -1
- package/dist/encoding/SchemaBinary.js +42 -4
- package/dist/encoding/SchemaBinary.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/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 +126 -4
- package/dist/eventlog/EventLog.d.ts.map +1 -1
- package/dist/eventlog/EventLog.js +207 -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 +10 -1
- package/dist/eventlog/EventLogServer.d.ts.map +1 -1
- package/dist/eventlog/EventLogServer.js +45 -22
- package/dist/eventlog/EventLogServer.js.map +1 -1
- package/dist/eventlog/EventLogServerEncrypted.d.ts +336 -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/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 +26 -3
- package/dist/eventlog/EventLogSessionAuth.d.ts.map +1 -1
- package/dist/eventlog/EventLogSessionAuth.js +63 -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/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/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 +268 -15
- package/dist/http/HttpClient.d.ts.map +1 -1
- package/dist/http/HttpClient.js +140 -7
- 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 +44 -39
- 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/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/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 +54 -1
- 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/dateTime.js +49 -24
- package/dist/internal/dateTime.js.map +1 -1
- package/dist/internal/effect.js +35 -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 +808 -0
- package/dist/internal/glob.js.map +1 -0
- 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/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/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/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/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/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/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/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/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/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 +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 +28 -1
- package/dist/rpc/RpcClient.d.ts.map +1 -1
- package/dist/rpc/RpcClient.js +78 -27
- package/dist/rpc/RpcClient.js.map +1 -1
- package/dist/rpc/RpcMessage.d.ts +13 -3
- 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 +9 -20
- package/dist/sql/Migrator.d.ts.map +1 -1
- package/dist/sql/Migrator.js +20 -53
- 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 +38 -3
- package/dist/sql/SqlClient.d.ts.map +1 -1
- package/dist/sql/SqlClient.js +9 -12
- package/dist/sql/SqlClient.js.map +1 -1
- package/dist/sql/Statement.d.ts +61 -9
- package/dist/sql/Statement.d.ts.map +1 -1
- package/dist/sql/Statement.js +24 -33
- 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/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/dist/workflow/internal/crypto.js +9 -8
- package/dist/workflow/internal/crypto.js.map +1 -1
- package/package.json +7 -1
- package/src/BigDecimal.ts +173 -16
- 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/Equal.ts +3 -3
- package/src/FileSystem.ts +65 -4
- package/src/Glob.ts +205 -0
- package/src/Hash.ts +5 -4
- package/src/Iterable.ts +8 -5
- package/src/Match.ts +127 -0
- package/src/Path.ts +6 -1
- package/src/Pool.ts +75 -16
- package/src/Random.ts +3 -3
- package/src/RcMap.ts +5 -1
- package/src/Schedule.ts +26 -3
- package/src/Schema.ts +1191 -63
- package/src/SchemaGetter.ts +27 -11
- package/src/SchemaRepresentation.ts +23 -2
- package/src/SchemaTransformation.ts +10 -5
- 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/McpClient.ts +488 -91
- package/src/ai/McpSchema.ts +119 -0
- package/src/ai/McpServer.ts +1525 -319
- package/src/ai/McpTest.ts +380 -0
- package/src/ai/Prompt.ts +16 -11
- package/src/ai/Response.ts +2 -22
- package/src/ai/Tool.ts +32 -18
- package/src/ai/index.ts +6 -0
- package/src/ai/internal/mcpCore.ts +243 -56
- package/src/ai/internal/mcpProtocol/v2024_11_05.ts +7 -8
- package/src/ai/internal/mcpProtocol/v2025_03_26.ts +7 -8
- package/src/ai/internal/mcpProtocol/v2025_06_18.ts +7 -8
- package/src/ai/internal/mcpProtocol/v2025_11_25.ts +7 -8
- package/src/ai/internal/mcpProtocol/v2026_07_28.ts +56 -17
- package/src/ai/internal/mcpProtocol.ts +44 -0
- package/src/ai/internal/mcpRuntime.ts +15 -8
- package/src/ai/internal/mcpSkills.ts +480 -0
- 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/ClusterWorkflowEngine.ts +22 -8
- package/src/cluster/Reply.ts +1 -1
- package/src/cluster/Sharding.ts +96 -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/cluster/internal/entityManager.ts +24 -10
- 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 +741 -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 +84 -0
- package/src/crypto/index.ts +78 -0
- package/src/crypto/internal/asymmetric.ts +330 -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 +242 -0
- package/src/crypto/internal/md5.ts +170 -0
- package/src/crypto/internal/webCrypto.ts +150 -0
- package/src/encoding/Base64Url.ts +32 -5
- package/src/encoding/Csv.ts +1298 -0
- package/src/encoding/Hex.ts +3 -2
- package/src/encoding/Ndjson.ts +6 -5
- package/src/encoding/SchemaBinary.ts +40 -4
- package/src/encoding/Sse.ts +5 -3
- 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 +347 -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 +54 -20
- package/src/eventlog/EventLogServerEncrypted.ts +1135 -67
- package/src/eventlog/EventLogServerUnencrypted.ts +19 -2
- package/src/eventlog/EventLogSessionAuth.ts +82 -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/graphql/GraphQLClient.ts +3 -1
- package/src/graphql/GraphQLClientError.ts +15 -22
- package/src/graphql/GraphQLProtocol.ts +12 -3
- package/src/http/Cookies.ts +281 -1
- package/src/http/FetchHttpClient.ts +88 -16
- package/src/http/HttpClient.ts +299 -33
- 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 +76 -53
- 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/mimeTypes.ts +4 -1
- 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 +106 -15
- package/src/index.ts +6 -6
- package/src/internal/dateTime.ts +54 -24
- package/src/internal/effect.ts +40 -18
- package/src/internal/glob.ts +952 -0
- package/src/internal/graphql.ts +27 -9
- package/src/internal/graphqlHeaders.ts +13 -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/request.ts +51 -58
- package/src/internal/schema/fromJsonSchemaDocument.ts +11 -10
- 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/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/Otlp.ts +21 -4
- package/src/observability/OtlpResource.ts +9 -1
- 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/KeyValueStore.ts +219 -22
- package/src/persistence/PersistedQueue.ts +128 -59
- package/src/persistence/Persistence.ts +20 -13
- package/src/persistence/RateLimiter.ts +84 -15
- package/src/persistence/index.ts +1 -1
- 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 +20 -9
- package/src/rpc/Rpc.ts +3 -1
- package/src/rpc/RpcClient.ts +94 -38
- package/src/rpc/RpcMessage.ts +13 -3
- 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 +38 -80
- package/src/sql/MigratorFileSystem.ts +71 -0
- package/src/sql/SqlClient.ts +45 -24
- package/src/sql/Statement.ts +60 -29
- package/src/sql/index.ts +1 -1
- package/src/testing/index.ts +0 -6
- package/src/workflow/Workflow.ts +4 -0
- package/src/workflow/WorkflowEngine.ts +5 -0
- 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
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
* @stability unstable
|
|
12
12
|
* @since 4.0.0
|
|
13
13
|
*/
|
|
14
|
+
import * as Arr from "../Array.ts"
|
|
14
15
|
import * as Cache from "../Cache.ts"
|
|
15
16
|
import * as Context from "../Context.ts"
|
|
16
17
|
import * as Data from "../Data.ts"
|
|
@@ -19,27 +20,38 @@ import * as Layer from "../Layer.ts"
|
|
|
19
20
|
import * as Predicate from "../Predicate.ts"
|
|
20
21
|
import * as Queue from "../Queue.ts"
|
|
21
22
|
import * as Redacted from "../Redacted.ts"
|
|
23
|
+
import * as Result from "../Result.ts"
|
|
22
24
|
import * as RpcClient from "../rpc/RpcClient.ts"
|
|
23
25
|
import type { RpcClientError } from "../rpc/RpcClientError.ts"
|
|
24
26
|
import type * as RpcGroup from "../rpc/RpcGroup.ts"
|
|
25
27
|
import type * as Schema from "../Schema.ts"
|
|
26
28
|
import type * as Scope from "../Scope.ts"
|
|
29
|
+
import * as Stream from "../Stream.ts"
|
|
27
30
|
import { type Entry, type EventJournal, type EventJournalError, RemoteEntry, type RemoteId } from "./EventJournal.ts"
|
|
28
31
|
import { type Identity, Registry } from "./EventLog.ts"
|
|
29
|
-
import { EventLogEncryption, layerSubtle } from "./EventLogEncryption.ts"
|
|
32
|
+
import { type EncryptedBatch, EventLogEncryption, layerSubtle } from "./EventLogEncryption.ts"
|
|
30
33
|
import {
|
|
31
34
|
Authenticate,
|
|
32
35
|
ChangesRpc,
|
|
33
36
|
ChunkedMessage,
|
|
37
|
+
type CompactionBeginResult,
|
|
38
|
+
type CompactionInputHeader,
|
|
39
|
+
CompactionInputRpc,
|
|
40
|
+
CompactionPartRpc,
|
|
41
|
+
type CompactionResult,
|
|
42
|
+
type CompactionStatus,
|
|
43
|
+
EventLogCompactionRpcs,
|
|
34
44
|
EventLogProtocolError,
|
|
35
45
|
EventLogRemoteRpcs,
|
|
36
46
|
type HelloResponse,
|
|
47
|
+
type SingleMessage,
|
|
37
48
|
type StoreId,
|
|
38
49
|
type WriteAck,
|
|
39
50
|
WriteEntries,
|
|
40
51
|
WriteEntriesUnencrypted
|
|
41
52
|
} from "./EventLogMessage.ts"
|
|
42
53
|
import { encodeSessionAuthPayload, signSessionAuthPayloadBytes } from "./EventLogSessionAuth.ts"
|
|
54
|
+
import { toBatches } from "./internal/batches.ts"
|
|
43
55
|
import { makeGetIdentityRootSecretMaterial } from "./internal/identityRootSecretDerivation.ts"
|
|
44
56
|
|
|
45
57
|
/**
|
|
@@ -87,8 +99,82 @@ export class EventLogRemote extends Context.Service<EventLogRemote, {
|
|
|
87
99
|
readonly whenAuthenticated: <A, E, R>(
|
|
88
100
|
effect: Effect.Effect<A, E, R>
|
|
89
101
|
) => Effect.Effect<A, E | EventLogRemoteError, R | Identity>
|
|
102
|
+
/**
|
|
103
|
+
* Encrypted remote compaction. Present when the remote advertises
|
|
104
|
+
* `HelloResponse.compaction` and the RPC client includes
|
|
105
|
+
* `EventLogCompactionRpcs`.
|
|
106
|
+
*/
|
|
107
|
+
readonly compaction?: EventLogRemoteCompaction | undefined
|
|
90
108
|
}>()("effect/eventlog/EventLogRemote") {}
|
|
91
109
|
|
|
110
|
+
/**
|
|
111
|
+
* A stage opened by `EventLogRemoteCompaction.begin`, with the identity and
|
|
112
|
+
* store it belongs to.
|
|
113
|
+
*
|
|
114
|
+
* @stability unstable
|
|
115
|
+
* @category models
|
|
116
|
+
* @since 4.0.0
|
|
117
|
+
*/
|
|
118
|
+
export interface CompactionStage {
|
|
119
|
+
readonly identity: Identity["Service"]
|
|
120
|
+
readonly storeId: StoreId
|
|
121
|
+
readonly stageId: string
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Client side of encrypted remote compaction.
|
|
126
|
+
*
|
|
127
|
+
* **Details**
|
|
128
|
+
*
|
|
129
|
+
* A run opens a stage with `begin`, reads its input headers with `input`,
|
|
130
|
+
* fetches the batches it needs with `fetch`, uploads the kept entries with
|
|
131
|
+
* `upload` and calls `commit`. `abort` releases a stage that won't be
|
|
132
|
+
* committed.
|
|
133
|
+
*
|
|
134
|
+
* @stability unstable
|
|
135
|
+
* @category models
|
|
136
|
+
* @since 4.0.0
|
|
137
|
+
*/
|
|
138
|
+
export interface EventLogRemoteCompaction {
|
|
139
|
+
readonly status: (options: {
|
|
140
|
+
readonly identity: Identity["Service"]
|
|
141
|
+
readonly storeId: StoreId
|
|
142
|
+
}) => Effect.Effect<CompactionStatus, EventLogRemoteError>
|
|
143
|
+
readonly begin: (options: {
|
|
144
|
+
readonly identity: Identity["Service"]
|
|
145
|
+
readonly storeId: StoreId
|
|
146
|
+
}) => Effect.Effect<CompactionBeginResult, EventLogRemoteError>
|
|
147
|
+
/**
|
|
148
|
+
* Streams the stage's input batch headers in input order.
|
|
149
|
+
*/
|
|
150
|
+
readonly input: (stage: CompactionStage) => Stream.Stream<CompactionInputHeader, EventLogRemoteError>
|
|
151
|
+
/**
|
|
152
|
+
* Fetches and decrypts the input batches at the given input sequences.
|
|
153
|
+
*/
|
|
154
|
+
readonly fetch: (
|
|
155
|
+
stage: CompactionStage,
|
|
156
|
+
sequences: ReadonlyArray<number>
|
|
157
|
+
) => Stream.Stream<RemoteEntry, EventLogRemoteError>
|
|
158
|
+
/**
|
|
159
|
+
* Encrypts the kept entries, in input-sequence order, and uploads them in
|
|
160
|
+
* segments of about `ChunkedMessage.chunkSize`. An oversized segment is
|
|
161
|
+
* split into pieces, and a segment is resent in full after a dropped
|
|
162
|
+
* connection.
|
|
163
|
+
*/
|
|
164
|
+
readonly upload: (
|
|
165
|
+
stage: CompactionStage,
|
|
166
|
+
entries: ReadonlyArray<Entry>
|
|
167
|
+
) => Effect.Effect<{ readonly segmentCount: number }, EventLogRemoteError>
|
|
168
|
+
readonly commit: (
|
|
169
|
+
stage: CompactionStage,
|
|
170
|
+
result: CompactionResult
|
|
171
|
+
) => Effect.Effect<"Committed" | "Superseded", EventLogRemoteError>
|
|
172
|
+
/**
|
|
173
|
+
* Releases the stage. Failures are ignored.
|
|
174
|
+
*/
|
|
175
|
+
readonly abort: (stage: CompactionStage) => Effect.Effect<void>
|
|
176
|
+
}
|
|
177
|
+
|
|
92
178
|
/**
|
|
93
179
|
* Error raised by `EventLogRemote` operations, recording the failed method and
|
|
94
180
|
* underlying cause.
|
|
@@ -112,7 +198,7 @@ export class EventLogRemoteError extends Data.TaggedError("EventLogRemoteError")
|
|
|
112
198
|
}
|
|
113
199
|
}
|
|
114
200
|
|
|
115
|
-
const getIdentityRootSecretMaterial = makeGetIdentityRootSecretMaterial(
|
|
201
|
+
const getIdentityRootSecretMaterial = makeGetIdentityRootSecretMaterial()
|
|
116
202
|
|
|
117
203
|
const makeAuthenticate = Effect.fnUntraced(function*(options: {
|
|
118
204
|
readonly identity: Identity["Service"]
|
|
@@ -146,24 +232,36 @@ const makeAuthenticate = Effect.fnUntraced(function*(options: {
|
|
|
146
232
|
* Use to provide the RPC client used by remote event-log replicas to
|
|
147
233
|
* authenticate, write entries, and subscribe to changes.
|
|
148
234
|
*
|
|
235
|
+
* **Details**
|
|
236
|
+
*
|
|
237
|
+
* The `EventLogCompactionRpcs` methods are optional. The encrypted remote
|
|
238
|
+
* offers compaction only when the client has them. `layer` builds the client
|
|
239
|
+
* from both groups.
|
|
240
|
+
*
|
|
149
241
|
* @stability unstable
|
|
150
242
|
* @category services
|
|
151
243
|
* @since 4.0.0
|
|
152
244
|
*/
|
|
153
245
|
export class EventLogRemoteClient extends Context.Service<
|
|
154
246
|
EventLogRemoteClient,
|
|
155
|
-
RpcClient.RpcClient<RpcGroup.Rpcs<typeof EventLogRemoteRpcs>, RpcClientError>
|
|
247
|
+
& RpcClient.RpcClient<RpcGroup.Rpcs<typeof EventLogRemoteRpcs>, RpcClientError>
|
|
248
|
+
& Partial<CompactionClient>
|
|
156
249
|
>()(
|
|
157
250
|
"effect/eventlog/EventLogRemote/EventLogRemoteClient"
|
|
158
251
|
) {
|
|
159
252
|
static readonly layer = Layer.effect(
|
|
160
253
|
EventLogRemoteClient,
|
|
161
|
-
RpcClient.make(EventLogRemoteRpcs, {
|
|
254
|
+
RpcClient.make(EventLogRemoteRpcs.merge(EventLogCompactionRpcs), {
|
|
162
255
|
disableTracing: true
|
|
163
256
|
})
|
|
164
257
|
)
|
|
165
258
|
}
|
|
166
259
|
|
|
260
|
+
type CompactionClient = RpcClient.RpcClient<RpcGroup.Rpcs<typeof EventLogCompactionRpcs>, RpcClientError>
|
|
261
|
+
|
|
262
|
+
const getCompactionClient = (client: EventLogRemoteClient["Service"]): CompactionClient | undefined =>
|
|
263
|
+
client["EventLog.CompactionStatus"] === undefined ? undefined : client as CompactionClient
|
|
264
|
+
|
|
167
265
|
/**
|
|
168
266
|
* Creates an `EventLogRemote` from custom write encoding and change decoding
|
|
169
267
|
* functions.
|
|
@@ -178,7 +276,7 @@ export class EventLogRemoteClient extends Context.Service<
|
|
|
178
276
|
* @category constructors
|
|
179
277
|
* @since 4.0.0
|
|
180
278
|
*/
|
|
181
|
-
export const makeWith =
|
|
279
|
+
export const makeWith = (options: {
|
|
182
280
|
readonly encodeWrite: (options: {
|
|
183
281
|
readonly identity: Identity["Service"]
|
|
184
282
|
readonly entries: ReadonlyArray<Entry>
|
|
@@ -190,6 +288,39 @@ export const makeWith = Effect.fnUntraced(function*({ encodeWrite, decodeChanges
|
|
|
190
288
|
data: Uint8Array<ArrayBuffer>,
|
|
191
289
|
knownEntries?: EventJournal["Service"]["entriesById"]
|
|
192
290
|
) => Effect.Effect<ReadonlyArray<RemoteEntry>, Schema.SchemaError | EventJournalError>
|
|
291
|
+
}): Effect.Effect<EventLogRemote["Service"], EventLogRemoteError, Scope.Scope | EventLogRemoteClient | Registry> =>
|
|
292
|
+
makeRemote(options)
|
|
293
|
+
|
|
294
|
+
interface RemoteSession {
|
|
295
|
+
readonly client: EventLogRemoteClient["Service"]
|
|
296
|
+
/** Authenticates, runs the request, and authenticates again after a refusal. */
|
|
297
|
+
readonly request: <A, E>(
|
|
298
|
+
method: string,
|
|
299
|
+
identity: Identity["Service"],
|
|
300
|
+
effect: Effect.Effect<A, E>
|
|
301
|
+
) => Effect.Effect<A, EventLogRemoteError>
|
|
302
|
+
/** Authenticates, then joins and decodes a framed response stream. */
|
|
303
|
+
readonly framed: <A, E, E2>(
|
|
304
|
+
method: string,
|
|
305
|
+
identity: Identity["Service"],
|
|
306
|
+
frames: () => Stream.Stream<SingleMessage | ChunkedMessage, E>,
|
|
307
|
+
decode: (data: Uint8Array<ArrayBuffer>) => Effect.Effect<Iterable<A>, E2>
|
|
308
|
+
) => Stream.Stream<A, EventLogRemoteError>
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
const makeRemote = Effect.fnUntraced(function*({ encodeWrite, decodeChanges, makeCompaction }: {
|
|
312
|
+
readonly encodeWrite: (options: {
|
|
313
|
+
readonly identity: Identity["Service"]
|
|
314
|
+
readonly entries: ReadonlyArray<Entry>
|
|
315
|
+
readonly storeId: StoreId
|
|
316
|
+
}) => Effect.Effect<Uint8Array<ArrayBuffer>, Schema.SchemaError>
|
|
317
|
+
readonly decodeChanges: (
|
|
318
|
+
identity: Identity["Service"],
|
|
319
|
+
storeId: StoreId,
|
|
320
|
+
data: Uint8Array<ArrayBuffer>,
|
|
321
|
+
knownEntries?: EventJournal["Service"]["entriesById"]
|
|
322
|
+
) => Effect.Effect<ReadonlyArray<RemoteEntry>, Schema.SchemaError | EventJournalError>
|
|
323
|
+
readonly makeCompaction?: ((session: RemoteSession) => EventLogRemoteCompaction | undefined) | undefined
|
|
193
324
|
}): Effect.fn.Return<EventLogRemote["Service"], EventLogRemoteError, Scope.Scope | EventLogRemoteClient | Registry> {
|
|
194
325
|
const client = yield* EventLogRemoteClient
|
|
195
326
|
const registry = yield* Registry
|
|
@@ -228,6 +359,12 @@ export const makeWith = Effect.fnUntraced(function*({ encodeWrite, decodeChanges
|
|
|
228
359
|
return Cache.get(authCache, identity.publicKey)
|
|
229
360
|
}
|
|
230
361
|
|
|
362
|
+
// The next request says hello and authenticates again.
|
|
363
|
+
const resetAuthentication = (identity: Identity["Service"]) => {
|
|
364
|
+
hello = null
|
|
365
|
+
return Cache.invalidate(authCache, identity.publicKey)
|
|
366
|
+
}
|
|
367
|
+
|
|
231
368
|
const retryForbidden = <A, E, R>(
|
|
232
369
|
effect: Effect.Effect<A, E, R>,
|
|
233
370
|
options: {
|
|
@@ -235,19 +372,47 @@ export const makeWith = Effect.fnUntraced(function*({ encodeWrite, decodeChanges
|
|
|
235
372
|
}
|
|
236
373
|
) =>
|
|
237
374
|
Effect.retry(effect, {
|
|
238
|
-
while(e)
|
|
239
|
-
hello = null
|
|
240
|
-
const error = EventLogRemoteError.is(e) && e.method === "authenticate"
|
|
241
|
-
? e.cause
|
|
242
|
-
: e
|
|
243
|
-
const isForbidden = EventLogProtocolError.is(error) && error.code === "Forbidden"
|
|
244
|
-
return Cache.invalidate(authCache, options.identity.publicKey).pipe(
|
|
245
|
-
Effect.as(isForbidden)
|
|
246
|
-
)
|
|
247
|
-
},
|
|
375
|
+
while: (e) => Effect.as(resetAuthentication(options.identity), isForbidden(e)),
|
|
248
376
|
times: 5
|
|
249
377
|
})
|
|
250
378
|
|
|
379
|
+
const toRemoteError = (method: string) => (cause: unknown) =>
|
|
380
|
+
EventLogRemoteError.is(cause) ? cause : new EventLogRemoteError({ method, cause })
|
|
381
|
+
|
|
382
|
+
const request = <A, E>(
|
|
383
|
+
method: string,
|
|
384
|
+
identity: Identity["Service"],
|
|
385
|
+
effect: Effect.Effect<A, E>
|
|
386
|
+
): Effect.Effect<A, EventLogRemoteError> =>
|
|
387
|
+
ensureAuthenticated(identity).pipe(
|
|
388
|
+
Effect.andThen(effect),
|
|
389
|
+
(effect) => retryForbidden(effect, { identity }),
|
|
390
|
+
Effect.mapError(toRemoteError(method))
|
|
391
|
+
)
|
|
392
|
+
|
|
393
|
+
// Not retried like `request`; a refused identity authenticates again on the
|
|
394
|
+
// next request.
|
|
395
|
+
const framed = <A, E, E2>(
|
|
396
|
+
method: string,
|
|
397
|
+
identity: Identity["Service"],
|
|
398
|
+
frames: () => Stream.Stream<SingleMessage | ChunkedMessage, E>,
|
|
399
|
+
decode: (data: Uint8Array<ArrayBuffer>) => Effect.Effect<Iterable<A>, E2>
|
|
400
|
+
): Stream.Stream<A, EventLogRemoteError> =>
|
|
401
|
+
Stream.unwrap(Effect.map(ensureAuthenticated(identity), () => {
|
|
402
|
+
const state = ChunkedMessage.initialJoinState()
|
|
403
|
+
return frames().pipe(
|
|
404
|
+
Stream.filterMap((frame) => {
|
|
405
|
+
const data = frame._tag === "Single" ? frame.data : ChunkedMessage.join(state, frame)
|
|
406
|
+
return data === undefined ? Result.failVoid : Result.succeed(data)
|
|
407
|
+
}),
|
|
408
|
+
Stream.mapEffect(decode),
|
|
409
|
+
Stream.flattenIterable
|
|
410
|
+
)
|
|
411
|
+
})).pipe(
|
|
412
|
+
Stream.tapError((error) => isForbidden(error) ? resetAuthentication(identity) : Effect.void),
|
|
413
|
+
Stream.mapError(toRemoteError(method))
|
|
414
|
+
)
|
|
415
|
+
|
|
251
416
|
let chunkedIdCounter = 0
|
|
252
417
|
|
|
253
418
|
const remote = EventLogRemote.of({
|
|
@@ -325,7 +490,8 @@ export const makeWith = Effect.fnUntraced(function*({ encodeWrite, decodeChanges
|
|
|
325
490
|
return outgoing
|
|
326
491
|
}),
|
|
327
492
|
whenAuthenticated: (effect) =>
|
|
328
|
-
IdentityService.use((identity) => Effect.flatMap(ensureAuthenticated(identity), () => effect))
|
|
493
|
+
IdentityService.use((identity) => Effect.flatMap(ensureAuthenticated(identity), () => effect)),
|
|
494
|
+
compaction: hello.compaction === true ? makeCompaction?.({ client, request, framed }) : undefined
|
|
329
495
|
})
|
|
330
496
|
|
|
331
497
|
yield* registry.registerRemote(remote)
|
|
@@ -333,6 +499,11 @@ export const makeWith = Effect.fnUntraced(function*({ encodeWrite, decodeChanges
|
|
|
333
499
|
return remote
|
|
334
500
|
})
|
|
335
501
|
|
|
502
|
+
const isForbidden = (e: unknown): boolean => {
|
|
503
|
+
const error = EventLogRemoteError.is(e) && e.method === "authenticate" ? e.cause : e
|
|
504
|
+
return EventLogProtocolError.is(error) && error.code === "Forbidden"
|
|
505
|
+
}
|
|
506
|
+
|
|
336
507
|
/** @effect-diagnostics-next-line classSelfMismatch:off */
|
|
337
508
|
class IdentityService extends Context.Service<Identity, Identity["Service"]>()(
|
|
338
509
|
"effect/eventlog/EventLog/Identity" satisfies Identity["key"]
|
|
@@ -342,11 +513,19 @@ class IdentityService extends Context.Service<Identity, Identity["Service"]>()(
|
|
|
342
513
|
* Creates an `EventLogRemote` that encrypts outgoing entries and decrypts
|
|
343
514
|
* incoming changes with `EventLogEncryption`.
|
|
344
515
|
*
|
|
516
|
+
* **Details**
|
|
517
|
+
*
|
|
518
|
+
* The remote has a `compaction` member when the server advertises compaction
|
|
519
|
+
* and the RPC client includes `EventLogCompactionRpcs`, unless built with
|
|
520
|
+
* `compaction: false`. Without it the client never calls the compaction RPCs.
|
|
521
|
+
*
|
|
345
522
|
* @stability unstable
|
|
346
523
|
* @category constructors
|
|
347
524
|
* @since 4.0.0
|
|
348
525
|
*/
|
|
349
|
-
export const
|
|
526
|
+
export const makeEncryptedWith = Effect.fnUntraced(function*(options: {
|
|
527
|
+
readonly compaction?: boolean | undefined
|
|
528
|
+
}): Effect.fn.Return<
|
|
350
529
|
EventLogRemote["Service"],
|
|
351
530
|
EventLogRemoteError,
|
|
352
531
|
Scope.Scope | EventLogRemoteClient | EventLogEncryption | Registry
|
|
@@ -385,7 +564,7 @@ export const makeEncrypted = Effect.gen(function*(): Effect.fn.Return<
|
|
|
385
564
|
})
|
|
386
565
|
})
|
|
387
566
|
|
|
388
|
-
return yield*
|
|
567
|
+
return yield* makeRemote({
|
|
389
568
|
encodeWrite: (options) =>
|
|
390
569
|
encryption.encrypt(options.identity, options.storeId, options.entries).pipe(
|
|
391
570
|
Effect.flatMap((batches) =>
|
|
@@ -396,10 +575,151 @@ export const makeEncrypted = Effect.gen(function*(): Effect.fn.Return<
|
|
|
396
575
|
}).encoded
|
|
397
576
|
)
|
|
398
577
|
),
|
|
399
|
-
decodeChanges
|
|
578
|
+
decodeChanges,
|
|
579
|
+
makeCompaction: options.compaction === false ? undefined : (session) => {
|
|
580
|
+
const client = getCompactionClient(session.client)
|
|
581
|
+
return client === undefined ? undefined : makeEncryptedCompaction({ session, client, encryption })
|
|
582
|
+
}
|
|
400
583
|
})
|
|
401
584
|
})
|
|
402
585
|
|
|
586
|
+
/**
|
|
587
|
+
* Creates an `EventLogRemote` that encrypts outgoing entries and decrypts
|
|
588
|
+
* incoming changes with `EventLogEncryption`.
|
|
589
|
+
*
|
|
590
|
+
* @see {@link makeEncryptedWith} for opting out of running compaction
|
|
591
|
+
*
|
|
592
|
+
* @stability unstable
|
|
593
|
+
* @category constructors
|
|
594
|
+
* @since 4.0.0
|
|
595
|
+
*/
|
|
596
|
+
export const makeEncrypted: Effect.Effect<
|
|
597
|
+
EventLogRemote["Service"],
|
|
598
|
+
EventLogRemoteError,
|
|
599
|
+
Scope.Scope | EventLogRemoteClient | EventLogEncryption | Registry
|
|
600
|
+
> = makeEncryptedWith({})
|
|
601
|
+
|
|
602
|
+
// How many times a segment is sent before a dropped connection, an
|
|
603
|
+
// `RpcClientError`, fails the upload.
|
|
604
|
+
const segmentAttempts = 3
|
|
605
|
+
|
|
606
|
+
const makeEncryptedCompaction = ({ client, encryption, session: { framed, request } }: {
|
|
607
|
+
readonly session: RemoteSession
|
|
608
|
+
readonly client: CompactionClient
|
|
609
|
+
readonly encryption: EventLogEncryption["Service"]
|
|
610
|
+
}): EventLogRemoteCompaction => {
|
|
611
|
+
const stageRequest = (stage: CompactionStage) => ({
|
|
612
|
+
publicKey: stage.identity.publicKey,
|
|
613
|
+
storeId: stage.storeId,
|
|
614
|
+
stageId: stage.stageId
|
|
615
|
+
})
|
|
616
|
+
|
|
617
|
+
return {
|
|
618
|
+
status: ({ identity, storeId }) =>
|
|
619
|
+
request(
|
|
620
|
+
"compactionStatus",
|
|
621
|
+
identity,
|
|
622
|
+
client["EventLog.CompactionStatus"]({ publicKey: identity.publicKey, storeId })
|
|
623
|
+
),
|
|
624
|
+
begin: ({ identity, storeId }) =>
|
|
625
|
+
request(
|
|
626
|
+
"compactionBegin",
|
|
627
|
+
identity,
|
|
628
|
+
client["EventLog.CompactionBegin"]({ publicKey: identity.publicKey, storeId })
|
|
629
|
+
),
|
|
630
|
+
input: (stage) =>
|
|
631
|
+
framed(
|
|
632
|
+
"compactionInput",
|
|
633
|
+
stage.identity,
|
|
634
|
+
() => client["EventLog.CompactionInput"](stageRequest(stage)),
|
|
635
|
+
CompactionInputRpc.decodeHeaders
|
|
636
|
+
),
|
|
637
|
+
fetch: (stage, sequences) =>
|
|
638
|
+
framed(
|
|
639
|
+
"compactionFetch",
|
|
640
|
+
stage.identity,
|
|
641
|
+
() => client["EventLog.CompactionFetch"]({ ...stageRequest(stage), batches: sequences }),
|
|
642
|
+
(data) =>
|
|
643
|
+
Effect.flatMap(
|
|
644
|
+
ChangesRpc.decodeEncrypted(data),
|
|
645
|
+
(batches) => encryption.decrypt(stage.identity, stage.storeId, batches)
|
|
646
|
+
)
|
|
647
|
+
),
|
|
648
|
+
upload: (stage, entries) =>
|
|
649
|
+
Effect.suspend(() => {
|
|
650
|
+
let segment: Array<EncryptedBatch> = []
|
|
651
|
+
let segmentBytes = 0
|
|
652
|
+
let segmentCount = 0
|
|
653
|
+
|
|
654
|
+
// The server forgets a segment's pieces when the connection drops, so a
|
|
655
|
+
// retry resends all of them.
|
|
656
|
+
const sendSegment = Effect.suspend(() => {
|
|
657
|
+
if (!Arr.isArrayNonEmpty(segment)) return Effect.void
|
|
658
|
+
const batches = segment
|
|
659
|
+
const id = segmentCount++
|
|
660
|
+
segment = []
|
|
661
|
+
segmentBytes = 0
|
|
662
|
+
return Effect.flatMap(CompactionPartRpc.encodeSegment(batches), (data) => {
|
|
663
|
+
const pieces = ChunkedMessage.split(id, data)
|
|
664
|
+
return request(
|
|
665
|
+
"compactionUpload",
|
|
666
|
+
stage.identity,
|
|
667
|
+
Effect.forEach(
|
|
668
|
+
pieces,
|
|
669
|
+
(chunk) => client["EventLog.CompactionPart"]({ ...stageRequest(stage), chunk }),
|
|
670
|
+
{ discard: true }
|
|
671
|
+
).pipe(
|
|
672
|
+
Effect.retry({ while: (error) => error._tag === "RpcClientError", times: segmentAttempts - 1 })
|
|
673
|
+
)
|
|
674
|
+
)
|
|
675
|
+
})
|
|
676
|
+
})
|
|
677
|
+
|
|
678
|
+
// Whole batches go into a segment until the next one would take it
|
|
679
|
+
// past `ChunkedMessage.chunkSize`.
|
|
680
|
+
const addBatch = (batch: Arr.NonEmptyArray<Entry>) =>
|
|
681
|
+
Effect.flatMap(encryption.encrypt(stage.identity, stage.storeId, batch), (encrypted) =>
|
|
682
|
+
Effect.forEach(encrypted, (batch) => {
|
|
683
|
+
const size = encodedBatchSize(batch)
|
|
684
|
+
const send = segment.length > 0 && segmentBytes + size > ChunkedMessage.chunkSize
|
|
685
|
+
? sendSegment
|
|
686
|
+
: Effect.void
|
|
687
|
+
return Effect.andThen(
|
|
688
|
+
send,
|
|
689
|
+
Effect.sync(() => {
|
|
690
|
+
segment.push(batch)
|
|
691
|
+
segmentBytes += size
|
|
692
|
+
})
|
|
693
|
+
)
|
|
694
|
+
}, { discard: true }))
|
|
695
|
+
|
|
696
|
+
return Effect.forEach(toBatches(entries), addBatch, { discard: true }).pipe(
|
|
697
|
+
Effect.andThen(sendSegment),
|
|
698
|
+
Effect.map(() => ({ segmentCount })),
|
|
699
|
+
Effect.mapError((cause) =>
|
|
700
|
+
EventLogRemoteError.is(cause) ? cause : new EventLogRemoteError({ method: "compactionUpload", cause })
|
|
701
|
+
)
|
|
702
|
+
)
|
|
703
|
+
}),
|
|
704
|
+
commit: (stage, result) =>
|
|
705
|
+
request(
|
|
706
|
+
"compactionCommit",
|
|
707
|
+
stage.identity,
|
|
708
|
+
client["EventLog.CompactionCommit"]({ ...stageRequest(stage), result })
|
|
709
|
+
),
|
|
710
|
+
abort: (stage) =>
|
|
711
|
+
request(
|
|
712
|
+
"compactionAbort",
|
|
713
|
+
stage.identity,
|
|
714
|
+
client["EventLog.CompactionAbort"](stageRequest(stage))
|
|
715
|
+
).pipe(Effect.ignore)
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
// Ignores the segment framing.
|
|
720
|
+
const encodedBatchSize = (batch: EncryptedBatch): number =>
|
|
721
|
+
batch.encryptedBatch.byteLength + batch.iv.byteLength + batch.entryIds.length * 16
|
|
722
|
+
|
|
403
723
|
/**
|
|
404
724
|
* Creates an `EventLogRemote` that sends and receives plaintext entry payloads.
|
|
405
725
|
*
|
|
@@ -425,6 +745,33 @@ export const makeUnencrypted: Effect.Effect<
|
|
|
425
745
|
* Provides an encrypted `EventLogRemote` using the remote RPC client and the
|
|
426
746
|
* default Web Crypto encryption layer.
|
|
427
747
|
*
|
|
748
|
+
* **Details**
|
|
749
|
+
*
|
|
750
|
+
* `compaction: false` leaves the remote without its `compaction` member, so
|
|
751
|
+
* this client never calls the compaction RPCs.
|
|
752
|
+
*
|
|
753
|
+
* @stability unstable
|
|
754
|
+
* @category layers
|
|
755
|
+
* @since 4.0.0
|
|
756
|
+
*/
|
|
757
|
+
export const layerEncryptedWith = (options: {
|
|
758
|
+
readonly compaction?: boolean | undefined
|
|
759
|
+
}): Layer.Layer<
|
|
760
|
+
EventLogRemote,
|
|
761
|
+
EventLogRemoteError,
|
|
762
|
+
RpcClient.Protocol | Registry
|
|
763
|
+
> =>
|
|
764
|
+
Layer.effect(EventLogRemote, makeEncryptedWith(options)).pipe(
|
|
765
|
+
Layer.provide(EventLogRemoteClient.layer),
|
|
766
|
+
Layer.provide(layerSubtle)
|
|
767
|
+
)
|
|
768
|
+
|
|
769
|
+
/**
|
|
770
|
+
* Provides an encrypted `EventLogRemote` using the remote RPC client and the
|
|
771
|
+
* default Web Crypto encryption layer.
|
|
772
|
+
*
|
|
773
|
+
* @see {@link layerEncryptedWith} for opting out of running compaction
|
|
774
|
+
*
|
|
428
775
|
* @stability unstable
|
|
429
776
|
* @category layers
|
|
430
777
|
* @since 4.0.0
|
|
@@ -433,10 +780,7 @@ export const layerEncrypted: Layer.Layer<
|
|
|
433
780
|
EventLogRemote,
|
|
434
781
|
EventLogRemoteError,
|
|
435
782
|
RpcClient.Protocol | Registry
|
|
436
|
-
> =
|
|
437
|
-
Layer.provide(EventLogRemoteClient.layer),
|
|
438
|
-
Layer.provide(layerSubtle)
|
|
439
|
-
)
|
|
783
|
+
> = layerEncryptedWith({})
|
|
440
784
|
|
|
441
785
|
/**
|
|
442
786
|
* Provides an unencrypted `EventLogRemote` using the remote RPC client.
|
|
@@ -13,6 +13,7 @@ import type { NonEmptyReadonlyArray } from "../Array.ts"
|
|
|
13
13
|
import * as Arr from "../Array.ts"
|
|
14
14
|
import * as Cache from "../Cache.ts"
|
|
15
15
|
import * as Context from "../Context.ts"
|
|
16
|
+
import * as Mac from "../crypto/Mac.ts"
|
|
16
17
|
import * as Data from "../Data.ts"
|
|
17
18
|
import * as Duration from "../Duration.ts"
|
|
18
19
|
import * as Effect from "../Effect.ts"
|
|
@@ -76,8 +77,16 @@ export const layerAuthMiddleware: Layer.Layer<
|
|
|
76
77
|
* chunked writes, delegates write and change handling to the supplied callbacks,
|
|
77
78
|
* and frames large change payloads into chunks.
|
|
78
79
|
*
|
|
80
|
+
* `Authenticate` calls `authorizeIdentity` with the claimed public key and the
|
|
81
|
+
* presented signing public key, then verifies the signature against the
|
|
82
|
+
* presented key. Only a verified key is passed to
|
|
83
|
+
* `getOrCreateSessionAuthBinding`, and a key that differs from the identity's
|
|
84
|
+
* existing binding is rejected.
|
|
85
|
+
*
|
|
79
86
|
* Use the connection's `ConnectionWrites.track` in `onWrite` and
|
|
80
87
|
* `ConnectionWrites.filter` in `changes` to suppress its own write echoes.
|
|
88
|
+
* `compaction` sets `HelloResponse.compaction`, advertising that the server
|
|
89
|
+
* also serves `EventLogCompactionRpcs`.
|
|
81
90
|
*
|
|
82
91
|
* @stability unstable
|
|
83
92
|
* @category layers
|
|
@@ -86,7 +95,11 @@ export const layerAuthMiddleware: Layer.Layer<
|
|
|
86
95
|
export const layerRpcHandlers = (options: {
|
|
87
96
|
readonly remoteId: RemoteId
|
|
88
97
|
readonly firstSequence?: number | undefined
|
|
89
|
-
readonly
|
|
98
|
+
readonly compaction?: boolean | undefined
|
|
99
|
+
readonly authorizeIdentity?: (
|
|
100
|
+
publicKey: string,
|
|
101
|
+
signingPublicKey: Uint8Array<ArrayBuffer>
|
|
102
|
+
) => Effect.Effect<void, EventLogProtocolError>
|
|
90
103
|
readonly getOrCreateSessionAuthBinding: (
|
|
91
104
|
publicKey: string,
|
|
92
105
|
signingPublicKey: Uint8Array<ArrayBuffer>
|
|
@@ -111,7 +124,7 @@ export const layerRpcHandlers = (options: {
|
|
|
111
124
|
capacity: Number.MAX_SAFE_INTEGER,
|
|
112
125
|
timeToLive: EventLogSessionAuth.SessionAuthChallengeTimeToLiveMillis
|
|
113
126
|
})
|
|
114
|
-
|
|
127
|
+
const toFrames = makeFramer()
|
|
115
128
|
|
|
116
129
|
const persistedSigningPublicKeys = yield* Cache.makeWith(
|
|
117
130
|
(key: SessionAuthCacheKey) =>
|
|
@@ -139,7 +152,8 @@ export const layerRpcHandlers = (options: {
|
|
|
139
152
|
return new HelloResponse({
|
|
140
153
|
remoteId: options.remoteId,
|
|
141
154
|
challenge,
|
|
142
|
-
firstSequence: options.firstSequence
|
|
155
|
+
firstSequence: options.firstSequence,
|
|
156
|
+
compaction: options.compaction === true ? true : undefined
|
|
143
157
|
})
|
|
144
158
|
}),
|
|
145
159
|
"EventLog.Authenticate": Effect.fnUntraced(function*(request, { client }) {
|
|
@@ -154,33 +168,40 @@ export const layerRpcHandlers = (options: {
|
|
|
154
168
|
}
|
|
155
169
|
yield* Cache.invalidate(clientChallenges, client.id)
|
|
156
170
|
if (options.authorizeIdentity) {
|
|
157
|
-
yield* options.authorizeIdentity(request.publicKey)
|
|
171
|
+
yield* options.authorizeIdentity(request.publicKey, request.signingPublicKey)
|
|
158
172
|
}
|
|
159
|
-
const signingPublicKey = yield* Cache.get(
|
|
160
|
-
persistedSigningPublicKeys,
|
|
161
|
-
new SessionAuthCacheKey({
|
|
162
|
-
publicKey: request.publicKey,
|
|
163
|
-
signingPublicKey: request.signingPublicKey
|
|
164
|
-
})
|
|
165
|
-
)
|
|
166
173
|
const verified = yield* EventLogSessionAuth.verifySessionAuthenticateRequest({
|
|
167
174
|
remoteId: options.remoteId,
|
|
168
175
|
challenge,
|
|
169
176
|
publicKey: request.publicKey,
|
|
170
|
-
signingPublicKey,
|
|
177
|
+
signingPublicKey: request.signingPublicKey,
|
|
171
178
|
signature: request.signature,
|
|
172
179
|
algorithm: request.algorithm
|
|
173
180
|
}).pipe(
|
|
174
181
|
Effect.catch(() => Effect.succeed(false))
|
|
175
182
|
)
|
|
176
183
|
|
|
177
|
-
|
|
178
|
-
|
|
184
|
+
const verificationFailed = () =>
|
|
185
|
+
new EventLogProtocolError({
|
|
179
186
|
requestTag: "Authenticate",
|
|
180
187
|
publicKey: request.publicKey,
|
|
181
188
|
code: "Forbidden",
|
|
182
189
|
message: "Session auth signature verification failed"
|
|
183
190
|
})
|
|
191
|
+
if (!verified) {
|
|
192
|
+
return yield* verificationFailed()
|
|
193
|
+
}
|
|
194
|
+
// Only a verified key reaches the binding. A key other than the
|
|
195
|
+
// identity's bound key is rejected like a bad signature.
|
|
196
|
+
const boundSigningPublicKey = yield* Cache.get(
|
|
197
|
+
persistedSigningPublicKeys,
|
|
198
|
+
new SessionAuthCacheKey({
|
|
199
|
+
publicKey: request.publicKey,
|
|
200
|
+
signingPublicKey: request.signingPublicKey
|
|
201
|
+
})
|
|
202
|
+
)
|
|
203
|
+
if (!Mac.timingSafeEqual(boundSigningPublicKey, request.signingPublicKey)) {
|
|
204
|
+
return yield* verificationFailed()
|
|
184
205
|
}
|
|
185
206
|
|
|
186
207
|
const authenticatedIdentities = new Set(
|
|
@@ -229,12 +250,7 @@ export const layerRpcHandlers = (options: {
|
|
|
229
250
|
startSequence: request.startSequence,
|
|
230
251
|
writes: getConnectionWrites(client)
|
|
231
252
|
}).pipe(
|
|
232
|
-
Stream.mapArray(Arr.flatMap(
|
|
233
|
-
if (data.byteLength <= ChunkedMessage.chunkSize) {
|
|
234
|
-
return [new SingleMessage({ data })]
|
|
235
|
-
}
|
|
236
|
-
return ChunkedMessage.split(chunkedIdCounter++, data)
|
|
237
|
-
})),
|
|
253
|
+
Stream.mapArray(Arr.flatMap(toFrames)),
|
|
238
254
|
Stream.catchCause((_) =>
|
|
239
255
|
Stream.fail(
|
|
240
256
|
new EventLogProtocolError({
|
|
@@ -412,6 +428,8 @@ export class AuthenticatedIdentities extends Context.Service<AuthenticatedIdenti
|
|
|
412
428
|
"effect/eventlog/EventLogServer/AuthenticatedIdentities"
|
|
413
429
|
) {}
|
|
414
430
|
|
|
431
|
+
// Keyed by `publicKey` alone: the cache holds each identity's bound signing
|
|
432
|
+
// key, and `Authenticate` rejects any presented key that differs from it.
|
|
415
433
|
class SessionAuthCacheKey extends Data.Class<{
|
|
416
434
|
readonly publicKey: string
|
|
417
435
|
readonly signingPublicKey: Uint8Array<ArrayBuffer>
|
|
@@ -424,4 +442,20 @@ class SessionAuthCacheKey extends Data.Class<{
|
|
|
424
442
|
}
|
|
425
443
|
}
|
|
426
444
|
|
|
445
|
+
/**
|
|
446
|
+
* Frames one encoded message for a response stream: a `SingleMessage` when it
|
|
447
|
+
* fits, or the pieces of a `ChunkedMessage` with the next id otherwise.
|
|
448
|
+
*
|
|
449
|
+
* @internal
|
|
450
|
+
*/
|
|
451
|
+
export const makeFramer = (): (
|
|
452
|
+
data: Uint8Array<ArrayBuffer>
|
|
453
|
+
) => NonEmptyReadonlyArray<SingleMessage | ChunkedMessage> => {
|
|
454
|
+
let chunkedIdCounter = 0
|
|
455
|
+
return (data) =>
|
|
456
|
+
data.byteLength <= ChunkedMessage.chunkSize
|
|
457
|
+
? [new SingleMessage({ data })]
|
|
458
|
+
: ChunkedMessage.split(chunkedIdCounter++, data)
|
|
459
|
+
}
|
|
460
|
+
|
|
427
461
|
const constEmptyPrivateKey = Redacted.make(new Uint8Array(32))
|