From 85328ac4f8d33ca9dad877a26084ff766abf0c3f Mon Sep 17 00:00:00 2001 From: Tobias Herber <22559657+herber@users.noreply.github.com> Date: Tue, 3 Mar 2026 16:02:24 +0100 Subject: [PATCH] Accept very very long contents --- bun.lock | 6 +++- service/package.json | 8 ++--- service/src/controllers/functionDeployment.ts | 34 +++++++++++++++++-- 3 files changed, 41 insertions(+), 7 deletions(-) diff --git a/bun.lock b/bun.lock index af3e28f..3fac1ae 100644 --- a/bun.lock +++ b/bun.lock @@ -141,7 +141,7 @@ "@lowerdeck/service": "^1.0.3", "@lowerdeck/slugify": "^1.0.5", "@lowerdeck/snowflake": "^1.0.2", - "@lowerdeck/validation": "^1.0.4", + "@lowerdeck/validation": "^1.0.6", "@metorial-services/forge-client": "^1.0.4", "@prisma/adapter-pg": "^7.2.0", "@prisma/client": "^7.2.0", @@ -2080,6 +2080,8 @@ "@function-bay/nodejs/typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + "@function-bay/types/@lowerdeck/validation": ["@lowerdeck/validation@1.0.6", "", {}, "sha512-5lL09/WC4nttCJ19InxtCKSqd5xDoHkkpdREzoY9jYKFpdhNLudd4NDYmtiOWq9yI709uQjR16S/pI+knx1S1g=="], + "@function-bay/types/typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], "@function-bay/utils/typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], @@ -2244,6 +2246,8 @@ "function-bay/typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + "function-bay-service/@lowerdeck/validation": ["@lowerdeck/validation@1.0.6", "", {}, "sha512-5lL09/WC4nttCJ19InxtCKSqd5xDoHkkpdREzoY9jYKFpdhNLudd4NDYmtiOWq9yI709uQjR16S/pI+knx1S1g=="], + "function-bay-service/@types/bun": ["@types/bun@1.3.10", "", { "dependencies": { "bun-types": "1.3.10" } }, "sha512-0+rlrUrOrTSskibryHbvQkDOWRJwJZqZlxrUs1u4oOoTln8+WIXBPmAuCF35SWB2z4Zl3E84Nl/D0P7803nigQ=="], "function-bay-service/vitest": ["vitest@4.0.17", "", { "dependencies": { "@vitest/expect": "4.0.17", "@vitest/mocker": "4.0.17", "@vitest/pretty-format": "4.0.17", "@vitest/runner": "4.0.17", "@vitest/snapshot": "4.0.17", "@vitest/spy": "4.0.17", "@vitest/utils": "4.0.17", "es-module-lexer": "^1.7.0", "expect-type": "^1.2.2", "magic-string": "^0.30.21", "obug": "^2.1.1", "pathe": "^2.0.3", "picomatch": "^4.0.3", "std-env": "^3.10.0", "tinybench": "^2.9.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tinyrainbow": "^3.0.3", "vite": "^6.0.0 || ^7.0.0", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", "@vitest/browser-playwright": "4.0.17", "@vitest/browser-preview": "4.0.17", "@vitest/browser-webdriverio": "4.0.17", "@vitest/ui": "4.0.17", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@opentelemetry/api", "@types/node", "@vitest/browser-playwright", "@vitest/browser-preview", "@vitest/browser-webdriverio", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg=="], diff --git a/service/package.json b/service/package.json index 30c32ce..d410b2a 100644 --- a/service/package.json +++ b/service/package.json @@ -45,15 +45,15 @@ "@lowerdeck/hash": "^1.0.4", "@lowerdeck/id": "^1.0.6", "@lowerdeck/once": "^1.0.4", - "@lowerdeck/rpc-client": "^1.1.2", - "@lowerdeck/rpc-server": "^1.0.9", "@lowerdeck/pagination": "^1.0.5", "@lowerdeck/queue": "^1.0.7", + "@lowerdeck/rpc-client": "^1.1.2", + "@lowerdeck/rpc-server": "^1.0.9", + "@lowerdeck/sentry": "^1.0.2", "@lowerdeck/service": "^1.0.3", "@lowerdeck/slugify": "^1.0.5", "@lowerdeck/snowflake": "^1.0.2", - "@lowerdeck/sentry": "^1.0.2", - "@lowerdeck/validation": "^1.0.4", + "@lowerdeck/validation": "^1.0.6", "@metorial-services/forge-client": "^1.0.4", "@prisma/adapter-pg": "^7.2.0", "@prisma/client": "^7.2.0", diff --git a/service/src/controllers/functionDeployment.ts b/service/src/controllers/functionDeployment.ts index 59475c5..1376825 100644 --- a/service/src/controllers/functionDeployment.ts +++ b/service/src/controllers/functionDeployment.ts @@ -1,6 +1,6 @@ import { functionBayRuntimeSpec } from '@function-bay/types'; import { Paginator } from '@lowerdeck/pagination'; -import { v } from '@lowerdeck/validation'; +import { createValidator, v, type ValidatorOptions } from '@lowerdeck/validation'; import { functionDeploymentPresenter, functionDeploymentStepPresenter } from '../presenters'; import { functionDeploymentService } from '../services'; import { app } from './_app'; @@ -18,6 +18,36 @@ export let functionDeploymentApp = functionApp.use(async ctx => { return { deployment }; }); +let longString = createValidator>('string', (opts, value) => { + if (typeof value != 'string') { + return { + success: false, + errors: [ + { + code: 'invalid_type', + message: opts.message ?? `Invalid input, expected string, received ${typeof value}`, + received: typeof value, + expected: 'string' + } + ] + }; + } + + if (value.length > 50_000_000) { + return { + success: false, + errors: [ + { + code: 'max_length', + message: 'Input is too long' + } + ] + }; + } + + return { success: true, value }; +}); + export let functionDeploymentController = app.controller({ create: functionApp .handler() @@ -39,7 +69,7 @@ export let functionDeploymentController = app.controller({ files: v.array( v.object({ filename: v.string(), - content: v.string(), + content: longString(), encoding: v.optional(v.enumOf(['utf-8', 'base64'])) }) )