{"record":{"id":"dc99244ea097b627","repo":"grafana/k6","slug":"invalid-plaintext-value-v-it-needs-to-be-boo","errorCode":null,"errorMessage":"invalid plaintext value: '%#v', it needs to be boolean","messagePattern":"invalid plaintext value: '%#v', it needs to be boolean","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/js/modules/k6/grpc/params.go","lineNumber":163,"sourceCode":"\t\tReflectionMetadata:    metadata.New(nil),\n\t}\n\n\tif common.IsNullish(input) {\n\t\treturn result, nil\n\t}\n\n\trt := vu.Runtime()\n\tparams := input.ToObject(rt)\n\n\tfor _, k := range params.Keys() {\n\t\tv := params.Get(k).Export()\n\n\t\tswitch k {\n\t\tcase \"plaintext\":\n\t\t\tvar ok bool\n\t\t\tresult.IsPlaintext, ok = v.(bool)\n\t\t\tif !ok {\n\t\t\t\treturn result, fmt.Errorf(\"invalid plaintext value: '%#v', it needs to be boolean\", v)\n\t\t\t}\n\t\tcase \"timeout\":\n\t\t\tvar err error\n\t\t\tresult.Timeout, err = types.GetDurationValue(v)\n\t\t\tif err != nil {\n\t\t\t\treturn result, fmt.Errorf(\"invalid timeout value: %w\", err)\n\t\t\t}\n\t\tcase \"reflect\":\n\t\t\tvar ok bool\n\t\t\tresult.UseReflectionProtocol, ok = v.(bool)\n\t\t\tif !ok {\n\t\t\t\treturn result, fmt.Errorf(\"invalid reflect value: '%#v', it needs to be boolean\", v)\n\t\t\t}\n\t\tcase \"reflectMetadata\":\n\t\t\tmd, err := newMetadata(params.Get(k))\n\t\t\tif err != nil {\n\t\t\t\treturn result, fmt.Errorf(\"invalid reflectMetadata param: %w\", err)\n\t\t\t}","sourceCodeStart":145,"sourceCodeEnd":181,"githubUrl":"https://github.com/grafana/k6/blob/93accf6570dcd306ca5e99cc44c393ee3797761b/internal/js/modules/k6/grpc/params.go#L145-L181","documentation":"In client.connect(addr, params), the plaintext option toggles plaintext HTTP/2 (h2c) instead of TLS and must be a JS boolean; newConnectParams asserts the type (params.go:161). 'false' as a string, 0/1 numbers, or any other type throw 'invalid plaintext value'.","triggerScenarios":"connect(addr, { plaintext: 'false' }); { plaintext: 1 }; values taken straight from __ENV, which always yields strings.","commonSituations":"Env-driven TLS toggles (__ENV.GRPC_PLAINTEXT); YAML/JSON config loaded without type coercion; assuming 0/1 work as in other tools.","solutions":["Use a literal true/false","Coerce env values explicitly: __ENV.GRPC_PLAINTEXT === 'true'","Fix the config loader to emit real booleans"],"exampleFix":"// before\nclient.connect(addr, { plaintext: __ENV.GRPC_PLAINTEXT });\n\n// after\nclient.connect(addr, { plaintext: __ENV.GRPC_PLAINTEXT === 'true' });","handlingStrategy":"validation","validationCode":"if (connectParams.plaintext !== undefined && typeof connectParams.plaintext !== 'boolean') {\n  throw new Error(`plaintext must be boolean, got ${typeof connectParams.plaintext}`);\n}\nclient.connect(addr, connectParams);","typeGuard":"function toBool(v) {\n  if (typeof v === 'boolean') return v;\n  if (typeof v === 'string') return v === 'true';\n  throw new Error(`expected boolean, got ${typeof v}`);\n}","tryCatchPattern":null,"preventionTips":["Coerce env strings with === 'true' before passing","Keep TLS/h2c toggles as real booleans in config files","Do not use 0/1 for boolean options"],"tags":["grpc","connect","tls","type-error"],"backgroundTag":null,"analyzedSha":"93accf6570dcd306ca5e99cc44c393ee3797761b","analyzedAt":"2026-08-15T21:23:27.118Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}