@db3.ai/app 0.1.0-beta.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/LICENSE +31 -0
- package/README.md +241 -0
- package/agent-instructions.md +69 -0
- package/bin/db3-agents.mjs +140 -0
- package/bin/db3.mjs +11 -0
- package/dist/ai/AIErrors.d.ts +33 -0
- package/dist/ai/AIErrors.js +43 -0
- package/dist/ai/AIFailover.d.ts +25 -0
- package/dist/ai/AIFailover.js +96 -0
- package/dist/ai/AIProviders.d.ts +35 -0
- package/dist/ai/AIProviders.js +197 -0
- package/dist/ai/AIQuotaDeferredError.d.ts +19 -0
- package/dist/ai/AIQuotaDeferredError.js +25 -0
- package/dist/ai/AIRateLimiter.d.ts +103 -0
- package/dist/ai/AIRateLimiter.js +690 -0
- package/dist/ai/Agent.d.ts +633 -0
- package/dist/ai/Agent.js +2976 -0
- package/dist/ai/AgentHistory.d.ts +11 -0
- package/dist/ai/AgentHistory.js +495 -0
- package/dist/ai/AgentRunJob.d.ts +21 -0
- package/dist/ai/AgentRunJob.js +53 -0
- package/dist/ai/Ai.d.ts +375 -0
- package/dist/ai/Ai.js +1771 -0
- package/dist/ai/AiConversation.d.ts +17 -0
- package/dist/ai/AiConversation.js +38 -0
- package/dist/ai/AiExecutionContext.d.ts +7 -0
- package/dist/ai/AiExecutionContext.js +16 -0
- package/dist/ai/AiMessage.d.ts +43 -0
- package/dist/ai/AiMessage.js +105 -0
- package/dist/ai/AiRateLimitBucket.d.ts +69 -0
- package/dist/ai/AiRateLimitBucket.js +138 -0
- package/dist/ai/AiRateLimitReservation.d.ts +56 -0
- package/dist/ai/AiRateLimitReservation.js +101 -0
- package/dist/ai/AiRequest.d.ts +78 -0
- package/dist/ai/AiRequest.js +384 -0
- package/dist/ai/Estimates.d.ts +26 -0
- package/dist/ai/Estimates.js +34 -0
- package/dist/ai/Models.d.ts +88 -0
- package/dist/ai/Models.js +328 -0
- package/dist/ai/OpenAIProviderError.d.ts +30 -0
- package/dist/ai/OpenAIProviderError.js +77 -0
- package/dist/ai/OpenAIQuotaRetry.d.ts +27 -0
- package/dist/ai/OpenAIQuotaRetry.js +144 -0
- package/dist/ai/ProviderCosts.d.ts +55 -0
- package/dist/ai/ProviderCosts.js +108 -0
- package/dist/ai/ResponsesProviderCall.d.ts +13 -0
- package/dist/ai/ResponsesProviderCall.js +29 -0
- package/dist/ai/agentCitations.d.ts +27 -0
- package/dist/ai/agentCitations.js +153 -0
- package/dist/ai/contracts/AI.d.ts +347 -0
- package/dist/ai/contracts/AI.js +13 -0
- package/dist/ai/contracts/Agent.d.ts +476 -0
- package/dist/ai/contracts/Agent.js +1 -0
- package/dist/ai/contracts/AiRequestRunCostSummary.d.ts +31 -0
- package/dist/ai/contracts/AiRequestRunCostSummary.js +1 -0
- package/dist/ai/contracts/Pricing.d.ts +88 -0
- package/dist/ai/contracts/Pricing.js +1 -0
- package/dist/ai/contracts/Providers.d.ts +68 -0
- package/dist/ai/contracts/Providers.js +1 -0
- package/dist/ai/contracts/QuotaRetry.d.ts +38 -0
- package/dist/ai/contracts/QuotaRetry.js +1 -0
- package/dist/ai/contracts/RateLimits.d.ts +45 -0
- package/dist/ai/contracts/RateLimits.js +1 -0
- package/dist/ai/contracts/ResponsesProviderCall.d.ts +28 -0
- package/dist/ai/contracts/ResponsesProviderCall.js +1 -0
- package/dist/ai/contracts/index.d.ts +8 -0
- package/dist/ai/contracts/index.js +8 -0
- package/dist/ai/index.d.ts +27 -0
- package/dist/ai/index.js +27 -0
- package/dist/ai/registry.d.ts +28 -0
- package/dist/ai/registry.js +49 -0
- package/dist/ai/sdkNodeCompatibility.d.ts +76 -0
- package/dist/ai/toolCallRecovery.d.ts +16 -0
- package/dist/ai/toolCallRecovery.js +71 -0
- package/dist/ai/toolHelpers.d.ts +65 -0
- package/dist/ai/toolHelpers.js +106 -0
- package/dist/auth/Auth.d.ts +641 -0
- package/dist/auth/Auth.js +927 -0
- package/dist/auth/AuthProvider.d.ts +104 -0
- package/dist/auth/AuthProvider.js +185 -0
- package/dist/auth/AuthToken.d.ts +123 -0
- package/dist/auth/AuthToken.js +156 -0
- package/dist/auth/PasswordResetToken.d.ts +33 -0
- package/dist/auth/PasswordResetToken.js +64 -0
- package/dist/auth/UserIdentity.d.ts +46 -0
- package/dist/auth/UserIdentity.js +72 -0
- package/dist/auth/contracts/AuthProviderDriver.d.ts +94 -0
- package/dist/auth/contracts/AuthProviderDriver.js +1 -0
- package/dist/auth/contracts/index.d.ts +1 -0
- package/dist/auth/contracts/index.js +1 -0
- package/dist/auth/index.d.ts +8 -0
- package/dist/auth/index.js +8 -0
- package/dist/auth/passwordHash.d.ts +26 -0
- package/dist/auth/passwordHash.js +96 -0
- package/dist/auth/providers/GoogleAuthProvider.d.ts +135 -0
- package/dist/auth/providers/GoogleAuthProvider.js +305 -0
- package/dist/auth/providers/PasswordAuthProvider.d.ts +115 -0
- package/dist/auth/providers/PasswordAuthProvider.js +195 -0
- package/dist/auth/providers/index.d.ts +3 -0
- package/dist/auth/providers/index.js +3 -0
- package/dist/auth/providers/resolveAuthProviders.d.ts +29 -0
- package/dist/auth/providers/resolveAuthProviders.js +111 -0
- package/dist/cache/Cache.d.ts +67 -0
- package/dist/cache/Cache.js +115 -0
- package/dist/cache/contracts/CacheDriver.d.ts +10 -0
- package/dist/cache/contracts/CacheDriver.js +1 -0
- package/dist/cache/contracts/CacheOperations.d.ts +26 -0
- package/dist/cache/contracts/CacheOperations.js +1 -0
- package/dist/cache/contracts/CacheOptions.d.ts +51 -0
- package/dist/cache/contracts/CacheOptions.js +1 -0
- package/dist/cache/contracts/CacheRepository.d.ts +45 -0
- package/dist/cache/contracts/CacheRepository.js +1 -0
- package/dist/cache/contracts/index.d.ts +4 -0
- package/dist/cache/contracts/index.js +4 -0
- package/dist/cache/drivers/CacheManagerDriver.d.ts +55 -0
- package/dist/cache/drivers/CacheManagerDriver.js +68 -0
- package/dist/cache/drivers/createCacheDriver.d.ts +8 -0
- package/dist/cache/drivers/createCacheDriver.js +147 -0
- package/dist/cache/index.d.ts +2 -0
- package/dist/cache/index.js +2 -0
- package/dist/cli/Cli.d.ts +17 -0
- package/dist/cli/Cli.js +120 -0
- package/dist/cli/commands/repl.d.ts +9 -0
- package/dist/cli/commands/repl.js +27 -0
- package/dist/cli/contracts/CliCommand.d.ts +30 -0
- package/dist/cli/contracts/CliCommand.js +1 -0
- package/dist/cli/contracts/CliConfig.d.ts +9 -0
- package/dist/cli/contracts/CliConfig.js +1 -0
- package/dist/cli/contracts/CliOptions.d.ts +13 -0
- package/dist/cli/contracts/CliOptions.js +1 -0
- package/dist/cli/contracts/CommandDefinition.d.ts +18 -0
- package/dist/cli/contracts/CommandDefinition.js +1 -0
- package/dist/cli/contracts/ReplOptions.d.ts +11 -0
- package/dist/cli/contracts/ReplOptions.js +1 -0
- package/dist/cli/contracts/index.d.ts +5 -0
- package/dist/cli/contracts/index.js +1 -0
- package/dist/cli/defineCommand.d.ts +10 -0
- package/dist/cli/defineCommand.js +25 -0
- package/dist/cli/index.d.ts +5 -0
- package/dist/cli/index.js +5 -0
- package/dist/cli/runDb3.d.ts +11 -0
- package/dist/cli/runDb3.js +70 -0
- package/dist/cli/runRepl.d.ts +12 -0
- package/dist/cli/runRepl.js +54 -0
- package/dist/config/Config.d.ts +48 -0
- package/dist/config/Config.js +80 -0
- package/dist/config/env.d.ts +26 -0
- package/dist/config/env.js +117 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.js +2 -0
- package/dist/db/ActiveProjection.d.ts +90 -0
- package/dist/db/ActiveProjection.js +134 -0
- package/dist/db/ActiveQueryBuilder.d.ts +268 -0
- package/dist/db/ActiveQueryBuilder.js +621 -0
- package/dist/db/ActiveRecord.d.ts +483 -0
- package/dist/db/ActiveRecord.js +765 -0
- package/dist/db/Database.d.ts +277 -0
- package/dist/db/Database.js +827 -0
- package/dist/db/FieldType.d.ts +540 -0
- package/dist/db/FieldType.js +706 -0
- package/dist/db/SoftDeletes.d.ts +30 -0
- package/dist/db/SoftDeletes.js +93 -0
- package/dist/db/commands/check.d.ts +6 -0
- package/dist/db/commands/check.js +8 -0
- package/dist/db/commands/index.d.ts +6 -0
- package/dist/db/commands/index.js +17 -0
- package/dist/db/commands/makeMigration.d.ts +7 -0
- package/dist/db/commands/makeMigration.js +9 -0
- package/dist/db/commands/migrate.d.ts +6 -0
- package/dist/db/commands/migrate.js +8 -0
- package/dist/db/connection.d.ts +10 -0
- package/dist/db/connection.js +55 -0
- package/dist/db/contracts/ActiveRecordDefinition.d.ts +64 -0
- package/dist/db/contracts/ActiveRecordDefinition.js +1 -0
- package/dist/db/contracts/DatabaseBackup.d.ts +7 -0
- package/dist/db/contracts/DatabaseBackup.js +1 -0
- package/dist/db/contracts/DatabaseMigrationsConfig.d.ts +9 -0
- package/dist/db/contracts/DatabaseMigrationsConfig.js +1 -0
- package/dist/db/contracts/index.d.ts +3 -0
- package/dist/db/contracts/index.js +3 -0
- package/dist/db/dialects/columnTypes.d.ts +20 -0
- package/dist/db/dialects/columnTypes.js +67 -0
- package/dist/db/dialects/index.d.ts +6 -0
- package/dist/db/dialects/index.js +6 -0
- package/dist/db/dialects/mariadb.d.ts +7 -0
- package/dist/db/dialects/mariadb.js +35 -0
- package/dist/db/dialects/mysql.d.ts +14 -0
- package/dist/db/dialects/mysql.js +203 -0
- package/dist/db/dialects/postgres.d.ts +5 -0
- package/dist/db/dialects/postgres.js +106 -0
- package/dist/db/dialects/resolveDialect.d.ts +14 -0
- package/dist/db/dialects/resolveDialect.js +57 -0
- package/dist/db/dialects/types.d.ts +44 -0
- package/dist/db/dialects/types.js +1 -0
- package/dist/db/errors.d.ts +15 -0
- package/dist/db/errors.js +20 -0
- package/dist/db/fields/BooleanField.d.ts +29 -0
- package/dist/db/fields/BooleanField.js +89 -0
- package/dist/db/fields/CharUuidField.d.ts +29 -0
- package/dist/db/fields/CharUuidField.js +63 -0
- package/dist/db/fields/ChoiceStringField.d.ts +25 -0
- package/dist/db/fields/ChoiceStringField.js +58 -0
- package/dist/db/fields/DecimalField.d.ts +20 -0
- package/dist/db/fields/DecimalField.js +105 -0
- package/dist/db/fields/EmailField.d.ts +31 -0
- package/dist/db/fields/EmailField.js +52 -0
- package/dist/db/fields/EncryptedJsonField.d.ts +82 -0
- package/dist/db/fields/EncryptedJsonField.js +169 -0
- package/dist/db/fields/IntegerField.d.ts +35 -0
- package/dist/db/fields/IntegerField.js +139 -0
- package/dist/db/fields/JsonField.d.ts +40 -0
- package/dist/db/fields/JsonField.js +79 -0
- package/dist/db/fields/JsonStringField.d.ts +21 -0
- package/dist/db/fields/JsonStringField.js +41 -0
- package/dist/db/fields/LinkField.d.ts +180 -0
- package/dist/db/fields/LinkField.js +359 -0
- package/dist/db/fields/PasswordField.d.ts +93 -0
- package/dist/db/fields/PasswordField.js +180 -0
- package/dist/db/fields/StringField.d.ts +43 -0
- package/dist/db/fields/StringField.js +102 -0
- package/dist/db/fields/StringListField.d.ts +54 -0
- package/dist/db/fields/StringListField.js +124 -0
- package/dist/db/fields/TextField.d.ts +25 -0
- package/dist/db/fields/TextField.js +44 -0
- package/dist/db/fields/TimestampField.d.ts +47 -0
- package/dist/db/fields/TimestampField.js +97 -0
- package/dist/db/fields/UlidField.d.ts +69 -0
- package/dist/db/fields/UlidField.js +114 -0
- package/dist/db/fields/UrlField.d.ts +30 -0
- package/dist/db/fields/UrlField.js +61 -0
- package/dist/db/fields/VectorField.d.ts +64 -0
- package/dist/db/fields/VectorField.js +180 -0
- package/dist/db/fields/createField.d.ts +2 -0
- package/dist/db/fields/createField.js +13 -0
- package/dist/db/fields/field.d.ts +36 -0
- package/dist/db/fields/field.js +101 -0
- package/dist/db/fields/index.d.ts +18 -0
- package/dist/db/fields/index.js +18 -0
- package/dist/db/fields/resolveFields.d.ts +17 -0
- package/dist/db/fields/resolveFields.js +38 -0
- package/dist/db/index.d.ts +13 -0
- package/dist/db/index.js +13 -0
- package/dist/db/migrations/DatabaseMigrationManager.d.ts +57 -0
- package/dist/db/migrations/DatabaseMigrationManager.js +589 -0
- package/dist/db/migrations/DatabaseSchemaInspector.d.ts +19 -0
- package/dist/db/migrations/DatabaseSchemaInspector.js +384 -0
- package/dist/db/migrations/KnexMigrationRenderer.d.ts +11 -0
- package/dist/db/migrations/KnexMigrationRenderer.js +390 -0
- package/dist/db/migrations/ModelSchemaCollector.d.ts +29 -0
- package/dist/db/migrations/ModelSchemaCollector.js +183 -0
- package/dist/db/migrations/SchemaDiffer.d.ts +13 -0
- package/dist/db/migrations/SchemaDiffer.js +427 -0
- package/dist/db/migrations/SchemaNames.d.ts +27 -0
- package/dist/db/migrations/SchemaNames.js +46 -0
- package/dist/db/migrations/SchemaSnapshotSerializer.d.ts +30 -0
- package/dist/db/migrations/SchemaSnapshotSerializer.js +49 -0
- package/dist/db/migrations/contracts/DatabaseMigration.d.ts +118 -0
- package/dist/db/migrations/contracts/DatabaseMigration.js +1 -0
- package/dist/db/migrations/contracts/SchemaChange.d.ts +83 -0
- package/dist/db/migrations/contracts/SchemaChange.js +1 -0
- package/dist/db/migrations/contracts/SchemaSnapshot.d.ts +94 -0
- package/dist/db/migrations/contracts/SchemaSnapshot.js +1 -0
- package/dist/db/migrations/contracts/index.d.ts +3 -0
- package/dist/db/migrations/contracts/index.js +3 -0
- package/dist/db/migrations/errors.d.ts +35 -0
- package/dist/db/migrations/errors.js +45 -0
- package/dist/db/migrations/index.d.ts +10 -0
- package/dist/db/migrations/index.js +10 -0
- package/dist/db/migrations/promoteDestructiveSchemaChanges.d.ts +19 -0
- package/dist/db/migrations/promoteDestructiveSchemaChanges.js +102 -0
- package/dist/db/queryMonitor.d.ts +142 -0
- package/dist/db/queryMonitor.js +357 -0
- package/dist/db/sqlErrors.d.ts +11 -0
- package/dist/db/sqlErrors.js +17 -0
- package/dist/db/test/db.d.ts +11 -0
- package/dist/db/test/db.js +109 -0
- package/dist/devtools/HttpEventDispatcher.d.ts +19 -0
- package/dist/devtools/HttpEventDispatcher.js +180 -0
- package/dist/devtools/contracts/DevtoolsEventDispatcher.d.ts +53 -0
- package/dist/devtools/contracts/DevtoolsEventDispatcher.js +1 -0
- package/dist/devtools/contracts/index.d.ts +1 -0
- package/dist/devtools/contracts/index.js +1 -0
- package/dist/devtools/environment.d.ts +10 -0
- package/dist/devtools/environment.js +14 -0
- package/dist/devtools/index.d.ts +3 -0
- package/dist/devtools/index.js +3 -0
- package/dist/events/Events.d.ts +70 -0
- package/dist/events/Events.js +126 -0
- package/dist/events/contracts/EventConstructor.d.ts +12 -0
- package/dist/events/contracts/EventConstructor.js +1 -0
- package/dist/events/contracts/EventListener.d.ts +6 -0
- package/dist/events/contracts/EventListener.js +1 -0
- package/dist/events/contracts/EventUnsubscribe.d.ts +4 -0
- package/dist/events/contracts/EventUnsubscribe.js +1 -0
- package/dist/events/contracts/index.d.ts +3 -0
- package/dist/events/contracts/index.js +3 -0
- package/dist/events/index.d.ts +2 -0
- package/dist/events/index.js +2 -0
- package/dist/flows/FlowBlockRegistry.d.ts +39 -0
- package/dist/flows/FlowBlockRegistry.js +66 -0
- package/dist/flows/FlowCompiler.d.ts +26 -0
- package/dist/flows/FlowCompiler.js +488 -0
- package/dist/flows/FlowDefinitionError.d.ts +21 -0
- package/dist/flows/FlowDefinitionError.js +16 -0
- package/dist/flows/FlowStepJob.d.ts +28 -0
- package/dist/flows/FlowStepJob.js +31 -0
- package/dist/flows/FlowValueValidator.d.ts +32 -0
- package/dist/flows/FlowValueValidator.js +105 -0
- package/dist/flows/Flows.d.ts +102 -0
- package/dist/flows/Flows.js +871 -0
- package/dist/flows/blocks/FlowInput.d.ts +10 -0
- package/dist/flows/blocks/FlowInput.js +29 -0
- package/dist/flows/blocks/FlowOutput.d.ts +10 -0
- package/dist/flows/blocks/FlowOutput.js +29 -0
- package/dist/flows/blocks/Subflow.d.ts +10 -0
- package/dist/flows/blocks/Subflow.js +21 -0
- package/dist/flows/blocks/index.d.ts +6 -0
- package/dist/flows/blocks/index.js +8 -0
- package/dist/flows/constants.d.ts +55 -0
- package/dist/flows/constants.js +47 -0
- package/dist/flows/contracts/FlowBlock.d.ts +64 -0
- package/dist/flows/contracts/FlowBlock.js +1 -0
- package/dist/flows/contracts/FlowCompiler.d.ts +30 -0
- package/dist/flows/contracts/FlowCompiler.js +1 -0
- package/dist/flows/contracts/FlowDefinition.d.ts +118 -0
- package/dist/flows/contracts/FlowDefinition.js +1 -0
- package/dist/flows/contracts/FlowDefinitionStore.d.ts +47 -0
- package/dist/flows/contracts/FlowDefinitionStore.js +1 -0
- package/dist/flows/contracts/FlowRun.d.ts +40 -0
- package/dist/flows/contracts/FlowRun.js +1 -0
- package/dist/flows/contracts/FlowValue.d.ts +49 -0
- package/dist/flows/contracts/FlowValue.js +1 -0
- package/dist/flows/contracts/FlowsService.d.ts +37 -0
- package/dist/flows/contracts/FlowsService.js +1 -0
- package/dist/flows/contracts/index.d.ts +7 -0
- package/dist/flows/contracts/index.js +7 -0
- package/dist/flows/defineBlock.d.ts +18 -0
- package/dist/flows/defineBlock.js +19 -0
- package/dist/flows/drivers/FileFlowDefinitionStore.d.ts +53 -0
- package/dist/flows/drivers/FileFlowDefinitionStore.js +313 -0
- package/dist/flows/drivers/index.d.ts +1 -0
- package/dist/flows/drivers/index.js +1 -0
- package/dist/flows/errors.d.ts +8 -0
- package/dist/flows/errors.js +19 -0
- package/dist/flows/index.d.ts +13 -0
- package/dist/flows/index.js +13 -0
- package/dist/flows/models/FlowRun.d.ts +55 -0
- package/dist/flows/models/FlowRun.js +126 -0
- package/dist/flows/models/FlowRunEvent.d.ts +41 -0
- package/dist/flows/models/FlowRunEvent.js +85 -0
- package/dist/flows/models/FlowStepRun.d.ts +56 -0
- package/dist/flows/models/FlowStepRun.js +137 -0
- package/dist/flows/models/index.d.ts +10 -0
- package/dist/flows/models/index.js +14 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.js +16 -0
- package/dist/logging/Log.d.ts +66 -0
- package/dist/logging/Log.js +79 -0
- package/dist/logging/contracts/HttpExchange.d.ts +50 -0
- package/dist/logging/contracts/HttpExchange.js +1 -0
- package/dist/logging/contracts/Logger.d.ts +41 -0
- package/dist/logging/contracts/Logger.js +1 -0
- package/dist/logging/contracts/LoggerDriver.d.ts +16 -0
- package/dist/logging/contracts/LoggerDriver.js +1 -0
- package/dist/logging/contracts/LoggingOptions.d.ts +49 -0
- package/dist/logging/contracts/LoggingOptions.js +1 -0
- package/dist/logging/contracts/index.d.ts +4 -0
- package/dist/logging/contracts/index.js +4 -0
- package/dist/logging/drivers/PinoLoggerDriver.d.ts +24 -0
- package/dist/logging/drivers/PinoLoggerDriver.js +291 -0
- package/dist/logging/drivers/index.d.ts +1 -0
- package/dist/logging/drivers/index.js +1 -0
- package/dist/logging/index.d.ts +3 -0
- package/dist/logging/index.js +3 -0
- package/dist/logging/transports/DevtoolsLogTransport.d.ts +35 -0
- package/dist/logging/transports/DevtoolsLogTransport.js +96 -0
- package/dist/mail/Mail.d.ts +62 -0
- package/dist/mail/Mail.js +98 -0
- package/dist/mail/index.d.ts +4 -0
- package/dist/mail/index.js +4 -0
- package/dist/mail/transports/FileMailTransport.d.ts +12 -0
- package/dist/mail/transports/FileMailTransport.js +41 -0
- package/dist/mail/transports/MailgunTransport.d.ts +22 -0
- package/dist/mail/transports/MailgunTransport.js +57 -0
- package/dist/mail/transports/ResendTransport.d.ts +14 -0
- package/dist/mail/transports/ResendTransport.js +55 -0
- package/dist/media/MediaFile.d.ts +48 -0
- package/dist/media/MediaFile.js +104 -0
- package/dist/media/MediaItem.d.ts +47 -0
- package/dist/media/MediaItem.js +106 -0
- package/dist/media/MediaLibrary.d.ts +42 -0
- package/dist/media/MediaLibrary.js +94 -0
- package/dist/media/MediaManager.d.ts +159 -0
- package/dist/media/MediaManager.js +754 -0
- package/dist/media/constants.d.ts +27 -0
- package/dist/media/constants.js +19 -0
- package/dist/media/contracts/MediaOptions.d.ts +8 -0
- package/dist/media/contracts/MediaOptions.js +1 -0
- package/dist/media/contracts/index.d.ts +1 -0
- package/dist/media/contracts/index.js +1 -0
- package/dist/media/image/ImageReconstructionError.d.ts +15 -0
- package/dist/media/image/ImageReconstructionError.js +18 -0
- package/dist/media/image/ImageVariantRenderer.d.ts +44 -0
- package/dist/media/image/ImageVariantRenderer.js +337 -0
- package/dist/media/image/ImageVariantRequest.d.ts +28 -0
- package/dist/media/image/ImageVariantRequest.js +55 -0
- package/dist/media/image/contracts/ImageProcessor.d.ts +46 -0
- package/dist/media/image/contracts/ImageProcessor.js +1 -0
- package/dist/media/image/contracts/ImageVariant.d.ts +31 -0
- package/dist/media/image/contracts/ImageVariant.js +7 -0
- package/dist/media/image/contracts/ImageVariantCacheOptions.d.ts +20 -0
- package/dist/media/image/contracts/ImageVariantCacheOptions.js +1 -0
- package/dist/media/image/contracts/index.d.ts +3 -0
- package/dist/media/image/contracts/index.js +3 -0
- package/dist/media/image/index.d.ts +5 -0
- package/dist/media/image/index.js +5 -0
- package/dist/media/image/processors/SharpImageProcessor.d.ts +25 -0
- package/dist/media/image/processors/SharpImageProcessor.js +112 -0
- package/dist/media/image/processors/index.d.ts +1 -0
- package/dist/media/image/processors/index.js +1 -0
- package/dist/media/index.d.ts +8 -0
- package/dist/media/index.js +8 -0
- package/dist/media/types.d.ts +129 -0
- package/dist/media/types.js +1 -0
- package/dist/queue/FailedJob.d.ts +31 -0
- package/dist/queue/FailedJob.js +41 -0
- package/dist/queue/Queue.d.ts +208 -0
- package/dist/queue/Queue.js +685 -0
- package/dist/queue/QueueEvents.d.ts +31 -0
- package/dist/queue/QueueEvents.js +49 -0
- package/dist/queue/QueueRetryLaterError.d.ts +23 -0
- package/dist/queue/QueueRetryLaterError.js +34 -0
- package/dist/queue/QueueWorker.d.ts +72 -0
- package/dist/queue/QueueWorker.js +236 -0
- package/dist/queue/QueueableJob.d.ts +109 -0
- package/dist/queue/QueueableJob.js +137 -0
- package/dist/queue/QueuedJob.d.ts +31 -0
- package/dist/queue/QueuedJob.js +52 -0
- package/dist/queue/RetryPolicy.d.ts +51 -0
- package/dist/queue/RetryPolicy.js +84 -0
- package/dist/queue/commands/index.d.ts +4 -0
- package/dist/queue/commands/index.js +11 -0
- package/dist/queue/commands/makeJob.d.ts +7 -0
- package/dist/queue/commands/makeJob.js +9 -0
- package/dist/queue/console.d.ts +60 -0
- package/dist/queue/console.js +348 -0
- package/dist/queue/contracts/CreateJob.d.ts +12 -0
- package/dist/queue/contracts/CreateJob.js +1 -0
- package/dist/queue/contracts/QueueDriver.d.ts +122 -0
- package/dist/queue/contracts/QueueDriver.js +1 -0
- package/dist/queue/contracts/QueueEvents.d.ts +61 -0
- package/dist/queue/contracts/QueueEvents.js +1 -0
- package/dist/queue/contracts/QueuePayload.d.ts +136 -0
- package/dist/queue/contracts/QueuePayload.js +1 -0
- package/dist/queue/contracts/QueueRetry.d.ts +43 -0
- package/dist/queue/contracts/QueueRetry.js +1 -0
- package/dist/queue/contracts/QueueService.d.ts +199 -0
- package/dist/queue/contracts/QueueService.js +1 -0
- package/dist/queue/contracts/QueueWorkerLifecycle.d.ts +65 -0
- package/dist/queue/contracts/QueueWorkerLifecycle.js +1 -0
- package/dist/queue/contracts/QueueableJob.d.ts +50 -0
- package/dist/queue/contracts/QueueableJob.js +1 -0
- package/dist/queue/contracts/RedisQueueDriver.d.ts +37 -0
- package/dist/queue/contracts/RedisQueueDriver.js +1 -0
- package/dist/queue/contracts/index.d.ts +9 -0
- package/dist/queue/contracts/index.js +9 -0
- package/dist/queue/createJob.d.ts +18 -0
- package/dist/queue/createJob.js +52 -0
- package/dist/queue/drivers/DatabaseQueueDriver.d.ts +83 -0
- package/dist/queue/drivers/DatabaseQueueDriver.js +393 -0
- package/dist/queue/drivers/RedisQueueDriver.d.ts +102 -0
- package/dist/queue/drivers/RedisQueueDriver.js +641 -0
- package/dist/queue/index.d.ts +13 -0
- package/dist/queue/index.js +13 -0
- package/dist/queue/queueMonitor.d.ts +133 -0
- package/dist/queue/queueMonitor.js +238 -0
- package/dist/scheduler/ScheduledCall.d.ts +25 -0
- package/dist/scheduler/ScheduledCall.js +31 -0
- package/dist/scheduler/ScheduledEvent.d.ts +74 -0
- package/dist/scheduler/ScheduledEvent.js +115 -0
- package/dist/scheduler/ScheduledJob.d.ts +34 -0
- package/dist/scheduler/ScheduledJob.js +50 -0
- package/dist/scheduler/ScheduledOccurrence.d.ts +74 -0
- package/dist/scheduler/ScheduledOccurrence.js +194 -0
- package/dist/scheduler/ScheduledOccurrenceRecorder.d.ts +34 -0
- package/dist/scheduler/ScheduledOccurrenceRecorder.js +106 -0
- package/dist/scheduler/Scheduler.d.ts +76 -0
- package/dist/scheduler/Scheduler.js +186 -0
- package/dist/scheduler/SchedulerWorker.d.ts +37 -0
- package/dist/scheduler/SchedulerWorker.js +119 -0
- package/dist/scheduler/console.d.ts +18 -0
- package/dist/scheduler/console.js +288 -0
- package/dist/scheduler/constants.d.ts +13 -0
- package/dist/scheduler/constants.js +23 -0
- package/dist/scheduler/contracts/Scheduler.d.ts +104 -0
- package/dist/scheduler/contracts/Scheduler.js +1 -0
- package/dist/scheduler/contracts/SchedulerConsole.d.ts +37 -0
- package/dist/scheduler/contracts/SchedulerConsole.js +1 -0
- package/dist/scheduler/contracts/SchedulerWorker.d.ts +18 -0
- package/dist/scheduler/contracts/SchedulerWorker.js +1 -0
- package/dist/scheduler/contracts/index.d.ts +3 -0
- package/dist/scheduler/contracts/index.js +3 -0
- package/dist/scheduler/index.d.ts +9 -0
- package/dist/scheduler/index.js +9 -0
- package/dist/scheduler/scheduleTime.d.ts +30 -0
- package/dist/scheduler/scheduleTime.js +64 -0
- package/dist/security/Security.d.ts +60 -0
- package/dist/security/Security.js +252 -0
- package/dist/security/SecurityError.d.ts +13 -0
- package/dist/security/SecurityError.js +16 -0
- package/dist/security/contracts/SecurityOptions.d.ts +17 -0
- package/dist/security/contracts/SecurityOptions.js +1 -0
- package/dist/security/contracts/SecurityPayload.d.ts +13 -0
- package/dist/security/contracts/SecurityPayload.js +1 -0
- package/dist/security/contracts/index.d.ts +2 -0
- package/dist/security/contracts/index.js +2 -0
- package/dist/security/ensureAppKey.d.ts +16 -0
- package/dist/security/ensureAppKey.js +69 -0
- package/dist/security/index.d.ts +4 -0
- package/dist/security/index.js +4 -0
- package/dist/serialization/Serializable.d.ts +17 -0
- package/dist/serialization/Serializable.js +1 -0
- package/dist/serialization/SerializationError.d.ts +40 -0
- package/dist/serialization/SerializationError.js +42 -0
- package/dist/serialization/SerializationRegistry.d.ts +76 -0
- package/dist/serialization/SerializationRegistry.js +153 -0
- package/dist/serialization/SerializationRegistryError.d.ts +18 -0
- package/dist/serialization/SerializationRegistryError.js +18 -0
- package/dist/serialization/Serializer.d.ts +37 -0
- package/dist/serialization/Serializer.js +477 -0
- package/dist/serialization/contracts/SerializableClass.d.ts +20 -0
- package/dist/serialization/contracts/SerializableClass.js +1 -0
- package/dist/serialization/contracts/SerializedValue.d.ts +59 -0
- package/dist/serialization/contracts/SerializedValue.js +19 -0
- package/dist/serialization/contracts/SerializerOptions.d.ts +17 -0
- package/dist/serialization/contracts/SerializerOptions.js +1 -0
- package/dist/serialization/contracts/SerializerService.d.ts +26 -0
- package/dist/serialization/contracts/SerializerService.js +1 -0
- package/dist/serialization/contracts/index.d.ts +4 -0
- package/dist/serialization/contracts/index.js +4 -0
- package/dist/serialization/index.d.ts +6 -0
- package/dist/serialization/index.js +6 -0
- package/dist/server/App.d.ts +141 -0
- package/dist/server/App.js +225 -0
- package/dist/server/RequestContext.d.ts +42 -0
- package/dist/server/RequestContext.js +95 -0
- package/dist/server/appContext.d.ts +34 -0
- package/dist/server/appContext.js +42 -0
- package/dist/server/index.d.ts +3 -0
- package/dist/server/index.js +3 -0
- package/dist/ssr/constants.d.ts +6 -0
- package/dist/ssr/constants.js +6 -0
- package/dist/ssr/contracts/DocumentHead.d.ts +32 -0
- package/dist/ssr/contracts/DocumentHead.js +1 -0
- package/dist/ssr/contracts/SsrRenderContext.d.ts +23 -0
- package/dist/ssr/contracts/SsrRenderContext.js +1 -0
- package/dist/ssr/contracts/SsrRenderResult.d.ts +21 -0
- package/dist/ssr/contracts/SsrRenderResult.js +1 -0
- package/dist/ssr/contracts/SsrRenderer.d.ts +9 -0
- package/dist/ssr/contracts/SsrRenderer.js +1 -0
- package/dist/ssr/contracts/SsrRequest.d.ts +16 -0
- package/dist/ssr/contracts/SsrRequest.js +1 -0
- package/dist/ssr/contracts/index.d.ts +5 -0
- package/dist/ssr/contracts/index.js +1 -0
- package/dist/ssr/createSsrRenderContext.d.ts +9 -0
- package/dist/ssr/createSsrRenderContext.js +20 -0
- package/dist/ssr/fastify/contracts/FastifySsrOptions.d.ts +21 -0
- package/dist/ssr/fastify/contracts/FastifySsrOptions.js +1 -0
- package/dist/ssr/fastify/contracts/index.d.ts +1 -0
- package/dist/ssr/fastify/contracts/index.js +1 -0
- package/dist/ssr/fastify/fastifySsr.d.ts +25 -0
- package/dist/ssr/fastify/fastifySsr.js +89 -0
- package/dist/ssr/fastify/index.d.ts +2 -0
- package/dist/ssr/fastify/index.js +1 -0
- package/dist/ssr/index.d.ts +6 -0
- package/dist/ssr/index.js +5 -0
- package/dist/ssr/renderDocumentHead.d.ts +8 -0
- package/dist/ssr/renderDocumentHead.js +62 -0
- package/dist/ssr/renderSsrDocument.d.ts +14 -0
- package/dist/ssr/renderSsrDocument.js +28 -0
- package/dist/ssr/serializeSsrState.d.ts +10 -0
- package/dist/ssr/serializeSsrState.js +18 -0
- package/dist/ssr/vite/contracts/ViteSsrOptions.d.ts +45 -0
- package/dist/ssr/vite/contracts/ViteSsrOptions.js +1 -0
- package/dist/ssr/vite/contracts/index.d.ts +1 -0
- package/dist/ssr/vite/contracts/index.js +1 -0
- package/dist/ssr/vite/fastifyViteSsr.d.ts +24 -0
- package/dist/ssr/vite/fastifyViteSsr.js +213 -0
- package/dist/ssr/vite/index.d.ts +4 -0
- package/dist/ssr/vite/index.js +2 -0
- package/dist/ssr/vite/viteSsrManifest.d.ts +16 -0
- package/dist/ssr/vite/viteSsrManifest.js +63 -0
- package/dist/storage/Storage.d.ts +244 -0
- package/dist/storage/Storage.js +348 -0
- package/dist/storage/contents.d.ts +8 -0
- package/dist/storage/contents.js +18 -0
- package/dist/storage/contracts/StorageListing.d.ts +50 -0
- package/dist/storage/contracts/StorageListing.js +1 -0
- package/dist/storage/contracts/index.d.ts +1 -0
- package/dist/storage/contracts/index.js +1 -0
- package/dist/storage/drivers/FlystorageDisk.d.ts +185 -0
- package/dist/storage/drivers/FlystorageDisk.js +250 -0
- package/dist/storage/drivers/FlystorageListing.d.ts +27 -0
- package/dist/storage/drivers/FlystorageListing.js +69 -0
- package/dist/storage/drivers/LocalStorageDisk.d.ts +25 -0
- package/dist/storage/drivers/LocalStorageDisk.js +38 -0
- package/dist/storage/drivers/S3StorageDisk.d.ts +17 -0
- package/dist/storage/drivers/S3StorageDisk.js +102 -0
- package/dist/storage/drivers/index.d.ts +3 -0
- package/dist/storage/drivers/index.js +3 -0
- package/dist/storage/index.d.ts +7 -0
- package/dist/storage/index.js +7 -0
- package/dist/storage/mime.d.ts +7 -0
- package/dist/storage/mime.js +28 -0
- package/dist/storage/path.d.ts +22 -0
- package/dist/storage/path.js +61 -0
- package/dist/storage/types.d.ts +218 -0
- package/dist/storage/types.js +1 -0
- package/dist/url/UrlGenerator.d.ts +32 -0
- package/dist/url/UrlGenerator.js +61 -0
- package/dist/url/contracts/UrlGeneratorOptions.d.ts +13 -0
- package/dist/url/contracts/UrlGeneratorOptions.js +1 -0
- package/dist/url/contracts/index.d.ts +1 -0
- package/dist/url/contracts/index.js +1 -0
- package/dist/url/index.d.ts +2 -0
- package/dist/url/index.js +2 -0
- package/dist/validation/index.d.ts +28 -0
- package/dist/validation/index.js +260 -0
- package/package.json +290 -0
- package/src/ai/AIErrors.ts +46 -0
- package/src/ai/AIFailover.ts +101 -0
- package/src/ai/AIProviders.ts +228 -0
- package/src/ai/AIQuotaDeferredError.ts +26 -0
- package/src/ai/AIRateLimiter.ts +880 -0
- package/src/ai/Agent.ts +3630 -0
- package/src/ai/AgentHistory.ts +576 -0
- package/src/ai/AgentRunJob.ts +65 -0
- package/src/ai/Ai.ts +2176 -0
- package/src/ai/AiConversation.ts +49 -0
- package/src/ai/AiExecutionContext.ts +19 -0
- package/src/ai/AiMessage.ts +131 -0
- package/src/ai/AiRateLimitBucket.ts +163 -0
- package/src/ai/AiRateLimitReservation.ts +117 -0
- package/src/ai/AiRequest.ts +466 -0
- package/src/ai/Estimates.ts +36 -0
- package/src/ai/Models.ts +373 -0
- package/src/ai/OpenAIProviderError.ts +98 -0
- package/src/ai/OpenAIQuotaRetry.ts +183 -0
- package/src/ai/ProviderCosts.ts +156 -0
- package/src/ai/README.md +187 -0
- package/src/ai/ResponsesProviderCall.ts +34 -0
- package/src/ai/agentCitations.ts +186 -0
- package/src/ai/contracts/AI.ts +380 -0
- package/src/ai/contracts/Agent.ts +539 -0
- package/src/ai/contracts/AiRequestRunCostSummary.ts +31 -0
- package/src/ai/contracts/Pricing.ts +95 -0
- package/src/ai/contracts/Providers.ts +73 -0
- package/src/ai/contracts/QuotaRetry.ts +39 -0
- package/src/ai/contracts/RateLimits.ts +49 -0
- package/src/ai/contracts/ResponsesProviderCall.ts +30 -0
- package/src/ai/contracts/index.ts +8 -0
- package/src/ai/examples/Conversation.ts +12 -0
- package/src/ai/examples/HelpAgent.ts +27 -0
- package/src/ai/examples/createHelpImage.ts +13 -0
- package/src/ai/index.ts +27 -0
- package/src/ai/registry.ts +70 -0
- package/src/ai/sdkNodeCompatibility.d.ts +76 -0
- package/src/ai/toolCallRecovery.ts +82 -0
- package/src/ai/toolHelpers.ts +145 -0
- package/src/auth/Auth.ts +1422 -0
- package/src/auth/AuthProvider.ts +251 -0
- package/src/auth/AuthToken.ts +239 -0
- package/src/auth/PasswordResetToken.ts +93 -0
- package/src/auth/README.md +396 -0
- package/src/auth/UserIdentity.ts +112 -0
- package/src/auth/contracts/AuthProviderDriver.ts +114 -0
- package/src/auth/contracts/index.ts +1 -0
- package/src/auth/examples/runPasswordAuth.ts +45 -0
- package/src/auth/index.ts +8 -0
- package/src/auth/passwordHash.ts +160 -0
- package/src/auth/providers/GoogleAuthProvider.ts +470 -0
- package/src/auth/providers/PasswordAuthProvider.ts +256 -0
- package/src/auth/providers/index.ts +3 -0
- package/src/auth/providers/resolveAuthProviders.ts +166 -0
- package/src/cache/Cache.ts +151 -0
- package/src/cache/README.md +137 -0
- package/src/cache/contracts/CacheDriver.ts +11 -0
- package/src/cache/contracts/CacheOperations.ts +28 -0
- package/src/cache/contracts/CacheOptions.ts +56 -0
- package/src/cache/contracts/CacheRepository.ts +62 -0
- package/src/cache/contracts/index.ts +4 -0
- package/src/cache/drivers/CacheManagerDriver.ts +84 -0
- package/src/cache/drivers/createCacheDriver.ts +191 -0
- package/src/cache/examples/runNoteCache.ts +37 -0
- package/src/cache/index.ts +2 -0
- package/src/cli/Cli.ts +110 -0
- package/src/cli/README.md +164 -0
- package/src/cli/commands/repl.ts +29 -0
- package/src/cli/contracts/CliCommand.ts +33 -0
- package/src/cli/contracts/CliConfig.ts +10 -0
- package/src/cli/contracts/CliOptions.ts +13 -0
- package/src/cli/contracts/CommandDefinition.ts +19 -0
- package/src/cli/contracts/ReplOptions.ts +11 -0
- package/src/cli/contracts/index.ts +5 -0
- package/src/cli/defineCommand.ts +25 -0
- package/src/cli/index.ts +5 -0
- package/src/cli/runDb3.ts +63 -0
- package/src/cli/runRepl.ts +55 -0
- package/src/config/Config.ts +110 -0
- package/src/config/README.md +142 -0
- package/src/config/env.ts +164 -0
- package/src/config/examples/loadNotesConfig.ts +29 -0
- package/src/config/examples/runConfig.ts +40 -0
- package/src/config/index.ts +2 -0
- package/src/db/ActiveProjection.ts +311 -0
- package/src/db/ActiveQueryBuilder.ts +831 -0
- package/src/db/ActiveRecord.ts +1317 -0
- package/src/db/Database.ts +1283 -0
- package/src/db/FieldType.ts +1243 -0
- package/src/db/README.md +508 -0
- package/src/db/SoftDeletes.ts +158 -0
- package/src/db/commands/check.ts +10 -0
- package/src/db/commands/index.ts +19 -0
- package/src/db/commands/makeMigration.ts +11 -0
- package/src/db/commands/migrate.ts +10 -0
- package/src/db/connection.ts +68 -0
- package/src/db/contracts/ActiveRecordDefinition.ts +69 -0
- package/src/db/contracts/DatabaseBackup.ts +7 -0
- package/src/db/contracts/DatabaseMigrationsConfig.ts +10 -0
- package/src/db/contracts/index.ts +3 -0
- package/src/db/dialects/columnTypes.ts +103 -0
- package/src/db/dialects/index.ts +6 -0
- package/src/db/dialects/mariadb.ts +51 -0
- package/src/db/dialects/mysql.ts +277 -0
- package/src/db/dialects/postgres.ts +143 -0
- package/src/db/dialects/resolveDialect.ts +88 -0
- package/src/db/dialects/types.ts +59 -0
- package/src/db/errors.ts +22 -0
- package/src/db/examples/DefinedUser.ts +20 -0
- package/src/db/examples/FieldNote.ts +27 -0
- package/src/db/examples/KnowledgeNote.ts +29 -0
- package/src/db/examples/NoteCodeField.ts +9 -0
- package/src/db/examples/createNotesTogether.ts +24 -0
- package/src/db/examples/outputs/workspace-notes.json +9 -0
- package/src/db/examples/runFieldNotes.ts +51 -0
- package/src/db/examples/runNoteMigrations.ts +64 -0
- package/src/db/examples/runWorkspaceNotes.ts +86 -0
- package/src/db/examples/workspaceNotes.ts +57 -0
- package/src/db/fields/BooleanField.ts +128 -0
- package/src/db/fields/CharUuidField.ts +91 -0
- package/src/db/fields/ChoiceStringField.ts +97 -0
- package/src/db/fields/DecimalField.ts +157 -0
- package/src/db/fields/EmailField.ts +79 -0
- package/src/db/fields/EncryptedJsonField.ts +211 -0
- package/src/db/fields/IntegerField.ts +200 -0
- package/src/db/fields/JsonField.ts +108 -0
- package/src/db/fields/JsonStringField.ts +63 -0
- package/src/db/fields/LinkField.ts +502 -0
- package/src/db/fields/PasswordField.ts +294 -0
- package/src/db/fields/StringField.ts +154 -0
- package/src/db/fields/StringListField.ts +179 -0
- package/src/db/fields/TextField.ts +71 -0
- package/src/db/fields/TimestampField.ts +164 -0
- package/src/db/fields/UlidField.ts +189 -0
- package/src/db/fields/UrlField.ts +97 -0
- package/src/db/fields/VectorField.ts +266 -0
- package/src/db/fields/createField.ts +22 -0
- package/src/db/fields/field.ts +209 -0
- package/src/db/fields/index.ts +76 -0
- package/src/db/fields/resolveFields.ts +69 -0
- package/src/db/index.ts +13 -0
- package/src/db/migrations/DatabaseMigrationManager.ts +756 -0
- package/src/db/migrations/DatabaseSchemaInspector.ts +541 -0
- package/src/db/migrations/KnexMigrationRenderer.ts +490 -0
- package/src/db/migrations/ModelSchemaCollector.ts +240 -0
- package/src/db/migrations/SchemaDiffer.ts +541 -0
- package/src/db/migrations/SchemaNames.ts +62 -0
- package/src/db/migrations/SchemaSnapshotSerializer.ts +59 -0
- package/src/db/migrations/contracts/DatabaseMigration.ts +143 -0
- package/src/db/migrations/contracts/SchemaChange.ts +113 -0
- package/src/db/migrations/contracts/SchemaSnapshot.ts +122 -0
- package/src/db/migrations/contracts/index.ts +3 -0
- package/src/db/migrations/errors.ts +45 -0
- package/src/db/migrations/index.ts +10 -0
- package/src/db/migrations/promoteDestructiveSchemaChanges.ts +120 -0
- package/src/db/queryMonitor.ts +549 -0
- package/src/db/sqlErrors.ts +36 -0
- package/src/db/test/db.ts +159 -0
- package/src/devtools/HttpEventDispatcher.ts +214 -0
- package/src/devtools/contracts/DevtoolsEventDispatcher.ts +57 -0
- package/src/devtools/contracts/index.ts +1 -0
- package/src/devtools/environment.ts +18 -0
- package/src/devtools/index.ts +3 -0
- package/src/events/Events.ts +165 -0
- package/src/events/README.md +106 -0
- package/src/events/contracts/EventConstructor.ts +12 -0
- package/src/events/contracts/EventListener.ts +8 -0
- package/src/events/contracts/EventUnsubscribe.ts +4 -0
- package/src/events/contracts/index.ts +3 -0
- package/src/events/examples/NoteSaved.ts +9 -0
- package/src/events/examples/runNoteEvents.ts +31 -0
- package/src/events/index.ts +2 -0
- package/src/flows/FlowBlockRegistry.ts +79 -0
- package/src/flows/FlowCompiler.ts +624 -0
- package/src/flows/FlowDefinitionError.ts +24 -0
- package/src/flows/FlowStepJob.ts +54 -0
- package/src/flows/FlowValueValidator.ts +120 -0
- package/src/flows/Flows.ts +1118 -0
- package/src/flows/README.md +144 -0
- package/src/flows/blocks/FlowInput.ts +32 -0
- package/src/flows/blocks/FlowOutput.ts +32 -0
- package/src/flows/blocks/Subflow.ts +24 -0
- package/src/flows/blocks/index.ts +11 -0
- package/src/flows/constants.ts +62 -0
- package/src/flows/contracts/FlowBlock.ts +73 -0
- package/src/flows/contracts/FlowCompiler.ts +32 -0
- package/src/flows/contracts/FlowDefinition.ts +126 -0
- package/src/flows/contracts/FlowDefinitionStore.ts +52 -0
- package/src/flows/contracts/FlowRun.ts +44 -0
- package/src/flows/contracts/FlowValue.ts +54 -0
- package/src/flows/contracts/FlowsService.ts +39 -0
- package/src/flows/contracts/index.ts +7 -0
- package/src/flows/defineBlock.ts +25 -0
- package/src/flows/drivers/FileFlowDefinitionStore.ts +372 -0
- package/src/flows/drivers/index.ts +1 -0
- package/src/flows/errors.ts +22 -0
- package/src/flows/examples/FlowExampleApp.ts +15 -0
- package/src/flows/examples/createTextFlow.ts +14 -0
- package/src/flows/examples/normalizeTextBlock.ts +15 -0
- package/src/flows/examples/runTextFlow.ts +46 -0
- package/src/flows/examples/uppercaseTextBlock.ts +11 -0
- package/src/flows/index.ts +13 -0
- package/src/flows/models/FlowRun.ts +164 -0
- package/src/flows/models/FlowRunEvent.ts +108 -0
- package/src/flows/models/FlowStepRun.ts +176 -0
- package/src/flows/models/index.ts +16 -0
- package/src/index.ts +40 -0
- package/src/logging/Log.ts +100 -0
- package/src/logging/README.md +139 -0
- package/src/logging/contracts/HttpExchange.ts +53 -0
- package/src/logging/contracts/Logger.ts +45 -0
- package/src/logging/contracts/LoggerDriver.ts +19 -0
- package/src/logging/contracts/LoggingOptions.ts +51 -0
- package/src/logging/contracts/index.ts +4 -0
- package/src/logging/drivers/PinoLoggerDriver.ts +376 -0
- package/src/logging/drivers/index.ts +1 -0
- package/src/logging/examples/runNoteLogs.ts +38 -0
- package/src/logging/index.ts +3 -0
- package/src/logging/transports/DevtoolsLogTransport.ts +142 -0
- package/src/mail/Mail.ts +188 -0
- package/src/mail/README.md +206 -0
- package/src/mail/examples/runMailPreview.ts +44 -0
- package/src/mail/examples/welcomeMessage.ts +26 -0
- package/src/mail/index.ts +4 -0
- package/src/mail/transports/FileMailTransport.ts +58 -0
- package/src/mail/transports/MailgunTransport.ts +85 -0
- package/src/mail/transports/ResendTransport.ts +80 -0
- package/src/media/MediaFile.ts +132 -0
- package/src/media/MediaItem.ts +132 -0
- package/src/media/MediaLibrary.ts +117 -0
- package/src/media/MediaManager.ts +874 -0
- package/src/media/README.md +358 -0
- package/src/media/constants.ts +31 -0
- package/src/media/contracts/MediaOptions.ts +9 -0
- package/src/media/contracts/index.ts +1 -0
- package/src/media/examples/createPrivateFileServer.ts +55 -0
- package/src/media/examples/runPrivateFiles.ts +45 -0
- package/src/media/examples/runProjectMedia.ts +46 -0
- package/src/media/image/ImageReconstructionError.ts +18 -0
- package/src/media/image/ImageVariantRenderer.ts +386 -0
- package/src/media/image/ImageVariantRequest.ts +65 -0
- package/src/media/image/contracts/ImageProcessor.ts +53 -0
- package/src/media/image/contracts/ImageVariant.ts +37 -0
- package/src/media/image/contracts/ImageVariantCacheOptions.ts +21 -0
- package/src/media/image/contracts/index.ts +3 -0
- package/src/media/image/index.ts +5 -0
- package/src/media/image/processors/SharpImageProcessor.ts +121 -0
- package/src/media/image/processors/index.ts +1 -0
- package/src/media/index.ts +8 -0
- package/src/media/types.ts +168 -0
- package/src/queue/FailedJob.ts +58 -0
- package/src/queue/Queue.ts +938 -0
- package/src/queue/QueueEvents.ts +57 -0
- package/src/queue/QueueRetryLaterError.ts +40 -0
- package/src/queue/QueueWorker.ts +296 -0
- package/src/queue/QueueableJob.ts +167 -0
- package/src/queue/QueuedJob.ts +69 -0
- package/src/queue/README.md +368 -0
- package/src/queue/RetryPolicy.ts +129 -0
- package/src/queue/commands/index.ts +13 -0
- package/src/queue/commands/makeJob.ts +11 -0
- package/src/queue/console.ts +518 -0
- package/src/queue/contracts/CreateJob.ts +13 -0
- package/src/queue/contracts/QueueDriver.ts +135 -0
- package/src/queue/contracts/QueueEvents.ts +77 -0
- package/src/queue/contracts/QueuePayload.ts +150 -0
- package/src/queue/contracts/QueueRetry.ts +47 -0
- package/src/queue/contracts/QueueService.ts +219 -0
- package/src/queue/contracts/QueueWorkerLifecycle.ts +71 -0
- package/src/queue/contracts/QueueableJob.ts +56 -0
- package/src/queue/contracts/RedisQueueDriver.ts +37 -0
- package/src/queue/contracts/index.ts +9 -0
- package/src/queue/createJob.ts +54 -0
- package/src/queue/drivers/DatabaseQueueDriver.ts +449 -0
- package/src/queue/drivers/RedisQueueDriver.ts +733 -0
- package/src/queue/examples/DeferredReportJob.ts +25 -0
- package/src/queue/examples/GenerateReportJob.ts +37 -0
- package/src/queue/examples/WriteReportJob.ts +37 -0
- package/src/queue/examples/createAndProcessReportJob.ts +29 -0
- package/src/queue/examples/dispatchReportWorkflows.ts +40 -0
- package/src/queue/examples/manageReportRetries.ts +47 -0
- package/src/queue/examples/outputs/create-and-process-report-job.json +6 -0
- package/src/queue/examples/outputs/dispatch-report-workflows.json +14 -0
- package/src/queue/examples/outputs/manage-report-retries.json +24 -0
- package/src/queue/examples/outputs/queue-reports.json +11 -0
- package/src/queue/examples/reportConsole.ts +47 -0
- package/src/queue/examples/runBackpressure.ts +27 -0
- package/src/queue/examples/runQueueReports.ts +80 -0
- package/src/queue/examples/runQueueWorkflows.ts +43 -0
- package/src/queue/index.ts +13 -0
- package/src/queue/queueMonitor.ts +368 -0
- package/src/scheduler/README.md +139 -0
- package/src/scheduler/ScheduledCall.ts +36 -0
- package/src/scheduler/ScheduledEvent.ts +149 -0
- package/src/scheduler/ScheduledJob.ts +58 -0
- package/src/scheduler/ScheduledOccurrence.ts +250 -0
- package/src/scheduler/ScheduledOccurrenceRecorder.ts +125 -0
- package/src/scheduler/Scheduler.ts +225 -0
- package/src/scheduler/SchedulerWorker.ts +151 -0
- package/src/scheduler/console.ts +368 -0
- package/src/scheduler/constants.ts +27 -0
- package/src/scheduler/contracts/Scheduler.ts +123 -0
- package/src/scheduler/contracts/SchedulerConsole.ts +40 -0
- package/src/scheduler/contracts/SchedulerWorker.ts +23 -0
- package/src/scheduler/contracts/index.ts +3 -0
- package/src/scheduler/examples/RecoverableSummaryJob.ts +18 -0
- package/src/scheduler/examples/WriteDailySummaryJob.ts +17 -0
- package/src/scheduler/examples/registerDailySummary.ts +13 -0
- package/src/scheduler/examples/runDailySummary.ts +46 -0
- package/src/scheduler/examples/runScheduledReplay.ts +60 -0
- package/src/scheduler/index.ts +9 -0
- package/src/scheduler/scheduleTime.ts +78 -0
- package/src/security/README.md +130 -0
- package/src/security/Security.ts +346 -0
- package/src/security/SecurityError.ts +16 -0
- package/src/security/contracts/SecurityOptions.ts +20 -0
- package/src/security/contracts/SecurityPayload.ts +14 -0
- package/src/security/contracts/index.ts +2 -0
- package/src/security/ensureAppKey.ts +82 -0
- package/src/security/examples/runSecretRoundTrip.ts +42 -0
- package/src/security/index.ts +4 -0
- package/src/serialization/README.md +169 -0
- package/src/serialization/Serializable.ts +17 -0
- package/src/serialization/SerializationError.ts +91 -0
- package/src/serialization/SerializationRegistry.ts +208 -0
- package/src/serialization/SerializationRegistryError.ts +24 -0
- package/src/serialization/Serializer.ts +793 -0
- package/src/serialization/contracts/SerializableClass.ts +26 -0
- package/src/serialization/contracts/SerializedValue.ts +71 -0
- package/src/serialization/contracts/SerializerOptions.ts +19 -0
- package/src/serialization/contracts/SerializerService.ts +29 -0
- package/src/serialization/contracts/index.ts +4 -0
- package/src/serialization/examples/ExportRequest.ts +25 -0
- package/src/serialization/examples/runExportSerialization.ts +24 -0
- package/src/serialization/index.ts +6 -0
- package/src/server/App.ts +326 -0
- package/src/server/README.md +219 -0
- package/src/server/RequestContext.ts +122 -0
- package/src/server/appContext.ts +59 -0
- package/src/server/examples/createFirstServer.ts +25 -0
- package/src/server/examples/startFirstServer.ts +19 -0
- package/src/server/index.ts +16 -0
- package/src/ssr/README.md +158 -0
- package/src/ssr/constants.ts +8 -0
- package/src/ssr/contracts/DocumentHead.ts +35 -0
- package/src/ssr/contracts/SsrRenderContext.ts +25 -0
- package/src/ssr/contracts/SsrRenderResult.ts +23 -0
- package/src/ssr/contracts/SsrRenderer.ts +12 -0
- package/src/ssr/contracts/SsrRequest.ts +17 -0
- package/src/ssr/contracts/index.ts +19 -0
- package/src/ssr/createSsrRenderContext.ts +25 -0
- package/src/ssr/examples/createPublicPageServer.ts +32 -0
- package/src/ssr/examples/runPublicPages.ts +25 -0
- package/src/ssr/fastify/contracts/FastifySsrOptions.ts +24 -0
- package/src/ssr/fastify/contracts/index.ts +5 -0
- package/src/ssr/fastify/fastifySsr.ts +110 -0
- package/src/ssr/fastify/index.ts +2 -0
- package/src/ssr/index.ts +10 -0
- package/src/ssr/renderDocumentHead.ts +72 -0
- package/src/ssr/renderSsrDocument.ts +35 -0
- package/src/ssr/serializeSsrState.ts +19 -0
- package/src/ssr/vite/contracts/ViteSsrOptions.ts +52 -0
- package/src/ssr/vite/contracts/index.ts +6 -0
- package/src/ssr/vite/fastifyViteSsr.ts +279 -0
- package/src/ssr/vite/index.ts +4 -0
- package/src/ssr/vite/viteSsrManifest.ts +92 -0
- package/src/storage/README.md +310 -0
- package/src/storage/Storage.ts +392 -0
- package/src/storage/contents.ts +23 -0
- package/src/storage/contracts/StorageListing.ts +55 -0
- package/src/storage/contracts/index.ts +1 -0
- package/src/storage/drivers/FlystorageDisk.ts +295 -0
- package/src/storage/drivers/FlystorageListing.ts +78 -0
- package/src/storage/drivers/LocalStorageDisk.ts +45 -0
- package/src/storage/drivers/S3StorageDisk.ts +114 -0
- package/src/storage/drivers/index.ts +3 -0
- package/src/storage/examples/runStorage.ts +37 -0
- package/src/storage/examples/runStreamExport.ts +41 -0
- package/src/storage/examples/writeCsvExport.ts +45 -0
- package/src/storage/index.ts +7 -0
- package/src/storage/mime.ts +30 -0
- package/src/storage/path.ts +76 -0
- package/src/storage/types.ts +251 -0
- package/src/url/README.md +41 -0
- package/src/url/UrlGenerator.ts +72 -0
- package/src/url/contracts/UrlGeneratorOptions.ts +14 -0
- package/src/url/contracts/index.ts +1 -0
- package/src/url/examples/runApplicationLinks.ts +33 -0
- package/src/url/index.ts +2 -0
- package/src/validation/README.md +433 -0
- package/src/validation/examples/runNoteValidation.ts +18 -0
- package/src/validation/examples/validateNoteInput.ts +31 -0
- package/src/validation/index.ts +398 -0
- package/templates/AGENTS.md +15 -0
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { pipeline } from 'node:stream/promises';
|
|
3
|
+
|
|
4
|
+
import type { Storage, StorageDisk, StorageEntry } from '../../storage';
|
|
5
|
+
import { normalizeStoragePath } from '../../storage/path';
|
|
6
|
+
import type { ImageProcessor, ImageVariant, ImageVariantCacheOptions, ImageVariantOptions } from './contracts';
|
|
7
|
+
import { MAX_IMAGE_VARIANT_WIDTH } from './contracts';
|
|
8
|
+
import type { MediaFile } from '../MediaFile';
|
|
9
|
+
import { SharpImageProcessor } from './processors/SharpImageProcessor';
|
|
10
|
+
|
|
11
|
+
const IMAGE_VARIANT_CACHE_VERSION = 'v1';
|
|
12
|
+
const DEFAULT_IMAGE_VARIANT_CACHE_PREFIX = 'image-cache';
|
|
13
|
+
const IMAGE_VARIANT_OUTPUT_MIME_TYPE = 'image/webp';
|
|
14
|
+
const MAX_CONCURRENT_IMAGE_RENDERS = 2;
|
|
15
|
+
const PASSTHROUGH_IMAGE_MIME_TYPES = new Set([
|
|
16
|
+
'image/gif',
|
|
17
|
+
'image/svg+xml',
|
|
18
|
+
]);
|
|
19
|
+
const SUPPORTED_IMAGE_MIME_TYPES = new Set([
|
|
20
|
+
'image/avif',
|
|
21
|
+
'image/jpeg',
|
|
22
|
+
'image/png',
|
|
23
|
+
'image/webp',
|
|
24
|
+
]);
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Renders responsive variants of managed images into disposable storage.
|
|
28
|
+
*/
|
|
29
|
+
export class ImageVariantRenderer {
|
|
30
|
+
#activeRenders = 0;
|
|
31
|
+
readonly #cacheDiskName: string | null;
|
|
32
|
+
readonly #cachePrefix: string;
|
|
33
|
+
readonly #pendingRenders = new Map<string, Promise<void>>();
|
|
34
|
+
readonly #renderWaiters: Array<() => void> = [];
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Creates an image renderer backed by application storage.
|
|
38
|
+
*
|
|
39
|
+
* @param storage - Storage service used to read source bytes and cache variants.
|
|
40
|
+
* @param options - Disposable cache disk and directory configuration.
|
|
41
|
+
* @param processor - Image processing engine used for cache misses.
|
|
42
|
+
*/
|
|
43
|
+
constructor(
|
|
44
|
+
private readonly storage: Storage,
|
|
45
|
+
options: ImageVariantCacheOptions = {},
|
|
46
|
+
private readonly processor: ImageProcessor = new SharpImageProcessor(),
|
|
47
|
+
) {
|
|
48
|
+
this.#cacheDiskName = optionalNonEmptyString(
|
|
49
|
+
options.cacheDisk,
|
|
50
|
+
'Image variant cache disk',
|
|
51
|
+
);
|
|
52
|
+
this.#cachePrefix = normalizeStoragePath(
|
|
53
|
+
options.cachePrefix ?? DEFAULT_IMAGE_VARIANT_CACHE_PREFIX,
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Returns a width-constrained image, using the disposable cache when available.
|
|
59
|
+
*
|
|
60
|
+
* SVG and animated GIF sources are returned unchanged because they either
|
|
61
|
+
* scale natively or must preserve animation. Raster variants emit compressed
|
|
62
|
+
* WebP while preserving aspect ratio and orientation without enlargement.
|
|
63
|
+
* Failed renders settle source and cache streams before removing partial files.
|
|
64
|
+
*
|
|
65
|
+
* @param file - Managed source image.
|
|
66
|
+
* @param options - Variant dimensions that form the cache identity.
|
|
67
|
+
* @returns Rendered or cached image variant.
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* const image = await app.media.renderImage(file, {
|
|
71
|
+
* width: 640,
|
|
72
|
+
* });
|
|
73
|
+
*/
|
|
74
|
+
async render(file: MediaFile, options: ImageVariantOptions): Promise<ImageVariant> {
|
|
75
|
+
const width = imageVariantWidth(options.width);
|
|
76
|
+
const sourceMimeType = normalizedImageMimeType(file.mimeType);
|
|
77
|
+
const sourceDiskName = requiredMediaFileValue(file.disk, 'Managed image disk is required.');
|
|
78
|
+
const sourcePath = requiredMediaFileValue(file.path, 'Managed image path is required.');
|
|
79
|
+
const sourceDisk = this.storage.disk(sourceDiskName);
|
|
80
|
+
|
|
81
|
+
if (PASSTHROUGH_IMAGE_MIME_TYPES.has(sourceMimeType)) {
|
|
82
|
+
return {
|
|
83
|
+
stream: await sourceDisk.readStream(sourcePath),
|
|
84
|
+
mimeType: sourceMimeType,
|
|
85
|
+
path: null,
|
|
86
|
+
cached: false,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (!SUPPORTED_IMAGE_MIME_TYPES.has(sourceMimeType)) {
|
|
91
|
+
throw new Error(`Managed media type "${sourceMimeType}" cannot be rendered as a responsive image.`);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const mimeType = IMAGE_VARIANT_OUTPUT_MIME_TYPE;
|
|
95
|
+
const fileId = requiredMediaFileValue(file.id, 'Managed image id is required.');
|
|
96
|
+
const cacheDiskName = this.#cacheDiskName ?? sourceDiskName;
|
|
97
|
+
const cacheDisk = this.storage.disk(cacheDiskName);
|
|
98
|
+
const path = imageVariantPath(this.#cachePrefix, fileId, width, mimeType);
|
|
99
|
+
|
|
100
|
+
if (await cacheDisk.exists(path)) {
|
|
101
|
+
return {
|
|
102
|
+
stream: await cacheDisk.readStream(path),
|
|
103
|
+
mimeType,
|
|
104
|
+
path,
|
|
105
|
+
cached: true,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
let cached = false;
|
|
110
|
+
const renderKey = `${cacheDiskName}:${path}`;
|
|
111
|
+
const pendingRender = this.#pendingRenders.get(renderKey);
|
|
112
|
+
|
|
113
|
+
if (pendingRender) {
|
|
114
|
+
await pendingRender;
|
|
115
|
+
cached = true;
|
|
116
|
+
} else {
|
|
117
|
+
const render = this.#withRenderSlot(async () => {
|
|
118
|
+
if (await cacheDisk.exists(path)) {
|
|
119
|
+
cached = true;
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const source = await sourceDisk.readStream(sourcePath);
|
|
124
|
+
const renderer = this.processor.transform({
|
|
125
|
+
sourceMimeType,
|
|
126
|
+
outputMimeType: mimeType,
|
|
127
|
+
width,
|
|
128
|
+
});
|
|
129
|
+
const temporaryPath = `${path}.tmp-${randomUUID()}`;
|
|
130
|
+
const processing = pipeline(source, renderer);
|
|
131
|
+
const writing = cacheDisk.writeStream(temporaryPath, renderer, {
|
|
132
|
+
mimeType,
|
|
133
|
+
visibility: 'private',
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
try {
|
|
137
|
+
await Promise.all([processing, writing]);
|
|
138
|
+
await cacheDisk.move(temporaryPath, path);
|
|
139
|
+
} catch (error) {
|
|
140
|
+
// Stop both streams and finish storage work before removing partial bytes.
|
|
141
|
+
source.destroy();
|
|
142
|
+
renderer.destroy();
|
|
143
|
+
await Promise.allSettled([processing, writing]);
|
|
144
|
+
await deleteVariantQuietly(cacheDisk, temporaryPath);
|
|
145
|
+
throw error;
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
this.#pendingRenders.set(renderKey, render);
|
|
150
|
+
|
|
151
|
+
try {
|
|
152
|
+
await render;
|
|
153
|
+
} finally {
|
|
154
|
+
if (this.#pendingRenders.get(renderKey) === render) {
|
|
155
|
+
this.#pendingRenders.delete(renderKey);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
return {
|
|
161
|
+
stream: await cacheDisk.readStream(path),
|
|
162
|
+
mimeType,
|
|
163
|
+
path,
|
|
164
|
+
cached,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Deletes every disposable responsive variant derived from a managed image.
|
|
170
|
+
*
|
|
171
|
+
* @param file - Managed source image whose cached variants should be removed.
|
|
172
|
+
* @returns Number of cached variant files deleted from storage.
|
|
173
|
+
*/
|
|
174
|
+
async deleteCachedVariants(file: MediaFile): Promise<number> {
|
|
175
|
+
const fileId = requiredMediaFileValue(file.id, 'Managed image id is required.');
|
|
176
|
+
const sourceDiskName = requiredMediaFileValue(file.disk, 'Managed image disk is required.');
|
|
177
|
+
const cacheDiskName = this.#cacheDiskName ?? sourceDiskName;
|
|
178
|
+
const cacheDisk = this.storage.disk(cacheDiskName);
|
|
179
|
+
const path = imageVariantDirectoryPath(this.#cachePrefix, fileId);
|
|
180
|
+
let entries: StorageEntry[];
|
|
181
|
+
|
|
182
|
+
try {
|
|
183
|
+
entries = await cacheDisk.list(path, {
|
|
184
|
+
deep: true,
|
|
185
|
+
}).toArray(false);
|
|
186
|
+
} catch (error) {
|
|
187
|
+
if (isMissingStorageDirectory(error)) return 0;
|
|
188
|
+
|
|
189
|
+
throw error;
|
|
190
|
+
}
|
|
191
|
+
let deleted = 0;
|
|
192
|
+
|
|
193
|
+
for (const entry of entries) {
|
|
194
|
+
if (!entry.isFile) continue;
|
|
195
|
+
|
|
196
|
+
if (await cacheDisk.delete(entry.path)) {
|
|
197
|
+
deleted += 1;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
return deleted;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Runs one cache-generating render within the per-process concurrency bound.
|
|
206
|
+
*
|
|
207
|
+
* @param task - Render operation that writes one disposable cache entry.
|
|
208
|
+
* @returns Task result after a render slot becomes available.
|
|
209
|
+
*/
|
|
210
|
+
async #withRenderSlot<TResult>(task: () => Promise<TResult>): Promise<TResult> {
|
|
211
|
+
if (this.#activeRenders >= MAX_CONCURRENT_IMAGE_RENDERS) {
|
|
212
|
+
await new Promise<void>(resolve => {
|
|
213
|
+
this.#renderWaiters.push(resolve);
|
|
214
|
+
});
|
|
215
|
+
} else {
|
|
216
|
+
this.#activeRenders += 1;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
try {
|
|
220
|
+
return await task();
|
|
221
|
+
} finally {
|
|
222
|
+
const next = this.#renderWaiters.shift();
|
|
223
|
+
|
|
224
|
+
if (next) {
|
|
225
|
+
next();
|
|
226
|
+
} else {
|
|
227
|
+
this.#activeRenders -= 1;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Builds the disposable cache path for one image variant.
|
|
235
|
+
*
|
|
236
|
+
* @param cachePrefix - Relative cache directory on the configured disk.
|
|
237
|
+
* @param fileId - Immutable managed source-file ULID.
|
|
238
|
+
* @param width - Validated requested width, or null for original dimensions.
|
|
239
|
+
* @param mimeType - Normalized output MIME type.
|
|
240
|
+
* @returns Storage path beneath the disposable image-cache directory.
|
|
241
|
+
*/
|
|
242
|
+
function imageVariantPath(
|
|
243
|
+
cachePrefix: string,
|
|
244
|
+
fileId: string,
|
|
245
|
+
width: number | null,
|
|
246
|
+
mimeType: string,
|
|
247
|
+
): string {
|
|
248
|
+
const extension = imageExtension(mimeType);
|
|
249
|
+
const variantName = width === null ? 'original' : `w-${width}`;
|
|
250
|
+
|
|
251
|
+
return normalizeStoragePath(
|
|
252
|
+
`${cachePrefix}/${IMAGE_VARIANT_CACHE_VERSION}/${fileId}/${variantName}.${extension}`,
|
|
253
|
+
);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Builds the storage directory containing every cached variant for one image.
|
|
258
|
+
*
|
|
259
|
+
* @param cachePrefix - Relative cache directory on the configured disk.
|
|
260
|
+
* @param fileId - Immutable managed source-file ULID.
|
|
261
|
+
* @returns Directory path containing all cached variants for the image.
|
|
262
|
+
*/
|
|
263
|
+
function imageVariantDirectoryPath(cachePrefix: string, fileId: string): string {
|
|
264
|
+
return normalizeStoragePath(
|
|
265
|
+
`${cachePrefix}/${IMAGE_VARIANT_CACHE_VERSION}/${fileId}`,
|
|
266
|
+
);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Returns whether a storage listing failed because its directory is absent.
|
|
271
|
+
*
|
|
272
|
+
* Flystorage wraps provider errors, so the native missing-path code can appear
|
|
273
|
+
* on any cause in the chain. Other listing failures remain visible to callers.
|
|
274
|
+
*
|
|
275
|
+
* @param error - Unknown storage listing failure.
|
|
276
|
+
* @returns True when an underlying provider reports a missing directory.
|
|
277
|
+
*/
|
|
278
|
+
function isMissingStorageDirectory(error: unknown): boolean {
|
|
279
|
+
let current = error;
|
|
280
|
+
|
|
281
|
+
while (current && typeof current === 'object') {
|
|
282
|
+
if ((current as { code?: unknown }).code === 'ENOENT') return true;
|
|
283
|
+
|
|
284
|
+
current = (current as { cause?: unknown }).cause;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
return false;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* Returns the conventional extension for a supported image MIME type.
|
|
292
|
+
*
|
|
293
|
+
* @param mimeType - Normalized image MIME type.
|
|
294
|
+
* @returns Filename extension without a leading dot.
|
|
295
|
+
*/
|
|
296
|
+
function imageExtension(mimeType: string): string {
|
|
297
|
+
switch (mimeType) {
|
|
298
|
+
case 'image/avif':
|
|
299
|
+
return 'avif';
|
|
300
|
+
case 'image/jpeg':
|
|
301
|
+
return 'jpg';
|
|
302
|
+
case 'image/png':
|
|
303
|
+
return 'png';
|
|
304
|
+
case 'image/webp':
|
|
305
|
+
return 'webp';
|
|
306
|
+
default:
|
|
307
|
+
throw new Error(`Unsupported responsive image MIME type "${mimeType}".`);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Validates one requested responsive image width.
|
|
313
|
+
*
|
|
314
|
+
* @param value - Optional requested pixel width.
|
|
315
|
+
* @returns Validated integer width, or null to preserve source dimensions.
|
|
316
|
+
*/
|
|
317
|
+
function imageVariantWidth(value: number | undefined): number | null {
|
|
318
|
+
if (value === undefined) return null;
|
|
319
|
+
|
|
320
|
+
if (!Number.isInteger(value) || value < 1 || value > MAX_IMAGE_VARIANT_WIDTH) {
|
|
321
|
+
throw new RangeError(`Image width must be an integer between 1 and ${MAX_IMAGE_VARIANT_WIDTH}.`);
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
return value;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* Normalizes common image MIME aliases.
|
|
329
|
+
*
|
|
330
|
+
* @param value - MIME type recorded on the managed file.
|
|
331
|
+
* @returns Normalized lower-case MIME type.
|
|
332
|
+
*/
|
|
333
|
+
function normalizedImageMimeType(value: string | null): string {
|
|
334
|
+
const mimeType = String(value || '').trim().toLowerCase();
|
|
335
|
+
|
|
336
|
+
return mimeType === 'image/jpg' ? 'image/jpeg' : mimeType;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
/**
|
|
340
|
+
* Requires a non-empty managed file field.
|
|
341
|
+
*
|
|
342
|
+
* @param value - Nullable model field value.
|
|
343
|
+
* @param message - Error message used when the field is empty.
|
|
344
|
+
* @returns Non-empty string value.
|
|
345
|
+
*/
|
|
346
|
+
function requiredMediaFileValue(value: string | null, message: string): string {
|
|
347
|
+
const normalized = String(value || '').trim();
|
|
348
|
+
|
|
349
|
+
if (!normalized) throw new Error(message);
|
|
350
|
+
|
|
351
|
+
return normalized;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
/**
|
|
355
|
+
* Validates one optional configuration string.
|
|
356
|
+
*
|
|
357
|
+
* @param value - Optional string configuration.
|
|
358
|
+
* @param label - Human-readable configuration label.
|
|
359
|
+
* @returns Trimmed string, or null when the option is omitted.
|
|
360
|
+
*/
|
|
361
|
+
function optionalNonEmptyString(value: string | undefined, label: string): string | null {
|
|
362
|
+
if (value === undefined) return null;
|
|
363
|
+
|
|
364
|
+
const normalized = value.trim();
|
|
365
|
+
|
|
366
|
+
if (!normalized) {
|
|
367
|
+
throw new Error(`${label} must be a non-empty string.`);
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
return normalized;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
/**
|
|
374
|
+
* Removes an incomplete variant without masking the render failure.
|
|
375
|
+
*
|
|
376
|
+
* @param disk - Storage disk containing the temporary variant.
|
|
377
|
+
* @param path - Temporary storage path to remove.
|
|
378
|
+
* @returns Promise that resolves after the best-effort cleanup.
|
|
379
|
+
*/
|
|
380
|
+
async function deleteVariantQuietly(disk: StorageDisk, path: string): Promise<void> {
|
|
381
|
+
try {
|
|
382
|
+
await disk.delete(path);
|
|
383
|
+
} catch {
|
|
384
|
+
// The original render or storage error is more actionable than cleanup failure.
|
|
385
|
+
}
|
|
386
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { ImageVariantOptions } from './contracts';
|
|
2
|
+
import { MAX_IMAGE_VARIANT_WIDTH } from './contracts';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Error raised when an untrusted image variant request cannot be translated
|
|
6
|
+
* into an allowlisted framework command.
|
|
7
|
+
*/
|
|
8
|
+
export class ImageVariantRequestError extends RangeError {
|
|
9
|
+
/**
|
|
10
|
+
* Creates an invalid image request error.
|
|
11
|
+
*
|
|
12
|
+
* @param message - Safe explanation suitable for an HTTP error response.
|
|
13
|
+
* @param code - Stable application error code for HTTP adapters.
|
|
14
|
+
*/
|
|
15
|
+
constructor(message: string, readonly code: 'invalid_image_width') {
|
|
16
|
+
super(message);
|
|
17
|
+
this.name = 'ImageVariantRequestError';
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Translates URL query parameters into a safe image variant command.
|
|
23
|
+
*
|
|
24
|
+
* Only documented parameters are interpreted. Unknown parameters are ignored
|
|
25
|
+
* and no processor option is accepted directly from the request.
|
|
26
|
+
*
|
|
27
|
+
* @param searchParams - URL query parameters supplied by an HTTP adapter.
|
|
28
|
+
* @returns Validated variant options, or null when the original is requested.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* const options = imageVariantOptionsFromSearchParams(requestUrl.searchParams);
|
|
32
|
+
*/
|
|
33
|
+
export function imageVariantOptionsFromSearchParams(searchParams: URLSearchParams): ImageVariantOptions | null {
|
|
34
|
+
const requestedWidth = searchParams.get('w');
|
|
35
|
+
|
|
36
|
+
if (requestedWidth === null) {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
if (!/^[1-9]\d*$/.test(requestedWidth)) {
|
|
41
|
+
throw invalidImageWidth();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const width = Number(requestedWidth);
|
|
45
|
+
|
|
46
|
+
if (!Number.isSafeInteger(width) || width > MAX_IMAGE_VARIANT_WIDTH) {
|
|
47
|
+
throw invalidImageWidth();
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return {
|
|
51
|
+
width,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Creates the canonical invalid-width error.
|
|
57
|
+
*
|
|
58
|
+
* @returns Safe image request error.
|
|
59
|
+
*/
|
|
60
|
+
function invalidImageWidth(): ImageVariantRequestError {
|
|
61
|
+
return new ImageVariantRequestError(
|
|
62
|
+
`Image width must be an integer between 1 and ${MAX_IMAGE_VARIANT_WIDTH}.`,
|
|
63
|
+
'invalid_image_width',
|
|
64
|
+
);
|
|
65
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { Duplex } from 'node:stream';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Allowlisted image transformation passed to a concrete processing engine.
|
|
5
|
+
*/
|
|
6
|
+
export interface ImageProcessorCommand {
|
|
7
|
+
/** Normalized MIME type of the encoded source stream. */
|
|
8
|
+
sourceMimeType: string;
|
|
9
|
+
|
|
10
|
+
/** Normalized MIME type the processor must emit. */
|
|
11
|
+
outputMimeType: string;
|
|
12
|
+
|
|
13
|
+
/** Maximum output width in pixels, or null to preserve source dimensions. */
|
|
14
|
+
width: number | null;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Canonical image reconstruction passed to a concrete processing engine.
|
|
19
|
+
*
|
|
20
|
+
* Reconstruction decodes the complete untrusted input and emits a new image
|
|
21
|
+
* without preserving source metadata or trailing source bytes.
|
|
22
|
+
*/
|
|
23
|
+
export interface ImageProcessorReconstructionCommand {
|
|
24
|
+
/** Normalized MIME type already identified from the encoded source stream. */
|
|
25
|
+
sourceMimeType: string;
|
|
26
|
+
|
|
27
|
+
/** Normalized MIME type the processor must use for the reconstructed image. */
|
|
28
|
+
outputMimeType: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Adapter implemented by a concrete image processing engine.
|
|
33
|
+
*
|
|
34
|
+
* The framework owns request parsing, cache identity, storage, and concurrency.
|
|
35
|
+
* Processors only translate a trusted command into a bounded transform stream.
|
|
36
|
+
*/
|
|
37
|
+
export interface ImageProcessor {
|
|
38
|
+
/**
|
|
39
|
+
* Creates a stream that transforms encoded source bytes into an image variant.
|
|
40
|
+
*
|
|
41
|
+
* @param command - Validated transformation command.
|
|
42
|
+
* @returns Duplex stream that accepts source bytes and emits encoded output.
|
|
43
|
+
*/
|
|
44
|
+
transform(command: ImageProcessorCommand): Duplex;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Creates a stream that fully decodes and reconstructs an untrusted image.
|
|
48
|
+
*
|
|
49
|
+
* @param command - Validated canonical reconstruction command.
|
|
50
|
+
* @returns Duplex stream that accepts source bytes and emits reconstructed bytes.
|
|
51
|
+
*/
|
|
52
|
+
reconstruct(command: ImageProcessorReconstructionCommand): Duplex;
|
|
53
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { Readable } from 'node:stream';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Maximum rendered image width accepted by the framework.
|
|
5
|
+
*
|
|
6
|
+
* Bounding width protects the application from accidental or malicious
|
|
7
|
+
* requests that would create excessively large decoded images.
|
|
8
|
+
*/
|
|
9
|
+
export const MAX_IMAGE_VARIANT_WIDTH = 4096;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Options that identify one cached responsive image variant.
|
|
13
|
+
*/
|
|
14
|
+
export interface ImageVariantOptions {
|
|
15
|
+
/**
|
|
16
|
+
* Requested pixel width. Aspect ratio is preserved and images are never
|
|
17
|
+
* enlarged. Omit the width to compress the source at its original dimensions.
|
|
18
|
+
*/
|
|
19
|
+
width?: number;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Storage-backed responsive image returned by the media service.
|
|
24
|
+
*/
|
|
25
|
+
export interface ImageVariant {
|
|
26
|
+
/** Rendered image stream loaded from durable storage. */
|
|
27
|
+
stream: Readable;
|
|
28
|
+
|
|
29
|
+
/** MIME type of the rendered bytes. */
|
|
30
|
+
mimeType: string;
|
|
31
|
+
|
|
32
|
+
/** Storage path used on the configured disposable cache disk, or null for passthrough images. */
|
|
33
|
+
path: string | null;
|
|
34
|
+
|
|
35
|
+
/** Whether the bytes were loaded from an existing generated variant. */
|
|
36
|
+
cached: boolean;
|
|
37
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Storage configuration for disposable responsive-image variants.
|
|
3
|
+
*
|
|
4
|
+
* Generated variants are derived from durable managed files and may be removed
|
|
5
|
+
* at any time. A missing variant is regenerated on the next image request.
|
|
6
|
+
*/
|
|
7
|
+
export interface ImageVariantCacheOptions {
|
|
8
|
+
/**
|
|
9
|
+
* Named storage disk used for generated variants.
|
|
10
|
+
*
|
|
11
|
+
* Omit this value to use the managed source file's disk.
|
|
12
|
+
*/
|
|
13
|
+
cacheDisk?: string;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Relative directory containing generated variants on the cache disk.
|
|
17
|
+
*
|
|
18
|
+
* Defaults to `image-cache`.
|
|
19
|
+
*/
|
|
20
|
+
cachePrefix?: string;
|
|
21
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import sharp, { type Sharp } from 'sharp';
|
|
2
|
+
import type { ImageProcessor, ImageProcessorCommand, ImageProcessorReconstructionCommand } from '../contracts';
|
|
3
|
+
|
|
4
|
+
const IMAGE_VARIANT_INPUT_PIXEL_LIMIT = 40_000_000;
|
|
5
|
+
const IMAGE_VARIANT_PROCESSING_TIMEOUT_SECONDS = 20;
|
|
6
|
+
const CANONICAL_JPEG_QUALITY = 90;
|
|
7
|
+
const CANONICAL_WEBP_QUALITY = 90;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Sharp/libvips image processor used by the framework's default media service.
|
|
11
|
+
*/
|
|
12
|
+
export class SharpImageProcessor implements ImageProcessor {
|
|
13
|
+
/**
|
|
14
|
+
* Creates a bounded Sharp transform for one validated framework command.
|
|
15
|
+
*
|
|
16
|
+
* @param command - Trusted image transformation command.
|
|
17
|
+
* @returns Sharp duplex stream for encoded source and output bytes.
|
|
18
|
+
*/
|
|
19
|
+
transform(command: ImageProcessorCommand): Sharp {
|
|
20
|
+
let image = this.#source(false);
|
|
21
|
+
|
|
22
|
+
if (command.width !== null) {
|
|
23
|
+
image = image.resize({
|
|
24
|
+
width: command.width,
|
|
25
|
+
withoutEnlargement: true,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
switch (command.outputMimeType) {
|
|
30
|
+
case 'image/avif':
|
|
31
|
+
return image.avif({
|
|
32
|
+
quality: 50,
|
|
33
|
+
});
|
|
34
|
+
case 'image/jpeg':
|
|
35
|
+
return image.jpeg({
|
|
36
|
+
progressive: true,
|
|
37
|
+
quality: 82,
|
|
38
|
+
});
|
|
39
|
+
case 'image/png':
|
|
40
|
+
return image.png({
|
|
41
|
+
compressionLevel: 9,
|
|
42
|
+
});
|
|
43
|
+
case 'image/webp':
|
|
44
|
+
return image.webp({
|
|
45
|
+
quality: 82,
|
|
46
|
+
});
|
|
47
|
+
default:
|
|
48
|
+
throw new Error(`Sharp cannot encode responsive image MIME type "${command.outputMimeType}".`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Creates a bounded full-resolution reconstruction of untrusted image bytes.
|
|
54
|
+
*
|
|
55
|
+
* Reconstruction preserves animated GIF and WebP frames, applies source
|
|
56
|
+
* orientation, and relies on Sharp's default metadata removal.
|
|
57
|
+
*
|
|
58
|
+
* @param command - Validated canonical reconstruction command.
|
|
59
|
+
* @returns Sharp duplex stream for complete decoding and canonical encoding.
|
|
60
|
+
*/
|
|
61
|
+
reconstruct(command: ImageProcessorReconstructionCommand): Sharp {
|
|
62
|
+
const image = this.#source(isAnimatedImageMimeType(command.sourceMimeType));
|
|
63
|
+
|
|
64
|
+
switch (command.outputMimeType) {
|
|
65
|
+
case 'image/avif':
|
|
66
|
+
return image.avif({
|
|
67
|
+
quality: 65,
|
|
68
|
+
});
|
|
69
|
+
case 'image/gif':
|
|
70
|
+
return image.gif({
|
|
71
|
+
effort: 7,
|
|
72
|
+
interFrameMaxError: 0,
|
|
73
|
+
});
|
|
74
|
+
case 'image/jpeg':
|
|
75
|
+
return image.jpeg({
|
|
76
|
+
progressive: true,
|
|
77
|
+
quality: CANONICAL_JPEG_QUALITY,
|
|
78
|
+
});
|
|
79
|
+
case 'image/png':
|
|
80
|
+
return image.png({
|
|
81
|
+
compressionLevel: 9,
|
|
82
|
+
});
|
|
83
|
+
case 'image/webp':
|
|
84
|
+
return image.webp({
|
|
85
|
+
effort: 5,
|
|
86
|
+
quality: CANONICAL_WEBP_QUALITY,
|
|
87
|
+
});
|
|
88
|
+
default:
|
|
89
|
+
throw new Error(`Sharp cannot reconstruct image MIME type "${command.outputMimeType}".`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Creates one security-bounded Sharp input pipeline.
|
|
95
|
+
*
|
|
96
|
+
* @param animated - Whether all frames from a supported animated source are decoded.
|
|
97
|
+
* @returns Sharp input stream with decode limits, orientation, and timeout configured.
|
|
98
|
+
*/
|
|
99
|
+
#source(animated: boolean): Sharp {
|
|
100
|
+
return sharp({
|
|
101
|
+
animated,
|
|
102
|
+
failOn: 'warning',
|
|
103
|
+
limitInputPixels: IMAGE_VARIANT_INPUT_PIXEL_LIMIT,
|
|
104
|
+
sequentialRead: true,
|
|
105
|
+
})
|
|
106
|
+
.autoOrient()
|
|
107
|
+
.timeout({
|
|
108
|
+
seconds: IMAGE_VARIANT_PROCESSING_TIMEOUT_SECONDS,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Returns whether reconstruction must decode every source animation frame.
|
|
115
|
+
*
|
|
116
|
+
* @param mimeType - Normalized source image MIME type.
|
|
117
|
+
* @returns True for supported animated container formats.
|
|
118
|
+
*/
|
|
119
|
+
function isAnimatedImageMimeType(mimeType: string): boolean {
|
|
120
|
+
return mimeType === 'image/gif' || mimeType === 'image/webp';
|
|
121
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './SharpImageProcessor';
|