diff --git a/.speakeasy/logs/changes/changes.html b/.speakeasy/logs/changes/changes.html index 723646ea..f490ee32 100644 --- a/.speakeasy/logs/changes/changes.html +++ b/.speakeasy/logs/changes/changes.html @@ -98,27 +98,30 @@

Typescript SDK Changes:

diff --git a/.speakeasy/logs/changes/changes.md b/.speakeasy/logs/changes/changes.md index 84222596..0b9d7c6e 100644 --- a/.speakeasy/logs/changes/changes.md +++ b/.speakeasy/logs/changes/changes.md @@ -1,20 +1,14 @@ ## Typescript SDK Changes: -* `outpost.destinations.update()`: `request.body` **Changed** (Breaking ⚠️) - - `union(DestinationUpdateAWSKinesis)` **Removed** (Breaking ⚠️) - - `union(DestinationUpdateAWSS3)` **Removed** (Breaking ⚠️) - - `union(DestinationUpdateAWSSQS)` **Removed** (Breaking ⚠️) - - `union(DestinationUpdateAzureServiceBus)` **Removed** (Breaking ⚠️) - - `union(DestinationUpdateGCPPubSub)` **Removed** (Breaking ⚠️) - - `union(DestinationUpdateHookdeck)` **Removed** (Breaking ⚠️) - - `union(DestinationUpdateKafka)` **Removed** (Breaking ⚠️) - - `union(DestinationUpdateRabbitMQ)` **Removed** (Breaking ⚠️) - - `union(DestinationUpdateWebhook)` **Removed** (Breaking ⚠️) - - `union(aws_kinesis)` **Added** - - `union(aws_s3)` **Added** - - `union(aws_sqs)` **Added** - - `union(azure_servicebus)` **Added** - - `union(gcp_pubsub)` **Added** - - `union(hookdeck)` **Added** - - `union(kafka)` **Added** - - `union(rabbitmq)` **Added** - - `union(webhook)` **Added** +* `outpost.configuration.getManagedConfig()`: `response` **Changed** (Breaking ⚠️) + - `alertCallbackUrl` **Removed** (Breaking ⚠️) + - `alertExhaustedRetriesWindowSeconds` **Added** + - `organizationName` **Removed** (Breaking ⚠️) +* `outpost.configuration.updateManagedConfig()`: + * `request` **Changed** (Breaking ⚠️) + - `alertCallbackUrl` **Removed** (Breaking ⚠️) + - `alertExhaustedRetriesWindowSeconds` **Added** + - `organizationName` **Removed** (Breaking ⚠️) + * `response` **Changed** (Breaking ⚠️) + - `alertCallbackUrl` **Removed** (Breaking ⚠️) + - `alertExhaustedRetriesWindowSeconds` **Added** + - `organizationName` **Removed** (Breaking ⚠️) diff --git a/.speakeasy/logs/changes/new.openapi.yaml b/.speakeasy/logs/changes/new.openapi.yaml index 1bfbd666..675d4c8b 100644 --- a/.speakeasy/logs/changes/new.openapi.yaml +++ b/.speakeasy/logs/changes/new.openapi.yaml @@ -2857,10 +2857,10 @@ components: properties: ALERT_AUTO_DISABLE_DESTINATION: type: string - ALERT_CALLBACK_URL: - type: string ALERT_CONSECUTIVE_FAILURE_COUNT: type: string + ALERT_EXHAUSTED_RETRIES_WINDOW_SECONDS: + type: string DELIVERY_TIMEOUT_SECONDS: type: string DESTINATIONS_AWS_KINESIS_METADATA_IN_PAYLOAD: @@ -2903,8 +2903,6 @@ components: type: string MAX_DESTINATIONS_PER_TENANT: type: string - ORGANIZATION_NAME: - type: string PORTAL_BRAND_COLOR: type: string PORTAL_DISABLE_OUTPOST_BRANDING: diff --git a/.speakeasy/logs/changes/old.openapi.yaml b/.speakeasy/logs/changes/old.openapi.yaml index 1fded13f..7a7c955e 100644 --- a/.speakeasy/logs/changes/old.openapi.yaml +++ b/.speakeasy/logs/changes/old.openapi.yaml @@ -1755,8 +1755,25 @@ components: gcp_pubsub: "#/components/schemas/DestinationCreateGCPPubSub" kafka: "#/components/schemas/DestinationCreateKafka" # Type-Specific Destination Update Schemas (for Request Bodies) + # Type-Specific Partial Schemas for PATCH Request Bodies + # All fields are optional — RFC 7396 JSON merge-patch semantics apply: + # omit a field to leave it unchanged; include a field to update it in place. + WebhookConfigUpdate: + type: object + description: Partial Webhook config for PATCH updates (RFC 7396 merge-patch). + properties: + url: + type: string + format: url + description: The URL to send the webhook events to. + example: "https://example.com/webhooks/user" + custom_headers: + type: string + description: JSON string of custom HTTP headers to include with every webhook request. + example: '{"x-api-key":"secret123","x-tenant-id":"customer-456"}' WebhookCredentialsUpdate: type: object + description: Partial Webhook credentials for PATCH updates (RFC 7396 merge-patch). properties: secret: type: string @@ -1771,17 +1788,206 @@ components: rotate_secret: type: boolean description: Set to true to rotate the secret. The current secret becomes the previous_secret, and a new secret is generated. `previous_secret_invalid_at` defaults to 24h if not provided. + AWSSQSConfigUpdate: + type: object + description: Partial AWS SQS config for PATCH updates (RFC 7396 merge-patch). + properties: + endpoint: + type: string + format: url + description: Optional. Custom AWS endpoint URL (e.g., for LocalStack or specific regions). + example: "https://sqs.us-east-1.amazonaws.com" + queue_url: + type: string + format: url + description: The URL of the SQS queue. + example: "https://sqs.us-east-1.amazonaws.com/123456789012/my-queue" + AWSSQSCredentialsUpdate: + type: object + description: Partial AWS SQS credentials for PATCH updates (RFC 7396 merge-patch). + properties: + key: + type: string + description: AWS Access Key ID. + secret: + type: string + description: AWS Secret Access Key. + session: + type: string + description: Optional AWS Session Token (for temporary credentials). + RabbitMQConfigUpdate: + type: object + description: Partial RabbitMQ config for PATCH updates (RFC 7396 merge-patch). + properties: + server_url: + type: string + description: RabbitMQ server address (host:port). + exchange: + type: string + description: The exchange to publish messages to. + tls: + type: string + enum: ["true", "false"] + description: Whether to use TLS connection (amqps). + RabbitMQCredentialsUpdate: + type: object + description: Partial RabbitMQ credentials for PATCH updates (RFC 7396 merge-patch). + properties: + username: + type: string + description: RabbitMQ username. + password: + type: string + description: RabbitMQ password. + HookdeckCredentialsUpdate: + type: object + description: Partial Hookdeck credentials for PATCH updates (RFC 7396 merge-patch). + properties: + token: + type: string + description: Hookdeck authentication token. + AWSKinesisConfigUpdate: + type: object + description: Partial AWS Kinesis config for PATCH updates (RFC 7396 merge-patch). + properties: + stream_name: + type: string + description: The name of the AWS Kinesis stream. + region: + type: string + description: The AWS region where the Kinesis stream is located. + endpoint: + type: string + format: url + description: Optional. Custom AWS endpoint URL (e.g., for LocalStack or VPC endpoints). + partition_key_template: + type: string + description: Optional. JMESPath template to extract the partition key from the event payload. + AWSKinesisCredentialsUpdate: + type: object + description: Partial AWS Kinesis credentials for PATCH updates (RFC 7396 merge-patch). + properties: + key: + type: string + description: AWS Access Key ID. + secret: + type: string + description: AWS Secret Access Key. + session: + type: string + description: Optional AWS Session Token (for temporary credentials). + AzureServiceBusConfigUpdate: + type: object + description: Partial Azure Service Bus config for PATCH updates (RFC 7396 merge-patch). + properties: + name: + type: string + description: The name of the Azure Service Bus queue or topic to publish messages to. + AzureServiceBusCredentialsUpdate: + type: object + description: Partial Azure Service Bus credentials for PATCH updates (RFC 7396 merge-patch). + properties: + connection_string: + type: string + description: The connection string for the Azure Service Bus namespace. + AWSS3ConfigUpdate: + type: object + description: Partial AWS S3 config for PATCH updates (RFC 7396 merge-patch). + properties: + bucket: + type: string + description: The name of your AWS S3 bucket. + region: + type: string + pattern: "^[a-z]{2}-[a-z]+-[0-9]+$" + description: The AWS region where your bucket is located. + key_template: + type: string + description: JMESPath expression for generating S3 object keys. + storage_class: + type: string + description: The storage class for the S3 objects. + AWSS3CredentialsUpdate: + type: object + description: Partial AWS S3 credentials for PATCH updates (RFC 7396 merge-patch). + properties: + key: + type: string + description: AWS Access Key ID. + secret: + type: string + description: AWS Secret Access Key. + session: + type: string + description: Optional AWS Session Token (for temporary credentials). + GCPPubSubConfigUpdate: + type: object + description: Partial GCP Pub/Sub config for PATCH updates (RFC 7396 merge-patch). + properties: + project_id: + type: string + description: The GCP project ID. + topic: + type: string + description: The Pub/Sub topic name. + endpoint: + type: string + description: Optional. Custom endpoint URL (e.g., localhost:8085 for emulator). + GCPPubSubCredentialsUpdate: + type: object + description: Partial GCP Pub/Sub credentials for PATCH updates (RFC 7396 merge-patch). + properties: + service_account_json: + type: string + description: Service account key JSON. The entire JSON key file content as a string. + KafkaConfigUpdate: + type: object + description: Partial Kafka config for PATCH updates (RFC 7396 merge-patch). + properties: + brokers: + type: string + description: Comma-separated list of Kafka broker addresses. + topic: + type: string + description: The Kafka topic to publish messages to. + sasl_mechanism: + type: string + enum: [plain, scram-sha-256, scram-sha-512] + description: SASL authentication mechanism. + tls: + type: string + enum: ["true", "false"] + description: Whether to enable TLS for the connection. + partition_key_template: + type: string + description: Optional JMESPath template to extract the partition key from the event payload. + KafkaCredentialsUpdate: + type: object + description: Partial Kafka credentials for PATCH updates (RFC 7396 merge-patch). + properties: + username: + type: string + description: SASL username for authentication. + password: + type: string + description: SASL password for authentication. DestinationUpdateWebhook: type: object x-docs-type: "Webhook" # Properties duplicated from DestinationUpdateBase + required: [type] properties: + type: + type: string + enum: [webhook] + description: Destination type discriminator. Must equal the existing destination's type — type itself cannot be changed via PATCH. + example: "webhook" topics: $ref: "#/components/schemas/Topics" filter: $ref: "#/components/schemas/Filter" config: - $ref: "#/components/schemas/WebhookConfig" # URL is required here, but PATCH means it's optional in the request + $ref: "#/components/schemas/WebhookConfigUpdate" credentials: $ref: "#/components/schemas/WebhookCredentialsUpdate" delivery_metadata: @@ -1815,15 +2021,21 @@ components: type: object x-docs-type: "AWS SQS" # Properties duplicated from DestinationUpdateBase + required: [type] properties: + type: + type: string + enum: [aws_sqs] + description: Destination type discriminator. Must equal the existing destination's type — type itself cannot be changed via PATCH. + example: "aws_sqs" topics: $ref: "#/components/schemas/Topics" filter: $ref: "#/components/schemas/Filter" config: - $ref: "#/components/schemas/AWSSQSConfig" # queue_url is required here, but PATCH means it's optional + $ref: "#/components/schemas/AWSSQSConfigUpdate" credentials: - $ref: "#/components/schemas/AWSSQSCredentials" # key/secret required here, but PATCH means optional + $ref: "#/components/schemas/AWSSQSCredentialsUpdate" delivery_metadata: type: object additionalProperties: @@ -1855,15 +2067,21 @@ components: type: object x-docs-type: "RabbitMQ" # Properties duplicated from DestinationUpdateBase + required: [type] properties: + type: + type: string + enum: [rabbitmq] + description: Destination type discriminator. Must equal the existing destination's type — type itself cannot be changed via PATCH. + example: "rabbitmq" topics: $ref: "#/components/schemas/Topics" filter: $ref: "#/components/schemas/Filter" config: - $ref: "#/components/schemas/RabbitMQConfig" # server_url/exchange required here, but PATCH means optional + $ref: "#/components/schemas/RabbitMQConfigUpdate" credentials: - $ref: "#/components/schemas/RabbitMQCredentials" # username/password required here, but PATCH means optional + $ref: "#/components/schemas/RabbitMQCredentialsUpdate" delivery_metadata: type: object additionalProperties: @@ -1895,14 +2113,20 @@ components: type: object x-docs-type: "Hookdeck Event Gateway" # Properties duplicated from DestinationUpdateBase + # Hookdeck has no updatable `config`. + required: [type] properties: + type: + type: string + enum: [hookdeck] + description: Destination type discriminator. Must equal the existing destination's type — type itself cannot be changed via PATCH. + example: "hookdeck" topics: $ref: "#/components/schemas/Topics" filter: $ref: "#/components/schemas/Filter" - config: {} # Empty config, cannot be updated credentials: - $ref: "#/components/schemas/HookdeckCredentials" # token required here, but PATCH means optional + $ref: "#/components/schemas/HookdeckCredentialsUpdate" delivery_metadata: type: object additionalProperties: @@ -1934,15 +2158,21 @@ components: type: object x-docs-type: "AWS Kinesis" # Properties duplicated from DestinationUpdateBase + required: [type] properties: + type: + type: string + enum: [aws_kinesis] + description: Destination type discriminator. Must equal the existing destination's type — type itself cannot be changed via PATCH. + example: "aws_kinesis" topics: $ref: "#/components/schemas/Topics" filter: $ref: "#/components/schemas/Filter" config: - $ref: "#/components/schemas/AWSKinesisConfig" # stream_name/region required here, but PATCH means optional + $ref: "#/components/schemas/AWSKinesisConfigUpdate" credentials: - $ref: "#/components/schemas/AWSKinesisCredentials" # key/secret required here, but PATCH means optional + $ref: "#/components/schemas/AWSKinesisCredentialsUpdate" delivery_metadata: type: object additionalProperties: @@ -1974,15 +2204,21 @@ components: type: object x-docs-type: "Azure Service Bus" # Properties duplicated from DestinationUpdateBase + required: [type] properties: + type: + type: string + enum: [azure_servicebus] + description: Destination type discriminator. Must equal the existing destination's type — type itself cannot be changed via PATCH. + example: "azure_servicebus" topics: $ref: "#/components/schemas/Topics" filter: $ref: "#/components/schemas/Filter" config: - $ref: "#/components/schemas/AzureServiceBusConfig" # name required here, but PATCH means optional + $ref: "#/components/schemas/AzureServiceBusConfigUpdate" credentials: - $ref: "#/components/schemas/AzureServiceBusCredentials" # connection_string required here, but PATCH means optional + $ref: "#/components/schemas/AzureServiceBusCredentialsUpdate" delivery_metadata: type: object additionalProperties: @@ -2014,15 +2250,21 @@ components: type: object x-docs-type: "AWS S3" # Properties duplicated from DestinationUpdateBase + required: [type] properties: + type: + type: string + enum: [aws_s3] + description: Destination type discriminator. Must equal the existing destination's type — type itself cannot be changed via PATCH. + example: "aws_s3" topics: $ref: "#/components/schemas/Topics" filter: $ref: "#/components/schemas/Filter" config: - $ref: "#/components/schemas/AWSS3Config" # bucket/region required here, but PATCH means optional + $ref: "#/components/schemas/AWSS3ConfigUpdate" credentials: - $ref: "#/components/schemas/AWSS3Credentials" # key/secret required here, but PATCH means optional + $ref: "#/components/schemas/AWSS3CredentialsUpdate" delivery_metadata: type: object additionalProperties: @@ -2054,15 +2296,21 @@ components: type: object x-docs-type: "GCP PubSub" # Properties duplicated from DestinationUpdateBase + required: [type] properties: + type: + type: string + enum: [gcp_pubsub] + description: Destination type discriminator. Must equal the existing destination's type — type itself cannot be changed via PATCH. + example: "gcp_pubsub" topics: $ref: "#/components/schemas/Topics" filter: $ref: "#/components/schemas/Filter" config: - $ref: "#/components/schemas/GCPPubSubConfig" # project_id/topic required here, but PATCH means optional + $ref: "#/components/schemas/GCPPubSubConfigUpdate" credentials: - $ref: "#/components/schemas/GCPPubSubCredentials" # service_account_json required here, but PATCH means optional + $ref: "#/components/schemas/GCPPubSubCredentialsUpdate" delivery_metadata: type: object additionalProperties: @@ -2094,15 +2342,21 @@ components: type: object x-docs-type: "Apache Kafka" # Properties duplicated from DestinationUpdateBase + required: [type] properties: + type: + type: string + enum: [kafka] + description: Destination type discriminator. Must equal the existing destination's type — type itself cannot be changed via PATCH. + example: "kafka" topics: $ref: "#/components/schemas/Topics" filter: $ref: "#/components/schemas/Filter" config: - $ref: "#/components/schemas/KafkaConfig" # brokers/topic/sasl_mechanism required here, but PATCH means optional + $ref: "#/components/schemas/KafkaConfigUpdate" credentials: - $ref: "#/components/schemas/KafkaCredentials" # username/password required here, but PATCH means optional + $ref: "#/components/schemas/KafkaCredentialsUpdate" delivery_metadata: type: object additionalProperties: @@ -2142,6 +2396,18 @@ components: - $ref: "#/components/schemas/DestinationUpdateGCPPubSub" - $ref: "#/components/schemas/DestinationUpdateRabbitMQ" - $ref: "#/components/schemas/DestinationUpdateKafka" + discriminator: + propertyName: type + mapping: + webhook: "#/components/schemas/DestinationUpdateWebhook" + aws_sqs: "#/components/schemas/DestinationUpdateAWSSQS" + rabbitmq: "#/components/schemas/DestinationUpdateRabbitMQ" + hookdeck: "#/components/schemas/DestinationUpdateHookdeck" + aws_kinesis: "#/components/schemas/DestinationUpdateAWSKinesis" + azure_servicebus: "#/components/schemas/DestinationUpdateAzureServiceBus" + aws_s3: "#/components/schemas/DestinationUpdateAWSS3" + gcp_pubsub: "#/components/schemas/DestinationUpdateGCPPubSub" + kafka: "#/components/schemas/DestinationUpdateKafka" # Event Schemas PublishRequest: type: object @@ -2307,8 +2573,8 @@ components: event: nullable: true oneOf: - - $ref: "#/components/schemas/EventSummary" - $ref: "#/components/schemas/EventFull" + - $ref: "#/components/schemas/EventSummary" description: The associated event object. Only present when include=event or include=event.data. destination: nullable: true @@ -3061,18 +3327,6 @@ paths: x-speakeasy-max-method-params: 0 security: - BearerAuth: [] - x-speakeasy-pagination: - type: cursor - inputs: - - name: next - in: parameters - type: cursor - - name: limit - in: parameters - type: limit - outputs: - nextCursor: $.pagination.next - results: $.models /tenants/{tenant_id}: parameters: - name: tenant_id @@ -3319,18 +3573,6 @@ paths: x-speakeasy-name-override: list security: - BearerAuth: [] - x-speakeasy-pagination: - type: cursor - inputs: - - name: next - in: parameters - type: cursor - - name: limit - in: parameters - type: limit - outputs: - nextCursor: $.pagination.next - results: $.models /events/{event_id}: parameters: - name: event_id @@ -3571,18 +3813,6 @@ paths: x-speakeasy-name-override: list security: - BearerAuth: [] - x-speakeasy-pagination: - type: cursor - inputs: - - name: next - in: parameters - type: cursor - - name: limit - in: parameters - type: limit - outputs: - nextCursor: $.pagination.next - results: $.models /attempts/{attempt_id}: parameters: - name: attempt_id @@ -4250,18 +4480,6 @@ paths: "500": $ref: "#/components/responses/InternalServerError" x-speakeasy-name-override: listAttempts - x-speakeasy-pagination: - type: cursor - inputs: - - name: next - in: parameters - type: cursor - - name: limit - in: parameters - type: limit - outputs: - nextCursor: $.pagination.next - results: $.models /tenants/{tenant_id}/destinations/{destination_id}/attempts/{attempt_id}: parameters: - name: tenant_id diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock index 34711d80..18cbac47 100644 --- a/.speakeasy/workflow.lock +++ b/.speakeasy/workflow.lock @@ -1,23 +1,23 @@ -speakeasyVersion: 1.768.2 +speakeasyVersion: 1.780.0 sources: Outpost API: sourceNamespace: outpost-api - sourceRevisionDigest: sha256:96304f062759f5fc5117c2aaab1cd81139210e92f7ef3bd4e655b6416ad6bc65 - sourceBlobDigest: sha256:22045b6400f7ff362dbec1ec0b490f398fa36df760d82574866161d8d1455821 + sourceRevisionDigest: sha256:24a17a5df69df39bbfcb267ecd21f7f25e819333ec8a28788d2be401da4b418a + sourceBlobDigest: sha256:f0746ce81a2f018b57511af0fce5ce8c7e21ebe6ea1a3ed41b34419a0d8b63f0 tags: - latest - 0.0.1 Outpost API (Go): sourceNamespace: outpost-api - sourceRevisionDigest: sha256:fa0463ed9fac6e1ea1d4d27ca3c8fd28f250c107549edc96fc3130dce2fa2591 - sourceBlobDigest: sha256:66aab8b551893e83f5702de4ab4d57f24cdc1a68c4a17efa0e51b0d4249aa83b + sourceRevisionDigest: sha256:272832aae60da69564adb28db3e59a48a3da710195a9afd0c2a6a6324a5e0161 + sourceBlobDigest: sha256:a5d8386e9a62e23bf3190863ce77caf3f7abf4bf65ef3329546dc73872310ce6 tags: - latest - 0.0.1 Outpost API (Python): sourceNamespace: outpost-api - sourceRevisionDigest: sha256:8fc2f426f65cf81bf5669dcc12129d035defc79e39301585eb8136ff680113bf - sourceBlobDigest: sha256:6124246c73fe55dc934fdb41c51a8c54d0bbebec617f3f8fb92f41031fe5e951 + sourceRevisionDigest: sha256:937055133d51d769613a52eba7ae6ef4106e5b682589e863e12c336b25646930 + sourceBlobDigest: sha256:b4d9106bc1376950b213e639f5e5fa4b5da5cc51277ee3d6bdf44b48068a17a2 tags: - latest - 0.0.1 @@ -25,24 +25,24 @@ targets: outpost-go: source: Outpost API (Go) sourceNamespace: outpost-api - sourceRevisionDigest: sha256:fa0463ed9fac6e1ea1d4d27ca3c8fd28f250c107549edc96fc3130dce2fa2591 - sourceBlobDigest: sha256:66aab8b551893e83f5702de4ab4d57f24cdc1a68c4a17efa0e51b0d4249aa83b + sourceRevisionDigest: sha256:272832aae60da69564adb28db3e59a48a3da710195a9afd0c2a6a6324a5e0161 + sourceBlobDigest: sha256:a5d8386e9a62e23bf3190863ce77caf3f7abf4bf65ef3329546dc73872310ce6 codeSamplesNamespace: outpost-api-go-code-samples - codeSamplesRevisionDigest: sha256:57c198724b8e924a4d7b2aa692412b0ce003c66999d46bd45ab6f8e129218c2d + codeSamplesRevisionDigest: sha256:8abaec796a7e281a9f8fdb053397c5e11ecd7ba80508d9317980f8039ad15b7b outpost-python: source: Outpost API (Python) sourceNamespace: outpost-api - sourceRevisionDigest: sha256:8fc2f426f65cf81bf5669dcc12129d035defc79e39301585eb8136ff680113bf - sourceBlobDigest: sha256:6124246c73fe55dc934fdb41c51a8c54d0bbebec617f3f8fb92f41031fe5e951 + sourceRevisionDigest: sha256:937055133d51d769613a52eba7ae6ef4106e5b682589e863e12c336b25646930 + sourceBlobDigest: sha256:b4d9106bc1376950b213e639f5e5fa4b5da5cc51277ee3d6bdf44b48068a17a2 codeSamplesNamespace: outpost-api-python-code-samples - codeSamplesRevisionDigest: sha256:8240eddf814a5129e5dec41c90dd18b9d394e634c0fc74f6d4e99ecf8f6dd4c7 + codeSamplesRevisionDigest: sha256:261e1231d3e2a0b21b6ab7b19985993f3002bb1ac6c14eb752e16bb7615c92bf outpost-ts: source: Outpost API sourceNamespace: outpost-api - sourceRevisionDigest: sha256:96304f062759f5fc5117c2aaab1cd81139210e92f7ef3bd4e655b6416ad6bc65 - sourceBlobDigest: sha256:22045b6400f7ff362dbec1ec0b490f398fa36df760d82574866161d8d1455821 + sourceRevisionDigest: sha256:24a17a5df69df39bbfcb267ecd21f7f25e819333ec8a28788d2be401da4b418a + sourceBlobDigest: sha256:f0746ce81a2f018b57511af0fce5ce8c7e21ebe6ea1a3ed41b34419a0d8b63f0 codeSamplesNamespace: outpost-api-typescript-code-samples - codeSamplesRevisionDigest: sha256:a15fd6703c88fa061ef44cb88f4c4ecc42fdf4c19350cd971fac05c3758d9336 + codeSamplesRevisionDigest: sha256:c9058af42924432f4201d42c07f43ca7bb4b1ff7ee25e9b3c1387e51e031340c workflow: workflowVersion: 1.0.0 speakeasyVersion: latest diff --git a/cmd/e2e/regression_format_error_test.go b/cmd/e2e/regression_format_error_test.go new file mode 100644 index 00000000..eb2d8861 --- /dev/null +++ b/cmd/e2e/regression_format_error_test.go @@ -0,0 +1,176 @@ +package e2e_test + +import ( + "context" + "fmt" + "log" + "net/http" + "testing" + "time" + + "github.com/aws/aws-sdk-go-v2/aws" + awsconfig "github.com/aws/aws-sdk-go-v2/config" + "github.com/aws/aws-sdk-go-v2/credentials" + "github.com/aws/aws-sdk-go-v2/service/s3" + "github.com/gin-gonic/gin" + "github.com/hookdeck/outpost/cmd/e2e/configs" + "github.com/hookdeck/outpost/internal/app" + "github.com/hookdeck/outpost/internal/config" + "github.com/hookdeck/outpost/internal/util/testinfra" + "github.com/stretchr/testify/require" +) + +// TestE2E_Regression_FormatErrorIsDeliveredAttempt verifies that a per-event +// formatting failure is handled as a normal failed delivery, not a system error +// that gets nacked and dead-lettered. +// +// We use aws_s3 because its key_template is only syntax-validated at creation, so a +// valid template can still fail at delivery for an event missing a referenced field. +// +// Asserts, end to end: +// 1. nothing is written to S3 (the failure is pre-delivery) +// 2. each attempt is recorded as a failed delivery +// 3. it retries on the normal schedule and exhausts, rather than being dead-lettered +func TestE2E_Regression_FormatErrorIsDeliveredAttempt(t *testing.T) { + t.Parallel() + if testing.Short() { + t.Skip("skipping e2e test") + } + + testinfraCleanup := testinfra.Start(t) + defer testinfraCleanup() + gin.SetMode(gin.TestMode) + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + // LocalStack S3: the bucket doubles as the "was anything actually delivered?" sink. + endpoint := testinfra.EnsureLocalStack() + awsCfg, err := awsconfig.LoadDefaultConfig(ctx, + awsconfig.WithRegion("us-east-1"), + awsconfig.WithCredentialsProvider(credentials.NewStaticCredentialsProvider("test", "test", "")), + ) + require.NoError(t, err) + s3Client := s3.NewFromConfig(awsCfg, func(o *s3.Options) { + o.UsePathStyle = true // required for LocalStack + o.BaseEndpoint = aws.String(endpoint) + }) + bucket := fmt.Sprintf("regr-format-%d", time.Now().UnixNano()) + _, err = s3Client.CreateBucket(ctx, &s3.CreateBucketInput{Bucket: aws.String(bucket)}) + require.NoError(t, err) + + // Isolated outpost instance with a short, bounded retry schedule so the budget + // exhausts quickly: schedule length 2 => 2 retries => 3 total attempts. + cfg := configs.Basic(t, configs.BasicOpts{LogStorage: configs.LogStorageTypeClickHouse}) + cfg.RetrySchedule = []int{1, 1} + cfg.RetryPollBackoffMs = 50 + cfg.LogBatchThresholdSeconds = 0 // immediate flush so /attempts is reliable + require.NoError(t, cfg.Validate(config.Flags{})) + configs.ApplyMigrations(t, &cfg) + + appDone := make(chan struct{}) + go func() { + defer close(appDone) + application := app.New(&cfg) + if err := application.Run(ctx); err != nil { + log.Println("Application stopped:", err) + } + }() + defer func() { + cancel() + <-appDone + }() + + waitForHealthy(t, cfg.APIPort, 5*time.Second) + + client := newRegressionHTTPClient(cfg.APIKey) + apiURL := fmt.Sprintf("http://localhost:%d/api/v1", cfg.APIPort) + + tenantID := fmt.Sprintf("tenant_format_%d", time.Now().UnixNano()) + destinationID := fmt.Sprintf("dest_format_%d", time.Now().UnixNano()) + eventID := fmt.Sprintf("evt_format_%d", time.Now().UnixNano()) + + // Create tenant. + status := client.doJSON(t, http.MethodPut, apiURL+"/tenants/"+tenantID, nil, nil) + require.Equal(t, 201, status, "failed to create tenant") + + // Create an aws_s3 destination whose key_template is valid at creation but cannot be + // evaluated for an event lacking metadata.operationId (join over a nil value fails). + status = client.doJSON(t, http.MethodPost, apiURL+"/tenants/"+tenantID+"/destinations", map[string]any{ + "id": destinationID, + "type": "aws_s3", + "topics": "*", + "config": map[string]any{ + "bucket": bucket, + "region": "us-east-1", + "endpoint": endpoint, + "storage_class": "STANDARD", + "key_template": `join('/', ['prefix', metadata.operationId])`, + }, + "credentials": map[string]any{ + "key": "test", + "secret": "test", + }, + }, nil) + require.Equal(t, 201, status, "failed to create aws_s3 destination") + + // Publish a retry-eligible event WITHOUT metadata.operationId -> formatting fails at delivery. + status = client.doJSON(t, http.MethodPost, apiURL+"/publish", map[string]any{ + "id": eventID, + "tenant_id": tenantID, + "topic": "user.created", + "eligible_for_retry": true, + "metadata": map[string]any{"foo": "bar"}, + "data": map[string]any{"hello": "world"}, + }, nil) + require.Equal(t, 202, status, "failed to publish event") + + attemptsURL := apiURL + "/attempts?tenant_id=" + tenantID + "&event_id=" + eventID + "&dir=asc&include=response_data" + pollAttempts := func(t *testing.T, minCount int, timeout time.Duration) []map[string]any { + t.Helper() + deadline := time.Now().Add(timeout) + for time.Now().Before(deadline) { + var resp struct { + Models []map[string]any `json:"models"` + } + s := client.doJSON(t, http.MethodGet, attemptsURL, nil, &resp) + if s == http.StatusOK && len(resp.Models) >= minCount { + return resp.Models + } + time.Sleep(100 * time.Millisecond) + } + t.Fatalf("timed out waiting for %d attempts", minCount) + return nil + } + + // (2) + (3): retries run on the normal schedule and produce recorded failed attempts. + // 1 initial + 2 scheduled retries = 3 attempts. If the fix regressed, the format error + // would nack/dead-letter the message and ZERO attempts would be logged -> this times out. + attempts := pollAttempts(t, 3, 15*time.Second) + for i, atm := range attempts { + require.Equal(t, "failed", atm["status"], "attempt %d should be a failed delivery", i+1) + // (2) the attempt carries the format error as a normal, customer-facing delivery error. + if rd, ok := atm["response_data"].(map[string]any); ok { + require.Equal(t, "could not format event for delivery", rd["error"], + "attempt %d should record the format error", i+1) + } else { + t.Fatalf("attempt %d missing response_data", i+1) + } + } + + // Budget exhausted: after the schedule completes, no further attempts appear. A + // dead-letter/requeue loop would keep producing attempts (or none at all) instead + // of stopping cleanly at the retry budget. + time.Sleep(2 * time.Second) + var finalResp struct { + Models []map[string]any `json:"models"` + } + client.doJSON(t, http.MethodGet, attemptsURL, nil, &finalResp) + require.Len(t, finalResp.Models, 3, + "should have exactly 3 attempts (1 initial + 2 retries) then stop — not requeue into a DLQ") + + // (1) nothing was ever written to S3 — the failure happened before any PutObject. + listed, err := s3Client.ListObjectsV2(ctx, &s3.ListObjectsV2Input{Bucket: aws.String(bucket)}) + require.NoError(t, err) + require.Empty(t, listed.Contents, "no object should have been written to S3") +} diff --git a/examples/docker-compose/compose.yml b/examples/docker-compose/compose.yml index 645ab911..4eeeda9a 100644 --- a/examples/docker-compose/compose.yml +++ b/examples/docker-compose/compose.yml @@ -1,7 +1,7 @@ name: outpost-example services: migrate: - image: hookdeck/outpost:v1.0.4 + image: hookdeck/outpost:v1.0.5 command: migrate apply --yes env_file: .env depends_on: @@ -10,7 +10,7 @@ services: restart: "no" api: - image: hookdeck/outpost:v1.0.4 + image: hookdeck/outpost:v1.0.5 env_file: .env depends_on: migrate: @@ -25,7 +25,7 @@ services: - 3333:3333 delivery: - image: hookdeck/outpost:v1.0.4 + image: hookdeck/outpost:v1.0.5 env_file: .env depends_on: migrate: @@ -38,7 +38,7 @@ services: SERVICE: delivery log: - image: hookdeck/outpost:v1.0.4 + image: hookdeck/outpost:v1.0.5 env_file: .env depends_on: migrate: diff --git a/internal/destregistry/error.go b/internal/destregistry/error.go index c824d9b2..f07f576d 100644 --- a/internal/destregistry/error.go +++ b/internal/destregistry/error.go @@ -39,6 +39,27 @@ func NewErrDestinationPublishAttempt(err error, provider string, data map[string return &ErrDestinationPublishAttempt{Err: err, Provider: provider, Data: data} } +// NewFormatError returns the (*Delivery, error) a publisher should return when +// formatting an event fails before it can be sent (e.g. an invalid key/partition +// template or an unparseable payload). It records a failed attempt so the failure +// is visible to the customer and the message is acked, instead of nacking into the DLQ. +// +// message is the customer-facing string persisted on the attempt (ResponseData); +// when empty a generic default is used. The raw err is carried only in the returned +// error (for logs/telemetry) and is not persisted on the attempt. +func NewFormatError(provider, message string, err error) (*Delivery, error) { + if message == "" { + message = "could not format event for delivery" + } + return &Delivery{ + Status: "failed", + Code: "ERR", + Response: map[string]interface{}{"error": message}, + }, NewErrDestinationPublishAttempt(err, provider, map[string]interface{}{ + "error": "format_failed", + }) +} + // NewErrPublishCanceled creates an error for when publish is canceled (e.g., service shutdown). // This should return nil Delivery to trigger nack → requeue for another instance. // See: https://github.com/hookdeck/outpost/issues/571 diff --git a/internal/destregistry/format_error_test.go b/internal/destregistry/format_error_test.go new file mode 100644 index 00000000..b2db7c09 --- /dev/null +++ b/internal/destregistry/format_error_test.go @@ -0,0 +1,52 @@ +package destregistry_test + +import ( + "errors" + "testing" + + "github.com/hookdeck/outpost/internal/destregistry" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestNewFormatError(t *testing.T) { + t.Parallel() + + rawErr := errors.New("failed to evaluate key template: invalid type") + + t.Run("returns a failed delivery and a publish-attempt error", func(t *testing.T) { + t.Parallel() + + delivery, err := destregistry.NewFormatError("aws_s3", "", rawErr) + + // A non-nil failed delivery means the registry records an attempt and acks + // the message instead of nacking it into the DLQ. + require.NotNil(t, delivery) + assert.Equal(t, "failed", delivery.Status) + assert.Equal(t, "ERR", delivery.Code) + + var pubErr *destregistry.ErrDestinationPublishAttempt + require.ErrorAs(t, err, &pubErr) + assert.Equal(t, "aws_s3", pubErr.Provider) + assert.Equal(t, "format_failed", pubErr.Data["error"]) + // Raw Go error is carried on the error for logs/telemetry... + assert.Equal(t, rawErr, pubErr.Err) + }) + + t.Run("uses a generic message when none is given", func(t *testing.T) { + t.Parallel() + + delivery, _ := destregistry.NewFormatError("aws_s3", "", rawErr) + + // ...but is NOT persisted on the attempt; the customer-facing response is generic. + assert.Equal(t, "could not format event for delivery", delivery.Response["error"]) + assert.NotContains(t, delivery.Response["error"], "key template") + }) + + t.Run("uses the provided message when given", func(t *testing.T) { + t.Parallel() + + delivery, _ := destregistry.NewFormatError("aws_s3", "could not build S3 object key", rawErr) + assert.Equal(t, "could not build S3 object key", delivery.Response["error"]) + }) +} diff --git a/internal/destregistry/providers/destawskinesis/destawskinesis.go b/internal/destregistry/providers/destawskinesis/destawskinesis.go index 7d5ec3e5..0baf29d1 100644 --- a/internal/destregistry/providers/destawskinesis/destawskinesis.go +++ b/internal/destregistry/providers/destawskinesis/destawskinesis.go @@ -258,14 +258,7 @@ func (p *AWSKinesisPublisher) Publish(ctx context.Context, event *models.Event) // Format the event into a PutRecordInput input, err := p.Format(ctx, event) if err != nil { - return nil, destregistry.NewErrDestinationPublishAttempt( - err, - "aws_kinesis", - map[string]interface{}{ - "error": "format_failed", - "message": err.Error(), - }, - ) + return destregistry.NewFormatError("aws_kinesis", "", err) } // Send the record to Kinesis diff --git a/internal/destregistry/providers/destawss3/destawss3.go b/internal/destregistry/providers/destawss3/destawss3.go index 1d7d80bc..6a30a126 100644 --- a/internal/destregistry/providers/destawss3/destawss3.go +++ b/internal/destregistry/providers/destawss3/destawss3.go @@ -304,7 +304,7 @@ func (p *AWSS3Publisher) Publish(ctx context.Context, event *models.Event) (*des input, err := p.Format(ctx, event) if err != nil { - return nil, err + return destregistry.NewFormatError("aws_s3", "", err) } _, err = p.client.PutObject(ctx, input) diff --git a/internal/destregistry/providers/destawss3/destawss3_format_test.go b/internal/destregistry/providers/destawss3/destawss3_format_test.go index e206c5c5..c197c784 100644 --- a/internal/destregistry/providers/destawss3/destawss3_format_test.go +++ b/internal/destregistry/providers/destawss3/destawss3_format_test.go @@ -198,6 +198,42 @@ func TestAWSS3Publisher_Format_NilResult(t *testing.T) { assert.Contains(t, err.Error(), "nil result") } +// TestAWSS3Publisher_Publish_FormatError reproduces the production incident where a +// key_template references a field absent from the event (here metadata.operationId on +// an event with no such metadata). The key cannot be built, so Format fails. Publish +// must surface this as a failed delivery + ErrDestinationPublishAttempt (so the registry +// records an attempt and acks) rather than a nil delivery (which nacks into the DLQ). +func TestAWSS3Publisher_Publish_FormatError(t *testing.T) { + event := models.Event{ + ID: "event-123", + Time: time.Now(), + Data: json.RawMessage(`{}`), + } + + // Mirrors the incident template: join over a missing metadata field yields nil, + // which join rejects. Reaches Publish's Format step before any S3 client call, + // so a nil client is safe here. + template := `join('/', ['prefix', metadata.operationId])` + publisher := destawss3.NewAWSS3Publisher( + destregistry.NewBasePublisher(), + nil, + "my-bucket", + template, + "STANDARD", + ) + + delivery, err := publisher.Publish(context.Background(), &event) + + require.NotNil(t, delivery, "format failure must yield a non-nil delivery so the message is acked, not DLQ'd") + assert.Equal(t, "failed", delivery.Status) + assert.Equal(t, "ERR", delivery.Code) + + var pubErr *destregistry.ErrDestinationPublishAttempt + require.ErrorAs(t, err, &pubErr) + assert.Equal(t, "aws_s3", pubErr.Provider) + assert.Equal(t, "format_failed", pubErr.Data["error"]) +} + func TestAWSS3Publisher_Format_EmptyResult(t *testing.T) { event := models.Event{ ID: "event-123", diff --git a/internal/destregistry/providers/destawssqs/destawssqs.go b/internal/destregistry/providers/destawssqs/destawssqs.go index f605e3b2..511140b4 100644 --- a/internal/destregistry/providers/destawssqs/destawssqs.go +++ b/internal/destregistry/providers/destawssqs/destawssqs.go @@ -163,7 +163,7 @@ func (p *AWSSQSPublisher) Publish(ctx context.Context, event *models.Event) (*de msg, err := p.Format(ctx, event) if err != nil { - return nil, err + return destregistry.NewFormatError("aws_sqs", "", err) } if _, err = p.client.SendMessage(ctx, msg); err != nil { diff --git a/internal/destregistry/providers/destazureservicebus/destazureservicebus.go b/internal/destregistry/providers/destazureservicebus/destazureservicebus.go index 65252bfd..7034d991 100644 --- a/internal/destregistry/providers/destazureservicebus/destazureservicebus.go +++ b/internal/destregistry/providers/destazureservicebus/destazureservicebus.go @@ -149,7 +149,7 @@ func (p *AzureServiceBusPublisher) Publish(ctx context.Context, event *models.Ev message, err := p.Format(ctx, event) if err != nil { - return nil, err + return destregistry.NewFormatError("azure_servicebus", "", err) } sender, err := p.ensureSender() diff --git a/internal/destregistry/providers/destgcppubsub/destgcppubsub.go b/internal/destregistry/providers/destgcppubsub/destgcppubsub.go index f522411b..9ee1e9ad 100644 --- a/internal/destregistry/providers/destgcppubsub/destgcppubsub.go +++ b/internal/destregistry/providers/destgcppubsub/destgcppubsub.go @@ -184,7 +184,7 @@ func (pub *GCPPubSubPublisher) Publish(ctx context.Context, event *models.Event) // Format the message msg, err := pub.Format(ctx, event) if err != nil { - return nil, err + return destregistry.NewFormatError("gcp_pubsub", "", err) } // Publish the message diff --git a/internal/destregistry/providers/destkafka/destkafka.go b/internal/destregistry/providers/destkafka/destkafka.go index a75cdc63..6d7cfafa 100644 --- a/internal/destregistry/providers/destkafka/destkafka.go +++ b/internal/destregistry/providers/destkafka/destkafka.go @@ -222,12 +222,7 @@ func (p *KafkaPublisher) Publish(ctx context.Context, event *models.Event) (*des // Build parsed payload for partition key JMESPath evaluation dataMap, err := event.ParsedData() if err != nil { - return nil, destregistry.NewErrDestinationPublishAttempt( - err, "kafka", map[string]interface{}{ - "error": "format_failed", - "message": err.Error(), - }, - ) + return destregistry.NewFormatError("kafka", "", err) } if dataMap == nil { dataMap = make(map[string]interface{}) diff --git a/internal/destregistry/providers/destwebhook/destwebhook.go b/internal/destregistry/providers/destwebhook/destwebhook.go index 0162a2e2..055a4318 100644 --- a/internal/destregistry/providers/destwebhook/destwebhook.go +++ b/internal/destregistry/providers/destwebhook/destwebhook.go @@ -658,7 +658,7 @@ func (p *WebhookPublisher) Publish(ctx context.Context, event *models.Event) (*d httpReq, err := p.Format(ctx, event) if err != nil { - return nil, err + return destregistry.NewFormatError("webhook", "", err) } result := ExecuteHTTPRequest(ctx, p.httpClient, httpReq, "webhook") diff --git a/internal/destregistry/providers/destwebhookstandard/destwebhookstandard.go b/internal/destregistry/providers/destwebhookstandard/destwebhookstandard.go index fc4f098b..33d47c74 100644 --- a/internal/destregistry/providers/destwebhookstandard/destwebhookstandard.go +++ b/internal/destregistry/providers/destwebhookstandard/destwebhookstandard.go @@ -555,7 +555,7 @@ func (p *StandardWebhookPublisher) Publish(ctx context.Context, event *models.Ev httpReq, err := p.Format(ctx, event) if err != nil { - return nil, err + return destregistry.NewFormatError("webhook_standard", "", err) } result := destwebhook.ExecuteHTTPRequest(ctx, p.httpClient, httpReq, "webhook_standard") diff --git a/sdks/outpost-go/.speakeasy/gen.lock b/sdks/outpost-go/.speakeasy/gen.lock index 6b24a114..1235ea17 100644 --- a/sdks/outpost-go/.speakeasy/gen.lock +++ b/sdks/outpost-go/.speakeasy/gen.lock @@ -1,25 +1,25 @@ lockVersion: 2.0.0 id: f0627709-5a00-43ac-8678-ca716d6f379c management: - docChecksum: 59653b88754ae178057b100551d5c49e + docChecksum: 44bd8e72c1ac611e3e28caba9255116e docVersion: 0.0.1 - speakeasyVersion: 1.763.0 - generationVersion: 2.884.0 - releaseVersion: 1.4.0 - configChecksum: ba7a328eae8a56894b30bc9f473aa6e8 + speakeasyVersion: 1.780.0 + generationVersion: 2.906.0 + releaseVersion: 1.4.1 + configChecksum: bc8af1404897e448022eebdab9faad6f repoURL: https://github.com/hookdeck/outpost.git repoSubDirectory: sdks/outpost-go installationURL: https://github.com/hookdeck/outpost persistentEdits: - generation_id: a23ea2b9-7dcc-4eee-8417-9db77c8080f5 - pristine_commit_hash: 430200e7d130958c5d51da5b8f76aaac7c11c33e - pristine_tree_hash: efdbe2e1c4fbd7d832698c7e7b2a93c9a6956b17 + generation_id: b02faf30-19f7-42ce-b491-e92462679a56 + pristine_commit_hash: 5c9651df7f920b02860e367aa9f480278cebed7c + pristine_tree_hash: 55be1017e9d850f96db764178c65ad8d2750d07c features: go: additionalDependencies: 0.1.0 additionalProperties: 0.1.2 constsAndDefaults: 0.1.14 - core: 3.13.40 + core: 3.13.46 defaultEnabledRetries: 0.2.0 envVarSecurityUsage: 0.3.2 flattening: 2.81.2 @@ -32,7 +32,7 @@ features: nameOverrides: 2.81.4 nullables: 0.2.1 responseFormat: 0.1.2 - retries: 2.84.2 + retries: 2.84.3 sdkHooks: 0.3.0 unions: 2.87.7 trackedFiles: @@ -170,32 +170,32 @@ trackedFiles: pristine_git_object: 9a93f00e9b078361c71824996ff8aebb209d5d4f docs/models/components/destinationawskinesis.md: id: b14a0a005618 - last_write_checksum: sha1:951a2447439af159741c5b3ea81388664e679550 - pristine_git_object: 819b9814554850900462c6eaa50c6750c2f9fde5 + last_write_checksum: sha1:0b8f7e0593e5dae0a4959084b288dd3a84e035b0 + pristine_git_object: a35bcc42c0f0460fc269c7974a263a1678be289e docs/models/components/destinationawskinesistype.md: id: bcee015e58a9 last_write_checksum: sha1:b9951247da199aea74c93f86ab57b4237d72d41a pristine_git_object: edb6251b826ee6c3dc4ffabe7310ec4b0794cb5a docs/models/components/destinationawss3.md: id: 906ec923f423 - last_write_checksum: sha1:6bd619c9b3848f85d415da2d38e970a81153da9a - pristine_git_object: 10864b3cf1857235f4cbe8271872fab0ae288f5c + last_write_checksum: sha1:495d9d300a95eb8b0e556747abaee442c190a4ec + pristine_git_object: 3a75f4b4cc40134b1eb221fd53b76554d1e1e555 docs/models/components/destinationawss3type.md: id: a0a8c1c43c1e last_write_checksum: sha1:bfd94b18c2604daa8c60435ce5617367f6b75e0b pristine_git_object: 574cf5df39e6ea0322b9879cb062fddbafdcc6d2 docs/models/components/destinationawssqs.md: id: 3a958a8ebec9 - last_write_checksum: sha1:453c29dc1f3df75b882e0e5d98ad17d2f875292d - pristine_git_object: 5dbfb35ac69a4b1914360c7c0f2033da59e07260 + last_write_checksum: sha1:52c4611db492d6128671d88db41df31e361ad585 + pristine_git_object: 7c00cca45dcd49c997adf03cb11ed31d9eb97268 docs/models/components/destinationawssqstype.md: id: 26c8eec5f1a2 last_write_checksum: sha1:191822f7c6437691a4d169f095619bcd7582ad74 pristine_git_object: 3e5168c821dde0205748389fae0626ebf86a16b6 docs/models/components/destinationazureservicebus.md: id: fcf6d1e4ce40 - last_write_checksum: sha1:bf7c6cdd2e876497e6b716132f34cdbe8af860b4 - pristine_git_object: dabd1fd9bd878c020546304ab460dc87d2ac36da + last_write_checksum: sha1:e8e175499cead00b37eb8e9c55fb6c7e65726200 + pristine_git_object: f2bc3b1e309c015d60059d5fadb6882e849a77ea docs/models/components/destinationazureservicebustype.md: id: 293590e753b9 last_write_checksum: sha1:d65d7d74b01a0860dd32a3d88a857fa6594c80f7 @@ -206,104 +206,104 @@ trackedFiles: pristine_git_object: 302a4307d84d3d0be6d24287f39636478f82317f docs/models/components/destinationcreateawskinesis.md: id: 5593f1bd5e1a - last_write_checksum: sha1:e93d6d3d7bc80f6edccaba0302c24fce7bfe8db7 - pristine_git_object: 663c136320c99a83ce985e64c3dcae6d6fc4876b + last_write_checksum: sha1:4904f2e169ebe0723f518eb351a16ca6347bbc0c + pristine_git_object: 80106b0c9d5ca4c782dbc3062858d1adbe0f0be8 docs/models/components/destinationcreateawskinesistype.md: id: 6956680339a0 last_write_checksum: sha1:ccfe37b5aec6c9cc151a70e4c9a83badcebf0ce9 pristine_git_object: 0a54ef9a6fd668ebc2e658bacb3556cdb18a4f5e docs/models/components/destinationcreateawss3.md: id: af91634b61a0 - last_write_checksum: sha1:fce629bff9ce32aec5c0b572af14e971a9579744 - pristine_git_object: 13f58791c1b3aa5202a67512d945684a71d67fc3 + last_write_checksum: sha1:6a2d2435816d0275aa2e4403dade0835f28e493d + pristine_git_object: 439d97ac7c2183050b0dea2ee1592f661d49c948 docs/models/components/destinationcreateawss3type.md: id: 6877bf7e23ec last_write_checksum: sha1:15f7ecdaf26e36c0293c8da23599a38b81bc3be0 pristine_git_object: 3c81a08e5b289348be136baa3a104afbfda0abae docs/models/components/destinationcreateawssqs.md: id: c6b726f0ec14 - last_write_checksum: sha1:624a53c289d7ce9085e1a98248a3ffe38b8bca85 - pristine_git_object: 89dec8c8d2693b600e888e2a278d1d66d77777e8 + last_write_checksum: sha1:8acfb03b3f0a1e6eadc15d66d859a04a61020270 + pristine_git_object: 66faa016cb89319789500a19a297065327104551 docs/models/components/destinationcreateawssqstype.md: id: 1ef234381d5e last_write_checksum: sha1:6fa312b73dffdacc62b2d05b264d3b6794da974f pristine_git_object: 31eab2ef4c64390f168a4ff6808d7e1e3b685089 docs/models/components/destinationcreateazureservicebus.md: id: 89472b979d07 - last_write_checksum: sha1:2cf9deb396f7a939117089c2dd8024dc81b2e2d5 - pristine_git_object: 2272715f46a8496ddfe6a6cb013e0cf72828b78a + last_write_checksum: sha1:bcabc9a45ece480093dbf7e29871d7d86a73e322 + pristine_git_object: e6350d9a64ceeafc288a31036effe6b1930ba0e4 docs/models/components/destinationcreateazureservicebustype.md: id: 7bcec8499967 last_write_checksum: sha1:4556330df57f6e8afb09b8f70ba8899214a33373 pristine_git_object: 45c69a88d58579d1450876db00bb913772b61f28 docs/models/components/destinationcreategcppubsub.md: id: 83e1ebef3406 - last_write_checksum: sha1:6f00dbfcc12e4d2e57546173ba8ee51f367aa193 - pristine_git_object: 00928462a2aeb6b9fac6c1a3c93cec1ffc4c3db8 + last_write_checksum: sha1:5b3cf7e8f30a85f5f0a008bc4ae862464aa7b0b8 + pristine_git_object: 397fc131b5185ae23e4af0ea1e33fb37611689ea docs/models/components/destinationcreategcppubsubtype.md: id: dc2f412568a7 last_write_checksum: sha1:b6e81a8cdb239107506d6f7c6a946f0e980623f8 pristine_git_object: 2d821818d1265a121a3386844818bb679079a4db docs/models/components/destinationcreatehookdeck.md: id: a06f19b079ed - last_write_checksum: sha1:15efb07afd442088e512c7acc1ae8ca575b8478e - pristine_git_object: 28ef2cdf78cbca380df8b0a995dd2aae1109cbf1 + last_write_checksum: sha1:f174aadfd51f76b52002d45ad5497d9880c783b3 + pristine_git_object: cb7c04266dab1fc9c680d8e1cc2d9e1c57ba7180 docs/models/components/destinationcreatehookdecktype.md: id: 7633062252b9 last_write_checksum: sha1:6ca9d40f2c4eac5e7d540c5c0e0a7bc4e4a73d6d pristine_git_object: 034fb5298041b5d42008c7a5a8a86c2fb50002cb docs/models/components/destinationcreatekafka.md: id: 7c43fe1d2c1f - last_write_checksum: sha1:7ada6179a97a5da69b0afb71d490b1c88f96146c - pristine_git_object: cb567538cedec2ca4ae98569e728536c3421a777 + last_write_checksum: sha1:5d439344719d4d427a6bd218a7fbe1246b1cba32 + pristine_git_object: 83413354a8199ce4fe49ff26cdb69ed872b8aeb7 docs/models/components/destinationcreatekafkatype.md: id: d63a5ec5cd5c last_write_checksum: sha1:bf2d38ec8b1b1869907fcf4406c7eaad09c3c53c pristine_git_object: 09388b639b8f73730259ed54a2f7c9515d4e35f5 docs/models/components/destinationcreaterabbitmq.md: id: 3f95bd0221e2 - last_write_checksum: sha1:d8f2221eec47a8957cdb243162211b3492d4bdb7 - pristine_git_object: 3316027202bc407c674a67bc050f80b191874b3b + last_write_checksum: sha1:a967042bded0edc0380ce842244e2b3cbbbc4d2a + pristine_git_object: d03c4c709931b515e8e5bc716ba40a851816cec3 docs/models/components/destinationcreaterabbitmqtype.md: id: 71cf19ccfc8b last_write_checksum: sha1:f66d756b3e5f4321643ee26fe4b6963fda64828f pristine_git_object: fb92b828c9737d6279145a208f79df0fb41d8fe0 docs/models/components/destinationcreatewebhook.md: id: 92e4ccbf4461 - last_write_checksum: sha1:8855b8158b4dc7f3653e25c39108ebc059827b0c - pristine_git_object: b6f782c0a53786ddf69ebbd2580c5d8bf19bcfdd + last_write_checksum: sha1:0f18bd83b0e347e4f40bb20fc58abc9e0f6c05fc + pristine_git_object: 34d26398aaf88ec5c01fe04d9b6a116a3411c6c6 docs/models/components/destinationcreatewebhooktype.md: id: b112cbdd9f49 last_write_checksum: sha1:d2446eb8980f8027afd9b4e8e96007077a3c9fed pristine_git_object: 4fc8c45179cd9ceed9f9f38c4df532d6dd9257e8 docs/models/components/destinationgcppubsub.md: id: 557a06720b9c - last_write_checksum: sha1:31e01813181dcabe353772e4bc2e6d462d35a4b7 - pristine_git_object: 08637263534d2a4a2ff628426f4eedac8d0d4e25 + last_write_checksum: sha1:3e9a31b8b0f23c36d54e828dbcb12438725ed2a5 + pristine_git_object: 7cadf6af520c3fc5a4555f6bf7f6719c343a8c88 docs/models/components/destinationgcppubsubtype.md: id: 534d34c1b5da last_write_checksum: sha1:9565b47deb99273e373e3983629e5f98c28fdf3f pristine_git_object: f5c90e98edde70281d4069d65b2a3670b44134ff docs/models/components/destinationhookdeck.md: id: 96d7701b7615 - last_write_checksum: sha1:b8318e93ae418d68597ddae160ff7152902ccfb1 - pristine_git_object: 4aa80340adc4038a631d0fab5ce229d34742bbb1 + last_write_checksum: sha1:6e9b43d5aff87570fd48c5bb6e3ce1b1a3e55a40 + pristine_git_object: 89f1dcb0fc48d36c4580cadafa679c65e36cc76b docs/models/components/destinationhookdecktype.md: id: 20b93e4b32a3 last_write_checksum: sha1:ab3d845bedfc96d091498992ae82bcd6cfffea82 pristine_git_object: d72769fda77f452e8007b6da877a37180280a18b docs/models/components/destinationkafka.md: id: 2c87d51f8d4c - last_write_checksum: sha1:e9759df4199c99ee51537ea085bede2d8f54e130 - pristine_git_object: 9cf60c875256583cb20237465cd1cca4bf455660 + last_write_checksum: sha1:70f5874809824efee164dcb0929decde138a1a1d + pristine_git_object: 8faf22905bc9943fa824539a59cb393128305e61 docs/models/components/destinationkafkatype.md: id: 085501970a60 last_write_checksum: sha1:8ce1c6f563a6ce326594603e63e8336b353532f8 pristine_git_object: f9b0b6a919f34a02540e3d458f0c666dc29d9308 docs/models/components/destinationrabbitmq.md: id: 30c699fde40a - last_write_checksum: sha1:526c5b2f2c98ae7087a5e3d5306bb65f43a9dcd9 - pristine_git_object: 1b28823664d2fab36c3d93cdf0a481d611c5800d + last_write_checksum: sha1:88fd7e4351455f145274ecd1818adf41c3c46fdb + pristine_git_object: b4b833e453952d930fba4a76b47871f620c5a4db docs/models/components/destinationrabbitmqtype.md: id: 36f7e64c4fe6 last_write_checksum: sha1:a9dfc1e02b50445b35ecabab2959b9b18ecb4367 @@ -330,80 +330,80 @@ trackedFiles: pristine_git_object: 52c6589fb259bf449d607a4c0e70092de449e9d1 docs/models/components/destinationupdateawskinesis.md: id: e0a4842ef74c - last_write_checksum: sha1:a33b4d01f1afee3c2a713acb6b01565ff8ed5945 - pristine_git_object: 9699af9313ca72bc83b1f3a93dcaee188fdb4a66 + last_write_checksum: sha1:54957289eb22fcb7dcab17c75b64d441e3474513 + pristine_git_object: 06ef7553dd8ab7774e8b19a4640e20a8315b55d3 docs/models/components/destinationupdateawskinesistype.md: id: b950376a277c last_write_checksum: sha1:3a40b845ecffff83f424b58bc0349d9095f8cd0d pristine_git_object: d1c5388c97e7a3bee929d478007a3ec7f77ab966 docs/models/components/destinationupdateawss3.md: id: c250ff90df94 - last_write_checksum: sha1:13c1eb59de053c8e74bab368702d4dcf921f7118 - pristine_git_object: be5ec60fd1ab6026bdad94bf87faefb5390552d8 + last_write_checksum: sha1:eccd016dcff1efb95adef280298a69e405799d6d + pristine_git_object: a563ef41f18713eb4521bb9f3647fd0004961b2b docs/models/components/destinationupdateawss3type.md: id: e12ac4e5e869 last_write_checksum: sha1:c00d84e82cc700b16744e6892f720aed2465934e pristine_git_object: b92ee289dbc4851b63ff893484ad1c3965597b0b docs/models/components/destinationupdateawssqs.md: id: e2401ded4e44 - last_write_checksum: sha1:d2be2498efa6e00753db56ab8f36218fbac10a51 - pristine_git_object: 2fe94de104bbc1cb7cf4a26709d1b0111f934216 + last_write_checksum: sha1:81d833761834b78987acf5030dd7e69d655df79c + pristine_git_object: cad0c44e7c183c46e2608733b5a32d430201164b docs/models/components/destinationupdateawssqstype.md: id: 5cc2dc65e193 last_write_checksum: sha1:d8355ac4ab61cfb06d7267b8834fc9fc8f73dbeb pristine_git_object: 3328adc71892ee38dfdb36e119d226c0daa624b2 docs/models/components/destinationupdateazureservicebus.md: id: f230709db383 - last_write_checksum: sha1:ee076dd3ea4b3aa469cead07357420c523ef1460 - pristine_git_object: 125aac4e8ba1f86c1d6bf4df342443700fd32190 + last_write_checksum: sha1:a5242ec66fd7bd1bd5fdf8e0bcda045e5b98cc62 + pristine_git_object: 8487da067d8f6c86442740253322ee0c541b3f07 docs/models/components/destinationupdateazureservicebustype.md: id: 19c362ba1ced last_write_checksum: sha1:34d5a3f9a4322af44d8d16eae95f312242b8f8f1 pristine_git_object: 68e5914e0d60b4cc7b2c4a4be5767e133b5b2772 docs/models/components/destinationupdategcppubsub.md: id: dfb954a0431a - last_write_checksum: sha1:6b3f9b13b5d59af603630813d9ff9da7d5ad5572 - pristine_git_object: 4c5443d092bfde7975828d0018a298328ee78e58 + last_write_checksum: sha1:b7fb822cc0f525c9df3e6f6aba510253c5930df1 + pristine_git_object: ad4c3713d86f6d818abf17bcbf545c51ccc18bb3 docs/models/components/destinationupdategcppubsubtype.md: id: a095172171c7 last_write_checksum: sha1:968f650186995d3daab1ea06ac9f41f9624484b4 pristine_git_object: 307a428b2713172d770cafcc12f1762c27be6420 docs/models/components/destinationupdatehookdeck.md: id: 2d0fe3ebe94f - last_write_checksum: sha1:d8d46f37811fb917b097cb7cc1d6d68773ec3941 - pristine_git_object: 1e4b82b2891e5ecf813f620cac2adbcee583e961 + last_write_checksum: sha1:d774a75dddc91d53806a35bd89a142379a7d1f5c + pristine_git_object: 2ef157c20b70abc3b94218a5288fd507dd9bf133 docs/models/components/destinationupdatehookdecktype.md: id: a611289cdb0e last_write_checksum: sha1:97870de8f50423e6b3f2181bb7ddafcaccc88d7f pristine_git_object: dcb4cf55719ec5a4e714a7646baaa232a2789a69 docs/models/components/destinationupdatekafka.md: id: 10be812cf1c0 - last_write_checksum: sha1:51d725802868184a62bff1acb9382376bc31c1d2 - pristine_git_object: 978c8a78c02b4d90dec4f8fbf49d8a6df365a736 + last_write_checksum: sha1:2e9ee858e3f47871663e3a57aaa4d19a00c48d1e + pristine_git_object: fcf81970352f637f7d060aa3566e85933f5b8835 docs/models/components/destinationupdatekafkatype.md: id: 577718f3b8d0 last_write_checksum: sha1:d56c73c4f2de8bd9daf5bb2cdfe256811da48d0d pristine_git_object: 7aef17a3e134fec7ca61c0aef0f66dc00c4c17cd docs/models/components/destinationupdaterabbitmq.md: id: 75ae8e40dfd5 - last_write_checksum: sha1:d5ac7df3ec095cd9cea68713f2ff96153d26127a - pristine_git_object: 4c859623c47d6e6ab8881abc7504f419a5cd9b14 + last_write_checksum: sha1:606660301f90b6cc95c1581082731ccc14943f25 + pristine_git_object: 03620c5a3387469af352457db5c66363cfa4799c docs/models/components/destinationupdaterabbitmqtype.md: id: e7d99db9e418 last_write_checksum: sha1:58323c14c9f1fd64ecf8cc7146b193b2d58edeec pristine_git_object: a1807b457d8f49163eb31fa048372fe73b4e65b9 docs/models/components/destinationupdatewebhook.md: id: 86013f6d41fd - last_write_checksum: sha1:79d4cdf6b645c2294aaabade0c1a03e59ea7339b - pristine_git_object: 2e7257013e6a3fdab68eaa8c6bc5e5f27a762554 + last_write_checksum: sha1:42d10663053c09321cd471cd4e649a3c6f022170 + pristine_git_object: 6a6efeeaae13131beba0d234b6a19f9089032a7d docs/models/components/destinationupdatewebhooktype.md: id: d6c44fdc6bcf last_write_checksum: sha1:cbaf0cdcdafd54c19e9115acf0f4157f1234b698 pristine_git_object: 1124d415c33ab8f7582d6b0072f25f1ac9bde2d6 docs/models/components/destinationwebhook.md: id: 1b6ca867dbc9 - last_write_checksum: sha1:5dd9693db96dae3adf383dfd0a7185a511e96935 - pristine_git_object: 7bf9f5b5c46cd84c14a616dbf3bdd60620dca40d + last_write_checksum: sha1:8968f03a2d667125b72d66f868b1452ef9cd9537 + pristine_git_object: e350c8c2b97e9fe4e53c58ceb2f943bb0e51075a docs/models/components/destinationwebhooktype.md: id: 9af3df11d0a9 last_write_checksum: sha1:011daec8699debd918c086819320e74e8f7061f8 @@ -494,8 +494,8 @@ trackedFiles: pristine_git_object: d1141a02d60743c7339302652f66bb64c71fe2fc docs/models/components/managedconfig.md: id: f5084f1c1f7a - last_write_checksum: sha1:d75c5c0ca295d5557f9ad7531cb35d4df8ad58bb - pristine_git_object: 6acd2997d7a2a2d78ebb0677c81af2bc4c950d08 + last_write_checksum: sha1:96bb26b5ce4054f1764923cce6ec5af307694533 + pristine_git_object: a2684de0dfbed8350d3e21d4a50e48a67ff4a351 docs/models/components/metricsdatapoint.md: id: dfbc8ed48932 last_write_checksum: sha1:10e6085c6aa487c68ef15b853671fe15a530f311 @@ -562,8 +562,8 @@ trackedFiles: pristine_git_object: 634e6368385c203eacc61b1d31e40bf72b7dca0e docs/models/components/seekpagination.md: id: 72fb642d581e - last_write_checksum: sha1:f5e15f96c1171b5760cb04ac596a0d3a7a6c3a60 - pristine_git_object: 8c9ea95c926ea0505d9a9ceabd4a90bc032e0826 + last_write_checksum: sha1:1a621ffe41785fafab5c9727ae4fa6681dd1f76d + pristine_git_object: 63f22083cf369e3f4123556878ff49702f3a364d docs/models/components/setuplink.md: id: 0a5d61010a41 last_write_checksum: sha1:352088e7ae6371a58bb756c309d69c709f5978af @@ -1050,8 +1050,8 @@ trackedFiles: pristine_git_object: bcbe6cd80ded6c1d55e249bed50f26ab37ea3cb5 go.mod: id: c47645c391ad - last_write_checksum: sha1:79dd70b8063184ec2aedf2a926c867febdda9263 - pristine_git_object: 5dd9b9351841dfcd9fb261d2f83a2f1884fd0753 + last_write_checksum: sha1:68a67727206f999e3558a2dcf89ad01be3be299e + pristine_git_object: 50a35ad21da26e97d2ad84fd2c2a7e87681bbbb4 health.go: id: ca291aa88e47 last_write_checksum: sha1:d84401562999c3e4ccb36facaf3c388da185ce90 @@ -1082,8 +1082,8 @@ trackedFiles: pristine_git_object: d44fa066f74f2b6b1fbc13bb4c79a2b6b09ac174 internal/utils/json.go: id: ad03e3c502d8 - last_write_checksum: sha1:804b1db787f8914af263b5c09ea014d4ebc7d06b - pristine_git_object: 187b094dcafbe024fb9d8f17b1b4aca68340d5f7 + last_write_checksum: sha1:fc28baf22a291ddbd8f9f2ef458fd728a10e576a + pristine_git_object: 83d4a48e0b58b7fa7df1bcfcf5be957d1d4c11f6 internal/utils/pathparams.go: id: 1f3e0c30fd90 last_write_checksum: sha1:6f59c72b7d953a2507689b4beb0e4a83d1f6458d @@ -1414,8 +1414,8 @@ trackedFiles: pristine_git_object: 820239d134351f7b2189ee6f5b95c1619f05190a models/components/managedconfig.go: id: 183ca33f4b26 - last_write_checksum: sha1:b8d16ee3380394ecdc94d1b5825fd8e9e6199c64 - pristine_git_object: 4d9ea686f48fccd294b3722d07f4586e4dd854e2 + last_write_checksum: sha1:9a6d1fee0e1e88ce90f06c3812d46ff2d4624b9d + pristine_git_object: 77e50f234028c7078afcf71f2aabe8256f667de5 models/components/metricsdatapoint.go: id: 7a1d3a5a8a04 last_write_checksum: sha1:135b2e19a5a1053675cc62e1b718d985e8fb733e @@ -1642,12 +1642,12 @@ trackedFiles: pristine_git_object: e6e5a01c6e721e879e24a38a1f97e3e27d4686d4 outpost.go: id: 7aebc57e3f81 - last_write_checksum: sha1:95fbe1078067689ac8c27ffc7d6e4a191a7c59be - pristine_git_object: 80f42bb3dbb0a124ce9aa5c5203f1819400192b3 + last_write_checksum: sha1:75ee7b393ab3ee2f6205e91fd1b492879dac370c + pristine_git_object: 6846cd10dd566d6acc72af10185b3410776e2f98 retry/config.go: id: 82d673cb0389 - last_write_checksum: sha1:7f7d96b59a18e95bac847ae09c63bbd911ee8432 - pristine_git_object: 5b3dc7c122d8ab08905485342d7474f8f163888d + last_write_checksum: sha1:102d1953fbd7e9f312c4442c71ccca2eaaeaa27d + pristine_git_object: 767002c7898128324d8741ce9c534bd466492169 schemas.go: id: 5a2cc530e9a9 last_write_checksum: sha1:b43d2cf4a1db1289f71daac654fe8918bbc89457 @@ -2258,9 +2258,7 @@ examples: application/json: {} examplesVersion: 1.0.2 generatedTests: {} -releaseNotes: | - ## Go SDK Changes: - * `Outpost.Destinations.Update()`: `request.Body` **Changed** (Breaking ⚠️) +releaseNotes: "## Go SDK Changes:\n* `Outpost.Configuration.GetManagedConfig()`: `response` **Changed** (Breaking ⚠️)\n* `Outpost.Configuration.UpdateManagedConfig()`: \n * `request.Request` **Changed** (Breaking ⚠️)\n * `response` **Changed** (Breaking ⚠️)\n" generatedFiles: - .gitattributes - /models/apierrors/badrequesterror.go diff --git a/sdks/outpost-go/.speakeasy/gen.yaml b/sdks/outpost-go/.speakeasy/gen.yaml index be395d92..067ae03d 100644 --- a/sdks/outpost-go/.speakeasy/gen.yaml +++ b/sdks/outpost-go/.speakeasy/gen.yaml @@ -29,7 +29,7 @@ generation: generateNewTests: false skipResponseBodyAssertions: false go: - version: 1.4.0 + version: 1.4.1 additionalDependencies: {} allowUnknownFieldsInWeakUnions: false baseErrorName: OutpostError diff --git a/sdks/outpost-go/RELEASES.md b/sdks/outpost-go/RELEASES.md index ae8c2fef..a49e7496 100644 --- a/sdks/outpost-go/RELEASES.md +++ b/sdks/outpost-go/RELEASES.md @@ -208,4 +208,14 @@ Based on: ### Generated - [go v1.4.0] sdks/outpost-go ### Releases -- [Go v1.4.0] https://github.com/hookdeck/outpost/releases/tag/sdks/outpost-go/v1.4.0 - sdks/outpost-go \ No newline at end of file +- [Go v1.4.0] https://github.com/hookdeck/outpost/releases/tag/sdks/outpost-go/v1.4.0 - sdks/outpost-go + +## 2026-06-16 18:34:50 +### Changes +Based on: +- OpenAPI Doc +- Speakeasy CLI 1.780.0 (2.906.0) https://github.com/speakeasy-api/speakeasy +### Generated +- [go v1.4.1] sdks/outpost-go +### Releases +- [Go v1.4.1] https://github.com/hookdeck/outpost/releases/tag/sdks/outpost-go/v1.4.1 - sdks/outpost-go \ No newline at end of file diff --git a/sdks/outpost-go/docs/models/components/destinationawskinesis.md b/sdks/outpost-go/docs/models/components/destinationawskinesis.md index 819b9814..a35bcc42 100644 --- a/sdks/outpost-go/docs/models/components/destinationawskinesis.md +++ b/sdks/outpost-go/docs/models/components/destinationawskinesis.md @@ -9,7 +9,7 @@ | `Type` | [components.DestinationAWSKinesisType](../../models/components/destinationawskinesistype.md) | :heavy_check_mark: | Type of the destination. | aws_kinesis | | `Topics` | [components.Topics](../../models/components/topics.md) | :heavy_check_mark: | "*" or an array of enabled topics. | * | | `Filter` | optionalnullable.OptionalNullable[map[string]`any`] | :heavy_minus_sign: | Optional JSON schema filter for event matching. Events must match this filter to be delivered to this destination.
Supports operators: $eq, $neq, $gt, $gte, $lt, $lte, $in, $nin, $startsWith, $endsWith, $exist, $or, $and, $not.
If null or empty, all events matching the topic filter will be delivered.
Uses full-replacement semantics on update: send a new object to replace, null or `{}` to clear, omit for no change.
| {
"data": {
"amount": {
"$gte": 100
},
"customer": {
"tier": "premium"
}
}
} | -| `DisabledAt` | [*time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | ISO Date when the destination was disabled, or null if enabled. | | +| `DisabledAt` | [*time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | ISO Date when the destination was disabled, or null if enabled. | null | | `CreatedAt` | [time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | ISO Date when the destination was created. | 2024-01-01T00:00:00Z | | `UpdatedAt` | [time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | ISO Date when the destination was last updated. | 2024-01-01T00:00:00Z | | `Config` | [components.AWSKinesisConfig](../../models/components/awskinesisconfig.md) | :heavy_check_mark: | N/A | | diff --git a/sdks/outpost-go/docs/models/components/destinationawss3.md b/sdks/outpost-go/docs/models/components/destinationawss3.md index 10864b3c..3a75f4b4 100644 --- a/sdks/outpost-go/docs/models/components/destinationawss3.md +++ b/sdks/outpost-go/docs/models/components/destinationawss3.md @@ -9,7 +9,7 @@ | `Type` | [components.DestinationAwss3Type](../../models/components/destinationawss3type.md) | :heavy_check_mark: | Type of the destination. | aws_s3 | | `Topics` | [components.Topics](../../models/components/topics.md) | :heavy_check_mark: | "*" or an array of enabled topics. | * | | `Filter` | optionalnullable.OptionalNullable[map[string]`any`] | :heavy_minus_sign: | Optional JSON schema filter for event matching. Events must match this filter to be delivered to this destination.
Supports operators: $eq, $neq, $gt, $gte, $lt, $lte, $in, $nin, $startsWith, $endsWith, $exist, $or, $and, $not.
If null or empty, all events matching the topic filter will be delivered.
Uses full-replacement semantics on update: send a new object to replace, null or `{}` to clear, omit for no change.
| {
"data": {
"amount": {
"$gte": 100
},
"customer": {
"tier": "premium"
}
}
} | -| `DisabledAt` | [*time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | ISO Date when the destination was disabled, or null if enabled. | | +| `DisabledAt` | [*time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | ISO Date when the destination was disabled, or null if enabled. | null | | `CreatedAt` | [time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | ISO Date when the destination was created. | 2024-01-01T00:00:00Z | | `UpdatedAt` | [time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | ISO Date when the destination was last updated. | 2024-01-01T00:00:00Z | | `Config` | [components.Awss3Config](../../models/components/awss3config.md) | :heavy_check_mark: | N/A | | @@ -17,4 +17,4 @@ | `DeliveryMetadata` | optionalnullable.OptionalNullable[map[string]`string`] | :heavy_minus_sign: | Static key-value pairs merged into event metadata on every attempt. | {
"app-id": "my-app",
"region": "us-east-1"
} | | `Metadata` | optionalnullable.OptionalNullable[map[string]`string`] | :heavy_minus_sign: | Arbitrary contextual information stored with the destination. | {
"internal-id": "123",
"team": "platform"
} | | `Target` | `*string` | :heavy_minus_sign: | A human-readable representation of the destination target (bucket and region). Read-only. | my-bucket in us-east-1 | -| `TargetURL` | optionalnullable.OptionalNullable[`string`] | :heavy_minus_sign: | A URL link to the destination target (AWS Console link to the bucket). Read-only. | | \ No newline at end of file +| `TargetURL` | optionalnullable.OptionalNullable[`string`] | :heavy_minus_sign: | A URL link to the destination target (AWS Console link to the bucket). Read-only. | null | \ No newline at end of file diff --git a/sdks/outpost-go/docs/models/components/destinationawssqs.md b/sdks/outpost-go/docs/models/components/destinationawssqs.md index 5dbfb35a..7c00cca4 100644 --- a/sdks/outpost-go/docs/models/components/destinationawssqs.md +++ b/sdks/outpost-go/docs/models/components/destinationawssqs.md @@ -9,7 +9,7 @@ | `Type` | [components.DestinationAWSSQSType](../../models/components/destinationawssqstype.md) | :heavy_check_mark: | Type of the destination. | aws_sqs | | `Topics` | [components.Topics](../../models/components/topics.md) | :heavy_check_mark: | "*" or an array of enabled topics. | * | | `Filter` | optionalnullable.OptionalNullable[map[string]`any`] | :heavy_minus_sign: | Optional JSON schema filter for event matching. Events must match this filter to be delivered to this destination.
Supports operators: $eq, $neq, $gt, $gte, $lt, $lte, $in, $nin, $startsWith, $endsWith, $exist, $or, $and, $not.
If null or empty, all events matching the topic filter will be delivered.
Uses full-replacement semantics on update: send a new object to replace, null or `{}` to clear, omit for no change.
| {
"data": {
"amount": {
"$gte": 100
},
"customer": {
"tier": "premium"
}
}
} | -| `DisabledAt` | [*time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | ISO Date when the destination was disabled, or null if enabled. | | +| `DisabledAt` | [*time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | ISO Date when the destination was disabled, or null if enabled. | null | | `CreatedAt` | [time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | ISO Date when the destination was created. | 2024-01-01T00:00:00Z | | `UpdatedAt` | [time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | ISO Date when the destination was last updated. | 2024-01-01T00:00:00Z | | `Config` | [components.AWSSQSConfig](../../models/components/awssqsconfig.md) | :heavy_check_mark: | N/A | | diff --git a/sdks/outpost-go/docs/models/components/destinationazureservicebus.md b/sdks/outpost-go/docs/models/components/destinationazureservicebus.md index dabd1fd9..f2bc3b1e 100644 --- a/sdks/outpost-go/docs/models/components/destinationazureservicebus.md +++ b/sdks/outpost-go/docs/models/components/destinationazureservicebus.md @@ -9,7 +9,7 @@ | `Type` | [components.DestinationAzureServiceBusType](../../models/components/destinationazureservicebustype.md) | :heavy_check_mark: | Type of the destination. | azure_servicebus | | `Topics` | [components.Topics](../../models/components/topics.md) | :heavy_check_mark: | "*" or an array of enabled topics. | * | | `Filter` | optionalnullable.OptionalNullable[map[string]`any`] | :heavy_minus_sign: | Optional JSON schema filter for event matching. Events must match this filter to be delivered to this destination.
Supports operators: $eq, $neq, $gt, $gte, $lt, $lte, $in, $nin, $startsWith, $endsWith, $exist, $or, $and, $not.
If null or empty, all events matching the topic filter will be delivered.
Uses full-replacement semantics on update: send a new object to replace, null or `{}` to clear, omit for no change.
| {
"data": {
"amount": {
"$gte": 100
},
"customer": {
"tier": "premium"
}
}
} | -| `DisabledAt` | [*time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | ISO Date when the destination was disabled, or null if enabled. | | +| `DisabledAt` | [*time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | ISO Date when the destination was disabled, or null if enabled. | null | | `CreatedAt` | [time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | ISO Date when the destination was created. | 2024-01-01T00:00:00Z | | `UpdatedAt` | [*time.Time](https://pkg.go.dev/time#Time) | :heavy_minus_sign: | ISO Date when the destination was last updated. | 2024-01-01T00:00:00Z | | `Config` | [components.AzureServiceBusConfig](../../models/components/azureservicebusconfig.md) | :heavy_check_mark: | N/A | | diff --git a/sdks/outpost-go/docs/models/components/destinationcreateawskinesis.md b/sdks/outpost-go/docs/models/components/destinationcreateawskinesis.md index 663c1363..80106b0c 100644 --- a/sdks/outpost-go/docs/models/components/destinationcreateawskinesis.md +++ b/sdks/outpost-go/docs/models/components/destinationcreateawskinesis.md @@ -15,4 +15,4 @@ | `Metadata` | optionalnullable.OptionalNullable[map[string]`string`] | :heavy_minus_sign: | Arbitrary contextual information stored with the destination. | {
"internal-id": "123",
"team": "platform"
} | | `CreatedAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | Optional override for the creation timestamp. Intended for importing destinations from another system. Must not be in the future. **Admin (API key) auth only — sending this with JWT auth returns 403.** Defaults to the current time when omitted. | 2024-02-15T10:00:00Z | | `UpdatedAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | Optional override for the last-updated timestamp. Intended for importing destinations. Must not be in the future. **Admin (API key) auth only — sending this with JWT auth returns 403.** Defaults to created_at when omitted. | 2024-02-15T10:00:00Z | -| `DisabledAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | If set, the destination is created in a disabled state with this timestamp. Must not be in the future. Defaults to null (enabled). | | \ No newline at end of file +| `DisabledAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | If set, the destination is created in a disabled state with this timestamp. Must not be in the future. Defaults to null (enabled). | null | \ No newline at end of file diff --git a/sdks/outpost-go/docs/models/components/destinationcreateawss3.md b/sdks/outpost-go/docs/models/components/destinationcreateawss3.md index 13f58791..439d97ac 100644 --- a/sdks/outpost-go/docs/models/components/destinationcreateawss3.md +++ b/sdks/outpost-go/docs/models/components/destinationcreateawss3.md @@ -15,4 +15,4 @@ | `Metadata` | optionalnullable.OptionalNullable[map[string]`string`] | :heavy_minus_sign: | Arbitrary contextual information stored with the destination. | {
"internal-id": "123",
"team": "platform"
} | | `CreatedAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | Optional override for the creation timestamp. Intended for importing destinations from another system. Must not be in the future. **Admin (API key) auth only — sending this with JWT auth returns 403.** Defaults to the current time when omitted. | 2024-02-15T10:00:00Z | | `UpdatedAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | Optional override for the last-updated timestamp. Intended for importing destinations. Must not be in the future. **Admin (API key) auth only — sending this with JWT auth returns 403.** Defaults to created_at when omitted. | 2024-02-15T10:00:00Z | -| `DisabledAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | If set, the destination is created in a disabled state with this timestamp. Must not be in the future. Defaults to null (enabled). | | \ No newline at end of file +| `DisabledAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | If set, the destination is created in a disabled state with this timestamp. Must not be in the future. Defaults to null (enabled). | null | \ No newline at end of file diff --git a/sdks/outpost-go/docs/models/components/destinationcreateawssqs.md b/sdks/outpost-go/docs/models/components/destinationcreateawssqs.md index 89dec8c8..66faa016 100644 --- a/sdks/outpost-go/docs/models/components/destinationcreateawssqs.md +++ b/sdks/outpost-go/docs/models/components/destinationcreateawssqs.md @@ -15,4 +15,4 @@ | `Metadata` | optionalnullable.OptionalNullable[map[string]`string`] | :heavy_minus_sign: | Arbitrary contextual information stored with the destination. | {
"internal-id": "123",
"team": "platform"
} | | `CreatedAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | Optional override for the creation timestamp. Intended for importing destinations from another system. Must not be in the future. **Admin (API key) auth only — sending this with JWT auth returns 403.** Defaults to the current time when omitted. | 2024-02-15T10:00:00Z | | `UpdatedAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | Optional override for the last-updated timestamp. Intended for importing destinations. Must not be in the future. **Admin (API key) auth only — sending this with JWT auth returns 403.** Defaults to created_at when omitted. | 2024-02-15T10:00:00Z | -| `DisabledAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | If set, the destination is created in a disabled state with this timestamp. Must not be in the future. Defaults to null (enabled). | | \ No newline at end of file +| `DisabledAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | If set, the destination is created in a disabled state with this timestamp. Must not be in the future. Defaults to null (enabled). | null | \ No newline at end of file diff --git a/sdks/outpost-go/docs/models/components/destinationcreateazureservicebus.md b/sdks/outpost-go/docs/models/components/destinationcreateazureservicebus.md index 2272715f..e6350d9a 100644 --- a/sdks/outpost-go/docs/models/components/destinationcreateazureservicebus.md +++ b/sdks/outpost-go/docs/models/components/destinationcreateazureservicebus.md @@ -15,4 +15,4 @@ | `Metadata` | optionalnullable.OptionalNullable[map[string]`string`] | :heavy_minus_sign: | Arbitrary contextual information stored with the destination. | {
"internal-id": "123",
"team": "platform"
} | | `CreatedAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | Optional override for the creation timestamp. Intended for importing destinations from another system. Must not be in the future. **Admin (API key) auth only — sending this with JWT auth returns 403.** Defaults to the current time when omitted. | 2024-02-15T10:00:00Z | | `UpdatedAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | Optional override for the last-updated timestamp. Intended for importing destinations. Must not be in the future. **Admin (API key) auth only — sending this with JWT auth returns 403.** Defaults to created_at when omitted. | 2024-02-15T10:00:00Z | -| `DisabledAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | If set, the destination is created in a disabled state with this timestamp. Must not be in the future. Defaults to null (enabled). | | \ No newline at end of file +| `DisabledAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | If set, the destination is created in a disabled state with this timestamp. Must not be in the future. Defaults to null (enabled). | null | \ No newline at end of file diff --git a/sdks/outpost-go/docs/models/components/destinationcreategcppubsub.md b/sdks/outpost-go/docs/models/components/destinationcreategcppubsub.md index 00928462..397fc131 100644 --- a/sdks/outpost-go/docs/models/components/destinationcreategcppubsub.md +++ b/sdks/outpost-go/docs/models/components/destinationcreategcppubsub.md @@ -15,4 +15,4 @@ | `Metadata` | optionalnullable.OptionalNullable[map[string]`string`] | :heavy_minus_sign: | Arbitrary contextual information stored with the destination. | {
"internal-id": "123",
"team": "platform"
} | | `CreatedAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | Optional override for the creation timestamp. Intended for importing destinations from another system. Must not be in the future. **Admin (API key) auth only — sending this with JWT auth returns 403.** Defaults to the current time when omitted. | 2024-02-15T10:00:00Z | | `UpdatedAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | Optional override for the last-updated timestamp. Intended for importing destinations. Must not be in the future. **Admin (API key) auth only — sending this with JWT auth returns 403.** Defaults to created_at when omitted. | 2024-02-15T10:00:00Z | -| `DisabledAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | If set, the destination is created in a disabled state with this timestamp. Must not be in the future. Defaults to null (enabled). | | \ No newline at end of file +| `DisabledAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | If set, the destination is created in a disabled state with this timestamp. Must not be in the future. Defaults to null (enabled). | null | \ No newline at end of file diff --git a/sdks/outpost-go/docs/models/components/destinationcreatehookdeck.md b/sdks/outpost-go/docs/models/components/destinationcreatehookdeck.md index 28ef2cdf..cb7c0426 100644 --- a/sdks/outpost-go/docs/models/components/destinationcreatehookdeck.md +++ b/sdks/outpost-go/docs/models/components/destinationcreatehookdeck.md @@ -15,4 +15,4 @@ | `Metadata` | optionalnullable.OptionalNullable[map[string]`string`] | :heavy_minus_sign: | Arbitrary contextual information stored with the destination. | {
"internal-id": "123",
"team": "platform"
} | | `CreatedAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | Optional override for the creation timestamp. Intended for importing destinations from another system. Must not be in the future. **Admin (API key) auth only — sending this with JWT auth returns 403.** Defaults to the current time when omitted. | 2024-02-15T10:00:00Z | | `UpdatedAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | Optional override for the last-updated timestamp. Intended for importing destinations. Must not be in the future. **Admin (API key) auth only — sending this with JWT auth returns 403.** Defaults to created_at when omitted. | 2024-02-15T10:00:00Z | -| `DisabledAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | If set, the destination is created in a disabled state with this timestamp. Must not be in the future. Defaults to null (enabled). | | \ No newline at end of file +| `DisabledAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | If set, the destination is created in a disabled state with this timestamp. Must not be in the future. Defaults to null (enabled). | null | \ No newline at end of file diff --git a/sdks/outpost-go/docs/models/components/destinationcreatekafka.md b/sdks/outpost-go/docs/models/components/destinationcreatekafka.md index cb567538..83413354 100644 --- a/sdks/outpost-go/docs/models/components/destinationcreatekafka.md +++ b/sdks/outpost-go/docs/models/components/destinationcreatekafka.md @@ -15,4 +15,4 @@ | `Metadata` | optionalnullable.OptionalNullable[map[string]`string`] | :heavy_minus_sign: | Arbitrary contextual information stored with the destination. | {
"internal-id": "123",
"team": "platform"
} | | `CreatedAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | Optional override for the creation timestamp. Intended for importing destinations from another system. Must not be in the future. **Admin (API key) auth only — sending this with JWT auth returns 403.** Defaults to the current time when omitted. | 2024-02-15T10:00:00Z | | `UpdatedAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | Optional override for the last-updated timestamp. Intended for importing destinations. Must not be in the future. **Admin (API key) auth only — sending this with JWT auth returns 403.** Defaults to created_at when omitted. | 2024-02-15T10:00:00Z | -| `DisabledAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | If set, the destination is created in a disabled state with this timestamp. Must not be in the future. Defaults to null (enabled). | | \ No newline at end of file +| `DisabledAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | If set, the destination is created in a disabled state with this timestamp. Must not be in the future. Defaults to null (enabled). | null | \ No newline at end of file diff --git a/sdks/outpost-go/docs/models/components/destinationcreaterabbitmq.md b/sdks/outpost-go/docs/models/components/destinationcreaterabbitmq.md index 33160272..d03c4c70 100644 --- a/sdks/outpost-go/docs/models/components/destinationcreaterabbitmq.md +++ b/sdks/outpost-go/docs/models/components/destinationcreaterabbitmq.md @@ -15,4 +15,4 @@ | `Metadata` | optionalnullable.OptionalNullable[map[string]`string`] | :heavy_minus_sign: | Arbitrary contextual information stored with the destination. | {
"internal-id": "123",
"team": "platform"
} | | `CreatedAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | Optional override for the creation timestamp. Intended for importing destinations from another system. Must not be in the future. **Admin (API key) auth only — sending this with JWT auth returns 403.** Defaults to the current time when omitted. | 2024-02-15T10:00:00Z | | `UpdatedAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | Optional override for the last-updated timestamp. Intended for importing destinations. Must not be in the future. **Admin (API key) auth only — sending this with JWT auth returns 403.** Defaults to created_at when omitted. | 2024-02-15T10:00:00Z | -| `DisabledAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | If set, the destination is created in a disabled state with this timestamp. Must not be in the future. Defaults to null (enabled). | | \ No newline at end of file +| `DisabledAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | If set, the destination is created in a disabled state with this timestamp. Must not be in the future. Defaults to null (enabled). | null | \ No newline at end of file diff --git a/sdks/outpost-go/docs/models/components/destinationcreatewebhook.md b/sdks/outpost-go/docs/models/components/destinationcreatewebhook.md index b6f782c0..34d26398 100644 --- a/sdks/outpost-go/docs/models/components/destinationcreatewebhook.md +++ b/sdks/outpost-go/docs/models/components/destinationcreatewebhook.md @@ -15,4 +15,4 @@ | `Metadata` | optionalnullable.OptionalNullable[map[string]`string`] | :heavy_minus_sign: | Arbitrary contextual information stored with the destination. | {
"internal-id": "123",
"team": "platform"
} | | `CreatedAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | Optional override for the creation timestamp. Intended for importing destinations from another system. Must not be in the future. **Admin (API key) auth only — sending this with JWT auth returns 403.** Defaults to the current time when omitted. | 2024-02-15T10:00:00Z | | `UpdatedAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | Optional override for the last-updated timestamp. Intended for importing destinations. Must not be in the future. **Admin (API key) auth only — sending this with JWT auth returns 403.** Defaults to created_at when omitted. | 2024-02-15T10:00:00Z | -| `DisabledAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | If set, the destination is created in a disabled state with this timestamp. Must not be in the future. Defaults to null (enabled). | | \ No newline at end of file +| `DisabledAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | If set, the destination is created in a disabled state with this timestamp. Must not be in the future. Defaults to null (enabled). | null | \ No newline at end of file diff --git a/sdks/outpost-go/docs/models/components/destinationgcppubsub.md b/sdks/outpost-go/docs/models/components/destinationgcppubsub.md index 08637263..7cadf6af 100644 --- a/sdks/outpost-go/docs/models/components/destinationgcppubsub.md +++ b/sdks/outpost-go/docs/models/components/destinationgcppubsub.md @@ -9,7 +9,7 @@ | `Type` | [components.DestinationGCPPubSubType](../../models/components/destinationgcppubsubtype.md) | :heavy_check_mark: | Type of the destination. | gcp_pubsub | | `Topics` | [components.Topics](../../models/components/topics.md) | :heavy_check_mark: | "*" or an array of enabled topics. | * | | `Filter` | optionalnullable.OptionalNullable[map[string]`any`] | :heavy_minus_sign: | Optional JSON schema filter for event matching. Events must match this filter to be delivered to this destination.
Supports operators: $eq, $neq, $gt, $gte, $lt, $lte, $in, $nin, $startsWith, $endsWith, $exist, $or, $and, $not.
If null or empty, all events matching the topic filter will be delivered.
Uses full-replacement semantics on update: send a new object to replace, null or `{}` to clear, omit for no change.
| {
"data": {
"amount": {
"$gte": 100
},
"customer": {
"tier": "premium"
}
}
} | -| `DisabledAt` | [*time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | ISO Date when the destination was disabled, or null if enabled. | | +| `DisabledAt` | [*time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | ISO Date when the destination was disabled, or null if enabled. | null | | `CreatedAt` | [time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | ISO Date when the destination was created. | 2024-01-01T00:00:00Z | | `UpdatedAt` | [time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | ISO Date when the destination was last updated. | 2024-01-01T00:00:00Z | | `Config` | [components.GCPPubSubConfig](../../models/components/gcppubsubconfig.md) | :heavy_check_mark: | N/A | | diff --git a/sdks/outpost-go/docs/models/components/destinationhookdeck.md b/sdks/outpost-go/docs/models/components/destinationhookdeck.md index 4aa80340..89f1dcb0 100644 --- a/sdks/outpost-go/docs/models/components/destinationhookdeck.md +++ b/sdks/outpost-go/docs/models/components/destinationhookdeck.md @@ -9,7 +9,7 @@ | `Type` | [components.DestinationHookdeckType](../../models/components/destinationhookdecktype.md) | :heavy_check_mark: | Type of the destination. | hookdeck | | `Topics` | [components.Topics](../../models/components/topics.md) | :heavy_check_mark: | "*" or an array of enabled topics. | * | | `Filter` | optionalnullable.OptionalNullable[map[string]`any`] | :heavy_minus_sign: | Optional JSON schema filter for event matching. Events must match this filter to be delivered to this destination.
Supports operators: $eq, $neq, $gt, $gte, $lt, $lte, $in, $nin, $startsWith, $endsWith, $exist, $or, $and, $not.
If null or empty, all events matching the topic filter will be delivered.
Uses full-replacement semantics on update: send a new object to replace, null or `{}` to clear, omit for no change.
| {
"data": {
"amount": {
"$gte": 100
},
"customer": {
"tier": "premium"
}
}
} | -| `DisabledAt` | [*time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | ISO Date when the destination was disabled, or null if enabled. | | +| `DisabledAt` | [*time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | ISO Date when the destination was disabled, or null if enabled. | null | | `CreatedAt` | [time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | ISO Date when the destination was created. | 2024-01-01T00:00:00Z | | `UpdatedAt` | [*time.Time](https://pkg.go.dev/time#Time) | :heavy_minus_sign: | ISO Date when the destination was last updated. | 2024-01-01T00:00:00Z | | `Config` | `any` | :heavy_minus_sign: | N/A | | diff --git a/sdks/outpost-go/docs/models/components/destinationkafka.md b/sdks/outpost-go/docs/models/components/destinationkafka.md index 9cf60c87..8faf2290 100644 --- a/sdks/outpost-go/docs/models/components/destinationkafka.md +++ b/sdks/outpost-go/docs/models/components/destinationkafka.md @@ -9,7 +9,7 @@ | `Type` | [components.DestinationKafkaType](../../models/components/destinationkafkatype.md) | :heavy_check_mark: | Type of the destination. | kafka | | `Topics` | [components.Topics](../../models/components/topics.md) | :heavy_check_mark: | "*" or an array of enabled topics. | * | | `Filter` | optionalnullable.OptionalNullable[map[string]`any`] | :heavy_minus_sign: | Optional JSON schema filter for event matching. Events must match this filter to be delivered to this destination.
Supports operators: $eq, $neq, $gt, $gte, $lt, $lte, $in, $nin, $startsWith, $endsWith, $exist, $or, $and, $not.
If null or empty, all events matching the topic filter will be delivered.
Uses full-replacement semantics on update: send a new object to replace, null or `{}` to clear, omit for no change.
| {
"data": {
"amount": {
"$gte": 100
},
"customer": {
"tier": "premium"
}
}
} | -| `DisabledAt` | [*time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | ISO Date when the destination was disabled, or null if enabled. | | +| `DisabledAt` | [*time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | ISO Date when the destination was disabled, or null if enabled. | null | | `CreatedAt` | [time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | ISO Date when the destination was created. | 2024-01-01T00:00:00Z | | `UpdatedAt` | [time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | ISO Date when the destination was last updated. | 2024-01-01T00:00:00Z | | `Config` | [components.KafkaConfig](../../models/components/kafkaconfig.md) | :heavy_check_mark: | N/A | | @@ -17,4 +17,4 @@ | `DeliveryMetadata` | optionalnullable.OptionalNullable[map[string]`string`] | :heavy_minus_sign: | Static key-value pairs merged into event metadata on every attempt. | {
"app-id": "my-app",
"region": "us-east-1"
} | | `Metadata` | optionalnullable.OptionalNullable[map[string]`string`] | :heavy_minus_sign: | Arbitrary contextual information stored with the destination. | {
"internal-id": "123",
"team": "platform"
} | | `Target` | `*string` | :heavy_minus_sign: | A human-readable representation of the destination target (broker and topic). Read-only. | broker1.example.com:9092 / events | -| `TargetURL` | optionalnullable.OptionalNullable[`string`] | :heavy_minus_sign: | A URL link to the destination target. Read-only. | | \ No newline at end of file +| `TargetURL` | optionalnullable.OptionalNullable[`string`] | :heavy_minus_sign: | A URL link to the destination target. Read-only. | null | \ No newline at end of file diff --git a/sdks/outpost-go/docs/models/components/destinationrabbitmq.md b/sdks/outpost-go/docs/models/components/destinationrabbitmq.md index 1b288236..b4b833e4 100644 --- a/sdks/outpost-go/docs/models/components/destinationrabbitmq.md +++ b/sdks/outpost-go/docs/models/components/destinationrabbitmq.md @@ -9,7 +9,7 @@ | `Type` | [components.DestinationRabbitMQType](../../models/components/destinationrabbitmqtype.md) | :heavy_check_mark: | Type of the destination. | rabbitmq | | `Topics` | [components.Topics](../../models/components/topics.md) | :heavy_check_mark: | "*" or an array of enabled topics. | * | | `Filter` | optionalnullable.OptionalNullable[map[string]`any`] | :heavy_minus_sign: | Optional JSON schema filter for event matching. Events must match this filter to be delivered to this destination.
Supports operators: $eq, $neq, $gt, $gte, $lt, $lte, $in, $nin, $startsWith, $endsWith, $exist, $or, $and, $not.
If null or empty, all events matching the topic filter will be delivered.
Uses full-replacement semantics on update: send a new object to replace, null or `{}` to clear, omit for no change.
| {
"data": {
"amount": {
"$gte": 100
},
"customer": {
"tier": "premium"
}
}
} | -| `DisabledAt` | [*time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | ISO Date when the destination was disabled, or null if enabled. | | +| `DisabledAt` | [*time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | ISO Date when the destination was disabled, or null if enabled. | null | | `CreatedAt` | [time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | ISO Date when the destination was created. | 2024-01-01T00:00:00Z | | `UpdatedAt` | [time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | ISO Date when the destination was last updated. | 2024-01-01T00:00:00Z | | `Config` | [components.RabbitMQConfig](../../models/components/rabbitmqconfig.md) | :heavy_check_mark: | N/A | | @@ -17,4 +17,4 @@ | `DeliveryMetadata` | optionalnullable.OptionalNullable[map[string]`string`] | :heavy_minus_sign: | Static key-value pairs merged into event metadata on every attempt. | {
"app-id": "my-app",
"region": "us-east-1"
} | | `Metadata` | optionalnullable.OptionalNullable[map[string]`string`] | :heavy_minus_sign: | Arbitrary contextual information stored with the destination. | {
"internal-id": "123",
"team": "platform"
} | | `Target` | `*string` | :heavy_minus_sign: | A human-readable representation of the destination target (RabbitMQ exchange). Read-only. | events-exchange | -| `TargetURL` | optionalnullable.OptionalNullable[`string`] | :heavy_minus_sign: | A URL link to the destination target (not applicable for RabbitMQ exchange). Read-only. | | \ No newline at end of file +| `TargetURL` | optionalnullable.OptionalNullable[`string`] | :heavy_minus_sign: | A URL link to the destination target (not applicable for RabbitMQ exchange). Read-only. | null | \ No newline at end of file diff --git a/sdks/outpost-go/docs/models/components/destinationupdateawskinesis.md b/sdks/outpost-go/docs/models/components/destinationupdateawskinesis.md index 9699af93..06ef7553 100644 --- a/sdks/outpost-go/docs/models/components/destinationupdateawskinesis.md +++ b/sdks/outpost-go/docs/models/components/destinationupdateawskinesis.md @@ -12,4 +12,4 @@ | `Credentials` | [*components.AWSKinesisCredentialsUpdate](../../models/components/awskinesiscredentialsupdate.md) | :heavy_minus_sign: | Partial AWS Kinesis credentials for PATCH updates (RFC 7396 merge-patch). | | | `DeliveryMetadata` | optionalnullable.OptionalNullable[map[string]`*string`] | :heavy_minus_sign: | Static key-value pairs merged into event metadata on every attempt. Uses JSON merge-patch semantics (RFC 7396): send keys to add/update, null values to delete keys, null for entire field to clear all. Omit or send {} for no change. | {
"app-id": "my-app",
"region": "us-east-1"
} | | `Metadata` | optionalnullable.OptionalNullable[map[string]`*string`] | :heavy_minus_sign: | Arbitrary contextual information stored with the destination. Uses JSON merge-patch semantics (RFC 7396): send keys to add/update, null values to delete keys, null for entire field to clear all. Omit or send {} for no change. | {
"internal-id": "123",
"team": "platform"
} | -| `DisabledAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | Update the disabled state of the destination. Send a timestamp (must not be in the future) to disable, null to enable, or omit to leave unchanged. | | \ No newline at end of file +| `DisabledAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | Update the disabled state of the destination. Send a timestamp (must not be in the future) to disable, null to enable, or omit to leave unchanged. | null | \ No newline at end of file diff --git a/sdks/outpost-go/docs/models/components/destinationupdateawss3.md b/sdks/outpost-go/docs/models/components/destinationupdateawss3.md index be5ec60f..a563ef41 100644 --- a/sdks/outpost-go/docs/models/components/destinationupdateawss3.md +++ b/sdks/outpost-go/docs/models/components/destinationupdateawss3.md @@ -12,4 +12,4 @@ | `Credentials` | [*components.Awss3CredentialsUpdate](../../models/components/awss3credentialsupdate.md) | :heavy_minus_sign: | Partial AWS S3 credentials for PATCH updates (RFC 7396 merge-patch). | | | `DeliveryMetadata` | optionalnullable.OptionalNullable[map[string]`*string`] | :heavy_minus_sign: | Static key-value pairs merged into event metadata on every attempt. Uses JSON merge-patch semantics (RFC 7396): send keys to add/update, null values to delete keys, null for entire field to clear all. Omit or send {} for no change. | {
"app-id": "my-app",
"region": "us-east-1"
} | | `Metadata` | optionalnullable.OptionalNullable[map[string]`*string`] | :heavy_minus_sign: | Arbitrary contextual information stored with the destination. Uses JSON merge-patch semantics (RFC 7396): send keys to add/update, null values to delete keys, null for entire field to clear all. Omit or send {} for no change. | {
"internal-id": "123",
"team": "platform"
} | -| `DisabledAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | Update the disabled state of the destination. Send a timestamp (must not be in the future) to disable, null to enable, or omit to leave unchanged. | | \ No newline at end of file +| `DisabledAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | Update the disabled state of the destination. Send a timestamp (must not be in the future) to disable, null to enable, or omit to leave unchanged. | null | \ No newline at end of file diff --git a/sdks/outpost-go/docs/models/components/destinationupdateawssqs.md b/sdks/outpost-go/docs/models/components/destinationupdateawssqs.md index 2fe94de1..cad0c44e 100644 --- a/sdks/outpost-go/docs/models/components/destinationupdateawssqs.md +++ b/sdks/outpost-go/docs/models/components/destinationupdateawssqs.md @@ -12,4 +12,4 @@ | `Credentials` | [*components.AWSSQSCredentialsUpdate](../../models/components/awssqscredentialsupdate.md) | :heavy_minus_sign: | Partial AWS SQS credentials for PATCH updates (RFC 7396 merge-patch). | | | `DeliveryMetadata` | optionalnullable.OptionalNullable[map[string]`*string`] | :heavy_minus_sign: | Static key-value pairs merged into event metadata on every attempt. Uses JSON merge-patch semantics (RFC 7396): send keys to add/update, null values to delete keys, null for entire field to clear all. Omit or send {} for no change. | {
"app-id": "my-app",
"region": "us-east-1"
} | | `Metadata` | optionalnullable.OptionalNullable[map[string]`*string`] | :heavy_minus_sign: | Arbitrary contextual information stored with the destination. Uses JSON merge-patch semantics (RFC 7396): send keys to add/update, null values to delete keys, null for entire field to clear all. Omit or send {} for no change. | {
"internal-id": "123",
"team": "platform"
} | -| `DisabledAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | Update the disabled state of the destination. Send a timestamp (must not be in the future) to disable, null to enable, or omit to leave unchanged. | | \ No newline at end of file +| `DisabledAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | Update the disabled state of the destination. Send a timestamp (must not be in the future) to disable, null to enable, or omit to leave unchanged. | null | \ No newline at end of file diff --git a/sdks/outpost-go/docs/models/components/destinationupdateazureservicebus.md b/sdks/outpost-go/docs/models/components/destinationupdateazureservicebus.md index 125aac4e..8487da06 100644 --- a/sdks/outpost-go/docs/models/components/destinationupdateazureservicebus.md +++ b/sdks/outpost-go/docs/models/components/destinationupdateazureservicebus.md @@ -12,4 +12,4 @@ | `Credentials` | [*components.AzureServiceBusCredentialsUpdate](../../models/components/azureservicebuscredentialsupdate.md) | :heavy_minus_sign: | Partial Azure Service Bus credentials for PATCH updates (RFC 7396 merge-patch). | | | `DeliveryMetadata` | optionalnullable.OptionalNullable[map[string]`*string`] | :heavy_minus_sign: | Static key-value pairs merged into event metadata on every attempt. Uses JSON merge-patch semantics (RFC 7396): send keys to add/update, null values to delete keys, null for entire field to clear all. Omit or send {} for no change. | {
"app-id": "my-app",
"region": "us-east-1"
} | | `Metadata` | optionalnullable.OptionalNullable[map[string]`*string`] | :heavy_minus_sign: | Arbitrary contextual information stored with the destination. Uses JSON merge-patch semantics (RFC 7396): send keys to add/update, null values to delete keys, null for entire field to clear all. Omit or send {} for no change. | {
"internal-id": "123",
"team": "platform"
} | -| `DisabledAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | Update the disabled state of the destination. Send a timestamp (must not be in the future) to disable, null to enable, or omit to leave unchanged. | | \ No newline at end of file +| `DisabledAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | Update the disabled state of the destination. Send a timestamp (must not be in the future) to disable, null to enable, or omit to leave unchanged. | null | \ No newline at end of file diff --git a/sdks/outpost-go/docs/models/components/destinationupdategcppubsub.md b/sdks/outpost-go/docs/models/components/destinationupdategcppubsub.md index 4c5443d0..ad4c3713 100644 --- a/sdks/outpost-go/docs/models/components/destinationupdategcppubsub.md +++ b/sdks/outpost-go/docs/models/components/destinationupdategcppubsub.md @@ -12,4 +12,4 @@ | `Credentials` | [*components.GCPPubSubCredentialsUpdate](../../models/components/gcppubsubcredentialsupdate.md) | :heavy_minus_sign: | Partial GCP Pub/Sub credentials for PATCH updates (RFC 7396 merge-patch). | | | `DeliveryMetadata` | optionalnullable.OptionalNullable[map[string]`*string`] | :heavy_minus_sign: | Static key-value pairs merged into event metadata on every attempt. Uses JSON merge-patch semantics (RFC 7396): send keys to add/update, null values to delete keys, null for entire field to clear all. Omit or send {} for no change. | {
"app-id": "my-app",
"region": "us-east-1"
} | | `Metadata` | optionalnullable.OptionalNullable[map[string]`*string`] | :heavy_minus_sign: | Arbitrary contextual information stored with the destination. Uses JSON merge-patch semantics (RFC 7396): send keys to add/update, null values to delete keys, null for entire field to clear all. Omit or send {} for no change. | {
"internal-id": "123",
"team": "platform"
} | -| `DisabledAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | Update the disabled state of the destination. Send a timestamp (must not be in the future) to disable, null to enable, or omit to leave unchanged. | | \ No newline at end of file +| `DisabledAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | Update the disabled state of the destination. Send a timestamp (must not be in the future) to disable, null to enable, or omit to leave unchanged. | null | \ No newline at end of file diff --git a/sdks/outpost-go/docs/models/components/destinationupdatehookdeck.md b/sdks/outpost-go/docs/models/components/destinationupdatehookdeck.md index 1e4b82b2..2ef157c2 100644 --- a/sdks/outpost-go/docs/models/components/destinationupdatehookdeck.md +++ b/sdks/outpost-go/docs/models/components/destinationupdatehookdeck.md @@ -11,4 +11,4 @@ | `Credentials` | [*components.HookdeckCredentialsUpdate](../../models/components/hookdeckcredentialsupdate.md) | :heavy_minus_sign: | Partial Hookdeck credentials for PATCH updates (RFC 7396 merge-patch). | | | `DeliveryMetadata` | optionalnullable.OptionalNullable[map[string]`*string`] | :heavy_minus_sign: | Static key-value pairs merged into event metadata on every attempt. Uses JSON merge-patch semantics (RFC 7396): send keys to add/update, null values to delete keys, null for entire field to clear all. Omit or send {} for no change. | {
"app-id": "my-app",
"region": "us-east-1"
} | | `Metadata` | optionalnullable.OptionalNullable[map[string]`*string`] | :heavy_minus_sign: | Arbitrary contextual information stored with the destination. Uses JSON merge-patch semantics (RFC 7396): send keys to add/update, null values to delete keys, null for entire field to clear all. Omit or send {} for no change. | {
"internal-id": "123",
"team": "platform"
} | -| `DisabledAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | Update the disabled state of the destination. Send a timestamp (must not be in the future) to disable, null to enable, or omit to leave unchanged. | | \ No newline at end of file +| `DisabledAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | Update the disabled state of the destination. Send a timestamp (must not be in the future) to disable, null to enable, or omit to leave unchanged. | null | \ No newline at end of file diff --git a/sdks/outpost-go/docs/models/components/destinationupdatekafka.md b/sdks/outpost-go/docs/models/components/destinationupdatekafka.md index 978c8a78..fcf81970 100644 --- a/sdks/outpost-go/docs/models/components/destinationupdatekafka.md +++ b/sdks/outpost-go/docs/models/components/destinationupdatekafka.md @@ -12,4 +12,4 @@ | `Credentials` | [*components.KafkaCredentialsUpdate](../../models/components/kafkacredentialsupdate.md) | :heavy_minus_sign: | Partial Kafka credentials for PATCH updates (RFC 7396 merge-patch). | | | `DeliveryMetadata` | optionalnullable.OptionalNullable[map[string]`*string`] | :heavy_minus_sign: | Static key-value pairs merged into event metadata on every attempt. Uses JSON merge-patch semantics (RFC 7396): send keys to add/update, null values to delete keys, null for entire field to clear all. Omit or send {} for no change. | {
"app-id": "my-app",
"region": "us-east-1"
} | | `Metadata` | optionalnullable.OptionalNullable[map[string]`*string`] | :heavy_minus_sign: | Arbitrary contextual information stored with the destination. Uses JSON merge-patch semantics (RFC 7396): send keys to add/update, null values to delete keys, null for entire field to clear all. Omit or send {} for no change. | {
"internal-id": "123",
"team": "platform"
} | -| `DisabledAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | Update the disabled state of the destination. Send a timestamp (must not be in the future) to disable, null to enable, or omit to leave unchanged. | | \ No newline at end of file +| `DisabledAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | Update the disabled state of the destination. Send a timestamp (must not be in the future) to disable, null to enable, or omit to leave unchanged. | null | \ No newline at end of file diff --git a/sdks/outpost-go/docs/models/components/destinationupdaterabbitmq.md b/sdks/outpost-go/docs/models/components/destinationupdaterabbitmq.md index 4c859623..03620c5a 100644 --- a/sdks/outpost-go/docs/models/components/destinationupdaterabbitmq.md +++ b/sdks/outpost-go/docs/models/components/destinationupdaterabbitmq.md @@ -12,4 +12,4 @@ | `Credentials` | [*components.RabbitMQCredentialsUpdate](../../models/components/rabbitmqcredentialsupdate.md) | :heavy_minus_sign: | Partial RabbitMQ credentials for PATCH updates (RFC 7396 merge-patch). | | | `DeliveryMetadata` | optionalnullable.OptionalNullable[map[string]`*string`] | :heavy_minus_sign: | Static key-value pairs merged into event metadata on every attempt. Uses JSON merge-patch semantics (RFC 7396): send keys to add/update, null values to delete keys, null for entire field to clear all. Omit or send {} for no change. | {
"app-id": "my-app",
"region": "us-east-1"
} | | `Metadata` | optionalnullable.OptionalNullable[map[string]`*string`] | :heavy_minus_sign: | Arbitrary contextual information stored with the destination. Uses JSON merge-patch semantics (RFC 7396): send keys to add/update, null values to delete keys, null for entire field to clear all. Omit or send {} for no change. | {
"internal-id": "123",
"team": "platform"
} | -| `DisabledAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | Update the disabled state of the destination. Send a timestamp (must not be in the future) to disable, null to enable, or omit to leave unchanged. | | \ No newline at end of file +| `DisabledAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | Update the disabled state of the destination. Send a timestamp (must not be in the future) to disable, null to enable, or omit to leave unchanged. | null | \ No newline at end of file diff --git a/sdks/outpost-go/docs/models/components/destinationupdatewebhook.md b/sdks/outpost-go/docs/models/components/destinationupdatewebhook.md index 2e725701..6a6efeea 100644 --- a/sdks/outpost-go/docs/models/components/destinationupdatewebhook.md +++ b/sdks/outpost-go/docs/models/components/destinationupdatewebhook.md @@ -12,4 +12,4 @@ | `Credentials` | [*components.WebhookCredentialsUpdate](../../models/components/webhookcredentialsupdate.md) | :heavy_minus_sign: | Partial Webhook credentials for PATCH updates (RFC 7396 merge-patch). | | | `DeliveryMetadata` | optionalnullable.OptionalNullable[map[string]`*string`] | :heavy_minus_sign: | Static key-value pairs merged into event metadata on every attempt. Uses JSON merge-patch semantics (RFC 7396): send keys to add/update, null values to delete keys, null for entire field to clear all. Omit or send {} for no change. | {
"app-id": "my-app",
"region": "us-east-1"
} | | `Metadata` | optionalnullable.OptionalNullable[map[string]`*string`] | :heavy_minus_sign: | Arbitrary contextual information stored with the destination. Uses JSON merge-patch semantics (RFC 7396): send keys to add/update, null values to delete keys, null for entire field to clear all. Omit or send {} for no change. | {
"internal-id": "123",
"team": "platform"
} | -| `DisabledAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | Update the disabled state of the destination. Send a timestamp (must not be in the future) to disable, null to enable, or omit to leave unchanged. | | \ No newline at end of file +| `DisabledAt` | optionalnullable.OptionalNullable[[time.Time](https://pkg.go.dev/time#Time)] | :heavy_minus_sign: | Update the disabled state of the destination. Send a timestamp (must not be in the future) to disable, null to enable, or omit to leave unchanged. | null | \ No newline at end of file diff --git a/sdks/outpost-go/docs/models/components/destinationwebhook.md b/sdks/outpost-go/docs/models/components/destinationwebhook.md index 7bf9f5b5..e350c8c2 100644 --- a/sdks/outpost-go/docs/models/components/destinationwebhook.md +++ b/sdks/outpost-go/docs/models/components/destinationwebhook.md @@ -9,7 +9,7 @@ | `Type` | [components.DestinationWebhookType](../../models/components/destinationwebhooktype.md) | :heavy_check_mark: | Type of the destination. | webhook | | `Topics` | [components.Topics](../../models/components/topics.md) | :heavy_check_mark: | "*" or an array of enabled topics. | * | | `Filter` | optionalnullable.OptionalNullable[map[string]`any`] | :heavy_minus_sign: | Optional JSON schema filter for event matching. Events must match this filter to be delivered to this destination.
Supports operators: $eq, $neq, $gt, $gte, $lt, $lte, $in, $nin, $startsWith, $endsWith, $exist, $or, $and, $not.
If null or empty, all events matching the topic filter will be delivered.
Uses full-replacement semantics on update: send a new object to replace, null or `{}` to clear, omit for no change.
| {
"data": {
"amount": {
"$gte": 100
},
"customer": {
"tier": "premium"
}
}
} | -| `DisabledAt` | [*time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | ISO Date when the destination was disabled, or null if enabled. | | +| `DisabledAt` | [*time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | ISO Date when the destination was disabled, or null if enabled. | null | | `CreatedAt` | [time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | ISO Date when the destination was created. | 2024-01-01T00:00:00Z | | `UpdatedAt` | [time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | ISO Date when the destination was last updated. | 2024-01-01T00:00:00Z | | `Config` | [components.WebhookConfig](../../models/components/webhookconfig.md) | :heavy_check_mark: | N/A | | diff --git a/sdks/outpost-go/docs/models/components/managedconfig.md b/sdks/outpost-go/docs/models/components/managedconfig.md index 6acd2997..a2684de0 100644 --- a/sdks/outpost-go/docs/models/components/managedconfig.md +++ b/sdks/outpost-go/docs/models/components/managedconfig.md @@ -11,8 +11,8 @@ Self-hosted deployments configure these values using environment variables. | Field | Type | Required | Description | | -------------------------------------------------- | -------------------------------------------------- | -------------------------------------------------- | -------------------------------------------------- | | `AlertAutoDisableDestination` | `*string` | :heavy_minus_sign: | N/A | -| `AlertCallbackURL` | `*string` | :heavy_minus_sign: | N/A | | `AlertConsecutiveFailureCount` | `*string` | :heavy_minus_sign: | N/A | +| `AlertExhaustedRetriesWindowSeconds` | `*string` | :heavy_minus_sign: | N/A | | `DeliveryTimeoutSeconds` | `*string` | :heavy_minus_sign: | N/A | | `DestinationsAwsKinesisMetadataInPayload` | `*string` | :heavy_minus_sign: | N/A | | `DestinationsIncludeMillisecondTimestamp` | `*string` | :heavy_minus_sign: | N/A | @@ -34,7 +34,6 @@ Self-hosted deployments configure these values using environment variables. | `IdgenEventPrefix` | `*string` | :heavy_minus_sign: | N/A | | `IdgenType` | `*string` | :heavy_minus_sign: | N/A | | `MaxDestinationsPerTenant` | `*string` | :heavy_minus_sign: | N/A | -| `OrganizationName` | `*string` | :heavy_minus_sign: | N/A | | `PortalBrandColor` | `*string` | :heavy_minus_sign: | N/A | | `PortalDisableOutpostBranding` | `*string` | :heavy_minus_sign: | N/A | | `PortalFaviconURL` | `*string` | :heavy_minus_sign: | N/A | diff --git a/sdks/outpost-go/docs/models/components/seekpagination.md b/sdks/outpost-go/docs/models/components/seekpagination.md index 8c9ea95c..63f22083 100644 --- a/sdks/outpost-go/docs/models/components/seekpagination.md +++ b/sdks/outpost-go/docs/models/components/seekpagination.md @@ -11,4 +11,4 @@ Cursor-based pagination metadata for list responses. | `Dir` | [*components.Dir](../../models/components/dir.md) | :heavy_minus_sign: | Sort direction. | desc | | `Limit` | `*int64` | :heavy_minus_sign: | Page size limit. | 100 | | `Next` | optionalnullable.OptionalNullable[`string`] | :heavy_minus_sign: | Cursor for the next page of results. Null if no more results. | MTcwNDA2NzIwMA== | -| `Prev` | optionalnullable.OptionalNullable[`string`] | :heavy_minus_sign: | Cursor for the previous page of results. Null if on first page. | | \ No newline at end of file +| `Prev` | optionalnullable.OptionalNullable[`string`] | :heavy_minus_sign: | Cursor for the previous page of results. Null if on first page. | null | \ No newline at end of file diff --git a/sdks/outpost-go/go.mod b/sdks/outpost-go/go.mod index 5dd9b935..50a35ad2 100644 --- a/sdks/outpost-go/go.mod +++ b/sdks/outpost-go/go.mod @@ -1,6 +1,6 @@ module github.com/hookdeck/outpost/sdks/outpost-go -go 1.22 +go 1.25.10 require github.com/stretchr/testify v1.11.1 diff --git a/sdks/outpost-go/internal/utils/json.go b/sdks/outpost-go/internal/utils/json.go index 187b094d..83d4a48e 100644 --- a/sdks/outpost-go/internal/utils/json.go +++ b/sdks/outpost-go/internal/utils/json.go @@ -512,6 +512,13 @@ func unmarshalValue(value json.RawMessage, v reflect.Value, tag reflect.StructTa return nil } case reflect.Map: + if implementsJSONUnmarshaler(v.Type()) { + if v.CanAddr() { + return json.Unmarshal(value, v.Addr().Interface()) + } + return json.Unmarshal(value, v.Interface()) + } + if bytes.Equal(value, []byte("null")) || !isComplexValueType(dereferenceTypePointer(typ.Elem())) { if v.CanAddr() { return json.Unmarshal(value, v.Addr().Interface()) diff --git a/sdks/outpost-go/models/components/managedconfig.go b/sdks/outpost-go/models/components/managedconfig.go index 4d9ea686..77e50f23 100644 --- a/sdks/outpost-go/models/components/managedconfig.go +++ b/sdks/outpost-go/models/components/managedconfig.go @@ -7,8 +7,8 @@ package components // Self-hosted deployments configure these values using environment variables. type ManagedConfig struct { AlertAutoDisableDestination *string `json:"ALERT_AUTO_DISABLE_DESTINATION,omitempty"` - AlertCallbackURL *string `json:"ALERT_CALLBACK_URL,omitempty"` AlertConsecutiveFailureCount *string `json:"ALERT_CONSECUTIVE_FAILURE_COUNT,omitempty"` + AlertExhaustedRetriesWindowSeconds *string `json:"ALERT_EXHAUSTED_RETRIES_WINDOW_SECONDS,omitempty"` DeliveryTimeoutSeconds *string `json:"DELIVERY_TIMEOUT_SECONDS,omitempty"` DestinationsAwsKinesisMetadataInPayload *string `json:"DESTINATIONS_AWS_KINESIS_METADATA_IN_PAYLOAD,omitempty"` DestinationsIncludeMillisecondTimestamp *string `json:"DESTINATIONS_INCLUDE_MILLISECOND_TIMESTAMP,omitempty"` @@ -30,7 +30,6 @@ type ManagedConfig struct { IdgenEventPrefix *string `json:"IDGEN_EVENT_PREFIX,omitempty"` IdgenType *string `json:"IDGEN_TYPE,omitempty"` MaxDestinationsPerTenant *string `json:"MAX_DESTINATIONS_PER_TENANT,omitempty"` - OrganizationName *string `json:"ORGANIZATION_NAME,omitempty"` PortalBrandColor *string `json:"PORTAL_BRAND_COLOR,omitempty"` PortalDisableOutpostBranding *string `json:"PORTAL_DISABLE_OUTPOST_BRANDING,omitempty"` PortalFaviconURL *string `json:"PORTAL_FAVICON_URL,omitempty"` @@ -77,18 +76,18 @@ func (m *ManagedConfig) GetAlertAutoDisableDestination() *string { return m.AlertAutoDisableDestination } -func (m *ManagedConfig) GetAlertCallbackURL() *string { +func (m *ManagedConfig) GetAlertConsecutiveFailureCount() *string { if m == nil { return nil } - return m.AlertCallbackURL + return m.AlertConsecutiveFailureCount } -func (m *ManagedConfig) GetAlertConsecutiveFailureCount() *string { +func (m *ManagedConfig) GetAlertExhaustedRetriesWindowSeconds() *string { if m == nil { return nil } - return m.AlertConsecutiveFailureCount + return m.AlertExhaustedRetriesWindowSeconds } func (m *ManagedConfig) GetDeliveryTimeoutSeconds() *string { @@ -238,13 +237,6 @@ func (m *ManagedConfig) GetMaxDestinationsPerTenant() *string { return m.MaxDestinationsPerTenant } -func (m *ManagedConfig) GetOrganizationName() *string { - if m == nil { - return nil - } - return m.OrganizationName -} - func (m *ManagedConfig) GetPortalBrandColor() *string { if m == nil { return nil diff --git a/sdks/outpost-go/outpost.go b/sdks/outpost-go/outpost.go index 80f42bb3..6846cd10 100644 --- a/sdks/outpost-go/outpost.go +++ b/sdks/outpost-go/outpost.go @@ -2,7 +2,7 @@ package outpostgo -// Generated from OpenAPI doc version 0.0.1 and generator version 2.884.0 +// Generated from OpenAPI doc version 0.0.1 and generator version 2.906.0 import ( "bytes" @@ -172,9 +172,9 @@ func WithTimeout(timeout time.Duration) SDKOption { // New creates a new instance of the SDK with the provided options func New(opts ...SDKOption) *Outpost { sdk := &Outpost{ - SDKVersion: "1.4.0", + SDKVersion: "1.4.1", sdkConfiguration: config.SDKConfiguration{ - UserAgent: "speakeasy-sdk/go 1.4.0 2.884.0 0.0.1 github.com/hookdeck/outpost/sdks/outpost-go", + UserAgent: "speakeasy-sdk/go 1.4.1 2.906.0 0.0.1 github.com/hookdeck/outpost/sdks/outpost-go", ServerList: ServerList, }, hooks: hooks.New(), diff --git a/sdks/outpost-go/retry/config.go b/sdks/outpost-go/retry/config.go index 5b3dc7c1..767002c7 100644 --- a/sdks/outpost-go/retry/config.go +++ b/sdks/outpost-go/retry/config.go @@ -98,6 +98,14 @@ func retryIntervalFromResponse(res *http.Response) time.Duration { return 0 } + retryAfterMsVal := res.Header.Get("retry-after-ms") + if retryAfterMsVal != "" { + parsedMs, err := strconv.ParseInt(retryAfterMsVal, 10, 64) + if err == nil && parsedMs >= 0 { + return time.Duration(parsedMs) * time.Millisecond + } + } + retryVal := res.Header.Get("retry-after") if retryVal == "" { return 0 diff --git a/sdks/outpost-go/shields.json b/sdks/outpost-go/shields.json index 0397ad6e..320a626d 100644 --- a/sdks/outpost-go/shields.json +++ b/sdks/outpost-go/shields.json @@ -1,6 +1,6 @@ { "schemaVersion": 1, "label": "outpost-go", - "message": "v1.4.0", + "message": "v1.4.1", "color": "blue" } diff --git a/sdks/outpost-python/.speakeasy/gen.lock b/sdks/outpost-python/.speakeasy/gen.lock index d004c961..c2dce8f7 100644 --- a/sdks/outpost-python/.speakeasy/gen.lock +++ b/sdks/outpost-python/.speakeasy/gen.lock @@ -1,26 +1,26 @@ lockVersion: 2.0.0 id: da774284-22d9-4b6c-bb26-1c3fc9f2c7ee management: - docChecksum: b8231303350debfcd93ddd3554fe8788 + docChecksum: 48af941c89104f4f85ea8ab3092ec5db docVersion: 0.0.1 - speakeasyVersion: 1.768.2 - generationVersion: 2.889.1 - releaseVersion: 1.4.0 - configChecksum: dc6879811fea886ac36dc4ca4e884bdd + speakeasyVersion: 1.780.0 + generationVersion: 2.906.0 + releaseVersion: 1.4.1 + configChecksum: 3638cc0683d7f21c56f364bc790986c5 repoURL: https://github.com/hookdeck/outpost.git repoSubDirectory: sdks/outpost-python installationURL: https://github.com/hookdeck/outpost.git#subdirectory=sdks/outpost-python published: true persistentEdits: - generation_id: 44f495cc-36d8-41d1-9934-555d39a1dbc2 - pristine_commit_hash: 7235c25bedb9eaa83bd637b193a7d36588f86690 - pristine_tree_hash: 023defff34787c361ee1f23acd337f2af733ee7e + generation_id: 0e3d80db-a4a3-4118-81a6-b7eed903a397 + pristine_commit_hash: 0bbc29e2649815dd26aecab9b4f9b180d95f66ab + pristine_tree_hash: 115488e008e709f95a5aa5a1ad34a5c2b6df6a7c features: python: - additionalDependencies: 1.0.0 + additionalDependencies: 1.1.0 additionalProperties: 1.0.1 constsAndDefaults: 1.0.7 - core: 6.0.23 + core: 6.0.30 defaultEnabledRetries: 0.2.0 enumUnions: 0.1.1 envVarSecurityUsage: 0.3.3 @@ -33,9 +33,9 @@ features: nameOverrides: 3.0.3 nullables: 1.0.2 responseFormat: 1.1.0 - retries: 3.0.5 + retries: 3.0.6 sdkHooks: 1.2.1 - unions: 3.1.5 + unions: 3.1.6 trackedFiles: .gitattributes: id: 24139dae6567 @@ -795,8 +795,8 @@ trackedFiles: pristine_git_object: 14d312b6d1c8a81415b625253eefe05f3f0ad276 docs/models/managedconfig.md: id: 56bc51d52ab0 - last_write_checksum: sha1:a284cef0619ba61f14446d8cd9b0f99ac6ea5748 - pristine_git_object: 2260881c2ab73757397cb8740cc76ce0b62145a6 + last_write_checksum: sha1:d56fd1aad7a64939efa6d86b0c5759b7b4798765 + pristine_git_object: d8bbc76c7a12360403118cf71565cf086c3554e7 docs/models/metricsdatapoint.md: id: 7ab5449287c3 last_write_checksum: sha1:ed280c92a54e7b8a0d55cb99261bfb689bbc47a1 @@ -995,8 +995,8 @@ trackedFiles: pristine_git_object: cca330736fb6ecec666b32012a4c346570dd5085 pyproject.toml: id: 5d07e7d72637 - last_write_checksum: sha1:0eecd88c59f1524f8dcb01f4c9cd5d4024ae488f - pristine_git_object: e99eac12ff9b9344e45d659aebb9661ffd194d0c + last_write_checksum: sha1:9932d96fcd29f9481ed1e95ec9f6ad88630cabb5 + pristine_git_object: 4718bc884daa20ea6a24218ef0562c4f4eb00487 scripts/prepare_readme.py: id: e0c5957a6035 last_write_checksum: sha1:eb460f85c06b287fee629d997b2df75c92fa1cab @@ -1023,12 +1023,12 @@ trackedFiles: pristine_git_object: b1777a2eacece4434c53b2e136158f0c1360707d src/outpost_sdk/_version.py: id: 22be68f35ad0 - last_write_checksum: sha1:f1a6eb61e14f8d8199c376cf22b0ce38fafc27aa - pristine_git_object: cf8ba2ca11c1f1936c734b69b920af2732c1841e + last_write_checksum: sha1:b72248c18b4d1a533872fea8cbfbeb66a861f0d6 + pristine_git_object: d54d29394f1924b0db1110ae8adc616559d003ef src/outpost_sdk/attempts.py: id: 304ea4e0bbf1 - last_write_checksum: sha1:f7950262c68b31eee16d8868da4265583ed3f707 - pristine_git_object: 7c5191a8ac7f830a295f5c1f302c0dc837eb9237 + last_write_checksum: sha1:7093d57bf48237637c69526e2caa6112372ac84f + pristine_git_object: d12693228a074d5dd88d718cd1b76f3e7486d797 src/outpost_sdk/basesdk.py: id: 06a87cb4bdaf last_write_checksum: sha1:a3f270afc94f10f54e18bbb46c6c2cc988fec1b1 @@ -1039,8 +1039,8 @@ trackedFiles: pristine_git_object: 5db6f13013abe76da1d7d01cd09ea8b69f8b77c9 src/outpost_sdk/destinations.py: id: c941d7cf8960 - last_write_checksum: sha1:5bd98a9bf0a2b2b044d1b78b7b9ef6e108cf82e1 - pristine_git_object: df104c01905f67dbb328542115fe64c05627f002 + last_write_checksum: sha1:35f24a2053067aafed8a37363ef7f82c1a39e1d4 + pristine_git_object: c2d22e1821e80fa531347093a6d5c324a4f9c849 src/outpost_sdk/errors/__init__.py: id: 8cd8140f4773 last_write_checksum: sha1:32a90fdbd5d713cbffb8ff6e4066055df2268392 @@ -1451,8 +1451,8 @@ trackedFiles: pristine_git_object: fff65f0f24d2f2717481ea57b803c03acc35d10f src/outpost_sdk/models/managedconfig.py: id: 6e2467f6cfb6 - last_write_checksum: sha1:9371d6424fb548a90658dfa23cb88400ffa34990 - pristine_git_object: cc6b2742f2e6a1b4b4db331eb55e6ed4f6272595 + last_write_checksum: sha1:b7ed823460fdcd778ae2c32d688d6fa288b2153d + pristine_git_object: 9bc9b8edfc2119633ea188df7265ce4ab900b77d src/outpost_sdk/models/metricsdatapoint.py: id: 402c8bbf628c last_write_checksum: sha1:6f9c42b80858d89c0d0c4f5e06c4e5d23567f6ce @@ -1587,8 +1587,8 @@ trackedFiles: pristine_git_object: faa268137bc01c9d08cfadc4797017db48747a96 src/outpost_sdk/types/base64fileinput.py: id: efd371b5f586 - last_write_checksum: sha1:4780e893d3853b5a6e28d9a6ca3ee102ce0f502d - pristine_git_object: 25fc53989ed497649363f983219fc58705c8bf87 + last_write_checksum: sha1:1522687ae3398374c35710cad993a6e82b5ab99d + pristine_git_object: 862566fe2b1db830276b390e136e65090e5963d2 src/outpost_sdk/types/basemodel.py: id: a135d73a3022 last_write_checksum: sha1:10d84aedeb9d35edfdadf2c3020caa1d24d8b584 @@ -1615,12 +1615,12 @@ trackedFiles: pristine_git_object: 3324e1bc2668c54c4d5f5a1a845675319757a828 src/outpost_sdk/utils/eventstreaming.py: id: 820142ef32ea - last_write_checksum: sha1:620d78a8b4e3b854e08d136e02e40a01a786bd70 - pristine_git_object: 3bdcd6d3d4fc772cb7f5fca8685dcdc8c85e13e8 + last_write_checksum: sha1:7d1dc68f8b48486ab646653aa05cc38752e1f912 + pristine_git_object: a8d4fe5cc88d3c7337339e1b36a61bbf7ca8c4eb src/outpost_sdk/utils/forms.py: id: 906e4bc25e36 - last_write_checksum: sha1:15fa7e9ab1611e062a9984cf06cb20969713d295 - pristine_git_object: f961e76beaf0a8b1fe0dda44754a74eebd3608e7 + last_write_checksum: sha1:a971cdb120ad3d416d296d5d0ad89e4808350a7f + pristine_git_object: fdf0dc9b2a67bca773eefe6b471498cccaa83424 src/outpost_sdk/utils/headers.py: id: bc69a402eee7 last_write_checksum: sha1:7c6df233ee006332b566a8afa9ce9a245941d935 @@ -1639,20 +1639,20 @@ trackedFiles: pristine_git_object: c04e0db82b68eca041f2cb2614d748fbac80fd41 src/outpost_sdk/utils/requestbodies.py: id: 99737fa2de7e - last_write_checksum: sha1:41e2d2d2d3ecc394c8122ca4d4b85e1c3e03f054 - pristine_git_object: 1de32b6d26f46590232f398fdba6ce0072f1659c + last_write_checksum: sha1:e1fef575283b7fe7fe2ad392dbbb3fb105309124 + pristine_git_object: 591415af8e64baa410627b507d2740afb5387d13 src/outpost_sdk/utils/retries.py: id: febe03add039 - last_write_checksum: sha1:471372f5c5d1dd5583239c9cf3c75f1b636e5d87 - pristine_git_object: af07d4e941007af4213c5ec9047ef8a2fca04e5e + last_write_checksum: sha1:9fcb404e0a5113634df964b4f393ba4eea5a76f3 + pristine_git_object: bab2066f128973f7a38a94ccc5b378bd849a3cd9 src/outpost_sdk/utils/security.py: id: 575c509050a4 last_write_checksum: sha1:c11eef495b6aaa249178c24c796940cc540b7a00 pristine_git_object: 42d8d78e9981eed7507670014d99588e27ab325a src/outpost_sdk/utils/serializers.py: id: a71d1afce9d8 - last_write_checksum: sha1:61009f2e4ef6613a1a5af813fe020373dae5a492 - pristine_git_object: d2149f8b909cb96628db140ac3cddb1b1e981367 + last_write_checksum: sha1:7485f1425b0661fd84836186570df90207eec6af + pristine_git_object: 1031ed930bad5ece220cf7416a56c29f40f0588b src/outpost_sdk/utils/unmarshal_json_response.py: id: 559ebd25bf1b last_write_checksum: sha1:7a229b6339ba72cb62a8a15f9bce02567eeb511f @@ -2247,9 +2247,7 @@ examples: application/json: {} examplesVersion: 1.0.2 generatedTests: {} -releaseNotes: | - ## Python SDK Changes: - * `outpost.destinations.update()`: `request.body` **Changed** (Breaking ⚠️) +releaseNotes: "## Python SDK Changes:\n* `outpost.configuration.get_managed_config()`: `response` **Changed** (Breaking ⚠️)\n* `outpost.configuration.update_managed_config()`: \n * `request` **Changed** (Breaking ⚠️)\n * `response` **Changed** (Breaking ⚠️)\n" generatedFiles: - .gitattributes - .vscode/settings.json diff --git a/sdks/outpost-python/.speakeasy/gen.yaml b/sdks/outpost-python/.speakeasy/gen.yaml index 47b22953..d6f1606c 100644 --- a/sdks/outpost-python/.speakeasy/gen.yaml +++ b/sdks/outpost-python/.speakeasy/gen.yaml @@ -29,7 +29,7 @@ generation: generateNewTests: false skipResponseBodyAssertions: false python: - version: 1.4.0 + version: 1.4.1 additionalDependencies: dev: {} main: {} @@ -40,12 +40,17 @@ python: authors: - Speakeasy baseErrorName: OutpostError + bodyVariantOverloads: false clientServerStatusCodesAsErrors: true constFieldCasing: upper defaultErrorName: APIError description: Python Client SDK Generated by Speakeasy. enableCustomCodeRegions: false enumFormat: enum + errorSchemaValidation: true + eventStreamClassNames: + async: EventStreamAsync + sync: EventStream fixFlags: asyncPaginationSep2025: false conflictResistantModelImportsFeb2026: false @@ -65,17 +70,22 @@ python: webhooks: "" inferUnionDiscriminators: true inputModelSuffix: input + inputTypedDictSuffix: TypedDict license: "" maxMethodParams: 4 methodArguments: require-security-and-request + methodTimeoutArgument: timeout-ms + methodTimeoutUnits: milliseconds moduleName: "" multipartArrayFormat: legacy + optionalDependencies: {} outputModelSuffix: output packageManager: poetry packageName: outpost_sdk preApplyUnionDiscriminators: false pytestFilterWarnings: [] pytestTimeout: 0 + rawResponseHelpers: false responseFormat: flat sseFlatResponse: false templateVersion: v2 diff --git a/sdks/outpost-python/RELEASES.md b/sdks/outpost-python/RELEASES.md index 53ec6031..942bfdf1 100644 --- a/sdks/outpost-python/RELEASES.md +++ b/sdks/outpost-python/RELEASES.md @@ -168,4 +168,14 @@ Based on: ### Generated - [python v1.4.0] sdks/outpost-python ### Releases -- [PyPI v1.4.0] https://pypi.org/project/outpost_sdk/1.4.0 - sdks/outpost-python \ No newline at end of file +- [PyPI v1.4.0] https://pypi.org/project/outpost_sdk/1.4.0 - sdks/outpost-python + +## 2026-06-16 18:48:07 +### Changes +Based on: +- OpenAPI Doc +- Speakeasy CLI 1.780.0 (2.906.0) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v1.4.1] sdks/outpost-python +### Releases +- [PyPI v1.4.1] https://pypi.org/project/outpost_sdk/1.4.1 - sdks/outpost-python \ No newline at end of file diff --git a/sdks/outpost-python/docs/models/managedconfig.md b/sdks/outpost-python/docs/models/managedconfig.md index 2260881c..d8bbc76c 100644 --- a/sdks/outpost-python/docs/models/managedconfig.md +++ b/sdks/outpost-python/docs/models/managedconfig.md @@ -11,8 +11,8 @@ Self-hosted deployments configure these values using environment variables. | Field | Type | Required | Description | | ------------------------------------------------------- | ------------------------------------------------------- | ------------------------------------------------------- | ------------------------------------------------------- | | `alert_auto_disable_destination` | *Optional[str]* | :heavy_minus_sign: | N/A | -| `alert_callback_url` | *Optional[str]* | :heavy_minus_sign: | N/A | | `alert_consecutive_failure_count` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `alert_exhausted_retries_window_seconds` | *Optional[str]* | :heavy_minus_sign: | N/A | | `delivery_timeout_seconds` | *Optional[str]* | :heavy_minus_sign: | N/A | | `destinations_aws_kinesis_metadata_in_payload` | *Optional[str]* | :heavy_minus_sign: | N/A | | `destinations_include_millisecond_timestamp` | *Optional[str]* | :heavy_minus_sign: | N/A | @@ -34,7 +34,6 @@ Self-hosted deployments configure these values using environment variables. | `idgen_event_prefix` | *Optional[str]* | :heavy_minus_sign: | N/A | | `idgen_type` | *Optional[str]* | :heavy_minus_sign: | N/A | | `max_destinations_per_tenant` | *Optional[str]* | :heavy_minus_sign: | N/A | -| `organization_name` | *Optional[str]* | :heavy_minus_sign: | N/A | | `portal_brand_color` | *Optional[str]* | :heavy_minus_sign: | N/A | | `portal_disable_outpost_branding` | *Optional[str]* | :heavy_minus_sign: | N/A | | `portal_favicon_url` | *Optional[str]* | :heavy_minus_sign: | N/A | diff --git a/sdks/outpost-python/pyproject.toml b/sdks/outpost-python/pyproject.toml index e99eac12..4718bc88 100644 --- a/sdks/outpost-python/pyproject.toml +++ b/sdks/outpost-python/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "outpost_sdk" -version = "1.4.0" +version = "1.4.1" description = "Python Client SDK Generated by Speakeasy." authors = [{ name = "Speakeasy" },] readme = "README-PYPI.md" diff --git a/sdks/outpost-python/src/outpost_sdk/_version.py b/sdks/outpost-python/src/outpost_sdk/_version.py index cf8ba2ca..d54d2939 100644 --- a/sdks/outpost-python/src/outpost_sdk/_version.py +++ b/sdks/outpost-python/src/outpost_sdk/_version.py @@ -3,10 +3,10 @@ import importlib.metadata __title__: str = "outpost_sdk" -__version__: str = "1.4.0" +__version__: str = "1.4.1" __openapi_doc_version__: str = "0.0.1" -__gen_version__: str = "2.889.1" -__user_agent__: str = "speakeasy-sdk/python 1.4.0 2.889.1 0.0.1 outpost_sdk" +__gen_version__: str = "2.906.0" +__user_agent__: str = "speakeasy-sdk/python 1.4.1 2.906.0 0.0.1 outpost_sdk" try: if __package__ is not None: diff --git a/sdks/outpost-python/src/outpost_sdk/attempts.py b/sdks/outpost-python/src/outpost_sdk/attempts.py index 7c5191a8..d1269322 100644 --- a/sdks/outpost-python/src/outpost_sdk/attempts.py +++ b/sdks/outpost-python/src/outpost_sdk/attempts.py @@ -266,7 +266,7 @@ def get( request = models.GetAttemptRequest( attempt_id=attempt_id, tenant_id=tenant_id, - include=include, + include=utils.unmarshal(include, Optional[models.GetAttemptInclude]), ) req = self._build_request( @@ -379,7 +379,7 @@ async def get_async( request = models.GetAttemptRequest( attempt_id=attempt_id, tenant_id=tenant_id, - include=include, + include=utils.unmarshal(include, Optional[models.GetAttemptInclude]), ) req = self._build_request_async( diff --git a/sdks/outpost-python/src/outpost_sdk/destinations.py b/sdks/outpost-python/src/outpost_sdk/destinations.py index df104c01..c2d22e18 100644 --- a/sdks/outpost-python/src/outpost_sdk/destinations.py +++ b/sdks/outpost-python/src/outpost_sdk/destinations.py @@ -62,8 +62,10 @@ def list( request = models.ListTenantDestinationsRequest( tenant_id=tenant_id, - type=type_, - topics=topics, + type=utils.unmarshal(type_, Optional[models.ListTenantDestinationsType]), + topics=utils.unmarshal( + topics, Optional[models.ListTenantDestinationsTopics] + ), ) req = self._build_request( @@ -174,8 +176,10 @@ async def list_async( request = models.ListTenantDestinationsRequest( tenant_id=tenant_id, - type=type_, - topics=topics, + type=utils.unmarshal(type_, Optional[models.ListTenantDestinationsType]), + topics=utils.unmarshal( + topics, Optional[models.ListTenantDestinationsTopics] + ), ) req = self._build_request_async( @@ -1722,7 +1726,9 @@ def get_attempt( tenant_id=tenant_id, destination_id=destination_id, attempt_id=attempt_id, - include=include, + include=utils.unmarshal( + include, Optional[models.GetTenantDestinationAttemptInclude] + ), ) req = self._build_request( @@ -1837,7 +1843,9 @@ async def get_attempt_async( tenant_id=tenant_id, destination_id=destination_id, attempt_id=attempt_id, - include=include, + include=utils.unmarshal( + include, Optional[models.GetTenantDestinationAttemptInclude] + ), ) req = self._build_request_async( diff --git a/sdks/outpost-python/src/outpost_sdk/models/managedconfig.py b/sdks/outpost-python/src/outpost_sdk/models/managedconfig.py index cc6b2742..9bc9b8ed 100644 --- a/sdks/outpost-python/src/outpost_sdk/models/managedconfig.py +++ b/sdks/outpost-python/src/outpost_sdk/models/managedconfig.py @@ -16,8 +16,8 @@ class ManagedConfigTypedDict(TypedDict): """ alert_auto_disable_destination: NotRequired[str] - alert_callback_url: NotRequired[str] alert_consecutive_failure_count: NotRequired[str] + alert_exhausted_retries_window_seconds: NotRequired[str] delivery_timeout_seconds: NotRequired[str] destinations_aws_kinesis_metadata_in_payload: NotRequired[str] destinations_include_millisecond_timestamp: NotRequired[str] @@ -39,7 +39,6 @@ class ManagedConfigTypedDict(TypedDict): idgen_event_prefix: NotRequired[str] idgen_type: NotRequired[str] max_destinations_per_tenant: NotRequired[str] - organization_name: NotRequired[str] portal_brand_color: NotRequired[str] portal_disable_outpost_branding: NotRequired[str] portal_favicon_url: NotRequired[str] @@ -90,14 +89,14 @@ class ManagedConfig(BaseModel): Optional[str], pydantic.Field(alias="ALERT_AUTO_DISABLE_DESTINATION") ] = None - alert_callback_url: Annotated[ - Optional[str], pydantic.Field(alias="ALERT_CALLBACK_URL") - ] = None - alert_consecutive_failure_count: Annotated[ Optional[str], pydantic.Field(alias="ALERT_CONSECUTIVE_FAILURE_COUNT") ] = None + alert_exhausted_retries_window_seconds: Annotated[ + Optional[str], pydantic.Field(alias="ALERT_EXHAUSTED_RETRIES_WINDOW_SECONDS") + ] = None + delivery_timeout_seconds: Annotated[ Optional[str], pydantic.Field(alias="DELIVERY_TIMEOUT_SECONDS") ] = None @@ -189,10 +188,6 @@ class ManagedConfig(BaseModel): Optional[str], pydantic.Field(alias="MAX_DESTINATIONS_PER_TENANT") ] = None - organization_name: Annotated[ - Optional[str], pydantic.Field(alias="ORGANIZATION_NAME") - ] = None - portal_brand_color: Annotated[ Optional[str], pydantic.Field(alias="PORTAL_BRAND_COLOR") ] = None @@ -344,8 +339,8 @@ def serialize_model(self, handler): optional_fields = set( [ "ALERT_AUTO_DISABLE_DESTINATION", - "ALERT_CALLBACK_URL", "ALERT_CONSECUTIVE_FAILURE_COUNT", + "ALERT_EXHAUSTED_RETRIES_WINDOW_SECONDS", "DELIVERY_TIMEOUT_SECONDS", "DESTINATIONS_AWS_KINESIS_METADATA_IN_PAYLOAD", "DESTINATIONS_INCLUDE_MILLISECOND_TIMESTAMP", @@ -367,7 +362,6 @@ def serialize_model(self, handler): "IDGEN_EVENT_PREFIX", "IDGEN_TYPE", "MAX_DESTINATIONS_PER_TENANT", - "ORGANIZATION_NAME", "PORTAL_BRAND_COLOR", "PORTAL_DISABLE_OUTPOST_BRANDING", "PORTAL_FAVICON_URL", diff --git a/sdks/outpost-python/src/outpost_sdk/types/base64fileinput.py b/sdks/outpost-python/src/outpost_sdk/types/base64fileinput.py index 25fc5398..862566fe 100644 --- a/sdks/outpost-python/src/outpost_sdk/types/base64fileinput.py +++ b/sdks/outpost-python/src/outpost_sdk/types/base64fileinput.py @@ -23,7 +23,11 @@ def encode_base64_file_input(value: Any) -> Any: with open(value, "rb") as fh: binary = fh.read() else: + # Restore position after reading: pydantic may validate the same stream more than once. + position = value.tell() if value.seekable() else None binary = value.read() + if position is not None: + value.seek(position) if isinstance(binary, str): binary = binary.encode() if not isinstance(binary, (bytes, bytearray)): diff --git a/sdks/outpost-python/src/outpost_sdk/utils/eventstreaming.py b/sdks/outpost-python/src/outpost_sdk/utils/eventstreaming.py index 3bdcd6d3..a8d4fe5c 100644 --- a/sdks/outpost-python/src/outpost_sdk/utils/eventstreaming.py +++ b/sdks/outpost-python/src/outpost_sdk/utils/eventstreaming.py @@ -7,6 +7,7 @@ Any, Callable, Generic, + List, TypeVar, Optional, Generator, @@ -53,6 +54,9 @@ def __enter__(self): return self def __exit__(self, exc_type, exc_val, exc_tb): + self.close() + + def close(self): self._closed = True self.response.close() @@ -92,6 +96,9 @@ async def __aenter__(self): return self async def __aexit__(self, exc_type, exc_val, exc_tb): + await self.close() + + async def close(self): self._closed = True await self.response.aclose() @@ -114,6 +121,7 @@ class ServerEvent: b"\n\r", b"\n\n", ] +MAX_BOUNDARY_LEN = max(len(b) for b in MESSAGE_BOUNDARIES) UTF8_BOM = b"\xef\xbb\xbf" @@ -124,52 +132,56 @@ async def stream_events_async( sentinel: Optional[str] = None, data_required: bool = True, ) -> AsyncGenerator[T, None]: - buffer = bytearray() - position = 0 - event_id: Optional[str] = None - async for chunk in response.aiter_bytes(): - if len(buffer) == 0 and chunk.startswith(UTF8_BOM): - chunk = chunk[len(UTF8_BOM) :] - buffer += chunk - for i in range(position, len(buffer)): - char = buffer[i : i + 1] - seq: Optional[bytes] = None - if char in [b"\r", b"\n"]: - for boundary in MESSAGE_BOUNDARIES: - seq = _peek_sequence(i, buffer, boundary) - if seq is not None: - break - if seq is None: - continue - - block = buffer[position:i] - position = i + len(seq) - event, discard, event_id = _parse_event( - raw=block, - decoder=decoder, - sentinel=sentinel, - event_id=event_id, - data_required=data_required, - ) - if event is not None: - yield event - if discard: - await response.aclose() - return - - if position > 0: - buffer = buffer[position:] - position = 0 - - event, discard, _ = _parse_event( - raw=buffer, - decoder=decoder, - sentinel=sentinel, - event_id=event_id, - data_required=data_required, - ) - if event is not None: - yield event + try: + buffer = bytearray() + position = 0 + event_id: Optional[str] = None + async for chunk in response.aiter_bytes(): + if len(buffer) == 0 and chunk.startswith(UTF8_BOM): + chunk = chunk[len(UTF8_BOM) :] + old_len = len(buffer) + buffer += chunk + search_start = max(position, old_len - MAX_BOUNDARY_LEN + 1) + for i in range(search_start, len(buffer)): + char = buffer[i : i + 1] + seq: Optional[bytes] = None + if char in [b"\r", b"\n"]: + for boundary in MESSAGE_BOUNDARIES: + seq = _peek_sequence(i, buffer, boundary) + if seq is not None: + break + if seq is None: + continue + + block = buffer[position:i] + position = i + len(seq) + event, discard, event_id = _parse_event( + raw=block, + decoder=decoder, + sentinel=sentinel, + event_id=event_id, + data_required=data_required, + ) + if event is not None: + yield event + if discard: + return + + if position > 0: + buffer = buffer[position:] + position = 0 + + event, discard, _ = _parse_event( + raw=buffer, + decoder=decoder, + sentinel=sentinel, + event_id=event_id, + data_required=data_required, + ) + if event is not None: + yield event + finally: + await response.aclose() def stream_events( @@ -178,52 +190,56 @@ def stream_events( sentinel: Optional[str] = None, data_required: bool = True, ) -> Generator[T, None, None]: - buffer = bytearray() - position = 0 - event_id: Optional[str] = None - for chunk in response.iter_bytes(): - if len(buffer) == 0 and chunk.startswith(UTF8_BOM): - chunk = chunk[len(UTF8_BOM) :] - buffer += chunk - for i in range(position, len(buffer)): - char = buffer[i : i + 1] - seq: Optional[bytes] = None - if char in [b"\r", b"\n"]: - for boundary in MESSAGE_BOUNDARIES: - seq = _peek_sequence(i, buffer, boundary) - if seq is not None: - break - if seq is None: - continue - - block = buffer[position:i] - position = i + len(seq) - event, discard, event_id = _parse_event( - raw=block, - decoder=decoder, - sentinel=sentinel, - event_id=event_id, - data_required=data_required, - ) - if event is not None: - yield event - if discard: - response.close() - return - - if position > 0: - buffer = buffer[position:] - position = 0 - - event, discard, _ = _parse_event( - raw=buffer, - decoder=decoder, - sentinel=sentinel, - event_id=event_id, - data_required=data_required, - ) - if event is not None: - yield event + try: + buffer = bytearray() + position = 0 + event_id: Optional[str] = None + for chunk in response.iter_bytes(): + if len(buffer) == 0 and chunk.startswith(UTF8_BOM): + chunk = chunk[len(UTF8_BOM) :] + old_len = len(buffer) + buffer += chunk + search_start = max(position, old_len - MAX_BOUNDARY_LEN + 1) + for i in range(search_start, len(buffer)): + char = buffer[i : i + 1] + seq: Optional[bytes] = None + if char in [b"\r", b"\n"]: + for boundary in MESSAGE_BOUNDARIES: + seq = _peek_sequence(i, buffer, boundary) + if seq is not None: + break + if seq is None: + continue + + block = buffer[position:i] + position = i + len(seq) + event, discard, event_id = _parse_event( + raw=block, + decoder=decoder, + sentinel=sentinel, + event_id=event_id, + data_required=data_required, + ) + if event is not None: + yield event + if discard: + return + + if position > 0: + buffer = buffer[position:] + position = 0 + + event, discard, _ = _parse_event( + raw=buffer, + decoder=decoder, + sentinel=sentinel, + event_id=event_id, + data_required=data_required, + ) + if event is not None: + yield event + finally: + response.close() def _parse_event( @@ -238,7 +254,7 @@ def _parse_event( lines = re.split(r"\r?\n|\r", block) publish = False event = ServerEvent() - data = "" + data_parts: List[str] = [] for line in lines: if not line: continue @@ -259,7 +275,7 @@ def _parse_event( event.event = value publish = True elif field == "data": - data += value + "\n" + data_parts.append(value) publish = True elif field == "id": publish = True @@ -271,16 +287,17 @@ def _parse_event( publish = True event.id = event_id + has_data = bool(data_parts) + data = "\n".join(data_parts) - if sentinel and data == f"{sentinel}\n": + if sentinel and has_data and data == sentinel: return None, True, event_id # Skip data-less events when data is required - if not data and publish and data_required: + if not has_data and publish and data_required: return None, False, event_id - if data: - data = data[:-1] + if has_data: try: event.data = json.loads(data) except json.JSONDecodeError: @@ -291,7 +308,7 @@ def _parse_event( out_dict = { k: v for k, v in asdict(event).items() - if v is not None or (k == "data" and data) + if v is not None or (k == "data" and has_data) } out = decoder(json.dumps(out_dict)) diff --git a/sdks/outpost-python/src/outpost_sdk/utils/forms.py b/sdks/outpost-python/src/outpost_sdk/utils/forms.py index f961e76b..fdf0dc9b 100644 --- a/sdks/outpost-python/src/outpost_sdk/utils/forms.py +++ b/sdks/outpost-python/src/outpost_sdk/utils/forms.py @@ -1,5 +1,6 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" +import io from typing import ( Any, Dict, @@ -103,6 +104,10 @@ def _extract_file_properties(file_obj: Any) -> Tuple[str, Any, Any]: if file_metadata.content: content = getattr(file_obj, file_field_name, None) + if isinstance(content, io.TextIOBase): + content = content.read().encode( + getattr(content, "encoding", None) or "utf-8" + ) elif file_field_name == "content_type": content_type = getattr(file_obj, file_field_name, None) else: diff --git a/sdks/outpost-python/src/outpost_sdk/utils/requestbodies.py b/sdks/outpost-python/src/outpost_sdk/utils/requestbodies.py index 1de32b6d..591415af 100644 --- a/sdks/outpost-python/src/outpost_sdk/utils/requestbodies.py +++ b/sdks/outpost-python/src/outpost_sdk/utils/requestbodies.py @@ -46,6 +46,7 @@ def serialize_request_body( if re.match(r"^(application|text)\/([^+]+\+)*json.*", media_type) is not None: serialized_request_body.content = marshal_json(request_body, request_body_type) + elif re.match(r"^multipart\/.*", media_type) is not None: ( serialized_request_body.media_type, diff --git a/sdks/outpost-python/src/outpost_sdk/utils/retries.py b/sdks/outpost-python/src/outpost_sdk/utils/retries.py index af07d4e9..bab2066f 100644 --- a/sdks/outpost-python/src/outpost_sdk/utils/retries.py +++ b/sdks/outpost-python/src/outpost_sdk/utils/retries.py @@ -93,6 +93,21 @@ def _parse_retry_after_header(response: httpx.Response) -> Optional[int]: return None +def _parse_retry_after_ms_header(response: httpx.Response) -> Optional[int]: + retry_after_ms_header = response.headers.get("retry-after-ms") + if not retry_after_ms_header: + return None + + try: + milliseconds = float(retry_after_ms_header) + if milliseconds >= 0: + return round(milliseconds) + except (OverflowError, ValueError): + pass + + return None + + def _get_sleep_interval( exception: Exception, initial_interval: int, @@ -234,6 +249,10 @@ def retry_with_backoff( raise + if isinstance(exception, TemporaryError): + retry_after_ms = _parse_retry_after_ms_header(exception.response) + if retry_after_ms is not None: + exception.retry_after = retry_after_ms sleep = _get_sleep_interval( exception, initial_interval, max_interval, exponent, retries ) @@ -264,6 +283,10 @@ async def retry_with_backoff_async( raise + if isinstance(exception, TemporaryError): + retry_after_ms = _parse_retry_after_ms_header(exception.response) + if retry_after_ms is not None: + exception.retry_after = retry_after_ms sleep = _get_sleep_interval( exception, initial_interval, max_interval, exponent, retries ) diff --git a/sdks/outpost-python/src/outpost_sdk/utils/serializers.py b/sdks/outpost-python/src/outpost_sdk/utils/serializers.py index d2149f8b..1031ed93 100644 --- a/sdks/outpost-python/src/outpost_sdk/utils/serializers.py +++ b/sdks/outpost-python/src/outpost_sdk/utils/serializers.py @@ -4,7 +4,7 @@ import functools import json import typing -from typing import Any, Dict, List, Tuple, Union, get_args +from typing import Any, Dict, Iterable, List, Mapping, Tuple, Union, get_args import typing_extensions from typing_extensions import get_origin @@ -113,10 +113,12 @@ def validate(c): def unmarshal_json(raw, typ: Any) -> Any: - return unmarshal(from_json(raw), typ) + return unmarshal(from_json(raw), typ, coerce_iterables=False) -def unmarshal(val, typ: Any) -> Any: +def unmarshal(val, typ: Any, coerce_iterables: bool = True) -> Any: + if coerce_iterables: + val = _coerce_iterables_for_type(val, typ) unmarshaller = create_model( "Unmarshaller", body=(typ, ...), @@ -193,9 +195,88 @@ def get_pydantic_model(data: Any, typ: Any) -> Any: if not _contains_pydantic_model(data): return unmarshal(data, typ) + return _coerce_iterables_for_type(data, typ) + + +def _coerce_iterables_for_type(data: Any, typ: Any) -> Any: + if data is None or isinstance(data, (BaseModel, Unset)): + return data + + typ = _resolve_type_alias(typ) + origin = get_origin(typ) + + if _is_annotated_type(origin): + args = get_args(typ) + return _coerce_iterables_for_type(data, args[0]) if args else data + + if is_union(origin): + for arg in (arg for arg in get_args(typ) if arg is not type(None)): + coerced = _coerce_iterables_for_type(data, arg) + if coerced is not data: + return coerced + return data + + if _is_list_type(typ): + item_type = get_args(typ)[0] if get_args(typ) else Any + if isinstance(data, (str, bytes, bytearray, Mapping)): + return data + if isinstance(data, Iterable): + return [_coerce_iterables_for_type(item, item_type) for item in data] + return data + + if _is_mapping_type(typ): + value_type = get_args(typ)[1] if len(get_args(typ)) > 1 else Any + if isinstance(data, Mapping): + return { + key: _coerce_iterables_for_type(value, value_type) + for key, value in data.items() + } + return data + + if _is_pydantic_model_type(typ) and isinstance(data, Mapping): + coerced = None + for field_name, field in typ.model_fields.items(): + field_type = field.annotation + for key in (field_name, field.alias): + if key is not None and key in data: + value = data[key] if coerced is None else coerced[key] + coerced_value = _coerce_iterables_for_type(value, field_type) + if coerced_value is not value: + if coerced is None: + coerced = dict(data) + coerced[key] = coerced_value + return coerced if coerced is not None else data + return data +def _resolve_type_alias(typ: Any) -> Any: + return getattr(typ, "__value__", typ) + + +def _is_annotated_type(origin: Any) -> bool: + return any( + origin is typing_obj + for typing_obj in _get_typing_objects_by_name_of("Annotated") + ) + + +def _is_list_type(typ: Any) -> bool: + typ = _resolve_type_alias(typ) + return typ is list or get_origin(typ) is list + + +def _is_mapping_type(typ: Any) -> bool: + typ = _resolve_type_alias(typ) + origin = get_origin(typ) + mapping_origin = get_origin(Mapping[Any, Any]) + return typ in (dict, Dict, Mapping) or origin in (dict, Mapping, mapping_origin) + + +def _is_pydantic_model_type(typ: Any) -> bool: + return isinstance(typ, type) and issubclass(typ, BaseModel) + + def _contains_pydantic_model(data: Any) -> bool: if isinstance(data, BaseModel): return True diff --git a/sdks/outpost-typescript/.speakeasy/gen.lock b/sdks/outpost-typescript/.speakeasy/gen.lock index 20b8176a..43cb6014 100644 --- a/sdks/outpost-typescript/.speakeasy/gen.lock +++ b/sdks/outpost-typescript/.speakeasy/gen.lock @@ -1,26 +1,26 @@ lockVersion: 2.0.0 id: edb58086-83b9-45a3-9095-52bf57a11009 management: - docChecksum: 470afcaf2b59cadf7c023fcf357b65ca + docChecksum: 6a334158a637f335e7e0966f24c17c76 docVersion: 0.0.1 - speakeasyVersion: 1.768.2 - generationVersion: 2.889.1 - releaseVersion: 1.4.0 - configChecksum: 5e4ba798de3a7b387f8d1f953094054c + speakeasyVersion: 1.780.0 + generationVersion: 2.906.0 + releaseVersion: 1.4.1 + configChecksum: 49ca5a5ce85e0e93f508b5c168150627 repoURL: https://github.com/hookdeck/outpost.git repoSubDirectory: sdks/outpost-typescript installationURL: https://github.com/hookdeck/outpost published: true persistentEdits: - generation_id: fc97ef97-a604-428f-bc39-81d367e68e12 - pristine_commit_hash: 55ca5eb615d9cd85736c4ed8dda2d444be31353f - pristine_tree_hash: 65a710fa3d8859f2d39b6386da9579645d6c19f3 + generation_id: 62d6dad2-0ff2-4d8c-9ac3-ffad26456377 + pristine_commit_hash: df658454560cb0602765eeba750e771b77a8ed88 + pristine_tree_hash: 45ce2176a04358f2de63878428fac3db30378a32 features: typescript: additionalDependencies: 0.1.0 additionalProperties: 0.1.3 constsAndDefaults: 0.1.14 - core: 3.27.0 + core: 3.31.1 defaultEnabledRetries: 0.1.0 enumUnions: 0.1.0 envVarSecurityUsage: 0.1.2 @@ -34,7 +34,7 @@ features: nameOverrides: 2.81.4 nullables: 0.1.1 responseFormat: 0.3.0 - retries: 2.83.0 + retries: 2.83.1 sdkHooks: 0.4.0 unions: 2.86.4 trackedFiles: @@ -348,8 +348,8 @@ trackedFiles: pristine_git_object: a059479fd884b79d3d0ece45249299ff92b74047 docs/models/components/managedconfig.md: id: f5084f1c1f7a - last_write_checksum: sha1:ebb5b3761b9e551a5e88380af6baf6d2ff88b2a9 - pristine_git_object: 54635f0036ee132ea15f02aa1a1a86a446354818 + last_write_checksum: sha1:266db67eb27969a1349b4394a6958f0cbee03296 + pristine_git_object: bc76df3eedc0a3f745f9f02a82220d5827a88204 docs/models/components/metricsdatapoint.md: id: dfbc8ed48932 last_write_checksum: sha1:98cd730d46794e7aef19d65e365d7b6f89176487 @@ -904,12 +904,12 @@ trackedFiles: pristine_git_object: c9a9042272cbc4b2cf7ae93f82d4ea8a7d25bba2 jsr.json: id: 7f6ab7767282 - last_write_checksum: sha1:fb22447a864e48bf40bd764aae6773c6211c3419 - pristine_git_object: b3fb16addfeffad141cb1e91bf4b7cc2b7266c48 + last_write_checksum: sha1:abb467bc0d4ae8e5453eb6f818057597540c9536 + pristine_git_object: c819ded5d1d43d918eaab1d40b151f7bf8be0852 package.json: id: 7030d0b2f71b - last_write_checksum: sha1:7ea45be7fdb354c8946c771281f7600228c9eceb - pristine_git_object: 9fbf2f820b4c5cec2cb1ee1eec28467d792caeb1 + last_write_checksum: sha1:45da602108ed7ecff48b84334d84339f273c13a5 + pristine_git_object: 59939cafee7b4d1f45dc3addbcfaca0904f69ec8 src/core.ts: id: f431fdbcd144 last_write_checksum: sha1:c858d8ea76a86c428e26943bf348319ba0a3c865 @@ -1040,8 +1040,8 @@ trackedFiles: pristine_git_object: f60ec7acd76141a71d78008c5a362eb0236d8335 src/hooks/types.ts: id: 2a02d86ec24f - last_write_checksum: sha1:29372122898cc523fa47576f3f6608a28ec6080e - pristine_git_object: 8bfe4fe8137138decea7af0a5ed791bf01201789 + last_write_checksum: sha1:da18f72efc4b8bef7912bc70fc6166b4be2f8a95 + pristine_git_object: 5ffda46a9def49d060911f29656c75d88095bcdd src/index.ts: id: c5fb850250c7 last_write_checksum: sha1:35c9cde3ae14b18b3f893a1afe8b6c44f8760f24 @@ -1052,16 +1052,12 @@ trackedFiles: pristine_git_object: 0aebd8b0a4867e35cb3348fc52921c3c0b4725b7 src/lib/config.ts: id: 320761608fb3 - last_write_checksum: sha1:f783b09e39aead9020e30a406b5fd7d2dd83fb3b - pristine_git_object: 3e5ea30f9c600fc806984221cffed1e92c1c2090 - src/lib/dlv.ts: - id: b1988214835a - last_write_checksum: sha1:1dd3e3fbb4550c4bf31f5ef997faff355d6f3250 - pristine_git_object: e81091f5e536f82739f71379b1fddc2d147c49e2 + last_write_checksum: sha1:348c6f0aec3bc8536fa2d4bd0201421b55cba92c + pristine_git_object: 82d5fe064e2f88d0092af8e7a8ae0677dba54031 src/lib/encodings.ts: id: 3bd8ead98afd - last_write_checksum: sha1:d47614c415b37e092965c34cb668562195701004 - pristine_git_object: 2791d25bc4f7cf6eec17a65f899851e225fa3deb + last_write_checksum: sha1:50d9b187dcfc3cca8d3bbd9fe074f865d715d2b0 + pristine_git_object: dcab511b4b4d98f1e4b7dd94866e2b41c478b7f0 src/lib/files.ts: id: e5efa54fcb95 last_write_checksum: sha1:795c14026405d547bfc47012f7ad9666e530fa7f @@ -1070,34 +1066,30 @@ trackedFiles: id: 63a80782d37e last_write_checksum: sha1:797cbf16d3c7c4d62d3ba0eedb08617524938457 pristine_git_object: 13cf1fd7894a89f727b8d2db2ad24313a94f68c7 - src/lib/is-plain-object.ts: - id: b9862591096a - last_write_checksum: sha1:df687f25a9590b6fd95d39df41a652ae3fd4e517 - pristine_git_object: 61070d3d7c7e5e95b1ed7e7ea21869eb0767db77 src/lib/logger.ts: id: 7ee7741a02bf last_write_checksum: sha1:0ec9d3a2a34c362746b767e4f9a746c055d57a7b pristine_git_object: d181f2937d4128afbe9b0327e0f81d1fa9c877b7 src/lib/matchers.ts: id: d54b2253b719 - last_write_checksum: sha1:32bda3887292d2b0430bb6688982e34038342919 - pristine_git_object: b7ef1986eaa94795a3b1a7409e8aeed6591a11e6 + last_write_checksum: sha1:43e3184df0c1dc3d7ba2d50ccdd7655d3a6697ce + pristine_git_object: efc0928ae61beebe1eff5f15c0cc1305fcbaf194 src/lib/primitives.ts: id: 74859f750b28 - last_write_checksum: sha1:987869fc54790b9c22e9182099103d6aa7c67016 - pristine_git_object: d21f1dc49affa4e6d324bdd60811b470fdfa7eb6 + last_write_checksum: sha1:fe3abb7d6b61596e346873519bcec9b2eaa61467 + pristine_git_object: 8ce65db0f7c0d6b68f5edc3ebf518121e284e954 src/lib/retries.ts: id: b24a69d15639 - last_write_checksum: sha1:f3da74dffcbe2756c69393f8600205aa1dc06e68 - pristine_git_object: e3ce9aba72150fc3c18f3105d39b21aba809377b + last_write_checksum: sha1:42c8f6cc4c875be236230a8c760f4f32d8c1ab68 + pristine_git_object: 21a647e1e9ae64817fcd63b5dd6bb5a51b63d225 src/lib/schemas.ts: id: deb4b531fae1 last_write_checksum: sha1:209cfaabfa7fc1c1310f97453215cb0755619c6e pristine_git_object: 47edb9725c2482c667e2ddc8a56b1fec4285c492 src/lib/sdks.ts: id: 8a6d91f1218d - last_write_checksum: sha1:943004827f7fea73bdfa36dc958658450b7ca267 - pristine_git_object: 79d433bddc7dcd83160e704c396b9a2b418b40af + last_write_checksum: sha1:b759eaea4ae69dbc76a50b932cfcb2afbff6400b + pristine_git_object: 05c4bb944f9461ce823d5c93cfc4287b32454443 src/lib/security.ts: id: 0502afa7922e last_write_checksum: sha1:42da73a553537a91dd08a52efa9e6b592f515b5f @@ -1132,8 +1124,8 @@ trackedFiles: pristine_git_object: 0955a573c2ce989d63c737410ab8cc28706d9f74 src/mcp-server/mcp-server.ts: id: aabbc4ab07c1 - last_write_checksum: sha1:976d2a0b644967e4bf05154452bda2da8cd91c6e - pristine_git_object: 5641b3206de9683fd80918ce16a962d65ff03f2a + last_write_checksum: sha1:08ad21b2be6f78a9e903ea2c6af1b822c0c29526 + pristine_git_object: 635d493f573778a4ca59f8eee36db33657c6e4af src/mcp-server/prompts.ts: id: 26f3d73cbf31 last_write_checksum: sha1:3472c8babea2d3b44d3a61e42fbba471fbd936b7 @@ -1148,8 +1140,8 @@ trackedFiles: pristine_git_object: c25696d4c4f70e081fa5d87ad6891874c509a577 src/mcp-server/server.ts: id: 2784dd48e82a - last_write_checksum: sha1:a8ac93eb2400d41367e83d4d1bf5f5ddd19c84be - pristine_git_object: 103ea620607b7fcd8de6acadf164292e295a9dec + last_write_checksum: sha1:1f765f8f51c4e2d731838b430c13158ff4659581 + pristine_git_object: daddfd3b8e9514c479b7596fa04b8133e584d4af src/mcp-server/shared.ts: id: 074e80d4be1e last_write_checksum: sha1:d89576cea2bef3856b7fc3e65b868875528be042 @@ -1532,8 +1524,8 @@ trackedFiles: pristine_git_object: 8ef1965cf279a8d8b5aca7093981332e93312c60 src/models/components/managedconfig.ts: id: f3c9dfef76a1 - last_write_checksum: sha1:8185e1befb628d03c8b45c3d647d5cf9c7886d3e - pristine_git_object: 9531eb0fd8902066bd7f3f44ced6ea86166cd455 + last_write_checksum: sha1:a9937cb94562811387e3065257942cb68e2c7dbd + pristine_git_object: bb87e48c0f6795d170ecf96d73d4a197fa3b459a src/models/components/metricsdatapoint.ts: id: 55e9f7c3cc30 last_write_checksum: sha1:3c1a228845dc83f0b1ea5eb00f807a510fcdd5b4 @@ -2452,9 +2444,7 @@ examples: application/json: {} examplesVersion: 1.0.2 generatedTests: {} -releaseNotes: | - ## Typescript SDK Changes: - * `outpost.destinations.update()`: `request.body` **Changed** (Breaking ⚠️) +releaseNotes: "## Typescript SDK Changes:\n* `outpost.configuration.getManagedConfig()`: `response` **Changed** (Breaking ⚠️)\n* `outpost.configuration.updateManagedConfig()`: \n * `request` **Changed** (Breaking ⚠️)\n * `response` **Changed** (Breaking ⚠️)\n" generatedFiles: - .gitattributes - .npmignore diff --git a/sdks/outpost-typescript/.speakeasy/gen.yaml b/sdks/outpost-typescript/.speakeasy/gen.yaml index 06b7c7f0..8a0d88e0 100644 --- a/sdks/outpost-typescript/.speakeasy/gen.yaml +++ b/sdks/outpost-typescript/.speakeasy/gen.yaml @@ -29,7 +29,7 @@ generation: generateNewTests: false skipResponseBodyAssertions: false typescript: - version: 1.4.0 + version: 1.4.1 acceptHeaderEnum: true additionalDependencies: dependencies: {} @@ -38,6 +38,7 @@ typescript: additionalPackageJSON: {} additionalScripts: {} alwaysIncludeInboundAndOutbound: false + apiPromiseHelpers: false author: Speakeasy baseErrorName: OutpostError clientServerStatusCodesAsErrors: true @@ -47,6 +48,7 @@ typescript: enableMCPServer: true enableReactQuery: false enumFormat: union + eventStreamClassName: EventStream exportZodModelNamespace: false fixEnumNameSanitization: false flatAdditionalProperties: false @@ -79,6 +81,7 @@ typescript: preApplyUnionDiscriminators: true preserveModelFieldNames: false privateIdentifierPrefix: '#' + requestExtras: false responseFormat: flat sseFlatResponse: false templateVersion: v2 diff --git a/sdks/outpost-typescript/RELEASES.md b/sdks/outpost-typescript/RELEASES.md index b39f5599..d20ac60e 100644 --- a/sdks/outpost-typescript/RELEASES.md +++ b/sdks/outpost-typescript/RELEASES.md @@ -178,4 +178,14 @@ Based on: ### Generated - [typescript v1.4.0] sdks/outpost-typescript ### Releases -- [NPM v1.4.0] https://www.npmjs.com/package/@hookdeck/outpost-sdk/v/1.4.0 - sdks/outpost-typescript \ No newline at end of file +- [NPM v1.4.0] https://www.npmjs.com/package/@hookdeck/outpost-sdk/v/1.4.0 - sdks/outpost-typescript + +## 2026-06-16 18:54:28 +### Changes +Based on: +- OpenAPI Doc +- Speakeasy CLI 1.780.0 (2.906.0) https://github.com/speakeasy-api/speakeasy +### Generated +- [typescript v1.4.1] sdks/outpost-typescript +### Releases +- [NPM v1.4.1] https://www.npmjs.com/package/@hookdeck/outpost-sdk/v/1.4.1 - sdks/outpost-typescript \ No newline at end of file diff --git a/sdks/outpost-typescript/docs/models/components/managedconfig.md b/sdks/outpost-typescript/docs/models/components/managedconfig.md index 54635f00..bc76df3e 100644 --- a/sdks/outpost-typescript/docs/models/components/managedconfig.md +++ b/sdks/outpost-typescript/docs/models/components/managedconfig.md @@ -21,8 +21,8 @@ let value: ManagedConfig = { | Field | Type | Required | Description | | -------------------------------------------------- | -------------------------------------------------- | -------------------------------------------------- | -------------------------------------------------- | | `alertAutoDisableDestination` | *string* | :heavy_minus_sign: | N/A | -| `alertCallbackUrl` | *string* | :heavy_minus_sign: | N/A | | `alertConsecutiveFailureCount` | *string* | :heavy_minus_sign: | N/A | +| `alertExhaustedRetriesWindowSeconds` | *string* | :heavy_minus_sign: | N/A | | `deliveryTimeoutSeconds` | *string* | :heavy_minus_sign: | N/A | | `destinationsAwsKinesisMetadataInPayload` | *string* | :heavy_minus_sign: | N/A | | `destinationsIncludeMillisecondTimestamp` | *string* | :heavy_minus_sign: | N/A | @@ -44,7 +44,6 @@ let value: ManagedConfig = { | `idgenEventPrefix` | *string* | :heavy_minus_sign: | N/A | | `idgenType` | *string* | :heavy_minus_sign: | N/A | | `maxDestinationsPerTenant` | *string* | :heavy_minus_sign: | N/A | -| `organizationName` | *string* | :heavy_minus_sign: | N/A | | `portalBrandColor` | *string* | :heavy_minus_sign: | N/A | | `portalDisableOutpostBranding` | *string* | :heavy_minus_sign: | N/A | | `portalFaviconUrl` | *string* | :heavy_minus_sign: | N/A | diff --git a/sdks/outpost-typescript/examples/package-lock.json b/sdks/outpost-typescript/examples/package-lock.json index ece97076..3db6b8ae 100644 --- a/sdks/outpost-typescript/examples/package-lock.json +++ b/sdks/outpost-typescript/examples/package-lock.json @@ -18,7 +18,7 @@ }, "..": { "name": "@hookdeck/outpost-sdk", - "version": "1.4.0", + "version": "1.4.1", "dependencies": { "@modelcontextprotocol/sdk": "^1.26.0", "zod": "^3.25.0 || ^4.0.0" diff --git a/sdks/outpost-typescript/jsr.json b/sdks/outpost-typescript/jsr.json index b3fb16ad..c819ded5 100644 --- a/sdks/outpost-typescript/jsr.json +++ b/sdks/outpost-typescript/jsr.json @@ -2,7 +2,7 @@ { "name": "@hookdeck/outpost-sdk", - "version": "1.4.0", + "version": "1.4.1", "exports": { ".": "./src/index.ts", "./models/errors": "./src/models/errors/index.ts", diff --git a/sdks/outpost-typescript/package-lock.json b/sdks/outpost-typescript/package-lock.json index d887e13b..cb38e22b 100644 --- a/sdks/outpost-typescript/package-lock.json +++ b/sdks/outpost-typescript/package-lock.json @@ -1,12 +1,12 @@ { "name": "@hookdeck/outpost-sdk", - "version": "1.4.0", + "version": "1.4.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@hookdeck/outpost-sdk", - "version": "1.4.0", + "version": "1.4.1", "dependencies": { "@modelcontextprotocol/sdk": "^1.26.0", "zod": "^3.25.0 || ^4.0.0" diff --git a/sdks/outpost-typescript/package.json b/sdks/outpost-typescript/package.json index 9fbf2f82..59939caf 100644 --- a/sdks/outpost-typescript/package.json +++ b/sdks/outpost-typescript/package.json @@ -1,6 +1,6 @@ { "name": "@hookdeck/outpost-sdk", - "version": "1.4.0", + "version": "1.4.1", "author": "Speakeasy", "type": "module", "bin": { diff --git a/sdks/outpost-typescript/src/hooks/types.ts b/sdks/outpost-typescript/src/hooks/types.ts index 8bfe4fe8..5ffda46a 100644 --- a/sdks/outpost-typescript/src/hooks/types.ts +++ b/sdks/outpost-typescript/src/hooks/types.ts @@ -15,6 +15,7 @@ export type HookContext = { retryConfig: RetryConfig; resolvedSecurity: SecurityState | null; options: SDKOptions; + timeoutMs?: number; }; export type Awaitable = T | Promise; diff --git a/sdks/outpost-typescript/src/lib/config.ts b/sdks/outpost-typescript/src/lib/config.ts index 3e5ea30f..82d5fe06 100644 --- a/sdks/outpost-typescript/src/lib/config.ts +++ b/sdks/outpost-typescript/src/lib/config.ts @@ -65,8 +65,8 @@ export function serverURLFromOptions(options: SDKOptions): URL | null { export const SDK_METADATA = { language: "typescript", openapiDocVersion: "0.0.1", - sdkVersion: "1.4.0", - genVersion: "2.889.1", + sdkVersion: "1.4.1", + genVersion: "2.906.0", userAgent: - "speakeasy-sdk/typescript 1.4.0 2.889.1 0.0.1 @hookdeck/outpost-sdk", + "speakeasy-sdk/typescript 1.4.1 2.906.0 0.0.1 @hookdeck/outpost-sdk", } as const; diff --git a/sdks/outpost-typescript/src/lib/dlv.ts b/sdks/outpost-typescript/src/lib/dlv.ts deleted file mode 100644 index e81091f5..00000000 --- a/sdks/outpost-typescript/src/lib/dlv.ts +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. - */ - -/* -MIT License - -Copyright (c) 2024 Jason Miller (http://jasonformat.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -/** - * @param obj The object to walk - * @param key The key path to walk the object with - * @param def A default value to return if the result is undefined - * - * @example - * dlv(obj, "a.b.c.d") - * @example - * dlv(object, ["a", "b", "c", "d"]) - * @example - * dlv(object, "foo.bar.baz", "Hello, default value!") - */ -export function dlv( - obj: any, - key: string | string[], - def?: T, - p?: number, - undef?: never, -): T | undefined { - key = Array.isArray(key) ? key : key.split("."); - for (p = 0; p < key.length; p++) { - const k = key[p]; - obj = k != null && obj ? obj[k] : undef; - } - return obj === undef ? def : obj; -} diff --git a/sdks/outpost-typescript/src/lib/encodings.ts b/sdks/outpost-typescript/src/lib/encodings.ts index 2791d25b..dcab511b 100644 --- a/sdks/outpost-typescript/src/lib/encodings.ts +++ b/sdks/outpost-typescript/src/lib/encodings.ts @@ -3,7 +3,7 @@ */ import { bytesToBase64 } from "./base64.js"; -import { isPlainObject } from "./is-plain-object.js"; +import { isPlainObject } from "./primitives.js"; export class EncodingError extends Error { constructor(message: string) { diff --git a/sdks/outpost-typescript/src/lib/is-plain-object.ts b/sdks/outpost-typescript/src/lib/is-plain-object.ts deleted file mode 100644 index 61070d3d..00000000 --- a/sdks/outpost-typescript/src/lib/is-plain-object.ts +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. - */ - -/* -MIT License - -Copyright (c) Sindre Sorhus (https://sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -// Taken from https://github.com/sindresorhus/is-plain-obj/blob/97f38e8836f86a642cce98fc6ab3058bc36df181/index.js - -export function isPlainObject(value: unknown): value is object { - if (typeof value !== "object" || value === null) { - return false; - } - - const prototype = Object.getPrototypeOf(value); - return ( - (prototype === null || - prototype === Object.prototype || - Object.getPrototypeOf(prototype) === null) && - !(Symbol.toStringTag in value) && - !(Symbol.iterator in value) - ); -} diff --git a/sdks/outpost-typescript/src/lib/matchers.ts b/sdks/outpost-typescript/src/lib/matchers.ts index b7ef1986..efc0928a 100644 --- a/sdks/outpost-typescript/src/lib/matchers.ts +++ b/sdks/outpost-typescript/src/lib/matchers.ts @@ -6,7 +6,7 @@ import { APIError } from "../models/errors/apierror.js"; import { ResponseValidationError } from "../models/errors/responsevalidationerror.js"; import { ERR, OK, Result } from "../types/fp.js"; import { matchResponse, matchStatusCode, StatusCodePredicate } from "./http.js"; -import { isPlainObject } from "./is-plain-object.js"; +import { isPlainObject } from "./primitives.js"; export type Encoding = | "jsonl" diff --git a/sdks/outpost-typescript/src/lib/primitives.ts b/sdks/outpost-typescript/src/lib/primitives.ts index d21f1dc4..8ce65db0 100644 --- a/sdks/outpost-typescript/src/lib/primitives.ts +++ b/sdks/outpost-typescript/src/lib/primitives.ts @@ -148,3 +148,19 @@ export function allRequired>( return v as ReturnType>; } + +export function isPlainObject( + value: unknown, +): value is Record { + if (value === null || typeof value !== "object") return false; + if (Object.prototype.toString.call(value) !== "[object Object]") return false; + const proto = Object.getPrototypeOf(value); + if (proto === null || proto === Object.prototype) return true; + // cross-realm plain objects (vm contexts, iframes) inherit from a + // different realm's Object.prototype, which itself has a null prototype + try { + return Object.getPrototypeOf(proto) === null; + } catch { + return false; + } +} diff --git a/sdks/outpost-typescript/src/lib/retries.ts b/sdks/outpost-typescript/src/lib/retries.ts index e3ce9aba..21a647e1 100644 --- a/sdks/outpost-typescript/src/lib/retries.ts +++ b/sdks/outpost-typescript/src/lib/retries.ts @@ -194,6 +194,14 @@ async function retryBackoff( } function retryIntervalFromResponse(res: Response): number { + const retryAfterMsVal = res.headers.get("retry-after-ms"); + if (retryAfterMsVal) { + const parsedMs = Number(retryAfterMsVal); + if (Number.isFinite(parsedMs) && parsedMs >= 0) { + return parsedMs; + } + } + const retryVal = res.headers.get("retry-after") || ""; if (!retryVal) { return 0; diff --git a/sdks/outpost-typescript/src/lib/sdks.ts b/sdks/outpost-typescript/src/lib/sdks.ts index 79d433bd..05c4bb94 100644 --- a/sdks/outpost-typescript/src/lib/sdks.ts +++ b/sdks/outpost-typescript/src/lib/sdks.ts @@ -23,6 +23,7 @@ import { matchContentType, } from "./http.js"; import { Logger } from "./logger.js"; +import { combineSignals } from "./primitives.js"; import { retry, RetryConfig } from "./retries.js"; import { SecurityState } from "./security.js"; @@ -128,27 +129,55 @@ export class ClientSDK { if (path) { baseURL.pathname = baseURL.pathname.replace(/\/+$/, "") + "/"; reqURL = new URL(path, baseURL); + if (!reqURL.search && baseURL.search) { + reqURL.search = baseURL.search; + } } else { reqURL = baseURL; } reqURL.hash = ""; - let finalQuery = query || ""; - - const secQuery: string[] = []; - for (const [k, v] of Object.entries(security?.queryParams || {})) { - const q = encodeForm(k, v, { charEncoding: "percent" }); - if (typeof q !== "undefined") { - secQuery.push(q); + // Appends already-encoded query pairs to a query string, replacing any + // existing pairs with the same key so later sources take precedence. + const mergeQuery = (current: string, additions: string): string => { + if (!additions) { + return current; } - } - if (secQuery.length) { - finalQuery += `&${secQuery.join("&")}`; - } + const additionKeys = new Set( + additions + .split("&") + .filter((pair) => pair !== "") + .map((pair) => pair.split("=")[0] ?? ""), + ); + const kept = current.split("&").filter((pair) => { + return pair !== "" && !additionKeys.has(pair.split("=")[0] ?? ""); + }); + return [...kept, additions].join("&"); + }; + + const encodeQueryRecord = (record: Record): string => { + return Object.entries(record) + .map(([k, v]) => { + if (v == null) { + return undefined; + } + const value = v; + return encodeForm(k, value, { + explode: Array.isArray(value), + charEncoding: "percent", + }); + }) + .filter((pair): pair is string => typeof pair !== "undefined") + .join("&"); + }; + + const finalQuery = [ + query || "", + encodeQueryRecord(security?.queryParams || {}), + ].reduce(mergeQuery, reqURL.search.slice(1)); if (finalQuery) { - const q = finalQuery.startsWith("&") ? finalQuery.slice(1) : finalQuery; - reqURL.search = `?${q}`; + reqURL.search = `?${finalQuery}`; } const headers = new Headers(opHeaders); @@ -194,9 +223,8 @@ export class ClientSDK { ...options?.fetchOptions, ...options, }; - if (!fetchOptions?.signal && conf.timeoutMs && conf.timeoutMs > 0) { - const timeoutSignal = AbortSignal.timeout(conf.timeoutMs); - fetchOptions.signal = timeoutSignal; + if (!fetchOptions?.signal && conf.timeoutMs != null && conf.timeoutMs > 0) { + context.timeoutMs = conf.timeoutMs; } if (conf.body instanceof ReadableStream) { @@ -243,10 +271,19 @@ export class ClientSDK { > > { const { context, isErrorStatusCode } = options; + const timeoutMs = context.timeoutMs; return retry( async () => { - const req = await this.#hooks.beforeRequest(context, request.clone()); + const cloned = request.clone(); + let attempt = cloned; + if (timeoutMs != null && timeoutMs > 0) { + const timeoutSignal = AbortSignal.timeout(timeoutMs); + const combined = combineSignals(cloned.signal, timeoutSignal) + ?? timeoutSignal; + attempt = new Request(cloned, { signal: combined }); + } + const req = await this.#hooks.beforeRequest(context, attempt); await logRequest(this.#logger, req).catch((e) => this.#logger?.log("Failed to log request:", e) ); diff --git a/sdks/outpost-typescript/src/mcp-server/mcp-server.ts b/sdks/outpost-typescript/src/mcp-server/mcp-server.ts index 5641b320..635d493f 100644 --- a/sdks/outpost-typescript/src/mcp-server/mcp-server.ts +++ b/sdks/outpost-typescript/src/mcp-server/mcp-server.ts @@ -19,7 +19,7 @@ const routes = buildRouteMap({ export const app = buildApplication(routes, { name: "mcp", versionInfo: { - currentVersion: "1.4.0", + currentVersion: "1.4.1", }, }); diff --git a/sdks/outpost-typescript/src/mcp-server/server.ts b/sdks/outpost-typescript/src/mcp-server/server.ts index 103ea620..daddfd3b 100644 --- a/sdks/outpost-typescript/src/mcp-server/server.ts +++ b/sdks/outpost-typescript/src/mcp-server/server.ts @@ -53,7 +53,7 @@ export function createMCPServer(deps: { }) { const server = new McpServer({ name: "Outpost", - version: "1.4.0", + version: "1.4.1", }); const client = new OutpostCore({ diff --git a/sdks/outpost-typescript/src/models/components/managedconfig.ts b/sdks/outpost-typescript/src/models/components/managedconfig.ts index 9531eb0f..bb87e48c 100644 --- a/sdks/outpost-typescript/src/models/components/managedconfig.ts +++ b/sdks/outpost-typescript/src/models/components/managedconfig.ts @@ -17,8 +17,8 @@ import { SDKValidationError } from "../errors/sdkvalidationerror.js"; */ export type ManagedConfig = { alertAutoDisableDestination?: string | undefined; - alertCallbackUrl?: string | undefined; alertConsecutiveFailureCount?: string | undefined; + alertExhaustedRetriesWindowSeconds?: string | undefined; deliveryTimeoutSeconds?: string | undefined; destinationsAwsKinesisMetadataInPayload?: string | undefined; destinationsIncludeMillisecondTimestamp?: string | undefined; @@ -40,7 +40,6 @@ export type ManagedConfig = { idgenEventPrefix?: string | undefined; idgenType?: string | undefined; maxDestinationsPerTenant?: string | undefined; - organizationName?: string | undefined; portalBrandColor?: string | undefined; portalDisableOutpostBranding?: string | undefined; portalFaviconUrl?: string | undefined; @@ -87,8 +86,8 @@ export const ManagedConfig$inboundSchema: z.ZodType< unknown > = z.object({ ALERT_AUTO_DISABLE_DESTINATION: z.string().optional(), - ALERT_CALLBACK_URL: z.string().optional(), ALERT_CONSECUTIVE_FAILURE_COUNT: z.string().optional(), + ALERT_EXHAUSTED_RETRIES_WINDOW_SECONDS: z.string().optional(), DELIVERY_TIMEOUT_SECONDS: z.string().optional(), DESTINATIONS_AWS_KINESIS_METADATA_IN_PAYLOAD: z.string().optional(), DESTINATIONS_INCLUDE_MILLISECOND_TIMESTAMP: z.string().optional(), @@ -110,7 +109,6 @@ export const ManagedConfig$inboundSchema: z.ZodType< IDGEN_EVENT_PREFIX: z.string().optional(), IDGEN_TYPE: z.string().optional(), MAX_DESTINATIONS_PER_TENANT: z.string().optional(), - ORGANIZATION_NAME: z.string().optional(), PORTAL_BRAND_COLOR: z.string().optional(), PORTAL_DISABLE_OUTPOST_BRANDING: z.string().optional(), PORTAL_FAVICON_URL: z.string().optional(), @@ -151,8 +149,9 @@ export const ManagedConfig$inboundSchema: z.ZodType< }).transform((v) => { return remap$(v, { "ALERT_AUTO_DISABLE_DESTINATION": "alertAutoDisableDestination", - "ALERT_CALLBACK_URL": "alertCallbackUrl", "ALERT_CONSECUTIVE_FAILURE_COUNT": "alertConsecutiveFailureCount", + "ALERT_EXHAUSTED_RETRIES_WINDOW_SECONDS": + "alertExhaustedRetriesWindowSeconds", "DELIVERY_TIMEOUT_SECONDS": "deliveryTimeoutSeconds", "DESTINATIONS_AWS_KINESIS_METADATA_IN_PAYLOAD": "destinationsAwsKinesisMetadataInPayload", @@ -185,7 +184,6 @@ export const ManagedConfig$inboundSchema: z.ZodType< "IDGEN_EVENT_PREFIX": "idgenEventPrefix", "IDGEN_TYPE": "idgenType", "MAX_DESTINATIONS_PER_TENANT": "maxDestinationsPerTenant", - "ORGANIZATION_NAME": "organizationName", "PORTAL_BRAND_COLOR": "portalBrandColor", "PORTAL_DISABLE_OUTPOST_BRANDING": "portalDisableOutpostBranding", "PORTAL_FAVICON_URL": "portalFaviconUrl", @@ -231,8 +229,8 @@ export const ManagedConfig$inboundSchema: z.ZodType< /** @internal */ export type ManagedConfig$Outbound = { ALERT_AUTO_DISABLE_DESTINATION?: string | undefined; - ALERT_CALLBACK_URL?: string | undefined; ALERT_CONSECUTIVE_FAILURE_COUNT?: string | undefined; + ALERT_EXHAUSTED_RETRIES_WINDOW_SECONDS?: string | undefined; DELIVERY_TIMEOUT_SECONDS?: string | undefined; DESTINATIONS_AWS_KINESIS_METADATA_IN_PAYLOAD?: string | undefined; DESTINATIONS_INCLUDE_MILLISECOND_TIMESTAMP?: string | undefined; @@ -254,7 +252,6 @@ export type ManagedConfig$Outbound = { IDGEN_EVENT_PREFIX?: string | undefined; IDGEN_TYPE?: string | undefined; MAX_DESTINATIONS_PER_TENANT?: string | undefined; - ORGANIZATION_NAME?: string | undefined; PORTAL_BRAND_COLOR?: string | undefined; PORTAL_DISABLE_OUTPOST_BRANDING?: string | undefined; PORTAL_FAVICON_URL?: string | undefined; @@ -301,8 +298,8 @@ export const ManagedConfig$outboundSchema: z.ZodType< ManagedConfig > = z.object({ alertAutoDisableDestination: z.string().optional(), - alertCallbackUrl: z.string().optional(), alertConsecutiveFailureCount: z.string().optional(), + alertExhaustedRetriesWindowSeconds: z.string().optional(), deliveryTimeoutSeconds: z.string().optional(), destinationsAwsKinesisMetadataInPayload: z.string().optional(), destinationsIncludeMillisecondTimestamp: z.string().optional(), @@ -324,7 +321,6 @@ export const ManagedConfig$outboundSchema: z.ZodType< idgenEventPrefix: z.string().optional(), idgenType: z.string().optional(), maxDestinationsPerTenant: z.string().optional(), - organizationName: z.string().optional(), portalBrandColor: z.string().optional(), portalDisableOutpostBranding: z.string().optional(), portalFaviconUrl: z.string().optional(), @@ -365,8 +361,9 @@ export const ManagedConfig$outboundSchema: z.ZodType< }).transform((v) => { return remap$(v, { alertAutoDisableDestination: "ALERT_AUTO_DISABLE_DESTINATION", - alertCallbackUrl: "ALERT_CALLBACK_URL", alertConsecutiveFailureCount: "ALERT_CONSECUTIVE_FAILURE_COUNT", + alertExhaustedRetriesWindowSeconds: + "ALERT_EXHAUSTED_RETRIES_WINDOW_SECONDS", deliveryTimeoutSeconds: "DELIVERY_TIMEOUT_SECONDS", destinationsAwsKinesisMetadataInPayload: "DESTINATIONS_AWS_KINESIS_METADATA_IN_PAYLOAD", @@ -399,7 +396,6 @@ export const ManagedConfig$outboundSchema: z.ZodType< idgenEventPrefix: "IDGEN_EVENT_PREFIX", idgenType: "IDGEN_TYPE", maxDestinationsPerTenant: "MAX_DESTINATIONS_PER_TENANT", - organizationName: "ORGANIZATION_NAME", portalBrandColor: "PORTAL_BRAND_COLOR", portalDisableOutpostBranding: "PORTAL_DISABLE_OUTPOST_BRANDING", portalFaviconUrl: "PORTAL_FAVICON_URL",