{"record":{"id":"21221b2f202a8517","repo":"chroma-core/chroma","slug":"unsupported-or-missing-cmek-provider-in-data-js","errorCode":null,"errorMessage":"Unsupported or missing CMEK provider in data: ${JSON.stringify(data)}","messagePattern":"Unsupported or missing CMEK provider in data: (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"clients/new-js/packages/chromadb/src/schema.ts","lineNumber":162,"sourceCode":"   * Deserialize CMEK from object format.\n   *\n   * Expects the provider variant as the key and resource as the value.\n   *\n   * @param data - Object containing provider variant and resource\n   * @returns Deserialized CMEK instance\n   * @throws Error if the provider is unsupported or data is malformed\n   *\n   * @example\n   * ```typescript\n   * const data = { gcp: 'projects/p/locations/l/keyRings/r/cryptoKeys/k' };\n   * const cmek = Cmek.fromJSON(data);\n   * ```\n   */\n  static fromJSON(data: Record<string, unknown>): Cmek {\n    if (\"gcp\" in data && typeof data.gcp === \"string\") {\n      return Cmek.gcp(data.gcp);\n    }\n    throw new Error(\n      `Unsupported or missing CMEK provider in data: ${JSON.stringify(data)}`,\n    );\n  }\n}\n\nconst STRING_VALUE_NAME = \"string\";\nconst FLOAT_LIST_VALUE_NAME = \"float_list\";\nconst SPARSE_VECTOR_VALUE_NAME = \"sparse_vector\";\nconst INT_VALUE_NAME = \"int\";\nconst FLOAT_VALUE_NAME = \"float\";\nconst BOOL_VALUE_NAME = \"bool\";\n\nconst FTS_INDEX_NAME = \"fts_index\";\nconst STRING_INVERTED_INDEX_NAME = \"string_inverted_index\";\nconst VECTOR_INDEX_NAME = \"vector_index\";\nconst SPARSE_VECTOR_INDEX_NAME = \"sparse_vector_index\";\nconst INT_INVERTED_INDEX_NAME = \"int_inverted_index\";\nconst FLOAT_INVERTED_INDEX_NAME = \"float_inverted_index\";","sourceCodeStart":144,"sourceCodeEnd":180,"githubUrl":"https://github.com/chroma-core/chroma/blob/aecdd12c8a891610db8653630b066b32ceb678b5/clients/new-js/packages/chromadb/src/schema.ts#L144-L180","documentation":"Cmek.fromJSON deserializes customer-managed-encryption-key configuration, and the only provider shape it accepts is { gcp: '<key-resource-name>' } with a string value. Any other payload — a different provider key such as aws, an empty object, or a non-string gcp value — throws this error with the offending JSON embedded in the message.","triggerScenarios":"Cmek.fromJSON({}); Cmek.fromJSON({ aws: 'arn:aws:kms:...' }); Cmek.fromJSON({ gcp: 42 }); feeding server-returned or file-based config JSON whose shape changed between client versions.","commonSituations":"Anticipating AWS/Azure KMS support when only GCP is implemented; round-tripping config through JSON and losing the gcp string; version drift where the serialized Cmek shape changed on upgrade.","solutions":["Construct the GCP CMEK directly: schema.setCmek(Cmek.gcp('projects/p/locations/l/keyRings/r/cryptoKeys/k')).","Validate the parsed JSON has a string gcp field before calling fromJSON.","If you need another cloud provider, check for a newer client release — this version supports GCP only."],"exampleFix":"// before\nschema.setCmek(Cmek.fromJSON(data)); // data = { aws: keyArn } -> throws\n\n// after\nif (typeof data.gcp !== 'string') {\n  throw new Error('CMEK config must be { gcp: string }');\n}\nschema.setCmek(Cmek.fromJSON({ gcp: data.gcp }));","handlingStrategy":"type-guard","validationCode":"if (!(typeof data === 'object' && data !== null && typeof (data as { gcp?: unknown }).gcp === 'string')) {\n  throw new Error('CMEK payload must be { gcp: string }');\n}\nconst cmek = Cmek.fromJSON(data as { gcp: string });","typeGuard":"function isGcpCmekJSON(data: unknown): data is { gcp: string } {\n  return (\n    typeof data === 'object' &&\n    data !== null &&\n    typeof (data as { gcp?: unknown }).gcp === 'string' &&\n    Object.keys(data).length === 1\n  );\n}","tryCatchPattern":"try {\n  schema.setCmek(Cmek.fromJSON(data));\n} catch (e) {\n  if (e instanceof Error && e.message.includes('CMEK provider')) {\n    // fail provisioning with a clear message, or proceed without CMEK per policy\n  } else {\n    throw e;\n  }\n}","preventionTips":["Schema-validate externally sourced config (zod/valibot) before deserializing Cmek.","Pin the client version and re-test Cmek round-trips on upgrade.","Keep provider knowledge in one guard so adding a provider later touches a single place."],"tags":["cmek","encryption","config-parsing","chroma"],"backgroundTag":"unsupported-config-provider","analyzedSha":"aecdd12c8a891610db8653630b066b32ceb678b5","analyzedAt":"2026-08-16T21:53:27.228Z","schemaVersion":2},"datasetVersion":"2026-08-16T23:17:17.608Z"}