Last Updated: 2026-06-09 23:30 Session ID: cloud-functions-implementation Active Feature: feat-011 - Functions - 云函数 (Flexmodel Functions)
-
deno.json— Deno project configuration with Hono.js dependency -
src/types.ts— Full TypeScript type definitions (FunctionMeta, InvokeRequest/Result, Worker messages, etc.) -
src/sdk/flexmodel.ts— RPC Dispatcher (proxies Worker SDK requests to Java REST API) -
src/runner/registry.ts— Function Registry (metadata cache + LRU source cache, lazy load from Java) -
src/runner/worker-entry.ts— Worker internal entry (addEventListener message handling, dynamic import, ctx SDK injection) -
src/runner/worker.ts— Worker executor (create Worker, timeout/terminate, proxy SDK RPC) -
src/router/health.ts— Health check endpoint (GET /health) -
src/router/functions.ts— Functions routes (POST /deploy, DELETE /:projectId/:name, POST /invoke) -
src/server.ts— Hono.js server initialization and route registration -
src/main.ts— Entry point (Deno.serve on configurable port)
- Extended
enum TriggerTypewithHTTP - Added
f_functionmodel (id, project_id, name, slug, description, entry_point, status, current_version, timeout, memory_limit, timestamps, indexes) - Added
f_function_versionmodel (id, function_id, version, source_code, timestamps, index) - Code generation verified —
Function.java,FunctionVersion.java,TriggerType.HTTPgenerated successfully
-
dto/FunctionCreateRequest.java— Create request with validation -
dto/FunctionUpdateRequest.java— Update request DTO -
dto/FunctionInvokeRequest.java— Invocation request (method, headers, body, query) -
dto/FunctionInvokeResponse.java— Invocation response with _meta (executionTimeMs, logs) -
dto/FunctionDeployRequest.java— Deploy request to Deno (metadata only) -
dto/FunctionResponse.java— API response with TriggerRef list -
dto/FunctionVersionResponse.java— Version list response -
dto/FunctionPageRequest.java— Pagination request -
FunctionException.java— Business exception for functions -
FunctionRepository.java— Repository interface -
FunctionFmRepository.java— Repository implementation (AbstractRepository pattern) -
FunctionVersionRepository.java— Version repository interface -
FunctionVersionFmRepository.java— Version repository implementation -
FunctionInvoker.java— HTTP client to Deno functions runtime (deploy, invoke, delete, healthCheck) -
FunctionService.java— Core service (CRUD, state machine, version management, invocation, auth validation, startup recovery) -
FunctionResource.java— REST endpoints (CRUD, trigger management, public invoke entry) -
FunctionInternalResource.java— Internal API for runtime lazy source loading
-
src/services/function.ts— API service layer (TypeScript interfaces + all CRUD/invoke/trigger endpoints) -
src/pages/Functions/index.tsx— Main list page (table with status tags, search/filter, pagination, create/edit/delete actions) -
src/pages/Functions/components/FunctionForm.tsx— Create/Edit modal (tabs: Basic Settings + Source Code + HTTP Trigger config) -
src/pages/Functions/components/FunctionDetail.tsx— Detail drawer (tabs: Overview + Code + Versions with rollback + Test Invoke) -
src/pages/Functions/components/FunctionInvokePanel.tsx— Test invoke panel (request builder with method/headers/body/query + response viewer with logs) -
src/locales/zh.json— Chinese translations (70+ keys for function management) -
src/locales/en.json— English translations (70+ keys) -
src/routes.tsx— Added Functions route with CodeOutlined icon under/project/:projectId/functions
- Phase 4: Integration Testing — Install Deno, start functions runtime, run end-to-end tests
- Source Code Viewing — Add frontend endpoint to retrieve source code for editing (currently requires re-pasting on update)
- V2 Enhancements — Worker Pool, Cron triggers, metrics, secrets management
- Deno not installed in current environment — functions runtime cannot be runtime-verified yet
- IDE lock on
flexmodel-server-dev.jarpreventsmvn clean(not caused by our changes)
- HTTP Client: Used Java 25 built-in
java.net.http.HttpClientinstead of Vert.x WebClient to avoid additional dependency - Configuration: Functions runtime host/port configurable via
flexmodel.functions-runtime.hostandflexmodel.functions-runtime.portproperties - Source Code Loading: Lazy load pattern — source code not sent at deploy time, loaded by runtime on first invoke via internal API
- Auth Validation: Implemented PUBLIC/JWT/API_KEY/INTERNAL auth modes per trigger config
- Startup Recovery: Only deploys metadata on startup (O(1) time), source code lazy-loaded
flexmodel-functions-runtime/deno.jsonflexmodel-functions-runtime/src/main.tsflexmodel-functions-runtime/src/server.tsflexmodel-functions-runtime/src/types.tsflexmodel-functions-runtime/src/router/functions.tsflexmodel-functions-runtime/src/router/health.tsflexmodel-functions-runtime/src/runner/registry.tsflexmodel-functions-runtime/src/runner/worker.tsflexmodel-functions-runtime/src/runner/worker-entry.tsflexmodel-functions-runtime/src/sdk/flexmodel.ts
flexmodel-server/src/main/java/dev/flexmodel/functions/FunctionException.javaflexmodel-server/src/main/java/dev/flexmodel/functions/FunctionRepository.javaflexmodel-server/src/main/java/dev/flexmodel/functions/FunctionFmRepository.javaflexmodel-server/src/main/java/dev/flexmodel/functions/FunctionVersionRepository.javaflexmodel-server/src/main/java/dev/flexmodel/functions/FunctionVersionFmRepository.javaflexmodel-server/src/main/java/dev/flexmodel/functions/FunctionInvoker.javaflexmodel-server/src/main/java/dev/flexmodel/functions/FunctionService.javaflexmodel-server/src/main/java/dev/flexmodel/functions/FunctionResource.javaflexmodel-server/src/main/java/dev/flexmodel/functions/FunctionInternalResource.javaflexmodel-server/src/main/java/dev/flexmodel/functions/dto/FunctionCreateRequest.javaflexmodel-server/src/main/java/dev/flexmodel/functions/dto/FunctionUpdateRequest.javaflexmodel-server/src/main/java/dev/flexmodel/functions/dto/FunctionInvokeRequest.javaflexmodel-server/src/main/java/dev/flexmodel/functions/dto/FunctionInvokeResponse.javaflexmodel-server/src/main/java/dev/flexmodel/functions/dto/FunctionDeployRequest.javaflexmodel-server/src/main/java/dev/flexmodel/functions/dto/FunctionResponse.javaflexmodel-server/src/main/java/dev/flexmodel/functions/dto/FunctionVersionResponse.javaflexmodel-server/src/main/java/dev/flexmodel/functions/dto/FunctionPageRequest.java
flexmodel-server/src/main/resources/project.fml— Added f_function, f_function_version models + HTTP to TriggerTypeflexmodel-ui/src/routes.tsx— Added Functions route with CodeOutlined iconflexmodel-ui/src/locales/zh.json— Added 70+ function management translation keysflexmodel-ui/src/locales/en.json— Added 70+ function management translation keysfeature_list.json— Added feat-011progress.md— This file
- Compile:
mvn compile -pl flexmodel-server→ BUILD SUCCESS (424 source files, 0 errors) - Engine tests:
mvn test -pl flexmodel-engine -q→ all passed - Frontend TypeScript:
tsc --noEmit→ 0 errors - Frontend build:
npm run build(Vite) → built in 42.98s - Deno type-check:
deno check src/main.ts(Deno not installed in environment) - End-to-end test: create → deploy → invoke → update → delete (requires running functions runtime)
完善 TriggerResourceTest e2e 用例,在调用 Trigger REST 接口后,通过注入的 Scheduler 直接查询 Quartz 作业状态,确保
Quartz 作业被正确创建/移除/状态变更。
flexmodel-server/src/test/java/dev/flexmodel/rest/TriggerResourceTest.java- 新增 Quartz 断言辅助方法:
jobKey/triggerKey/assertScheduledInQuartz/assertNotScheduledInQuartz/unscheduleFromScheduler,镜像TriggerService.buildJobKey/buildTriggerKey/getJobGroup的命名规则(group =dev_test_flow_{jobId})。 testCreateIntervalTrigger/testCreateCronTrigger:创建 state=true SCHEDULED 触发器后断言 JobDetail/Trigger 存在、JobDataMap 携带 triggerId/jobId/projectId。testCreateEventTrigger:断言 EVENT 类型不创建 Quartz 作业。testCreateDisabledTriggerNotScheduled:state=false SCHEDULED 不创建 Quartz 作业。testPatchTriggerEnable/testPatchTriggerDisable:启用→创建调度任务,禁用→移除调度任务。testUpdateTrigger/testUpdateTriggerReschedules(新增):update 先 unschedule 再 schedule 的重建路径,禁用态不残留调度任务,且全程保留 seed 原始名称。testDeleteTrigger:删除前断言调度任务存在、删除后断言已移除。@AfterEach增强:清理 created/启用的 seed 触发器的 Quartz 调度任务(兜底deleteJob/unscheduleJob),并还原 seed 禁用态。
- 新增 Quartz 断言辅助方法:
flexmodel-server/src/main/java/dev/flexmodel/scheduling/TriggerService.java- 修复
create():对 state=false 的 SCHEDULED 触发器不再调用scheduleTrigger(与update()行为一致),避免禁用态触发器误注册 Quartz 作业。这是被新 e2e 用例暴露出的预存缺陷。
- 修复
mvn -pl flexmodel-server -am test -Dtest=TriggerResourceTest -Dsurefire.failIfNoSpecifiedTests=false→ BUILD SUCCESS,Tests run: 16, Failures: 0, Errors: 0, Skipped: 0。- TriggerResourceIT(@QuarkusIntegrationTest extends TriggerResourceTest)保持兼容(用例均为普通 HTTP+Scheduler 断言,无 JVM 模式不兼容 API)。
assertScheduledInQuartz不再强断言getTriggerState==NORMAL与nextFireTime:短间隔 SimpleTrigger 在断言前可能已触发完成被移除(含 startup-restore 触发的实际 Job 执行,会出现SessionContextNPE 噪声日志,属已知环境问题,不影响断言)。改为断言 JobDetail/Trigger 存在 + JobDataMap 内容 + 状态非 ERROR,保证稳定性。testDeleteTrigger改用 1 小时间隔创建触发器,避免调度任务在断言前被触发清理。- 启动恢复
restoreScheduledTriggersOnStartup对 seed EVENT 触发器不调度(符合预期),dev_test seed 中无 state=true 的 SCHEDULED 触发器。