{"record":{"id":"8f01c0546d773d58","repo":"chenhg5/cc-connect","slug":"cloud-web-transport-must-be-websocket-long-poll","errorCode":null,"errorMessage":"cloud_web: transport must be websocket, long_poll, or gateway","messagePattern":"cloud_web: transport must be websocket, long_poll, or gateway","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"platform/cloud-web/cloudweb.go","lineNumber":80,"sourceCode":"func New(opts map[string]any) (core.Platform, error) {\n\tname, _ := opts[\"name\"].(string)\n\tif name == \"\" {\n\t\tname = \"cloud_web\"\n\t}\n\tproject, _ := opts[\"cc_project\"].(string)\n\ttoken, _ := opts[\"token\"].(string)\n\tif strings.TrimSpace(token) == \"\" {\n\t\treturn nil, fmt.Errorf(\"cloud_web: token is required\")\n\t}\n\n\ttransportKind, _ := opts[\"transport\"].(string)\n\tif transportKind == \"\" {\n\t\ttransportKind = \"websocket\"\n\t}\n\tswitch transportKind {\n\tcase \"websocket\", \"long_poll\", \"gateway\":\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"cloud_web: transport must be websocket, long_poll, or gateway\")\n\t}\n\n\tbaseURL, _ := opts[\"base_url\"].(string)\n\twsURL, _ := opts[\"ws_url\"].(string)\n\tlisten, _ := opts[\"listen\"].(string)\n\twebhookPath, _ := opts[\"webhook_path\"].(string)\n\tregisterURL, _ := opts[\"register_url\"].(string)\n\tpublicURL, _ := opts[\"public_url\"].(string)\n\teventsPath, _ := opts[\"events_path\"].(string)\n\tsendPath, _ := opts[\"send_path\"].(string)\n\tlongPollMS := pickInt(opts[\"long_poll_timeout_ms\"])\n\n\tallowFrom, _ := opts[\"allow_from\"].(string)\n\tcore.CheckAllowFrom(name, allowFrom)\n\tshareInChannel, _ := opts[\"share_session_in_channel\"].(bool)\n\tgroupReplyAll, _ := opts[\"group_reply_all\"].(bool)\n\n\tvar tp transport","sourceCodeStart":62,"sourceCodeEnd":98,"githubUrl":"https://github.com/chenhg5/cc-connect/blob/4000b2338aa6e850c99df54f8b0ed6ed7460b401/platform/cloud-web/cloudweb.go#L62-L98","documentation":"The cloud_web platform constructor validates the `transport` option against a fixed set of supported values. It throws this error when transport is set to something other than \"websocket\", \"long_poll\", or \"gateway\" — an unknown transport kind cannot be instantiated.","triggerScenarios":"Calling cloudweb.New with opts[\"transport\"] set to any string outside {websocket, long_poll, gateway}, e.g. \"ws\", \"polling\", \"longpoll\", \"sse\", or a typo.","commonSituations":"Typo in config.toml (`transport = \"longpoll\"` instead of \"long_poll\"); copying transport names from another platform's config; older config using a removed transport value after a version upgrade.","solutions":["Set transport to one of exactly: \"websocket\", \"long_poll\", or \"gateway\".","Fix common typos: \"longpoll\" → \"long_poll\", \"ws\" → \"websocket\".","Omit the option entirely to use the default (\"websocket\").","Check the release notes/changelog if upgrading — the transport value may have been renamed."],"exampleFix":"// before\nopts := map[string]any{\"token\": tok, \"transport\": \"longpoll\"} // invalid\n// after\nopts := map[string]any{\"token\": tok, \"transport\": \"long_poll\"}","handlingStrategy":"validation","validationCode":"var validTransports = map[string]bool{\"websocket\": true, \"long_poll\": true, \"gateway\": true}\nfunc transportOK(opts map[string]any) bool {\n\tt, _ := opts[\"transport\"].(string)\n\treturn t == \"\" || validTransports[t]\n}","typeGuard":"func isSupportedTransport(v any) bool {\n\ts, ok := v.(string)\n\tif !ok { return false }\n\tswitch s {\n\tcase \"websocket\", \"long_poll\", \"gateway\":\n\t\treturn true\n\t}\n\treturn false\n}","tryCatchPattern":"p, err := cloudweb.New(opts)\nif err != nil {\n\tif strings.Contains(err.Error(), \"transport must be\") {\n\t\tslog.Error(\"invalid transport; use websocket, long_poll, or gateway\", \"got\", opts[\"transport\"])\n\t\treturn\n\t}\n\treturn err\n}","preventionTips":["Copy transport values exactly from config.example.toml.","Remember snake_case: long_poll, not longpoll.","Omit transport to accept the websocket default.","Run a config validation pass at startup to catch typos early."],"tags":["config","validation","cloud-web","enum"],"backgroundTag":"invalid-enum-value","analyzedSha":"4000b2338aa6e850c99df54f8b0ed6ed7460b401","analyzedAt":"2026-09-06T11:45:09.575Z","contentChangedAt":"2026-09-06T11:45:09.575Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}