diff --git a/.check-schema/README.md b/.check-schema/README.md index 16efc6b8..b46ba7cc 100644 --- a/.check-schema/README.md +++ b/.check-schema/README.md @@ -1 +1,26 @@ -docker run ghcr.io/aklivity/zilla:latest start -v -Pzilla.engine.verbose.schema >> zilla-schema.json +# Schema Docs Comparison + +This project compares the JSON Schema from the Zilla to the [Reference](../src/reference) section of the docs. + +## Update schema + +In the repository root directory run: + +```bash +brew install gsed +``` + +```bash +CONTAINER_ID=$(docker run -d --rm -e ZILLA_INCUBATOR_ENABLED=true ghcr.io/aklivity/zilla:develop-SNAPSHOT start -v -Pzilla.engine.verbose.schema.plain); +sleep 5; +docker logs $CONTAINER_ID > ./.check-schema/zilla-schema.json 2>&1; +docker stop $CONTAINER_ID; + +gsed -i '1,2d' ./.check-schema/zilla-schema.json; +gsed -i '$d' ./.check-schema/zilla-schema.json; + +``` + +Once the docker container has printed "started" it must be deleted for the command to complete. + +Remove the none JSON lines from the beginning and end of each file. diff --git a/.check-schema/eslint.config.mjs b/.check-schema/eslint.config.mjs new file mode 100644 index 00000000..19b02cd6 --- /dev/null +++ b/.check-schema/eslint.config.mjs @@ -0,0 +1,9 @@ +import globals from "globals"; +import pluginJs from "@eslint/js"; + + +export default [ + { files: ["**/*.js"], languageOptions: { sourceType: "commonjs" } }, + { languageOptions: { globals: globals.browser } }, + pluginJs.configs.recommended, +]; diff --git a/.check-schema/index.js b/.check-schema/index.js index f681687d..da45efc3 100644 --- a/.check-schema/index.js +++ b/.check-schema/index.js @@ -1,178 +1,426 @@ +const process = require('node:process'); const fs = require("fs"); +const path = require("path"); const { marked } = require("marked"); +const { $RefParser } = require("@apidevtools/json-schema-ref-parser"); const schema = require("./zilla-schema.json"); -var errors = []; - -function getPageProps(tokens) { - var foundHeadings = []; - tokens - .filter(({ depth }) => depth > 2) - .forEach((t) => { - if (t.text && t.type && t.type === "heading") { - t.tokens - .filter(({ type }) => type === "text") - .forEach(({ text }) => foundHeadings.push(text)); + +const OBJECT_MAP_TYPE = "`object` as map of named "; + +const main = async () => { + await $RefParser.dereference(schema); + // console.log("RefParser", JSON.stringify(schema)) + var errors = []; + + function getExtraProps(o) { + return { + default: (o.default ? "`" + o.default + "`" : undefined), + pattern: (o.pattern ? "`" + (o.pattern?.replaceAll("\\", "\\\\") || "") + "`" : undefined), + minimum: (o.minimum ? "`" + o.minimum + "`" : undefined), + maximum: (o.maximum ? "`" + o.maximum + "`" : undefined) + }; + } + + function getType(i, patternProperties) { + // console.log(i); + var type = "`" + (i.type || "object") + "`" + (patternProperties ? " properties" : ""); + if (i.enum) type = "`enum`" + ` [ ${i.enum.map((e) => ("`" + e + "`")).join(", ")} ]`; + if (i.items?.enum) type = `${"`array`"}${i.items.enum ? " of `enum`" + ` [ ${i.items.enum.map((e) => ("`" + e + "`")).join(", ")} ]` : ""}`; + else if (i.items) type = `${"`array`"}${(i.items.type ? " of `" + (i.items.type) + "`" : "")}`; + // else if (i.oneOf?.filter(({ items }) => items?.length).length) type = "`array` of `object`"; + if (patternProperties) type = OBJECT_MAP_TYPE + type; + return type; + } + + function getOptions(name, parent, childProps) { + var anyOfProps = parent.anyOf?.filter(({ properties }) => ((properties?.kind.const) === name && properties?.options)).map(({ properties }) => (properties?.options?.properties)); + var oneOfProps = parent.oneOf?.filter(({ properties }) => ((properties?.kind.const) === name && properties?.options)).map(({ properties }) => (properties?.options?.properties)); + return (childProps?.options !== false && parent?.properties?.options !== false ? { + ...parent?.properties?.options, + ...childProps?.options, + properties: { + ...(parent?.properties?.options?.properties || {}), + ...(anyOfProps?.[0] || {}), + ...(oneOfProps?.[0] || {}), + ...(childProps?.options?.properties || {}), } - }); - return foundHeadings; -} + } : {}); + } -function getObjProps(attr, obj, reqKeys) { - var props = []; - // console.log(attr, reqKeys) - Object.keys(obj || {}).forEach((k) => { + function getRoutes(name, root, parent, childProps) { + var anyOfProps = parent.anyOf?.filter(({ properties }) => ((properties?.kind.const) === name && properties?.routes)).map(({ properties }) => (properties?.routes?.items?.properties)); + var oneOfProps = parent.oneOf?.filter(({ properties }) => ((properties?.kind.const) === name && properties?.routes)).map(({ properties }) => (properties?.routes?.items?.properties)); + return (parent?.properties?.routes !== false ? { + ...parent?.properties?.routes, + items: { + ...parent?.properties?.routes?.items, + properties: { + ...(root?.properties?.routes?.items?.properties || {}), + ...(parent?.properties?.routes?.items?.properties || {}), + ...(childProps?.routes?.items?.properties || {}), + ...(anyOfProps?.[0] || {}), + ...(oneOfProps?.[0] || {}), + } + } + } : {}); + } - if (!!obj[k].deprecated) return + function getRequired(name, parent, childRequired) { + return [ + ...(parent?.anyOf?.reduce(({ required: r1 }, { required: r2 }) => ([...(r1 || []), ...(r2 || [])]), []) || []), + ...(parent?.required || []), + ...(childRequired || []) + ]; + } - //recurse - if (obj[k].properties) { - props.push(...getObjProps(k, obj[k].properties, obj[k].required)); - } - if (obj[k].items && obj[k].items.properties) { - props.push( - ...getObjProps(`${k}[]`, obj[k].items.properties, obj[k].items.required) - ); - } - if (obj[k].items && obj[k].items.anyOf) { - obj[k].items.anyOf - .filter(({ properties }) => !!properties) + function getPageProps(pageTokens) { + var foundHeadings = []; + // console.log("tokens", tokens); + pageTokens + .forEach(({ type, depth, tokens }, i) => { + if (type === "heading" && depth >= 3) { + var h = [] + // console.log("tokens", tokens); + // console.log("heading", tokens[i + 1]); + // h.push(text) + tokens + .filter(({ type }) => type === "text") + .forEach(({ text }) => { + h.push(text) + }); + tokens + .filter(({ type }) => type === "escape") + .forEach(({ text }) => h.push(text === "*")); + if (h.length == 1) h.push(false); + if (pageTokens.length > i + 1 && pageTokens[i + 1].type === "blockquote") { + var b = pageTokens[i + 1]; + // console.log("blockquote", b); + b.tokens + .filter(({ type }) => type === "paragraph") + .forEach(({ text }) => { + h.push(...text.split(" | ")) + }); + } + foundHeadings.push(h) + } + }); + return foundHeadings; + } + + function getObjProps(attr, obj, reqKeys) { + var props = []; + // console.log(attr, Object.keys(obj || {})); + // if (attr === "options") console.log(JSON.stringify(obj)); + Object.entries(obj).forEach(([k, i]) => { + if (!i || !!i.deprecated) return + + // spread extra props + i = i.anyOf?.reduce((a, b) => ({ ...a, ...b }), i) || i; + i = i.allOf?.reduce((a, b) => ({ ...a, ...b }), i) || i; + // console.log(k, JSON.stringify(i)); + + //recurse + var patternProperties = false; + if (i.patternProperties) { + patternProperties = true; + i = i.patternProperties[Object.keys(i.patternProperties)[0]]; + } + if (i.properties && Object.keys(i.properties).length) { + props.push(...getObjProps(k, i.properties, i.required)); + } + if (i.items?.properties && Object.keys(i.items?.properties).length) { + props.push( + ...getObjProps(`${k}[]`, i.items.properties, i.items.required) + ); + } + + i.anyOf?.filter(({ properties }) => !!properties) + .forEach(({ properties, required }) => + props.push(...getObjProps(k, properties, required)) + ); + i.items?.anyOf?.filter(({ properties }) => !!properties) .forEach(({ properties, required }) => props.push(...getObjProps(`${k}[]`, properties, required)) ); - } - if (obj[k].patternProperties) { - var ppObj = - obj[k].patternProperties[Object.keys(obj[k].patternProperties)[0]]; - if (ppObj.properties) - props.push(...getObjProps(`${k}`, ppObj.properties, ppObj.properties)); - } - if (obj[k].additionalProperties && obj[k].additionalProperties.oneOf) { - obj[k].additionalProperties.oneOf - .filter(({ properties }) => !!properties) + i.items?.oneOf?.filter(({ properties }) => !!properties) .forEach(({ properties, required }) => - props.push(...getObjProps(`${k}`, properties, required)) + props.push(...getObjProps(`${k}[]`, properties, required)) ); - } - if (obj[k].anyOf) { - obj[k].anyOf - .filter(({ properties }) => !!properties) + i.oneOf?.filter(({ properties }) => !!properties) .forEach(({ properties, required }) => - props.push(...getObjProps(`${k}`, properties, required)) + props.push(...getObjProps(k, properties, [...(i.required || []), ...(required || [])])) ); - } - if (obj[k].oneOf) { - obj[k].oneOf - .filter(({ properties }) => !!properties) + var oneOfItems = i.oneOf?.filter(({ items }) => items?.length) + ?.reduce((a, b) => ([...a, ...b.items]), []); + if (oneOfItems?.length) { + props.push(...getObjProps(`${k}[]`, oneOfItems.reduce((a, b) => ({ ...a, ...b.properties }), {}), [])) + } + + i.additionalProperties?.oneOf?.filter(({ properties }) => !!properties) .forEach(({ properties, required }) => - props.push(...getObjProps(`${k}`, properties, required)) + props.push(...getObjProps(k, properties, required)) ); - } - //base - if (!!!obj[k]) return - if (reqKeys && !reqKeys.include) { - reqKeys = Object.keys(reqKeys); - } - var req = !!reqKeys?.includes(k); - var path = [attr, k].filter((s) => !!s).join("."); - if (obj[k].properties) { - props.push([path, "object", req, obj[k].const]); - } else if (obj[k].additionalProperties) { - if (obj[k].additionalProperties.oneOf) { + //collect + if (!i) return + var req = !!reqKeys?.includes(k); + var path = [attr, k].filter((s) => !!s).join("."); + var type = getType(i, patternProperties); + + if (i.properties && Object.keys(i.properties).length) { + props.push([path, req, type, getExtraProps(i)]); + } else if (i.additionalProperties) { + if (i.additionalProperties.oneOf) { + props.push([ + path, + req, + OBJECT_MAP_TYPE + i.additionalProperties.oneOf + .map((p) => (getType(p, patternProperties))) + .join(" or ") + " properties" + , + getExtraProps(i) + ]); + } else { + type = OBJECT_MAP_TYPE + "`" + i.additionalProperties.type + "` properties"; + props.push([path, req, type, getExtraProps(i)]); + } + } else if (i.items) { + props.push([path, req, type, getExtraProps(i)]); + } else if (i.type) { + if (i.const) { + path = `${path}: ${i.const}`; + type = "`const`"; + } + props.push([path, req, type, getExtraProps(i)]); + } else if (i.const) { + props.push([`${path}: ${i.const}`, req, "`const`", getExtraProps(i)]); + } else if (i.enum?.length) { + i.enum.forEach((e) => props.push([`${path}: ${e}`, req, type, getExtraProps(i)])); + } else if (i.oneOf) { props.push([ path, - obj[k].additionalProperties.oneOf.map(({ type }) => type).join(","), req, - obj[k].const, + i.oneOf + .map((p) => (getType(p, patternProperties))) + .filter((value, index, array) => + array.indexOf(value) === index + ) + .join(", "), + getExtraProps(i) ]); - } else { - props.push([path, obj[k].additionalProperties.type, req, obj[k].const]); } - } else if (obj[k].items) { - props.push([path, "array", req, obj[k].const]); - } else if (obj[k].type) { - if (obj[k].const) path = `${path}: ${obj[k].const}`; - props.push([path, obj[k].type, req, obj[k].const]); - } else if (obj[k].const) { - props.push([`${path}: ${obj[k].const}`, "string", req, obj[k].const]); - } else if (obj[k].enum) { - props.push([path, obj[k].enum.join(","), req, obj[k].const]); - } else if (obj[k].const) { - props.push([path, obj[k].const, req, obj[k].const]); - } else if (obj[k].oneOf) { - props.push([ - path, - obj[k].oneOf - .filter(({ type }) => !!type) - .map(({ type }) => type) - .join(","), - req, - obj[k].const, - ]); - } + // console.log('props', JSON.stringify(props)); + }); + return props; + } + + var sections = Object.entries({ + guard: schema.properties.guards.patternProperties[Object.keys(schema.properties.guards.patternProperties)[0]], + vault: schema.properties.vaults.patternProperties[Object.keys(schema.properties.vaults.patternProperties)[0]], + catalog: schema.properties.catalogs.patternProperties[Object.keys(schema.properties.catalogs.patternProperties)[0]], + }).map(([section, props]) => + props?.allOf?.map(({ if: fi, then }) => ({ + folder: `${section}s`, + name: fi.properties.type.const || fi.properties.type.enum?.[0], + props: { + ...(props?.properties || {}), + ...(then.properties || {}), + options: getOptions(fi.properties.type.const || fi.properties.type.enum?.[0], props, then.properties), + allOf: [...(then.allOf || [])], + anyOf: [...(then.anyOf || [])], + oneOf: [...(then.oneOf || [])], + }, + required: [...(props?.required || []), ...(then.required || [])], + })) + ).flat(1); + + var bindings = schema.properties.bindings.patternProperties[Object.keys(schema.properties.bindings.patternProperties)[0]]; + var kindsGlobalIs = bindings.anyOf?.filter(({ properties }) => (properties?.kind?.const)) + .reduce((o, a) => { + // eslint-disable-next-line no-unused-vars + const { kind: _, ...properties } = a.properties; + return { + ...o, + [a.properties?.kind?.const]: { ...a, properties } + }; + }, {}) + var kindsGlobalNot = bindings.anyOf?.filter(({ properties }) => (properties?.kind?.not?.const)) + .reduce((o, a) => { + // eslint-disable-next-line no-unused-vars + const { kind: _, ...properties } = a.properties; + return { + ...o, + [a.properties?.kind?.not.const]: { properties: {}, required: [] }, + all: { ...o.all, ...a, properties } + }; + }, { all: {} }); + var getGlobalProps = (kind) => ({ + ...bindings.properties, + ...(kindsGlobalIs[kind]?.properties || {}), + ...(kindsGlobalNot[kind]?.properties || kindsGlobalNot.all?.properties || {}), }); - return props; -} - -var sections = ["binding", "guard", "vault", "catalog"] - .map((type) => - schema.$defs[type]?.allOf.map(({ if: fi, then }) => ({ - type, - folder: `${type}s`, + var getGlobalReqs = (kind) => ([ + ...bindings.required, + ...(kindsGlobalIs[kind]?.required || []), + ...(kindsGlobalNot[kind]?.required || kindsGlobalNot.all?.required || []), + ]); + bindings.allOf?.forEach(({ if: fi, then }) => { + var folder = `bindings.${fi.properties.type.const}`; + if (then.oneOf) { + sections.push(...then.oneOf.map(({ properties, required, oneOf, anyOf, allOf }) => ({ + folder, + name: properties.kind.const, + props: { + ...getGlobalProps(properties.kind.const), + ...(then.properties || {}), + ...(properties || {}), + options: getOptions(properties.kind.const, then, properties), + routes: getRoutes(properties.kind.const, bindings, then, properties), + allOf: [...(then.allOf || []), ...(allOf || [])], + anyOf: [...(then.anyOf || []), ...(anyOf || [])], + oneOf: [...(then.oneOf || []), ...(oneOf || [])], + }, + required: getRequired(properties.kind.const, then, [...(getGlobalReqs(properties.kind.const) || []), ...(required || [])]), + }))); + } else { + sections.push({ + folder, + name: then.properties.kind.enum[0], + props: { + ...getGlobalProps(then.properties.kind.enum[0]), + ...(then.properties || {}), + options: getOptions(then.properties.kind.enum[0], bindings, then.properties), + routes: getRoutes(then.properties.kind.enum[0], bindings, then), + allOf: [...(then.allOf || [])], + anyOf: [...(then.anyOf || [])], + oneOf: [...(then.oneOf || [])], + }, + required: [...(getGlobalReqs(then.properties.kind.enum[0]) || []), ...(then.required || [])], + }); + } + }) + + var exporterProps = schema.properties.telemetry.properties.exporters.patternProperties[Object.keys(schema.properties.telemetry.properties.exporters.patternProperties)[0]] + sections.push( + ...exporterProps?.allOf?.map(({ if: fi, then }) => ({ + folder: "telemetry.exporters", name: fi.properties.type.const, - props: { ...(schema.$defs[type].properties || {}), ...then.properties }, - })) - ) - .flat(1); - -sections.push( - ...schema.$defs.telemetry.exporter?.allOf.map(({ if: fi, then }) => ({ - type: "exporter", - folder: "telemetry.exporters", - name: fi.properties.type.const, - props: then.properties, - })) -); - -sections.forEach(({ type, folder, name, props }) => { - delete props.type; - var attrs = getObjProps(null, props, []); - var filename = `src/reference/config/${folder.replaceAll(".", "/")}/${type - .split(".") - .findLast((n) => !!n)}-${name}.md`; - // console.log('parsing', filename) - if ( - fs.existsSync(filename) - ) { - var headers = getPageProps( - marked.lexer( - fs.readFileSync(filename, "utf8") - .toString() - ) - ).sort(); - var sorted = attrs.map((a) => a[0]).sort(); - // console.log("findings", type, name, sorted, headers); - var addList = sorted.filter((x) => - !headers.includes(x) && - !["telemetry", "telemetry.metrics", "type", "catalog"].includes(x) - ); - var removeList = headers.filter((x) => - !sorted.includes(x) && - !["routes[].exit", "routes[].guarded"].includes(x) - ); - if(addList.length) console.log(type,name,"add",addList); - if(removeList.length) console.log(type,name,"remove",removeList); - // if (name == "mqtt" ) console.log(sorted, headers) - } else { - errors.push(`missing ${name}`); - } -}); + props: { + ...(exporterProps?.properties || {}), + ...(then.properties || {}), + anyOf: [...(then.anyOf || [])], + }, + required: [...(exporterProps?.required || []), ...(then.required || [])], + })) || {} + ); + sections.push( + ...schema.$defs.converter.model?.allOf.map(({ if: fi, then }) => ({ + folder: "models", + name: fi.properties.model.const, + props: { + ...(then.properties || {}), + anyOf: (then.anyOf || []), + }, + required: (then.required || []), + })) || {} + ); + + // console.log("sections", JSON.stringify(sections)); + sections.forEach(({ folder, name, props, required }) => { + delete props.type; + delete props.kind; + var foldername = `src/reference/config/${folder.replaceAll(".", "/")}`; + var filename = `${name}.md`; + var filePath = `${foldername}/${filename}`; + // console.log(filePath, props); + var schemaAttrs = getObjProps(null, props, required); + if (fs.existsSync(filePath)) { + + var fullMdContent = fs.readFileSync(filePath, "utf8") + .toString(); + fullMdContent = fullMdContent.replace(//g, (_, p1) => + (fs.readFileSync(path.resolve(foldername, p1), "utf8").toString()) + ); + var mdAttrs = getPageProps(marked.lexer(fullMdContent)); + + // console.log('mdAttrs', mdAttrs) + // console.log('schemaAttrs', schemaAttrs) + + // get page headers and schema props + var pageHeaders = mdAttrs.reduce((o, a) => ( + { + ...o, [a[0]]: { + name: a[0], + required: a[1] || false, + type: a[2] || '', + extra: (a[3] || ''), + } + }), {}); + var schemaProps = schemaAttrs.reduce((o, a) => ( + { + ...o, [a[0]]: { + name: a[0], + required: a[1] || false, + type: a[2] || '', + extra: (a[3] ? Object.entries(a[3]).filter((e) => (!!e[1])).map(([k, o]) => (`${k.charAt(0).toUpperCase() + k.slice(1).toLowerCase()}: ${o}`)).join(' ') : ''), + } + }), {}); + + // console.log('pageHeaders', pageHeaders) + // console.log('schemaProps', schemaProps) + + // print diff check + // Object.entries(obj).forEach(([k, i]) { name, required, type, default } + var addDiff = Object.entries(schemaProps).map(([k, o]) => { + // console.log(k, o, pageHeaders[k]); + if (pageHeaders[k] && + (pageHeaders[k].name != o.name + || pageHeaders[k].required != o.required + || pageHeaders[k].type != o.type + || pageHeaders[k].extra != o.extra) + ) { + var p = { + name: o.name + }; + if (pageHeaders[k].required != o.required) p.required = o.required; + if (pageHeaders[k].type != o.type) p.type = o.type; + if (pageHeaders[k].extra != o.extra) p.extra = o.extra?.replaceAll("\\\\", "\\"); + return p + } else if (!pageHeaders[k]) { + return o + } + }).filter((x) => !!x); + var removeDiff = Object.entries(pageHeaders).map(([k, o]) => { + if (schemaProps[k] && + (schemaProps[k].name != o.name + || schemaProps[k].required != o.required + || schemaProps[k].type != o.type + || schemaProps[k].extra != o.extra) + ) { + var p = { + name: o.name + }; + if (schemaProps[k].required != o.required) p.required = o.required; + if (schemaProps[k].type != o.type) p.type = o.type; + if (schemaProps[k].extra != o.extra) p.extra = o.extra?.replaceAll("\\\\", "\\"); + return p + } else if (!schemaProps[k]) { + return o + } + }).filter((x) => !!x); + console.log(folder, name, "add", addDiff, "remove", removeDiff); + if (addDiff.length + removeDiff.length) { + process.exitCode = 1; + // console.log(folder, name, "add", addDiff, "remove", removeDiff); + // console.log("findings", folder, name, schemaProps, pageHeaders); + } + } else { + errors.push(`missing ${folder} ${name}`); + process.exitCode = 1; + } + }); -//check metrics -// { -// type: 'telemetry.metrics', -// name: 'grpc', -// props: schema.$defs.telemetry.metrics.items.enum.filter((m) => m.startsWith('grpc')), -// } + if (errors.length) console.log("errors", errors) -// console.log(errors) +}; +main(); diff --git a/.check-schema/package.json b/.check-schema/package.json index 1ecc5757..856216b1 100644 --- a/.check-schema/package.json +++ b/.check-schema/package.json @@ -5,12 +5,17 @@ "main": "index.js", "scripts": { "check": "node index.js", + "lint": "eslint --fix", "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC", "devDependencies": { + "@apidevtools/json-schema-ref-parser": "^11.7.0", + "@eslint/js": "^9.9.1", + "eslint": "^9.9.1", + "globals": "^15.9.0", "marked": "^11.0.0" } } diff --git a/.check-schema/pnpm-lock.yaml b/.check-schema/pnpm-lock.yaml index 7da248ff..f0b46e0e 100644 --- a/.check-schema/pnpm-lock.yaml +++ b/.check-schema/pnpm-lock.yaml @@ -1,18 +1,740 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' settings: autoInstallPeers: true excludeLinksFromLockfile: false -devDependencies: - marked: - specifier: ^11.0.0 - version: 11.0.0 +importers: + + .: + devDependencies: + '@apidevtools/json-schema-ref-parser': + specifier: ^11.7.0 + version: 11.7.0 + '@eslint/js': + specifier: ^9.9.1 + version: 9.9.1 + eslint: + specifier: ^9.9.1 + version: 9.9.1 + globals: + specifier: ^15.9.0 + version: 15.9.0 + marked: + specifier: ^11.0.0 + version: 11.2.0 packages: - /marked@11.0.0: - resolution: {integrity: sha512-2GsW34uXaFEGTQ/+3rCnNC6vUYTAgFuDLGl70v/aWinA5mIJtTrrFAmfbLOfVvgPyxXuDVL9He/7reCK+6j3Sw==} + '@apidevtools/json-schema-ref-parser@11.7.0': + resolution: {integrity: sha512-pRrmXMCwnmrkS3MLgAIW5dXRzeTv6GLjkjb4HmxNnvAKXN1Nfzp4KmGADBQvlVUcqi+a5D+hfGDLLnd5NnYxog==} + engines: {node: '>= 16'} + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.11.0': + resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.18.0': + resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.1.0': + resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.9.1': + resolution: {integrity: sha512-xIDQRsfg5hNBqHz04H1R3scSVwmI+KUbqjsQKHKQ1DAUSaUjYPReZZmS/5PNiKu1fUvzDd6H7DEDKACSEhu+TQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.4': + resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.3.0': + resolution: {integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==} + engines: {node: '>=18.18'} + + '@jsdevtools/ono@7.1.3': + resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-scope@8.0.2: + resolution: {integrity: sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.0.0: + resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.9.1: + resolution: {integrity: sha512-dHvhrbfr4xFQ9/dq+jcVneZMyRYLjggWjk6RVsIiHsP8Rz6yZ8LvZ//iU4TrZF+SXWG+JkNF2OyiZRvzgRDqMg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.1.0: + resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@15.9.0: + resolution: {integrity: sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==} + engines: {node: '>=18'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + marked@11.2.0: + resolution: {integrity: sha512-HR0m3bvu0jAPYiIvLUUQtdg1g6D247//lvcekpHO1WMvbwDlwSkZAX9Lw4F4YHE1T0HaaNve0tuAWuV1UJ6vtw==} engines: {node: '>= 18'} hasBin: true - dev: true + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + +snapshots: + + '@apidevtools/json-schema-ref-parser@11.7.0': + dependencies: + '@jsdevtools/ono': 7.1.3 + '@types/json-schema': 7.0.15 + js-yaml: 4.1.0 + + '@eslint-community/eslint-utils@4.4.0(eslint@9.9.1)': + dependencies: + eslint: 9.9.1 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.11.0': {} + + '@eslint/config-array@0.18.0': + dependencies: + '@eslint/object-schema': 2.1.4 + debug: 4.3.7 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/eslintrc@3.1.0': + dependencies: + ajv: 6.12.6 + debug: 4.3.7 + espree: 10.1.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.9.1': {} + + '@eslint/object-schema@2.1.4': {} + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.3.0': {} + + '@jsdevtools/ono@7.1.3': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@types/json-schema@7.0.15': {} + + acorn-jsx@5.3.2(acorn@8.12.1): + dependencies: + acorn: 8.12.1 + + acorn@8.12.1: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + argparse@2.0.1: {} + + balanced-match@1.0.2: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + callsites@3.1.0: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + concat-map@0.0.1: {} + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + debug@4.3.7: + dependencies: + ms: 2.1.3 + + deep-is@0.1.4: {} + + escape-string-regexp@4.0.0: {} + + eslint-scope@8.0.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.0.0: {} + + eslint@9.9.1: + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.1) + '@eslint-community/regexpp': 4.11.0 + '@eslint/config-array': 0.18.0 + '@eslint/eslintrc': 3.1.0 + '@eslint/js': 9.9.1 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.3.0 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.7 + escape-string-regexp: 4.0.0 + eslint-scope: 8.0.2 + eslint-visitor-keys: 4.0.0 + espree: 10.1.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + espree@10.1.0: + dependencies: + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) + eslint-visitor-keys: 4.0.0 + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + fast-deep-equal@3.1.3: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + + flatted@3.3.1: {} + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + globals@14.0.0: {} + + globals@15.9.0: {} + + has-flag@4.0.0: {} + + ignore@5.3.2: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-path-inside@3.0.3: {} + + isexe@2.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.merge@4.6.2: {} + + marked@11.2.0: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + ms@2.1.3: {} + + natural-compare@1.4.0: {} + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + prelude-ls@1.2.1: {} + + punycode@2.3.1: {} + + queue-microtask@1.2.3: {} + + resolve-from@4.0.0: {} + + reusify@1.0.4: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-json-comments@3.1.1: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + text-table@0.2.0: {} + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + yocto-queue@0.1.0: {} diff --git a/.check-schema/zilla-schema.json b/.check-schema/zilla-schema.json index a32d3990..f1b69406 100644 --- a/.check-schema/zilla-schema.json +++ b/.check-schema/zilla-schema.json @@ -6,15 +6,7 @@ "name": { "title": "Name", "type": "string", - "anyOf": [ - { - "type": "string", - "pattern": "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$" - }, - { - "$ref": "#/$defs/expression" - } - ] + "pattern": "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$" }, "vaults": { "title": "Vaults", @@ -44,15 +36,7 @@ "type": "object", "patternProperties": { "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" } } }, @@ -108,14 +92,6 @@ "type": { "title": "Type", "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], "enum": [ "filesystem" ] @@ -150,38 +126,14 @@ "type": "object", "properties": { "store": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" }, "type": { "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], "default": "pkcs12" }, "password": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" } }, "additionalProperties": false @@ -191,38 +143,14 @@ "type": "object", "properties": { "store": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" }, "type": { "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], "default": "pkcs12" }, "password": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" } }, "additionalProperties": false @@ -232,38 +160,14 @@ "type": "object", "properties": { "store": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" }, "type": { "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], "default": "pkcs12" }, "password": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" } }, "additionalProperties": false @@ -282,14 +186,6 @@ "type": { "title": "Type", "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], "enum": [ "jwt" ] @@ -321,43 +217,19 @@ "properties": { "issuer": { "title": "Issuer", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" }, "audience": { "title": "Audience", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" }, "keys": { "title": "Keys", "oneOf": [ { "type": "string", - "anyOf": [ - { - "type": "string", - "pattern": "^(https?)://" - }, - { - "$ref": "#/$defs/expression" - } - ], - "format": "uri" + "format": "uri", + "pattern": "^(https?)://" }, { "type": "array", @@ -367,27 +239,11 @@ "properties": { "kty": { "title": "Key Type", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" }, "kid": { "title": "Key ID", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" } }, "additionalProperties": true, @@ -401,15 +257,7 @@ }, "challenge": { "title": "Challenge", - "type": "number", - "anyOf": [ - { - "type": "number" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "integer" } }, "additionalProperties": false @@ -458,16 +306,10 @@ "type": { "title": "Type", "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], "enum": [ - "prometheus" + "otlp", + "prometheus", + "stdout" ] } }, @@ -475,6 +317,80 @@ "type" ], "allOf": [ + { + "if": { + "properties": { + "type": { + "const": "otlp" + } + } + }, + "then": { + "properties": { + "type": { + "const": "otlp" + }, + "options": { + "properties": { + "interval": { + "type": "number", + "default": 30 + }, + "signals": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "metrics", + "logs" + ] + } + }, + "endpoint": { + "type": "object", + "properties": { + "protocol": { + "type": "string", + "enum": [ + "http" + ], + "default": "http" + }, + "location": { + "type": "string" + }, + "overrides": { + "type": "object", + "properties": { + "metrics": { + "type": "string", + "default": "/v1/metrics" + }, + "logs": { + "type": "string", + "default": "/v1/logs" + } + } + } + }, + "required": [ + "location" + ], + "additionalProperties": false + } + }, + "required": [ + "endpoint" + ], + "additionalProperties": false + }, + "additionalProperties": false + }, + "required": [ + "options" + ] + } + }, { "if": { "properties": { @@ -493,36 +409,22 @@ "endpoints": { "type": "array", "items": { + "type": "object", "properties": { "scheme": { "title": "Scheme", + "type": "string", "enum": [ "http" ] }, "port": { "title": "Port", - "type": "integer", - "anyOf": [ - { - "type": "integer" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "integer" }, "path": { "title": "Path", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" } }, "required": [ @@ -538,25 +440,41 @@ } } } + }, + { + "if": { + "properties": { + "type": { + "const": "stdout" + } + } + }, + "then": { + "properties": { + "type": { + "const": "stdout" + } + } + } } ] } }, "catalog": { + "title": "Catalog", "type": "object", "properties": { "type": { "title": "Type", "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], "enum": [ + "apicurio-registry", + "apicurio", + "filesystem", + "inline", + "karapace-schema-registry", + "karapace", + "schema-registry" ] }, "options": { @@ -569,59 +487,205 @@ "type" ], "allOf": [ - ] - }, - "cataloged": { - "oneOf": [ { - "type": "object", - "properties": { - "id": { - "type": "integer", - "anyOf": [ - { - "type": "integer" - }, - { - "$ref": "#/$defs/expression" - } - ] + "if": { + "properties": { + "type": { + "enum": [ + "apicurio-registry", + "apicurio" + ] + } } }, - "required": [ - "id" - ], - "additionalProperties": false + "then": { + "properties": { + "type": { + "enum": [ + "apicurio-registry", + "apicurio" + ] + }, + "options": { + "properties": { + "url": { + "type": "string" + }, + "group-id": { + "type": "string", + "default": "default" + }, + "use-id": { + "type": "string", + "enum": [ + "globalId", + "contentId" + ], + "default": "globalId" + }, + "id-encoding": { + "type": "string", + "enum": [ + "default", + "legacy" + ], + "default": "default" + }, + "max-age": { + "title": "Max Age", + "type": "number", + "default": 300 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } }, { - "type": "object", - "properties": { - "schema": { - "type": "string", - "anyOf": [ - { - "type": "string" + "if": { + "properties": { + "type": { + "const": "filesystem" + } + } + }, + "then": { + "properties": { + "type": { + "const": "filesystem" + }, + "options": { + "properties": { + "subjects": { + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "title": "Subject", + "type": "object", + "properties": { + "path": { + "type": "string" + } + }, + "required": [ + "path" + ], + "additionalProperties": false + } + } + } }, - { - "$ref": "#/$defs/expression" - } - ] + "additionalProperties": false + } }, - "version": { - "type": "string", - "anyOf": [ - { - "type": "string" + "additionalProperties": false + } + }, + { + "if": { + "properties": { + "type": { + "const": "inline" + } + } + }, + "then": { + "properties": { + "type": { + "const": "inline" + }, + "options": { + "properties": { + "subjects": { + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "title": "Subject", + "type": "object", + "properties": { + "version": { + "type": "string", + "default": "latest" + }, + "schema": { + "type": "string" + } + }, + "required": [ + "schema" + ], + "additionalProperties": false + } + } + } }, - { - "$ref": "#/$defs/expression" - } - ], - "default": "latest" + "additionalProperties": false + } + }, + "additionalProperties": false + } + }, + { + "if": { + "properties": { + "type": { + "enum": [ + "karapace-schema-registry", + "karapace" + ] + } + } + }, + "then": { + "properties": { + "type": { + "enum": [ + "karapace-schema-registry", + "karapace" + ] + }, + "options": { + "$ref": "#/$defs/options/catalog/schema-registry" + } + }, + "additionalProperties": false + } + }, + { + "if": { + "properties": { + "type": { + "const": "schema-registry" + } + } + }, + "then": { + "properties": { + "type": { + "const": "schema-registry" + }, + "options": { + "$ref": "#/$defs/options/catalog/schema-registry" + } + }, + "additionalProperties": false + } + } + ] + }, + "cataloged": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "integer" } }, "required": [ - "schema" + "id" ], "additionalProperties": false }, @@ -630,25 +694,12 @@ "properties": { "strategy": { "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } + "enum": [ + "topic" ] }, "version": { "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], "default": "latest" } }, @@ -661,26 +712,10 @@ "type": "object", "properties": { "subject": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" }, "version": { "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], "default": "latest" } }, @@ -691,246 +726,688 @@ } ] }, - "binding": { - "title": "Binding", - "type": "object", - "properties": { - "vault": { - "title": "Vault", - "type": "string", - "anyOf": [ - { - "type": "string" + "options": { + "binding": { + "http": { + "authorization": { + "title": "Authorizations", + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "title": "Authorization", + "type": "object", + "properties": { + "credentials": { + "title": "Credentials", + "type": "object", + "properties": { + "cookies": { + "title": "Cookies", + "type": "object", + "additionalProperties": { + "type": "string", + "pattern": ".*\\{credentials\\}.*" + } + }, + "headers": { + "title": "Headers", + "type": "object", + "additionalProperties": { + "type": "string", + "pattern": ".*\\{credentials\\}.*" + } + }, + "query": { + "title": "Query Parameters", + "type": "object", + "additionalProperties": { + "type": "string", + "pattern": ".*\\{credentials\\}.*" + } + } + }, + "additionalProperties": false, + "anyOf": [ + { + "required": [ + "cookies" + ] + }, + { + "required": [ + "headers" + ] + }, + { + "required": [ + "query" + ] + } + ] + } + }, + "additionalProperties": false, + "required": [ + "credentials" + ] + } }, - { - "$ref": "#/$defs/expression" - } - ] + "maxProperties": 1 + } }, - "catalog": { - "type": "object", - "patternProperties": { - "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { - "type": "array", - "items": { - "$ref": "#/$defs/cataloged" + "kafka": { + "sasl": { + "title": "SASL", + "type": "object", + "properties": { + "mechanism": { + "title": "Mechanism", + "type": "string", + "enum": [ + "plain", + "scram-sha-1", + "scram-sha-256", + "scram-sha-512" + ] } - } - }, - "maxProperties": 1 - }, - "type": { - "title": "Type", - "type": "string", - "anyOf": [ - { - "type": "string" }, - { - "$ref": "#/$defs/expression" - } - ], - "enum": [ - "echo", - "fan", - "filesystem", - "grpc", - "grpc-kafka", - "http", - "http-filesystem", - "http-kafka", - "kafka", - "kafka-grpc", - "mqtt", - "mqtt-kafka", - "proxy", - "sse", - "sse-kafka", - "tcp", - "tls", - "ws" - ] - }, - "kind": { - "title": "Kind", - "enum": [ - "client", - "server", - "proxy", - "remote_server", - "cache_client", - "cache_server" - ] - }, - "options": { - "title": "Options", - "type": "object" - }, - "routes": { - "title": "Routes", - "type": "array", - "items": { - "title": "Route", - "type": "object", - "properties": { - "exit": { - "title": "Exit", - "type": "string", - "anyOf": [ - { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "mechanism": { + "const": "plain" + }, + "username": { + "title": "Username", "type": "string" }, - { - "$ref": "#/$defs/expression" + "password": { + "title": "Password", + "type": "string" } + }, + "required": [ + "username", + "password" ] }, - "when": { - "title": "Conditions", - "type": "array", - "items": { - "title": "Condition", - "type": "object" - } + { + "additionalProperties": false, + "properties": { + "mechanism": { + "const": "scram-sha-1" + }, + "username": { + "title": "Username", + "type": "string" + }, + "password": { + "title": "Password", + "type": "string" + } + }, + "required": [ + "username", + "password" + ] }, - "with": { - "title": "Override", - "type": "object" + { + "additionalProperties": false, + "properties": { + "mechanism": { + "const": "scram-sha-256" + }, + "username": { + "title": "Username", + "type": "string" + }, + "password": { + "title": "Password", + "type": "string" + } + }, + "required": [ + "username", + "password" + ] }, - "guarded": { - "title": "Guarded", - "type": "object", - "patternProperties": { - "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { - "title": "Roles", - "type": "array", - "items": { - "title": "Role", - "type": "string", - "anyOf": [ + { + "additionalProperties": false, + "properties": { + "mechanism": { + "const": "scram-sha-512" + }, + "username": { + "title": "Username", + "type": "string" + }, + "password": { + "title": "Password", + "type": "string" + } + }, + "required": [ + "username", + "password" + ] + } + ] + }, + "cache_server_topics": { + "title": "Topics", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "defaultOffset": { + "type": "string", + "enum": [ + "live", + "historical" + ] + }, + "deltaType": { + "type": "string", + "enum": [ + "none", + "json_patch" + ], + "deprecated": true + }, + "transforms": { + "title": "Transforms", + "type": "array", + "oneOf": [ + { + "minItems": 2, + "maxItems": 2, + "items": [ { - "type": "string" + "type": "object", + "additionalProperties": false, + "properties": { + "extract-key": { + "type": "string", + "pattern": "^\\$\\{message\\.(key|value)\\.([A-Za-z_][A-Za-z0-9_]*)\\}$", + "additionalProperties": false + } + } }, { - "$ref": "#/$defs/expression" + "type": "object", + "additionalProperties": false, + "properties": { + "extract-headers": { + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "type": "string", + "pattern": "^\\$\\{message\\.(key|value)\\.([A-Za-z_][A-Za-z0-9_]*)\\}$" + } + }, + "additionalProperties": false + } + } + } + ] + }, + { + "minItems": 1, + "maxItems": 1, + "items": [ + { + "type": "object", + "additionalProperties": false, + "properties": { + "extract-headers": { + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "type": "string", + "pattern": "^\\$\\{message\\.(key|value)\\.([A-Za-z_][A-Za-z0-9_]*)\\}$" + } + }, + "additionalProperties": false + } + } + } + ] + }, + { + "minItems": 1, + "maxItems": 1, + "items": [ + { + "type": "object", + "additionalProperties": false, + "properties": { + "extract-key": { + "type": "string", + "pattern": "^\\$\\{message\\.(key|value)\\.([A-Za-z_][A-Za-z0-9_]*)\\}$", + "additionalProperties": false + } + } } ] } - } + ] + }, + "key": { + "$ref": "#/$defs/converter" + }, + "value": { + "$ref": "#/$defs/converter" } } - }, - "additionalProperties": false - } - }, - "telemetry": { - "title": "Telemetry", - "type": "object", - "properties": { - "metrics": { - "type": "array" } } }, - "exit": { - "title": "Exit", - "type": "string", - "anyOf": [ - { - "type": "string" + "mqtt": { + "authorization": { + "title": "Authorizations", + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "title": "Authorization", + "type": "object", + "properties": { + "credentials": { + "title": "Credentials", + "type": "object", + "properties": { + "connect": { + "title": "Connect", + "type": "object", + "properties": { + "username": { + "title": "Username", + "type": "string" + }, + "password": { + "title": "Password", + "type": "string" + } + }, + "oneOf": [ + { + "required": [ + "username" + ] + }, + { + "required": [ + "password" + ] + } + ] + } + }, + "additionalProperties": false, + "anyOf": [ + { + "required": [ + "connect" + ] + } + ] + } + }, + "additionalProperties": false, + "required": [ + "credentials" + ] + } }, - { - "$ref": "#/$defs/expression" - } - ] + "maxProperties": 1 + } }, - "additionalProperties": false - }, - "required": [ - "type", - "kind" - ], - "anyOf": [ - { + "tcp": { + "title": "Options", + "type": "object", "properties": { - "kind": { - "const": "remote_server" + "host": { + "title": "Host", + "type": "string" }, - "entry": { - "title": "Exit", - "type": "string", - "anyOf": [ + "port": { + "title": "Port", + "oneOf": [ + { + "type": "integer" + }, { "type": "string", - "pattern": "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$" + "pattern": "^\\d+(-\\d+)?$" }, { - "$ref": "#/$defs/expression" - } - ] - } - }, - "required": [ - "entry" - ] - }, - { + "type": "array", + "items": { + "oneOf": [ + { + "type": "integer" + }, + { + "type": "string", + "pattern": "^\\d+(-\\d+)?$" + } + ] + } + } + ] + } + }, + "additionalProperties": false + }, + "tls": { + "title": "Options", + "type": "object", "properties": { - "kind": { - "not": { - "const": "remote_server" + "version": { + "title": "Version", + "type": "string" + }, + "keys": { + "title": "Vault Keys", + "type": "array", + "items": { + "type": "string" + } + }, + "trust": { + "title": "Vault Certificates", + "type": "array", + "items": { + "type": "string" + } + }, + "trustcacerts": { + "title": "Trust CA Certificates", + "type": "boolean" + }, + "sni": { + "title": "Server Names", + "type": "array", + "items": { + "type": "string" + } + }, + "alpn": { + "title": "Application Protocols", + "type": "array", + "items": { + "type": "string" + } + }, + "mutual": { + "title": "Mutual Authentication", + "type": "string", + "enum": [ + "required", + "requested", + "none" + ] + }, + "signers": { + "title": "Vault Signer Certificates", + "type": "array", + "items": { + "type": "string" } } - } + }, + "not": { + "allOf": [ + { + "required": [ + "keys" + ] + }, + { + "required": [ + "signers" + ] + } + ] + }, + "additionalProperties": false } - ], - "allOf": [ - { - "if": { - "properties": { - "type": { - "const": "echo" + }, + "catalog": { + "schema-registry": { + "title": "Schema Registry", + "type": "object", + "properties": { + "url": { + "type": "string" + }, + "context": { + "type": "string", + "default": "default" + }, + "max-age": { + "title": "Max Age", + "type": "number", + "default": 300 + } + }, + "additionalProperties": false + } + } + }, + "binding": { + "title": "Binding", + "type": "object", + "properties": { + "vault": { + "title": "Vault", + "type": "string" + }, + "catalog": { + "title": "Catalog", + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "type": "array", + "items": { + "$ref": "#/$defs/cataloged" } } }, - "then": { + "maxProperties": 1 + }, + "type": { + "title": "Type", + "type": "string", + "enum": [ + "amqp", + "asyncapi", + "echo", + "fan", + "filesystem", + "grpc", + "grpc-kafka", + "http", + "http-filesystem", + "http-kafka", + "kafka", + "kafka-grpc", + "mqtt", + "mqtt-kafka", + "openapi", + "openapi-asyncapi", + "pgsql", + "proxy", + "risingwave", + "sse", + "sse-kafka", + "tcp", + "tls", + "ws" + ] + }, + "kind": { + "title": "Kind", + "enum": [ + "client", + "server", + "proxy", + "remote_server", + "cache_client", + "cache_server" + ] + }, + "options": { + "title": "Options", + "type": "object" + }, + "routes": { + "title": "Routes", + "type": "array", + "items": { + "title": "Route", + "type": "object", "properties": { - "type": { - "const": "echo" + "exit": { + "title": "Exit", + "type": "string" }, - "kind": { - "enum": [ - "server" - ] + "when": { + "title": "Conditions", + "type": "array", + "items": { + "title": "Condition", + "type": "object" + } }, - "vault": false, - "options": false, - "routes": false, - "exit": false + "with": { + "title": "Override", + "type": "object" + }, + "guarded": { + "title": "Guarded", + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "title": "Roles", + "type": "array", + "items": { + "title": "Role", + "type": "string" + } + } + } + } + }, + "additionalProperties": false + } + }, + "telemetry": { + "title": "Telemetry", + "type": "object", + "properties": { + "metrics": { + "type": "array" } } }, + "exit": { + "title": "Exit", + "type": "string" + }, + "entry": { + "title": "Entry", + "type": "string", + "pattern": "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$" + } + }, + "additionalProperties": false, + "required": [ + "type", + "kind" + ], + "anyOf": [ + { + "properties": { + "kind": { + "const": "remote_server" + } + }, + "required": [ + "entry" + ] + }, + { + "properties": { + "kind": { + "not": { + "const": "remote_server" + } + }, + "entry": false + } + } + ], + "allOf": [ { "if": { "properties": { "type": { - "const": "fan" + "const": "amqp" } } }, "then": { "properties": { "type": { - "const": "fan" + "const": "amqp" }, "kind": { "enum": [ "server" ] }, + "catalog": false, "vault": false, "options": false, - "routes": false + "routes": { + "title": "Routes", + "type": "array", + "items": { + "type": "object", + "properties": { + "when": { + "title": "When", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "Address", + "type": "string" + }, + "capabilities": { + "title": "Capabilities", + "type": "string", + "enum": [ + "send_only", + "receive_only", + "send_and_receive" + ], + "default": "send_and_receive" + } + } + } + }, + "with": false + } + } + } }, "anyOf": [ { @@ -950,55 +1427,287 @@ "if": { "properties": { "type": { - "const": "filesystem" + "const": "asyncapi" } } }, "then": { "properties": { "type": { - "const": "filesystem" + "const": "asyncapi" }, "kind": { "enum": [ - "server" + "server", + "client", + "proxy" ] }, - "vault": false, + "catalog": false, "options": { "properties": { - "location": { - "title": "Location", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" + "specs": { + "title": "Specifications", + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "type": "object", + "properties": { + "servers": { + "title": "Servers", + "type": "array", + "items": { + "type": "object", + "properties": { + "url": { + "title": "URL", + "type": "string", + "pattern": "^([a-zA-Z0-9\\\\.-]+)(:(\\\\{[a-zA-Z_]+\\\\}|[0-9]+))?$" + }, + "host": { + "title": "Host", + "type": "string", + "pattern": "^([a-zA-Z0-9\\\\.-]+)(:(\\\\{[a-zA-Z_]+\\\\}|[0-9]+))?$" + }, + "pathname": { + "title": "Path Name", + "type": "string" + } + }, + "additionalProperties": false + } + }, + "catalog": { + "title": "Catalog", + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "version": { + "type": "string", + "default": "latest" + } + }, + "required": [ + "subject" + ], + "additionalProperties": false + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false } - ] + }, + "additionalProperties": false }, - "symlinks": { - "title": "Symbolic Links", - "type": "string", - "anyOf": [ - { - "type": "string" + "tcp": { + "$ref": "#/$defs/options/binding/tcp" + }, + "tls": { + "$ref": "#/$defs/options/binding/tls" + }, + "http": { + "title": "Http", + "type": "object", + "properties": { + "authorization": { + "$ref": "#/$defs/options/binding/http/authorization" + } + }, + "additionalProperties": false + }, + "mqtt": { + "title": "MQTT", + "type": "object", + "properties": { + "authorization": { + "$ref": "#/$defs/options/binding/mqtt/authorization" + } + }, + "additionalProperties": false + }, + "kafka": { + "title": "Kafka", + "type": "object", + "properties": { + "sasl": { + "$ref": "#/$defs/options/binding/kafka/sasl" }, - { - "$ref": "#/$defs/expression" + "topics": { + "$ref": "#/$defs/options/binding/kafka/cache_server_topics" } - ], - "enum": [ - "follow", - "ignore" - ], - "default": "ignore" + }, + "additionalProperties": false + }, + "mqtt-kafka": { + "title": "MQTT-Kafka", + "type": "object", + "properties": { + "channels": { + "title": "Channels", + "type": "object", + "properties": { + "sessions": { + "title": "Kafka Sessions Channel", + "type": "string" + }, + "messages": { + "title": "Kafka Messages Channel", + "type": "string" + }, + "retained": { + "title": "Kafka Retained Channel", + "type": "string" + }, + "additionalProperties": false + }, + "additionalProperties": false + } + }, + "additionalProperties": false } }, "additionalProperties": false }, + "routes": { + "title": "Routes", + "type": "array", + "items": { + "type": "object", + "properties": { + "when": { + "title": "When", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "api-id": { + "title": "Spec API Id", + "type": "string" + }, + "operation-id": { + "title": "MQTT Operation Id", + "type": "string" + } + } + } + }, + "with": { + "properties": { + "api-id": { + "title": "Spec API Id", + "type": "string" + }, + "operation-id": { + "title": "MQTT Operation Id", + "type": "string" + } + }, + "additionalProperties": false + } + } + } + } + }, + "oneOf": [ + { + "properties": { + "kind": { + "const": "server" + } + }, + "anyOf": [ + { + "required": [ + "exit" + ] + }, + { + "properties": { + "routes": { + "required": [ + "exit" + ] + } + }, + "required": [ + "routes" + ] + } + ] + }, + { + "properties": { + "kind": { + "const": "proxy" + } + }, + "anyOf": [ + { + "required": [ + "exit" + ] + }, + { + "properties": { + "routes": { + "required": [ + "exit" + ] + } + }, + "required": [ + "routes" + ] + } + ] + }, + { + "properties": { + "kind": { + "const": "client" + }, + "routes": { + "items": { + "properties": { + "exit": false + } + } + }, + "exit": false + } + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "echo" + } + } + }, + "then": { + "properties": { + "type": { + "const": "echo" + }, + "kind": { + "enum": [ + "server" + ] + }, + "catalog": false, + "vault": false, + "options": false, "routes": false, "exit": false } @@ -1008,60 +1717,117 @@ "if": { "properties": { "type": { - "const": "grpc" + "const": "fan" } } }, "then": { "properties": { "type": { - "const": "grpc" + "const": "fan" }, "kind": { "enum": [ - "server", - "client" + "server" ] }, + "catalog": false, "vault": false, - "options": { - "properties": { - "services": { - "title": "Services", - "type": "array", - "items": { - "title": "Service", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - } - } - }, - "additionalProperties": false + "options": false, + "routes": false + }, + "anyOf": [ + { + "required": [ + "exit" + ] }, - "routes": { - "items": { - "properties": { - "when": { - "items": { - "properties": { + { + "required": [ + "routes" + ] + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "filesystem" + } + } + }, + "then": { + "properties": { + "type": { + "const": "filesystem" + }, + "kind": { + "enum": [ + "server" + ] + }, + "catalog": false, + "vault": false, + "options": { + "properties": { + "location": { + "title": "Location", + "type": "string" + }, + "symlinks": { + "title": "Symbolic Links", + "type": "string", + "enum": [ + "follow", + "ignore" + ], + "default": "ignore" + } + }, + "additionalProperties": false + }, + "routes": false, + "exit": false + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "grpc" + } + } + }, + "then": { + "properties": { + "type": { + "const": "grpc" + }, + "kind": { + "enum": [ + "server", + "client" + ] + }, + "vault": false, + "routes": { + "title": "Routes", + "type": "array", + "items": { + "type": "object", + "properties": { + "when": { + "title": "When", + "type": "array", + "items": { + "type": "object", + "properties": { "method": { "title": "Method", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" }, "metadata": { "title": "Metadata", @@ -1069,30 +1835,14 @@ "additionalProperties": { "oneOf": [ { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" }, { "type": "object", "properties": { "base64": { "title": "Base64 value", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" } } } @@ -1119,6 +1869,38 @@ "routes" ] } + ], + "oneOf": [ + { + "properties": { + "kind": { + "const": "server" + }, + "options": { + "properties": { + "services": { + "title": "Services", + "type": "array", + "items": { + "title": "Service", + "type": "string" + }, + "deprecated": true + } + }, + "additionalProperties": false + } + } + }, + { + "properties": { + "kind": { + "const": "client" + }, + "catalog": false, + "options": false + } + } ] } }, @@ -1140,6 +1922,7 @@ "proxy" ] }, + "catalog": false, "vault": false, "options": { "properties": { @@ -1150,14 +1933,6 @@ "field": { "title": "Grpc Last Message Id", "type": "integer", - "anyOf": [ - { - "type": "integer" - }, - { - "$ref": "#/$defs/expression" - } - ], "minimum": 1, "maximum": 536870911, "default": 32767 @@ -1165,14 +1940,6 @@ "metadata": { "title": "Grpc Last Message Id Metadata Name", "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], "default": "last-message-id" } } @@ -1184,14 +1951,6 @@ "metadata": { "title": "Idempotency Metadata name", "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], "default": "idempotency-key" } } @@ -1207,53 +1966,21 @@ "service": { "title": "Grpc Service Kafka Header", "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], "default": "zilla:service" }, "method": { "title": "Grpc Method Kafka Header", "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], "default": "zilla:method" }, "correlation-id": { "title": "Correlation-Id Kafka Header", "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], "default": "zilla:correlation-id" }, "reply-to": { "title": "Reply to Topic", "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], "default": "zilla:reply-to" } }, @@ -1269,23 +1996,21 @@ "additionalProperties": false }, "routes": { + "title": "Routes", + "type": "array", "items": { + "type": "object", "properties": { "when": { + "title": "When", + "type": "array", "items": { + "type": "object", "properties": { "method": { "title": "Method", "type": "string", - "anyOf": [ - { - "type": "string", - "pattern": "^(?[^/]+)/(?[^/]+)" - }, - { - "$ref": "#/$defs/expression" - } - ] + "pattern": "^(?[^/]+)/(?[^/]+)" }, "metadata": { "title": "Metadata", @@ -1293,30 +2018,14 @@ "additionalProperties": { "oneOf": [ { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" }, { "type": "object", "properties": { "base64": { "title": "Base64 value", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" } } } @@ -1334,58 +2043,27 @@ "capability": { "title": "Capability", "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], "const": "fetch" }, "topic": { "title": "Topic", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" }, "filters": { "title": "Filters", "type": "array", "items": { + "type": "object", "properties": { "key": { "title": "Key", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" }, "headers": { "title": "Headers", "type": "object", "additionalProperties": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" } } }, @@ -1400,83 +2078,36 @@ "capability": { "title": "Capability", "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], "const": "produce" }, "topic": { "title": "Topic", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" }, "acks": { "title": "Acks", "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], "enum": [ "none", "leader_only", "in_sync_replicas" - ] + ], + "default": "in_sync_replicas" }, "key": { "title": "Key", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" }, "overrides": { "title": "Headers", "type": "object", "additionalProperties": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" } }, "reply-to": { "title": "Reply-To topic", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" } }, "additionalProperties": false, @@ -1522,6 +2153,7 @@ "client" ] }, + "catalog": false, "vault": false, "options": { "properties": { @@ -1535,14 +2167,6 @@ "items": { "title": "Version", "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], "enum": [ "http/1.1", "h2" @@ -1556,14 +2180,11 @@ "policy": { "title": "Policy", "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "enum": [ + "same-origin", + "cross-origin" + ], + "default": "same-origin" } }, "oneOf": [ @@ -1587,73 +2208,33 @@ "title": "Origins", "type": "array", "items": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" } }, "methods": { "title": "Methods", "type": "array", "items": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" } }, "headers": { "title": "Headers", "type": "array", "items": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" } }, "credentials": { "title": "Credentials", - "type": "boolean", - "anyOf": [ - { - "type": "boolean" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "boolean" } }, "additionalProperties": false }, "max-age": { "title": "Max Age", - "type": "number", - "anyOf": [ - { - "type": "number" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "number" }, "expose": { "title": "Expose", @@ -1663,15 +2244,7 @@ "title": "Headers", "type": "array", "items": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" } } }, @@ -1683,107 +2256,13 @@ ] }, "authorization": { - "title": "Authorizations", - "type": "object", - "patternProperties": { - "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { - "title": "Authorization", - "type": "object", - "properties": { - "credentials": { - "title": "Credentials", - "type": "object", - "properties": { - "cookies": { - "title": "Cookies", - "type": "object", - "additionalProperties": { - "type": "string", - "anyOf": [ - { - "type": "string", - "pattern": ".*\\{credentials\\}.*" - }, - { - "$ref": "#/$defs/expression" - } - ] - } - }, - "headers": { - "title": "Headers", - "type": "object", - "additionalProperties": { - "type": "string", - "anyOf": [ - { - "type": "string", - "pattern": ".*\\{credentials\\}.*" - }, - { - "$ref": "#/$defs/expression" - } - ] - } - }, - "query": { - "title": "Query Parameters", - "type": "object", - "additionalProperties": { - "type": "string", - "anyOf": [ - { - "type": "string", - "pattern": ".*\\{credentials\\}.*" - }, - { - "$ref": "#/$defs/expression" - } - ] - } - } - }, - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "cookies" - ] - }, - { - "required": [ - "headers" - ] - }, - { - "required": [ - "query" - ] - } - ] - } - }, - "additionalProperties": false, - "required": [ - "credentials" - ] - } - }, - "maxProperties": 1 + "$ref": "#/$defs/options/binding/http/authorization" }, "overrides": { "title": "Overrides", "type": "object", "additionalProperties": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" } }, "requests": { @@ -1792,26 +2271,10 @@ "type": "object", "properties": { "path": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" }, "method": { "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], "enum": [ "GET", "PUT", @@ -1826,15 +2289,7 @@ "content-type": { "type": "array", "items": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" } }, "headers": { @@ -1878,28 +2333,12 @@ "status": { "oneOf": [ { - "type": "integer", - "anyOf": [ - { - "type": "integer" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "integer" }, { "type": "array", "items": { - "type": "integer", - "anyOf": [ - { - "type": "integer" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "integer" } } ] @@ -1907,15 +2346,7 @@ "content-type": { "type": "array", "items": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" } }, "headers": { @@ -1979,31 +2410,47 @@ "additionalProperties": false }, "routes": { + "title": "Routes", + "type": "array", "items": { + "type": "object", "properties": { "when": { + "title": "When", + "type": "array", "items": { + "type": "object", "properties": { "headers": { "title": "Headers", "type": "object", "additionalProperties": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" } } }, "additionalProperties": false } }, - "with": false + "with": { + "properties": { + "headers": { + "title": "Headers", + "type": "object", + "properties": { + "overrides": { + "title": "Overrides", + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } } } } @@ -2019,6 +2466,28 @@ "routes" ] } + ], + "oneOf": [ + { + "properties": { + "kind": { + "const": "server" + } + } + }, + { + "properties": { + "kind": { + "const": "client" + }, + "options": { + "properties": { + "access-control": false, + "authorization": false + } + } + } + } ] } }, @@ -2040,25 +2509,24 @@ "proxy" ] }, + "catalog": false, "vault": false, "options": false, "routes": { + "title": "Routes", + "type": "array", "items": { + "type": "object", "properties": { "when": { + "title": "When", + "type": "array", "items": { + "type": "object", "properties": { "path": { "title": "Path", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" } }, "additionalProperties": false @@ -2068,15 +2536,7 @@ "properties": { "path": { "title": "Topic", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" } }, "additionalProperties": false, @@ -2120,6 +2580,7 @@ "proxy" ] }, + "catalog": false, "vault": false, "options": { "properties": { @@ -2130,14 +2591,6 @@ "header": { "title": "Idempotency Key HTTP Header", "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], "default": "idempotency-key" } }, @@ -2157,27 +2610,11 @@ "reply-to": { "title": "Reply-To Kafka Header", "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], "default": "zilla:reply-to" }, "correlation-id": { "title": "Correlation-Id Kafka Header", "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], "default": "zilla:correlation-id" } }, @@ -2193,34 +2630,25 @@ "additionalProperties": false }, "routes": { + "title": "Routes", + "type": "array", "items": { + "type": "object", "properties": { "when": { + "title": "When", + "type": "array", "items": { + "type": "object", "properties": { "method": { "title": "Method", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" }, "path": { "title": "Path", "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "pattern": "^/" } }, "additionalProperties": false @@ -2233,58 +2661,27 @@ "capability": { "title": "Capability", "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], "const": "fetch" }, "topic": { "title": "Topic", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" }, "filters": { "title": "Filters", "type": "array", "items": { + "type": "object", "properties": { "key": { "title": "Key", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" }, "headers": { "title": "Headers", "type": "object", "additionalProperties": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" } } }, @@ -2298,14 +2695,6 @@ "content-type": { "title": "Content Type", "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], "const": "application/json" }, "patch": { @@ -2315,27 +2704,11 @@ "initial": { "title": "Initial Value", "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], "const": "[]" }, "path": { "title": "Path", "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], "const": "/-" } }, @@ -2359,97 +2732,42 @@ "capability": { "title": "Capability", "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], "const": "produce" }, "topic": { "title": "Topic", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" }, "acks": { "title": "Acks", "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], "enum": [ "none", "leader_only", "in_sync_replicas" - ] + ], + "default": "in_sync_replicas" }, "key": { "title": "Key", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" }, "overrides": { "title": "Headers", "type": "object", "additionalProperties": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" } }, "reply-to": { "title": "Reply-To", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" }, "async": { "title": "Async", "type": "object", "additionalProperties": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" } } }, @@ -2499,338 +2817,127 @@ "client" ] }, + "catalog": false, "vault": false, - "options": { - "properties": { - "merged": { - "title": "Merged", - "type": "array", - "items": { - "type": "string", - "anyOf": [ - { - "type": "string" + "routes": { + "title": "Routes", + "type": "array", + "items": { + "type": "object", + "properties": { + "when": { + "title": "When", + "type": "array", + "items": { + "type": "object", + "properties": { + "topic": { + "title": "Topic", + "type": "string" + }, + "groupId": { + "title": "groupId", + "type": "string", + "deprecated": true + } }, - { - "$ref": "#/$defs/expression" - } - ] + "additionalProperties": false + } }, - "deprecated": true - }, - "bootstrap": { - "title": "Bootstrap", - "type": "array", - "items": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - } + "with": false + } + } + } + }, + "anyOf": [ + { + "required": [ + "exit" + ] + }, + { + "required": [ + "routes" + ] + } + ], + "oneOf": [ + { + "properties": { + "kind": { + "const": "cache_client" }, - "topics": { - "title": "Topics", - "type": "array", - "items": { - "type": "object", - "additionalProperties": false, - "properties": { - "name": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - "defaultOffset": { - "type": "string", - "anyOf": [ - { + "options": { + "properties": { + "topics": { + "title": "Topics", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { "type": "string" }, - { - "$ref": "#/$defs/expression" - } - ], - "enum": [ - "live", - "historical" - ] - }, - "deltaType": { - "type": "string", - "anyOf": [ - { - "type": "string" + "key": { + "$ref": "#/$defs/converter" }, - { - "$ref": "#/$defs/expression" + "value": { + "$ref": "#/$defs/converter" } - ], - "enum": [ - "none", - "json_patch" - ], - "deprecated": true - }, - "key": { - "$ref": "#/$defs/converter" - }, - "value": { - "$ref": "#/$defs/converter" + } } } - } + }, + "additionalProperties": false + } + } + }, + { + "properties": { + "kind": { + "const": "cache_server" }, - "servers": { - "title": "Servers", - "type": "array", - "items": { - "type": "string", - "anyOf": [ - { - "type": "string", - "pattern": "([^\\:]+):(\\d+)" - }, - { - "$ref": "#/$defs/expression" + "options": { + "properties": { + "bootstrap": { + "title": "Bootstrap", + "type": "array", + "items": { + "type": "string" } - ] - } + }, + "topics": { + "$ref": "#/$defs/options/binding/kafka/cache_server_topics" + } + }, + "additionalProperties": false + } + } + }, + { + "properties": { + "kind": { + "const": "client" }, - "sasl": { - "title": "SASL", - "type": "object", + "options": { "properties": { - "mechanism": { - "title": "Mechanism", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], - "enum": [ - "plain", - "scram-sha-1", - "scram-sha-256", - "scram-sha-512" - ] + "servers": { + "title": "Servers", + "type": "array", + "items": { + "type": "string", + "pattern": "([^\\:]+):(\\d+)" + } + }, + "sasl": { + "$ref": "#/$defs/options/binding/kafka/sasl" } }, - "oneOf": [ - { - "additionalProperties": false, - "properties": { - "mechanism": { - "const": "plain" - }, - "username": { - "title": "Username", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - "password": { - "title": "Password", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - } - }, - "required": [ - "username", - "password" - ] - }, - { - "additionalProperties": false, - "properties": { - "mechanism": { - "const": "scram-sha-1" - }, - "username": { - "title": "Username", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - "password": { - "title": "Password", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - } - }, - "required": [ - "username", - "password" - ] - }, - { - "additionalProperties": false, - "properties": { - "mechanism": { - "const": "scram-sha-256" - }, - "username": { - "title": "Username", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - "password": { - "title": "Password", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - } - }, - "required": [ - "username", - "password" - ] - }, - { - "additionalProperties": false, - "properties": { - "mechanism": { - "const": "scram-sha-512" - }, - "username": { - "title": "Username", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - "password": { - "title": "Password", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - } - }, - "required": [ - "username", - "password" - ] - } - ] - } - }, - "additionalProperties": false - }, - "routes": { - "items": { - "properties": { - "when": { - "items": { - "properties": { - "topic": { - "title": "Topic", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - "groupId": { - "title": "groupId", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], - "deprecated": true - } - }, - "additionalProperties": false - } - }, - "with": false + "additionalProperties": false } } } - }, - "anyOf": [ - { - "required": [ - "exit" - ] - }, - { - "required": [ - "routes" - ] - } ] } }, @@ -2852,25 +2959,19 @@ "remote_server" ] }, + "catalog": false, "vault": false, "options": { "properties": { "acks": { "title": "Acks", "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], "enum": [ "none", "leader_only", "in_sync_replicas" - ] + ], + "default": "in_sync_replicas" }, "idempotency": { "title": "Idempotency", @@ -2879,14 +2980,6 @@ "metadata": { "title": "Idempotency Metadata name", "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], "default": "idempotency-key" } } @@ -2902,53 +2995,21 @@ "service": { "title": "Grpc Service Kafka Header", "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], "default": "zilla:service" }, "method": { "title": "Grpc Method Kafka Header", "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], "default": "zilla:method" }, "correlation-id": { "title": "Correlation-Id Kafka Header", "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], "default": "zilla:correlation-id" }, "reply-to": { "title": "Reply to Topic", "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], "default": "zilla:reply-to" } }, @@ -2960,74 +3021,40 @@ } }, "routes": { + "title": "Routes", + "type": "array", "items": { + "type": "object", "properties": { "when": { + "title": "When", + "type": "array", "items": { + "type": "object", "properties": { "topic": { "title": "Topic", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" }, "key": { "title": "Key", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" }, "headers": { "title": "Headers", "type": "object", "additionalProperties": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" } }, "reply-to": { "title": "ReplyTo", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" }, "method": { "title": "Method", "type": "string", - "anyOf": [ - { - "type": "string", - "pattern": "^(?[^/]+)/(?[^/]+)" - }, - { - "$ref": "#/$defs/expression" - } - ] + "pattern": "^(?[^/]+)/(?[^/]+)" } }, "additionalProperties": false, @@ -3041,27 +3068,11 @@ "properties": { "scheme": { "title": "Scheme", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" }, "authority": { "title": "Authority", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" } }, "additionalProperties": false, @@ -3102,150 +3113,32 @@ "client" ] }, + "catalog": false, "vault": false, - "options": { - "properties": { - "versions": { - "title": "Versions", - "type": "array", - "items": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], - "enum": [ - "v3.1.1", - "v5" - ] - } - }, - "authorization": { - "title": "Authorizations", - "type": "object", - "patternProperties": { - "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { - "title": "Guard", - "type": "object", - "properties": { - "credentials": { - "title": "Credentials", - "type": "object", - "properties": { - "connect": { - "title": "Connect", - "type": "object", - "properties": { - "username": { - "title": "Username", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - "password": { - "title": "Password", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - } - }, - "oneOf": [ - { - "required": [ - "username" - ] - }, - { - "required": [ - "password" - ] - } - ] - } - }, - "additionalProperties": false, - "anyOf": [ - { - "required": [ - "connect" - ] - } - ] - } - }, - "additionalProperties": false, - "required": [ - "credentials" - ] - } - }, - "maxProperties": 1 - }, - "topics": { - "title": "Topics", - "type": "array", - "items": { - "type": "object", - "additionalProperties": false, - "properties": { - "name": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - "content": { - "$ref": "#/$defs/validator" - } - } - } - } - }, - "additionalProperties": false - }, "routes": { + "title": "Routes", + "type": "array", "items": { + "type": "object", "properties": { "when": { + "title": "When", + "type": "array", "items": { + "type": "object", "additionalProperties": false, "properties": { "session": { "title": "Session", "type": "array", "items": { - "client-id": { - "title": "Client Id", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "object", + "additionalProperties": false, + "properties": { + "client-id": { + "title": "Client Id", + "type": "string" + } } } }, @@ -3253,35 +3146,27 @@ "title": "Subscribe", "type": "array", "items": { - "topic": { - "title": "Topic", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "object", + "additionalProperties": false, + "properties": { + "topic": { + "title": "Topic", + "type": "string" + } } } }, "publish": { - "title": "Subscribe", + "title": "Publish", "type": "array", "items": { - "topic": { - "title": "Topic", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "object", + "additionalProperties": false, + "properties": { + "topic": { + "title": "Topic", + "type": "string" + } } } } @@ -3304,6 +3189,73 @@ "routes" ] } + ], + "oneOf": [ + { + "properties": { + "kind": { + "const": "server" + }, + "options": { + "properties": { + "versions": { + "title": "Versions", + "type": "array", + "items": { + "type": "string", + "enum": [ + "v3.1.1", + "v5" + ] + } + }, + "authorization": { + "$ref": "#/$defs/options/binding/mqtt/authorization" + }, + "topics": { + "title": "Topics", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "content": { + "$ref": "#/$defs/validator" + }, + "user-properties": { + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "$ref": "#/$defs/validator" + } + } + } + } + } + } + }, + "additionalProperties": false + } + } + }, + { + "properties": { + "kind": { + "const": "client" + }, + "options": { + "properties": { + "authorization": { + "$ref": "#/$defs/options/binding/mqtt/authorization" + } + }, + "additionalProperties": false + } + } + } ] } }, @@ -3325,20 +3277,13 @@ "proxy" ] }, + "catalog": false, "vault": false, "options": { "properties": { "server": { "title": "Server Reference", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" }, "topics": { "title": "Topics", @@ -3346,39 +3291,15 @@ "properties": { "sessions": { "title": "Kafka Sessions Topic", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" }, "messages": { "title": "Kafka Messages Topic", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" }, "retained": { "title": "Kafka Retained Topic", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" }, "additionalProperties": false }, @@ -3393,16 +3314,29 @@ "title": "Clients", "type": "array", "items": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" } + }, + "publish": { + "title": "Publish", + "type": "object", + "properties": { + "qosMax": { + "title": "Maximum QoS", + "type": "string", + "enum": [ + "at_most_once", + "at_least_once", + "exactly_once" + ], + "default": "exactly_once" + }, + "additionalProperties": false + }, + "required": [ + "qosMax" + ], + "additionalProperties": false } }, "required": [ @@ -3411,10 +3345,16 @@ "additionalProperties": false }, "routes": { + "title": "Routes", + "type": "array", "items": { + "type": "object", "properties": { "when": { + "title": "When", + "type": "array", "items": { + "type": "object", "anyOf": [ { "properties": { @@ -3422,18 +3362,11 @@ "title": "Subscribe", "type": "array", "items": { + "type": "object", "properties": { "topic": { "title": "Topic", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" } }, "additionalProperties": false @@ -3447,18 +3380,11 @@ "title": "Publish", "type": "array", "items": { + "type": "object", "properties": { "topic": { "title": "Topic", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" } }, "additionalProperties": false @@ -3473,15 +3399,7 @@ "properties": { "messages": { "title": "Messages Topic", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "type": "string" } }, "additionalProperties": false @@ -3514,14 +3432,14 @@ "if": { "properties": { "type": { - "const": "proxy" + "const": "openapi" } } }, "then": { "properties": { "type": { - "const": "proxy" + "const": "openapi" }, "kind": { "enum": [ @@ -3529,247 +3447,102 @@ "server" ] }, - "vault": false, - "options": false, - "routes": { - "items": { - "properties": { - "when": { - "items": { - "additionalProperties": false, + "catalog": false, + "options": { + "properties": { + "tcp": { + "$ref": "#/$defs/options/binding/tcp" + }, + "tls": { + "$ref": "#/$defs/options/binding/tls" + }, + "http": { + "title": "Http", + "type": "object", + "properties": { + "authorization": { + "$ref": "#/$defs/options/binding/http/authorization" + } + }, + "additionalProperties": false + }, + "specs": { + "title": "Specs", + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "type": "object", "properties": { - "transport": { - "title": "Transport", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], - "enum": [ - "stream", - "datagram" - ] - }, - "family": { - "title": "Family", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], - "enum": [ - "inet", - "inet4", - "inet6", - "unix" - ] - }, - "source": { - "title": "Source", - "type": "object", - "additionalProperties": false, - "properties": { - "host": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - "port": { - "type": "integer", - "anyOf": [ - { - "type": "integer" - }, - { - "$ref": "#/$defs/expression" - } - ] - } - } - }, - "destination": { - "title": "Source", - "type": "object", - "additionalProperties": false, - "properties": { - "host": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "servers": { + "title": "Servers", + "type": "array", + "items": { + "type": "object", + "properties": { + "url": { + "title": "URL", + "type": "string", + "pattern": "^([a-zA-Z0-9\\\\.-]+)(:(\\\\{[a-zA-Z_]+\\\\}|[0-9]+))?$" + } }, - "port": { - "type": "integer", - "anyOf": [ - { - "type": "integer" - }, - { - "$ref": "#/$defs/expression" - } - ] - } + "additionalProperties": false } }, - "info": { - "title": "Info", + "catalog": { + "title": "Catalog", "type": "object", - "additionalProperties": false, - "properties": { - "alpn": { - "title": "Application Protocol", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - "authority": { - "title": "Authority", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - "identity": { - "title": "Identity", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - "namespace": { - "title": "Namespace", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - "secure": { - "title": "Secure", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { "type": "object", - "additionalProperties": false, "properties": { - "version": { - "title": "Protocol Version", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - "cipher": { - "title": "Cipher Name", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - "key": { - "title": "Key Algorithm", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - "name": { - "title": "Common Name", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "subject": { + "type": "string" }, - "signature": { - "title": "Signature Algorithm", + "version": { "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "default": "latest" } - } - } + }, + "required": [ + "subject" + ], + "additionalProperties": false + }, + "additionalProperties": false } } - } + }, + "additionalProperties": false } - }, - "with": false + } } - } - } + }, + "additionalProperties": false + }, + "routes": false }, - "anyOf": [ + "oneOf": [ { - "required": [ - "exit" + "properties": { + "kind": { + "const": "server" + } + }, + "anyOf": [ + { + "required": [ + "exit" + ] + } ] }, { - "required": [ - "routes" - ] + "properties": { + "kind": { + "const": "client" + }, + "exit": false + } } ] } @@ -3778,63 +3551,147 @@ "if": { "properties": { "type": { - "const": "sse" + "const": "openapi-asyncapi" } } }, "then": { "properties": { "type": { - "const": "sse" + "const": "openapi-asyncapi" }, "kind": { "enum": [ - "client", - "server" + "proxy" ] }, + "catalog": false, "vault": false, "options": { "properties": { - "retry": { - "type": "integer", - "anyOf": [ - { - "type": "integer" - }, - { - "$ref": "#/$defs/expression" - } - ], - "default": 2000 - } - }, - "additionalProperties": false - }, - "routes": { - "items": { - "properties": { - "when": { + "specs": { + "title": "Specs", + "type": "object", + "properties": { + "openapi": { + "title": "Openapi", + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "type": "object", + "properties": { + "catalog": { + "title": "Catalog", + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "version": { + "type": "string", + "default": "latest" + } + }, + "required": [ + "subject" + ], + "additionalProperties": false + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false + } + } + }, + "asyncapi": { + "title": "Asyncapi", + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "type": "object", + "properties": { + "catalog": { + "title": "Catalog", + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "version": { + "type": "string", + "default": "latest" + } + }, + "required": [ + "subject" + ], + "additionalProperties": false + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false + } + } + } + }, + "required": [ + "openapi", + "asyncapi" + ] + } + }, + "additionalProperties": false + }, + "routes": { + "title": "Routes", + "type": "array", + "items": { + "type": "object", + "properties": { + "when": { + "title": "When", + "type": "array", "items": { + "type": "object", "properties": { - "path": { - "title": "Path", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "api-id": { + "title": "ApiId", + "type": "string" + }, + "operation-id": { + "title": "OperationId", + "type": "string" } }, "additionalProperties": false } }, - "with": false - } + "with": { + "properties": { + "api-id": { + "title": "ApiId", + "type": "string" + }, + "operation-id": { + "title": "OperationId", + "type": "string" + } + } + } + }, + "required": [ + "with" + ] } } }, @@ -3856,135 +3713,31 @@ "if": { "properties": { "type": { - "const": "sse-kafka" + "const": "pgsql" } } }, "then": { "properties": { "type": { - "const": "sse-kafka" + "const": "pgsql" }, "kind": { "enum": [ - "proxy" + "client", + "server" ] }, + "catalog": false, "vault": false, "options": false, - "routes": { - "items": { - "properties": { - "when": { - "items": { - "properties": { - "path": { - "title": "Path", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - } - }, - "additionalProperties": false - } - }, - "with": { - "properties": { - "topic": { - "title": "Topic", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - "filters": { - "title": "Filters", - "type": "array", - "items": { - "properties": { - "key": { - "title": "Key", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - "headers": { - "title": "Headers", - "type": "object", - "additionalProperties": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - } - } - }, - "additionalProperties": false - } - }, - "event": { - "properties": { - "id": { - "title": "Id", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], - "enum": [ - "${etag}", - "[\"${base64(key)}\",\"${etag}\"]" - ], - "default": "${etag}" - } - } - } - }, - "additionalProperties": false, - "required": [ - "topic" - ] - } - } - } - } + "routes": false }, "anyOf": [ { "required": [ "exit" ] - }, - { - "required": [ - "routes" - ] } ] } @@ -3993,188 +3746,132 @@ "if": { "properties": { "type": { - "const": "tcp" + "const": "proxy" } } }, "then": { "properties": { "type": { - "const": "tcp" + "const": "proxy" }, "kind": { "enum": [ - "server", - "client" + "client", + "server" ] }, + "catalog": false, "vault": false, - "options": { - "properties": { - "host": { - "title": "Host", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - "port": { - "title": "Port", - "oneOf": [ - { - "type": "integer", - "anyOf": [ - { - "type": "integer" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - { - "type": "string", - "anyOf": [ - { - "type": "string", - "pattern": "^\\d+(-\\d+)?$" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - { - "type": "array", - "items": { - "oneOf": [ - { - "type": "integer", - "anyOf": [ - { - "type": "integer" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - { - "type": "string", - "anyOf": [ - { - "type": "string", - "pattern": "^\\d+(-\\d+)?$" - }, - { - "$ref": "#/$defs/expression" - } - ] - } - ] - } - } - ] - } - }, - "additionalProperties": false - }, + "options": false, "routes": { + "title": "Routes", + "type": "array", "items": { + "type": "object", "properties": { "when": { + "title": "When", + "type": "array", "items": { - "properties": { - "authority": { - "title": "Authority", + "type": "object", + "additionalProperties": false, + "properties": { + "transport": { + "title": "Transport", "type": "string", - "anyOf": [ - { + "enum": [ + "stream", + "datagram" + ] + }, + "family": { + "title": "Family", + "type": "string", + "enum": [ + "inet", + "inet4", + "inet6", + "unix" + ] + }, + "source": { + "title": "Source", + "type": "object", + "additionalProperties": false, + "properties": { + "host": { "type": "string" }, - { - "$ref": "#/$defs/expression" + "port": { + "type": "integer" } - ] + } }, - "cidr": { - "title": "CIDR Mask", - "type": "string", - "anyOf": [ - { - "type": "string", - "pattern": "^[0-9a-fA-F:.]+/(\\d{1,3})$" + "destination": { + "title": "Source", + "type": "object", + "additionalProperties": false, + "properties": { + "host": { + "type": "string" }, - { - "$ref": "#/$defs/expression" + "port": { + "type": "integer" } - ] + } }, - "port": { - "title": "Port", - "oneOf": [ - { - "type": "integer", - "anyOf": [ - { - "type": "integer" - }, - { - "$ref": "#/$defs/expression" - } - ] + "info": { + "title": "Info", + "type": "object", + "additionalProperties": false, + "properties": { + "alpn": { + "title": "Application Protocol", + "type": "string" }, - { - "type": "string", - "anyOf": [ - { - "type": "string", - "pattern": "^\\d+(-\\d+)?$" + "authority": { + "title": "Authority", + "type": "string" + }, + "identity": { + "title": "Identity", + "type": "string" + }, + "namespace": { + "title": "Namespace", + "type": "string" + }, + "secure": { + "title": "Secure", + "type": "object", + "additionalProperties": false, + "properties": { + "version": { + "title": "Protocol Version", + "type": "string" }, - { - "$ref": "#/$defs/expression" + "cipher": { + "title": "Cipher Name", + "type": "string" + }, + "key": { + "title": "Key Algorithm", + "type": "string" + }, + "name": { + "title": "Common Name", + "type": "string" + }, + "signature": { + "title": "Signature Algorithm", + "type": "string" } - ] - }, - { - "type": "array", - "items": { - "oneOf": [ - { - "type": "integer", - "anyOf": [ - { - "type": "integer" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - { - "type": "string", - "anyOf": [ - { - "type": "string", - "pattern": "^\\d+(-\\d+)?$" - }, - { - "$ref": "#/$defs/expression" - } - ] - } - ] } } - ] + } } - }, - "additionalProperties": false + } } }, "with": false @@ -4182,48 +3879,89 @@ } } }, - "oneOf": [ + "anyOf": [ { - "properties": { - "kind": { - "const": "server" - } - }, - "anyOf": [ - { - "required": [ - "exit" - ] - }, - { - "properties": { - "routes": { - "required": [ - "exit" - ] - } - }, - "required": [ - "routes" - ] - } + "required": [ + "exit" ] }, { + "required": [ + "routes" + ] + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "risingwave" + } + } + }, + "then": { + "properties": { + "type": { + "const": "risingwave" + }, + "kind": { + "enum": [ + "proxy" + ] + }, + "vault": false, + "options": { "properties": { - "kind": { - "const": "client" - }, - "routes": { - "items": { + "kafka": { + "title": "Kafka", + "type": "object", + "properties": { "properties": { - "exit": false + "title": "Properties", + "type": "object", + "properties": { + "bootstrap.server": { + "type": "string" + } + } + }, + "format": { + "$ref": "#/$defs/converter" } } - }, - "exit": false + } + }, + "additionalProperties": false + }, + "routes": { + "items": { + "properties": { + "when": { + "items": { + "additionalProperties": false, + "properties": { + "commands": { + "title": "Commands", + "type": "array", + "items": { + "type": "string", + "enum": [ + "CREATE TOPIC" + ] + } + } + } + } + }, + "with": false + } } } + }, + "required": [ + "exit" ] } }, @@ -4231,225 +3969,70 @@ "if": { "properties": { "type": { - "const": "tls" + "const": "sse" } } }, "then": { "properties": { "type": { - "const": "tls" + "const": "sse" }, "kind": { "enum": [ "client", - "server", - "proxy" + "server" ] }, + "catalog": false, + "vault": false, "options": { "properties": { - "version": { - "title": "Version", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + "retry": { + "type": "integer", + "default": 2000 }, - "keys": { - "title": "Vault Keys", + "requests": { "type": "array", "items": { - "type": "string", - "anyOf": [ - { + "type": "object", + "properties": { + "path": { "type": "string" }, - { - "$ref": "#/$defs/expression" + "content": { + "$ref": "#/$defs/validator" } - ] - } - }, - "trust": { - "title": "Vault Certificates", - "type": "array", - "items": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - } - }, - "trustcacerts": { - "title": "Trust CA Certificates", - "type": "boolean", - "anyOf": [ - { - "type": "boolean" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - "sni": { - "title": "Server Names", - "type": "array", - "items": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - } - }, - "alpn": { - "title": "Application Protocols", - "type": "array", - "items": { - "type": [ - "string", - "null" - ] - } - }, - "mutual": { - "title": "Mutual Authentication", - "type": "string", - "anyOf": [ - { - "type": "string" }, - { - "$ref": "#/$defs/expression" - } - ], - "enum": [ - "required", - "requested", - "none" - ] - }, - "signers": { - "title": "Vault Signer Certificates", - "type": "array", - "items": { - "type": "string", "anyOf": [ { - "type": "string" - }, - { - "$ref": "#/$defs/expression" + "required": [ + "path", + "content" + ] } - ] + ], + "additionalProperties": false } } }, "additionalProperties": false }, "routes": { + "title": "Routes", + "type": "array", "items": { + "type": "object", "properties": { "when": { + "title": "When", + "type": "array", "items": { + "type": "object", "properties": { - "authority": { - "title": "Authority", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - "alpn": { - "title": "Application Protocol", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - "port": { - "title": "Port", - "oneOf": [ - { - "type": "integer", - "anyOf": [ - { - "type": "integer" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - { - "type": "string", - "anyOf": [ - { - "type": "string", - "pattern": "^\\d+(-\\d+)?$" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - { - "type": "array", - "items": { - "oneOf": [ - { - "type": "integer", - "anyOf": [ - { - "type": "integer" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - { - "type": "string", - "anyOf": [ - { - "type": "string", - "pattern": "^\\d+(-\\d+)?$" - }, - { - "$ref": "#/$defs/expression" - } - ] - } - ] - } - } - ] + "path": { + "title": "Path", + "type": "string" } }, "additionalProperties": false @@ -4478,937 +4061,1241 @@ "if": { "properties": { "type": { - "const": "ws" + "const": "sse-kafka" } } }, "then": { "properties": { "type": { - "const": "ws" + "const": "sse-kafka" }, "kind": { "enum": [ - "client", - "server" + "proxy" ] }, + "catalog": false, "vault": false, - "options": { - "properties": { - "defaults": { - "title": "Defaults", - "type": "object", - "additoinalProperties": "false", - "properties": { - "protocol": { - "title": "Subprotocol", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - "scheme": { - "title": "Scheme", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - "authority": { - "title": "Authority", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - "path": { - "title": "Path", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - } - } - } - }, - "additionalProperties": false - }, + "options": false, "routes": { + "title": "Routes", + "type": "array", "items": { + "type": "object", "properties": { "when": { + "title": "When", + "type": "array", "items": { + "type": "object", "properties": { - "protocol": { - "title": "Subprotocol", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - "scheme": { - "title": "Scheme", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - "authority": { - "title": "Authority", - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, "path": { "title": "Path", - "type": "string", - "anyOf": [ - { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "with": { + "properties": { + "topic": { + "title": "Topic", + "type": "string" + }, + "filters": { + "title": "Filters", + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "title": "Key", "type": "string" }, - { - "$ref": "#/$defs/expression" + "headers": { + "title": "Headers", + "type": "object", + "additionalProperties": { + "type": "string" + } } - ] + }, + "additionalProperties": false } }, - "additoinalProperties": "false" - } - }, - "with": false - } - } - } - }, - "anyOf": [ - { - "required": [ - "exit" - ] - }, - { + "event": { + "properties": { + "id": { + "title": "Id", + "type": "string", + "enum": [ + "${etag}", + "[\"${base64(key)}\",\"${etag}\"]" + ], + "default": "${etag}" + } + } + } + }, + "additionalProperties": false, + "required": [ + "topic" + ] + } + } + } + } + }, + "anyOf": [ + { + "required": [ + "exit" + ] + }, + { "required": [ "routes" ] } ] } - } - ] - }, - "converter": { - "type": "object", - "properties": { - "model": { - "$ref": "#/$defs/converter/types" - } - }, - "required": [ - "model" - ], - "allOf": [ + }, { "if": { "properties": { - "model": { - "const": "avro" + "type": { + "const": "tcp" } } }, "then": { "properties": { - "model": { - "const": "avro" + "type": { + "const": "tcp" }, - "view": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], + "kind": { "enum": [ - "json" + "server", + "client" ] }, - "catalog": { - "type": "object", - "patternProperties": { - "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "id": { - "type": "integer", - "anyOf": [ - { - "type": "integer" - }, - { - "$ref": "#/$defs/expression" - } - ] - } + "catalog": false, + "vault": false, + "options": { + "$ref": "#/$defs/options/binding/tcp" + }, + "routes": { + "title": "Routes", + "type": "array", + "items": { + "type": "object", + "properties": { + "when": { + "title": "When", + "type": "array", + "items": { + "type": "object", + "properties": { + "authority": { + "title": "Authority", + "type": "string" }, - "required": [ - "id" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "schema": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - "version": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], - "default": "latest" - } + "cidr": { + "title": "CIDR Mask", + "type": "string", + "pattern": "^[0-9a-fA-F:.]+/(\\d{1,3})$" }, - "required": [ - "schema" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "strategy": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - "version": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" + "port": { + "title": "Port", + "oneOf": [ + { + "type": "integer" + }, + { + "type": "string", + "pattern": "^\\d+(-\\d+)?$" + }, + { + "type": "array", + "items": { + "oneOf": [ + { + "type": "integer" + }, + { + "type": "string", + "pattern": "^\\d+(-\\d+)?$" + } + ] } - ], - "default": "latest" - } - }, - "required": [ - "strategy" - ], - "additionalProperties": false + } + ] + } }, - { - "type": "object", - "properties": { - "subject": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - "version": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], - "default": "latest" - } - }, - "required": [ - "subject" - ], - "additionalProperties": false - } - ] - } + "additionalProperties": false + } + }, + "with": false } - }, - "maxProperties": 1 + } } }, - "additionalProperties": false + "oneOf": [ + { + "properties": { + "kind": { + "const": "server" + } + }, + "anyOf": [ + { + "required": [ + "exit" + ] + }, + { + "properties": { + "routes": { + "required": [ + "exit" + ] + } + }, + "required": [ + "routes" + ] + } + ] + }, + { + "properties": { + "kind": { + "const": "client" + }, + "routes": { + "items": { + "properties": { + "exit": false + } + } + }, + "exit": false + } + } + ] } }, { "if": { "properties": { - "model": { - "const": "json" + "type": { + "const": "tls" } } }, "then": { "properties": { - "model": { - "const": "json" + "type": { + "const": "tls" }, - "catalog": { - "type": "object", - "patternProperties": { - "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "id": { - "type": "integer", - "anyOf": [ - { - "type": "integer" - }, - { - "$ref": "#/$defs/expression" - } - ] - } + "kind": { + "enum": [ + "client", + "server", + "proxy" + ] + }, + "catalog": false, + "routes": { + "title": "Routes", + "type": "array", + "items": { + "type": "object", + "properties": { + "when": { + "title": "When", + "type": "array", + "items": { + "type": "object", + "properties": { + "authority": { + "title": "Authority", + "type": "string" }, - "required": [ - "id" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "schema": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - "version": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], - "default": "latest" - } + "alpn": { + "title": "Application Protocol", + "type": "string" }, - "required": [ - "schema" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "strategy": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - "version": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" + "port": { + "title": "Port", + "oneOf": [ + { + "type": "integer" + }, + { + "type": "string", + "pattern": "^\\d+(-\\d+)?$" + }, + { + "type": "array", + "items": { + "oneOf": [ + { + "type": "integer" + }, + { + "type": "string", + "pattern": "^\\d+(-\\d+)?$" + } + ] } - ], - "default": "latest" - } - }, - "required": [ - "strategy" - ], - "additionalProperties": false + } + ] + } }, - { - "type": "object", - "properties": { - "subject": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - "version": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], - "default": "latest" - } - }, - "required": [ - "subject" - ], - "additionalProperties": false - } - ] - } + "additionalProperties": false + } + }, + "with": false } - }, - "maxProperties": 1 + } } }, - "additionalProperties": false + "if": { + "properties": { + "kind": { + "const": "server" + } + } + }, + "then": { + "required": [ + "vault" + ] + }, + "anyOf": [ + { + "required": [ + "exit" + ] + }, + { + "required": [ + "routes" + ] + } + ], + "oneOf": [ + { + "properties": { + "kind": { + "const": "client" + }, + "options": { + "$ref": "#/$defs/options/binding/tls" + } + } + }, + { + "properties": { + "kind": { + "const": "server" + }, + "options": { + "allOf": [ + { + "$ref": "#/$defs/options/binding/tls" + }, + { + "oneOf": [ + { + "required": [ + "keys" + ] + }, + { + "required": [ + "signers" + ] + } + ] + } + ] + } + } + }, + { + "properties": { + "kind": { + "const": "proxy" + }, + "options": false + } + } + ] } }, { "if": { "properties": { - "model": { - "const": "protobuf" + "type": { + "const": "ws" } } }, "then": { "properties": { - "model": { - "const": "protobuf" + "type": { + "const": "ws" }, - "view": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], + "kind": { "enum": [ - "json" + "client", + "server" ] }, - "catalog": { - "type": "object", - "patternProperties": { - "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "id": { - "type": "integer", - "anyOf": [ - { - "type": "integer" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - "record": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - } + "catalog": false, + "vault": false, + "routes": { + "title": "Routes", + "type": "array", + "items": { + "type": "object", + "properties": { + "when": { + "title": "When", + "type": "array", + "items": { + "type": "object", + "properties": { + "protocol": { + "title": "Subprotocol", + "type": "string" }, - "required": [ - "id" - ], - "additionalProperties": false + "scheme": { + "title": "Scheme", + "type": "string" + }, + "authority": { + "title": "Authority", + "type": "string" + }, + "path": { + "title": "Path", + "type": "string" + } }, - { - "type": "object", - "properties": { - "schema": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - "version": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], - "default": "latest" - }, - "record": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - } + "additionalProperties": false + } + }, + "with": false + } + } + } + }, + "anyOf": [ + { + "required": [ + "exit" + ] + }, + { + "required": [ + "routes" + ] + } + ], + "oneOf": [ + { + "properties": { + "kind": { + "const": "client" + }, + "options": { + "properties": { + "defaults": { + "title": "Defaults", + "type": "object", + "additionalProperties": false, + "properties": { + "protocol": { + "title": "Subprotocol", + "type": "string" }, - "required": [ - "schema" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "strategy": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - "version": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], - "default": "latest" - }, - "record": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - } + "scheme": { + "title": "Scheme", + "type": "string" }, - "required": [ - "strategy" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "subject": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - }, - "version": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], - "default": "latest" - }, - "record": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] - } + "authority": { + "title": "Authority", + "type": "string" }, - "required": [ - "subject" - ], - "additionalProperties": false + "path": { + "title": "Path", + "type": "string" + } } - ] - } + } + }, + "additionalProperties": false } - }, - "maxProperties": 1 - } - }, - "additionalProperties": false - } - }, - { - "if": { - "properties": { - "model": { - "const": "string" - } - } - }, - "then": { - "properties": { - "model": { - "const": "string" + } }, - "encoding": { - "type": "string", - "anyOf": [ - { - "type": "string" + { + "properties": { + "kind": { + "const": "server" }, - { - "$ref": "#/$defs/expression" - } - ], - "enum": [ - "utf_8", - "utf_16" - ] + "options": false + } } - }, - "additionalProperties": false + ] } } + ] + }, + "converter": { + "oneOf": [ + { + "$ref": "#/$defs/converter/types" + }, + { + "$ref": "#/$defs/converter/model" + } ], "types": { "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], "enum": [ "avro", - "integer", + "double", + "float", + "int32", + "int64", "json", "protobuf", "string" ] - } - }, - "validator": { - "type": "object", - "properties": { - "model": { - "$ref": "#/$defs/validator/types" - } }, - "required": [ - "model" - ], - "allOf": [ - { - "if": { - "properties": { - "model": { - "const": "json" + "model": { + "type": "object", + "properties": { + "model": { + "$ref": "#/$defs/converter/types" + } + }, + "required": [ + "model" + ], + "allOf": [ + { + "if": { + "properties": { + "model": { + "const": "avro" + } } + }, + "then": { + "properties": { + "model": { + "const": "avro" + }, + "view": { + "type": "string", + "enum": [ + "json" + ] + }, + "catalog": { + "title": "Catalog", + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "integer" + } + }, + "required": [ + "id" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "strategy": { + "type": "string", + "enum": [ + "topic" + ] + }, + "version": { + "type": "string", + "default": "latest" + } + }, + "required": [ + "strategy" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "version": { + "type": "string", + "default": "latest" + } + }, + "required": [ + "subject" + ], + "additionalProperties": false + } + ] + } + } + }, + "maxProperties": 1 + } + }, + "required": [ + "catalog" + ], + "additionalProperties": false } }, - "then": { - "properties": { - "model": { - "const": "json" + { + "if": { + "properties": { + "model": { + "const": "double" + } + } + }, + "then": { + "properties": { + "model": { + "const": "double" + }, + "format": { + "type": "string", + "enum": [ + "binary", + "text" + ], + "default": "text" + }, + "range": { + "type": "string", + "pattern": "((?:\\(|\\[))(-?\\d+(?:\\.\\d+)?)?,(-?\\d+(?:\\.\\d+)?)?((?:\\)|\\]))" + }, + "multiple": { + "type": "number" + } }, - "catalog": { - "type": "object", - "patternProperties": { - "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { - "type": "array", - "items": { - "oneOf": [ - { - "type": "object", - "properties": { - "id": { - "type": "integer", - "anyOf": [ - { - "type": "integer" - }, - { - "$ref": "#/$defs/expression" - } - ] - } + "additionalProperties": false + } + }, + { + "if": { + "properties": { + "model": { + "const": "float" + } + } + }, + "then": { + "properties": { + "model": { + "const": "float" + }, + "format": { + "type": "string", + "enum": [ + "binary", + "text" + ], + "default": "text" + }, + "range": { + "type": "string", + "pattern": "((?:\\(|\\[))(-?\\d+(?:\\.\\d+)?)?,(-?\\d+(?:\\.\\d+)?)?((?:\\)|\\]))" + }, + "multiple": { + "type": "number" + } + }, + "additionalProperties": false + } + }, + { + "if": { + "properties": { + "model": { + "const": "int32" + } + } + }, + "then": { + "properties": { + "model": { + "const": "int32" + }, + "format": { + "type": "string", + "enum": [ + "binary", + "text" + ], + "default": "text" + }, + "range": { + "type": "string", + "pattern": "((?:\\(|\\[))(-?\\d+)?,(-?\\d+)?((?:\\)|\\]))" + }, + "multiple": { + "type": "integer" + } + }, + "additionalProperties": false + } + }, + { + "if": { + "properties": { + "model": { + "const": "int64" + } + } + }, + "then": { + "properties": { + "model": { + "const": "int64" + }, + "format": { + "type": "string", + "enum": [ + "binary", + "text" + ], + "default": "text" + }, + "range": { + "type": "string", + "pattern": "((?:\\(|\\[))(-?\\d+)?,(-?\\d+)?((?:\\)|\\]))" + }, + "multiple": { + "type": "integer" + } + }, + "additionalProperties": false + } + }, + { + "if": { + "properties": { + "model": { + "const": "json" + } + } + }, + "then": { + "properties": { + "model": { + "const": "json" + }, + "catalog": { + "title": "Catalog", + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "integer" + } + }, + "required": [ + "id" + ], + "additionalProperties": false }, - "required": [ - "id" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "schema": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + { + "type": "object", + "properties": { + "strategy": { + "type": "string", + "enum": [ + "topic" + ] + }, + "version": { + "type": "string", + "default": "latest" + } }, - "version": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], - "default": "latest" - } + "required": [ + "strategy" + ], + "additionalProperties": false }, - "required": [ - "schema" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "strategy": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "version": { + "type": "string", + "default": "latest" + } }, - "version": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], - "default": "latest" - } + "required": [ + "subject" + ], + "additionalProperties": false + } + ] + } + } + }, + "maxProperties": 1 + } + }, + "required": [ + "catalog" + ], + "additionalProperties": false + } + }, + { + "if": { + "properties": { + "model": { + "const": "protobuf" + } + } + }, + "then": { + "properties": { + "model": { + "const": "protobuf" + }, + "view": { + "type": "string", + "enum": [ + "json" + ] + }, + "catalog": { + "title": "Catalog", + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "record": { + "type": "string" + } + }, + "required": [ + "id", + "record" + ], + "additionalProperties": false }, - "required": [ - "strategy" - ], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "subject": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ] + { + "type": "object", + "properties": { + "strategy": { + "type": "string", + "enum": [ + "topic" + ] + }, + "version": { + "type": "string", + "default": "latest" + }, + "record": { + "type": "string" + } }, - "version": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], - "default": "latest" - } + "required": [ + "strategy", + "record" + ], + "additionalProperties": false }, - "required": [ - "subject" - ], - "additionalProperties": false - } - ] + { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "version": { + "type": "string", + "default": "latest" + }, + "record": { + "type": "string" + } + }, + "required": [ + "subject", + "record" + ], + "additionalProperties": false + } + ] + } } - } - }, - "maxProperties": 1 + }, + "maxProperties": 1 + } + }, + "required": [ + "catalog" + ], + "additionalProperties": false + } + }, + { + "if": { + "properties": { + "model": { + "const": "string" + } } }, - "additionalProperties": false + "then": { + "properties": { + "model": { + "const": "string" + }, + "encoding": { + "type": "string", + "enum": [ + "utf_8", + "utf_16" + ] + }, + "minLength": { + "type": "integer", + "minimum": 1 + }, + "maxLength": { + "type": "integer", + "minimum": 1 + }, + "pattern": { + "type": "string" + } + }, + "additionalProperties": false + } } + ] + } + }, + "validator": { + "oneOf": [ + { + "$ref": "#/$defs/validator/types" }, { - "if": { - "properties": { - "model": { - "const": "string" + "$ref": "#/$defs/validator/model" + } + ], + "types": { + "type": "string", + "enum": [ + "double", + "float", + "int32", + "int64", + "json", + "string" + ] + }, + "model": { + "type": "object", + "properties": { + "model": { + "$ref": "#/$defs/validator/types" + } + }, + "required": [ + "model" + ], + "allOf": [ + { + "if": { + "properties": { + "model": { + "const": "double" + } } + }, + "then": { + "properties": { + "model": { + "const": "double" + }, + "format": { + "type": "string", + "enum": [ + "binary", + "text" + ], + "default": "text" + }, + "range": { + "type": "string", + "pattern": "((?:\\(|\\[))(-?\\d+(?:\\.\\d+)?)?,(-?\\d+(?:\\.\\d+)?)?((?:\\)|\\]))" + }, + "multiple": { + "type": "number" + } + }, + "additionalProperties": false } }, - "then": { - "properties": { - "model": { - "const": "string" + { + "if": { + "properties": { + "model": { + "const": "float" + } + } + }, + "then": { + "properties": { + "model": { + "const": "float" + }, + "format": { + "type": "string", + "enum": [ + "binary", + "text" + ], + "default": "text" + }, + "range": { + "type": "string", + "pattern": "((?:\\(|\\[))(-?\\d+(?:\\.\\d+)?)?,(-?\\d+(?:\\.\\d+)?)?((?:\\)|\\]))" + }, + "multiple": { + "type": "number" + } }, - "encoding": { - "type": "string", - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/$defs/expression" - } - ], - "enum": [ - "utf_8" - ] + "additionalProperties": false + } + }, + { + "if": { + "properties": { + "model": { + "const": "int32" + } } }, - "additionalProperties": false - } - } - ], - "types": { - "type": "string", - "anyOf": [ + "then": { + "properties": { + "model": { + "const": "int32" + }, + "format": { + "type": "string", + "enum": [ + "binary", + "text" + ], + "default": "text" + }, + "range": { + "type": "string", + "pattern": "((?:\\(|\\[))(-?\\d+)?,(-?\\d+)?((?:\\)|\\]))" + }, + "multiple": { + "type": "integer" + } + }, + "additionalProperties": false + } + }, { - "type": "string" + "if": { + "properties": { + "model": { + "const": "int64" + } + } + }, + "then": { + "properties": { + "model": { + "const": "int64" + }, + "format": { + "type": "string", + "enum": [ + "binary", + "text" + ], + "default": "text" + }, + "range": { + "type": "string", + "pattern": "((?:\\(|\\[))(-?\\d+)?,(-?\\d+)?((?:\\)|\\]))" + }, + "multiple": { + "type": "number" + } + }, + "additionalProperties": false + } + }, + { + "if": { + "properties": { + "model": { + "const": "json" + } + } + }, + "then": { + "properties": { + "model": { + "const": "json" + }, + "catalog": { + "title": "Catalog", + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "integer" + } + }, + "required": [ + "id" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "strategy": { + "type": "string", + "enum": [ + "topic" + ] + }, + "version": { + "type": "string", + "default": "latest" + } + }, + "required": [ + "strategy" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "version": { + "type": "string", + "default": "latest" + } + }, + "required": [ + "subject" + ], + "additionalProperties": false + } + ] + } + } + }, + "maxProperties": 1 + } + }, + "required": [ + "catalog" + ], + "additionalProperties": false + } }, { - "$ref": "#/$defs/expression" + "if": { + "properties": { + "model": { + "const": "string" + } + } + }, + "then": { + "properties": { + "model": { + "const": "string" + }, + "encoding": { + "type": "string", + "enum": [ + "utf_8" + ] + }, + "minLength": { + "type": "integer", + "minimum": 1 + }, + "maxLength": { + "type": "integer", + "minimum": 1 + }, + "pattern": { + "type": "string" + } + }, + "additionalProperties": false + } } - ], - "enum": [ - "integer", - "json", - "string" ] } } diff --git a/.config/vale/styles/Vocab/Base/accept.txt b/.config/vale/styles/Vocab/Base/accept.txt index 330287d7..9f698ea6 100644 --- a/.config/vale/styles/Vocab/Base/accept.txt +++ b/.config/vale/styles/Vocab/Base/accept.txt @@ -72,6 +72,7 @@ Conduktor config const CQRS +crv cspell datagram EDAs @@ -95,9 +96,12 @@ jwt Kafka Karapace kcat +kty leader_only Lua lycheeverse +maxLength +minLength MQTT mvnw netcat diff --git a/.editorconfig b/.editorconfig index 185bd9e1..89240092 100644 --- a/.editorconfig +++ b/.editorconfig @@ -6,5 +6,6 @@ end_of_line = lf insert_final_newline = true [{package.json,*.yml,*.md}] +trim_trailing_whitespace = true indent_style = space indent_size = 2 diff --git a/.github/workflows/build-deploy-docs.yml b/.github/workflows/build-deploy-docs.yml index e58f9ef9..ae8cddb6 100644 --- a/.github/workflows/build-deploy-docs.yml +++ b/.github/workflows/build-deploy-docs.yml @@ -25,7 +25,7 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Restore cached Docs id: dist-cache @@ -132,7 +132,7 @@ jobs: steps: - name: Download cloudflare-pages artifact - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: cloudflare-pages path: ${{ env.DistDir }} diff --git a/.github/workflows/gitflow-release.yaml b/.github/workflows/gitflow-release.yaml index e75d4201..0a2e7d8f 100644 --- a/.github/workflows/gitflow-release.yaml +++ b/.github/workflows/gitflow-release.yaml @@ -49,7 +49,7 @@ jobs: permissions: contents: write steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: token: ${{secrets.GITFLOW_RELEASES_TOKEN}} fetch-depth: "0" diff --git a/.github/workflows/links-build.yml b/.github/workflows/links-build.yml index aa6ac6b4..30e67630 100644 --- a/.github/workflows/links-build.yml +++ b/.github/workflows/links-build.yml @@ -7,7 +7,7 @@ jobs: linkChecker: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup pnpm uses: pnpm/action-setup@v4 diff --git a/.github/workflows/links-push.yml b/.github/workflows/links-push.yml index 75e51ff8..2f0fc864 100644 --- a/.github/workflows/links-push.yml +++ b/.github/workflows/links-push.yml @@ -7,8 +7,8 @@ jobs: linkChecker: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - + - uses: actions/checkout@v4 + - name: Link Checker uses: lycheeverse/lychee-action@v1.8.0 with: diff --git a/.github/workflows/schema-check.yaml b/.github/workflows/schema-check.yaml new file mode 100644 index 00000000..63335ec8 --- /dev/null +++ b/.github/workflows/schema-check.yaml @@ -0,0 +1,43 @@ +name: Schema Checker + +on: + push: + repository_dispatch: + workflow_dispatch: + schedule: + - cron: "0 0 * * *" + +jobs: + schemaChecker: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: 9 + run_install: true + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + + - name: Install deps + run: pnpm install-check-schema + + - name: Build latest schema + run: | + CONTAINER_ID=$(docker run -d --rm -e ZILLA_INCUBATOR_ENABLED=true ghcr.io/aklivity/zilla:latest start -v -Pzilla.engine.verbose.schema.plain); + sleep 5; + docker logs $CONTAINER_ID > ./.check-schema/zilla-schema.json 2>&1; + docker stop $CONTAINER_ID; + + sed -i '1,2d' ./.check-schema/zilla-schema.json; + sed -i '$d' ./.check-schema/zilla-schema.json; + + - name: Schema Checker + run: pnpm check-schema + diff --git a/.vscode/settings.json b/.vscode/settings.json index ac314a1d..16359895 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -33,9 +33,6 @@ "explorer.confirmDragAndDrop": false, "markdown.extension.orderedList.autoRenumber": false, "markdown.extension.orderedList.marker": "one", - "markdown.extension.toc.levels": "3..6", - "markdown.extension.toc.slugifyMode": "gitea", - "markdown.extension.toc.updateOnSave": false, "markdown.updateLinksOnFileMove.enabled": "always", "markdownlint.run": "onSave", "prettier.bracketSameLine": true, diff --git a/README.md b/README.md index 22b120e9..2fbcc1f7 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ DocumentationGet StartedExamples • - Blog + Blog @@ -93,12 +93,8 @@ Pages in the reference section describe, as briefly as possible and in an orderl - `#### parent.child` - Arrays of objects have brackets `[]` only when describing child properties - `#### parentArray[].child` - -Table of Contents (ToC) anchor links are generated using the [Markdown All in One](https://markdown-all-in-one.github.io/docs/guide/table-of-contents.html#overview) extension with the `gitea` slug mode. - - Required props have an escaped splat `\*` at the end of the header and ToC link - `### topLevelProp\*` - - `- [topLevelProp\*](#toplevelprop)` ````markdown # Title @@ -180,6 +176,18 @@ parentArray: Description. ```` +### Generate schema asset + +capture the output and delete the first and last lines + +```bash +docker run -it --rm -e ZILLA_INCUBATOR_ENABLED=true ghcr.io/aklivity/zilla:latest start -v -Pzilla.engine.verbose.schema > src/.vuepress/public/assets/zilla-schema.json +``` + +```bash +pnpm check-schema > schema-edits.txt +``` + ## Provide feedback We’d love to hear your feedback. Please file documentation issues only in the docs GitHub repository. You can file a new issue to suggest improvements or if you see any errors in the existing documentation. @@ -189,3 +197,24 @@ Every page has an `Edit this page on GitHub` link at the bottom for you to check ## Copyright and license Copyright Aklivity, Inc. 2024, released under the [Apache 2.0 license](https://github.com/aklivity/zilla/blob/main/LICENSE). + +org.agrona.concurrent.AgentTerminationException: java.lang.NullPointerException: Cannot invoke "io.aklivity.zilla.runtime.binding.kafka.internal.types.KafkaEvaluation.ordinal()" because "evaluation" is null + at io.aklivity.zilla.runtime.engine@0.9.93/io.aklivity.zilla.runtime.engine.internal.registry.EngineWorker.doWork(EngineWorker.java:849) + at org.agrona.core/org.agrona.concurrent.AgentRunner.doWork(AgentRunner.java:304) + at org.agrona.core/org.agrona.concurrent.AgentRunner.workLoop(AgentRunner.java:296) + at org.agrona.core/org.agrona.concurrent.AgentRunner.run(AgentRunner.java:162) + at java.base/java.lang.Thread.run(Thread.java:1570) +Caused by: java.lang.NullPointerException: Cannot invoke "io.aklivity.zilla.runtime.binding.kafka.internal.types.KafkaEvaluation.ordinal()" because "evaluation" is null + at io.aklivity.zilla.runtime.binding.kafka@0.9.93/io.aklivity.zilla.runtime.binding.kafka.internal.cache.KafkaCacheCursorFactory.asCondition(KafkaCacheCursorFactory.java:1163) + at io.aklivity.zilla.runtime.binding.kafka@0.9.93/io.aklivity.zilla.runtime.binding.kafka.internal.stream.KafkaCacheClientFetchFactory.newStream(KafkaCacheClientFetchFactory.java:242) + at io.aklivity.zilla.runtime.binding.kafka@0.9.93/io.aklivity.zilla.runtime.binding.kafka.internal.stream.KafkaCacheClientFactory.newStream(KafkaCacheClientFactory.java:149) + at io.aklivity.zilla.runtime.engine@0.9.93/io.aklivity.zilla.runtime.engine.internal.registry.EngineWorker.handleBeginInitial(EngineWorker.java:1584) + at io.aklivity.zilla.runtime.engine@0.9.93/io.aklivity.zilla.runtime.engine.internal.registry.EngineWorker.handleDefaultReadInitial(EngineWorker.java:1348) + at io.aklivity.zilla.runtime.engine@0.9.93/io.aklivity.zilla.runtime.engine.internal.registry.EngineWorker.handleReadInitial(EngineWorker.java:1288) + at io.aklivity.zilla.runtime.engine@0.9.93/io.aklivity.zilla.runtime.engine.internal.registry.EngineWorker.handleRead(EngineWorker.java:1235) + at io.aklivity.zilla.runtime.engine@0.9.93/io.aklivity.zilla.runtime.engine.internal.concurent.ManyToOneRingBuffer.read(ManyToOneRingBuffer.java:229) + at io.aklivity.zilla.runtime.engine@0.9.93/io.aklivity.zilla.runtime.engine.internal.registry.EngineWorker.doWork(EngineWorker.java:843) + ... 4 more + Suppressed: java.lang.Exception: [engine/data#1] [0x010100000000b79d] streams=[consumeAt=0x00549a60 (0x0000000284549a60), produceAt=0x009f31d8 (0x00000002849f31d8)] + at io.aklivity.zilla.runtime.engine@0.9.93/io.aklivity.zilla.runtime.engine.internal.registry.EngineWorker.doWork(EngineWorker.java:847) + ... 4 more diff --git a/cspell.json b/cspell.json index a3a18a6c..931edb3e 100644 --- a/cspell.json +++ b/cspell.json @@ -44,6 +44,7 @@ "keytool", "lycheeverse", "mosquitto", + "mqtt", "mvnw", "netcat", "OAUTHBEARER", diff --git a/package.json b/package.json index 3d757a63..9b67329f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "zilla-docs", "type": "module", - "version": "2.1.2", + "version": "2.1.1", "description": "The official documentation for the aklivity/zilla open-source project", "keywords": [], "author": "aklivity.io", @@ -17,14 +17,15 @@ "dev": "vuepress-vite dev src", "update-package": "pnpm add -g pnpm && pnpm dlx vp-update", "lint": "markdownlint-cli2 \"**/*.md\" \"#node_modules\" \"#.config\" \"#.check-schema\"", - "lint-fix": "markdownlint-cli2 \"**/*.md\" \"#node_modules\" \"#.config\" \"#.check-schema\"", + "lint-fix": "markdownlint-cli2 --fix \"**/*.md\" \"#node_modules\" \"#.config\" \"#.check-schema\"", "link-checker": "pnpm build && link-checker src/.vuepress/dist", + "install-check-schema": "cd ./.check-schema && pnpm install", "check-schema": "node ./.check-schema" }, "devDependencies": { "@vuepress/bundler-vite": "2.0.0-rc.13", "@vuepress/plugin-catalog": "2.0.0-rc.36", - "@vuepress/plugin-docsearch": "2.0.0-rc.28", + "@vuepress/plugin-docsearch": "2.0.0-rc.36", "@vuepress/plugin-google-analytics": "2.0.0-rc.34", "@vuepress/plugin-redirect": "2.0.0-rc.36", "@vuepress/plugin-register-components": "2.0.0-rc.34", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cb70a191..2edc1480 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,25 +13,25 @@ importers: devDependencies: '@vuepress/bundler-vite': specifier: 2.0.0-rc.13 - version: 2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8) + version: 2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8) '@vuepress/plugin-catalog': specifier: 2.0.0-rc.36 - version: 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) + version: 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) '@vuepress/plugin-docsearch': - specifier: 2.0.0-rc.28 - version: 2.0.0-rc.28(@algolia/client-search@4.24.0)(search-insights@2.16.3)(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) + specifier: 2.0.0-rc.36 + version: 2.0.0-rc.36(@algolia/client-search@4.24.0)(search-insights@2.16.3)(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) '@vuepress/plugin-google-analytics': specifier: 2.0.0-rc.34 - version: 2.0.0-rc.34(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) + version: 2.0.0-rc.34(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) '@vuepress/plugin-redirect': specifier: 2.0.0-rc.36 - version: 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) + version: 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) '@vuepress/plugin-register-components': specifier: 2.0.0-rc.34 - version: 2.0.0-rc.34(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) + version: 2.0.0-rc.34(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) '@vuepress/plugin-shiki': specifier: 2.0.0-rc.36 - version: 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) + version: 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) link-checker: specifier: ^1.4.2 version: 1.4.2 @@ -49,10 +49,10 @@ importers: version: 3.4.38 vuepress: specifier: 2.0.0-rc.13 - version: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38) + version: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38) vuepress-theme-hope: specifier: 2.0.0-rc.49 - version: 2.0.0-rc.49(@vuepress/plugin-docsearch@2.0.0-rc.28(@algolia/client-search@4.24.0)(search-insights@2.16.3)(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)))(@vuepress/plugin-redirect@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)))(katex@0.16.11)(markdown-it@14.1.0)(mathjax-full@3.2.2)(mermaid@10.9.1)(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) + version: 2.0.0-rc.49(@vuepress/plugin-docsearch@2.0.0-rc.36(@algolia/client-search@4.24.0)(search-insights@2.16.3)(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)))(@vuepress/plugin-redirect@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)))(katex@0.16.11)(markdown-it@14.1.0)(mathjax-full@3.2.2)(mermaid@10.9.1)(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) packages: @@ -552,19 +552,19 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@rollup/wasm-node@4.21.0': - resolution: {integrity: sha512-CqLrY1oc68dyB44h4qfAa/4LM+R+xvqaJSTBV0hWeLXiIdXhgrHlaalXOTrL5vWz+mgnyzlUgy3bhTkZjKt1LQ==} + '@rollup/wasm-node@4.20.0': + resolution: {integrity: sha512-NxIRJDju9ZzXwpCZ+TMYEflT/KJPgcamVrkInPwB/jSzEIEhckHGgbC9C8Fkzt77nEZZpfF/H2BedwKfjxO9qQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} - '@shikijs/core@1.14.1': - resolution: {integrity: sha512-KyHIIpKNaT20FtFPFjCQB5WVSTpLR/n+jQXhWHWVUMm9MaOaG9BGOG0MSyt7yA4+Lm+4c9rTc03tt3nYzeYSfw==} + '@shikijs/core@1.13.0': + resolution: {integrity: sha512-Mj5NVfbAXcD1GnwOTSPl8hBn/T8UDpfFQTptp+p41n/CbUcJtOq98WaRD7Lz3hCglYotUTHUWtzu3JhK6XlkAA==} - '@shikijs/transformers@1.14.1': - resolution: {integrity: sha512-JJqL8QBVCJh3L61jqqEXgFq1cTycwjcGj7aSmqOEsbxnETM9hRlaB74QuXvY/fVJNjbNt8nvWo0VwAXKvMSLRg==} + '@shikijs/transformers@1.13.0': + resolution: {integrity: sha512-51aLIT6a93rVGoTxl2+p6hb7ILbTA4p/unoibEAjnPMzHto4cqxhuHyDVgtQur5ANpGsL3ihSGKaZDrpcWH8vQ==} '@sindresorhus/merge-streams@2.3.0': resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} @@ -628,8 +628,8 @@ packages: '@types/node@17.0.45': resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} - '@types/node@22.4.1': - resolution: {integrity: sha512-1tbpb9325+gPnKK0dMm+/LMriX0vKxf6RnB0SZUqfyVkQ4fMgUSySqhxE/y8Jvs4NyF1yHzTfG9KlnkIODxPKg==} + '@types/node@22.3.0': + resolution: {integrity: sha512-nrWpWVaDZuaVc5X84xJ0vNrLvomM205oQyLsRt7OHNZbSHslcWsvgFR7O7hire2ZonjLrWBbedmotmIlJDVd6g==} '@types/sax@1.2.7': resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} @@ -703,11 +703,6 @@ packages: peerDependencies: vuepress: 2.0.0-rc.13 - '@vuepress/helper@2.0.0-rc.41': - resolution: {integrity: sha512-kvjDPSTRiILdUa8HXyV44b7dN5gw38bE4KvnpQTwXIApwDnNCv+LY34cTL6UTOEQTjx9UyVUVkWm2/LGCVLidQ==} - peerDependencies: - vuepress: 2.0.0-rc.14 - '@vuepress/highlighter-helper@2.0.0-rc.36': resolution: {integrity: sha512-tf4gRyLSKJww3DySnYt/yc9b3vUelqJ78y1BBTOqVmLPrfn3Ig7/1fOv0FxbNg1k+HoxHskN3NS9tQDG+pMp8w==} peerDependencies: @@ -761,10 +756,10 @@ packages: peerDependencies: vuepress: 2.0.0-rc.13 - '@vuepress/plugin-docsearch@2.0.0-rc.28': - resolution: {integrity: sha512-6ucWxOcNMURKPE8ORCU+KQoigTCLMTH5bfhVRr9ujOV5cM0tjK5f/DRZzelZiEDStcjMPkdN/dCc8ks5aL0qSw==} + '@vuepress/plugin-docsearch@2.0.0-rc.36': + resolution: {integrity: sha512-TmzkArujL3pfgWU0QoFjKieC1fUx9JyD1exKqfjgpV8wIQEAPha63byRzOJfcPF0TR0onXWLSZ9eT9efIPCnag==} peerDependencies: - vuepress: 2.0.0-rc.9 + vuepress: 2.0.0-rc.13 '@vuepress/plugin-git@2.0.0-rc.36': resolution: {integrity: sha512-5m0LsUyH+SjBsKMggAoLjFf4EkrcOICrixEilyna+sTatsmyYrWNy7bT9SKxMeYJeFQ8rJVE1ch9O7cC2X6ejg==} @@ -1262,8 +1257,8 @@ packages: domutils@3.1.0: resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} - electron-to-chromium@1.5.11: - resolution: {integrity: sha512-R1CccCDYqndR25CaXFd6hp/u9RaaMcftMkphmvuepXr5b1vfLkRml6aWVeBhXJ7rbevHkKEMJtz8XqPf7ffmew==} + electron-to-chromium@1.5.9: + resolution: {integrity: sha512-HfkT8ndXR0SEkU8gBQQM3rz035bpE/hxkZ1YIt4KJPEFES68HfIU6LzKukH0H794Lm83WJtkSAMfEToxCs15VA==} elkjs@0.9.3: resolution: {integrity: sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==} @@ -2007,8 +2002,8 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shiki@1.14.1: - resolution: {integrity: sha512-FujAN40NEejeXdzPt+3sZ3F2dx1U24BY2XTY01+MG8mbxCiA2XukXdcbyMyLAHJ/1AUUnQd1tZlvIjefWWEJeA==} + shiki@1.13.0: + resolution: {integrity: sha512-e0dWfnONbEv6xl7FJy3XIhsVHQ/65XHDZl92+6H9+4xWjfdo7pmkqG7Kg47KWtDiEtzM5Z+oEfb4vtRvoZ/X9w==} side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} @@ -2113,8 +2108,8 @@ packages: uc.micro@2.1.0: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - undici-types@6.19.6: - resolution: {integrity: sha512-e/vggGopEfTKSvj4ihnOLTsqhrKRN3LeO6qSN/GxohhuRv8qH9bNQ4B8W7e/vFL+0XTnmHPB4/kegunZGA4Org==} + undici-types@6.18.2: + resolution: {integrity: sha512-5ruQbENj95yDYJNS3TvcaxPMshV7aizdv/hWYjGIKoANWKjhWNBsr2YEuYZKodQulB1b8l7ILOuDQep3afowQQ==} undici@6.19.7: resolution: {integrity: sha512-HR3W/bMGPSr90i8AAp2C4DM3wChFdJPLrWYpIS++LxS8K+W535qftjt+4MyjNYHeWabMj1nvtmLIi7l++iq91A==} @@ -2844,7 +2839,7 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - '@rollup/wasm-node@4.21.0': + '@rollup/wasm-node@4.20.0': dependencies: '@types/estree': 1.0.5 optionalDependencies: @@ -2852,13 +2847,13 @@ snapshots: '@sec-ant/readable-stream@0.4.1': {} - '@shikijs/core@1.14.1': + '@shikijs/core@1.13.0': dependencies: '@types/hast': 3.0.4 - '@shikijs/transformers@1.14.1': + '@shikijs/transformers@1.13.0': dependencies: - shiki: 1.14.1 + shiki: 1.13.0 '@sindresorhus/merge-streams@2.3.0': {} @@ -2883,7 +2878,7 @@ snapshots: '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 - '@types/node': 22.4.1 + '@types/node': 22.3.0 '@types/hash-sum@1.0.2': {} @@ -2893,7 +2888,7 @@ snapshots: '@types/jsonfile@6.1.4': dependencies: - '@types/node': 22.4.1 + '@types/node': 22.3.0 '@types/katex@0.16.7': {} @@ -2918,13 +2913,13 @@ snapshots: '@types/node@17.0.45': {} - '@types/node@22.4.1': + '@types/node@22.3.0': dependencies: - undici-types: 6.19.6 + undici-types: 6.18.2 '@types/sax@1.2.7': dependencies: - '@types/node': 22.4.1 + '@types/node': 22.3.0 '@types/trusted-types@2.0.7': {} @@ -2934,9 +2929,9 @@ snapshots: '@types/web-bluetooth@0.0.20': {} - '@vitejs/plugin-vue@5.1.2(vite@5.2.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)': + '@vitejs/plugin-vue@5.1.2(vite@5.2.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)': dependencies: - vite: 5.2.13(@types/node@22.4.1)(sass@1.77.8) + vite: 5.2.13(@types/node@22.3.0)(sass@1.77.8) vue: 3.4.38 '@vue/compiler-core@3.4.38': @@ -2995,9 +2990,9 @@ snapshots: '@vue/shared@3.4.38': {} - '@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8)': + '@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8)': dependencies: - '@vitejs/plugin-vue': 5.1.2(vite@5.2.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38) + '@vitejs/plugin-vue': 5.1.2(vite@5.2.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38) '@vuepress/client': 2.0.0-rc.13 '@vuepress/core': 2.0.0-rc.13 '@vuepress/shared': 2.0.0-rc.13 @@ -3006,8 +3001,8 @@ snapshots: connect-history-api-fallback: 2.0.0 postcss: 8.4.41 postcss-load-config: 5.1.0(postcss@8.4.41) - rollup: '@rollup/wasm-node@4.21.0' - vite: 5.2.13(@types/node@22.4.1)(sass@1.77.8) + rollup: '@rollup/wasm-node@4.20.0' + vite: 5.2.13(@types/node@22.3.0)(sass@1.77.8) vue: 3.4.38 vue-router: 4.4.3(vue@3.4.38) transitivePeerDependencies: @@ -3056,31 +3051,20 @@ snapshots: - supports-color - typescript - '@vuepress/helper@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38))': + '@vuepress/helper@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38))': dependencies: '@vue/shared': 3.4.38 cheerio: 1.0.0-rc.12 fflate: 0.8.2 gray-matter: 4.0.3 vue: 3.4.38 - vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38) - transitivePeerDependencies: - - typescript - - '@vuepress/helper@2.0.0-rc.41(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38))': - dependencies: - '@vue/shared': 3.4.38 - cheerio: 1.0.0 - fflate: 0.8.2 - gray-matter: 4.0.3 - vue: 3.4.38 - vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38) + vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38) transitivePeerDependencies: - typescript - '@vuepress/highlighter-helper@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38))': + '@vuepress/highlighter-helper@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38))': dependencies: - vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38) + vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38) '@vuepress/markdown@2.0.0-rc.13': dependencies: @@ -3103,81 +3087,81 @@ snapshots: transitivePeerDependencies: - supports-color - '@vuepress/plugin-active-header-links@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38))': + '@vuepress/plugin-active-header-links@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38))': dependencies: '@vueuse/core': 10.11.1(vue@3.4.38) vue: 3.4.38 - vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38) + vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38) transitivePeerDependencies: - '@vue/composition-api' - typescript - '@vuepress/plugin-back-to-top@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38))': + '@vuepress/plugin-back-to-top@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38))': dependencies: - '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) '@vueuse/core': 10.11.1(vue@3.4.38) vue: 3.4.38 - vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38) + vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38) transitivePeerDependencies: - '@vue/composition-api' - typescript - '@vuepress/plugin-blog@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38))': + '@vuepress/plugin-blog@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38))': dependencies: - '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) chokidar: 3.6.0 vue: 3.4.38 - vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38) + vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38) transitivePeerDependencies: - typescript - '@vuepress/plugin-catalog@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38))': + '@vuepress/plugin-catalog@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38))': dependencies: - '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) vue: 3.4.38 - vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38) + vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38) transitivePeerDependencies: - typescript - '@vuepress/plugin-comment@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38))': + '@vuepress/plugin-comment@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38))': dependencies: - '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) giscus: 1.5.0 vue: 3.4.38 - vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38) + vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38) transitivePeerDependencies: - typescript - '@vuepress/plugin-copy-code@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38))': + '@vuepress/plugin-copy-code@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38))': dependencies: - '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) '@vueuse/core': 10.11.1(vue@3.4.38) vue: 3.4.38 - vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38) + vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38) transitivePeerDependencies: - '@vue/composition-api' - typescript - '@vuepress/plugin-copyright@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38))': + '@vuepress/plugin-copyright@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38))': dependencies: - '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) '@vueuse/core': 10.11.1(vue@3.4.38) vue: 3.4.38 - vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38) + vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38) transitivePeerDependencies: - '@vue/composition-api' - typescript - '@vuepress/plugin-docsearch@2.0.0-rc.28(@algolia/client-search@4.24.0)(search-insights@2.16.3)(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38))': + '@vuepress/plugin-docsearch@2.0.0-rc.36(@algolia/client-search@4.24.0)(search-insights@2.16.3)(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38))': dependencies: '@docsearch/css': 3.6.1 '@docsearch/js': 3.6.1(@algolia/client-search@4.24.0)(search-insights@2.16.3) '@docsearch/react': 3.6.1(@algolia/client-search@4.24.0)(search-insights@2.16.3) - '@vuepress/helper': 2.0.0-rc.41(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) '@vueuse/core': 10.11.1(vue@3.4.38) ts-debounce: 4.0.0 vue: 3.4.38 - vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38) + vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38) transitivePeerDependencies: - '@algolia/client-search' - '@types/react' @@ -3187,129 +3171,129 @@ snapshots: - search-insights - typescript - '@vuepress/plugin-git@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38))': + '@vuepress/plugin-git@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38))': dependencies: execa: 9.3.1 - vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38) + vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38) - '@vuepress/plugin-google-analytics@2.0.0-rc.34(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38))': + '@vuepress/plugin-google-analytics@2.0.0-rc.34(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38))': dependencies: - vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38) + vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38) - '@vuepress/plugin-links-check@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38))': + '@vuepress/plugin-links-check@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38))': dependencies: - '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) - vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38) + '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) + vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38) transitivePeerDependencies: - typescript - '@vuepress/plugin-notice@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38))': + '@vuepress/plugin-notice@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38))': dependencies: - '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) '@vueuse/core': 10.11.1(vue@3.4.38) vue: 3.4.38 - vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38) + vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38) transitivePeerDependencies: - '@vue/composition-api' - typescript - '@vuepress/plugin-nprogress@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38))': + '@vuepress/plugin-nprogress@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38))': dependencies: vue: 3.4.38 - vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38) + vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38) transitivePeerDependencies: - typescript - '@vuepress/plugin-photo-swipe@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38))': + '@vuepress/plugin-photo-swipe@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38))': dependencies: - '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) '@vueuse/core': 10.11.1(vue@3.4.38) photoswipe: 5.4.4 vue: 3.4.38 - vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38) + vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38) transitivePeerDependencies: - '@vue/composition-api' - typescript - '@vuepress/plugin-reading-time@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38))': + '@vuepress/plugin-reading-time@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38))': dependencies: - '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) vue: 3.4.38 - vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38) + vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38) transitivePeerDependencies: - typescript - '@vuepress/plugin-redirect@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38))': + '@vuepress/plugin-redirect@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38))': dependencies: - '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) '@vueuse/core': 10.11.1(vue@3.4.38) cac: 6.7.14 vue: 3.4.38 - vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38) + vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38) transitivePeerDependencies: - '@vue/composition-api' - typescript - '@vuepress/plugin-register-components@2.0.0-rc.34(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38))': + '@vuepress/plugin-register-components@2.0.0-rc.34(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38))': dependencies: chokidar: 3.6.0 - vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38) + vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38) - '@vuepress/plugin-rtl@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38))': + '@vuepress/plugin-rtl@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38))': dependencies: vue: 3.4.38 - vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38) + vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38) transitivePeerDependencies: - typescript - '@vuepress/plugin-sass-palette@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38))': + '@vuepress/plugin-sass-palette@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38))': dependencies: - '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) chokidar: 3.6.0 sass: 1.77.8 - vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38) + vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38) transitivePeerDependencies: - typescript - '@vuepress/plugin-seo@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38))': + '@vuepress/plugin-seo@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38))': dependencies: - '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) - vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38) + '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) + vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38) transitivePeerDependencies: - typescript - '@vuepress/plugin-shiki@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38))': + '@vuepress/plugin-shiki@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38))': dependencies: - '@shikijs/transformers': 1.14.1 - '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) - '@vuepress/highlighter-helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) + '@shikijs/transformers': 1.13.0 + '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/highlighter-helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) nanoid: 5.0.7 - shiki: 1.14.1 - vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38) + shiki: 1.13.0 + vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38) transitivePeerDependencies: - typescript - '@vuepress/plugin-sitemap@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38))': + '@vuepress/plugin-sitemap@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38))': dependencies: - '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) sitemap: 8.0.0 - vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38) + vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38) transitivePeerDependencies: - typescript - '@vuepress/plugin-theme-data@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38))': + '@vuepress/plugin-theme-data@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38))': dependencies: '@vue/devtools-api': 6.6.3 vue: 3.4.38 - vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38) + vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38) transitivePeerDependencies: - typescript - '@vuepress/plugin-watermark@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38))': + '@vuepress/plugin-watermark@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38))': dependencies: - '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) vue: 3.4.38 - vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38) + vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38) watermark-js-plus: 1.5.3 transitivePeerDependencies: - typescript @@ -3419,7 +3403,7 @@ snapshots: browserslist@4.23.3: dependencies: caniuse-lite: 1.0.30001651 - electron-to-chromium: 1.5.11 + electron-to-chromium: 1.5.9 node-releases: 2.0.18 update-browserslist-db: 1.1.0(browserslist@4.23.3) @@ -3793,7 +3777,7 @@ snapshots: domelementtype: 2.3.0 domhandler: 5.0.3 - electron-to-chromium@1.5.11: {} + electron-to-chromium@1.5.9: {} elkjs@0.9.3: {} @@ -4623,9 +4607,9 @@ snapshots: shebang-regex@3.0.0: {} - shiki@1.14.1: + shiki@1.13.0: dependencies: - '@shikijs/core': 1.14.1 + '@shikijs/core': 1.13.0 '@types/hast': 3.0.4 side-channel@1.0.6: @@ -4725,7 +4709,7 @@ snapshots: uc.micro@2.1.0: {} - undici-types@6.19.6: {} + undici-types@6.18.2: {} undici@6.19.7: {} @@ -4760,13 +4744,13 @@ snapshots: kleur: 4.1.5 sade: 1.8.1 - vite@5.2.13(@types/node@22.4.1)(sass@1.77.8): + vite@5.2.13(@types/node@22.3.0)(sass@1.77.8): dependencies: esbuild: 0.20.2 postcss: 8.4.41 - rollup: '@rollup/wasm-node@4.21.0' + rollup: '@rollup/wasm-node@4.20.0' optionalDependencies: - '@types/node': 22.4.1 + '@types/node': 22.3.0 fsevents: 2.3.3 sass: 1.77.8 @@ -4787,23 +4771,23 @@ snapshots: '@vue/server-renderer': 3.4.38(vue@3.4.38) '@vue/shared': 3.4.38 - vuepress-plugin-components@2.0.0-rc.49(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)): + vuepress-plugin-components@2.0.0-rc.49(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)): dependencies: '@stackblitz/sdk': 1.11.0 - '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) - '@vuepress/plugin-sass-palette': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/plugin-sass-palette': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) '@vueuse/core': 10.11.1(vue@3.4.38) balloon-css: 1.2.0 create-codepen: 2.0.0 qrcode: 1.5.4 vue: 3.4.38 - vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38) - vuepress-shared: 2.0.0-rc.49(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) + vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38) + vuepress-shared: 2.0.0-rc.49(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) transitivePeerDependencies: - '@vue/composition-api' - typescript - vuepress-plugin-md-enhance@2.0.0-rc.49(katex@0.16.11)(markdown-it@14.1.0)(mathjax-full@3.2.2)(mermaid@10.9.1)(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)): + vuepress-plugin-md-enhance@2.0.0-rc.49(katex@0.16.11)(markdown-it@14.1.0)(mathjax-full@3.2.2)(mermaid@10.9.1)(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)): dependencies: '@mdit/plugin-alert': 0.12.0(markdown-it@14.1.0) '@mdit/plugin-align': 0.12.0(markdown-it@14.1.0) @@ -4829,14 +4813,14 @@ snapshots: '@mdit/plugin-tex': 0.12.0(markdown-it@14.1.0) '@mdit/plugin-uml': 0.12.0(markdown-it@14.1.0) '@types/markdown-it': 14.1.2 - '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) - '@vuepress/plugin-sass-palette': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/plugin-sass-palette': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) '@vueuse/core': 10.11.1(vue@3.4.38) balloon-css: 1.2.0 js-yaml: 4.1.0 vue: 3.4.38 - vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38) - vuepress-shared: 2.0.0-rc.49(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) + vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38) + vuepress-shared: 2.0.0-rc.49(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) optionalDependencies: katex: 0.16.11 mathjax-full: 3.2.2 @@ -4846,9 +4830,9 @@ snapshots: - markdown-it - typescript - vuepress-shared@2.0.0-rc.49(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)): + vuepress-shared@2.0.0-rc.49(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)): dependencies: - '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) '@vueuse/core': 10.11.1(vue@3.4.38) cheerio: 1.0.0-rc.12 dayjs: 1.11.12 @@ -4857,34 +4841,34 @@ snapshots: gray-matter: 4.0.3 semver: 7.6.3 vue: 3.4.38 - vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38) + vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38) transitivePeerDependencies: - '@vue/composition-api' - typescript - vuepress-theme-hope@2.0.0-rc.49(@vuepress/plugin-docsearch@2.0.0-rc.28(@algolia/client-search@4.24.0)(search-insights@2.16.3)(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)))(@vuepress/plugin-redirect@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)))(katex@0.16.11)(markdown-it@14.1.0)(mathjax-full@3.2.2)(mermaid@10.9.1)(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)): - dependencies: - '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) - '@vuepress/plugin-active-header-links': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) - '@vuepress/plugin-back-to-top': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) - '@vuepress/plugin-blog': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) - '@vuepress/plugin-catalog': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) - '@vuepress/plugin-comment': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) - '@vuepress/plugin-copy-code': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) - '@vuepress/plugin-copyright': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) - '@vuepress/plugin-git': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) - '@vuepress/plugin-links-check': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) - '@vuepress/plugin-notice': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) - '@vuepress/plugin-nprogress': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) - '@vuepress/plugin-photo-swipe': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) - '@vuepress/plugin-reading-time': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) - '@vuepress/plugin-rtl': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) - '@vuepress/plugin-sass-palette': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) - '@vuepress/plugin-seo': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) - '@vuepress/plugin-shiki': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) - '@vuepress/plugin-sitemap': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) - '@vuepress/plugin-theme-data': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) - '@vuepress/plugin-watermark': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) + vuepress-theme-hope@2.0.0-rc.49(@vuepress/plugin-docsearch@2.0.0-rc.36(@algolia/client-search@4.24.0)(search-insights@2.16.3)(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)))(@vuepress/plugin-redirect@2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)))(katex@0.16.11)(markdown-it@14.1.0)(mathjax-full@3.2.2)(mermaid@10.9.1)(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)): + dependencies: + '@vuepress/helper': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/plugin-active-header-links': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/plugin-back-to-top': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/plugin-blog': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/plugin-catalog': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/plugin-comment': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/plugin-copy-code': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/plugin-copyright': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/plugin-git': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/plugin-links-check': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/plugin-notice': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/plugin-nprogress': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/plugin-photo-swipe': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/plugin-reading-time': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/plugin-rtl': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/plugin-sass-palette': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/plugin-seo': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/plugin-shiki': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/plugin-sitemap': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/plugin-theme-data': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/plugin-watermark': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) '@vueuse/core': 10.11.1(vue@3.4.38) balloon-css: 1.2.0 bcrypt-ts: 5.0.2 @@ -4892,13 +4876,13 @@ snapshots: chokidar: 3.6.0 gray-matter: 4.0.3 vue: 3.4.38 - vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38) - vuepress-plugin-components: 2.0.0-rc.49(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) - vuepress-plugin-md-enhance: 2.0.0-rc.49(katex@0.16.11)(markdown-it@14.1.0)(mathjax-full@3.2.2)(mermaid@10.9.1)(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) - vuepress-shared: 2.0.0-rc.49(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) + vuepress: 2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38) + vuepress-plugin-components: 2.0.0-rc.49(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) + vuepress-plugin-md-enhance: 2.0.0-rc.49(katex@0.16.11)(markdown-it@14.1.0)(mathjax-full@3.2.2)(mermaid@10.9.1)(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) + vuepress-shared: 2.0.0-rc.49(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) optionalDependencies: - '@vuepress/plugin-docsearch': 2.0.0-rc.28(@algolia/client-search@4.24.0)(search-insights@2.16.3)(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) - '@vuepress/plugin-redirect': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/plugin-docsearch': 2.0.0-rc.36(@algolia/client-search@4.24.0)(search-insights@2.16.3)(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) + '@vuepress/plugin-redirect': 2.0.0-rc.36(vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38)) transitivePeerDependencies: - '@types/reveal.js' - '@vue/composition-api' @@ -4926,7 +4910,7 @@ snapshots: - typescript - vidstack - vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8))(vue@3.4.38): + vuepress@2.0.0-rc.13(@vuepress/bundler-vite@2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8))(vue@3.4.38): dependencies: '@vuepress/cli': 2.0.0-rc.13 '@vuepress/client': 2.0.0-rc.13 @@ -4936,7 +4920,7 @@ snapshots: '@vuepress/utils': 2.0.0-rc.13 vue: 3.4.38 optionalDependencies: - '@vuepress/bundler-vite': 2.0.0-rc.13(@types/node@22.4.1)(sass@1.77.8) + '@vuepress/bundler-vite': 2.0.0-rc.13(@types/node@22.3.0)(sass@1.77.8) transitivePeerDependencies: - supports-color - typescript diff --git a/src/.vuepress/public/assets/zilla-schema.json b/src/.vuepress/public/assets/zilla-schema.json new file mode 100644 index 00000000..6c6d3bbe --- /dev/null +++ b/src/.vuepress/public/assets/zilla-schema.json @@ -0,0 +1,7382 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Namespace", + "type": "object", + "properties": { + "name": { + "title": "Name", + "anyOf": [ + { + "type": "string", + "pattern": "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "vaults": { + "title": "Vaults", + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "$ref": "#/$defs/vault" + } + }, + "additionalProperties": false + }, + "guards": { + "title": "Guards", + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "$ref": "#/$defs/guard" + } + }, + "additionalProperties": false + }, + "telemetry": { + "title": "Telemetry", + "type": "object", + "properties": { + "attributes": { + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + } + }, + "metrics": { + "$ref": "#/$defs/telemetry/metrics" + }, + "exporters": { + "title": "Exporters", + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "$ref": "#/$defs/telemetry/exporter" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "catalogs": { + "title": "Catalogs", + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "$ref": "#/$defs/catalog" + } + }, + "additionalProperties": false + }, + "bindings": { + "title": "Bindings", + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "$ref": "#/$defs/binding" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false, + "required": [ + "name" + ], + "$defs": { + "expression": { + "type": "string", + "pattern": "\\$\\{\\{\\s*([^\\s\\}]*)\\.([^\\s\\}]*)\\s*\\}\\}" + }, + "vault": { + "type": "object", + "properties": { + "type": { + "title": "Type", + "anyOf": [ + { + "type": "string", + "enum": [ + "filesystem" + ] + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "options": { + "title": "Options", + "type": "object" + } + }, + "additionalProperties": false, + "required": [ + "type" + ], + "allOf": [ + { + "if": { + "properties": { + "type": { + "const": "filesystem" + } + } + }, + "then": { + "properties": { + "type": { + "const": "filesystem" + }, + "options": { + "properties": { + "keys": { + "title": "Keys", + "type": "object", + "properties": { + "store": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "type": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "pkcs12" + }, + "password": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "additionalProperties": false + }, + "trust": { + "title": "Trust Certificates", + "type": "object", + "properties": { + "store": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "type": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "pkcs12" + }, + "password": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "additionalProperties": false + }, + "signers": { + "title": "Signer Certificates", + "type": "object", + "properties": { + "store": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "type": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "pkcs12" + }, + "password": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + } + } + } + ] + }, + "guard": { + "type": "object", + "properties": { + "type": { + "title": "Type", + "anyOf": [ + { + "type": "string", + "enum": [ + "jwt" + ] + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "options": { + "title": "Options", + "type": "object" + } + }, + "additionalProperties": false, + "required": [ + "type" + ], + "allOf": [ + { + "if": { + "properties": { + "type": { + "const": "jwt" + } + } + }, + "then": { + "properties": { + "type": { + "const": "jwt" + }, + "options": { + "properties": { + "issuer": { + "title": "Issuer", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "audience": { + "title": "Audience", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "keys": { + "title": "Keys", + "oneOf": [ + { + "anyOf": [ + { + "type": "string", + "format": "uri", + "pattern": "^(https?)://" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + { + "type": "array", + "items": { + "title": "Key", + "type": "object", + "properties": { + "kty": { + "title": "Key Type", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "kid": { + "title": "Key ID", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "additionalProperties": true, + "required": [ + "kty", + "kid" + ] + } + } + ] + }, + "challenge": { + "title": "Challenge", + "anyOf": [ + { + "type": "number" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "additionalProperties": false + } + }, + "required": [ + "options" + ] + } + } + ] + }, + "telemetry": { + "metrics": { + "type": "array", + "items": { + "enum": [ + "grpc.request.size", + "grpc.response.size", + "grpc.active.requests", + "grpc.duration", + "grpc.requests.per.rpc", + "grpc.responses.per.rpc", + "http.request.size", + "http.response.size", + "http.active.requests", + "http.duration", + "stream.active.received", + "stream.active.sent", + "stream.opens.received", + "stream.opens.sent", + "stream.data.received", + "stream.data.sent", + "stream.errors.received", + "stream.errors.sent", + "stream.closes.received", + "stream.closes.sent" + ] + }, + "uniqueItems": true + }, + "exporter": { + "title": "Exporter", + "type": "object", + "properties": { + "type": { + "title": "Type", + "anyOf": [ + { + "type": "string", + "enum": [ + "otlp", + "prometheus", + "stdout" + ] + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "required": [ + "type" + ], + "allOf": [ + { + "if": { + "properties": { + "type": { + "const": "otlp" + } + } + }, + "then": { + "properties": { + "type": { + "const": "otlp" + }, + "options": { + "properties": { + "interval": { + "anyOf": [ + { + "type": "number" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": 30 + }, + "signals": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string", + "enum": [ + "metrics", + "logs" + ] + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "endpoint": { + "type": "object", + "properties": { + "protocol": { + "anyOf": [ + { + "type": "string", + "enum": [ + "http" + ] + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "http" + }, + "location": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "overrides": { + "type": "object", + "properties": { + "metrics": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "/v1/metrics" + }, + "logs": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "/v1/logs" + } + } + } + }, + "required": [ + "location" + ], + "additionalProperties": false + } + }, + "required": [ + "endpoint" + ], + "additionalProperties": false + }, + "additionalProperties": false + }, + "required": [ + "options" + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "prometheus" + } + } + }, + "then": { + "properties": { + "type": { + "const": "prometheus" + }, + "options": { + "properties": { + "endpoints": { + "type": "array", + "items": { + "type": "object", + "properties": { + "scheme": { + "title": "Scheme", + "anyOf": [ + { + "type": "string", + "enum": [ + "http" + ] + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "port": { + "title": "Port", + "anyOf": [ + { + "type": "integer" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "path": { + "title": "Path", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "required": [ + "scheme", + "port" + ], + "additionalProperties": false + }, + "minItems": 1 + } + }, + "additionalProperties": false + } + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "stdout" + } + } + }, + "then": { + "properties": { + "type": { + "const": "stdout" + } + } + } + } + ] + } + }, + "catalog": { + "title": "Catalog", + "type": "object", + "properties": { + "type": { + "title": "Type", + "anyOf": [ + { + "type": "string", + "enum": [ + "apicurio-registry", + "apicurio", + "filesystem", + "inline", + "karapace-schema-registry", + "karapace", + "schema-registry" + ] + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "options": { + "title": "Options", + "type": "object" + } + }, + "additionalProperties": false, + "required": [ + "type" + ], + "allOf": [ + { + "if": { + "properties": { + "type": { + "enum": [ + "apicurio-registry", + "apicurio" + ] + } + } + }, + "then": { + "properties": { + "type": { + "enum": [ + "apicurio-registry", + "apicurio" + ] + }, + "options": { + "properties": { + "url": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "group-id": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "default" + }, + "use-id": { + "anyOf": [ + { + "type": "string", + "enum": [ + "globalId", + "contentId" + ] + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "globalId" + }, + "id-encoding": { + "anyOf": [ + { + "type": "string", + "enum": [ + "default", + "legacy" + ] + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "default" + }, + "max-age": { + "title": "Max Age", + "anyOf": [ + { + "type": "number" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": 300 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + }, + { + "if": { + "properties": { + "type": { + "const": "filesystem" + } + } + }, + "then": { + "properties": { + "type": { + "const": "filesystem" + }, + "options": { + "properties": { + "subjects": { + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "title": "Subject", + "type": "object", + "properties": { + "path": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "required": [ + "path" + ], + "additionalProperties": false + } + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + }, + { + "if": { + "properties": { + "type": { + "const": "inline" + } + } + }, + "then": { + "properties": { + "type": { + "const": "inline" + }, + "options": { + "properties": { + "subjects": { + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "title": "Subject", + "type": "object", + "properties": { + "version": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "latest" + }, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "required": [ + "schema" + ], + "additionalProperties": false + } + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + }, + { + "if": { + "properties": { + "type": { + "enum": [ + "karapace-schema-registry", + "karapace" + ] + } + } + }, + "then": { + "properties": { + "type": { + "enum": [ + "karapace-schema-registry", + "karapace" + ] + }, + "options": { + "$ref": "#/$defs/options/catalog/schema-registry" + } + }, + "additionalProperties": false + } + }, + { + "if": { + "properties": { + "type": { + "const": "schema-registry" + } + } + }, + "then": { + "properties": { + "type": { + "const": "schema-registry" + }, + "options": { + "$ref": "#/$defs/options/catalog/schema-registry" + } + }, + "additionalProperties": false + } + } + ] + }, + "cataloged": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "anyOf": [ + { + "type": "integer" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "required": [ + "id" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "strategy": { + "anyOf": [ + { + "type": "string", + "enum": [ + "topic" + ] + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "version": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "latest" + } + }, + "required": [ + "strategy" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "subject": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "version": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "latest" + } + }, + "required": [ + "subject" + ], + "additionalProperties": false + } + ] + }, + "options": { + "binding": { + "http": { + "authorization": { + "title": "Authorizations", + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "title": "Authorization", + "type": "object", + "properties": { + "credentials": { + "title": "Credentials", + "type": "object", + "properties": { + "cookies": { + "title": "Cookies", + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "type": "string", + "pattern": ".*\\{credentials\\}.*" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "headers": { + "title": "Headers", + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "type": "string", + "pattern": ".*\\{credentials\\}.*" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "query": { + "title": "Query Parameters", + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "type": "string", + "pattern": ".*\\{credentials\\}.*" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + } + }, + "additionalProperties": false, + "anyOf": [ + { + "required": [ + "cookies" + ] + }, + { + "required": [ + "headers" + ] + }, + { + "required": [ + "query" + ] + } + ] + } + }, + "additionalProperties": false, + "required": [ + "credentials" + ] + } + }, + "maxProperties": 1 + } + }, + "kafka": { + "sasl": { + "title": "SASL", + "type": "object", + "properties": { + "mechanism": { + "title": "Mechanism", + "anyOf": [ + { + "type": "string", + "enum": [ + "plain", + "scram-sha-1", + "scram-sha-256", + "scram-sha-512" + ] + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "mechanism": { + "const": "plain" + }, + "username": { + "title": "Username", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "password": { + "title": "Password", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "required": [ + "username", + "password" + ] + }, + { + "additionalProperties": false, + "properties": { + "mechanism": { + "const": "scram-sha-1" + }, + "username": { + "title": "Username", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "password": { + "title": "Password", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "required": [ + "username", + "password" + ] + }, + { + "additionalProperties": false, + "properties": { + "mechanism": { + "const": "scram-sha-256" + }, + "username": { + "title": "Username", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "password": { + "title": "Password", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "required": [ + "username", + "password" + ] + }, + { + "additionalProperties": false, + "properties": { + "mechanism": { + "const": "scram-sha-512" + }, + "username": { + "title": "Username", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "password": { + "title": "Password", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "required": [ + "username", + "password" + ] + } + ] + }, + "cache_server_topics": { + "title": "Topics", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "defaultOffset": { + "anyOf": [ + { + "type": "string", + "enum": [ + "live", + "historical" + ] + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "deltaType": { + "anyOf": [ + { + "type": "string", + "enum": [ + "none", + "json_patch" + ], + "deprecated": true + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "transforms": { + "title": "Transforms", + "type": "array", + "oneOf": [ + { + "minItems": 2, + "maxItems": 2, + "items": [ + { + "type": "object", + "additionalProperties": false, + "properties": { + "extract-key": { + "anyOf": [ + { + "type": "string", + "additionalProperties": false + }, + { + "$ref": "#/$defs/expression" + } + ] + } + } + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "extract-headers": { + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "anyOf": [ + { + "type": "string", + "pattern": "^\\$\\{message\\.value\\.([A-Za-z_][A-Za-z0-9_]*)\\}$" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "additionalProperties": false + } + } + } + ] + }, + { + "minItems": 1, + "maxItems": 1, + "items": [ + { + "type": "object", + "additionalProperties": false, + "properties": { + "extract-headers": { + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "anyOf": [ + { + "type": "string", + "pattern": "^\\$\\{message\\.value\\.([A-Za-z_][A-Za-z0-9_]*)\\}$" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "additionalProperties": false + } + } + } + ] + }, + { + "minItems": 1, + "maxItems": 1, + "items": [ + { + "type": "object", + "additionalProperties": false, + "properties": { + "extract-key": { + "anyOf": [ + { + "type": "string", + "additionalProperties": false + }, + { + "$ref": "#/$defs/expression" + } + ] + } + } + } + ] + } + ] + }, + "key": { + "$ref": "#/$defs/converter" + }, + "value": { + "$ref": "#/$defs/converter" + } + } + } + } + }, + "mqtt": { + "authorization": { + "title": "Authorizations", + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "title": "Authorization", + "type": "object", + "properties": { + "credentials": { + "title": "Credentials", + "type": "object", + "properties": { + "connect": { + "title": "Connect", + "type": "object", + "properties": { + "username": { + "title": "Username", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "password": { + "title": "Password", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "oneOf": [ + { + "required": [ + "username" + ] + }, + { + "required": [ + "password" + ] + } + ] + } + }, + "additionalProperties": false, + "anyOf": [ + { + "required": [ + "connect" + ] + } + ] + } + }, + "additionalProperties": false, + "required": [ + "credentials" + ] + } + }, + "maxProperties": 1 + } + }, + "tcp": { + "title": "Options", + "type": "object", + "properties": { + "host": { + "title": "Host", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "port": { + "title": "Port", + "oneOf": [ + { + "anyOf": [ + { + "type": "integer" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + { + "anyOf": [ + { + "type": "string", + "pattern": "^\\d+(-\\d+)?$" + } + ] + }, + { + "type": "array", + "items": { + "oneOf": [ + { + "anyOf": [ + { + "type": "integer" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + { + "anyOf": [ + { + "type": "string", + "pattern": "^\\d+(-\\d+)?$" + } + ] + } + ] + } + } + ] + } + }, + "additionalProperties": false + }, + "tls": { + "title": "Options", + "type": "object", + "properties": { + "version": { + "title": "Version", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "keys": { + "title": "Vault Keys", + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "trust": { + "title": "Vault Certificates", + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "trustcacerts": { + "title": "Trust CA Certificates", + "anyOf": [ + { + "type": "boolean" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "sni": { + "title": "Server Names", + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "alpn": { + "title": "Application Protocols", + "type": "array", + "items": { + "type": [ + "string", + "null" + ] + } + }, + "mutual": { + "title": "Mutual Authentication", + "anyOf": [ + { + "type": "string", + "enum": [ + "required", + "requested", + "none" + ] + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "signers": { + "title": "Vault Signer Certificates", + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + } + }, + "not": { + "allOf": [ + { + "required": [ + "keys" + ] + }, + { + "required": [ + "signers" + ] + } + ] + }, + "additionalProperties": false + } + }, + "catalog": { + "schema-registry": { + "title": "Schema Registry", + "type": "object", + "properties": { + "url": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "context": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "default" + }, + "max-age": { + "title": "Max Age", + "anyOf": [ + { + "type": "number" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": 300 + } + }, + "additionalProperties": false + } + } + }, + "binding": { + "title": "Binding", + "type": "object", + "properties": { + "vault": { + "title": "Vault", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "catalog": { + "title": "Catalog", + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "type": "array", + "items": { + "$ref": "#/$defs/cataloged" + } + } + }, + "maxProperties": 1 + }, + "type": { + "title": "Type", + "anyOf": [ + { + "type": "string", + "enum": [ + "amqp", + "asyncapi", + "echo", + "fan", + "filesystem", + "grpc", + "grpc-kafka", + "http", + "http-filesystem", + "http-kafka", + "kafka", + "kafka-grpc", + "mqtt", + "mqtt-kafka", + "openapi", + "openapi-asyncapi", + "pgsql", + "proxy", + "sse", + "sse-kafka", + "tcp", + "tls", + "ws" + ] + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "kind": { + "title": "Kind", + "enum": [ + "client", + "server", + "proxy", + "remote_server", + "cache_client", + "cache_server" + ] + }, + "options": { + "title": "Options", + "type": "object" + }, + "routes": { + "title": "Routes", + "type": "array", + "items": { + "title": "Route", + "type": "object", + "properties": { + "exit": { + "title": "Exit", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "when": { + "title": "Conditions", + "type": "array", + "items": { + "title": "Condition", + "type": "object" + } + }, + "with": { + "title": "Override", + "type": "object" + }, + "guarded": { + "title": "Guarded", + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "title": "Roles", + "type": "array", + "items": { + "title": "Role", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + } + } + } + }, + "additionalProperties": false + } + }, + "telemetry": { + "title": "Telemetry", + "type": "object", + "properties": { + "metrics": { + "type": "array" + } + } + }, + "exit": { + "title": "Exit", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "entry": { + "title": "Entry", + "anyOf": [ + { + "type": "string", + "pattern": "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "additionalProperties": false, + "required": [ + "type", + "kind" + ], + "anyOf": [ + { + "properties": { + "kind": { + "const": "remote_server" + } + }, + "required": [ + "entry" + ] + }, + { + "properties": { + "kind": { + "not": { + "const": "remote_server" + } + }, + "entry": false + } + } + ], + "allOf": [ + { + "if": { + "properties": { + "type": { + "const": "amqp" + } + } + }, + "then": { + "properties": { + "type": { + "const": "amqp" + }, + "kind": { + "enum": [ + "server" + ] + }, + "catalog": false, + "vault": false, + "options": false, + "routes": { + "title": "Routes", + "type": "array", + "items": { + "type": "object", + "properties": { + "when": { + "title": "When", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "address": { + "title": "Address", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "capabilities": { + "title": "Capabilities", + "anyOf": [ + { + "type": "string", + "enum": [ + "send_only", + "receive_only", + "send_and_receive" + ] + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "send_and_receive" + } + } + } + }, + "with": false + } + } + } + }, + "anyOf": [ + { + "required": [ + "exit" + ] + }, + { + "required": [ + "routes" + ] + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "asyncapi" + } + } + }, + "then": { + "properties": { + "type": { + "const": "asyncapi" + }, + "kind": { + "enum": [ + "server", + "client", + "proxy" + ] + }, + "catalog": false, + "options": { + "properties": { + "specs": { + "title": "Specifications", + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "type": "object", + "properties": { + "servers": { + "title": "Servers", + "type": "array", + "items": { + "type": "object", + "properties": { + "url": { + "title": "URL", + "anyOf": [ + { + "type": "string", + "pattern": "^([a-zA-Z0-9\\\\.-]+)(:(\\\\{[a-zA-Z_]+\\\\}|[0-9]+))?$" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "host": { + "title": "Host", + "anyOf": [ + { + "type": "string", + "pattern": "^([a-zA-Z0-9\\\\.-]+)(:(\\\\{[a-zA-Z_]+\\\\}|[0-9]+))?$" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "pathname": { + "title": "Path Name", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "additionalProperties": false + } + }, + "catalog": { + "title": "Catalog", + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "type": "object", + "properties": { + "subject": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "version": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "latest" + } + }, + "required": [ + "subject" + ], + "additionalProperties": false + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "tcp": { + "$ref": "#/$defs/options/binding/tcp" + }, + "tls": { + "$ref": "#/$defs/options/binding/tls" + }, + "http": { + "title": "Http", + "type": "object", + "properties": { + "authorization": { + "$ref": "#/$defs/options/binding/http/authorization" + } + }, + "additionalProperties": false + }, + "mqtt": { + "title": "MQTT", + "type": "object", + "properties": { + "authorization": { + "$ref": "#/$defs/options/binding/mqtt/authorization" + } + }, + "additionalProperties": false + }, + "kafka": { + "title": "Kafka", + "type": "object", + "properties": { + "sasl": { + "$ref": "#/$defs/options/binding/kafka/sasl" + }, + "topics": { + "$ref": "#/$defs/options/binding/kafka/cache_server_topics" + } + }, + "additionalProperties": false + }, + "mqtt-kafka": { + "title": "MQTT-Kafka", + "type": "object", + "properties": { + "channels": { + "title": "Channels", + "type": "object", + "properties": { + "sessions": { + "title": "Kafka Sessions Channel", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "messages": { + "title": "Kafka Messages Channel", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "retained": { + "title": "Kafka Retained Channel", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "additionalProperties": false + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "routes": { + "title": "Routes", + "type": "array", + "items": { + "type": "object", + "properties": { + "when": { + "title": "When", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "api-id": { + "title": "Spec API Id", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "operation-id": { + "title": "MQTT Operation Id", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + } + } + }, + "with": { + "properties": { + "api-id": { + "title": "Spec API Id", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "operation-id": { + "title": "MQTT Operation Id", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "additionalProperties": false + } + } + } + } + }, + "oneOf": [ + { + "properties": { + "kind": { + "const": "server" + } + }, + "anyOf": [ + { + "required": [ + "exit" + ] + }, + { + "properties": { + "routes": { + "required": [ + "exit" + ] + } + }, + "required": [ + "routes" + ] + } + ] + }, + { + "properties": { + "kind": { + "const": "proxy" + } + }, + "anyOf": [ + { + "required": [ + "exit" + ] + }, + { + "properties": { + "routes": { + "required": [ + "exit" + ] + } + }, + "required": [ + "routes" + ] + } + ] + }, + { + "properties": { + "kind": { + "const": "client" + }, + "routes": { + "items": { + "properties": { + "exit": false + } + } + }, + "exit": false + } + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "echo" + } + } + }, + "then": { + "properties": { + "type": { + "const": "echo" + }, + "kind": { + "enum": [ + "server" + ] + }, + "catalog": false, + "vault": false, + "options": false, + "routes": false, + "exit": false + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "fan" + } + } + }, + "then": { + "properties": { + "type": { + "const": "fan" + }, + "kind": { + "enum": [ + "server" + ] + }, + "catalog": false, + "vault": false, + "options": false, + "routes": false + }, + "anyOf": [ + { + "required": [ + "exit" + ] + }, + { + "required": [ + "routes" + ] + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "filesystem" + } + } + }, + "then": { + "properties": { + "type": { + "const": "filesystem" + }, + "kind": { + "enum": [ + "server" + ] + }, + "catalog": false, + "vault": false, + "options": { + "properties": { + "location": { + "title": "Location", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "symlinks": { + "title": "Symbolic Links", + "anyOf": [ + { + "type": "string", + "enum": [ + "follow", + "ignore" + ] + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "ignore" + } + }, + "additionalProperties": false + }, + "routes": false, + "exit": false + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "grpc" + } + } + }, + "then": { + "properties": { + "type": { + "const": "grpc" + }, + "kind": { + "enum": [ + "server", + "client" + ] + }, + "vault": false, + "routes": { + "title": "Routes", + "type": "array", + "items": { + "type": "object", + "properties": { + "when": { + "title": "When", + "type": "array", + "items": { + "type": "object", + "properties": { + "method": { + "title": "Method", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "metadata": { + "title": "Metadata", + "type": "object", + "additionalProperties": { + "oneOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + { + "type": "object", + "properties": { + "base64": { + "title": "Base64 value", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + } + } + ] + } + } + }, + "additionalProperties": false + } + }, + "with": false + } + } + } + }, + "anyOf": [ + { + "required": [ + "exit" + ] + }, + { + "required": [ + "routes" + ] + } + ], + "oneOf": [ + { + "properties": { + "kind": { + "const": "server" + }, + "options": { + "properties": { + "services": { + "title": "Services", + "type": "array", + "items": { + "title": "Service", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "deprecated": true + } + }, + "additionalProperties": false + } + } + }, + { + "properties": { + "kind": { + "const": "client" + }, + "catalog": false, + "options": false + } + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "grpc-kafka" + } + } + }, + "then": { + "properties": { + "type": { + "const": "grpc-kafka" + }, + "kind": { + "enum": [ + "proxy" + ] + }, + "catalog": false, + "vault": false, + "options": { + "properties": { + "reliability": { + "title": "Reliability", + "type": "object", + "properties": { + "field": { + "title": "Grpc Last Message Id", + "anyOf": [ + { + "type": "integer", + "minimum": 1, + "maximum": 536870911 + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": 32767 + }, + "metadata": { + "title": "Grpc Last Message Id Metadata Name", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "last-message-id" + } + } + }, + "idempotency": { + "title": "Idempotency", + "type": "object", + "properties": { + "metadata": { + "title": "Idempotency Metadata name", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "idempotency-key" + } + } + }, + "correlation": { + "title": "Correlation", + "type": "object", + "properties": { + "headers": { + "title": "Correlation Kafka Headers", + "type": "object", + "properties": { + "service": { + "title": "Grpc Service Kafka Header", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "zilla:service" + }, + "method": { + "title": "Grpc Method Kafka Header", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "zilla:method" + }, + "correlation-id": { + "title": "Correlation-Id Kafka Header", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "zilla:correlation-id" + }, + "reply-to": { + "title": "Reply to Topic", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "zilla:reply-to" + } + }, + "additionalProperties": false + } + }, + "required": [ + "headers" + ], + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "routes": { + "title": "Routes", + "type": "array", + "items": { + "type": "object", + "properties": { + "when": { + "title": "When", + "type": "array", + "items": { + "type": "object", + "properties": { + "method": { + "title": "Method", + "anyOf": [ + { + "type": "string", + "pattern": "^(?[^/]+)/(?[^/]+)" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "metadata": { + "title": "Metadata", + "type": "object", + "additionalProperties": { + "oneOf": [ + { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + { + "type": "object", + "properties": { + "base64": { + "title": "Base64 value", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + } + } + ] + } + } + }, + "additionalProperties": false + } + }, + "with": { + "oneOf": [ + { + "properties": { + "capability": { + "title": "Capability", + "anyOf": [ + { + "type": "string", + "const": "fetch" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "topic": { + "title": "Topic", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "filters": { + "title": "Filters", + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "title": "Key", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "headers": { + "title": "Headers", + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false + }, + { + "properties": { + "capability": { + "title": "Capability", + "anyOf": [ + { + "type": "string", + "const": "produce" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "topic": { + "title": "Topic", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "acks": { + "title": "Acks", + "anyOf": [ + { + "type": "string", + "enum": [ + "none", + "leader_only", + "in_sync_replicas" + ] + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "in_sync_replicas" + }, + "key": { + "title": "Key", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "overrides": { + "title": "Headers", + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "reply-to": { + "title": "Reply-To topic", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "additionalProperties": false, + "required": [ + "reply-to" + ] + } + ], + "required": [ + "capability", + "topic" + ] + } + }, + "required": [ + "with" + ] + } + }, + "exit": false + }, + "required": [ + "routes" + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "http" + } + } + }, + "then": { + "properties": { + "type": { + "const": "http" + }, + "kind": { + "enum": [ + "server", + "client" + ] + }, + "catalog": false, + "vault": false, + "options": { + "properties": { + "versions": { + "title": "Versions", + "type": "array", + "default": [ + "http/1.1", + "h2" + ], + "items": { + "title": "Version", + "anyOf": [ + { + "type": "string", + "enum": [ + "http/1.1", + "h2" + ] + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "access-control": { + "title": "Access Control", + "type": "object", + "properties": { + "policy": { + "title": "Policy", + "anyOf": [ + { + "type": "string", + "enum": [ + "same-origin", + "cross-origin" + ] + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "same-origin" + } + }, + "oneOf": [ + { + "properties": { + "policy": { + "const": "same-origin" + } + } + }, + { + "properties": { + "policy": { + "const": "cross-origin" + }, + "allow": { + "title": "Allow", + "type": "object", + "properties": { + "origins": { + "title": "Origins", + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "methods": { + "title": "Methods", + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "headers": { + "title": "Headers", + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "credentials": { + "title": "Credentials", + "anyOf": [ + { + "type": "boolean" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "additionalProperties": false + }, + "max-age": { + "title": "Max Age", + "anyOf": [ + { + "type": "number" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "expose": { + "title": "Expose", + "type": "object", + "properties": { + "headers": { + "title": "Headers", + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, + "authorization": { + "$ref": "#/$defs/options/binding/http/authorization" + }, + "overrides": { + "title": "Overrides", + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "requests": { + "type": "array", + "items": { + "type": "object", + "properties": { + "path": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "method": { + "anyOf": [ + { + "type": "string", + "enum": [ + "GET", + "PUT", + "POST", + "DELETE", + "OPTIONS", + "HEAD", + "PATCH", + "TRACE" + ] + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "content-type": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "headers": { + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "$ref": "#/$defs/validator" + } + } + }, + "params": { + "type": "object", + "properties": { + "path": { + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "$ref": "#/$defs/validator" + } + } + }, + "query": { + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "$ref": "#/$defs/validator" + } + } + } + }, + "additionalProperties": false + }, + "content": { + "$ref": "#/$defs/validator" + }, + "responses": { + "type": "array", + "items": { + "type": "object", + "properties": { + "status": { + "oneOf": [ + { + "anyOf": [ + { + "type": "integer" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + { + "type": "array", + "items": { + "anyOf": [ + { + "type": "integer" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + } + ] + }, + "content-type": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "headers": { + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "$ref": "#/$defs/validator" + } + } + }, + "content": { + "$ref": "#/$defs/validator" + } + }, + "anyOf": [ + { + "required": [ + "content" + ] + }, + { + "required": [ + "headers" + ] + } + ], + "additionalProperties": false + } + } + }, + "anyOf": [ + { + "required": [ + "path", + "headers" + ] + }, + { + "required": [ + "path", + "params" + ] + }, + { + "required": [ + "path", + "content" + ] + }, + { + "required": [ + "path", + "responses" + ] + } + ], + "additionalProperties": false + } + } + }, + "additionalProperties": false + }, + "routes": { + "title": "Routes", + "type": "array", + "items": { + "type": "object", + "properties": { + "when": { + "title": "When", + "type": "array", + "items": { + "type": "object", + "properties": { + "headers": { + "title": "Headers", + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + } + }, + "additionalProperties": false + } + }, + "with": { + "properties": { + "headers": { + "title": "Headers", + "type": "object", + "properties": { + "overrides": { + "title": "Overrides", + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + } + } + } + }, + "anyOf": [ + { + "required": [ + "exit" + ] + }, + { + "required": [ + "routes" + ] + } + ], + "oneOf": [ + { + "properties": { + "kind": { + "const": "server" + } + } + }, + { + "properties": { + "kind": { + "const": "client" + }, + "options": { + "properties": { + "access-control": false, + "authorization": false + } + } + } + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "http-filesystem" + } + } + }, + "then": { + "properties": { + "type": { + "const": "http-filesystem" + }, + "kind": { + "enum": [ + "proxy" + ] + }, + "catalog": false, + "vault": false, + "options": false, + "routes": { + "title": "Routes", + "type": "array", + "items": { + "type": "object", + "properties": { + "when": { + "title": "When", + "type": "array", + "items": { + "type": "object", + "properties": { + "path": { + "title": "Path", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "additionalProperties": false + } + }, + "with": { + "properties": { + "path": { + "title": "Topic", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "additionalProperties": false, + "required": [ + "path" + ] + } + } + } + } + }, + "anyOf": [ + { + "required": [ + "exit" + ] + }, + { + "required": [ + "routes" + ] + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "http-kafka" + } + } + }, + "then": { + "properties": { + "type": { + "const": "http-kafka" + }, + "kind": { + "enum": [ + "proxy" + ] + }, + "catalog": false, + "vault": false, + "options": { + "properties": { + "idempotency": { + "title": "Idempotency", + "type": "object", + "properties": { + "header": { + "title": "Idempotency Key HTTP Header", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "idempotency-key" + } + }, + "required": [ + "header" + ], + "additionalProperties": false + }, + "correlation": { + "title": "Correlation", + "type": "object", + "properties": { + "headers": { + "title": "Correlation Kafka Headers", + "type": "object", + "properties": { + "reply-to": { + "title": "Reply-To Kafka Header", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "zilla:reply-to" + }, + "correlation-id": { + "title": "Correlation-Id Kafka Header", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "zilla:correlation-id" + } + }, + "additionalProperties": false + } + }, + "required": [ + "headers" + ], + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "routes": { + "title": "Routes", + "type": "array", + "items": { + "type": "object", + "properties": { + "when": { + "title": "When", + "type": "array", + "items": { + "type": "object", + "properties": { + "method": { + "title": "Method", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "path": { + "title": "Path", + "anyOf": [ + { + "type": "string", + "pattern": "^/" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "additionalProperties": false + } + }, + "with": { + "oneOf": [ + { + "properties": { + "capability": { + "title": "Capability", + "anyOf": [ + { + "type": "string", + "const": "fetch" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "topic": { + "title": "Topic", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "filters": { + "title": "Filters", + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "title": "Key", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "headers": { + "title": "Headers", + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + } + }, + "additionalProperties": false + } + }, + "merge": { + "title": "Merge", + "type": "object", + "properties": { + "content-type": { + "title": "Content Type", + "anyOf": [ + { + "type": "string", + "const": "application/json" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "patch": { + "title": "Patch", + "type": "object", + "properties": { + "initial": { + "title": "Initial Value", + "anyOf": [ + { + "type": "string", + "const": "[]" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "path": { + "title": "Path", + "anyOf": [ + { + "type": "string", + "const": "/-" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "required": [ + "initial", + "path" + ], + "additionalProperties": false + } + }, + "required": [ + "content-type" + ], + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "properties": { + "capability": { + "title": "Capability", + "anyOf": [ + { + "type": "string", + "const": "produce" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "topic": { + "title": "Topic", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "acks": { + "title": "Acks", + "anyOf": [ + { + "type": "string", + "enum": [ + "none", + "leader_only", + "in_sync_replicas" + ] + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "in_sync_replicas" + }, + "key": { + "title": "Key", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "overrides": { + "title": "Headers", + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "reply-to": { + "title": "Reply-To", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "async": { + "title": "Async", + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + } + }, + "additionalProperties": false, + "dependentRequired": { + "async": [ + "reply-to" + ] + } + } + ], + "required": [ + "capability", + "topic" + ] + } + }, + "required": [ + "with" + ] + } + }, + "exit": false + }, + "required": [ + "routes" + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "kafka" + } + } + }, + "then": { + "properties": { + "type": { + "const": "kafka" + }, + "kind": { + "enum": [ + "cache_client", + "cache_server", + "client" + ] + }, + "catalog": false, + "vault": false, + "routes": { + "title": "Routes", + "type": "array", + "items": { + "type": "object", + "properties": { + "when": { + "title": "When", + "type": "array", + "items": { + "type": "object", + "properties": { + "topic": { + "title": "Topic", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "groupId": { + "title": "groupId", + "anyOf": [ + { + "type": "string", + "deprecated": true + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "additionalProperties": false + } + }, + "with": false + } + } + } + }, + "anyOf": [ + { + "required": [ + "exit" + ] + }, + { + "required": [ + "routes" + ] + } + ], + "oneOf": [ + { + "properties": { + "kind": { + "const": "cache_client" + }, + "options": { + "properties": { + "topics": { + "title": "Topics", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "key": { + "$ref": "#/$defs/converter" + }, + "value": { + "$ref": "#/$defs/converter" + } + } + } + } + }, + "additionalProperties": false + } + } + }, + { + "properties": { + "kind": { + "const": "cache_server" + }, + "options": { + "properties": { + "bootstrap": { + "title": "Bootstrap", + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "topics": { + "$ref": "#/$defs/options/binding/kafka/cache_server_topics" + } + }, + "additionalProperties": false + } + } + }, + { + "properties": { + "kind": { + "const": "client" + }, + "options": { + "properties": { + "servers": { + "title": "Servers", + "type": "array", + "items": { + "anyOf": [ + { + "type": "string", + "pattern": "([^\\:]+):(\\d+)" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "sasl": { + "$ref": "#/$defs/options/binding/kafka/sasl" + } + }, + "additionalProperties": false + } + } + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "kafka-grpc" + } + } + }, + "then": { + "properties": { + "type": { + "const": "kafka-grpc" + }, + "kind": { + "enum": [ + "remote_server" + ] + }, + "catalog": false, + "vault": false, + "options": { + "properties": { + "acks": { + "title": "Acks", + "anyOf": [ + { + "type": "string", + "enum": [ + "none", + "leader_only", + "in_sync_replicas" + ] + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "in_sync_replicas" + }, + "idempotency": { + "title": "Idempotency", + "type": "object", + "properties": { + "metadata": { + "title": "Idempotency Metadata name", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "idempotency-key" + } + } + }, + "correlation": { + "title": "Correlation", + "type": "object", + "properties": { + "headers": { + "title": "Correlation Kafka Headers", + "type": "object", + "properties": { + "service": { + "title": "Grpc Service Kafka Header", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "zilla:service" + }, + "method": { + "title": "Grpc Method Kafka Header", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "zilla:method" + }, + "correlation-id": { + "title": "Correlation-Id Kafka Header", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "zilla:correlation-id" + }, + "reply-to": { + "title": "Reply to Topic", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "zilla:reply-to" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + } + }, + "routes": { + "title": "Routes", + "type": "array", + "items": { + "type": "object", + "properties": { + "when": { + "title": "When", + "type": "array", + "items": { + "type": "object", + "properties": { + "topic": { + "title": "Topic", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "key": { + "title": "Key", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "headers": { + "title": "Headers", + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "reply-to": { + "title": "ReplyTo", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "method": { + "title": "Method", + "anyOf": [ + { + "type": "string", + "pattern": "^(?[^/]+)/(?[^/]+)" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "additionalProperties": false, + "required": [ + "topic", + "reply-to" + ] + } + }, + "with": { + "properties": { + "scheme": { + "title": "Scheme", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "authority": { + "title": "Authority", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "additionalProperties": false, + "required": [ + "scheme", + "authority" + ] + } + }, + "required": [ + "with" + ] + } + }, + "exit": false, + "entry": { + "title": "Entry", + "anyOf": [ + { + "type": "string", + "pattern": "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "required": [ + "entry", + "routes" + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "mqtt" + } + } + }, + "then": { + "properties": { + "type": { + "const": "mqtt" + }, + "kind": { + "enum": [ + "server", + "client" + ] + }, + "catalog": false, + "vault": false, + "routes": { + "title": "Routes", + "type": "array", + "items": { + "type": "object", + "properties": { + "when": { + "title": "When", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "session": { + "title": "Session", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "client-id": { + "title": "Client Id", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + } + } + }, + "subscribe": { + "title": "Subscribe", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "topic": { + "title": "Topic", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + } + } + }, + "publish": { + "title": "Publish", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "topic": { + "title": "Topic", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + } + } + } + } + } + }, + "with": false + } + } + } + }, + "anyOf": [ + { + "required": [ + "exit" + ] + }, + { + "required": [ + "routes" + ] + } + ], + "oneOf": [ + { + "properties": { + "kind": { + "const": "server" + }, + "options": { + "properties": { + "versions": { + "title": "Versions", + "type": "array", + "items": { + "anyOf": [ + { + "type": "string", + "enum": [ + "v3.1.1", + "v5" + ] + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "authorization": { + "$ref": "#/$defs/options/binding/mqtt/authorization" + }, + "topics": { + "title": "Topics", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "content": { + "$ref": "#/$defs/validator" + }, + "user-properties": { + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "$ref": "#/$defs/validator" + } + } + } + } + } + } + }, + "additionalProperties": false + } + } + }, + { + "properties": { + "kind": { + "const": "client" + }, + "options": { + "properties": { + "authorization": { + "$ref": "#/$defs/options/binding/mqtt/authorization" + } + }, + "additionalProperties": false + } + } + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "mqtt-kafka" + } + } + }, + "then": { + "properties": { + "type": { + "const": "mqtt-kafka" + }, + "kind": { + "enum": [ + "proxy" + ] + }, + "catalog": false, + "vault": false, + "options": { + "properties": { + "server": { + "title": "Server Reference", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "topics": { + "title": "Topics", + "type": "object", + "properties": { + "sessions": { + "title": "Kafka Sessions Topic", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "messages": { + "title": "Kafka Messages Topic", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "retained": { + "title": "Kafka Retained Topic", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "additionalProperties": false + }, + "required": [ + "sessions", + "retained", + "messages" + ], + "additionalProperties": false + }, + "clients": { + "title": "Clients", + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "publish": { + "title": "Publish", + "type": "object", + "properties": { + "qosMax": { + "title": "Maximum QoS", + "anyOf": [ + { + "type": "string", + "enum": [ + "at_most_once", + "at_least_once", + "exactly_once" + ] + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "exactly_once" + }, + "additionalProperties": false + }, + "required": [ + "qosMax" + ], + "additionalProperties": false + } + }, + "required": [ + "topics" + ], + "additionalProperties": false + }, + "routes": { + "title": "Routes", + "type": "array", + "items": { + "type": "object", + "properties": { + "when": { + "title": "When", + "type": "array", + "items": { + "type": "object", + "anyOf": [ + { + "properties": { + "subscribe": { + "title": "Subscribe", + "type": "array", + "items": { + "type": "object", + "properties": { + "topic": { + "title": "Topic", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "additionalProperties": false + } + } + } + }, + { + "properties": { + "publish": { + "title": "Publish", + "type": "array", + "items": { + "type": "object", + "properties": { + "topic": { + "title": "Topic", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "additionalProperties": false + } + } + } + } + ] + } + }, + "with": { + "properties": { + "messages": { + "title": "Messages Topic", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "additionalProperties": false + } + }, + "required": [ + "with" + ] + } + } + }, + "required": [ + "options" + ], + "anyOf": [ + { + "required": [ + "exit" + ] + }, + { + "required": [ + "routes" + ] + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "openapi" + } + } + }, + "then": { + "properties": { + "type": { + "const": "openapi" + }, + "kind": { + "enum": [ + "client", + "server" + ] + }, + "catalog": false, + "options": { + "properties": { + "tcp": { + "$ref": "#/$defs/options/binding/tcp" + }, + "tls": { + "$ref": "#/$defs/options/binding/tls" + }, + "http": { + "title": "Http", + "type": "object", + "properties": { + "authorization": { + "$ref": "#/$defs/options/binding/http/authorization" + } + }, + "additionalProperties": false + }, + "specs": { + "title": "Specs", + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "type": "object", + "properties": { + "servers": { + "title": "Servers", + "type": "array", + "items": { + "type": "object", + "properties": { + "url": { + "title": "URL", + "anyOf": [ + { + "type": "string", + "pattern": "^([a-zA-Z0-9\\\\.-]+)(:(\\\\{[a-zA-Z_]+\\\\}|[0-9]+))?$" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "additionalProperties": false + } + }, + "catalog": { + "title": "Catalog", + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "type": "object", + "properties": { + "subject": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "version": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "latest" + } + }, + "required": [ + "subject" + ], + "additionalProperties": false + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false + } + } + } + }, + "additionalProperties": false + }, + "routes": false + }, + "oneOf": [ + { + "properties": { + "kind": { + "const": "server" + } + }, + "anyOf": [ + { + "required": [ + "exit" + ] + } + ] + }, + { + "properties": { + "kind": { + "const": "client" + }, + "exit": false + } + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "openapi-asyncapi" + } + } + }, + "then": { + "properties": { + "type": { + "const": "openapi-asyncapi" + }, + "kind": { + "enum": [ + "proxy" + ] + }, + "catalog": false, + "vault": false, + "options": { + "properties": { + "specs": { + "title": "Specs", + "type": "object", + "properties": { + "openapi": { + "title": "Openapi", + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "type": "object", + "properties": { + "catalog": { + "title": "Catalog", + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "type": "object", + "properties": { + "subject": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "version": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "latest" + } + }, + "required": [ + "subject" + ], + "additionalProperties": false + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false + } + } + }, + "asyncapi": { + "title": "Asyncapi", + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "type": "object", + "properties": { + "catalog": { + "title": "Catalog", + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "type": "object", + "properties": { + "subject": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "version": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "latest" + } + }, + "required": [ + "subject" + ], + "additionalProperties": false + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false + } + } + } + }, + "required": [ + "openapi", + "asyncapi" + ] + } + }, + "additionalProperties": false + }, + "routes": { + "title": "Routes", + "type": "array", + "items": { + "type": "object", + "properties": { + "when": { + "title": "When", + "type": "array", + "items": { + "type": "object", + "properties": { + "api-id": { + "title": "ApiId", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "operation-id": { + "title": "OperationId", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "additionalProperties": false + } + }, + "with": { + "properties": { + "api-id": { + "title": "ApiId", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "operation-id": { + "title": "OperationId", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + } + } + }, + "required": [ + "with" + ] + } + } + }, + "anyOf": [ + { + "required": [ + "exit" + ] + }, + { + "required": [ + "routes" + ] + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "pgsql" + } + } + }, + "then": { + "properties": { + "type": { + "const": "pgsql" + }, + "kind": { + "enum": [ + "client", + "server" + ] + }, + "catalog": false, + "vault": false, + "options": false, + "routes": false + }, + "anyOf": [ + { + "required": [ + "exit" + ] + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "proxy" + } + } + }, + "then": { + "properties": { + "type": { + "const": "proxy" + }, + "kind": { + "enum": [ + "client", + "server" + ] + }, + "catalog": false, + "vault": false, + "options": false, + "routes": { + "title": "Routes", + "type": "array", + "items": { + "type": "object", + "properties": { + "when": { + "title": "When", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "transport": { + "title": "Transport", + "anyOf": [ + { + "type": "string", + "enum": [ + "stream", + "datagram" + ] + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "family": { + "title": "Family", + "anyOf": [ + { + "type": "string", + "enum": [ + "inet", + "inet4", + "inet6", + "unix" + ] + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "source": { + "title": "Source", + "type": "object", + "additionalProperties": false, + "properties": { + "host": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "port": { + "anyOf": [ + { + "type": "integer" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + } + }, + "destination": { + "title": "Source", + "type": "object", + "additionalProperties": false, + "properties": { + "host": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "port": { + "anyOf": [ + { + "type": "integer" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + } + }, + "info": { + "title": "Info", + "type": "object", + "additionalProperties": false, + "properties": { + "alpn": { + "title": "Application Protocol", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "authority": { + "title": "Authority", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "identity": { + "title": "Identity", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "namespace": { + "title": "Namespace", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "secure": { + "title": "Secure", + "type": "object", + "additionalProperties": false, + "properties": { + "version": { + "title": "Protocol Version", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "cipher": { + "title": "Cipher Name", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "key": { + "title": "Key Algorithm", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "name": { + "title": "Common Name", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "signature": { + "title": "Signature Algorithm", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + } + } + } + } + } + } + }, + "with": false + } + } + } + }, + "anyOf": [ + { + "required": [ + "exit" + ] + }, + { + "required": [ + "routes" + ] + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "sse" + } + } + }, + "then": { + "properties": { + "type": { + "const": "sse" + }, + "kind": { + "enum": [ + "client", + "server" + ] + }, + "catalog": false, + "vault": false, + "options": { + "properties": { + "retry": { + "anyOf": [ + { + "type": "integer" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": 2000 + }, + "requests": { + "type": "array", + "items": { + "type": "object", + "properties": { + "path": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "content": { + "$ref": "#/$defs/validator" + } + }, + "anyOf": [ + { + "required": [ + "path", + "content" + ] + } + ], + "additionalProperties": false + } + } + }, + "additionalProperties": false + }, + "routes": { + "title": "Routes", + "type": "array", + "items": { + "type": "object", + "properties": { + "when": { + "title": "When", + "type": "array", + "items": { + "type": "object", + "properties": { + "path": { + "title": "Path", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "additionalProperties": false + } + }, + "with": false + } + } + } + }, + "anyOf": [ + { + "required": [ + "exit" + ] + }, + { + "required": [ + "routes" + ] + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "sse-kafka" + } + } + }, + "then": { + "properties": { + "type": { + "const": "sse-kafka" + }, + "kind": { + "enum": [ + "proxy" + ] + }, + "catalog": false, + "vault": false, + "options": false, + "routes": { + "title": "Routes", + "type": "array", + "items": { + "type": "object", + "properties": { + "when": { + "title": "When", + "type": "array", + "items": { + "type": "object", + "properties": { + "path": { + "title": "Path", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "additionalProperties": false + } + }, + "with": { + "properties": { + "topic": { + "title": "Topic", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "filters": { + "title": "Filters", + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "title": "Key", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "headers": { + "title": "Headers", + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + } + }, + "additionalProperties": false + } + }, + "event": { + "properties": { + "id": { + "title": "Id", + "anyOf": [ + { + "type": "string", + "enum": [ + "${etag}", + "[\"${base64(key)}\",\"${etag}\"]" + ] + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "${etag}" + } + } + } + }, + "additionalProperties": false, + "required": [ + "topic" + ] + } + } + } + } + }, + "anyOf": [ + { + "required": [ + "exit" + ] + }, + { + "required": [ + "routes" + ] + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "tcp" + } + } + }, + "then": { + "properties": { + "type": { + "const": "tcp" + }, + "kind": { + "enum": [ + "server", + "client" + ] + }, + "catalog": false, + "vault": false, + "options": { + "$ref": "#/$defs/options/binding/tcp" + }, + "routes": { + "title": "Routes", + "type": "array", + "items": { + "type": "object", + "properties": { + "when": { + "title": "When", + "type": "array", + "items": { + "type": "object", + "properties": { + "authority": { + "title": "Authority", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "cidr": { + "title": "CIDR Mask", + "anyOf": [ + { + "type": "string", + "pattern": "^[0-9a-fA-F:.]+/(\\d{1,3})$" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "port": { + "title": "Port", + "oneOf": [ + { + "anyOf": [ + { + "type": "integer" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + { + "anyOf": [ + { + "type": "string", + "pattern": "^\\d+(-\\d+)?$" + } + ] + }, + { + "type": "array", + "items": { + "oneOf": [ + { + "anyOf": [ + { + "type": "integer" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + { + "anyOf": [ + { + "type": "string", + "pattern": "^\\d+(-\\d+)?$" + } + ] + } + ] + } + } + ] + } + }, + "additionalProperties": false + } + }, + "with": false + } + } + } + }, + "oneOf": [ + { + "properties": { + "kind": { + "const": "server" + } + }, + "anyOf": [ + { + "required": [ + "exit" + ] + }, + { + "properties": { + "routes": { + "required": [ + "exit" + ] + } + }, + "required": [ + "routes" + ] + } + ] + }, + { + "properties": { + "kind": { + "const": "client" + }, + "routes": { + "items": { + "properties": { + "exit": false + } + } + }, + "exit": false + } + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "tls" + } + } + }, + "then": { + "properties": { + "type": { + "const": "tls" + }, + "kind": { + "enum": [ + "client", + "server", + "proxy" + ] + }, + "catalog": false, + "routes": { + "title": "Routes", + "type": "array", + "items": { + "type": "object", + "properties": { + "when": { + "title": "When", + "type": "array", + "items": { + "type": "object", + "properties": { + "authority": { + "title": "Authority", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "alpn": { + "title": "Application Protocol", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "port": { + "title": "Port", + "oneOf": [ + { + "anyOf": [ + { + "type": "integer" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + { + "anyOf": [ + { + "type": "string", + "pattern": "^\\d+(-\\d+)?$" + } + ] + }, + { + "type": "array", + "items": { + "oneOf": [ + { + "anyOf": [ + { + "type": "integer" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + { + "anyOf": [ + { + "type": "string", + "pattern": "^\\d+(-\\d+)?$" + } + ] + } + ] + } + } + ] + } + }, + "additionalProperties": false + } + }, + "with": false + } + } + } + }, + "if": { + "properties": { + "kind": { + "const": "server" + } + } + }, + "then": { + "required": [ + "vault" + ] + }, + "anyOf": [ + { + "required": [ + "exit" + ] + }, + { + "required": [ + "routes" + ] + } + ], + "oneOf": [ + { + "properties": { + "kind": { + "const": "client" + }, + "options": { + "$ref": "#/$defs/options/binding/tls" + } + } + }, + { + "properties": { + "kind": { + "const": "server" + }, + "options": { + "allOf": [ + { + "$ref": "#/$defs/options/binding/tls" + }, + { + "oneOf": [ + { + "required": [ + "keys" + ] + }, + { + "required": [ + "signers" + ] + } + ] + } + ] + } + } + }, + { + "properties": { + "kind": { + "const": "proxy" + }, + "options": false + } + } + ] + } + }, + { + "if": { + "properties": { + "type": { + "const": "ws" + } + } + }, + "then": { + "properties": { + "type": { + "const": "ws" + }, + "kind": { + "enum": [ + "client", + "server" + ] + }, + "catalog": false, + "vault": false, + "routes": { + "title": "Routes", + "type": "array", + "items": { + "type": "object", + "properties": { + "when": { + "title": "When", + "type": "array", + "items": { + "type": "object", + "properties": { + "protocol": { + "title": "Subprotocol", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "scheme": { + "title": "Scheme", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "authority": { + "title": "Authority", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "path": { + "title": "Path", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "additionalProperties": false + } + }, + "with": false + } + } + } + }, + "anyOf": [ + { + "required": [ + "exit" + ] + }, + { + "required": [ + "routes" + ] + } + ], + "oneOf": [ + { + "properties": { + "kind": { + "const": "client" + }, + "options": { + "properties": { + "defaults": { + "title": "Defaults", + "type": "object", + "additionalProperties": false, + "properties": { + "protocol": { + "title": "Subprotocol", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "scheme": { + "title": "Scheme", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "authority": { + "title": "Authority", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "path": { + "title": "Path", + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + } + } + }, + "additionalProperties": false + } + } + }, + { + "properties": { + "kind": { + "const": "server" + }, + "options": false + } + } + ] + } + } + ] + }, + "converter": { + "oneOf": [ + { + "$ref": "#/$defs/converter/types" + }, + { + "$ref": "#/$defs/converter/model" + } + ], + "types": { + "anyOf": [ + { + "type": "string", + "enum": [ + "avro", + "double", + "float", + "int32", + "int64", + "json", + "protobuf", + "string" + ] + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "model": { + "type": "object", + "properties": { + "model": { + "$ref": "#/$defs/converter/types" + } + }, + "required": [ + "model" + ], + "allOf": [ + { + "if": { + "properties": { + "model": { + "const": "avro" + } + } + }, + "then": { + "properties": { + "model": { + "const": "avro" + }, + "view": { + "anyOf": [ + { + "type": "string", + "enum": [ + "json" + ] + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "catalog": { + "title": "Catalog", + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "anyOf": [ + { + "type": "integer" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "required": [ + "id" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "strategy": { + "anyOf": [ + { + "type": "string", + "enum": [ + "topic" + ] + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "version": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "latest" + } + }, + "required": [ + "strategy" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "subject": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "version": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "latest" + } + }, + "required": [ + "subject" + ], + "additionalProperties": false + } + ] + } + } + }, + "maxProperties": 1 + } + }, + "required": [ + "catalog" + ], + "additionalProperties": false + } + }, + { + "if": { + "properties": { + "model": { + "const": "double" + } + } + }, + "then": { + "properties": { + "model": { + "const": "double" + }, + "format": { + "anyOf": [ + { + "type": "string", + "enum": [ + "binary", + "text" + ] + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "text" + }, + "range": { + "anyOf": [ + { + "type": "string", + "pattern": "((?:\\(|\\[))(-?\\d+(?:\\.\\d+)?)?,(-?\\d+(?:\\.\\d+)?)?((?:\\)|\\]))" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "multiple": { + "anyOf": [ + { + "type": "number" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "additionalProperties": false + } + }, + { + "if": { + "properties": { + "model": { + "const": "float" + } + } + }, + "then": { + "properties": { + "model": { + "const": "float" + }, + "format": { + "anyOf": [ + { + "type": "string", + "enum": [ + "binary", + "text" + ] + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "text" + }, + "range": { + "anyOf": [ + { + "type": "string", + "pattern": "((?:\\(|\\[))(-?\\d+(?:\\.\\d+)?)?,(-?\\d+(?:\\.\\d+)?)?((?:\\)|\\]))" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "multiple": { + "anyOf": [ + { + "type": "number" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "additionalProperties": false + } + }, + { + "if": { + "properties": { + "model": { + "const": "int32" + } + } + }, + "then": { + "properties": { + "model": { + "const": "int32" + }, + "format": { + "anyOf": [ + { + "type": "string", + "enum": [ + "binary", + "text" + ] + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "text" + }, + "range": { + "anyOf": [ + { + "type": "string", + "pattern": "((?:\\(|\\[))(-?\\d+)?,(-?\\d+)?((?:\\)|\\]))" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "multiple": { + "anyOf": [ + { + "type": "integer" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "additionalProperties": false + } + }, + { + "if": { + "properties": { + "model": { + "const": "int64" + } + } + }, + "then": { + "properties": { + "model": { + "const": "int64" + }, + "format": { + "anyOf": [ + { + "type": "string", + "enum": [ + "binary", + "text" + ] + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "text" + }, + "range": { + "anyOf": [ + { + "type": "string", + "pattern": "((?:\\(|\\[))(-?\\d+)?,(-?\\d+)?((?:\\)|\\]))" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "multiple": { + "anyOf": [ + { + "type": "integer" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "additionalProperties": false + } + }, + { + "if": { + "properties": { + "model": { + "const": "json" + } + } + }, + "then": { + "properties": { + "model": { + "const": "json" + }, + "catalog": { + "title": "Catalog", + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "anyOf": [ + { + "type": "integer" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "required": [ + "id" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "strategy": { + "anyOf": [ + { + "type": "string", + "enum": [ + "topic" + ] + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "version": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "latest" + } + }, + "required": [ + "strategy" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "subject": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "version": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "latest" + } + }, + "required": [ + "subject" + ], + "additionalProperties": false + } + ] + } + } + }, + "maxProperties": 1 + } + }, + "required": [ + "catalog" + ], + "additionalProperties": false + } + }, + { + "if": { + "properties": { + "model": { + "const": "protobuf" + } + } + }, + "then": { + "properties": { + "model": { + "const": "protobuf" + }, + "view": { + "anyOf": [ + { + "type": "string", + "enum": [ + "json" + ] + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "catalog": { + "title": "Catalog", + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "anyOf": [ + { + "type": "integer" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "record": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "required": [ + "id", + "record" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "strategy": { + "anyOf": [ + { + "type": "string", + "enum": [ + "topic" + ] + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "version": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "latest" + }, + "record": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "required": [ + "strategy", + "record" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "subject": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "version": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "latest" + }, + "record": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "required": [ + "subject", + "record" + ], + "additionalProperties": false + } + ] + } + } + }, + "maxProperties": 1 + } + }, + "required": [ + "catalog" + ], + "additionalProperties": false + } + }, + { + "if": { + "properties": { + "model": { + "const": "string" + } + } + }, + "then": { + "properties": { + "model": { + "const": "string" + }, + "encoding": { + "anyOf": [ + { + "type": "string", + "enum": [ + "utf_8", + "utf_16" + ] + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "minLength": { + "anyOf": [ + { + "type": "integer", + "minimum": 1 + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "maxLength": { + "anyOf": [ + { + "type": "integer", + "minimum": 1 + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "pattern": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "additionalProperties": false + } + } + ] + } + }, + "validator": { + "oneOf": [ + { + "$ref": "#/$defs/validator/types" + }, + { + "$ref": "#/$defs/validator/model" + } + ], + "types": { + "anyOf": [ + { + "type": "string", + "enum": [ + "double", + "float", + "int32", + "int64", + "json", + "string" + ] + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "model": { + "type": "object", + "properties": { + "model": { + "$ref": "#/$defs/validator/types" + } + }, + "required": [ + "model" + ], + "allOf": [ + { + "if": { + "properties": { + "model": { + "const": "double" + } + } + }, + "then": { + "properties": { + "model": { + "const": "double" + }, + "format": { + "anyOf": [ + { + "type": "string", + "enum": [ + "binary", + "text" + ] + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "text" + }, + "range": { + "anyOf": [ + { + "type": "string", + "pattern": "((?:\\(|\\[))(-?\\d+(?:\\.\\d+)?)?,(-?\\d+(?:\\.\\d+)?)?((?:\\)|\\]))" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "multiple": { + "anyOf": [ + { + "type": "number" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "additionalProperties": false + } + }, + { + "if": { + "properties": { + "model": { + "const": "float" + } + } + }, + "then": { + "properties": { + "model": { + "const": "float" + }, + "format": { + "anyOf": [ + { + "type": "string", + "enum": [ + "binary", + "text" + ] + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "text" + }, + "range": { + "anyOf": [ + { + "type": "string", + "pattern": "((?:\\(|\\[))(-?\\d+(?:\\.\\d+)?)?,(-?\\d+(?:\\.\\d+)?)?((?:\\)|\\]))" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "multiple": { + "anyOf": [ + { + "type": "number" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "additionalProperties": false + } + }, + { + "if": { + "properties": { + "model": { + "const": "int32" + } + } + }, + "then": { + "properties": { + "model": { + "const": "int32" + }, + "format": { + "anyOf": [ + { + "type": "string", + "enum": [ + "binary", + "text" + ] + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "text" + }, + "range": { + "anyOf": [ + { + "type": "string", + "pattern": "((?:\\(|\\[))(-?\\d+)?,(-?\\d+)?((?:\\)|\\]))" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "multiple": { + "anyOf": [ + { + "type": "integer" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "additionalProperties": false + } + }, + { + "if": { + "properties": { + "model": { + "const": "int64" + } + } + }, + "then": { + "properties": { + "model": { + "const": "int64" + }, + "format": { + "anyOf": [ + { + "type": "string", + "enum": [ + "binary", + "text" + ] + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "text" + }, + "range": { + "anyOf": [ + { + "type": "string", + "pattern": "((?:\\(|\\[))(-?\\d+)?,(-?\\d+)?((?:\\)|\\]))" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "multiple": { + "anyOf": [ + { + "type": "number" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "additionalProperties": false + } + }, + { + "if": { + "properties": { + "model": { + "const": "json" + } + } + }, + "then": { + "properties": { + "model": { + "const": "json" + }, + "catalog": { + "title": "Catalog", + "type": "object", + "patternProperties": { + "^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "id": { + "anyOf": [ + { + "type": "integer" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "required": [ + "id" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "strategy": { + "anyOf": [ + { + "type": "string", + "enum": [ + "topic" + ] + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "version": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "latest" + } + }, + "required": [ + "strategy" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "subject": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "version": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ], + "default": "latest" + } + }, + "required": [ + "subject" + ], + "additionalProperties": false + } + ] + } + } + }, + "maxProperties": 1 + } + }, + "required": [ + "catalog" + ], + "additionalProperties": false + } + }, + { + "if": { + "properties": { + "model": { + "const": "string" + } + } + }, + "then": { + "properties": { + "model": { + "const": "string" + }, + "encoding": { + "anyOf": [ + { + "type": "string", + "enum": [ + "utf_8" + ] + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "minLength": { + "anyOf": [ + { + "type": "integer", + "minimum": 1 + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "maxLength": { + "anyOf": [ + { + "type": "integer", + "minimum": 1 + }, + { + "$ref": "#/$defs/expression" + } + ] + }, + "pattern": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/$defs/expression" + } + ] + } + }, + "additionalProperties": false + } + } + ] + } + } + } +} diff --git a/src/.vuepress/styles/index.scss b/src/.vuepress/styles/index.scss index d8ad2d04..a524e631 100644 --- a/src/.vuepress/styles/index.scss +++ b/src/.vuepress/styles/index.scss @@ -140,9 +140,12 @@ h6 { margin-left: 0rem; font-weight: 600; } + .vp-sidebar-title { + font-weight: 500; + } .vp-sidebar-links { .vp-sidebar-link { - padding: 0.25rem 0.5rem; + padding-right: 0rem !important; margin-left: 0rem; } .vp-sidebar-links { diff --git a/src/.vuepress/theme.ts b/src/.vuepress/theme.ts index 2d760097..3a18b468 100644 --- a/src/.vuepress/theme.ts +++ b/src/.vuepress/theme.ts @@ -3,6 +3,7 @@ import { hopeTheme } from "vuepress-theme-hope"; import { enSidebar } from "./sidebar/index.js"; import { enNavbar } from "./navbar/index.js"; import { + base, siteBase, versionKey, hostnameSEO, @@ -66,6 +67,7 @@ export default hopeTheme({ appId: "H6RNUBSB6E", indexName: "aklivity", apiKey: "bae72797404a23ba5466230146919cae", + indexBase: `/${base}/`, searchParameters: { facetFilters: [`version:${versionKey}`, `product:${siteBase}`], }, diff --git a/src/concepts/bindings.md b/src/concepts/bindings.md index 8b7d24d6..53005658 100644 --- a/src/concepts/bindings.md +++ b/src/concepts/bindings.md @@ -55,11 +55,11 @@ A `client` receives inbound application streams and encodes each as a network st #### Cache Client & Server Bindings -A `cache_client` & `cache_server` combined provide a persistent cache of Kafka messages per topic partition, honoring the Kafka topic configuration for message expiration and compaction. Read more in the [kafka](../reference/config/bindings/binding-kafka.md#cache-behavior) binding. +A `cache_client` & `cache_server` combined provide a persistent cache of Kafka messages per topic partition, honoring the Kafka topic configuration for message expiration and compaction. Read more in the [kafka](../reference/config/bindings/kafka/README.md#cache-behavior) binding. #### Remote Server Bindings -A `remote_server` exists to adapt a Kafka topic stream to a higher-level application stream. Read more in the [kafka-grpc](../reference/config/bindings/binding-kafka-grpc.md#summary) binding. +A `remote_server` exists to adapt a Kafka topic stream to a higher-level application stream. Read more in the [kafka-grpc](../reference/config/bindings/kafka-grpc/README.md) binding. ## Routes @@ -93,11 +93,11 @@ A condition will attempt to match the target stream exactly against the configur - `client-123` - `client-*` -[http-kafka]:../reference/config/bindings/binding-http-kafka.md#routes -[sse-kafka]:../reference/config/bindings/binding-sse-kafka.md#routes -[grpc-kafka]:../reference/config/bindings/binding-grpc-kafka.md#routes -[kafka-grpc]:../reference/config/bindings/binding-kafka-grpc.md#routes -[mqtt-kafka]:../reference/config/bindings/binding-mqtt-kafka.md#routes +[http-kafka]:../reference/config/bindings/http-kafka/proxy.md#routes +[sse-kafka]:../reference/config/bindings/sse-kafka/proxy.md#routes +[grpc-kafka]:../reference/config/bindings/grpc-kafka/proxy.md#routes +[kafka-grpc]:../reference/config/bindings/kafka-grpc/remote_server.md#routes +[mqtt-kafka]:../reference/config/bindings/mqtt-kafka/proxy.md#routes ## Dynamic path parameters @@ -111,11 +111,11 @@ After the route logic matches, additional parameters are applied `with` the inbo Routes with the `fetch` capability map retrieval requests from a Kafka topic, supporting filtered or unfiltered retrieval of messages from the topic partitions, merged into a unified response. Filtering can apply to the Kafka message key, message headers, or a combination of both message key and headers. -The [http-kafka](../reference/config/bindings/binding-http-kafka.md) binding provides additional support for extracting parameter values from the inbound HTTP request path. Successful `200 OK` HTTP responses include an [ETag](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag) header that can be used with [if-none-match](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-None-Match) for subsequent conditional `GET` requests to check for updates. Rather than polling, HTTP requests can also include the `prefer wait=N` header to wait a maximum of `N` seconds before responding with `304 Not Modified` if not modified. When a new message arrives on the topic that would modify the response, all `prefer: wait=N` clients receive the response immediately with a corresponding new ETag. +The [http-kafka](../reference/config/bindings/http-kafka/README.md) binding provides additional support for extracting parameter values from the inbound HTTP request path. Successful `200 OK` HTTP responses include an [ETag](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag) header that can be used with [if-none-match](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-None-Match) for subsequent conditional `GET` requests to check for updates. Rather than polling, HTTP requests can also include the `prefer wait=N` header to wait a maximum of `N` seconds before responding with `304 Not Modified` if not modified. When a new message arrives on the topic that would modify the response, all `prefer: wait=N` clients receive the response immediately with a corresponding new ETag. ### Reliable message delivery -With the [grpc-kafka](../reference/config/bindings/binding-grpc-kafka.md) binding, using the fetch capability, reliable message delivery is achieved by capturing the value of the `reliability` `field` injected into each response stream message at the gRPC client, and replaying the value via the `reliability` `metadata` header when reestablishing the stream with a new gRPC request. This allows interrupted streams to pick up where they left off without missing messages in the response stream. +With the [grpc-kafka](../reference/config/bindings/grpc-kafka/README.md) binding, using the fetch capability, reliable message delivery is achieved by capturing the value of the `reliability` `field` injected into each response stream message at the gRPC client, and replaying the value via the `reliability` `metadata` header when reestablishing the stream with a new gRPC request. This allows interrupted streams to pick up where they left off without missing messages in the response stream. ### The Produce capability @@ -123,13 +123,13 @@ Routes with the `produce` capability map any request-response network call to a Requests with an `idempotency-key` header can be replayed and receive the same response. A Kafka consumer can detect and ignore any potential duplicate requests because they will have the same `idempotency-key` and `zilla:correlation-id`. -In the [http-kafka](../reference/config/bindings/binding-http-kafka.md) binding, specifying `async` allows clients to include a `prefer: respond-async` header in the HTTP request to receive `202 Accepted` response with `location` response header. +In the [http-kafka](../reference/config/bindings/http-kafka/README.md) binding, specifying `async` allows clients to include a `prefer: respond-async` header in the HTTP request to receive `202 Accepted` response with `location` response header. A corresponding `routes[].when` object with a matching `GET` method and `location` path is also required for follow-up `GET` requests to return the same response as would have been returned if the `prefer: respond-async` request header had been omitted. ## Route Exit -A route exists to direct a data stream to a desired exit point. This is the next binding needed to parse the stream data. Bindings like [tcp](../reference/config/bindings/binding-tcp.md) are frequently used to route incoming streams to different exit points. Once a valid exit point is determined messages can flow to the correct `exit` destination. +A route exists to direct a data stream to a desired exit point. This is the next binding needed to parse the stream data. Bindings like [tcp](../reference/config/bindings/tcp/README.md) are frequently used to route incoming streams to different exit points. Once a valid exit point is determined messages can flow to the correct `exit` destination. ## Guarded Routes diff --git a/src/concepts/catalogs.md b/src/concepts/catalogs.md index 6aa3f98f..24f8c0f1 100644 --- a/src/concepts/catalogs.md +++ b/src/concepts/catalogs.md @@ -17,12 +17,12 @@ catalogs: ## Local Catalogs -The simplest catalogs allow Zilla to access resources directly. The [filesystem](../reference/config/catalogs/catalog-filesystem.md) catalog will look for resources on the host filesystem. To embed a resource directly into the Zilla config yaml an [inline](../reference/config/catalogs/catalog-inline.md) catalog can be used to define any text based resource. +The simplest catalogs allow Zilla to access resources directly. The [filesystem](../reference/config/catalogs/filesystem.md) catalog will look for resources on the host filesystem. To embed a resource directly into the Zilla config yaml an [inline](../reference/config/catalogs/inline.md) catalog can be used to define any text based resource. > [http.proxy.schema.inline example](https://github.com/aklivity/zilla-examples/tree/main/http.proxy.schema.inline) ## Remote Catalogs -Zilla can reference remote configs stored in third-party services like Schema Registry. The [schema-registry](../reference/config/catalogs/catalog-schema-registry.md) and [apicurio-registry](../reference/config/catalogs/catalog-apicurio-registry.md) catalogs allow zilla to interact with those services through their admin APIs. +Zilla can reference remote configs stored in third-party services like Schema Registry. The [schema-registry](../reference/config/catalogs/schema-registry.md) and [apicurio-registry](../reference/config/catalogs/apicurio-registry.md) catalogs allow zilla to interact with those services through their admin APIs. > [Apicurio in the Petstore REST Demo](https://github.com/aklivity/zilla-demos/tree/main/petstore) | [http.kafka.karapace example](https://github.com/aklivity/zilla-examples/tree/main/http.kafka.karapace) diff --git a/src/concepts/kafka-proxies/grpc-proxy.md b/src/concepts/kafka-proxies/grpc-proxy.md index f6c740a6..8d922908 100644 --- a/src/concepts/kafka-proxies/grpc-proxy.md +++ b/src/concepts/kafka-proxies/grpc-proxy.md @@ -8,7 +8,7 @@ next: /tutorials/grpc/grpc-intro.md The Zilla gRPC Kafka Proxy lets you implement gRPC service definitions from protobuf files to produce and consume messages via Kafka topics. -Zilla can be the gRPC server, routing a service method's request and response messages to and from Kafka topics, or Zilla can fanout messages from a Kafka topic to multiple gRPC clients using the [grpc-kafka](../../reference/config/bindings/binding-grpc-kafka.md) and [kafka-grpc](../../reference/config/bindings/binding-kafka-grpc.md) bindings in a [zilla.yaml](../../reference/config/overview.md) config. Additionally, Zilla can sit on the critical path between a gRPC client and server. They can communicate as if they are talking directly to each other, while Zilla actually proxies the messages through Kafka. +Zilla can be the gRPC server, routing a service method's request and response messages to and from Kafka topics, or Zilla can fanout messages from a Kafka topic to multiple gRPC clients using the [grpc-kafka](../../reference/config/bindings/grpc-kafka/) and [kafka-grpc](../../reference/config/bindings/kafka-grpc/README.md) bindings in a [zilla.yaml](../../reference/config/overview.md) config. Additionally, Zilla can sit on the critical path between a gRPC client and server. They can communicate as if they are talking directly to each other, while Zilla actually proxies the messages through Kafka. ## RPC Service Definitions @@ -54,14 +54,14 @@ Zilla manages the synchronous request and response messages of a gRPC service. R ## gRPC Metadata -Method routes can use [custom metadata fields](../../reference/config/bindings/binding-grpc-kafka.md#when-metadata) for request routing and idempotency. Zilla can also augment the metadata it sends based on the configured route the request matches. +Method routes can use [custom metadata fields](../../reference/config/bindings/grpc-kafka/proxy.md#when-metadata) for request routing and idempotency. Zilla can also augment the metadata it sends based on the configured route the request matches. ## Reliable Delivery -Clients can fetch some or all messages from a single Kafka topic using a route with the [fetch capability](../../reference/config/bindings/binding-grpc-kafka.md#fetch-capability) by creating a service definition with an `Empty` request type and the topic message as the response type. Zilla sends an event ID with every message serialized as an unknown field in the payload. Messages can be identified without field collision, and the client doesn't need to acknowledge the message receipt explicitly. A client consuming the stream of messages can remember the event ID. In the event, the stream gets interrupted. The client can reconnect with a `last-event-id` header to recover without message loss or needing to start over from the beginning. +Clients can fetch some or all messages from a single Kafka topic using a route with the [fetch capability](../../reference/config/bindings/grpc-kafka/proxy.md#fetch-capability) by creating a service definition with an `Empty` request type and the topic message as the response type. Zilla sends an event ID with every message serialized as an unknown field in the payload. Messages can be identified without field collision, and the client doesn't need to acknowledge the message receipt explicitly. A client consuming the stream of messages can remember the event ID. In the event, the stream gets interrupted. The client can reconnect with a `last-event-id` header to recover without message loss or needing to start over from the beginning. ## Kafka Consumer Groups -The [kafka-grpc](../../reference/config/bindings/binding-kafka-grpc.md) `remote_server` binding will create a consumer group. It creates one consumer per named binding in a zilla config. The format of the consumer group ID is `zilla:-`. Scaling the number of Zilla instances with the same configuration will add each new Zilla instance as a member of the same group. Using different Zilla `namespace`s or adding multiple bindings will create different consumer groups. +The [kafka-grpc](../../reference/config/bindings/kafka-grpc/README.md) `remote_server` binding will create a consumer group. It creates one consumer per named binding in a zilla config. The format of the consumer group ID is `zilla:-`. Scaling the number of Zilla instances with the same configuration will add each new Zilla instance as a member of the same group. Using different Zilla `namespace`s or adding multiple bindings will create different consumer groups. -The [grpc-kakfa](../../reference/config/bindings/binding-grpc-kafka.md) does not create consumer groups. Instead, the binding fetches messages from a topic the same way for all connected clients. Clients can filter messages received using filters like adding the desired Kafka message key in the `idempotency-key` header. The client can track and recover progress through the stream using [reliable delivery](#reliable-delivery). +The [grpc-kakfa](../../reference/config/bindings/grpc-kafka/README.md) does not create consumer groups. Instead, the binding fetches messages from a topic the same way for all connected clients. Clients can filter messages received using filters like adding the desired Kafka message key in the `idempotency-key` header. The client can track and recover progress through the stream using [reliable delivery](#reliable-delivery). diff --git a/src/concepts/kafka-proxies/http-proxy.md b/src/concepts/kafka-proxies/http-proxy.md index be23154a..71e89116 100644 --- a/src/concepts/kafka-proxies/http-proxy.md +++ b/src/concepts/kafka-proxies/http-proxy.md @@ -12,11 +12,11 @@ A developer has the freedom to define their own HTTP mapping to Kafka, with cont ## Configure Endpoints -Zilla can map REST APIs to Kafka using the [http-kafka](../../reference/config/bindings/binding-http-kafka.md) binding in a [zilla.yaml](../../reference/config/overview.md) config. Zilla routes REST urls using [wildcard pattern matching](../bindings.md#pattern-matching) and [dynamic path params](../bindings.md#dynamic-path-parameters). Dynamic path matching and custom message routing from endpoints to Kafka topics help prevent API lock-in. +Zilla can map REST APIs to Kafka using the [http-kafka](../../reference/config/bindings/http-kafka/README.md) binding in a [zilla.yaml](../../reference/config/overview.md) config. Zilla routes REST urls using [wildcard pattern matching](../bindings.md#pattern-matching) and [dynamic path params](../bindings.md#dynamic-path-parameters). Dynamic path matching and custom message routing from endpoints to Kafka topics help prevent API lock-in. ### HTTP request methods -Zilla separates the HTTP request methods into two groups called capabilities: produce and fetch. The [produce](../bindings.md#the-fetch-capability) capability handles method types `POST`, `PUT`, `DELETE`, and `PATCH` that produce messages onto Kafka topics. The [fetch](../../reference/config/bindings/binding-http-kafka.md#with-capability-fetch) capability handles the `GET` method that fetches messages from Kafka topics. One exception is for a route managing async correlation. The `produce` route will have two when clauses: a `PUT` clause for submission and a `GET` clause matching the `async.location` path returned to the caller. +Zilla separates the HTTP request methods into two groups called capabilities: produce and fetch. The [produce](../bindings.md#the-fetch-capability) capability handles method types `POST`, `PUT`, `DELETE`, and `PATCH` that produce messages onto Kafka topics. The [fetch](../../reference/config/bindings/http-kafka/proxy.md#with-capability-fetch) capability handles the `GET` method that fetches messages from Kafka topics. One exception is for a route managing async correlation. The `produce` route will have two when clauses: a `PUT` clause for submission and a `GET` clause matching the `async.location` path returned to the caller. ## Correlated Request-Response @@ -32,13 +32,13 @@ An asynchronous interaction includes a `prefer: respond-async` header when calli ## SSE Streaming -The Zilla Server-sent Events (SSE) Kafka Proxy exposes an SSE stream of Kafka messages using the [sse-kafka](../../reference/config/bindings/binding-sse-kafka.md) binding. +The Zilla Server-sent Events (SSE) Kafka Proxy exposes an SSE stream of Kafka messages using the [sse-kafka](../../reference/config/bindings/sse-kafka/README.md) binding. An [SSE](https://html.spec.whatwg.org/multipage/server-sent-events.html) server allows a web browser using the `EventSource` interface to send a request to an SSE endpoint and receive a stream of text from the server, interpreted as individual messages. Zilla relays text messages on a Kafka topic into the event stream. ### Message Filtering -The message source topic is defined in a route, and the route is matched by the path defined for the client to connect. A route can [filter](../../reference/config/bindings/binding-sse-kafka.md#routes-with) the messages delivered to the SSE stream using the message key and headers. A filter's value can be statically defined in the config or be pulled from a [path param](../bindings.md#dynamic-path-parameters). +The message source topic is defined in a route, and the route is matched by the path defined for the client to connect. A route can [filter](../../reference/config/bindings/sse-kafka/proxy.md#routes-with) the messages delivered to the SSE stream using the message key and headers. A filter's value can be statically defined in the config or be pulled from a [path param](../bindings.md#dynamic-path-parameters). ### Reliable Delivery @@ -60,11 +60,11 @@ An HTTP response returns with an [ETag](https://developer.mozilla.org/en-US/docs ## CORS -Zilla supports Cross-Origin Resource Sharing (CORS) and allows you to specify fine-grained access control, including specific request origins, methods and headers allowed, and specific response headers exposed. Since it acts more like a guard and has no dependency on Apache Kafka configuration, you need to define it in the [http](../../reference/config/bindings/binding-http.md) binding. +Zilla supports Cross-Origin Resource Sharing (CORS) and allows you to specify fine-grained access control, including specific request origins, methods and headers allowed, and specific response headers exposed. Since it acts more like a guard and has no dependency on Apache Kafka configuration, you need to define it in the [http](../../reference/config/bindings/http/README.md) binding. ## Authorization -Zilla has a modular config that includes the concept of a [Guard](../../reference/config/overview.md#guards) where you define your `guard` configuration and reference that `guard` to authorize a specific endpoint. JSON Web Token (JWT) authorization is supported with the [`jwt`](../../reference/config/guards/guard-jwt.md) Guard. +Zilla has a modular config that includes the concept of a [Guard](../../reference/config/overview.md#guards) where you define your `guard` configuration and reference that `guard` to authorize a specific endpoint. JSON Web Token (JWT) authorization is supported with the [`jwt`](../../reference/config/guards/jwt.md) Guard. ### SSE Continuous Authorization diff --git a/src/concepts/kafka-proxies/mqtt-proxy.md b/src/concepts/kafka-proxies/mqtt-proxy.md index 93abed90..7f9932c6 100644 --- a/src/concepts/kafka-proxies/mqtt-proxy.md +++ b/src/concepts/kafka-proxies/mqtt-proxy.md @@ -8,7 +8,7 @@ next: /tutorials/mqtt/mqtt-intro.md The Zilla MQTT Kafka Proxy manages MQTT Pub/Sub connections and messages on and off of Kafka. -An MQTT server acts as a broker between publishers and subscribers. This requires a complex protocol to manage the wide range of IoT devices and use cases. By proxying these messages on and off of Kafka with the [mqtt-kafka](../../reference/config/bindings/binding-mqtt-kafka.md) binding in a [zilla.yaml](../../reference/config/overview.md) config, IoT devices can transmit data to a wider range of tech stacks, adapting to more business needs. +An MQTT server acts as a broker between publishers and subscribers. This requires a complex protocol to manage the wide range of IoT devices and use cases. By proxying these messages on and off of Kafka with the [mqtt-kafka](../../reference/config/bindings/mqtt-kafka/) binding in a [zilla.yaml](../../reference/config/overview.md) config, IoT devices can transmit data to a wider range of tech stacks, adapting to more business needs. Zilla uses specific Kafka topics to store and route MQTT messages, meaning the Kafka architecture can be optimized for MQTT Pub/Sub. MQTT client subscribers and publishers will communicate with Zilla the same as any broker. @@ -30,7 +30,7 @@ An MQTT client can use any Quality of Service flag. ### MQTT over WebSocket -The [tcp](../../reference/config/bindings/binding-tcp.md) binding defines the ports Zilla will accept traffic for both MQTT and WebSocket connections. Zilla natively handles WebSockets and can manage the MQTT protocol over an active connection. +The [tcp](../../reference/config/bindings/tcp/README.md) binding defines the ports Zilla will accept traffic for both MQTT and WebSocket connections. Zilla natively handles WebSockets and can manage the MQTT protocol over an active connection. ### Last Will and Testament @@ -54,7 +54,7 @@ An MQTT client can be redirected to a specific Zilla instance, sharding client s ## Pub/Sub with Kafka -Zilla manages MQTT pub/sub to Kafka using three Kafka topics. The specific topic names can be configured using the [options.topics](../../reference/config/bindings/binding-mqtt-kafka.md#options-topics) property. +Zilla manages MQTT pub/sub to Kafka using three Kafka topics. The specific topic names can be configured using the [options.topics](../../reference/config/bindings/mqtt-kafka/proxy.md#options-topics) property. ### Messages on Kafka @@ -62,7 +62,7 @@ All MQTT messages brokered by Zilla are published on the `messages` Kafka topic. ### Topic routing -By defining [routes](../../reference/config/bindings/binding-mqtt-kafka.md#routes) in Zilla, you can direct MQTT publish and subscribe connections to specific kafka topics other than the `messages` Kafka topic. The `sessions` and `retained` topics are not affected by routing. +By defining [routes](../../reference/config/bindings/mqtt-kafka/proxy.md#routes) in Zilla, you can direct MQTT publish and subscribe connections to specific kafka topics other than the `messages` Kafka topic. The `sessions` and `retained` topics are not affected by routing. ### Retaining Messages @@ -74,4 +74,4 @@ MQTT connect, disconnect, and other session messages are maintained on the `sess ## Authorizing clients -Any connection Zilla handles can be secured using the [tls](../../reference/config/bindings/binding-tls.md) binding. This means both MQTT and MQTT over WebSocket can be encrypted. Additionally, A client connection to the MQTT server can be guarded by the [jwt](../../reference/config/guards/guard-jwt.md) guard supporting JWT access tokens, with fine-grained privileges enforced on publish or subscribe to MQTT topics. +Any connection Zilla handles can be secured using the [tls](../../reference/config/bindings/tls/) binding. This means both MQTT and MQTT over WebSocket can be encrypted. Additionally, A client connection to the MQTT server can be guarded by the [jwt](../../reference/config/guards/jwt.md) guard supporting JWT access tokens, with fine-grained privileges enforced on publish or subscribe to MQTT topics. diff --git a/src/concepts/spec-generation.md b/src/concepts/spec-generation.md index fa068fca..56ac1be8 100644 --- a/src/concepts/spec-generation.md +++ b/src/concepts/spec-generation.md @@ -8,7 +8,7 @@ Zilla can leverage standard API schema specifications to configure the settings ## OpenAPI and AsyncAPI -The Zilla config uses many of the same parameters as the public and open-source interface definition languages [OpenAPI](https://www.openapis.org/) and [AsyncAPI](https://www.asyncapi.com/). Services and tools are available to describe your existing APIs and infrastructure using OpenAPI and AsyncAPI definitions. These specs enable more consistent documentation, versioning, and code generation. Using the [openapi](../reference/config/bindings/binding-openapi.md) and [asyncapi](../reference/config/bindings/binding-asyncapi.md) bindings enables the use of existing interface specs to configure Zilla. +The Zilla config uses many of the same parameters as the public and open-source interface definition languages [OpenAPI](https://www.openapis.org/) and [AsyncAPI](https://www.asyncapi.com/). Services and tools are available to describe your existing APIs and infrastructure using OpenAPI and AsyncAPI definitions. These specs enable more consistent documentation, versioning, and code generation. Using the [openapi](../reference/config/bindings/openapi/) and [asyncapi](../reference/config/bindings/asyncapi/README.md) bindings enables the use of existing interface specs to configure Zilla. Zilla leverages the interface definitions in these specs to generate the necessary `zilla.yaml` config to implement the defined services. Zilla doesn't generate code that needs to be maintained. Instead, it generates the underlying configuration necessary to implement a functioning interface. Both standard and complex use cases are implemented easily with Zilla. @@ -16,13 +16,13 @@ You can see a working [Petstore Demo](https://github.com/aklivity/zilla-demos/tr ### OpenAPI -Zilla implements the RESTful APIs defined in the [openapi](../reference/config/bindings/binding-openapi.md) binding. A REST Kafka proxy is defined using the [openapi-asyncapi](../reference/config/bindings/binding-openapi-asyncapi.md) binding. The Kafka configuration is defined with an [asyncapi](../reference/config/bindings/binding-asyncapi.md) `client` binding. +Zilla implements the RESTful APIs defined in the [openapi](../reference/config/bindings/openapi/) binding. A REST Kafka proxy is defined using the [openapi-asyncapi](../reference/config/bindings/openapi-asyncapi/) binding. The Kafka configuration is defined with an [asyncapi](../reference/config/bindings/asyncapi/README.md) `client` binding. > [Petstore REST demo](https://github.com/aklivity/zilla-demos/tree/main/petstore) | [Taxi Hailing demo](https://github.com/aklivity/zilla-demos/tree/main/taxi) | [openapi.proxy example](https://github.com/aklivity/zilla-examples/tree/main/openapi.proxy) ### AsyncAPI -Zilla implements Event-Driven APIs defined in the [asyncapi](../reference/config/bindings/binding-asyncapi.md) binding. A Kafka proxy is defined using the [asyncapi](../reference/config/bindings/binding-asyncapi.md) `proxy` binding. The Kafka configuration is defined with an [asyncapi](../reference/config/bindings/binding-asyncapi.md) `client` binding. +Zilla implements Event-Driven APIs defined in the [asyncapi](../reference/config/bindings/asyncapi/) binding. A Kafka proxy is defined using the [asyncapi](../reference/config/bindings/asyncapi/) `proxy` binding. The Kafka configuration is defined with an [asyncapi](../reference/config/bindings/asyncapi/README.md) `client` binding. > [Taxi Hailing demo](https://github.com/aklivity/zilla-demos/tree/main/taxi) | [asyncapi.http.kafka.proxy example](https://github.com/aklivity/zilla-examples/tree/main/asyncapi.http.kafka.proxy) | [asyncapi.mqtt.kafka.proxy example](https://github.com/aklivity/zilla-examples/tree/main/asyncapi.mqtt.kafka.proxy) | [asyncapi.sse.kafka.proxy example](https://github.com/aklivity/zilla-examples/tree/main/asyncapi.sse.kafka.proxy) @@ -30,6 +30,6 @@ Zilla implements Event-Driven APIs defined in the [asyncapi](../reference/config The Zilla gRPC Kafka Proxy lets you implement gRPC service definitions from protobuf files to produce and consume messages via Kafka topics. -Zilla can be the gRPC server, routing a service method's request and response messages to and from Kafka topics, or Zilla can fanout messages from a Kafka topic to multiple gRPC clients using the [grpc-kafka](../reference/config/bindings/binding-grpc-kafka.md) and [kafka-grpc](../reference/config/bindings/binding-kafka-grpc.md) bindings in a [zilla.yaml](../reference/config/overview.md) config. Additionally, Zilla can sit on the critical path between a gRPC client and a server. They can communicate as if they are talking directly to each other, while Zilla actually proxies the messages through Kafka. +Zilla can be the gRPC server, routing a service method's request and response messages to and from Kafka topics, or Zilla can fanout messages from a Kafka topic to multiple gRPC clients using the [grpc-kafka](../reference/config/bindings/grpc-kafka/) and [kafka-grpc](../reference/config/bindings/kafka-grpc/) bindings in a [zilla.yaml](../reference/config/overview.md) config. Additionally, Zilla can sit on the critical path between a gRPC client and a server. They can communicate as if they are talking directly to each other, while Zilla actually proxies the messages through Kafka. > [grpc.kafka.fanout example](https://github.com/aklivity/zilla-examples/tree/main/grpc.kafka.fanout) | [grpc.proxy example](https://github.com/aklivity/zilla-examples/tree/main/grpc.proxy) diff --git a/src/concepts/ssl.md b/src/concepts/ssl.md index f335c378..131e242c 100644 --- a/src/concepts/ssl.md +++ b/src/concepts/ssl.md @@ -1,8 +1,8 @@ # Server Encryption, TLS & SSL -Vaults can be used by specific protocol bindings, such as [tls](../reference/config/bindings/binding-tls.md), to negotiate shared encryption keys. It is easy to add the necessary routing logic and encryption keys. +Vaults can be used by specific protocol bindings, such as [tls](../reference/config/bindings/tls/README.md), to negotiate shared encryption keys. It is easy to add the necessary routing logic and encryption keys. -Using a [filesystem](../reference/config/vaults/vault-filesystem.md) vault, you can see how a pkcs12 certificate on the host is configured to be stored securely by the Zilla runtime. This keystore can then be used by the [tls](../reference/config/bindings/binding-tls.md) binding to decrypt incoming traffic. +Using a [filesystem](../reference/config/vaults/filesystem.md) vault, you can see how a pkcs12 certificate on the host is configured to be stored securely by the Zilla runtime. This keystore can then be used by the [tls](../reference/config/bindings/tls/README.md) binding to decrypt incoming traffic. ```yaml{6} vaults: @@ -15,7 +15,7 @@ vaults: password: ${{env.KEYSTORE_PASSWORD}} ``` -The [tcp](../reference/config/bindings/binding-tcp.md) binding can be configured for both encrypted and unencrypted traffic on separate ports. Take the SSL example with ports `80` and `443`. The [tls](../reference/config/bindings/binding-tls.md) binding will use the `keys` as the certificate aliases and the Server Name Indication (`sni`) as the SSL server names. These will likely be the same. Since this example is over [http](../reference/config/bindings/binding-http.md) the Application-Layer Protocol Negotiation (ALPN) will need to handle both HTTP/1.1 and HTTP/2, but the [tls](../reference/config/bindings/binding-tls.md) binding can be configured for any of the [alpn](../reference/config/bindings/binding-tls.md#options-alpn) protocols supported by Zilla. +The [tcp](../reference/config/bindings/tcp/) binding can be configured for both encrypted and unencrypted traffic on separate ports. Take the SSL example with ports `80` and `443`. The [tls](../reference/config/bindings/tls/) binding will use the `keys` as the certificate aliases and the Server Name Indication (`sni`/) as the SSL server names. These will likely be the same. Since this example is over [http](../reference/config/bindings/http/) the Application-Layer Protocol Negotiation (ALPN/) will need to handle both HTTP/1.1 and HTTP/2, but the [tls](../reference/config/bindings/tls/README.md) binding can be configured for any of the [alpn](../reference/config/bindings/tls/server.md#options-alpn) protocols supported by Zilla. ```yaml{20,29} bindings: diff --git a/src/concepts/telemetry.md b/src/concepts/telemetry.md index c4217231..bf18277a 100644 --- a/src/concepts/telemetry.md +++ b/src/concepts/telemetry.md @@ -17,8 +17,8 @@ telemetry: ## Events -[Events](../reference/config/telemetry/events.md) in Zilla signal important activities and collect relevant information along with them. Primarily they are useful when troubleshooting common issues like model validation or failed secure access, but they provide more observability with the HTTP access information. The easiest way to see logged events in Zilla is to add the [stdout](../reference/config/telemetry/exporters/exporter-stdout.md) exporter to your `zilla.yaml` config. +[Events](../reference/config/telemetry/events.md) in Zilla signal important activities and collect relevant information along with them. Primarily they are useful when troubleshooting common issues like model validation or failed secure access, but they provide more observability with the HTTP access information. The easiest way to see logged events in Zilla is to add the [stdout](../reference/config/telemetry/exporters/stdout.md) exporter to your `zilla.yaml` config. ## Exporters -[Exporters](../reference/config/overview.md#exporters) will determine how the collected telemetry data is exposed. The [Prometheus](../reference/config/telemetry/exporters/exporter-prometheus.md) exporter Zilla will expose any configured [metrics](../reference/config/overview.md#metrics) via the standard `/metrics` endpoint that is by prometheus to collect metrics. The [stdout](../reference/config/telemetry/exporters/exporter-stdout.md) exporter will simply log all [Events](#events) to the host `stdout` and can be collected by any log aggregator. The [OpenTelemetry Protocol](../reference/config/telemetry/exporters/exporter-otlp.md) exporter can push both logs and metrics telemetry data to the specified. +[Exporters](../reference/config/overview.md#exporters) will determine how the collected telemetry data is exposed. The [Prometheus](../reference/config/telemetry/exporters/prometheus.md) exporter Zilla will expose any configured [metrics](../reference/config/overview.md#metrics) via the standard `/metrics` endpoint that is by prometheus to collect metrics. The [stdout](../reference/config/telemetry/exporters/stdout.md) exporter will simply log all [Events](#events) to the host `stdout` and can be collected by any log aggregator. The [OpenTelemetry Protocol](../reference/config/telemetry/exporters/otlp.md) exporter can push both logs and metrics telemetry data to the specified. diff --git a/src/how-tos/connecting-to-kafka/apache-kafka.md b/src/how-tos/connecting-to-kafka/apache-kafka.md index 5fbd3cc4..f398c05f 100644 --- a/src/how-tos/connecting-to-kafka/apache-kafka.md +++ b/src/how-tos/connecting-to-kafka/apache-kafka.md @@ -84,7 +84,7 @@ bindings: ::: -However, if the `Kafka` cluster is secured by a TLS server certificate that is signed by a private certificate authority then you need to add a `vault` [config](../../reference/config/vaults/vault-filesystem.md) to provide access to certificates needed by the TLS client binding. +However, if the `Kafka` cluster is secured by a TLS server certificate that is signed by a private certificate authority then you need to add a `vault` [config](../../reference/config/vaults/filesystem.md) to provide access to certificates needed by the TLS client binding. ::: code-tabs#yaml @@ -123,7 +123,7 @@ bindings: ::: -However, if the `Kafka` cluster is secured by a TLS server certificate that is signed by a private certificate authority then you need to add a `vault` [config](../../reference/config/vaults/vault-filesystem.md) to provide access to certificates needed by the TLS client binding. +However, if the `Kafka` cluster is secured by a TLS server certificate that is signed by a private certificate authority then you need to add a `vault` [config](../../reference/config/vaults/filesystem.md) to provide access to certificates needed by the TLS client binding. To test the above config you can use it to add or replace the necessary bindings in the [http.kafka.sasl.scram example](https://github.com/aklivity/zilla-examples/tree/main/http.kafka.sasl.scram). diff --git a/src/how-tos/deploy-operate.md b/src/how-tos/deploy-operate.md index 997577ac..3f1aef98 100644 --- a/src/how-tos/deploy-operate.md +++ b/src/how-tos/deploy-operate.md @@ -112,7 +112,7 @@ kubectl get pod \ | xargs -I{} kubectl exec {} -n $NAMESPACE -c zilla -- sh -c "cp -r /var/run/zilla /tmp/zilla && tar czf /tmp/zilla.tar.gz /tmp/zilla && rm -rf /tmp/zilla" ``` -Copy the compressed `/var/run/zilla` directory off of the pod into your local directory using the pod name. +Copy the compressed `/var/run/zilla` directory off of the pod into your local directory using the pod name. ```bash:no-line-numbers kubectl get pod \ @@ -135,7 +135,7 @@ This feature is demonstrated in the above Helm install command. Running a `helm ## Auto Scaling -Zilla will start workers that default to the CPU cores it is allowed to use. This makes horizontal scaling easy with a 1:1 ratio of instances to workers. Any of the default scaling metrics based on server CPU usage will enable Zilla to handle traffic spikes. Additionally, Zilla [Telemetry](../reference/config/overview.md#telemetry) configuration provides more data when determining how to scale. The [Prometheus autoscale example](https://github.com/aklivity/zilla-examples/tree/main/kubernetes.prometheus.autoscale) demonstrates using metrics from the [Prometheus exporter](../reference/config/telemetry/exporters/exporter-prometheus.md) to horizontally scale Zilla on k8s. +Zilla will start workers that default to the CPU cores it is allowed to use. This makes horizontal scaling easy with a 1:1 ratio of instances to workers. Any of the default scaling metrics based on server CPU usage will enable Zilla to handle traffic spikes. Additionally, Zilla [Telemetry](../reference/config/overview.md#telemetry) configuration provides more data when determining how to scale. The [Prometheus autoscale example](https://github.com/aklivity/zilla-examples/tree/main/kubernetes.prometheus.autoscale) demonstrates using metrics from the [Prometheus exporter](../reference/config/telemetry/exporters/prometheus.md) to horizontally scale Zilla on k8s. ## Enable Incubator Features diff --git a/src/how-tos/grpc/grpc.route-guide.service.md b/src/how-tos/grpc/grpc.route-guide.service.md index d827fc9c..61115318 100644 --- a/src/how-tos/grpc/grpc.route-guide.service.md +++ b/src/how-tos/grpc/grpc.route-guide.service.md @@ -12,7 +12,7 @@ Let's take a look at how Zilla would be configured with a full featured gRPC ser ## Step 1: Declaring the service -Zilla lets you use your service proto file(s) to specify the service definitions. This will let you create one or many [grpc-kafka](../../reference/config/bindings/binding-grpc-kafka.md) proxy handlers to be used by the whole service or individual methods. +Zilla lets you use your service proto file(s) to specify the service definitions. This will let you create one or many [grpc-kafka](../../reference/config/bindings/grpc-kafka/README.md) proxy handlers to be used by the whole service or individual methods. Here is the service we will be enhancing with Zilla and Kafka. @@ -39,9 +39,9 @@ Here is the simplest configuration for declaring the gRPC service. There is a `s grpc_server: type: grpc kind: server - options: - services: - - route_guide.proto + catalog: + host_filesystem: + - subject: route_guide routes: - when: - method: routeguide.RouteGuide/* @@ -71,7 +71,7 @@ routes: ## Step 2: Handling message routing onto Kafka -This maps the proto service method's request and response messages directly to Kafka topics defined by the `topic` and `reply-to` attributes respectively. The messages are linked by the `zilla:correlation-id` header for individual calls into the gRPC service. Read more about it and how the `idempotency-key` enables safe message replays in the [grpc-kafka](../../reference/config/bindings/binding-grpc-kafka.md#produce-capability) reference section. +This maps the proto service method's request and response messages directly to Kafka topics defined by the `topic` and `reply-to` attributes respectively. The messages are linked by the `zilla:correlation-id` header for individual calls into the gRPC service. Read more about it and how the `idempotency-key` enables safe message replays in the [grpc-kafka](../../reference/config/bindings/grpc-kafka/proxy.md#produce-capability) reference section. ### Message routing for RPC request and response types @@ -134,7 +134,7 @@ routes: ### Fanout streaming RPC -An additional method for getting messages from a service onto Kafka is using the [grpc-kafka](../../reference/config/bindings/binding-grpc-kafka.md) fetch capability. This enables message filtering and reliable message delivery. Read more about the [fetch capability](../../reference/config/bindings/binding-grpc-kafka.md#fetch-capability) in the reference section. +An additional method for getting messages from a service onto Kafka is using the [grpc-kafka](../../reference/config/bindings/grpc-kafka/README.md) fetch capability. This enables message filtering and reliable message delivery. Read more about the [fetch capability](../../reference/config/bindings/grpc-kafka/proxy.md#fetch-capability) in the reference section. The service will need a method that accepts the `google/protobuf/empty.proto` and produce the massage to be fanned out onto the Kafka topic. @@ -147,7 +147,7 @@ service FanoutService } ``` -Here we set the [fetch capability](../../reference/config/bindings/binding-grpc-kafka.md#fetch-capability) and a filter. +Here we set the [fetch capability](../../reference/config/bindings/grpc-kafka/proxy.md#fetch-capability) and a filter. ```yaml grpc_kafka: @@ -167,7 +167,7 @@ grpc_kafka: ## Step 3: Calling services from Kafka -Now that messages are in Kafka we need to send them to the gRPC services responsible for processing them. For this, we will be using the [kafka-grpc](../../reference/config/bindings/binding-kafka-grpc.md) binding. +Now that messages are in Kafka we need to send them to the gRPC services responsible for processing them. For this, we will be using the [kafka-grpc](../../reference/config/bindings/kafka-grpc/README.md) binding. ```yaml remote_server: @@ -226,7 +226,7 @@ tcp_client: ### Proxy service entrypoint -Using a [tcp](../../reference/config/bindings/binding-tcp.md) server binding we can route the gRPC traffic through an `http` server, `${{env.ENTRYPOINT_HOST}}`:`${{env.ENTRYPOINT_PORT}}`, to our desired gRPC server at the ``. The [tls](../../reference/config/bindings/binding-tls.md) server binding secures the entrypoint by defining a tls certificate from the [filesystem](../../reference/config/vaults/vault-filesystem.md) vault, which is used to send the traffic over https. Alternatively, if tls is not needed The tcp server can exit directly to the http server and the tls binding and filesystem vault can be removed. +Using a [tcp server](../../reference/config/bindings/tcp/server.md) binding we can route the gRPC traffic through an `http` server, `${{env.ENTRYPOINT_HOST}}`:`${{env.ENTRYPOINT_PORT}}`, to our desired gRPC server at the ``. The [tls server](../../reference/config/bindings/tls/server.md) binding secures the entrypoint by defining a tls certificate from the [filesystem](../../reference/config/vaults/filesystem.md) vault, which is used to send the traffic over https. Alternatively, if tls is not needed The tcp server can exit directly to the http server and the tls binding and filesystem vault can be removed. ```yaml tcp_server: diff --git a/src/how-tos/mqtt/mqtt.kafka.broker.md b/src/how-tos/mqtt/mqtt.kafka.broker.md index 8192e2a7..ccbddb7f 100644 --- a/src/how-tos/mqtt/mqtt.kafka.broker.md +++ b/src/how-tos/mqtt/mqtt.kafka.broker.md @@ -131,37 +131,37 @@ Create a new file called `zilla.yaml` and append the below yaml to it. ### Entrypoint -This will configure Zilla for accepting all of the `mqtt` traffic. The [tcp](../../reference/config/bindings/binding-tcp.md) binding defines the ports Zilla will accept traffic for both MQTT and WebSocket connections. +This will configure Zilla for accepting all of the `mqtt` traffic. The [tcp](../../reference/config/bindings/tcp/README.md) binding defines the ports Zilla will accept traffic for both MQTT and WebSocket connections. ```yaml{12-13,15-16} ``` ::: right -[More on binding-tcp](../../reference/config/bindings/binding-tcp.md) +[More on binding-tcp](../../reference/config/bindings/tcp/README.md) ::: -A [ws](../../reference/config/bindings/binding-tcp.md) binding is added to handle any MQTT over WebSocket using the `mqtt` protocol. The [mqtt](../../reference/config/bindings/binding-mqtt.md) binding then handles all of the MQTT message traffic that needs to go to Kafka. +A [ws](../../reference/config/bindings/tcp/) binding is added to handle any MQTT over WebSocket using the `mqtt` protocol. The [mqtt](../../reference/config/bindings/mqtt/README.md) binding then handles all of the MQTT message traffic that needs to go to Kafka. ```yaml{17,22} ``` ::: right -[More on binding-mqtt](../../reference/config/bindings/binding-mqtt.md) -[More on binding-ws](../../reference/config/bindings/binding-tcp.md) +[More on binding-mqtt](../../reference/config/bindings/mqtt/README.md) +[More on binding-ws](../../reference/config/bindings/tcp/README.md) ::: ### Service definition -The service definition defines how the clients using this service will interact with Kafka through Zilla. The required set of Kafka topics are defined in the [options.topics](../../reference/config/bindings/binding-mqtt-kafka.md#options-topics) where Zilla manages any MQTT required features. A client identity can be determined by pulling the identifier out of the topic using the [options.clients](../../reference/config/bindings/binding-mqtt-kafka.md#options-clients) property. +The service definition defines how the clients using this service will interact with Kafka through Zilla. The required set of Kafka topics are defined in the [options.topics](../../reference/config/bindings/mqtt-kafka/proxy.md#options-topics) where Zilla manages any MQTT required features. A client identity can be determined by pulling the identifier out of the topic using the [options.clients](../../reference/config/bindings/mqtt-kafka/proxy.md#options-clients) property. ```yaml{7-9,21} ``` ::: right -[More on binding-mqtt-kafka](../../reference/config/bindings/binding-mqtt-kafka.md) +[More on binding-mqtt-kafka](../../reference/config/bindings/mqtt-kafka/README.md) [More on topic data](../../concepts/kafka-proxies/mqtt-proxy.md#step-2-pub-sub-message-reflect-with-kafka) ::: @@ -173,19 +173,19 @@ Additionally, a route is defined to capture any "device" messages and route them ::: right [More on When a route matches](../../concepts/bindings.md#when-a-route-matches) -[More on binding-mqtt-kafka routing](../../reference/config/bindings/binding-mqtt-kafka.md#routes) +[More on mqtt-kafka binding routes](../../reference/config/bindings/mqtt-kafka/proxy.md#routes) ::: ### Add a Kafka sync layer -The Zilla [cache_client and cache_server](../../reference/config/bindings/binding-kafka.md#kind) helps manage the smooth data transfer between the service definition and Kafka. It is important to bootstrap the topics that will be brokering MQTT messages. +The Zilla [cache_client](../../reference/config/bindings/kafka/cache_client.md) and [cache_server](../../reference/config/bindings/kafka/cache_server.md) helps manage the smooth data transfer between the service definition and Kafka. It is important to bootstrap the topics that will be brokering MQTT messages. ```yaml{11-13} ``` ::: right -[More on binding-kafka cache](../../reference/config/bindings/binding-kafka.md#cache-behavior) +[More on kafka binding cache](../../reference/config/bindings/kafka/README.md#cache-behavior) ::: ### Point to a Running Kafka instance @@ -205,7 +205,7 @@ This will define the location and connection for Zilla to communicate with Kafka ::: ::: right -[More on binding-kafka client](../../reference/config/bindings/binding-kafka.md#client-behavior) +[More on kafka cache_client binding](../../reference/config/bindings/kafka/cache_client.md) ::: ### Start Zilla diff --git a/src/how-tos/telemetry/opentelemetry-protocol.md b/src/how-tos/telemetry/opentelemetry-protocol.md index cbab989a..08c5a05b 100644 --- a/src/how-tos/telemetry/opentelemetry-protocol.md +++ b/src/how-tos/telemetry/opentelemetry-protocol.md @@ -62,7 +62,7 @@ telemetry: - stream.closes.received - stream.closes.sent - # Prometheus endpoint definition + # Open Telemetry exporter definition exporters: otel_exporter_otlp: type: otlp @@ -150,7 +150,6 @@ bindings: telemetry: metrics: - stream.* - ``` @tab docker-compose.yaml @@ -228,12 +227,12 @@ United States*98109*leWA" LS4PSXUNUM -USD9����* +USD9����* 2ZYFJ3GM2N -USD�����* +USD�����* 66VCHSJNUP @@ -244,7 +243,7 @@ United States*95014* CupertinoCA" L9ECAV7KIM -USD����* +USD����* 66VCHSJNUP diff --git a/src/reference/config/bindings/.partials/cataloged.md b/src/reference/config/bindings/.partials/cataloged.md new file mode 100644 index 00000000..823f2765 --- /dev/null +++ b/src/reference/config/bindings/.partials/cataloged.md @@ -0,0 +1,55 @@ +### catalog + +> `object` as map of named `array` + +To map defined catalog for schema retrieval based on catalog specific parameters. Any of the possible combination can be configured. + +> `id` + +```yaml +catalog: + my_catalog: + - id: unique-catalog-id +``` + +----- +> `strategy` + +```yaml +catalog: + my_catalog: + - strategy: topic +``` + +----- +> `subject` + +```yaml +catalog: + my_catalog: + - subject: http +``` + +#### catalog[].strategy\* + +> `enum` [ `topic` ] + +To determine the subject based on the specified strategy + +#### catalog[].subject\* + +> `string` + +Unique identifier for schema categorization in the catalog. + +#### catalog[].version + +> `string` | Default: `latest` + +Specific iteration or version of a registered schema in the defined catalog. + +#### catalog[].id\* + +> `integer` + +Define specific schema id to refer from catalog. diff --git a/src/reference/config/bindings/.partials/exit.md b/src/reference/config/bindings/.partials/exit.md new file mode 100644 index 00000000..f1c50ef7 --- /dev/null +++ b/src/reference/config/bindings/.partials/exit.md @@ -0,0 +1,9 @@ +### exit + +> `string` + +Default exit binding when no conditional routes are viable. + +```yaml +exit: echo_server +``` diff --git a/src/reference/config/bindings/.partials/options-http-auth.md b/src/reference/config/bindings/.partials/options-http-auth.md new file mode 100644 index 00000000..240a485d --- /dev/null +++ b/src/reference/config/bindings/.partials/options-http-auth.md @@ -0,0 +1,23 @@ +#### authorization.credentials\* + +> `object` + +Defines how to extract credentials from the HTTP request. + +#### credentials.cookies + +> `object` as map of named `string` properties + +Named cookie value pattern with `{credentials}`. + +#### credentials.headers + +> `object` as map of named `string` properties + +Named header value pattern with `{credentials}`, e.g. `"Bearer` `{credentials}"`. + +#### credentials.query\* + +> `object` as map of named `string` properties + +Named query parameter value pattern with `{credentials}`. diff --git a/src/reference/config/bindings/.partials/options-kafka-sasl.md b/src/reference/config/bindings/.partials/options-kafka-sasl.md new file mode 100644 index 00000000..fec71f9d --- /dev/null +++ b/src/reference/config/bindings/.partials/options-kafka-sasl.md @@ -0,0 +1,78 @@ + +#### sasl.mechanism + +> `enum` [ `plain`, `scram-sha-1`, `scram-sha-256`, `scram-sha-512` ] + +Supports `plain` and `scram` mechanisms. + +#### sasl.mechanism: plain + +> `const` + +Configure credentials for the `plain` sasl mechanism. + +##### sasl.username\* + +> `string` + +SASL username. + +##### sasl.password\* + +> `string` + +SASL password. + +#### sasl.mechanism: scram-sha-1 + +> `const` + +Configure credentials for the `scram-sha-1` sasl mechanism. + +##### sasl.username\* + +> `string` + +SASL username. + +##### sasl.password\* + +> `string` + +SASL password. + +#### sasl.mechanism: scram-sha-256 + +> `const` + +Configure credentials for the `scram-sha-256` sasl mechanism. + +##### sasl.username\* + +> `string` + +SASL username. + +##### sasl.password\* + +> `string` + +SASL password. + +#### sasl.mechanism: scram-sha-512 + +> `const` + +Configure credentials for the `scram-sha-512` sasl mechanism. + +##### sasl.username\* + +> `string` + +SASL username. + +##### sasl.password\* + +> `string` + +SASL password. diff --git a/src/reference/config/bindings/.partials/options-kafka-topics-transforms.md b/src/reference/config/bindings/.partials/options-kafka-topics-transforms.md new file mode 100644 index 00000000..1bdaa3f9 --- /dev/null +++ b/src/reference/config/bindings/.partials/options-kafka-topics-transforms.md @@ -0,0 +1,35 @@ +#### topics[].transforms + +> `array` + +Extract key or value attributes from the typed Kafka message to apply to the Kafka message id or Kafka headers. The `extract-key` property must come before the `extract-headers` property if they both exist. + +```yaml +transforms: + - extract-key: ${message.key.id} +``` + +```yaml +transforms: + - extract-headers: + my-kafka-header: ${message.value.test} +``` + +```yaml +transforms: + - extract-key: ${message.value.id} + - extract-headers: + my-kafka-header: ${message.value.test} +``` + +#### transforms[].extract-key + +> `string` | Pattern: `^\\$\\{message\\.(key|value)\\.([A-Za-z_][A-Za-z0-9_]*)\\}$` + +Use a part of the Kafka message as the Kafka message key. + +#### transforms[].extract-headers + +> `object` as map of named `string` properties | Pattern: `^\\$\\{message\\.(key|value)\\.([A-Za-z_][A-Za-z0-9_]*)\\}$` + +Use a part of the Kafka message as a Kafka message header. diff --git a/src/reference/config/bindings/.partials/options-kafka-topics.md b/src/reference/config/bindings/.partials/options-kafka-topics.md new file mode 100644 index 00000000..9f4146e8 --- /dev/null +++ b/src/reference/config/bindings/.partials/options-kafka-topics.md @@ -0,0 +1,29 @@ +#### topics[].name + +> `string` + +Topic name. + +#### topics[].key + +> `enum` [ `avro`, `double`, `float`, `int32`, `int64`, `json`, `protobuf`, `string` ], `object` + +Enforce validation for key + +#### key.model\* + +> `enum` [ `avro`, `double`, `float`, `int32`, `int64`, `json`, `protobuf`, `string` ] + +A schema or type to validate the topic's key. Refer to the individual [model](../../models/) docs for type specific implementation. + +#### topics[].value + +> `enum` [ `avro`, `double`, `float`, `int32`, `int64`, `json`, `protobuf`, `string` ], `object` + +Enforce validation for value + +#### value.model\* + +> `enum` [ `avro`, `double`, `float`, `int32`, `int64`, `json`, `protobuf`, `string` ] + +A schema or type to validate the topic's value. Refer to the individual [model](../../models/) docs for type specific implementation. diff --git a/src/reference/config/bindings/.partials/options-mqtt-auth.md b/src/reference/config/bindings/.partials/options-mqtt-auth.md new file mode 100644 index 00000000..0b12804c --- /dev/null +++ b/src/reference/config/bindings/.partials/options-mqtt-auth.md @@ -0,0 +1,23 @@ +#### authorization.credentials\* + +> `object` + +Defines how to extract credentials from the MQTT connect packet. + +#### credentials.connect\* + +> `object` + +MQTT connect packet properties + +#### connect.username + +> `string` + +Extract credentials from the MQTT connect packet username property with `{credentials}`, e.g. `"Bearer` `{credentials}"`. + +#### connect.password + +> `string` + +Extract credentials from the MQTT connect packet password property with `{credentials}`, e.g. `"Bearer` `{credentials}"`. diff --git a/src/reference/config/bindings/.partials/options-tcp.md b/src/reference/config/bindings/.partials/options-tcp.md new file mode 100644 index 00000000..1cac7bb5 --- /dev/null +++ b/src/reference/config/bindings/.partials/options-tcp.md @@ -0,0 +1,11 @@ +#### tcp.host + +> `string` + +Hostname or IP address. + +#### tcp.port + +> `integer`, `string`, `array` + +Port number(s), including port number ranges. diff --git a/src/reference/config/bindings/.partials/options-tls.md b/src/reference/config/bindings/.partials/options-tls.md new file mode 100644 index 00000000..09c942e2 --- /dev/null +++ b/src/reference/config/bindings/.partials/options-tls.md @@ -0,0 +1,47 @@ +#### tls.version + +> `string` + +Protocol version. + +#### tls.keys + +> `array` of `string` + +A list of reference names for the Vault key. + +#### tls.trust + +> `array` of `string` + +A list of reference names for the Vault certificate. + +#### tls.signers + +> `array` of `string` + +A list of reference names for the Vault signer certificate. + +#### tls.trustcacerts + +> `boolean` + +Trust CA certificates. When the this property is not explicitly set it will be automatically set to `true` if [tls.trust](#tls-trust) is `null`. + +#### tls.sni + +> `array` of `string` + +A list of the Server Name Indications. + +#### tls.alpn + +> `array` of `string` + +Application protocols. + +#### tls.mutual + +> `enum` [ `required`, `requested`, `none` ] + +Mutual authentication. When the this property is not explicitly set it will be automatically set to `none` if [tls.trust](#tls-trust) is `null`, otherwise it will be set to `required`. diff --git a/src/reference/config/bindings/.partials/telemetry-grpc.md b/src/reference/config/bindings/.partials/telemetry-grpc.md new file mode 100644 index 00000000..5e493d9c --- /dev/null +++ b/src/reference/config/bindings/.partials/telemetry-grpc.md @@ -0,0 +1,18 @@ +### telemetry + +> `object` + +Defines the desired telemetry for the binding. + +#### telemetry.metrics + +> `array` + +Telemetry metrics to track + +```yaml +telemetry: + metrics: + - stream.* + - grpc.* +``` diff --git a/src/reference/config/bindings/.partials/telemetry-http.md b/src/reference/config/bindings/.partials/telemetry-http.md new file mode 100644 index 00000000..0b346d16 --- /dev/null +++ b/src/reference/config/bindings/.partials/telemetry-http.md @@ -0,0 +1,18 @@ +### telemetry + +> `object` + +Defines the desired telemetry for the binding. + +#### telemetry.metrics + +> `array` + +Telemetry metrics to track + +```yaml +telemetry: + metrics: + - stream.* + - http.* +``` diff --git a/src/reference/config/bindings/.partials/telemetry.md b/src/reference/config/bindings/.partials/telemetry.md new file mode 100644 index 00000000..1a73677d --- /dev/null +++ b/src/reference/config/bindings/.partials/telemetry.md @@ -0,0 +1,17 @@ +### telemetry + +> `object` + +Defines the desired telemetry for the binding. + +#### telemetry.metrics + +> `array` + +Telemetry metrics to track + +```yaml +telemetry: + metrics: + - stream.* +``` diff --git a/src/reference/config/bindings/.partials/vault.md b/src/reference/config/bindings/.partials/vault.md new file mode 100644 index 00000000..77bd7573 --- /dev/null +++ b/src/reference/config/bindings/.partials/vault.md @@ -0,0 +1,5 @@ +### vault + +> `string` + +Vault name. diff --git a/src/reference/config/bindings/amqp/.partials/routes.md b/src/reference/config/bindings/amqp/.partials/routes.md new file mode 100644 index 00000000..d0322cd9 --- /dev/null +++ b/src/reference/config/bindings/amqp/.partials/routes.md @@ -0,0 +1,65 @@ +### routes + +> `array` of `object` + +Conditional `amqp` specific routes. + +```yaml +routes: + - when: + - address: echo + capabilities: send_and_receive + exit: echo_server +``` + +#### routes[].guarded + +> `object` as map of named `array` of `string` + +List of roles required by each named guard to authorize this route. + +```yaml +routes: + - guarded: + my_guard: + - read:items +``` + +#### routes[].when + +> `array` of `object` + +List of conditions (any match) to match this route. +Read more: [When a route matches](../../../../../concepts/bindings.md#when-a-route-matches) + +```yaml +routes: + - when: + - address: echo + capabilities: send_and_receive +``` + +#### when[].address + +> `string` + +Link address. + +#### when[].capabilities + +> `enum` [ `send_only`, `receive_only`, `send_and_receive` ] | Default: `send_and_receive` + +Send or receive, or both. + +#### routes[].exit + +> `string` + +Next binding when following this route. + +```yaml +routes: + - when: + ... + exit: echo_server +``` diff --git a/src/reference/config/bindings/amqp/.partials/server.yaml b/src/reference/config/bindings/amqp/.partials/server.yaml new file mode 100644 index 00000000..2ec5fab3 --- /dev/null +++ b/src/reference/config/bindings/amqp/.partials/server.yaml @@ -0,0 +1,12 @@ + amqp_server: + type: amqp + kind: server + exit: default_exit + routes: + - guarded: + my_guard: + - read:items + - when: + - address: echo + capabilities: send_and_receive + exit: routed_exit diff --git a/src/reference/config/bindings/amqp/README.md b/src/reference/config/bindings/amqp/README.md new file mode 100644 index 00000000..df32eb9d --- /dev/null +++ b/src/reference/config/bindings/amqp/README.md @@ -0,0 +1,30 @@ +--- +redirectFrom: /reference/config/bindings/binding-amqp.html +dir: + collapsible: false + link: true +shortTitle: amqp +category: + - Binding +tag: + - amqp + - server +--- + +# amqp Binding + +Defines a binding with [AMQP 1.0](https://docs.oasis-open.org/amqp/core/v1.0/os/amqp-core-overview-v1.0-os.html) protocol support, with `server` behavior. Conditional routes based on the link address are used to route these application streams to an `exit` binding. + +::: important Feature is in Incubator +Read how to [enable incubator features](../../../../how-tos/deploy-operate.md#enable-incubator-features). Star and watch the [Zilla repo](https://github.com/aklivity/zilla/releases) for new releases! +::: + +## server + +> [Full config](./server.md) + +The amqp server binding decodes the AMQP protocol on the inbound network stream, producing higher level application streams for each send or receive link. + +```yaml {3} + +``` diff --git a/src/reference/config/bindings/amqp/server.md b/src/reference/config/bindings/amqp/server.md new file mode 100644 index 00000000..d75c0418 --- /dev/null +++ b/src/reference/config/bindings/amqp/server.md @@ -0,0 +1,21 @@ +--- +shortTitle: server +--- + +# amqp server + +The amqp server binding decodes the AMQP protocol on the inbound network stream, producing higher level application streams for each send or receive link. Defines a binding with [AMQP 1.0](https://docs.oasis-open.org/amqp/core/v1.0/os/amqp-core-overview-v1.0-os.html) protocol support, with `server` behavior. Conditional routes based on the link address are used to route these application streams to an `exit` binding. + +```yaml {3} + +``` + +::: important Feature is in Incubator +Read how to [enable incubator features](../../../../how-tos/deploy-operate.md#enable-incubator-features). Star and watch the [Zilla repo](https://github.com/aklivity/zilla/releases) for new releases! +::: + +## Configuration (\* required) + + + + diff --git a/src/reference/config/bindings/asyncapi/.partials/client.yaml b/src/reference/config/bindings/asyncapi/.partials/client.yaml new file mode 100644 index 00000000..4ffb671c --- /dev/null +++ b/src/reference/config/bindings/asyncapi/.partials/client.yaml @@ -0,0 +1,14 @@ + asyncapi_client: + type: asyncapi + kind: client + options: + specs: + my-kafka-api-spec: + catalog: + my_catalog: + subject: petstore + version: latest + tcp: + host: localhost + port: + - 9092 diff --git a/src/reference/config/bindings/asyncapi/.partials/options.md b/src/reference/config/bindings/asyncapi/.partials/options.md new file mode 100644 index 00000000..4fc4a812 --- /dev/null +++ b/src/reference/config/bindings/asyncapi/.partials/options.md @@ -0,0 +1,109 @@ +#### options.specs + +> `object` as map of named `object` properties + +The `specs` specific options. + +#### specs.catalog + +> `object` as map of named `object` properties + +To map defined catalog for schema retrieval based on catalog specific parameters. + +#### catalog.subject\* + +> `string` + +Subject name used when storing the catalog artifact. + +#### catalog.version + +> `string` | Default: `latest` + +Specific iteration or version of a registered schema in the defined catalog. + +#### specs.servers + +> `array` of `object` + +The servers to match from the schema that are used when defining endpoints. + +#### servers[].url + +> `string` | Pattern: `^([a-zA-Z0-9\\\\.-]+)(:(\\\\{[a-zA-Z_]+\\\\}|[0-9]+))?$` + +The server to match based on the server's `url` in an asyncapi `2.x` spec only. + +#### servers[].host + +> `string` | Pattern: `^([a-zA-Z0-9\\\\.-]+)(:(\\\\{[a-zA-Z_]+\\\\}|[0-9]+))?$` + +The server to match based on the server's `host` in an asyncapi `3.x` spec only. + +#### servers[].pathname + +> `string` + +The server pathname to match based on the server's `pathname` in an asyncapi `3.x` spec only. + +#### options.tcp + +> `object` + +TCP options to connect to an external client. + +#### tcp.host + +> `string` + +Hostname or IP address. + +#### tcp.port + +> `integer`, `string`, `array` + +Port number(s), including port number ranges. + +#### options.http + +> `object` + +The http specific options. + +#### http.authorization + +> `object` as map of named `object` properties + +Authorization by guard for the `HTTP/1.1` and `HTTP/2` protocols. + +```yaml +authorization: + jwt: + credentials: + headers: + authorization: Bearer {credentials} +``` + +#### authorization.credentials\* + +> `object` + +Defines how to extract credentials from the HTTP request. + +#### credentials.cookies + +> `object` as map of named `string` properties + +Named cookie value pattern with `{credentials}`. + +#### credentials.headers + +> `object` as map of named `string` properties + +Named header value pattern with `{credentials}`, e.g. `"Bearer` `{credentials}"`. + +#### credentials.query\* + +> `object` as map of named `string` properties + +Named query parameter value pattern with `{credentials}`. diff --git a/src/reference/config/bindings/asyncapi/.partials/proxy.yaml b/src/reference/config/bindings/asyncapi/.partials/proxy.yaml new file mode 100644 index 00000000..0c8ae25b --- /dev/null +++ b/src/reference/config/bindings/asyncapi/.partials/proxy.yaml @@ -0,0 +1,35 @@ + asyncapi_proxy: + type: asyncapi + kind: proxy + options: + specs: + my-mqtt-api-spec: + catalog: + my_catalog: + subject: mqtt-streetlights + version: latest + my-kafka-api-spec: + catalog: + my_catalog: + subject: kafka-streetlights + version: latest + mqtt-kafka: + channels: + sessions: mqttSessions + retained: mqttRetained + messages: mqttMessages + routes: + - when: + - api-id: my-mqtt-api-spec + operation-id: sendEvents + exit: asyncapi_client + with: + api-id: my-kafka-api-spec + operation-id: toSensorData + - when: + - api-id: my-mqtt-api-spec + operation-id: receiveEvents + exit: asyncapi_client + with: + api-id: my-kafka-api-spec + operation-id: onSensorData diff --git a/src/reference/config/bindings/asyncapi/.partials/routes.md b/src/reference/config/bindings/asyncapi/.partials/routes.md new file mode 100644 index 00000000..b4324dbe --- /dev/null +++ b/src/reference/config/bindings/asyncapi/.partials/routes.md @@ -0,0 +1,78 @@ +### routes + +> `array` of `object` + +Conditional `asyncapi` specific routes. + +```yaml + routes: + - when: + - api-id: my-mqtt-api-spec + operation-id: sendEvents + exit: asyncapi_client + with: + api-id: my-kafka-api-spec + operation-id: toSensorData + - when: + - api-id: my-mqtt-api-spec + operation-id: receiveEvents + exit: asyncapi_client + with: + api-id: my-kafka-api-spec + operation-id: onSensorData +``` + +#### routes[].guarded + +> `object` as map of named `array` of `string` + +List of roles required by each named guard to authorize this route. + +```yaml +routes: + - guarded: + my_guard: + - read:items +``` + +#### routes[].when + +> `array` of `object` + +List of conditions to match this route when adapting `asyncapi` MQTT streams to `asyncapi` Kafka streams. +Read more: [When a route matches](../../../../../concepts/bindings.md#when-a-route-matches) + +#### when[].api-id + +> `string` + +AsyncAPI spec identifier that matches from `asyncapi` binding MQTT stream. + +#### when[].operation-id + +> `string` + +AsyncAPI OperationId that can be mapped between AsyncAPI MQTT and AsyncAPI Kafka spec + +#### routes[].with + +> `object` + +Defines the route with the AsyncAPI spec identifier and OperationId. + +```yaml +with: + api-id: my-asyncapi-spec +``` + +#### with.api-id + +> `string` + +AsyncAPI spec identifier that the route exits with to the next binding. + +#### with.operation-id + +> `string` + +AsyncAPI OperationId that the route exits with to the next binding. diff --git a/src/reference/config/bindings/asyncapi/.partials/server.yaml b/src/reference/config/bindings/asyncapi/.partials/server.yaml new file mode 100644 index 00000000..7c6b1fbf --- /dev/null +++ b/src/reference/config/bindings/asyncapi/.partials/server.yaml @@ -0,0 +1,11 @@ + mqtt_asyncapi_server: + type: asyncapi + kind: server + options: + specs: + my-mqtt-api-spec: + catalog: + my_catalog: + subject: mqtt-streetlights + version: latest + exit: south_kafka_proxy diff --git a/src/reference/config/bindings/asyncapi/README.md b/src/reference/config/bindings/asyncapi/README.md new file mode 100644 index 00000000..4720326a --- /dev/null +++ b/src/reference/config/bindings/asyncapi/README.md @@ -0,0 +1,49 @@ +--- +redirectFrom: /reference/config/bindings/binding-asyncapi.html +dir: + collapsible: false + link: true +shortTitle: asyncapi +category: + - Binding +tag: + - asyncapi + - client + - proxy + - server +--- + +# asyncapi Binding + +Defines a binding with `asyncapi` spec, with `server` or `proxy` or `client` behavior. + +## client + +> [Full config](./client.md) + +The `client` kind `asyncapi` binding creates composite of `kafka` or `mqtt` or `http`, and `tls`, `tcp` bindings with client kind and adapts +AsyncAPI streams to Kafka/MQTT/HTTP streams. + +```yaml {3} + +``` + +## proxy + +> [Full config](./proxy.md) + +The `proxy` kind `asyncapi` binding creates composite of `mqtt-kafka` binding with proxy kind mapping MQTT streams to Kafka streams. + +```yaml {3} + +``` + +## server + +> [Full config](./server.md) + +The `server` kind `asyncapi` binding creates composite of `tcp`, `tls`, and `mqtt` or `http` bindings with server kind and adapts MQTT/HTTP streams to AsyncAPI streams. + +```yaml {3} + +``` diff --git a/src/reference/config/bindings/asyncapi/client.md b/src/reference/config/bindings/asyncapi/client.md new file mode 100644 index 00000000..30b6b254 --- /dev/null +++ b/src/reference/config/bindings/asyncapi/client.md @@ -0,0 +1,169 @@ +--- +shortTitle: client +--- + +# asyncapi client + +The asyncapi client binding creates composite of `kafka` or `mqtt` or `http`, and `tls`, `tcp` bindings with client kind and adapts AsyncAPI streams to Kafka/MQTT/HTTP streams. + +```yaml {3} + +``` + +## Configuration (\* required) + + + +### options + +> `object` + +The `client` specific options. + +```yaml +specs: + http_api: + servers: + - name: plain + catalog: + my_catalog: + subject: petstore + version: latest +``` + + + +### options.kafka + +> `object` + +The `kafka` binding specific options. + +#### kafka.topics + +> `array` of `object` + +Topic configuration. + + + +#### topics[].defaultOffset + +> `enum` [ `live`, `historical` ] + +Fetch offset to use for new consumers + + + +#### kafka.sasl + +> `object` + +SASL credentials to use when connecting to `kafka` brokers. + + + +### options.mqtt-kafka + +> `object` + +The `mqtt-kafka` binding specific options. + +#### mqtt-kafka.channels + +> `object` + +AsyncAPI Kafka channels describing the necessary topics for the MQTT-Kafka mapping. + +```yaml +mqtt-kafka: + channels: + sessions: mqttSessions + retained: mqttRetained + messages: mqttMessages +``` + +#### channels.sessions + +> `string` + +AsyncAPI Kafka sessions channel. + +```yaml +sessions: mqttSessions +``` + +#### channels.retained + +> `string` + +AsyncAPI Kafka retained channel. + +```yaml +retained: mqttRetained +``` + +#### channels.messages + +> `string` + +AsyncAPI Kafka messages channel. + +```yaml +messages: mqttMessages +``` + +### options.http + +> `object` + +The HTTP specific options. + +#### http.authorization + +> `object` as map of named `object` properties + +Authorization by guard for the `HTTP/1.1` and `HTTP/2` protocols. + +```yaml +authorization: + my_jwt_guard: + credentials: + headers: + authorization: Bearer {credentials} +``` + + + +### options.mqtt + +> `object` + +The MQTT specific options. + +#### mqtt.authorization + +> `object` as map of named `object` properties + +Authorization by guard for the `HTTP/1.1` and `HTTP/2` protocols. + +```yaml +authorization: + my_jwt_guard: + credentials: + headers: + authorization: Bearer {credentials} +``` + + + +#### options.tls + +> `object` + +The TLS specific options. + + + + + diff --git a/src/reference/config/bindings/asyncapi/proxy.md b/src/reference/config/bindings/asyncapi/proxy.md new file mode 100644 index 00000000..c539f77e --- /dev/null +++ b/src/reference/config/bindings/asyncapi/proxy.md @@ -0,0 +1,182 @@ +--- +shortTitle: proxy +--- + +# asyncapi proxy + +The asyncapi proxy binding creates composite of `mqtt-kafka` binding with proxy kind mapping MQTT streams to Kafka streams. + +```yaml + +``` + +## Configuration (\* required) + + + +### options + +> `object` + +The `proxy` specific options. + +```yaml +specs: + http_api: + servers: + - name: plain + catalog: + my_catalog: + subject: petstore + version: latest +``` + + + +### options.kafka + +> `object` + +The `kafka` binding specific options. + +#### kafka.topics + +> `array` of `object` + +Topic configuration. + + + +#### topics[].defaultOffset + +> `enum` [ `live`, `historical` ] + +Fetch offset to use for new consumers + + + +#### kafka.sasl + +> `object` + +SASL credentials to use when connecting to `kafka` brokers. + + + +### options.mqtt-kafka + +> `object` + +The `mqtt-kafka` binding specific options. + +#### mqtt-kafka.channels + +> `object` + +AsyncAPI Kafka channels describing the necessary topics for the MQTT-Kafka mapping. + +```yaml +mqtt-kafka: + channels: + sessions: mqttSessions + retained: mqttRetained + messages: mqttMessages +``` + +#### channels.sessions + +> `string` + +AsyncAPI Kafka sessions channel. + +```yaml +sessions: mqttSessions +``` + +#### channels.retained + +> `string` + +AsyncAPI Kafka retained channel. + +```yaml +retained: mqttRetained +``` + +#### channels.messages + +> `string` + +AsyncAPI Kafka messages channel. + +```yaml +messages: mqttMessages +``` + +### options.http + +> `object` + +The HTTP specific options. + +#### http.authorization + +> `object` as map of named `object` properties + +Authorization by guard for the `HTTP/1.1` and `HTTP/2` protocols. + +```yaml +authorization: + my_jwt_guard: + credentials: + headers: + authorization: Bearer {credentials} +``` + + + +### options.mqtt + +> `object` + +The MQTT specific options. + +#### mqtt.authorization + +> `object` as map of named `object` properties + +Authorization by guard for the `HTTP/1.1` and `HTTP/2` protocols. + +```yaml +authorization: + my_jwt_guard: + credentials: + headers: + authorization: Bearer {credentials} +``` + + + +#### options.tls + +> `object` + +The TLS specific options. + + + + +#### routes[].exit + +> `string` + +Next binding when following this route. + +```yaml +routes: + - when: + ... + exit: asyncapi_client +``` + + diff --git a/src/reference/config/bindings/asyncapi/server.md b/src/reference/config/bindings/asyncapi/server.md new file mode 100644 index 00000000..e9a6a16d --- /dev/null +++ b/src/reference/config/bindings/asyncapi/server.md @@ -0,0 +1,182 @@ +--- +shortTitle: server +--- + +# asyncapi server + +The asyncapi server binding creates composite of `tcp`, `tls`, and `mqtt` or `http` bindings with server kind and adapts MQTT/HTTP streams to AsyncAPI streams. + +```yaml + +``` + +## Configuration (\* required) + + + +### options + +> `object` + +The `server` specific options. + +```yaml +specs: + http_api: + servers: + - name: plain + catalog: + my_catalog: + subject: petstore + version: latest +``` + + + +### options.kafka + +> `object` + +The `kafka` binding specific options. + +#### kafka.topics + +> `array` of `object` + +Topic configuration. + + + +#### topics[].defaultOffset + +> `enum` [ `live`, `historical` ] + +Fetch offset to use for new consumers + + + +#### kafka.sasl + +> `object` + +SASL credentials to use when connecting to `kafka` brokers. + + + +### options.mqtt-kafka + +> `object` + +The `mqtt-kafka` binding specific options. + +#### mqtt-kafka.channels + +> `object` + +AsyncAPI Kafka channels describing the necessary topics for the MQTT-Kafka mapping. + +```yaml +mqtt-kafka: + channels: + sessions: mqttSessions + retained: mqttRetained + messages: mqttMessages +``` + +#### channels.sessions + +> `string` + +AsyncAPI Kafka sessions channel. + +```yaml +sessions: mqttSessions +``` + +#### channels.retained + +> `string` + +AsyncAPI Kafka retained channel. + +```yaml +retained: mqttRetained +``` + +#### channels.messages + +> `string` + +AsyncAPI Kafka messages channel. + +```yaml +messages: mqttMessages +``` + +### options.http + +> `object` + +The http specific options. + +#### http.authorization + +> `object` as map of named `object` properties + +Authorization by guard for the `HTTP/1.1` and `HTTP/2` protocols. + +```yaml +authorization: + my_jwt_guard: + credentials: + headers: + authorization: Bearer {credentials} +``` + + + +### options.mqtt + +> `object` + +The MQTT specific options. + +#### mqtt.authorization + +> `object` as map of named `object` properties + +Authorization by guard for the `HTTP/1.1` and `HTTP/2` protocols. + +```yaml +authorization: + my_jwt_guard: + credentials: + headers: + authorization: Bearer {credentials} +``` + + + +#### options.tls + +> `object` + +The `tls` specific options. + + + + + +#### routes[].exit + +> `string` + +Next binding when following this route. + +```yaml +routes: + - when: + ... + exit: asyncapi_client +``` + diff --git a/src/reference/config/bindings/binding-amqp.md b/src/reference/config/bindings/binding-amqp.md deleted file mode 100644 index 00f27ec8..00000000 --- a/src/reference/config/bindings/binding-amqp.md +++ /dev/null @@ -1,145 +0,0 @@ ---- -shortTitle: amqp -description: Zilla runtime amqp binding -category: - - Binding -tag: - - Server ---- - -# amqp Binding - -::: important Feature is in Incubator -Read how to [enable incubator features](../../../how-tos/deploy-operate.md#enable-incubator-features). Star and watch the [Zilla repo](https://github.com/aklivity/zilla/releases) for new releases! -::: - -Zilla runtime amqp binding. - -```yaml {2} -amqp_server: - type: amqp - kind: server - routes: - - when: - - address: echo - capabilities: send_and_receive - exit: echo_server -``` - -## Summary - -Defines a binding with `amqp 1.0` protocol support, with `server` behavior. - -The `server` kind `amqp` binding decodes `amqp 1.0` protocol on the inbound network stream, producing higher level application streams for each `send` or `receive` `link`. - -Conditional routes based on the `link` `address` are used to route these application streams to an `exit` binding. - -## Configuration - -:::: note Properties - -- [kind\*](#kind) -- [routes](#routes) -- [routes\[\].guarded](#routes-guarded) -- [routes\[\].when](#routes-when) - - [when\[\].address](#when-address) - - [when\[\].capabilities](#when-capabilities) -- [routes\[\].exit\*](#routes-exit) - -::: right -\* required -::: - -:::: - -### kind\* - -> `enum` [ "server" ] - -Behave as an `amqp 1.0` `proxy`. - -```yaml -kind: proxy -``` - -### exit - -> `string` - -Default exit binding when no conditional routes are viable. - -```yaml -exit: echo_server -``` - -### routes - -> `array` of `object` - -Conditional `amqp`-specific routes for adapting `http` request-response streams to `kafka` topic streams. - -```yaml -routes: - - when: - - address: echo - capabilities: send_and_receive - exit: echo_server -``` - -### routes[].guarded - -> `object` as named map of `string:string` `array` - -List of roles required by each named guard to authorize this route. - -```yaml -routes: - - guarded: - my_guard: - - read:items -``` - -### routes[].when - -> `array` of `object` - -List of conditions (any match) to match this route. -Read more: [When a route matches](../../../concepts/bindings.md#when-a-route-matches) - -```yaml -routes: - - when: - - address: echo - capabilities: send_and_receive -``` - -#### when[].address - -> `string` - -Link address. - -#### when[].capabilities - -> `enum` [ "send_only", "receive_only", "send_and_receive" ] | Default: `"send_and_receive"` - -Send or receive, or both. - -### routes[].exit\* - -> `string` - -Next binding when following this route. - -```yaml -routes: - - when: - ... - exit: echo_server -``` - ---- - -::: right -\* required -::: diff --git a/src/reference/config/bindings/binding-asyncapi.md b/src/reference/config/bindings/binding-asyncapi.md deleted file mode 100644 index 9ba34647..00000000 --- a/src/reference/config/bindings/binding-asyncapi.md +++ /dev/null @@ -1,449 +0,0 @@ ---- -shortTitle: asyncapi -description: Zilla runtime asyncapi binding -category: - - Binding -tag: - - Server - - Proxy - - Client ---- - -# asyncapi Binding - -Zilla runtime `asyncapi` binding. - -```yaml {2} -name: zilla-mqtt-kafka-broker -bindings: - asyncapi_server: - type: asyncapi - kind: server - options: - specs: - my-mqtt-api-spec: mqtt/asyncapi.yaml - exit: asyncapi_proxy - asyncapi_proxy: - type: asyncapi - kind: proxy - options: - specs: - my-mqtt-api-spec: - my-kafka-api-spec: - catalog: - my_catalog: - subject: petstore - version: latest - my-kafka-api-spec: - my-kafka-api-spec: - catalog: - my_catalog: - subject: petstore - version: latest - mqtt-kafka: - channels: - sessions: mqttSessions - retained: mqttRetained - messages: mqttMessages - routes: - - when: - - api-id: my-mqtt-api-spec - operation-id: sendEvents - exit: asyncapi_client - with: - api-id: my-kafka-api-spec - operation-id: toSensorData - - when: - - api-id: my-mqtt-api-spec - operation-id: receiveEvents - exit: asyncapi_client - with: - api-id: my-kafka-api-spec - operation-id: onSensorData - asyncapi_client: - type: asyncapi - kind: client - options: - specs: - my-kafka-api-spec: - catalog: - my_catalog: - subject: petstore - version: latest - tcp: - host: localhost - port: - - 9092 -``` - -## Summary - -Defines a binding with `asyncapi` spec, with `server` or `proxy` or `client` behavior. - -The `server` kind `asyncapi` binding creates composite of `tcp`, `tls`, and `mqtt` or `http` bindings with server kind and adapts MQTT/HTTP streams to AsyncAPI streams. - -The `proxy` kind `asyncapi` binding creates composite of `mqtt-kafka` binding with proxy kind mapping MQTT streams to Kafka streams. - -The `client` kind `asyncapi` binding creates composite of `kafka` or `mqtt` or `http`, and `tls`, `tcp` bindings with client kind and adapts AsyncAPI streams to Kafka/MQTT/HTTP streams. - -## Configuration - -:::: note Properties - -- [kind\*](#kind) -- [options](#options) - - [options.specs](#options-specs) - - [specs.catalog](#specs-catalog) - - [catalog.subject](#catalog-subject) - - [catalog.version](#catalog-version) - - [specs.servers](#specs-servers) - - [servers.url](#servers-url) - - [servers.host](#servers-host) - - [servers.pathname](#servers-pathname) - - [options.tcp](#options-tcp) - - [tpc.host](#tpc-host) - - [tcp.port](#tcp-port) - - [options.http](#options-http) - - [http.authorization](#http-authorization) - - [authorization.credentials](#authorization-credentials) - - [credentials.cookies](#credentials-cookies) - - [credentials.headers](#credentials-headers) - - [credentials.query](#credentials-query) - - [options.tls](#options-tls) - - [tls.version](#tls-version) - - [tls.keys](#tls-keys) - - [tls.trust](#tls-trust) - - [tls.signers](#tls-signers) - - [tls.trustcacerts](#tls-trustcacerts) - - [tls.sni\*](#tls-sni) - - [tls.alpn](#tls-alpn) - - [tls.mutual](#tls-mutual) -- [mqtt-kafka](#mqtt-kafka) - - [mqtt-kafka.channels](#mqtt-kafka-channels) - - [channels.sessions](#channels-sessions) - - [channels.retained](#channels-retained) - - [channels.messages](#channels-messages) -- [routes\[\].when](#routes-when) - - [when\[\].api-id](#when-api-id) - - [when\[\].operation-id](#when-operation-id) -- [routes\[\].exit\*](#routes-exit) -- [routes\[\].with](#routes-with) - - [with.api-id](#with-api-id) - - [with.operation-id](#with-operation-id) -- [exit](#exit) - -::: right -\* required -::: - -:::: - -### kind\* - -> `enum` [ "client", "proxy", "server" ] - -Behave as a `asyncapi` `client` or `proxy` or `server`. - -```yaml -kind: server -``` - -### options - -> `object` - -`asyncapi`-specific options. - -```yaml -specs: - http_api: - servers: - - name: plain - catalog: - my_catalog: - subject: petstore - version: latest -``` - -#### options.specs - -> `object` as map of named properties - -specs specific options - -##### specs.catalog - -> `object` as map of named properties - -catalog specific options. - -###### catalog.subject - -> `string` - -Subject name used when storing the catalog artifact. - -###### catalog.version - -> `string` - -Catalog artifact version to use. - -##### specs.servers - -> `object` - -###### servers.url - -> `string` - -The server to match based on the server's `url` in an asyncapi `2.x` spec only. - -###### servers.host - -> `string` - -The server to match based on the server's `host` in an asyncapi `3.x` spec only. - -###### servers.pathname - -> `string` - -The server pathname to match based on the server's `pathname` in an asyncapi `3.x` spec only. - -#### options.tcp - -> `object` - -`client` specific `tcp` options. - -##### tpc.host - -> `string` - -Hostname or IP address. - -##### tcp.port - -> `integer` | `string` | `array` of `integer` | `array` of `string` - -Port number(s), including port number ranges. - -#### options.http - -> `object` - -http specific options. - -##### http.authorization - -> `object` as map of named properties - -Authorization by guard for the `HTTP/1.1` and `HTTP/2` protocols. - -```yaml -authorization: - jwt: - credentials: - headers: - authorization: Bearer {credentials} -``` - -##### authorization.credentials - -> `object` - -Defines how to extract credentials from the HTTP request. - -##### credentials.cookies - -> `map` of `name: value` properties - -Named cookie value pattern with `{credentials}`. - -##### credentials.headers - -> `map` of `name: value` properties - -Named header value pattern with `{credentials}`, e.g. `"Bearer` `{credentials}"`. - -##### credentials.query - -> `map` of `name: value` properties - -Named query parameter value pattern with `{credentials}`. - -#### options.tls - -> `object` - -`tls` specific options. - -##### tls.version - -> `string` - -Protocol version. - -##### tls.keys - -> `array` of `string` - -A list of reference names for the Vault key. - -##### tls.trust - -> `array` of `string` - -A list of reference names for the Vault certificate. - -##### tls.signers - -> `array` of `string` - -A list of reference names for the Vault signer certificate. - -##### tls.trustcacerts - -> `boolean` | Default: `true` when trust is `null` - -Trust CA certificates. - -##### tls.sni\* - -> `array` of `string` - -A list of the Server Name Indications. - -##### tls.alpn - -> `array` of `string` - -Application protocols. - -##### tls.mutual - -> `enum` [ "required", "requested", "none" ] | Default: `"none"` - -Mutual authentication. - -### mqtt-kafka - -> `object` - -`mqtt-kafka` binding specific options. - -#### mqtt-kafka.channels - -> `object` - -AsyncAPI Kafka channels describing the necessary topics for the MQTT-Kafka mapping. - -```yaml -mqtt-kafka: - channels: - sessions: mqttSessions - retained: mqttRetained - messages: mqttMessages -``` - -##### channels.sessions - -> `string` - -AsyncAPI Kafka sessions channel. - -```yaml -sessions: mqttSessions -``` - -##### channels.retained - -> `string` - -AsyncAPI Kafka retained channel. - -```yaml -retained: mqttRetained -``` - -##### channels.messages - -> `string` - -AsyncAPI Kafka messages channel. - -```yaml -messages: mqttMessages -``` - -### routes[].when - -> `array` of `object` - -List of conditions to match this route when adapting `asyncapi` MQTT streams to `asyncapi` Kafka streams. -Read more: [When a route matches](../../../concepts/bindings.md#when-a-route-matches) - -#### when[].api-id - -> `string` - -AsyncAPI spec identifier that matches from `asyncapi` binding MQTT stream. - -#### when[].operation-id - -> `string` - -AsyncAPI OperationId that can be mapped between AsyncAPI MQTT and AsyncAPI Kafka spec - -### routes[].exit\* - -> `string` - -Default exit binding when no conditional routes are viable. - -```yaml -routes: - - when: - ... - exit: asyncapi_client -``` - -### routes[].with - -> `object` - -Defines the route with the AsyncAPI spec identifier and OperationId. - -```yaml -with: - api-id: my-asyncapi-spec -``` - -#### with.api-id - -> `string` - -AsyncAPI spec identifier that the route exits with to the next binding - -#### with.operation-id - -> `string` - -AsyncAPI OperationId that the route exits with to the next binding - -### exit - -> `string` - -Default exit binding. - -```yaml -exit: echo_server -``` - ---- - -::: right -\* required -::: diff --git a/src/reference/config/bindings/binding-echo.md b/src/reference/config/bindings/binding-echo.md deleted file mode 100644 index 3c988795..00000000 --- a/src/reference/config/bindings/binding-echo.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -shortTitle: echo -description: Zilla runtime echo binding -category: - - Binding -tag: - - Server ---- - -# echo Binding - -Zilla runtime echo binding. - -```yaml {2} -echo_server: - type: echo - kind: server -``` - -## Summary - -This binding supports the `echo` protocol and is run with the `server` behavior. It reads inbound messages and writes it back to the sender. - -## Configuration - -:::: note Properties - -- [kind\*](#kind) - -::: right -\* required -::: - -:::: - -### kind\* - -> `enum` [ "server" ] - -Behaves as an `echo` `server`. - -```yaml -kind: server -``` - ---- - -::: right -\* required -::: diff --git a/src/reference/config/bindings/binding-fan.md b/src/reference/config/bindings/binding-fan.md deleted file mode 100644 index c7805906..00000000 --- a/src/reference/config/bindings/binding-fan.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -shortTitle: fan -description: Zilla runtime fan binding -category: - - Binding -tag: - - Server ---- - -# fan Binding - -Zilla runtime fan binding. - -```yaml {2} -fan_server: - type: fan - kind: server - exit: echo_server -``` - -## Summary - -Defines a binding with `fan-in` and `fan-out` support, with `server` behavior. - -The `server` kind `fan` binding performs fan-in of data on all inbound network streams, grouping them into a single application stream. Then data received from the application stream is fanned-out to all network streams in the group. - -When the `exit` is an `echo` server binding, the combination reflects all inbound data from each client to all clients. - -## Configuration - -:::: note Properties - -- [kind\*](#kind) -- [exit\*](#exit) - -::: right -\* required -::: - -:::: - -### kind\* - -> `enum` [ "server" ] - -Behave as an `fan-in` and `fan-out` `server`. - -### exit\* - -> `string` - -Default exit binding. - -```yaml -exit: echo_server -``` - ---- - -::: right -\* required -::: diff --git a/src/reference/config/bindings/binding-filesystem.md b/src/reference/config/bindings/binding-filesystem.md deleted file mode 100644 index 930cfbc3..00000000 --- a/src/reference/config/bindings/binding-filesystem.md +++ /dev/null @@ -1,82 +0,0 @@ ---- -shortTitle: filesystem -description: Zilla runtime filesystem binding -category: - - Binding -tag: - - Server ---- - -# filesystem Binding - -Zilla runtime filesystem binding. - -```yaml {2} -filesystem_server: - type: filesystem - kind: server - options: - location: web/ - simlinks: follow -``` - -## Summary - -The `server` kind `filesystem` binding provides access to files and directories on the local filesystem, optionally following symbolic links. - -Behaves as a web server when combined with `tcp,` `tls`, `http` and `http-filesystem` bindings. - -## Configuration - -:::: note Properties - -- [kind\*](#kind) -- [options](#options) - - [options.location](#options-location) - - [options.symlinks](#options-symlinks) - -::: right -\* required -::: - -:::: - -### kind\* - -> `enum` [ "server" ] - -Behave as a `filesystem` `server`. - -```yaml -kind: server -``` - -### options - -> `object` - -`filesystem`-specific options for `filesystem` access. - -```yaml -options: - location: web/ - simlinks: follow -``` - -#### options.location - -> `string` - -File system URI or directory name with trailing slash. - -#### options.symlinks - -> `enum` [ "follow", "ignore" ] | Default: `"ignore"` - -How to treat symbolic links. - ---- - -::: right -\* required -::: diff --git a/src/reference/config/bindings/binding-grpc-kafka.md b/src/reference/config/bindings/binding-grpc-kafka.md deleted file mode 100644 index 1729e988..00000000 --- a/src/reference/config/bindings/binding-grpc-kafka.md +++ /dev/null @@ -1,439 +0,0 @@ ---- -shortTitle: grpc-kafka -description: Zilla runtime grpc-kafka binding -category: - - Binding -tag: - - Proxy ---- - -# grpc-kafka Binding - - - -Zilla runtime grpc-kafka binding. - -```yaml {2} -grpc_kafka_proxy: - type: grpc-kafka - kind: proxy - options: - idempotency: - metadata: idempotency-key - reliability: - field: 32767 - metadata: last-message-id - correlation: - headers: - service: zilla:service - method: zilla:method - correlation-id: zilla:correlation-id - reply-to: zilla:reply-to - routes: - - when: - - method: example.FanoutService/* - metadata: - custom-text: custom value - custom-binary: - base64: Y3VzdG9tIHZhbHVl - exit: kafka_cache_client - with: - capability: fetch - topic: messages - filters: - key: custom-key - headers: - custom-text: custom-value - - when: - - method: example.EchoService/* - metadata: - custom-text: custom value - custom-binary: - base64: Y3VzdG9tIHZhbHVl - exit: kafka_cache_client - with: - capability: produce - topic: requests - acks: leader_only - key: custom-key - overrides: - custom-text: custom-value - reply-to: responses -``` - -## Summary - -The `proxy` kind `grpc-kafka` binding adapts `grpc` request-response streams to `kafka` topic streams. - -## Fetch capability - -Routes with `fetch` capability map `grpc` `Empty` requests to a `kafka` topic, supporting filtered retrieval of messages with a specific key or headers, or unfiltered retrieval of all messages in the topic merged into a unified response. - -Filtering can be performed by `kafka` message key, message headers, or a combination of both message key and headers. - -Reliable message delivery is achieved by capturing the value of the `reliability` `field` injected into each response stream message at the `grpc` client, and replaying the value via the `reliability` `metadata` header when reestablishing the stream with a new `grpc` request. - -## Produce capability - -Routes with `produce` capability map any `grpc` request-response to a correlated stream of `kafka` messages. The `grpc` request message(s) are sent to a `requests` topic, with a `zilla:correlation-id` header. When the request message(s) are received and processed by the `kafka` `requests` topic consumer, it produces response message(s) to the `responses` topic, with the same `zilla:correlation-id` header to correlate the response. - -Requests including an `idempotency-key` `grpc` metadata header can be replayed and safely receive the same response. This requires the `kafka` consumer to detect and ignore the duplicate request with the same `idempotency-key` and `zilla:correlation-id`. - -## Configuration - -:::: note Properties - -- [kind\*](#kind) -- [options](#options) - - [options.idempotency](#options-idempotency) - - [idempotency.metadata](#idempotency-metadata) - - [options.reliability](#options-reliability) - - [reliability.field](#reliability-field) - - [reliability.metadata](#reliability-metadata) - - [options.correlation](#options-correlation) - - [correlation.headers](#correlation-headers) - - [headers.service](#headers-service) - - [headers.method](#headers-method) - - [headers.correlation-id](#headers-correlation-id) - - [headers.reply-to](#headers-reply-to) -- [routes](#routes) -- [routes\[\].guarded](#routes-guarded) -- [routes\[\].when](#routes-when) - - [when\[\].method](#when-method) - - [when\[\].metadata](#when-metadata) - - [metadata.base64](#metadata-base64) -- [routes\[\].exit\*](#routes-exit) -- [routes\[\].with\*](#routes-with) -- [with.capability: fetch](#with-capability-fetch) - - [with.topic](#with-topic) - - [with.filters](#with-filters) - - [filters\[\].key](#filters-key) - - [filters\[\].headers](#filters-headers) -- [with.capability: produce](#with-capability-produce) - - [with.topic](#with-topic-1) - - [with.acks](#with-acks) - - [with.key](#with-key) - - [with.overrides](#with-overrides) - - [with.reply-to](#with-reply-to) - -::: right -\* required -::: - -:::: - -### kind\* - -> `enum` [ "proxy" ] - -Behave as an `grpc-kafka` `proxy`. - -```yaml -kind: proxy -``` - -### options - -> `object` - -`grpc-kafka`-specific options for adapting `grpc` request-response streams to `kafka` topic streams. - -```yaml -options: - idempotency: - metadata: idempotency-key - reliability: - field: 32767 - metadata: last-message-id - correlation: - headers: - service: zilla:service - method: zilla:method - correlation-id: zilla:correlation-id - reply-to: zilla:reply-to -``` - -#### options.idempotency - -> `object` - -Metadata header used to specify the idempotency key when adapting `grpc` request-response streams to `kafka` topic streams. - -##### idempotency.metadata - -> `string` | Default: `"idempotency-key"` - -The `grpc` metadata header name for idempotency key. - -#### options.reliability - -> `object` - -Properties used when handling stream recovery. - -##### reliability.field - -> `integer` | Default: `32767` - -The `grpc` unknown field number to send the `message-id`. - -##### reliability.metadata - -> `string` | Default: `"last-message-id"` - -The `grpc` metadata header name for the last `message-id` seen when resuming a stream. - -#### options.correlation - -> `object` - -Kafka request message headers injected when adapting `grpc` request-response streams to `kafka` topic streams. - -##### correlation.headers - -> `map` of `name: value` properties - -Kafka request message reply to and correlation id header names injected when adapting `grpc` request-response streams to `kafka` topic streams. - -##### headers.service - -> `string` | Default: `"zilla:service"` - -Kafka header name for `grpc` service. - -##### headers.method - -> `string` | Default: `"zilla:method"` - -Kafka header name for `grpc` method. - -##### headers.correlation-id - -> `string` | Default: `"zilla:correlation-id"` - -Kafka header name for request-response correlation identifier. - -##### headers.reply-to - -> `string` | Default: `"zilla:reply-to"` - -Kafka header name for reply-to topic. - -### routes - -> `array` of `object` - -Conditional `grpc-kafka`-specific routes for adapting `grpc` request-response streams to `kafka` topic streams. - -```yaml -routes: - - guarded: - my_guard: - - read:messages - when: - - service: example.FanoutService - metadata: - custom-text: custom value - custom-binary: - base64: Y3VzdG9tIHZhbHVl - exit: kafka_cache_client - with: - capability: fetch - topic: messages - filters: - key: custom-key - headers: - custom-text: custom-value - - guarded: - my_guard: - - echo:messages - when: - - method: example.EchoService/* - metadata: - custom-text: custom value - custom-binary: - base64: Y3VzdG9tIHZhbHVl - exit: kafka_cache_client - with: - capability: produce - topic: requests - acks: leader_only - key: custom-key - overrides: - custom-text: custom-value - reply-to: responses -``` - -### routes[].guarded - -> `object` as named map of `string:string` `array` - -Roles required by named guard. - -```yaml -routes: - - guarded: - my_guard: - - read:messages -``` - -### routes[].when - -> `array` of `object` - -List of conditions (any match) to match this route when adapting `grpc` request-response streams to `kafka` topic streams. -Read more: [When a route matches](../../../concepts/bindings.md#when-a-route-matches) - -```yaml -routes: - - when: - - method: example.EchoService/* - metadata: - custom-text: custom value - custom-binary: - base64: Y3VzdG9tIHZhbHVl -``` - -#### when[].method - -> `string` - -Pattern matching the fully qualified name of a `grpc` service method, in the format `/` allowing wildcard `*` for the method to indicate any method. - -#### when[].metadata - -> `map` of `name: value` properties - -Metadata header name value pairs (all match). - -Each metadata header value can be `string` or `object` with `base64` property. - -##### metadata.base64 - -> `string` - -Base64 encoded value for binary metadata header. - -### routes[].exit\* - -> `string` - -Next binding when following this route. - -```yaml -routes: - - when: - ... - exit: kafka_cache_client -``` - -### routes[].with\* - -> **oneOf**: [fetch](#with-capability-fetch) | [produce](#with-capability-produce) - -Defines the route with the `fetch` capability. - -```yaml -with: - capability: fetch -``` - -Defines the route with the `produce` capability. - -```yaml -with: - capability: produce -``` - -### with.capability: fetch - -> `object` - -Kafka parameters for matched route when adapting `grpc` request-response streams to `kafka` topic fetch streams. - -```yaml -with: - capability: fetch - topic: messages - filters: - key: custom-key - headers: - custom-text: custom-value -``` - -#### with.topic - -> `string` - -The name of a Kafka topic. - -#### with.filters - -> `array` of `object` - -List of criteria (any match) to this filter. Kafka filters for matched route when adapting `grpc` request-response streams to `kafka` topic fetch streams. All specified headers and key must match for the combined criteria to match. - -##### filters[].key - -> `string` - -The filter criteria for the Kafka message key. - -##### filters[].headers - -> `map` of `name: value` properties - -The filter criteria for the Kafka message headers. - -### with.capability: produce - -> `object` - -Kafka parameters for matched route when adapting `grpc` request-response streams to `kafka` topic produce streams. - -```yaml -with: - capability: produce - topic: requests - acks: leader_only - key: custom-key - overrides: - custom-text: custom-value - reply-to: responses -``` - -#### with.topic - -> `string` - -The name of a Kafka topic for requests. - -#### with.acks - -> `enum` [ "none", "leader_only", "in_sync_replicas" ] | Default: `"in_sync_replicas"` - -Kafka acknowledgment mode - -#### with.key - -> `string` - -The Kafka message key to include with each message. - -#### with.overrides - -> `map` of `name: value` properties - -The Kafka message headers to inject with each message. - -#### with.reply-to - -> `string` - -The name of the Kafka topic for correlated responses. - ---- - -::: right -\* required -::: diff --git a/src/reference/config/bindings/binding-grpc.md b/src/reference/config/bindings/binding-grpc.md deleted file mode 100644 index efc54292..00000000 --- a/src/reference/config/bindings/binding-grpc.md +++ /dev/null @@ -1,191 +0,0 @@ ---- -shortTitle: grpc -description: Zilla runtime grpc binding -category: - - Binding -tag: - - Server - - Client ---- - -# grpc Binding - -Zilla runtime grpc binding. - -```yaml {2} -grpc_server: - type: grpc - kind: server - options: - services: - - proto/echo.proto - routes: - - when: - - method: example.EchoService/* - metadata: - custom-text: custom value - custom-binary: - base64: Y3VzdG9tIHZhbHVl - exit: echo_server -``` - -## Summary - -Defines a binding with `grpc` protocol support, with `server` or `client` behavior. - -The `server` kind `grpc` binding adapts `http` request-response streams to `grpc` request-response streams, with support for both `application/grpc+proto` and `application/grpc-web+proto` content types. - -The `client` kind `grpc` binding adapts `grpc` request-response streams to `http` request-response streams. - -## Configuration - -:::: note Properties - -- [kind\*](#kind) -- [options](#options) - - [options.services](#options-services) -- [exit](#exit) -- [routes](#routes) -- [routes\[\].guarded](#routes-guarded) -- [routes\[\].when](#routes-when) - - [when\[\].method](#when-method) - - [when\[\].metadata](#when-metadata) - - [metadata.base64](#metadata-base64) -- [routes\[\].exit\*](#routes-exit) - -::: right -\* required -::: - -:::: - -### kind\* - -> `enum` [ "client", "server" ] - -Behave as a `grpc` `client` or `server`. - -```yaml -kind: server -``` - -### options - -> `object` - -`grpc`-specific options. - -```yaml -options: - services: - - proto/echo.proto -``` - -#### options.services - -::: warning Deprecated -This property will be removed in a future release. To access '.proto' files from the filesystem, use the [filesystem](../catalogs/catalog-filesystem.md) catalog instead. -::: - -> `array` of `string` - -Protobuf service definition filenames, typically with `.proto` filename extension. - -### exit - -> `string` - -Default exit binding when no conditional routes are viable. - -```yaml -exit: echo_server -``` - -### routes - -> `array` of `object` - -Conditional `grpc`-specific routes. - -```yaml -routes: - - guarded: - my_guard: - - echo:messages - when: - - method: example.EchoService/* - metadata: - custom-text: custom value - custom-binary: - base64: Y3VzdG9tIHZhbHVl - exit: echo_server -``` - -### routes[].guarded - -> `object` as named map of `string:string` `array` - -Roles required by named guard. - -```yaml -routes: - - guarded: - my_guard: - - echo:messages -``` - -### routes[].when - -> `array` of `object` - -List of conditions (any match) to match this route. -Read more: [When a route matches](../../../concepts/bindings.md#when-a-route-matches) - -```yaml -routes: - when: - - method: example.EchoService/* - metadata: - custom-text: custom value - custom-binary: - base64: Y3VzdG9tIHZhbHVl -``` - -#### when[].method - -> `string` - -gRPC service method name, such as `example.EchoService/EchoUnary`, or service method pattern such as `example.EchoService/*`. - -#### when[].metadata - -> `map` of `name: value` properties - -Metadata header name value pairs (all match). - -Each metadata header value can be `string` or `object` with `base64` property. - -##### metadata.base64 - -> `string` - -Base64 encoded value for binary metadata header. - -### routes[].exit\* - -> `string` - -Routed exit binding when conditional route matches. - -```yaml -routes: - - when: - ... - exit: echo_server -``` - ---- - -::: right -\* required -::: diff --git a/src/reference/config/bindings/binding-http-filesystem.md b/src/reference/config/bindings/binding-http-filesystem.md deleted file mode 100644 index 5927d45d..00000000 --- a/src/reference/config/bindings/binding-http-filesystem.md +++ /dev/null @@ -1,150 +0,0 @@ ---- -shortTitle: http-filesystem -description: Zilla runtime http-filesystem binding -category: - - Binding -tag: - - Proxy ---- - -# http-filesystem Binding - -Zilla runtime http-filesystem binding. - -```yaml {2} -http_filesystem_proxy: - type: http-filesystem - kind: proxy - routes: - - when: - - path: /{path} - exit: filesystem_server - with: - path: ${params.path} -``` - -## Summary - -Defines a binding with `http-filesystem` support, with `proxy` behavior. - -The `proxy` kind `http-filesystem` binding adapts `http` data streams into `filesystem` data streams by mapping the path from an inbound `http` `GET` request into a filesystem relative path. - -Behaves as a web server when combined with `tcp,` `tls`, `http` and `filesystem` bindings. - -## Configuration - -:::: note Properties - -- [kind\*](#kind) -- [exit](#exit) -- [routes](#routes) -- [routes\[\].guarded](#routes-guarded) -- [routes\[\].when](#routes-when) - - [when\[\].path\*](#when-path) -- [routes\[\].exit\*](#routes-exit) -- [routes\[\].with](#routes-with) - - [with\[\].path\*](#with-path) - -::: right -\* required -::: - -:::: - -### kind\* - -> `enum` [ "proxy" ] - -Behave as an `http-filesystem` `proxy`. - -```yaml -kind: proxy -``` - -### exit - -> `string` - -Default exit binding when no conditional routes are viable. - -```yaml -exit: filesystem_server -``` - -### routes - -> `array` of `object` - -Conditional `http-kafka`-specific routes for adapting `http` data streams into `filesystem` data streams. - -```yaml -routes: - - when: - - path: /{path} - exit: filesystem_server - with: - path: ${params.path} -``` - -### routes[].guarded - -> `object` as named map of `string:string` `array` - -List of roles required by each named guard to authorize this route. - -```yaml -routes: - - guarded: - my_guard: - - read:items -``` - -### routes[].when - -> `array` of `object` - -List of conditions (any match) to match this route when adapting `http` data streams into `filesystem` data streams. -Read more: [When a route matches](../../../concepts/bindings.md#when-a-route-matches) - -```yaml -routes: - - when: - - path: /{path} -``` - -#### when[].path\* - -> `string` - -Path with optional embedded parameter names, such as `/{path}`. - -### routes[].exit\* - -> `string` - -Next binding when following this route. - -```yaml -routes: - - when: - ... - exit: filesystem_server -``` - -### routes[].with - -> `object` - -Filesystem parameters used when adapting `http` data streams into `filesystem` data streams. - -#### with.path\* - -> `string` - -Topic name, optionally referencing path parameter such as `${params.path}`. - ---- - -::: right -\* required -::: diff --git a/src/reference/config/bindings/binding-http.md b/src/reference/config/bindings/binding-http.md deleted file mode 100644 index dc81337d..00000000 --- a/src/reference/config/bindings/binding-http.md +++ /dev/null @@ -1,328 +0,0 @@ ---- -shortTitle: http -description: Zilla runtime http binding -category: - - Binding -tag: - - Server ---- - -# http Binding - -Zilla runtime http binding. - -```yaml {2} -http_server: - type: http - kind: server - options: - access-control: - policy: cross-origin - authorization: - my_jwt_guard: - credentials: - headers: - authorization: Bearer {credentials} - routes: - - when: - - headers: - ":scheme": https - ":authority": example.com:443 - exit: echo_server -``` - -## Summary - -Defines a binding with `http` protocol support, with `server` or `client` behavior. - -## Server behavior - -The `server` kind `http` binding decodes `HTTP/1.1` protocol or `HTTP/2` protocol on the inbound network stream, producing higher level application streams for each request. - -Cross-Origin Resource Sharing (CORS) is supported by specifying an access control policy of `cross-origin`. Further configuration allows for finer-grained access control including specific request origins, methods and headers allowed, and specific response headers exposed. - -Authorization is enforced by a [`guard`](../../config/overview.md#guards) and the credentials can be extracted from a cookie, header or query parameter. - -Conditional routes based on `http` request headers are used to route these application streams to an `exit` binding. - -## Client behavior - -The `client` kind `http` binding receives inbound application streams and encodes each request as a network stream via `HTTP/1.1` protocol. Note that the same network stream can be reused to encode multiple `HTTP/1.1` requests. - -Conditional routes based on `http` request headers are used to route these network streams to an `exit` binding. - -## Configuration - -:::: note Properties - -- [kind\*](#kind) -- [options](#options) -- [options.versions](#options-versions) -- [options.access-control](#options-access-control) - - [access-control.policy\*](#access-control-policy) - - [access-control.policy: same-origin](#access-control-policy-same-origin) - - [access-control.policy: cross-origin](#access-control-policy-cross-origin) - - [access-control.allow](#access-control-allow) - - [allow.origins](#allow-origins) - - [allow.methods](#allow-methods) - - [allow.headers](#allow-headers) - - [allow.credentials](#allow-credentials) - - [access-control.max-age](#access-control-max-age) - - [access-control.expose](#access-control-expose) - - [expose.headers](#expose-headers) -- [options.authorization](#options-authorization) - - [authorization.credentials](#authorization-credentials) - - [credentials.cookies](#credentials-cookies) - - [credentials.headers](#credentials-headers) - - [credentials.query](#credentials-query) -- [options.overrides](#options-overrides) -- [exit](#exit) -- [routes](#routes) -- [routes\[\].guarded](#routes-guarded) -- [routes\[\].when](#routes-when) - - [when\[\].headers](#when-headers) -- [routes\[\].exit\*](#routes-exit) - -::: right -\* required -::: - -:::: - -### kind\* - -> `enum` [ "server", "client" ] - -Behave as an `http` `server` or `client`. - -### options - -> `object` - -`http`-specific options. - -```yaml -options: - access-control: - policy: cross-origin - authorization: - my_jwt_guard: - credentials: - headers: - authorization: Bearer {credentials} - overrides: - custom-text: custom-value -``` - -### options.versions - -> `array` of `enum` [ "http/1.1", "h2" ] - -Supported protocol versions. - -### options.access-control - -> **oneOf**: [same-origin](#access-control-policy-same-origin) | [cross-origin](#access-control-policy-cross-origin) - -Access control policy for the `HTTP` protocol. - -#### access-control.policy\* - -> `enum` [ "same-origin" , "cross-origin" ] - -Supported access control policies. - -#### access-control.policy: same-origin - -> `string` - -Extra properties aren't needed when using Same Origin access control for the `HTTP` protocol. - -```yaml -options: - access-control: - policy: same-origin -``` - -#### access-control.policy: cross-origin - -> `object` - -Additional properties that cover Cross Origin Resource Sharing (CORS) access control for the `HTTP` protocol. - -```yaml -options: - access-control: - policy: cross-origin -``` - -#### access-control.allow - -> `object` | Default: all origins, methods and headers, without credentials - -Allowed cross-origin request origins, methods, headers and credentials. -CORS allowed request origins, methods, headers and credentials for the `HTTP` protocol. - -##### allow.origins - -> `array` of `string` - -Allowed request origins. - -##### allow.methods - -> `array` of `string` - -Allowed request methods. - -##### allow.headers - -> `array` of `string` - -Allowed request headers. - -##### allow.credentials - -> `boolean` - -Support `fetch` credentials mode `include`. - -#### access-control.max-age - -> `integer` - -Maximum cache age (in seconds) for allowed headers and methods. - -#### access-control.expose - -> `object` | Default: all response headers - -Exposed cross-origin response headers. - -##### expose.headers - -> `array` of `string` - -Exposed response headers. - -### options.authorization - -> `object` as map of named objects - -Authorization by a named guard for the `HTTP/1.1` and `HTTP/2` protocols. - -```yaml -authorization: - my_jwt_guard: - credentials: - headers: - authorization: Bearer {credentials} -``` - -#### authorization.credentials - -> `object` - -Defines how to extract credentials from the HTTP request. - -##### credentials.cookies - -> `object` as map of `string` - -Named cookie value pattern with `{credentials}`. - -##### credentials.headers - -> `map` of `name: value` properties - -Named header value pattern with `{credentials}`, e.g. `"Bearer` `{credentials}"`. - -##### credentials.query - -> `object` as map of `string` - -Named query parameter value pattern with `{credentials}`. - -### options.overrides - -> `map` of `name: value` properties - -Request header overrides. - -### exit - -> `string` - -Default exit binding when no conditional routes are viable. - -```yaml -exit: echo_server -``` - -### routes - -> `array` of `object` - -Conditional `http`-specific routes. - -```yaml -routes: - - when: - - headers: - ":scheme": https - ":authority": example.com:443 - exit: echo_server -``` - -### routes[].guarded - -> `object` as named map of `string:string` `array` - -List of roles required by each named guard to authorize this route. - -```yaml -routes: - - guarded: - my_guard: - - read:items -``` - -### routes[].when - -> `array` of `object` - -List of conditions (any match) to match this route. -Read more: [When a route matches](../../../concepts/bindings.md#when-a-route-matches) - -```yaml -routes: - - when: - - headers: - ":scheme": https - ":authority": example.com:443 -``` - -#### when[].headers - -> `map` of `name: value` properties - -Header name value pairs (all match). - -### routes[].exit\* - -> `string` - -Next binding when following this route. - -```yaml -routes: - - when: - ... - exit: echo_server -``` - ---- - -::: right -\* required -::: diff --git a/src/reference/config/bindings/binding-kafka-grpc.md b/src/reference/config/bindings/binding-kafka-grpc.md deleted file mode 100644 index 5f6e0fe4..00000000 --- a/src/reference/config/bindings/binding-kafka-grpc.md +++ /dev/null @@ -1,283 +0,0 @@ ---- -shortTitle: kafka-grpc -description: Zilla runtime kafka-grpc binding -category: - - Binding -tag: - - Remote Server ---- - -# kafka-grpc Binding - -Zilla runtime kafka-grpc binding. - -```yaml {2} -kafka_grpc_proxy: - type: kafka-grpc - kind: remote_server - entry: kafka_cache_client - options: - acks: leader_only - idempotency: - metadata: idempotency-key - correlation: - headers: - service: zilla:service - method: zilla:method - correlation-id: zilla:correlation-id - reply-to: zilla:reply-to - routes: - - when: - - topic: requests - reply-to: responses - method: example.EchoService/* - exit: grpc - with: - scheme: http - authority: localhost:7151 -``` - -## Summary - -The `remote_server` kind `kafka-grpc` binding adapts `kafka` topic streams to `grpc` request-response streams. - -The `grpc` request message is received from a `requests` topic, with a `zilla:correlation-id` header, initiating a `grpc` service method invocation. When the `grpc` response received, a response message is produced to the `responses` topic, with the same `zilla:correlation-id` header to correlate the response. - -Note that `grpc` requests and responses can be `unary` or `streaming`. - -## Configuration - -:::: note Properties - -- [kind\*](#kind) -- [options](#options) - - [options.acks](#options-acks) - - [options.idempotency](#options-idempotency) - - [idempotency.metadata](#idempotency-metadata) - - [options.correlation](#options-correlation) - - [correlation.headers](#correlation-headers) - - [headers.service](#headers-service) - - [headers.method](#headers-method) - - [headers.correlation-id](#headers-correlation-id) - - [headers.reply-to](#headers-reply-to) -- [routes](#routes) -- [routes\[\].guarded](#routes-guarded) -- [routes\[\].when](#routes-when) - - [when\[\].topic](#when-topic) - - [when\[\].reply-to](#when-reply-to) - - [when\[\].method](#when-method) -- [routes\[\].exit\*](#routes-exit) -- [routes\[\].with](#routes-with) - - [with.scheme](#with-scheme) - - [with.authority](#with-authority) - -::: right -\* required -::: - -:::: - -### kind\* - -> `enum` [ "remote_server" ] - -Behave as an `kafka-grpc` `remote_server`. - -```yaml -kind: remote_server -``` - -### options - -> `object` - -`kafka-grpc`-specific options for adapting `kafka` topic streams to `grpc` request-response streams. - -```yaml -options: - acks: leader_only - idempotency: - metadata: idempotency-key - correlation: - headers: - service: zilla:service - method: zilla:method - correlation-id: zilla:correlation-id - reply-to: zilla:reply-to -``` - -#### options.acks - -> `enum` [ "none", "leader_only", "in_sync_replicas" ] - -The `kafka` acknowledgment mode. - -#### options.idempotency - -> `object` - -Metadata header used to specify the idempotency key when adapting `kafka` topic streams to `grpc` request-response streams. - -##### idempotency.metadata - -> `string` | Default: `"idempotency-key"`. - -The `grpc` metadata header name for idempotency key. - -#### options.correlation - -> `object` - -Kafka request message headers injected when adapting `kafka` topic streams to `grpc` request-response streams. - -##### correlation.headers - -> `object` - -Kafka request message correlation header names used when adapting `kafka` topic streams to `grpc` request-response streams. - -##### headers.service - -> `string` | Default: `"zilla:service"` - -Kafka header name for `grpc` service. - -##### headers.method - -> `string` | Default: `"zilla:method"` - -Kafka header name for `grpc` method. - -##### headers.correlation-id - -> `string` | Default: `"zilla:correlation-id"` - -Kafka header name for request-response correlation identifier. - -##### headers.reply-to - -> `string` | Default: `"zilla:reply-to"` - -Kafka header name for reply-to topic. - -### routes - -> `array` of `object` - -Conditional `kafka-grpc`-specific routes for adapting `kafka` topic streams to `grpc` request-response streams. - -```yaml -routes: - - guarded: - my_guard: - - echo:messages - when: - - topic: requests - reply-to: responses - method: example.EchoService/* - exit: grpc - with: - scheme: http - authority: localhost:7151 -``` - -### routes[].guarded - -> `object` as named map of `string:string` `array` - -Roles required by named guard. - -```yaml -routes: - - guarded: - my_guard: - - echo:messages -``` - -### routes[].when - -> `array` of `object` - -List of conditions (any match) to match this route when adapting `kafka` topic streams to `grpc` request-response streams. -Read more: [When a route matches](../../../concepts/bindings.md#when-a-route-matches) - -```yaml -routes: - - when: - - topic: requests - reply-to: responses - method: example.EchoService/* -``` - -#### when[].topic - -> `string` - -The name of a Kafka topic for requests. - -#### when[].key - -> `string` - -The name of a Kafka topic for requests. - -#### when[].headers - -> `map` of `name: value` properties - -Header name value pairs (all match). - -#### when[].reply-to - -> `string` - -The name of the Kafka topic for correlated responses. - -#### when[].method - -> `string` - -Pattern matching the fully qualified name of a `grpc` service method, in the format `/` allowing wildcard `*` for the method to indicate any method. - -### routes[].exit\* - -> `string` - -Default exit binding when no conditional routes are viable. - -```yaml -routes: - - when: - ... - exit: kafka_cache_client -``` - -### routes[].with - -> `object` - -Kafka parameters for matched route when adapting `grpc` request-response streams to `kafka` topic fetch streams. - -```yaml -with: - scheme: http - authority: localhost:7151 -``` - -#### with.scheme - -> `string` - -The `grpc` request scheme. - -#### with.authority - -> `string` - -The `grpc` request authority. - ---- - -::: right -\* required -::: diff --git a/src/reference/config/bindings/binding-kafka-proxy.md b/src/reference/config/bindings/binding-kafka-proxy.md deleted file mode 100644 index 0bc9ba2f..00000000 --- a/src/reference/config/bindings/binding-kafka-proxy.md +++ /dev/null @@ -1,140 +0,0 @@ ---- -shortTitle: kafka-proxy -description: Zilla runtime kafka-proxy binding -icon: aky-zilla-plus -category: - - Binding -tag: - - Proxy ---- - -# kafka-proxy Binding - -[Available in ](https://www.aklivity.io/products/zilla-plus) -{.zilla-plus-badge .hint-container .info} - -Zilla runtime kafka-proxy binding. - -```yaml {2} -kafka_proxy: - type: kafka-proxy - kind: proxy - options: - external: - host: kafka-#.external.net - port: 9093 - internal: - host: b-#.kafka.internal.net - port: 9094 - exit: tls_client -``` - -## Summary - -Defines a binding with `kafka-proxy` support, with `proxy` behavior. - -## Configuration - -:::: note Properties - -- [kind\*](#kind) -- [options\*](#options) -- [options.external\*](#options-external) - - [external.host\*](#external-host) - - [external.port\*](#external-port) -- [options.internal\*](#options-internal) - - [internal.host\*](#internal-host) - - [internal.port\*](#internal-port) -- [exit\*](#exit) - -::: right -\* required -::: - -:::: - -### kind\* - -> `enum` [ "proxy" ] - -Behave as a `proxy`. - -### options\* - -> `object` - -`kafka-proxy`-specific options. - -```yaml -options: - external: - host: kafka-#.external.net - port: 9093 - internal: - host: b-#.kafka.internal.net - port: 9094 -``` - -### options.external\* - -> `object` - -Kafka proxy endpoint used by external clients. - -```yaml -external: - host: kafka-#.external.net - port: 9093 -``` - -#### external.host\* - -> `string` - -Hostname pattern for external Kafka broker names, where `#` is an integer. - -#### external.port\* - -> `integer` - -Port number for external Kafka broker. - -### options.internal\* - -> `object` - -Internal Kafka broker endpoint. - -```yaml -internal: - host: b-#.kafka.internal.net - port: 9094 -``` - -#### internal.host\* - -> `string` - -Hostname pattern for internal Kafka broker names, where `#` is an integer. - -#### internal.port\* - -> `integer` - -Port number for internal Kafka broker. - -### exit\* - -> `string` - -Default exit binding when no conditional routes are viable. - -```yaml -exit: tls_client -``` - ---- - -::: right -\* required -::: diff --git a/src/reference/config/bindings/binding-kafka.md b/src/reference/config/bindings/binding-kafka.md deleted file mode 100644 index 60a7690e..00000000 --- a/src/reference/config/bindings/binding-kafka.md +++ /dev/null @@ -1,233 +0,0 @@ ---- -shortTitle: kafka -description: Zilla runtime kafka binding -category: - - Binding -tag: - - Server ---- - -# kafka Binding - -Zilla runtime kafka binding. - -```yaml {2,10,17} -kafka_cache_client: - type: kafka - kind: cache_client - exit: kafka_cache_server -kafka_cache_server: - type: kafka - kind: cache_server - options: - bootstrap: - - items-responses - exit: kafka_client -kafka_client: - type: kafka - kind: client - exit: tcp_client -``` - -## Summary - -Defines a binding with `kafka` protocol support, with `cache_client`, `cache_server` or `client` behavior. - -## Cache behavior - -The `cache_client` and `cache_server` kinds combine to provide a persistent cache of `kafka` messages per `topic` `partition` honoring the `kafka` `topic` configuration for message expiration and compaction. Messages ordering is guaranteed per `partition` and messages are merged into a unified stream for the `topic` spanning all `partitions`. - -The `cache_server` kind supports proactive `fetch` of messages to keep the cache fresh in preparation for new consumers. This is enabled by configuring a list of `bootstrap` topics for the binding. - -The `cache_client` kind supports filtering by `kafka` message key, headers or a combination of key and headers. - -Message conflation occurs implicitly for `compacted` `kafka` topics, where a slower consumer that is not keeping up with the latest messages can safely skip over each older message that has effectively been replaced by a newer message with the same key. - -When a new consumer arrives, the latest messages in the compacted topic are immediately delivered to that consumer, followed by any additional messages as they are produced to the `kafka` `topic`. - -When the `kafka` `topic` is not compacted, then the binding can be configured to either replay historical messages first, or start with upcoming live messages instead. - -The `cache_client` and `cache_server` also combine to provide a staging area when producing new messages as `kafka` requires exact message length up front when producing new messages and `kafka` does not support producing multiple messages in parallel over the same network connection. - -## Client behavior - -The `client` kind `kafka` binding receives inbound application streams and encodes each as a network stream via `kafka` request-response protocol. Note that the same network stream can be reused to encode multiple `kafka` requests, including both `fetch` and `produce` requests. - -Conditional routes based on `kafka` `topic` names are used to route these network streams to an `exit` binding that ultimately reaches a `kafka` broker. - -## Configuration - -:::: note Properties - -- [kind\*](#kind) -- [options](#options) -- [options.bootstrap](#options-bootstrap) -- [options.topics](#options-topics) - - [topics\[\].name\*](#topics-name) - - [topics\[\].defaultOffset](#topics-defaultoffset) - - [topics\[\].key](#topics-key) - - [topics\[\].value](#topics-value) -- [options.servers](#options-servers) -- [options.sasl](#options-sasl) - - [sasl.mechanism\*](#sasl-mechanism) - - [sasl.username](#sasl-username) - - [sasl.password](#sasl-password) -- [exit](#exit) -- [routes](#routes) -- [routes\[\].guarded](#routes-guarded) -- [routes\[\].when](#routes-when) - - [when\[\].topic\*](#when-topic) -- [routes\[\].exit\*](#routes-exit) - -::: right -\* required -::: - -:::: - -### kind\* - -> `enum` [ "cache_client", "cache_server", "client" ] - -Behave as a `kafka` `cache_client`, `cache_server` or `client`. - -### options - -> `object` - -`kafka`-specific options. - -```yaml -options: - bootstrap: - - items-requests - - items-responses - topics: - - name: items-requests - defaultOffset: live -``` - -### options.bootstrap - -> `array` of `string` - -Topics to bootstrap in cache server even when no clients. - -### options.topics - -> `array` of `object` - -Topic configuration. - -#### topics[].name\* - -> `string` - -Topic name. - -#### topics[].defaultOffset - -> `enum` [ "live", "historical" ] | Default: `"historical"` - -Fetch offset to use for new consumers - -#### topics[].key - -> `object` of a named [`model`](../models/) - -Enforce validation for key - -#### topics[].value - -> `object` of a named [`model`](../models/) - -Enforce validation for value - -### options.servers - -> `array` of `string` - -Bootstrap servers to use when connecting to `kafka` cluster. - -### options.sasl - -> `object` - -SASL credentials to use when connecting to `kafka` brokers. - -#### sasl.mechanism\* - -> `enum` [ "plain", "scram-sha-1", "scram-sha-256", "scram-sha-512" ] - -SASL mechanism\ -Supports `plain` and `scram` mechanisms. - -#### sasl.username - -> `string` - -SASL username. - -#### sasl.password - -> `string` - -SASL password. - -### exit - -> `string` - -Default exit binding when no conditional routes are viable. - -```yaml -exit: echo_server -``` - -### routes - -> `array` of `object` - -Conditional `kafka`-specific routes. - -### routes[].guarded - -> `object` as named map of `string:string` `array` - -List of roles required by each named guard to authorize this route. - -```yaml -routes: - - guarded: - my_guard: - - read:items -``` - -### routes[].when - -> `array` of `object` - -List of conditions (any match) to match this route. -Read more: [When a route matches](../../../concepts/bindings.md#when-a-route-matches) - -#### when[].topic\* - -> `string` - -Topic name pattern. - -### routes[].exit\* - -> `string` - -Next binding when following this route. - -```yaml -exit: echo_server -``` - ---- - -::: right -\* required -::: diff --git a/src/reference/config/bindings/binding-mqtt-kafka.md b/src/reference/config/bindings/binding-mqtt-kafka.md deleted file mode 100644 index 9140091c..00000000 --- a/src/reference/config/bindings/binding-mqtt-kafka.md +++ /dev/null @@ -1,259 +0,0 @@ ---- -shortTitle: mqtt-kafka -description: Zilla runtime mqtt-kafka binding -category: - - Binding -tag: - - Proxy ---- - -# mqtt-kafka Binding - -Zilla runtime mqtt-kafka binding. - -```yaml {2} -mqtt_kafka_proxy: - type: mqtt-kafka - kind: proxy - options: - server: mqtt-1.example.com:1883 - topics: - sessions: mqtt-sessions - messages: mqtt-messages - retained: mqtt-retained - clients: - - place/{identity}/# - routes: - - when: - - publish: - - topic: place/+/device/# - - subscribe: - - topic: place/+/device/# - with: - messages: mqtt-devices - exit: kafka_cache_client - exit: kafka_cache_client -``` - -## Summary - -Defines a binding with `mqtt-kafka` support, with `proxy` behavior. - -## Configuration - -:::: note Properties - -- [kind\*](#kind) -- [options](#options) - - [options.server](#options-server) - - [options.topics](#options-topics) - - [topics.sessions\*](#topics-sessions) - - [topics.messages\*](#topics-messages) - - [topics.retained\*](#topics-retained) - - [options.clients](#options-clients) -- [routes](#routes) -- [routes\[\].guarded](#routes-guarded) -- [routes\[\].when](#routes-when) - - [when\[\].publish](#when-publish) - - [publish\[\].topic](#publish-topic) - - [when\[\].subscribe](#when-subscribe) - - [subscribe\[\].topic](#subscribe-topic) -- [routes\[\].exit\*](#routes-exit) -- [routes\[\].with](#routes-with) - - [with.messages](#with-messages) -- [exit](#exit) - -::: right -\* required -::: - -:::: - -### kind\* - -> `enum` [ "proxy" ] - -Behave as a `mqtt-kafka` `proxy`. - -### options - -> `object` - -`mqtt-kafka`-specific options for configuring the `kafka` topics that the proxy will use to route mqtt messages and session states; and define server reference of the MQTT server in Zilla - -#### options.server - -> `string` - -The server reference used by the MQTT server in Zilla. This config enables scaling of the MQTT server when running multiple Zilla instances as it uses [server redirection](https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901255). - -```yaml -options: - server: mqtt-1.example.com:1883 -``` - -#### options.topics - -> `object` - -The `kafka` topics Zilla needs when routing MQTT messages - -```yaml -options: - topics: - sessions: mqtt-sessions - messages: mqtt-messages - retained: mqtt-retained -``` - -##### topics.sessions\* - -> `string` - -Compacted Kafka topic for storing mqtt session states. Cleanup policy must be log compacted. - -##### topics.messages\* - -> `string` - -The default Kafka topic used for routing mqtt messages. - -##### topics.retained\* - -> `string` - -Compacted Kafka topic for storing mqtt retained messages. - -#### options.clients - -> `array` of `string` - -Pattern defining how to extract client identity from the topic. Using this we can ensure that all messages for the same client identity are produced to Kafka on the same topic partition. - -```yaml -options: - clients: - - place/{identity}/# -``` - -### routes - -> `array` of `object` - -Conditional `mqtt-kafka`-specific routes when adapting `mqtt` topic streams to `kafka` topic streams. - -```yaml -routes: - - when: - - publish: - - topic: place/+/device/# - - subscribe: - - topic: place/+/device/# - with: - messages: mqtt-devices - exit: kafka_cache_client -``` - -### routes[].guarded - -> `object` as named map of `string:string` `array` - -List of roles required by each named guard to authorize this route. - -```yaml -routes: - - guarded: - my_guard: - - publish:clients -``` - -### routes[].when - -> `array` of `object` - -List of conditions (any match) to match this route when adapting `mqtt` topic streams to `kafka` topic streams. -Read more: [When a route matches](../../../concepts/bindings.md#when-a-route-matches) - -```yaml -routes: - - when: - - publish: - - topic: place/# - - subscribe: - - topic: place/# -``` - -#### when[].publish - -> `array` of `object` - -Array of MQTT topic filters matching topic names for publish. - -```yaml -- publish: - - topic: place/# - - topic: subs/# -``` - -##### publish[].topic - -> `string` - -MQTT topic filter pattern. - -#### when[].subscribe - -> `array` of `object` - -Array of MQTT topic filters matching topic names for subscribe. - -```yaml -- subscribe: - - topic: place/# - - topic: subs/# -``` - -##### subscribe[].topic - -> `string` - -MQTT topic filter pattern. - -### routes[].exit\* - -> `string` - -Next binding when following this route. - -### routes[].with - -> `object` - -Kafka parameters for matched route when adapting `mqtt` topic streams to `kafka` topic streams. - -```yaml -with: - messages: mqtt-devices -``` - -#### with.messages - -> `string` - -Kafka topic to use for the route. - -### exit - -> `string` - -Default exit binding when no conditional routes are viable. - -```yaml -exit: kafka_cache_client -``` - ---- - -::: right -\* required -::: diff --git a/src/reference/config/bindings/binding-mqtt.md b/src/reference/config/bindings/binding-mqtt.md deleted file mode 100644 index a9049dc8..00000000 --- a/src/reference/config/bindings/binding-mqtt.md +++ /dev/null @@ -1,263 +0,0 @@ ---- -shortTitle: mqtt -description: Zilla runtime mqtt binding -category: - - Binding -tag: - - Server ---- - -# mqtt Binding - -Zilla runtime mqtt binding. - -```yaml {2} -mqtt_server: - type: mqtt - kind: server - options: - authorization: - my_jwt_guard: - credentials: - connect: - username: Bearer {credentials} - versions: - - v5 - - v3.1.1 - routes: - - when: - - session: - - client-id: "*" - - publish: - - topic: command/one - - topic: command/two - - subscribe: - - topic: reply - exit: mqtt_kafka_proxy -``` - -## Summary - -Defines a binding with `mqtt` protocol support, with `server` behavior. - -The `server` kind `mqtt` binding decodes the MQTT protocol on the inbound network stream, producing higher level application streams for each `publish` or `subscribe` `topic`. The `session` state is also described by a higher level application stream. - -Conditional routes based on the `topic` `name` are used to route these application streams to an `exit` binding. - -## Configuration - -:::: note Properties - -- [kind\*](#kind) -- [exit](#exit) -- [options](#options) -- [options.authorization](#options-authorization) - - [authorization.credentials](#authorization-credentials) - - [credentials.connect](#credentials-connect) - - [connect.username](#connect-username) - - [connect.password](#connect-password) -- [options.versions](#options-versions) -- [options.topics](#options-topics) - - [topics\[\].name\*](#topics-name) - - [topics\[\].content](#topics-content) -- [routes](#routes) -- [routes\[\].guarded](#routes-guarded) -- [routes\[\].when](#routes-when) - - [when\[\].session](#when-session) - - [session\[\].client-id](#session-client-id) - - [when\[\].publish](#when-publish) - - [publish\[\].topic](#publish-topic) - - [when\[\].subscribe](#when-subscribe) - - [subscribe\[\].topic](#subscribe-topic) -- [routes\[\].exit\*](#routes-exit) - -::: right -\* required -::: - -:::: - -### kind\* - -> `enum` [ "server" ] - -Behave as a `mqtt` `server`. - -### exit - -> `string` - -Default exit binding when no conditional routes are viable. - -```yaml -exit: echo_server -``` - -### options - -> `object` - -`mqtt`-specific options. - -```yaml -options: - authorization: - my_jwt_guard: - credentials: - connect: - username: Bearer {credentials} - versions: - - v5 - - v3.1.1 -``` - -### options.authorization - -> `object` as map of named objects - -Authorization by a named guard. - -```yaml -authorization: - my_jwt_guard: - credentials: - connect: - username: Bearer {credentials} -``` - -#### authorization.credentials - -> `object` - -Defines how to extract credentials from the MQTT connect packet. - -##### credentials.connect - -> `object` - -MQTT connect packet properties - -##### connect.username - -> `string` - -Extract credentials from the MQTT connect packet username property with `{credentials}`, e.g. `"Bearer` `{credentials}"`. - -##### connect.password - -> `string` - -Extract credentials from the MQTT connect packet password property with `{credentials}`, e.g. `"Bearer` `{credentials}"`. - -### options.versions - -> `array` of `enum` [ "v5", "v3.1.1" ] - -Supported protocol versions. - -### options.topics - -> `array` of `object` - -Topic configuration. - -#### topics[].name\* - -> `string` - -Topic name. - -#### topics[].content - -> `object` of a named [`model`](../models/) - -Enforce validation for content - -### routes - -> `array` of `object` - -Conditional `mqtt`-specific routes. - -### routes[].guarded - -> `object` as named map of `string:string` `array` - -List of roles required by each named guard to authorize this route. - -```yaml -routes: - - guarded: - my_guard: - - read:items -``` - -### routes[].when - -> `array` of `object` - -List of conditions (any match) to match this route. -Read more: [When a route matches](../../../concepts/bindings.md#when-a-route-matches) - -```yaml -routes: - - when: - - session: - - client-id: "*" - - publish: - - topic: command/one - - topic: command/two - - subscribe: - - topic: reply -``` - -#### when[].session - -> `array` of `object` - -Array of mqtt session properties - -##### session[].client-id - -> `string` - -An MQTT client identifier, allowing the usage of wildcards. - -#### when[].publish - -> `array` of `object` - -Array of MQTT topic names for publish capability. - -##### publish[].topic - -> `string` - -#### when[].subscribe - -> `array` of `object` - -Array of MQTT topic names for subscribe capability. - -##### subscribe[].topic - -> `string` - -### routes[].exit\* - -> `string` - -Next binding when following this route. - -```yaml -routes: - - when: - ... - exit: mqtt_kafka_proxy -``` - ---- - -::: right -\* required -::: diff --git a/src/reference/config/bindings/binding-openapi-asyncapi.md b/src/reference/config/bindings/binding-openapi-asyncapi.md deleted file mode 100644 index cfd59ae9..00000000 --- a/src/reference/config/bindings/binding-openapi-asyncapi.md +++ /dev/null @@ -1,215 +0,0 @@ ---- -shortTitle: openapi-asyncapi -description: Zilla runtime openapi-asyncapi binding -category: - - Binding -tag: - - Proxy ---- - - -# openapi-asyncapi Binding - -Zilla runtime `openapi-asyncapi` binding. - -```yaml {2} -openapi_asyncapi_proxy: - type: openapi-asyncapi - kind: proxy - options: - specs: - openapi: - my-openapi-spec: - catalog: - my_catalog: - subject: petstore - version: latest - asyncapi: - my-asyncapi-spec: - catalog: - my_catalog: - subject: petstore - version: latest - routes: - - when: - - api-id: my-openapi-spec - exit: asyncapi_client - with: - api-id: my-asyncapi-spec -``` - -## Summary - -The `proxy` kind `openapi-asyncapi` binding adapts OpenAPI request-response streams to AsyncAPI streams. - -## Configuration - -:::: note Properties - -- [kind\*](#kind) -- [options](#options) - - [options.specs](#options-specs) - - [specs.openapi](#specs-openapi) - - [openapi.catalog](#openapi-catalog) - - [catalog.subject](#catalog-subject) - - [catalog.version](#catalog-version) - - [specs.asyncapi](#specs-asyncapi) - - [asyncapi.catalog](#asyncapi-catalog) - - [catalog.subject](#catalog-subject) - - [catalog.version](#catalog-version) -- [routes](#routes) -- [routes\[\].when](#routes-when) - - [when\[\].api-id](#when-api-id) - - [when\[\].operation-id](#when-operation-id) -- [routes\[\].exit\*](#routes-exit) -- [routes\[\].with](#routes-with) - - [with.api-id](#with-api-id) - - [with.operation-id](#with-operation-id) - -::: right -\* required -::: - -:::: - -### kind\* - -> `enum` [ "proxy" ] - -Behave as an `openapi-asyncapi` `proxy`. - -```yaml -kind: proxy -``` - -### options - -> `object` - -`openapi-asyncapi`-specific options. - -```yaml -options: - specs: - openapi: - my-openapi-spec: spec/openapi.yaml - asyncapi: - my-asyncapi-spec: spec/asyncapi.yaml -``` - -#### options.specs - -> `object` - -OpenAPI and AsyncAPI specs definition. - -##### specs.openapi - -> `object` of `name: value` properties - -#### openapi.catalog - -> `object` as map of named properties - -catalog specific options. - -#### catalog.subject - -> `string` - -Subject name used when storing the catalog artifact. - -#### catalog.version - -> `string` - -Catalog artifact version to use. - -##### specs.asyncapi - -> `object` of `name: value` properties - -#### asyncapi.catalog - -> `object` as map of named properties - -`catalog` catalog specific options. - -#### catalog.subject - -> `string` - -Subject name used when storing the catalog artifact. - -#### catalog.version - -> `string` - -Catalog artifact version to use. - -### routes - -> `array` of `object` - -Conditional `openapi-asyncapi`-specific routes for adapting `openapi` operations to `asyncapi` operations. - -### routes[].when - -> `array` of `object` - -List of conditions to match this route when adapting `openapi` request-response streams to `asyncapi` streams. -Read more: [When a route matches](../../../concepts/bindings.md#when-a-route-matches) - -#### when[].api-id - -> `string` - -OpenAPI spec identifier that matches from the `openapi` binding request stream. - -#### when[].operation-id - -> `string` - -OpenAPI OperationId that can be mapped between OpenAPI and AsyncAPI spec - -### routes[].exit\* - -> `string` - -Default exit binding when no conditional routes are viable. - -```yaml -routes: - - when: - ... - exit: asyncapi_client -``` - -### routes[].with - -> `object` - -Defines the route with the AsyncAPI spec identifier and OperationId. - -```yaml -with: - api-id: my-asyncapi-spec -``` - -#### with.api-id - -> `string` - -AsyncAPI spec identifier that the route exits with to the next binding - -#### with.operation-id - -> `string` - -AsyncAPI OperationId that the route exits with to the next binding - ---- - -::: right -\* required -::: diff --git a/src/reference/config/bindings/binding-openapi.md b/src/reference/config/bindings/binding-openapi.md deleted file mode 100644 index a580ec5c..00000000 --- a/src/reference/config/bindings/binding-openapi.md +++ /dev/null @@ -1,284 +0,0 @@ ---- -shortTitle: openapi -description: Zilla runtime openapi binding -category: - - Binding -tag: - - Server - - Client ---- - -# openapi Binding - -Zilla runtime `openapi` binding. - -```yaml {2} -openapi_server: - type: openapi - kind: server - options: - specs: - petstore: - servers: - - url: http://localhost:9090 - catalog: - my_catalog: - subject: petstore - version: latest - exit: openapi_client -openapi_client: - type: openapi - kind: client - options: - tcp: - host: localhost - port: 8080 - specs: - petstore: - servers: - - url: http://localhost:9090 - catalog: - my_catalog: - subject: petstore - version: latest -``` - -## Summary - -Defines a binding with `openapi` spec, with `server` or `client` behavior. - -The `server` kind `openapi` binding creates composite of `tcp`, `tls`, and `http` bindings with server kind and adapts HTTP request-response streams to OpenAPI request-response streams. - -The `client` kind `openapi` binding creates composite of `http`, `tls`, and `tcp` bindings with client kind and adapts OpenAPI request-response streams to HTTP request-response streams. - -## Configuration - -:::: note Properties - -- [kind\*](#kind) -- [options](#options) - - [options.specs](#options-specs) - - [specs.catalog](#specs-catalog) - - [catalog.subject](#catalog-subject) - - [catalog.version](#catalog-version) - - [specs.servers](#specs-servers) - - [servers.url](#servers-url) - - [options.http](#options-http) - - [http.authorization](#http-authorization) - - [authorization.credentials](#authorization-credentials) - - [credentials.cookies](#credentials-cookies) - - [credentials.headers](#credentials-headers) - - [credentials.query](#credentials-query) - - [options.tcp](#options-tcp) - - [tcp.host](#tcp-host) - - [tcp.port](#tcp-port) - - [options.tls](#options-tls) - - [tls.version](#tls-version) - - [tls.keys](#tls-keys) - - [tls.trust](#tls-trust) - - [tls.signers](#tls-signers) - - [tls.trustcacerts](#tls-trustcacerts) - - [tls.sni\*](#tls-sni) - - [tls.alpn](#tls-alpn) - - [tls.mutual](#tls-mutual) -- [exit](#exit) - -::: right -\* required -::: - -:::: - -### kind\* - -> `enum` [ "client", "server" ] - -Behave as a `openapi` `client` or `server`. - -```yaml -kind: server -``` - -### options - -> `object` - -`openapi`-specific options. - -```yaml -options: - specs: - petstore: - servers: - - url: http://localhost:9090 - catalog: - my_catalog: - subject: petstore - version: latest -``` - -#### options.specs - -> `object` as map of named properties - -`specs` specific options - -#### specs.catalog - -> `object` as map of named properties - -catalog specific options. - -#### catalog.subject - -> `string` - -Subject name used when storing the catalog artifact. - -#### catalog.version - -> `string` - -Catalog artifact version to use. - -#### specs.servers - -> `object` - -#### servers.url - -> `string` - -The server url to match in openapi spec - -#### options.http - -> `object` - -`http` specific options. - -##### http.authorization - -> `object` as map of named properties - -Authorization by guard for the `HTTP/1.1` and `HTTP/2` protocols. - -```yaml -authorization: - my_jwt_guard: - credentials: - headers: - authorization: Bearer {credentials} -``` - -##### authorization.credentials - -> `object` - -Defines how to extract credentials from the HTTP request. - -##### credentials.cookies - -> `map` of `name: value` properties - -Named cookie value pattern with `{credentials}`. - -##### credentials.headers - -> `map` of `name: value` properties - -Named header value pattern with `{credentials}`, e.g. `"Bearer` `{credentials}"`. - -##### credentials.query - -> `map` of `name: value` properties - -Named query parameter value pattern with `{credentials}`. - -#### options.tcp - -> `object` - -`client` specific `tcp` options. - -##### tcp.host - -> `string` - -Hostname or IP address. - -##### tcp.port - -> `integer` | `string` | `array` of `integer` | `array` of `string` - -Port number(s), including port number ranges. - -#### options.tls - -> `object` - -`tls` specific options. - -##### tls.version - -> `string` - -Protocol version. - -##### tls.keys - -> `array` of `string` - -A list of reference names for the Vault key. - -##### tls.trust - -> `array` of `string` - -A list of reference names for the Vault certificate. - -##### tls.signers - -> `array` of `string` - -A list of reference names for the Vault signer certificate. - -##### tls.trustcacerts - -> `boolean` | Default: `true` when trust is `null` - -Trust CA certificates. - -##### tls.sni\* - -> `array` of `string` - -A list of the Server Name Indications. - -##### tls.alpn - -> `array` of `string` - -Application protocols. - -##### tls.mutual - -> `enum` [ "required", "requested", "none" ] | Default: `"none"` - -Mutual authentication. - -### exit - -> `string` - -Default exit binding. - -```yaml -exit: echo_server -``` - ---- - -::: right -\* required -::: diff --git a/src/reference/config/bindings/binding-proxy.md b/src/reference/config/bindings/binding-proxy.md deleted file mode 100644 index a4dfb52b..00000000 --- a/src/reference/config/bindings/binding-proxy.md +++ /dev/null @@ -1,180 +0,0 @@ ---- -shortTitle: proxy -description: Zilla runtime proxy binding -category: - - Binding -tag: - - Proxy - - Server ---- - -# proxy Binding - -Zilla runtime proxy binding. - -```yaml {2} -proxy_server: - type: proxy - kind: server - routes: - - when: - - transport: stream - family: inet4 - destination: - port: 443 - exit: tls_server -``` - -## Summary - -Defines a binding with `proxy` protocol support, with `server` or `client` behavior. - -The `server` kind `proxy` binding decodes `Proxy v2` protocol on the inbound network stream, producing higher level application streams for each request. - -The `client` kind `proxy` binding receives inbound application streams and encodes each as a network stream via `Proxy v2` protocol. - -Conditional routes based on the network transport type or network addresses are used to route these streams to an `exit` binding. - -## Configuration - -:::: note Properties - -- [kind\*](#kind) -- [exit](#exit) -- [routes](#routes) -- [routes\[\].guarded](#routes-guarded) -- [routes\[\].when](#routes-when) - - [when\[\].transport](#when-transport) - - [when\[\].family](#when-family) - - [when\[\].source](#when-source) - - [source.host](#source-host) - - [source.port](#source-port) - - [when\[\].destination](#when-destination) - - [destination.host](#destination-host) - - [destination.port](#destination-port) -- [routes\[\].exit\*](#routes-exit) - -::: right -\* required -::: - -:::: - -### kind\* - -> `enum` [ "client", "server" ] - -Behave as `proxy` `client` or `server`. - -### exit - -> `string` - -Default exit binding when no conditional routes are viable. - -```yaml -exit: echo_server -``` - -### routes - -> `array` of `object` - -Conditional `proxy`-specific routes. - -```yaml -routes: - - when: - - transport: stream - family: inet4 - destination: - port: 443 - exit: tls_server -``` - -### routes[].guarded - -> `object` as named map of `string:string` `array` - -List of roles required by each named guard to authorize this route. - -```yaml -routes: - - guarded: - my_guard: - - read:items -``` - -### routes[].when - -> `array` of `object` - -List of conditions (any match) to match this route. -Read more: [When a route matches](../../../concepts/bindings.md#when-a-route-matches) - -#### when[].transport - -> `enum` [ "stream", "datagram" ] - -Transport type. - -#### when[].family - -> `enum` [ "inet", "inet4", "inet6", "unix" ] - -Address family. - -#### when[].source - -> `object` - -Source address. - -##### source.host - -> `string` - -Hostname or IP address. - -##### source.port - -> `integer` - -Port number. - -#### when[].destination - -> `object` - -Destination address. - -##### destination.host - -> `string` - -Hostname or IP address. - -##### destination.port - -> `integer` - -Port number. - -### routes[].exit\* - -> `string` - -Next binding when following this route. - -```yaml -routes: - - when: - ... - exit: echo_server -``` - ---- - -::: right -\* required -::: diff --git a/src/reference/config/bindings/binding-sse-kafka.md b/src/reference/config/bindings/binding-sse-kafka.md deleted file mode 100644 index 1e9c4116..00000000 --- a/src/reference/config/bindings/binding-sse-kafka.md +++ /dev/null @@ -1,193 +0,0 @@ ---- -shortTitle: sse-kafka -description: Zilla runtime sse-kafka binding -category: - - Binding -tag: - - Proxy ---- - -# sse-kafka Binding - -Zilla runtime sse-kafka binding. - -```yaml {2} -sse_kafka_proxy: - type: sse-kafka - kind: proxy - routes: - - when: - - path: /items - exit: kafka_cache_client - with: - topic: items-snapshots - event: - id: '["${base64(key)}","${etag}"]' -``` - -## Summary - -Defines a binding with `sse-kafka` support, with `proxy` behavior. - -The `proxy` kind `sse-kafka` binding adapts `sse` data streams into `kafka` data streams, so that `kafka` messages can be delivered to `sse` clients. - -Filtering can be performed by `kafka` message key, message headers, or a combination of both message key and headers, extracting the parameter values from the inbound `sse` path. - -Progress across `kafka` topic partitions is conveyed to the `sse` client via event `id` and when the stream is implicitly paused during `sse` client reconnect, the `last-event-id` header in the `sse` reconnect request contains the last received event `id` value, allowing the `sse` stream to resume reliable message delivery automatically. - -The event `id` can be configured to include the message `key` and `etag` of each message, avoiding the need to duplicate the key in the message body and making it suitable for integration with `http-kafka` binding's use of `etag` for conditional `if-match` operations. - -When a `kafka` tombstone (`null` value) message is received by the `sse-kafka` binding, it delivers a `delete` event to the `sse` client. This informs the client which specific message has been deleted by observing the message key from the `sse` `delete` event `id`. - -## Configuration - -:::: note Properties - -- [kind\*](#kind) -- [exit](#exit) -- [routes](#routes) -- [routes\[\].guarded](#routes-guarded) -- [routes\[\].when](#routes-when) - - [when\[\].path\*](#when-path) -- [routes\[\].exit\*](#routes-exit) -- [routes\[\].with](#routes-with) - - [with.topic\*](#with-topic) - - [with.filters](#with-filters) - - [filters\[\].key](#filters-key) - - [filters\[\].headers](#filters-headers) - - [with.event](#with-event) - - [event.id\*](#event-id) - -::: right -\* required -::: - -:::: - -### kind\* - -> `enum` [ "proxy" ] - -Behave as a `sse-kafka` `proxy`. - -### exit - -> `string` - -Default exit binding when no conditional routes are viable. - -```yaml -exit: kafka_cache_client -``` - -### routes - -> `array` of `object` - -Conditional `sse-kafka`-specific routes for adapting `sse` data streams to `kafka` data streams. - -```yaml -routes: - - when: - - path: /items - exit: kafka_cache_client - with: - topic: items-snapshots - event: - id: '["${base64(key)}","${etag}"]' -``` - -### routes[].guarded - -> `object` as named map of `string:string` `array` - -List of roles required by each named guard to authorize this route. - -```yaml -routes: - - guarded: - my_guard: - - read:items -``` - -### routes[].when - -> `array` of `object` - -List of conditions (any match) to match this route. -Read more: [When a route matches](../../../concepts/bindings.md#when-a-route-matches) - -```yaml -routes: - - when: - - path: /items -``` - -#### when[].path\* - -> `string` - -Path with optional embedded parameter names, such as `/{topic}`. - -### routes[].exit\* - -> `string` - -Next binding when following this route. - -```yaml -routes: - - when: - ... - exit: kafka_cache_client -``` - -### routes[].with - -> `object` - -Kafka parameters used when adapting `sse` data streams to `kafka` data streams. - -#### with.topic\* - -> `string` - -Topic name, optionally referencing path parameter such as `${params.topic}`. - -#### with.filters - -> `array` of `object` - -Kafka filters for matched route when adapting `sse` data streams to `kafka` data streams. - -List of criteria (any match). All specified headers and key must match for the combined criteria to match. - -##### filters[].key - -> `string` - -Message key, optionally referencing path parameter such as `${params.key}`. - -##### filters[].headers - -> `map` of `name: value` properties - -Message headers, with value optionally referencing path parameter such as `${params.headerX}`. - -#### with.event - -> `object` - -Defines the SSE event syntax used when delivering Kafka messages to SSE clients. - -##### event.id\* - -> `enum` [ `"${etag}"`, `"["${base64(key)}","${etag}"]"` ] | Default: `"${etag}"` - -Format of `id` field in `sse` `event` - ---- - -::: right -\* required -::: diff --git a/src/reference/config/bindings/binding-sse.md b/src/reference/config/bindings/binding-sse.md deleted file mode 100644 index 4c15c8ce..00000000 --- a/src/reference/config/bindings/binding-sse.md +++ /dev/null @@ -1,147 +0,0 @@ ---- -shortTitle: sse -description: Zilla runtime sse binding -category: - - Binding -tag: - - Server ---- - -# sse Binding - -Zilla runtime sse binding. - -```yaml {2} -sse_server: - type: sse - kind: server - exit: sse_kafka_proxy -``` - -## Summary - -Defines a binding with `Server Sent Events (sse)` protocol support, with `server` behavior. - -The `server` kind `sse` binding converts inbound `http` request-response streams into `sse` request-response streams, with optionally configured `retry` delay. - -Messages received on the `sse` response stream are encoded using `Server Sent Events` protocol, including support for custom `event` types and last event `id`. - -## Configuration - -:::: note Properties - -- [kind\*](#kind) -- [options](#options) -- [options.retry](#options-retry) -- [exit](#exit) -- [routes](#routes) -- [routes\[\].guarded](#routes-guarded) -- [routes\[\].when](#routes-when) - - [when\[\].path\*](#when-path) -- [routes\[\].exit\*](#routes-exit) - -::: right -\* required -::: - -:::: - -### kind\* - -> `enum` [ "client", "server" ] - -Behave as a `sse` `client` or `server`. - -### options - -> `object` - -`sse`-specific options. - -```yaml -options: - retry: 2000 -``` - -### options.retry - -> `integer` | Default: `2000` - -Retry delay (ms) - -### exit - -> `string` - -Default exit binding when no conditional routes are viable. - -```yaml -exit: sse_kafka_proxy -``` - -### routes - -> `array` of `object` - -Conditional `sse`-specific routes. - -```yaml -routes: - - guarded: - my_guard: - - read:items - when: - - path: /items - exit: sse_kafka_proxy -``` - -### routes[].guarded - -> `object` as named map of `string:string` `array` - -List of roles required by each named guard to authorize this route. - -```yaml -routes: - - guarded: - my_guard: - - read:items -``` - -### routes[].when - -> `array` of `object` - -List of conditions (any match) to match this route. -Read more: [When a route matches](../../../concepts/bindings.md#when-a-route-matches) - -```yaml -routes: - - when: - - path: /items -``` - -#### when[].path\* - -> `string` - -Path pattern. - -### routes[].exit\* - -> `string` - -Next binding when following this route. - -```yaml -routes: - - when: - ... - exit: sse_kafka_proxy -``` - ---- - -::: right -\* required -::: diff --git a/src/reference/config/bindings/binding-tcp.md b/src/reference/config/bindings/binding-tcp.md deleted file mode 100644 index b650d481..00000000 --- a/src/reference/config/bindings/binding-tcp.md +++ /dev/null @@ -1,151 +0,0 @@ ---- -shortTitle: tcp -description: Zilla runtime tcp binding -category: - - Binding -tag: - - Server ---- - -# tcp Binding - -Zilla runtime tcp binding. - -```yaml {2} -tcp_server: - type: tcp - kind: server - exit: echo_server - options: - host: 0.0.0.0 - port: 12345 -``` - -## Summary - -Defines a binding with `tcp` protocol support, with `server` or `client` behavior. - -The `server` kind `tcp` binding listens for inbound socket connections, producing higher level application streams for each remote `tcp` client. - -The `client` kind `tcp` binding receives inbound application streams and initiates outbound `tcp` network connections to a remote `tcp` server address. - -Conditional routes based on the hostname authority and network address mask are used to route these streams to an `exit` binding. - -## Configuration - -:::: note Properties - -- [kind\*](#kind) -- [options](#options) -- [options.host](#options-host) -- [options.port](#options-port) -- [exit](#exit) -- [routes](#routes) -- [routes\[\].guarded](#routes-guarded) -- [routes\[\].when](#routes-when) - - [when\[\].authority](#when-authority) - - [when\[\].cidr](#when-cidr) - - [when\[\].port](#when-port) -- [routes\[\].exit\*](#routes-exit) - -::: right -\* required -::: - -:::: - -### kind\* - -> `enum` [ "client", "server" ] - -Behave as a `tcp` `client` or `server`. - -### options - -> `object` - -`tcp`-specific options. - -```yaml -options: - host: 0.0.0.0 - port: 12345 -``` - -### options.host - -> `string` - -Hostname or IP address. - -### options.port - -> `integer` | `string` | `array` of `integer` | `array` of `string` - -Port number(s), including port number ranges. - -### exit - -> `string` - -Default exit binding when no conditional routes are viable, for kind `server` only. - -```yaml -exit: echo_server -``` - -### routes - -> `array` of `object` - -Conditional `tcp`-specific routes. - -### routes[].guarded - -> `object` as named map of `string:string` `array` - -List of roles required by each named guard to authorize this route. - -### routes[].when - -> `array` of `object` - -List of conditions (any match) to match this route. -Read more: [When a route matches](../../../concepts/bindings.md#when-a-route-matches) - -#### when[].authority - -> `string` - -Associated authority. - -#### when[].cidr - -> `string` - -CIDR mask. - -#### when[].port - -> `integer` | `string` | `array` of `integer` | `array` of `string` - -Port number(s), including port number ranges. - -### routes[].exit\* - -> `string` - -Next binding when following this route, for kind `server` only. - -```yaml -routes: - - when: - ... - exit: echo_server -``` - ---- - -::: right -\* required -::: diff --git a/src/reference/config/bindings/binding-tls.md b/src/reference/config/bindings/binding-tls.md deleted file mode 100644 index 8f8ba97d..00000000 --- a/src/reference/config/bindings/binding-tls.md +++ /dev/null @@ -1,248 +0,0 @@ ---- -shortTitle: tls -description: Zilla runtime tls binding -category: - - Binding -tag: - - Server ---- - -# tls Binding - -Zilla runtime tls binding. - -```yaml {2} -tls_server: - type: tls - kind: server - vault: server - options: - keys: - - localhost - sni: - - localhost - alpn: - - echo - routes: - - when: - - alpn: echo - exit: echo_server -``` - -## Summary - -Defines a binding with `tls` protocol support, with `server`, `client` or `proxy` behavior. - -## Server behavior - -The `server` kind tls binding decodes encrypted TLS protocol on the inbound network stream, producing higher level cleartext application streams for each request. - -Certificates and keys required to complete the TLS handshake are provided by a `vault` referenced in the binding configuration. - -Conditional routes based on `tls` hostname authority or negotiated ALPN protocol are used to route these streams to an `exit` binding. - -## Client behavior - -The `client` kind `tls` binding receives inbound application streams and encodes each as an encrypted network stream via TLS protocol. - -Certificates and keys required to complete the TLS handshake are provided by a `vault` referenced in the binding configuration. - -Conditional routes based on `tls` hostname authority or negotiated ALPN protocol are used to route these streams to an `exit` binding. - -## Proxy behavior - -The `proxy` kind `tls` binding detects `ClientHello` `server_name` extension to provide TLS virtual hosting by routing based on server name. - -A `vault` is not required to proxy TLS protocol as the handshake is only observed read-only as it routes through the `tls` `proxy` binding. - -## Configuration - -:::: note Properties - -- [kind\*](#kind) -- [vault](#vault) -- [options](#options) -- [options.version](#options-version) -- [options.keys](#options-keys) -- [options.trust](#options-trust) -- [options.signers](#options-signers) -- [options.trustcacerts](#options-trustcacerts) -- [options.sni\*](#options-sni) -- [options.alpn](#options-alpn) -- [options.mutual](#options-mutual) -- [exit](#exit) -- [routes](#routes) -- [routes\[\].guarded](#routes-guarded) -- [routes\[\].when](#routes-when) - - [when\[\].authority](#when-authority) - - [when\[\].alpn](#when-alpn) - - [when\[\].port](#when-port) -- [routes\[\].exit\*](#routes-exit) - -::: right -\* required -::: - -:::: - -### kind\* - -> `enum` [ "client", "server", "proxy" ] - -Behave as a `tls` `client`, `server` or `proxy`. - -### vault - -> `string` - -Vault name. - -### options - -> `object` - -`tls`-specific options. - -```yaml -options: - keys: - - localhost - sni: - - localhost - alpn: - - echo -``` - -### options.version - -> `string` - -Protocol version. - -### options.keys - -> `array` of `string` - -A list of reference names for the Vault key. - -### options.trust - -> `array` of `string` - -A list of reference names for the Vault certificate. - -### options.signers - -> `array` of `string` - -A list of reference names for the Vault signer certificate. - -### options.trustcacerts - -> `boolean` | Default: `true` when trust is `null` - -Trust CA certificates. - -### options.sni\* - -> `array` of `string` - -A list of the Server Name Indications. - -### options.alpn - -> `array` of `string` - -Application protocols. - -### options.mutual - -> `enum` [ "required", "requested", "none" ] | Default: `"none"` - -Mutual authentication - -### exit - -> `string` - -Default exit binding when no conditional routes are viable. - -```yaml -exit: echo_server -``` - -### routes - -> `array` of `object` - -Conditional `tls`-specific routes. - -```yaml -routes: - - when: - - alpn: echo - exit: echo_server -``` - -### routes[].guarded - -> `object` as named map of `string:string` `array` - -List of roles required by each named guard to authorize this route. - -```yaml -routes: - - guarded: - my_guard: - - read:items -``` - -### routes[].when - -> `array` of `object` - -List of conditions (any match) to match this route. -Read more: [When a route matches](../../../concepts/bindings.md#when-a-route-matches) - -```yaml -routes: - - when: - - alpn: echo -``` - -#### when[].authority - -> `string` - -Associated authority. - -#### when[].alpn - -> `string` - -Application protocol. - -#### when[].port - -> `integer` | `string` | `array` of `integer` | `array` of `string` - -Port number(s), including port number ranges. - -### routes[].exit\* - -> `string` - -Next binding when following this route. - -```yaml -routes: - - when: - ... - exit: echo_server -``` - ---- - -::: right -\* required -::: diff --git a/src/reference/config/bindings/binding-ws.md b/src/reference/config/bindings/binding-ws.md deleted file mode 100644 index cf74c245..00000000 --- a/src/reference/config/bindings/binding-ws.md +++ /dev/null @@ -1,199 +0,0 @@ ---- -shortTitle: ws -description: Zilla runtime ws binding -category: - - Binding -tag: - - Server ---- - -# ws Binding - -Zilla runtime ws binding. - -```yaml {2} -ws_server: - type: ws - kind: server - routes: - - when: - - protocol: echo - exit: echo_server -``` - -## Summary - -Defines a binding with `WebSockets` protocol support, with `server` or `client` behavior. - -## Server behavior - -The `server` kind `ws` binding converts inbound `http` request-response streams into `ws` full-duplex streams. - -Conditional routes based on `ws` scheme, authority, path or negotiated subprotocol are used to route these streams to an `exit` binding. - -## Client behavior - -The `client` kind `ws` binding converts inbound `ws` full duplex streams into `http` request-response streams. - -Conditional routes based on `ws` scheme, authority, path or negotiated subprotocol are used to route these streams to an `exit` binding. - -## Configuration - -:::: note Properties - -- [kind\*](#kind) -- [options](#options) -- [options.defaults](#options-defaults) - - [defaults.protocol](#defaults-protocol) - - [defaults.scheme](#defaults-scheme) - - [defaults.authority](#defaults-authority) - - [defaults.path](#defaults-path) -- [exit](#exit) -- [routes](#routes) -- [routes\[\].guarded](#routes-guarded) -- [routes\[\].when](#routes-when) - - [when\[\].protocol](#when-protocol) - - [when\[\].scheme](#when-scheme) - - [when\[\].authority](#when-authority) - - [when\[\].path](#when-path) -- [routes\[\].exit\*](#routes-exit) - -::: right -\* required -::: - -:::: - -### kind\* - -> `enum` [ "client", "server" ] - -Behave as a `ws` `client` or `server`. - -### options - -> `object` - -`ws`-specific options. - -### options.defaults - -> `object` - -Defaults. - -#### defaults.protocol - -> `string` - -Subprotocol. - -#### defaults.scheme - -> `string` - -Scheme. - -#### defaults.authority - -> `string` - -Authority. - -#### defaults.path - -> `string` - -Path. - -### exit - -> `string` - -Default exit binding when no conditional routes are viable. - -```yaml -exit: echo_server -``` - -### routes - -> `array` of `object` - -Conditional `ws`-specific routes. - -```yaml -routes: - - when: - - protocol: echo - exit: echo_server -``` - -### routes[].guarded - -> `object` as named map of `string:string` `array` - -List of roles required by each named guard to authorize this route. - -```yaml -routes: - - guarded: - my_guard: - - read:items -``` - -### routes[].when - -> `array` of `object` - -List of conditions (any match) to match this route. -Read more: [When a route matches](../../../concepts/bindings.md#when-a-route-matches) - -```yaml -routes: - - when: - - protocol: echo -``` - -#### when[].protocol - -> `string` - -Subprotocol pattern. - -#### when[].scheme - -> `string` - -Scheme pattern. - -#### when[].authority - -> `string` - -Authority pattern. - -#### when[].path - -> `string` - -Path pattern. - -### routes[].exit\* - -> `string` - -Next binding when following this route. - -```yaml -routes: - - when: - ... - exit: echo_server -``` - ---- - -::: right -\* required -::: diff --git a/src/reference/config/bindings/echo/.partials/server.yaml b/src/reference/config/bindings/echo/.partials/server.yaml new file mode 100644 index 00000000..61311f0b --- /dev/null +++ b/src/reference/config/bindings/echo/.partials/server.yaml @@ -0,0 +1,3 @@ + echo_server: + type: echo + kind: server diff --git a/src/reference/config/bindings/echo/README.md b/src/reference/config/bindings/echo/README.md new file mode 100644 index 00000000..351ad22c --- /dev/null +++ b/src/reference/config/bindings/echo/README.md @@ -0,0 +1,26 @@ +--- +redirectFrom: /reference/config/bindings/binding-echo.html +dir: + collapsible: false + link: true +shortTitle: echo +category: + - Binding +tag: + - echo + - server +--- + +# echo Binding + +This binding supports the `echo` protocol and is run with the `server` behavior. It reads inbound messages and writes it back to the sender. + +## server + +> [Full config](./server.md) + +Behaves as an `echo` `server`. + +```yaml {3} + +``` diff --git a/src/reference/config/bindings/echo/server.md b/src/reference/config/bindings/echo/server.md new file mode 100644 index 00000000..3b06980e --- /dev/null +++ b/src/reference/config/bindings/echo/server.md @@ -0,0 +1,15 @@ +--- +shortTitle: server +--- + +# echo server + +The echo server binding supports the `echo` protocol and is run with the `server` behavior. It reads inbound messages and writes it back to the sender. + +```yaml {3} + +``` + +## Configuration (\* required) + + diff --git a/src/reference/config/bindings/fan/.partials/server.yaml b/src/reference/config/bindings/fan/.partials/server.yaml new file mode 100644 index 00000000..2343cad1 --- /dev/null +++ b/src/reference/config/bindings/fan/.partials/server.yaml @@ -0,0 +1,4 @@ + fan_server: + type: fan + kind: server + exit: echo_server diff --git a/src/reference/config/bindings/fan/README.md b/src/reference/config/bindings/fan/README.md new file mode 100644 index 00000000..f492853c --- /dev/null +++ b/src/reference/config/bindings/fan/README.md @@ -0,0 +1,26 @@ +--- +redirectFrom: /reference/config/bindings/binding-fan.html +dir: + collapsible: false + link: true +shortTitle: fan +category: + - Binding +tag: + - fan + - server +--- + +# fan Binding + +Defines a binding with `fan-in` and `fan-out` support, with `server` behavior. + +## server + +> [Full config](./server.md) + +Behave as an `fan-in` and `fan-out` `server`. The `server` kind `fan` binding performs fan-in of data on all inbound network streams, grouping them into a single application stream. Then data received from the application stream is fanned-out to all network streams in the group. + +```yaml {3} + +``` diff --git a/src/reference/config/bindings/fan/server.md b/src/reference/config/bindings/fan/server.md new file mode 100644 index 00000000..efa39265 --- /dev/null +++ b/src/reference/config/bindings/fan/server.md @@ -0,0 +1,25 @@ +--- +shortTitle: server +--- + +# fan server + +The fan server binding behaves as an `fan-in` and `fan-out` `server`. The `server` kind `fan` binding performs fan-in of data on all inbound network streams, grouping them into a single application stream. Then data received from the application stream is fanned-out to all network streams in the group. + +```yaml {3} + +``` + +## Configuration (\* required) + +### exit + +> `string` + +Default exit binding. When the `exit` is an `echo` server binding, the combination reflects all inbound data from each client to all clients. + +```yaml +exit: echo_server +``` + + diff --git a/src/reference/config/bindings/filesystem/.partials/options.md b/src/reference/config/bindings/filesystem/.partials/options.md new file mode 100644 index 00000000..54445ceb --- /dev/null +++ b/src/reference/config/bindings/filesystem/.partials/options.md @@ -0,0 +1,23 @@ +### options + +> `object` + +The `filesystem` specific options. + +```yaml +options: + location: web/ + simlinks: follow +``` + +#### options.location + +> `string` + +File system URI or directory name with trailing slash. + +#### options.symlinks + +> `enum` [ `follow`, `ignore` ] | Default: `ignore` + +How to treat symbolic links. diff --git a/src/reference/config/bindings/filesystem/.partials/server.yaml b/src/reference/config/bindings/filesystem/.partials/server.yaml new file mode 100644 index 00000000..9844f778 --- /dev/null +++ b/src/reference/config/bindings/filesystem/.partials/server.yaml @@ -0,0 +1,6 @@ + filesystem_server: + type: filesystem + kind: server + options: + location: web/ + simlinks: follow diff --git a/src/reference/config/bindings/filesystem/README.md b/src/reference/config/bindings/filesystem/README.md new file mode 100644 index 00000000..bcb97830 --- /dev/null +++ b/src/reference/config/bindings/filesystem/README.md @@ -0,0 +1,26 @@ +--- +redirectFrom: /reference/config/bindings/binding-filesystem.html +dir: + collapsible: false + link: true +shortTitle: filesystem +category: + - Binding +tag: + - filesystem + - server +--- + +# filesystem Binding + +The `server` kind `filesystem` binding provides access to files and directories on the local filesystem, optionally following symbolic links. It behaves as a web server when combined with `tcp,` `tls`, `http` and `http-filesystem` bindings. + +## server + +> [Full config](./server.md) + +Behave as a `filesystem` `server`. + +```yaml {3} + +``` diff --git a/src/reference/config/bindings/filesystem/server.md b/src/reference/config/bindings/filesystem/server.md new file mode 100644 index 00000000..ddb58b98 --- /dev/null +++ b/src/reference/config/bindings/filesystem/server.md @@ -0,0 +1,16 @@ +--- +shortTitle: server +--- + +# filesystem server + +The filesystem server binding provides access to files and directories on the local filesystem, optionally following symbolic links.It behaves as a web server when combined with `tcp,` `tls`, `http` and `http-filesystem` bindings. + +```yaml {3} + +``` + +## Configuration (\* required) + + + diff --git a/src/reference/config/bindings/grpc-kafka/.partials/options.md b/src/reference/config/bindings/grpc-kafka/.partials/options.md new file mode 100644 index 00000000..050ef797 --- /dev/null +++ b/src/reference/config/bindings/grpc-kafka/.partials/options.md @@ -0,0 +1,86 @@ +### options + +> `object` + +The `grpc-kafka` specific options. + +```yaml +options: + idempotency: + metadata: idempotency-key + reliability: + field: 32767 + metadata: last-message-id + correlation: + headers: + service: zilla:service + method: zilla:method + correlation-id: zilla:correlation-id + reply-to: zilla:reply-to +``` + +#### options.idempotency + +> `object` + +Metadata header used to specify the idempotency key when adapting `grpc` request-response streams to `kafka` topic streams. + +#### idempotency.metadata + +> `string` | Default: `idempotency-key` + +The `grpc` metadata header name for idempotency key. + +#### options.reliability + +> `object` + +Properties used when handling stream recovery. + +#### reliability.field + +> `integer` | Default: `32767` Minimum: `1` Maximum: `536870911` + +The `grpc` unknown field number to send the `message-id`. + +#### reliability.metadata + +> `string` | Default: `last-message-id` + +The `grpc` metadata header name for the last `message-id` seen when resuming a stream. + +#### options.correlation + +> `object` + +Kafka request message headers injected when adapting `grpc` request-response streams to `kafka` topic streams. + +#### correlation.headers\* + +> `object` + +Kafka request message reply to and correlation id header names injected when adapting `grpc` request-response streams to `kafka` topic streams. + +#### headers.service + +> `string` | Default: `zilla:service` + +Kafka header name for `grpc` service. + +#### headers.method + +> `string` | Default: `zilla:method` + +Kafka header name for `grpc` method. + +#### headers.correlation-id + +> `string` | Default: `zilla:correlation-id` + +Kafka header name for request-response correlation identifier. + +#### headers.reply-to + +> `string` | Default: `zilla:reply-to` + +Kafka header name for reply-to topic. diff --git a/src/reference/config/bindings/grpc-kafka/.partials/proxy.yaml b/src/reference/config/bindings/grpc-kafka/.partials/proxy.yaml new file mode 100644 index 00000000..f7aa6652 --- /dev/null +++ b/src/reference/config/bindings/grpc-kafka/.partials/proxy.yaml @@ -0,0 +1,45 @@ + grpc_kafka_proxy: + type: grpc-kafka + kind: proxy + options: + idempotency: + metadata: idempotency-key + reliability: + field: 32767 + metadata: last-message-id + correlation: + headers: + service: zilla:service + method: zilla:method + correlation-id: zilla:correlation-id + reply-to: zilla:reply-to + routes: + - when: + - method: example.FanoutService/* + metadata: + custom-text: custom value + custom-binary: + base64: Y3VzdG9tIHZhbHVl + exit: kafka_cache_client + with: + capability: fetch + topic: messages + filters: + key: custom-key + headers: + custom-text: custom-value + - when: + - method: example.EchoService/* + metadata: + custom-text: custom value + custom-binary: + base64: Y3VzdG9tIHZhbHVl + exit: kafka_cache_client + with: + capability: produce + topic: requests + acks: leader_only + key: custom-key + overrides: + custom-text: custom-value + reply-to: responses diff --git a/src/reference/config/bindings/grpc-kafka/.partials/routes.md b/src/reference/config/bindings/grpc-kafka/.partials/routes.md new file mode 100644 index 00000000..3a6269b0 --- /dev/null +++ b/src/reference/config/bindings/grpc-kafka/.partials/routes.md @@ -0,0 +1,224 @@ +### routes\* + +> `array` of `object` + +Conditional `grpc-kafka` specific routes. + +```yaml +routes: + - guarded: + my_guard: + - read:messages + when: + - service: example.FanoutService + metadata: + custom-text: custom value + custom-binary: + base64: Y3VzdG9tIHZhbHVl + exit: kafka_cache_client + with: + capability: fetch + topic: messages + filters: + key: custom-key + headers: + custom-text: custom-value + - guarded: + my_guard: + - echo:messages + when: + - method: example.EchoService/* + metadata: + custom-text: custom value + custom-binary: + base64: Y3VzdG9tIHZhbHVl + exit: kafka_cache_client + with: + capability: produce + topic: requests + acks: leader_only + key: custom-key + overrides: + custom-text: custom-value + reply-to: responses +``` + +#### routes[].guarded + +> `object` as map of named `array` of `string` + +Roles required by named guard. + +```yaml +routes: + - guarded: + my_guard: + - read:messages +``` + +#### routes[].when + +> `array` of `object` + +List of conditions (any match) to match this route when adapting `grpc` request-response streams to `kafka` topic streams. +Read more: [When a route matches](../../../../../concepts/bindings.md#when-a-route-matches) + +```yaml +routes: + - when: + - method: example.EchoService/* + metadata: + custom-text: custom value + custom-binary: + base64: Y3VzdG9tIHZhbHVl +``` + +#### when[].method + +> `string` | Pattern: `^(?[^/]+)/(?[^/]+)` + +Pattern matching the fully qualified name of a `grpc` service method, in the format `/` allowing wildcard `*` for the method to indicate any method. + +#### when[].metadata + +> `object` as map of named `string` or `object` properties + +Metadata header name value pairs (all match). + +Each metadata header value can be `string` or `object` with `base64` property. + +#### metadata.base64 + +> `string` + +Base64 encoded value for binary metadata header. + +#### routes[].exit + +> `string` + +Next binding when following this route. + +```yaml +routes: + - when: + ... + exit: kafka_cache_client +``` + +#### routes[].with\* + +> `object` + +Defines the route with the [fetch](#with-capability-fetch) capability. + +```yaml +with: + capability: fetch +``` + +Defines the route with the [produce](#with-capability-produce) capability. + +```yaml +with: + capability: produce +``` + +#### with.capability: fetch\* + +> `const` + +Kafka parameters for matched route when adapting `grpc` request-response streams to `kafka` topic fetch streams. + +Routes with `fetch` capability map `grpc` `Empty` requests to a `kafka` topic, supporting filtered retrieval of messages with a specific key or headers, or unfiltered retrieval of all messages in the topic merged into a unified response. + +Filtering can be performed by `kafka` message key, message headers, or a combination of both message key and headers. + +Reliable message delivery is achieved by capturing the value of the `reliability` `field` injected into each response stream message at the `grpc` client, and replaying the value via the `reliability` `metadata` header when reestablishing the stream with a new `grpc` request. + +```yaml +with: + capability: fetch + topic: messages + filters: + key: custom-key + headers: + custom-text: custom-value +``` + +#### with.topic\* + +> `string` + +The name of a Kafka topic. + +#### with.filters + +> `array` of `object` + +List of criteria (any match) to this filter. Kafka filters for matched route when adapting `grpc` request-response streams to `kafka` topic fetch streams. All specified headers and key must match for the combined criteria to match. + +#### filters[].key + +> `string` + +The filter criteria for the Kafka message key. + +#### filters[].headers + +> `object` as map of named `string` properties + +The filter criteria for the Kafka message headers. + +#### with.capability: produce\* + +> `const` + +Kafka parameters for matched route when adapting `grpc` request-response streams to `kafka` topic produce streams. + +Routes with `produce` capability map any `grpc` request-response to a correlated stream of `kafka` messages. The `grpc` request message(s) are sent to a `requests` topic, with a `zilla:correlation-id` header. When the request message(s) are received and processed by the `kafka` `requests` topic consumer, it produces response message(s) to the `responses` topic, with the same `zilla:correlation-id` header to correlate the response. + +Requests including an `idempotency-key` `grpc` metadata header can be replayed and safely receive the same response. This requires the `kafka` consumer to detect and ignore the duplicate request with the same `idempotency-key` and `zilla:correlation-id`. + +```yaml +with: + capability: produce + topic: requests + acks: leader_only + key: custom-key + overrides: + custom-text: custom-value + reply-to: responses +``` + + +#### with.topic\* + +> `string` + +The name of a Kafka topic for requests. + + +#### with.acks + +> `enum` [ `none`, `leader_only`, `in_sync_replicas` ] | Default: `in_sync_replicas` + +Kafka acknowledgment mode + +#### with.key + +> `string` + +The Kafka message key to include with each message. + +#### with.overrides + +> `object` as map of named `string` properties + +The Kafka message headers to inject with each message. + +#### with.reply-to\* + +> `string` + +The name of the Kafka topic for correlated responses. diff --git a/src/reference/config/bindings/grpc-kafka/README.md b/src/reference/config/bindings/grpc-kafka/README.md new file mode 100644 index 00000000..7954a6b6 --- /dev/null +++ b/src/reference/config/bindings/grpc-kafka/README.md @@ -0,0 +1,26 @@ +--- +redirectFrom: /reference/config/bindings/binding-grpc-kafka.html +dir: + collapsible: false + link: true +shortTitle: grpc-kafka +category: + - Binding +tag: + - grpc-kafka + - proxy +--- + +# grpc-kafka Binding + +Zilla runtime grpc-kafka binding. + +## proxy + +> [Full Config](./proxy.md) + +Behave as an `grpc-kafka` `proxy`. + +```yaml {3} + +``` diff --git a/src/reference/config/bindings/grpc-kafka/proxy.md b/src/reference/config/bindings/grpc-kafka/proxy.md new file mode 100644 index 00000000..4f0f50e3 --- /dev/null +++ b/src/reference/config/bindings/grpc-kafka/proxy.md @@ -0,0 +1,17 @@ +--- +shortTitle: proxy +--- + +# grpc-kafka proxy + +The grpc-kafka proxy binding adapts `grpc` request-response streams to `kafka` topic streams. + +```yaml {3} + +``` + +## Configuration (\* required) + + + + diff --git a/src/reference/config/bindings/grpc/.partials/client.yaml b/src/reference/config/bindings/grpc/.partials/client.yaml new file mode 100644 index 00000000..ee2cf3ff --- /dev/null +++ b/src/reference/config/bindings/grpc/.partials/client.yaml @@ -0,0 +1,4 @@ + grpc_server: + type: grpc + kind: client + exit: tcp_server diff --git a/src/reference/config/bindings/grpc/.partials/options.md b/src/reference/config/bindings/grpc/.partials/options.md new file mode 100644 index 00000000..e69de29b diff --git a/src/reference/config/bindings/grpc/.partials/routes.md b/src/reference/config/bindings/grpc/.partials/routes.md new file mode 100644 index 00000000..5978fd8d --- /dev/null +++ b/src/reference/config/bindings/grpc/.partials/routes.md @@ -0,0 +1,83 @@ + +### routes\* + +> `array` of `object` + +Conditional `grpc` specific routes. + +```yaml +routes: + - guarded: + my_guard: + - echo:messages + when: + - method: example.EchoService/* + metadata: + custom-text: custom value + custom-binary: + base64: Y3VzdG9tIHZhbHVl + exit: echo_server +``` + +#### routes[].guarded + +> `object` as map of named `array` of `string` + +Roles required by named guard. + +```yaml +routes: + - guarded: + my_guard: + - echo:messages +``` + +#### routes[].when + +> `array` of `object` + +List of conditions (any match) to match this route. +Read more: [When a route matches](../../../../../concepts/bindings.md#when-a-route-matches) + +```yaml +routes: + when: + - method: example.EchoService/* + metadata: + custom-text: custom value + custom-binary: + base64: Y3VzdG9tIHZhbHVl +``` + +#### when[].method + +> `string` + +gRPC service method name, such as `example.EchoService/EchoUnary`, or service method pattern such as `example.EchoService/*`. + +#### when[].metadata + +> `object` as map of named `string` or `object` properties + +Metadata header name value pairs (all match). + +Each metadata header value can be `string` or `object` with `base64` property. + +#### metadata.base64 + +> `string` + +Base64 encoded value for binary metadata header. + +#### routes[].exit + +> `string` + +Routed exit binding when conditional route matches. + +```yaml +routes: + - when: + ... + exit: echo_server +``` diff --git a/src/reference/config/bindings/grpc/.partials/server.yaml b/src/reference/config/bindings/grpc/.partials/server.yaml new file mode 100644 index 00000000..15c414bd --- /dev/null +++ b/src/reference/config/bindings/grpc/.partials/server.yaml @@ -0,0 +1,14 @@ + grpc_server: + type: grpc + kind: server + catalog: + host_filesystem: + - subject: echo + routes: + - when: + - method: example.EchoService/* + metadata: + custom-text: custom value + custom-binary: + base64: Y3VzdG9tIHZhbHVl + exit: echo_server diff --git a/src/reference/config/bindings/grpc/README.md b/src/reference/config/bindings/grpc/README.md new file mode 100644 index 00000000..325237d9 --- /dev/null +++ b/src/reference/config/bindings/grpc/README.md @@ -0,0 +1,53 @@ +--- +redirectFrom: /reference/config/bindings/binding-grpc.html +dir: + collapsible: false + link: true +shortTitle: grpc +category: + - Binding +tag: + - grpc + - server + - client +--- + +# grpc Binding + +Defines a binding with `grpc` protocol support, with `server` or `client` behavior. + +## server + +The `server` kind `grpc` binding adapts `http` request-response streams to `grpc` request-response streams, with support for both `application/grpc+proto` and `application/grpc-web+proto` content types. + +> [Full Config](./server.md) + +```yaml {3} +grpc_server: + type: grpc + kind: server + catalog: + host_filesystem: + - subject: echo + routes: + - when: + - method: example.EchoService/* + metadata: + custom-text: custom value + custom-binary: + base64: Y3VzdG9tIHZhbHVl + exit: echo_server +``` + +## client + +The `client` kind `grpc` binding adapts `grpc` request-response streams to `http` request-response streams. + +> [Full Config](./client.md) + +```yaml {3} +grpc_server: + type: grpc + kind: client + exit: tcp_server +``` diff --git a/src/reference/config/bindings/grpc/client.md b/src/reference/config/bindings/grpc/client.md new file mode 100644 index 00000000..bc327365 --- /dev/null +++ b/src/reference/config/bindings/grpc/client.md @@ -0,0 +1,17 @@ +--- +shortTitle: client +--- + +# grpc client + +The grpc client binding adapts `grpc` request-response streams to `http` request-response streams. + +```yaml + +``` + +## Configuration (\* required) + + + + diff --git a/src/reference/config/bindings/grpc/server.md b/src/reference/config/bindings/grpc/server.md new file mode 100644 index 00000000..841e3a47 --- /dev/null +++ b/src/reference/config/bindings/grpc/server.md @@ -0,0 +1,42 @@ +--- +shortTitle: server +--- + +# grpc server + +The grpc server binding adapts `http` request-response streams to `grpc` request-response streams, with support for both `application/grpc+proto` and `application/grpc-web+proto` content types. + +```yaml {4-6,9-13} + +``` + +## Configuration (\* required) + +### catalog + +> `object` as map of named `array` + +To map defined catalog for schema retrieval based on catalog specific parameters. + +```yaml +catalog: + my_catalog: + - subject: http +``` + +#### catalog[].subject\* + +> `string` + +Unique identifier for schema categorization in the catalog. + +#### catalog[].version + +> `string` | Default: `latest` + +Specific iteration or version of a registered schema in the defined catalog. + + + + + diff --git a/src/reference/config/bindings/http-filesystem/.partials/proxy.yaml b/src/reference/config/bindings/http-filesystem/.partials/proxy.yaml new file mode 100644 index 00000000..ce9f7b5b --- /dev/null +++ b/src/reference/config/bindings/http-filesystem/.partials/proxy.yaml @@ -0,0 +1,9 @@ + http_filesystem_proxy: + type: http-filesystem + kind: proxy + routes: + - when: + - path: /{path} + exit: filesystem_server + with: + path: ${params.path} diff --git a/src/reference/config/bindings/http-filesystem/.partials/routes.md b/src/reference/config/bindings/http-filesystem/.partials/routes.md new file mode 100644 index 00000000..46f0e59a --- /dev/null +++ b/src/reference/config/bindings/http-filesystem/.partials/routes.md @@ -0,0 +1,71 @@ +### routes + +> `array` of `object` + +Conditional `http-kafka` specific routes. + +```yaml +routes: + - when: + - path: /{path} + exit: filesystem_server + with: + path: ${params.path} +``` + +#### routes[].guarded + +> `object` as map of named `array` of `string` + +List of roles required by each named guard to authorize this route. + +```yaml +routes: + - guarded: + my_guard: + - read:items +``` + +#### routes[].when + +> `array` of `object` + +List of conditions (any match) to match this route when adapting `http` data streams into `filesystem` data streams. +Read more: [When a route matches](../../../../../concepts/bindings.md#when-a-route-matches) + +```yaml +routes: + - when: + - path: /{path} +``` + +#### when[].path + +> `string` + +Path with optional embedded parameter names, such as `/{path}`. + +#### routes[].exit + +> `string` + +Next binding when following this route. + +```yaml +routes: + - when: + ... + exit: filesystem_server +``` + +#### routes[].with + +> `object` + +Filesystem parameters used when adapting `http` data streams into `filesystem` data streams. + +#### with.path\* + +> `string` + +Topic name, optionally referencing path parameter such as `${params.path}`. diff --git a/src/reference/config/bindings/http-filesystem/README.md b/src/reference/config/bindings/http-filesystem/README.md new file mode 100644 index 00000000..83675148 --- /dev/null +++ b/src/reference/config/bindings/http-filesystem/README.md @@ -0,0 +1,28 @@ +--- +redirectFrom: /reference/config/bindings/binding-http-filesystem.html +dir: + collapsible: false + link: true +shortTitle: http-filesystem +category: + - Binding +tag: + - http-filesystem + - proxy +--- + +# http-filesystem Binding + +Defines a binding with `http-filesystem` support, with `proxy` behavior. + +## proxy + +> [Full config](./proxy.md) + +The `proxy` kind `http-filesystem` binding adapts `http` data streams into `filesystem` data streams by mapping the path from an inbound `http` `GET` request into a filesystem relative path. + +Behaves as a web server when combined with `tcp,` `tls`, `http` and `filesystem` bindings. + +```yaml {3} + +``` diff --git a/src/reference/config/bindings/http-filesystem/proxy.md b/src/reference/config/bindings/http-filesystem/proxy.md new file mode 100644 index 00000000..511a8955 --- /dev/null +++ b/src/reference/config/bindings/http-filesystem/proxy.md @@ -0,0 +1,19 @@ +--- +shortTitle: proxy +--- + +# http-filesystem proxy + +The http-filesystem proxy binding adapts `http` data streams into `filesystem` data streams by mapping the path from an inbound `http` `GET` request into a filesystem relative path. + +Behaves as a web server when combined with `tcp,` `tls`, `http` and `filesystem` bindings. + +```yaml {3} + +``` + +## Configuration (\* required) + + + + diff --git a/src/reference/config/bindings/http-kafka/.partials/options.md b/src/reference/config/bindings/http-kafka/.partials/options.md new file mode 100644 index 00000000..986f7d75 --- /dev/null +++ b/src/reference/config/bindings/http-kafka/.partials/options.md @@ -0,0 +1,51 @@ +### options + +> `object` + +`http-kafka` specific options. + +```yaml +options: + idempotency: + header: idempotency-key + correlation: + headers: + reply-to: zilla:reply-to + correlation-id: zilla:correlation-id +``` + +#### options.idempotency + +> `object` + +HTTP request header used to specify the idempotency key. + +#### idempotency.header\* + +> `string` | Default: `idempotency-key` + +HTTP request header name for idempotency key. + +#### options.correlation + +> `object` + +Kafka request message headers injected. + +#### correlation.headers\* + +> `object` + +Kafka request message reply to and correlation id header names injected. + +#### headers.reply-to + +> `string` | Default: `zilla:reply-to` + +Kafka header name for reply-to topic. + +#### headers.correlation-id + +> `string` | Default: `zilla:correlation-id` + +Kafka header name for request-response correlation identifier. diff --git a/src/reference/config/bindings/http-kafka/.partials/proxy.yaml b/src/reference/config/bindings/http-kafka/.partials/proxy.yaml new file mode 100644 index 00000000..43f6b104 --- /dev/null +++ b/src/reference/config/bindings/http-kafka/.partials/proxy.yaml @@ -0,0 +1,36 @@ + http_kafka_proxy: + type: http-kafka + kind: proxy + routes: + - when: + - method: GET + path: /items + exit: kafka_cache_client + with: + capability: fetch + topic: items-snapshots + merge: + content-type: application/json + - when: + - method: GET + path: /items/{id} + exit: kafka_cache_client + with: + capability: fetch + topic: items-snapshots + filters: + - key: ${params.id} + - when: + - method: PUT + path: /items/{id} + - method: GET + path: /items/{id};cid={correlationId} + exit: kafka_cache_client + with: + capability: produce + topic: items-requests + acks: leader_only + key: ${params.id} + reply-to: items-responses + async: + location: /items/${params.id};cid=${correlationId} diff --git a/src/reference/config/bindings/binding-http-kafka.md b/src/reference/config/bindings/http-kafka/.partials/routes.md similarity index 57% rename from src/reference/config/bindings/binding-http-kafka.md rename to src/reference/config/bindings/http-kafka/.partials/routes.md index d43d93ba..2fcf33f7 100644 --- a/src/reference/config/bindings/binding-http-kafka.md +++ b/src/reference/config/bindings/http-kafka/.partials/routes.md @@ -1,188 +1,8 @@ ---- -shortTitle: http-kafka -description: Zilla runtime http-kafka binding -category: - - Binding -tag: - - Proxy ---- - - -# http-kafka Binding - -Zilla runtime http-kafka binding. - -```yaml {2} -http_kafka_proxy: - type: http-kafka - kind: proxy - routes: - - when: - - method: GET - path: /items - exit: kafka_cache_client - with: - capability: fetch - topic: items-snapshots - merge: - content-type: application/json - - when: - - method: GET - path: /items/{id} - exit: kafka_cache_client - with: - capability: fetch - topic: items-snapshots - filters: - - key: ${params.id} - - when: - - method: PUT - path: /items/{id} - - method: GET - path: /items/{id};cid={correlationId} - exit: kafka_cache_client - with: - capability: produce - topic: items-requests - acks: leader_only - key: ${params.id} - reply-to: items-responses - async: - location: /items/${params.id};cid=${correlationId} -``` - -## Summary - -The `proxy` kind `http-kafka` binding adapts `http` request-response streams to `kafka` topic streams. - -## Fetch capability - -Routes with `fetch` capability map `http` `GET` requests to a `kafka` log-compacted topic, supporting filtered retrieval of messages with a specific key, or unfiltered retrieval of all messages with distinct keys in the topic merged into a unified response. - -Filtering can be performed by `kafka` message key, message headers, or a combination of both message key and headers, extracting the parameter values from the inbound `http` request path. - -Status `200` `http` responses include an `etag` header that can be used with `if-none-match` for subsequent conditional `GET` requests to check for updates. Rather than polling, `http` requests can also include the `prefer: wait=N` header to wait a maximum of `N` seconds before responding with `304` if not modified. When a new message arrives in the topic that would modify the response, then all `prefer: wait=N` clients receive the response immediately. - -## Produce capability - -Routes with `produce` capability map any `http` request-response to a correlated pair of `kafka` messages. The `http` request message is sent to a `requests` topic, with a `zilla:correlation-id` header. When the request message received and processed by the `kafka` `requests` topic consumer, it produces a response message to the `responses` topic, with the same `zilla:correlation-id` header to correlate the response. - -Requests including an `idempotency-key` `http` header can be replayed and safely receive the same response. This requires the `kafka` consumer to detect and ignore the duplicate request with the same `idempotency-key` and `zilla:correlation-id`. - -Specifying `async` allows clients to include a `prefer: respond-async` header in the `http` request to receive `202 Accepted` response with `location` response header. - -A corresponding `routes[].when` object with matching `GET` method and `location` path is also required for follow up `GET` requests to return the same response as would have been returned if `prefer: respond-async` request header had been omitted. - -## Configuration - -:::: note Properties - -- [kind\*](#kind) -- [options](#options) - - [options.idempotency](#options-idempotency) - - [idempotency.header](#idempotency-header) - - [options.correlation](#options-correlation) - - [correlation.headers](#correlation-headers) - - [headers.reply-to](#headers-reply-to) - - [headers.correlation-id](#headers-correlation-id) -- [routes](#routes) -- [routes\[\].guarded](#routes-guarded) -- [routes\[\].when](#routes-when) - - [when\[\].method](#when-method) - - [when\[\].path](#when-path) -- [routes\[\].exit\*](#routes-exit) -- [routes\[\].with](#routes-with) -- [with.capability: fetch](#with-capability-fetch) - - [with.topic](#with-topic) - - [with.filters](#with-filters) - - [filters\[\].key](#filters-key) - - [filters\[\].headers](#filters-headers) - - [with.merge](#with-merge) - - [merge.content-type](#merge-content-type) - - [merge.patch](#merge-patch) - - [patch.initial](#patch-initial) - - [patch.path](#patch-path) -- [with.capability: produce](#with-capability-produce) - - [with.topic](#with-topic-1) - - [with.acks](#with-acks) - - [with.key](#with-key) - - [with.overrides](#with-overrides) - - [with.reply-to](#with-reply-to) - - [with.async](#with-async) - -::: right -\* required -::: - -:::: - -### kind\* - -> `enum` [ "proxy" ] - -Behave as an `http-kafka` `proxy`. - -```yaml -kind: proxy -``` - -### options - -> `object` - -`http-kafka`-specific options for adapting `http` request-response streams to `kafka` topic streams. - -```yaml -options: - idempotency: - header: idempotency-key - correlation: - headers: - reply-to: zilla:reply-to - correlation-id: zilla:correlation-id -``` - -#### options.idempotency - -> `object` - -HTTP request header used to specify the idempotency key when adapting `http` request-response streams to `kafka` topic streams. - -##### idempotency.header - -> `string` | Default: `"idempotency-key"` - -HTTP request header name for idempotency key. - -#### options.correlation - -> `object` - -Kafka request message headers injected when adapting `http` request-response streams to `kafka` topic streams. - -##### correlation.headers - -> `map` of `name: value` properties - -Kafka request message reply to and correlation id header names injected when adapting `http` request-response streams to `kafka` topic streams. - -##### headers.reply-to - -> `string` | Default: `"zilla:reply-to"` - -Kafka header name for reply-to topic. - -##### headers.correlation-id - -> `string` | Default: `"zilla:correlation-id"` - -Kafka header name for request-response correlation identifier. - -### routes +### routes\* > `array` of `object` -Conditional `http-kafka`-specific routes for adapting `http` request-response streams to `kafka` topic streams. +Conditional `http-kafka` specific routes. Correlated Request-Response route: @@ -243,9 +63,9 @@ routes: key: ${params.id} ``` -### routes[].guarded +#### routes[].guarded -> `object` as named map of `string:string` `array` +> `object` as map of named `array` of `string` Roles required by named guard. @@ -256,12 +76,12 @@ routes: - read:items ``` -### routes[].when +#### routes[].when > `array` of `object` List of conditions (any match) to match this route when adapting `http` request-response streams to `kafka` topic streams. -Read more: [When a route matches](../../../concepts/bindings.md#when-a-route-matches) +Read more: [When a route matches](../../../../../concepts/bindings.md#when-a-route-matches) ```yaml routes: @@ -278,15 +98,15 @@ HTTP Method, such as `GET`, `HEAD`, `POST`, `PUT`, `DELETE`, `CONNECT`, `OPTIONS #### when[].path -> `string` +> `string` | Pattern: `^/` Path with optional embedded parameter names, such as `/{topic}`. -### routes[].exit\* +#### routes[].exit > `string` -Default exit binding when no conditional routes are viable. +Next binding when following this route. ```yaml routes: @@ -295,30 +115,36 @@ routes: exit: kafka_cache_client ``` -### routes[].with +#### routes[].with\* -> **oneOf**: [Fetch](#with-capability-fetch) | [Produce](#with-capability-produce) +> `object` -Defines the route with the Fetch capability. +Defines the route with the [Fetch](#with-capability-fetch) capability. ```yaml with: capability: fetch ``` -Defines the route with the Produce capability. +Defines the route with the [Produce](#with-capability-produce) capability. ```yaml with: capability: produce ``` -### with.capability: fetch +#### with.capability: fetch\* -> `object` +> `const` Kafka parameters for matched route when adapting `http` request-response streams to `kafka` topic fetch streams. +Routes with `fetch` capability map `http` `GET` requests to a `kafka` log-compacted topic, supporting filtered retrieval of messages with a specific key, or unfiltered retrieval of all messages with distinct keys in the topic merged into a unified response. + +Filtering can be performed by `kafka` message key, message headers, or a combination of both message key and headers, extracting the parameter values from the inbound `http` request path. + +Status `200` `http` responses include an `etag` header that can be used with `if-none-match` for subsequent conditional `GET` requests to check for updates. Rather than polling, `http` requests can also include the `prefer: wait=N` header to wait a maximum of `N` seconds before responding with `304` if not modified. When a new message arrives in the topic that would modify the response, then all `prefer: wait=N` clients receive the response immediately. + ```yaml with: capability: fetch @@ -328,11 +154,11 @@ with: merge: content-type: application/json patch: - initial: "[]" + initial: [] path: /- ``` -#### with.topic +#### with.topic\* > `string` @@ -344,15 +170,15 @@ Topic name, optionally referencing path parameter such as `${params.topic}`. List of criteria (any match) to this filter. Kafka filters for matched route when adapting `http` request-response streams to `kafka` topic fetch streams. All specified headers and key must match for the combined criteria to match. -##### filters[].key +#### filters[].key > `string` Message key, optionally referencing path parameter such as `${params.key}`. -##### filters[].headers +#### filters[].headers -> `map` of `name: value` properties +> `object` as map of named `string` properties Message headers, with value optionally referencing path parameter such as `${params.headerX}`. @@ -362,13 +188,13 @@ Message headers, with value optionally referencing path parameter such as `${par Merge multiple Kafka messages into a unified HTTP response. Kafka merge configuration for matched route when adapting `http` request-response streams to `kafka` topic streams where all messages are fetched and must be merged into a unified `http` response. -##### merge.content-type +#### merge.content-type: application/json\* -> `const` | Value: application/json +> `const` Content type of merged HTTP response. -##### merge.patch +#### merge.patch > `object` @@ -378,24 +204,32 @@ Describes how to patch initial HTTP response to include one or more Kafka messag Kafka merge patch configuration for matched route when adapting `http` request-response streams to `kafka` topic streams where all messages are fetched and must be merged into a unified `http` response. -##### patch.initial +#### patch.initial: []\* -> `const` | Value: "[]" +> `const` Initial JSON value. -##### patch.path +#### patch.path: /-\* -> `const` | Value: /- +> `const` JSON Patch path to include each Kafka message in unified HTTP response. -### with.capability: produce +#### with.capability: produce\* -> `object` +> `const` Kafka parameters for matched route when adapting `http` request-response streams to `kafka` topic produce streams. +Routes with `produce` capability map any `http` request-response to a correlated pair of `kafka` messages. The `http` request message is sent to a `requests` topic, with a `zilla:correlation-id` header. When the request message received and processed by the `kafka` `requests` topic consumer, it produces a response message to the `responses` topic, with the same `zilla:correlation-id` header to correlate the response. + +Requests including an `idempotency-key` `http` header can be replayed and safely receive the same response. This requires the `kafka` consumer to detect and ignore the duplicate request with the same `idempotency-key` and `zilla:correlation-id`. + +Specifying `async` allows clients to include a `prefer: respond-async` header in the `http` request to receive `202 Accepted` response with `location` response header. + +A corresponding `routes[].when` object with matching `GET` method and `location` path is also required for follow up `GET` requests to return the same response as would have been returned if `prefer: respond-async` request header had been omitted. + ```yaml with: capability: produce @@ -409,15 +243,17 @@ with: location: /items/${params.id};cid=${correlationId} ``` -#### with.topic + +#### with.topic\* > `string` Kafka topic name, optionally referencing path parameter such as `${params.topic}`. + #### with.acks -> `enum` [ "none", "leader_only", "in_sync_replicas" ] | Default: `"in_sync_replicas"` +> `enum` [ `none`, `leader_only`, `in_sync_replicas` ] | Default: `in_sync_replicas` Kafka acknowledgement mode @@ -429,7 +265,7 @@ Kafka message key, optionally referencing path parameter such as `${params.id}`. #### with.overrides -> `map` of `name: value` properties +> `object` as map of named `string` properties Kafka message headers, with values optionally referencing path parameter. @@ -441,14 +277,8 @@ Kafka reply-to topic name. #### with.async -> `map` of `name: value` properties +> `object` as map of named `string` properties Allows an HTTP response to be retrieved asynchronously. A `location: ` property can be used to define the path where an async result can be fetched, with the `` value optionally referencing route path parameters or the `${correlationId}`. - ---- - -::: right -\* required -::: diff --git a/src/reference/config/bindings/http-kafka/README.md b/src/reference/config/bindings/http-kafka/README.md new file mode 100644 index 00000000..f17c77b1 --- /dev/null +++ b/src/reference/config/bindings/http-kafka/README.md @@ -0,0 +1,26 @@ +--- +redirectFrom: /reference/config/bindings/binding-http-kafka.html +dir: + collapsible: false + link: true +shortTitle: http-kafka +category: + - Binding +tag: + - http-kafka + - proxy +--- + +# http-kafka Binding + +The `proxy` kind `http-kafka` binding adapts `http` request-response streams to `kafka` topic streams. + +## proxy + +> [Full config](./proxy.md) + +Behave as an `http-kafka` `proxy`. + +```yaml {3} + +``` diff --git a/src/reference/config/bindings/http-kafka/proxy.md b/src/reference/config/bindings/http-kafka/proxy.md new file mode 100644 index 00000000..57ea7a82 --- /dev/null +++ b/src/reference/config/bindings/http-kafka/proxy.md @@ -0,0 +1,17 @@ +--- +shortTitle: proxy +--- + +# http-kafka proxy + +The http-kafka proxy binding for adapting `http` request-response streams to `kafka` topic streams. + +```yaml {3} + +``` + +## Configuration (\* required) + + + + diff --git a/src/reference/config/bindings/http/.partials/client.yaml b/src/reference/config/bindings/http/.partials/client.yaml new file mode 100644 index 00000000..c6e297ce --- /dev/null +++ b/src/reference/config/bindings/http/.partials/client.yaml @@ -0,0 +1,7 @@ + http_client: + type: http + kind: client + options: + versions: + - h2 + exit: tcp_client diff --git a/src/reference/config/bindings/http/.partials/options.md b/src/reference/config/bindings/http/.partials/options.md new file mode 100644 index 00000000..188f6fae --- /dev/null +++ b/src/reference/config/bindings/http/.partials/options.md @@ -0,0 +1,135 @@ + +#### options.requests + +> `array` of `object` + +Options to configure typed validations for request fields. + +#### requests[].content + +> `enum` [ `double`, `float`, `int32`, `int64`, `json`, `string` ], `object` + +Enforce validation for the request content. + +#### content.model\* + +> `enum` [ `double`, `float`, `int32`, `int64`, `json`, `string` ] + +A schema or type to validate the request content. Refer to the individual [model](../../../models/) docs for type specific implementation. + +#### requests[].content-type + +> `array` of `string` + +Content type of the HTTP request. + +#### requests[].headers + +> `object` as map of named `enum` [ `double`, `float`, `int32`, `int64`, `json`, `string` ], `object` as map of named `object` properties + +Enforce validation for request headers. + +#### requests[].method + +> `enum` [ `GET`, `PUT`, `POST`, `DELETE`, `OPTIONS`, `HEAD`, `PATCH`, `TRACE` ] + +HTTP request method. + +#### requests[].params + +> `object` + +Query parameters of the HTTP request. + +#### params.path + +> `object` as map of named `enum` [ `double`, `float`, `int32`, `int64`, `json`, `string` ], `object` as map of named `object` properties + +Enforce validation for path + +#### path.model\* + +> `enum` [ `double`, `float`, `int32`, `int64`, `json`, `string` ] + +A schema or type to validate the path content. Refer to the individual [model](../../../models/) docs for type specific implementation. + +#### params.query + +> `object` as map of named `enum` [ `double`, `float`, `int32`, `int64`, `json`, `string` ], `object` as map of named `object` properties + +Enforce validation for query + +#### query.model\* + +> `enum` [ `double`, `float`, `int32`, `int64`, `json`, `string` ] + +A schema or type to validate the query content. Refer to the individual [model](../../../models/) docs for type specific implementation. + +#### requests[].path + +> `string` + +URL path of the HTTP request. + +#### requests[].responses + +> `array` of `object` + +Options to configure typed validations for response fields. + +#### responses[].content + +> `enum` [ `double`, `float`, `int32`, `int64`, `json`, `string` ], `object` + +Enforce validation for the response content. + + +#### content.model\* + +> `enum` [ `double`, `float`, `int32`, `int64`, `json`, `string` ] + +A schema or type to validate the response content. Refer to the individual [model](../../../models/) docs for type specific implementation. + + +#### responses[].content-type + +> `array` of `string` + +Content type of the HTTP response. + +#### responses[].headers + +> `object` as map of named `enum` [ `double`, `float`, `int32`, `int64`, `json`, `string` ], `object` as map of named `object` properties + +Enforce validation for response headers. + +```yaml +headers: + my-header: + model: string + maxLength: 100 +``` + +#### headers.model\* + +> `enum` [ `double`, `float`, `int32`, `int64`, `json`, `string` ] + +A schema or type to validate the headers content. Refer to the individual [model](../../../models/) docs for type specific implementation. + +#### responses[].status + +> `integer`, `array` of `integer` + +HTTP status code or codes for the response + +#### options.versions + +> `array` of `enum` [ `http/1.1`, `h2` ] | Default: `http/1.1,h2` + +Supported protocol versions. + +#### options.overrides + +> `object` as map of named `string` properties + +Request header overrides. diff --git a/src/reference/config/bindings/http/.partials/routes.md b/src/reference/config/bindings/http/.partials/routes.md new file mode 100644 index 00000000..52bdae42 --- /dev/null +++ b/src/reference/config/bindings/http/.partials/routes.md @@ -0,0 +1,88 @@ +### routes\* + +> `array` of `object` + +Conditional `http` specific routes. + +```yaml +routes: + - when: + - headers: + ":scheme": https + ":authority": example.com:443 + exit: echo_server +``` + +#### routes[].guarded + +> `object` as map of named `array` of `string` + +List of roles required by each named guard to authorize this route. + +```yaml +routes: + - guarded: + my_guard: + - read:items +``` + +#### routes[].when + +> `array` of `object` + +List of conditions (any match) to match this route. +Read more: [When a route matches](../../../../../concepts/bindings.md#when-a-route-matches) + +```yaml +routes: + - when: + - headers: + ":scheme": https + ":authority": example.com:443 +``` + +#### when[].headers + +> `object` as map of named `string` properties + +Header name value pairs (all match). + +#### routes[].with + +> `object` + +HTTP parameters for matched route when `http` streams. + +```yaml +routes: + - with: + headers: + overrides: + ":scheme": https + ":authority": example.com:443 +``` + +#### with.headers + +> `object` + +Options for headers when adapting a route. + +#### headers.overrides + +> `object` as map of named `string` properties + +HTTP header name value pairs overrides. + +#### routes[].exit + +> `string` + +Next binding when following this route. + +```yaml +routes: + - when: + ... + exit: echo_server +``` diff --git a/src/reference/config/bindings/http/.partials/server.yaml b/src/reference/config/bindings/http/.partials/server.yaml new file mode 100644 index 00000000..fa3e9197 --- /dev/null +++ b/src/reference/config/bindings/http/.partials/server.yaml @@ -0,0 +1,17 @@ + http_server: + type: http + kind: server + options: + access-control: + policy: cross-origin + authorization: + my_jwt_guard: + credentials: + headers: + authorization: Bearer {credentials} + routes: + - when: + - headers: + ":scheme": https + ":authority": example.com:443 + exit: echo_server diff --git a/src/reference/config/bindings/http/README.md b/src/reference/config/bindings/http/README.md new file mode 100644 index 00000000..7a33ea8a --- /dev/null +++ b/src/reference/config/bindings/http/README.md @@ -0,0 +1,45 @@ +--- +redirectFrom: /reference/config/bindings/binding-http.html +dir: + collapsible: false + link: true +shortTitle: http +category: + - Binding +tag: + - http + - server + - client +--- + +# http Binding + +Defines a binding with `http` protocol support, with `server` or `client` behavior. + +## server + +> [Full config](./server.md) + +The `server` kind `http` binding decodes `HTTP/1.1` protocol or `HTTP/2` protocol on the inbound network stream, producing higher level application streams for each request. + +Cross-Origin Resource Sharing (CORS) is supported by specifying an access control policy of `cross-origin`. Further configuration allows for finer-grained access control including specific request origins, methods and headers allowed, and specific response headers exposed. + +Authorization is enforced by a [`guard`](../../../config/overview.md#guards) and the credentials can be extracted from a cookie, header or query parameter. + +Conditional routes based on `http` request headers are used to route these application streams to an `exit` binding. + +```yaml {3} + +``` + +## client + +> [Full config](./client.md) + +The `client` kind `http` binding receives inbound application streams and encodes each request as a network stream via `HTTP/1.1` protocol. Note that the same network stream can be reused to encode multiple `HTTP/1.1` requests. + +Conditional routes based on `http` request headers are used to route these network streams to an `exit` binding. + +```yaml {3} + +``` diff --git a/src/reference/config/bindings/http/client.md b/src/reference/config/bindings/http/client.md new file mode 100644 index 00000000..00d691d6 --- /dev/null +++ b/src/reference/config/bindings/http/client.md @@ -0,0 +1,33 @@ +--- +shortTitle: client +--- + +# http client + +The http client binding receives inbound application streams and encodes each request as a network stream via `HTTP/1.1` protocol. Note that the same network stream can be reused to encode multiple `HTTP/1.1` requests. + +Conditional routes based on `http` request headers are used to route these network streams to an `exit` binding. + +```yaml {3} + +``` + +## Configuration (\* required) + +### options + +> `object` + +The `client` specific options. + +```yaml +options: + overrides: + custom-text: custom-value +``` + + + + + + diff --git a/src/reference/config/bindings/http/server.md b/src/reference/config/bindings/http/server.md new file mode 100644 index 00000000..67b0bc4d --- /dev/null +++ b/src/reference/config/bindings/http/server.md @@ -0,0 +1,152 @@ +--- +shortTitle: server +--- + +# http server + +The http server binding decodes `HTTP/1.1` protocol or `HTTP/2` protocol on the inbound network stream, producing higher level application streams for each request. + +Cross-Origin Resource Sharing (CORS) is supported by specifying an access control policy of `cross-origin`. Further configuration allows for finer-grained access control including specific request origins, methods and headers allowed, and specific response headers exposed. + +Authorization is enforced by a [`guard`](../../../config/overview.md#guards) and the credentials can be extracted from a cookie, header or query parameter. + +Conditional routes based on `http` request headers are used to route these application streams to an `exit` binding. + +```yaml {3} + +``` + +## Configuration (\* required) + +### options + +> `object` + +The `server` specific options. + +```yaml +options: + access-control: + policy: cross-origin + authorization: + my_jwt_guard: + credentials: + headers: + authorization: Bearer {credentials} + overrides: + custom-text: custom-value +``` + + + +#### options.access-control + +> `object` + +Defines the [same-origin](#access-control-policy-same-origin) or [cross-origin](#access-control-policy-cross-origin) access control policy for the `HTTP` protocol. + +#### access-control.policy + +> `enum` [ `same-origin`, `cross-origin` ] | Default: `same-origin` + +Supported access control policies. + +#### access-control.policy: same-origin + +> `const` + +Extra properties aren't needed when using Same Origin access control for the `HTTP` protocol. + +```yaml +options: + access-control: + policy: same-origin +``` + +#### access-control.policy: cross-origin + +> `const` + +Additional properties that cover Cross Origin Resource Sharing (CORS) access control for the `HTTP` protocol. + +```yaml +options: + access-control: + policy: cross-origin +``` + +#### access-control.allow + +> `object` + +Sets the CORS allowed request origins, methods, headers and credentials for the `HTTP` protocol. + +::: important +Omission of the allow object means Zilla will allow all origins, methods and headers, without credentials. +::: + +#### allow.origins + +> `array` of `string` + +Allowed request origins. Omission of this property is considered allow all `*`. + +#### allow.methods + +> `array` of `string` + +Allowed request methods. Omission of this property is considered allow all `*`. + +#### allow.headers + +> `array` of `string` + +Allowed request headers. Omission of this property is considered allow all `*`. + +#### allow.credentials + +> `boolean` + +Support `fetch` credentials mode `include`. + +#### access-control.max-age + +> `number` + +Maximum cache age (in seconds) for allowed headers and methods. + +#### access-control.expose + +> `object` + +Exposed cross-origin response headers. + +::: important +Omission means all response headers. +::: + +#### expose.headers + +> `array` of `string` + +Exposed response headers. + +#### options.authorization + +> `object` as map of named `object` properties + +Authorization by a named guard for the `HTTP/1.1` and `HTTP/2` protocols. + +```yaml +authorization: + my_jwt_guard: + credentials: + headers: + authorization: Bearer {credentials} +``` + + + + + + diff --git a/src/reference/config/bindings/kafka-grpc/.partials/options.md b/src/reference/config/bindings/kafka-grpc/.partials/options.md new file mode 100644 index 00000000..d51d17ab --- /dev/null +++ b/src/reference/config/bindings/kafka-grpc/.partials/options.md @@ -0,0 +1,73 @@ + +### options + +> `object` + +The `kafka-grpc` specific options. + +```yaml +options: + acks: leader_only + idempotency: + metadata: idempotency-key + correlation: + headers: + service: zilla:service + method: zilla:method + correlation-id: zilla:correlation-id + reply-to: zilla:reply-to +``` + +#### options.acks + +> `enum` [ `none`, `leader_only`, `in_sync_replicas` ] | Default: `in_sync_replicas` + +The `kafka` acknowledgment mode. + +#### options.idempotency + +> `object` + +Metadata header used to specify the idempotency key. + +#### idempotency.metadata + +> `string` | Default: `idempotency-key` + +The `grpc` metadata header name for idempotency key. + +#### options.correlation + +> `object` + +Kafka request message headers injected. + +#### correlation.headers + +> `object` + +Kafka request message correlation header names used. + +#### headers.service + +> `string` | Default: `zilla:service` + +Kafka header name for `grpc` service. + +#### headers.method + +> `string` | Default: `zilla:method` + +Kafka header name for `grpc` method. + +#### headers.correlation-id + +> `string` | Default: `zilla:correlation-id` + +Kafka header name for request-response correlation identifier. + +#### headers.reply-to + +> `string` | Default: `zilla:reply-to` + +Kafka header name for reply-to topic. diff --git a/src/reference/config/bindings/kafka-grpc/.partials/remote_server.yaml b/src/reference/config/bindings/kafka-grpc/.partials/remote_server.yaml new file mode 100644 index 00000000..92381bdb --- /dev/null +++ b/src/reference/config/bindings/kafka-grpc/.partials/remote_server.yaml @@ -0,0 +1,23 @@ + kafka_grpc_proxy: + type: kafka-grpc + kind: remote_server + entry: kafka_cache_client + options: + acks: leader_only + idempotency: + metadata: idempotency-key + correlation: + headers: + service: zilla:service + method: zilla:method + correlation-id: zilla:correlation-id + reply-to: zilla:reply-to + routes: + - when: + - topic: requests + reply-to: responses + method: example.EchoService/* + exit: grpc + with: + scheme: http + authority: localhost:7151 diff --git a/src/reference/config/bindings/kafka-grpc/.partials/routes.md b/src/reference/config/bindings/kafka-grpc/.partials/routes.md new file mode 100644 index 00000000..5b2665c3 --- /dev/null +++ b/src/reference/config/bindings/kafka-grpc/.partials/routes.md @@ -0,0 +1,115 @@ +### routes\* + +> `array` of `object` + +Conditional `kafka-grpc` specific routes. + +```yaml +routes: + - guarded: + my_guard: + - echo:messages + when: + - topic: requests + reply-to: responses + method: example.EchoService/* + exit: grpc + with: + scheme: http + authority: localhost:7151 +``` + +#### routes[].guarded + +> `object` as map of named `array` of `string` + +Roles required by named guard. + +```yaml +routes: + - guarded: + my_guard: + - echo:messages +``` + +#### routes[].when + +> `array` of `object` + +List of conditions (any match) to match this route when adapting `kafka` topic streams to `grpc` request-response streams. +Read more: [When a route matches](../../../../../concepts/bindings.md#when-a-route-matches) + +```yaml +routes: + - when: + - topic: requests + reply-to: responses + method: example.EchoService/* +``` + +#### when[].topic\* + +> `string` + +The name of a Kafka topic for requests. + +#### when[].key + +> `string` + +The name of a Kafka topic for requests. + +#### when[].headers + +> `object` as map of named `string` properties + +Header name value pairs (all match). + +#### when[].reply-to\* + +> `string` + +The name of the Kafka topic for correlated responses. + +#### when[].method + +> `string` | Pattern: `^(?[^/]+)/(?[^/]+)` + +Pattern matching the fully qualified name of a `grpc` service method, in the format `/` allowing wildcard `*` for the method to indicate any method. + +#### routes[].exit + +> `string` + +Next binding when following this route. + +```yaml +routes: + - when: + ... + exit: kafka_cache_client +``` + +#### routes[].with\* + +> `object` + +Kafka parameters for matched route when adapting `grpc` request-response streams to `kafka` topic fetch streams. + +```yaml +with: + scheme: http + authority: localhost:7151 +``` + +#### with.scheme\* + +> `string` + +The `grpc` request scheme. + +#### with.authority\* + +> `string` + +The `grpc` request authority. diff --git a/src/reference/config/bindings/kafka-grpc/README.md b/src/reference/config/bindings/kafka-grpc/README.md new file mode 100644 index 00000000..307ae0f8 --- /dev/null +++ b/src/reference/config/bindings/kafka-grpc/README.md @@ -0,0 +1,28 @@ +--- +redirectFrom: /reference/config/bindings/binding-kafka-grpc.html +dir: + collapsible: false + link: true +shortTitle: kafka-grpc +category: + - Binding +tag: + - kafka-grpc + - remote_server +--- + +# kafka-grpc Binding + +The `grpc` request message is received from a `requests` topic, with a `zilla:correlation-id` header, initiating a `grpc` service method invocation. When the `grpc` response received, a response message is produced to the `responses` topic, with the same `zilla:correlation-id` header to correlate the response. + +Note that `grpc` requests and responses can be `unary` or `streaming`. + +## remote_server + +> [Full config](./remote_server.md) + +The `remote_server` kind `kafka-grpc` binding adapts `kafka` topic streams to `grpc` request-response streams. + +```yaml {3} + +``` diff --git a/src/reference/config/bindings/kafka-grpc/remote_server.md b/src/reference/config/bindings/kafka-grpc/remote_server.md new file mode 100644 index 00000000..e1b5ef65 --- /dev/null +++ b/src/reference/config/bindings/kafka-grpc/remote_server.md @@ -0,0 +1,30 @@ +--- +shortTitle: remote_server +--- + +# kafka-grpc remote_server + +The kafka-grpc remote_server binding for adapting `kafka` topic streams to `grpc` request-response streams. + +```yaml {3} + +``` + +## Configuration (\* required) + +### entry\* + +> `string` | Pattern: `^[a-zA-Z]+[a-zA-Z0-9\\._\\-]*$` + +The name of the binding that will be the entrypoint for Kafka streams. + +```yaml + kafka_grpc_proxy: + type: kafka-grpc + kind: remote_server + entry: kafka_cache_client +``` + + + + diff --git a/src/reference/config/bindings/kafka-proxy/.partials/options.md b/src/reference/config/bindings/kafka-proxy/.partials/options.md new file mode 100644 index 00000000..6325680d --- /dev/null +++ b/src/reference/config/bindings/kafka-proxy/.partials/options.md @@ -0,0 +1,64 @@ + +### options\* + +> `object` + +The `kafka-proxy` specific options. + +```yaml +options: + external: + host: kafka-#.external.net + port: 9093 + internal: + host: b-#.kafka.internal.net + port: 9094 +``` + +#### options.external\* + +> `object` + +Kafka proxy endpoint used by external clients. + +```yaml +external: + host: kafka-#.external.net + port: 9093 +``` + +#### external.host\* + +> `string` + +Hostname pattern for external Kafka broker names, where `#` is an integer. + +#### external.port\* + +> `integer` + +Port number for external Kafka broker. + +#### options.internal\* + +> `object` + +Internal Kafka broker endpoint. + +```yaml +internal: + host: b-#.kafka.internal.net + port: 9094 +``` + +#### internal.host\* + +> `string` + +Hostname pattern for internal Kafka broker names, where `#` is an integer. + +#### internal.port\* + +> `integer` + +Port number for internal Kafka broker. diff --git a/src/reference/config/bindings/kafka-proxy/.partials/proxy.yaml b/src/reference/config/bindings/kafka-proxy/.partials/proxy.yaml new file mode 100644 index 00000000..492ad329 --- /dev/null +++ b/src/reference/config/bindings/kafka-proxy/.partials/proxy.yaml @@ -0,0 +1,11 @@ + kafka_proxy: + type: kafka-proxy + kind: proxy + options: + external: + host: kafka-#.external.net + port: 9093 + internal: + host: b-#.kafka.internal.net + port: 9094 + exit: tls_client diff --git a/src/reference/config/bindings/kafka-proxy/README.md b/src/reference/config/bindings/kafka-proxy/README.md new file mode 100644 index 00000000..56fc9fd2 --- /dev/null +++ b/src/reference/config/bindings/kafka-proxy/README.md @@ -0,0 +1,30 @@ +--- +redirectFrom: /reference/config/bindings/binding-kafka-proxy.html +dir: + collapsible: false + link: true +shortTitle: kafka-proxy +icon: aky-zilla-plus +category: + - Binding +tag: + - kafka-proxy + - proxy +--- + +# kafka-proxy Binding + +Defines a binding with `kafka-proxy` support, with `proxy` behavior. + +[Available in ](https://www.aklivity.io/products/zilla-plus) +{.zilla-plus-badge .hint-container .info} + +## proxy + +> [Full config](./proxy.md) + +Behave as a `proxy`. + +```yaml {3} + +``` diff --git a/src/reference/config/bindings/kafka-proxy/proxy.md b/src/reference/config/bindings/kafka-proxy/proxy.md new file mode 100644 index 00000000..0f5f2976 --- /dev/null +++ b/src/reference/config/bindings/kafka-proxy/proxy.md @@ -0,0 +1,21 @@ +--- +shortTitle: proxy +icon: aky-zilla-plus +--- + +# kafka-proxy proxy + +The kafka-proxy proxy binding for adapting `kafka` topic streams to `kafka` topic streams. + +[Available in ](https://www.aklivity.io/products/zilla-plus) +{.zilla-plus-badge .hint-container .info} + +```yaml {3} + +``` + +## Configuration (\* required) + + + + diff --git a/src/reference/config/bindings/kafka/.partials/cache_client.yaml b/src/reference/config/bindings/kafka/.partials/cache_client.yaml new file mode 100644 index 00000000..c3d87471 --- /dev/null +++ b/src/reference/config/bindings/kafka/.partials/cache_client.yaml @@ -0,0 +1,4 @@ + kafka_cache_client: + type: kafka + kind: cache_client + exit: kafka_cache_server diff --git a/src/reference/config/bindings/kafka/.partials/cache_server.yaml b/src/reference/config/bindings/kafka/.partials/cache_server.yaml new file mode 100644 index 00000000..c2e4578b --- /dev/null +++ b/src/reference/config/bindings/kafka/.partials/cache_server.yaml @@ -0,0 +1,7 @@ + kafka_cache_server: + type: kafka + kind: cache_server + options: + bootstrap: + - items-responses + exit: kafka_client diff --git a/src/reference/config/bindings/kafka/.partials/client.yaml b/src/reference/config/bindings/kafka/.partials/client.yaml new file mode 100644 index 00000000..40a2241a --- /dev/null +++ b/src/reference/config/bindings/kafka/.partials/client.yaml @@ -0,0 +1,10 @@ + kafka_client: + type: kafka + kind: client + options: + servers: + - ${{env.KAFKA_BOOTSTRAP_SERVER}} + sasl: + mechanism: scram-sha-256 + username: ${{env.SASL_USERNAME}} + password: ${{env.SASL_PASSWORD}} diff --git a/src/reference/config/bindings/kafka/.partials/routes.md b/src/reference/config/bindings/kafka/.partials/routes.md new file mode 100644 index 00000000..94c3797b --- /dev/null +++ b/src/reference/config/bindings/kafka/.partials/routes.md @@ -0,0 +1,41 @@ +### routes\* + +> `array` of `object` + +Conditional `kafka` specific routes. + +#### routes[].guarded + +> `object` as map of named `array` of `string` + +List of roles required by each named guard to authorize this route. + +```yaml +routes: + - guarded: + my_guard: + - read:items +``` + +#### routes[].when + +> `array` of `object` + +List of conditions (any match) to match this route. +Read more: [When a route matches](../../../../../concepts/bindings.md#when-a-route-matches) + +#### when[].topic + +> `string` + +Topic name pattern. + +#### routes[].exit + +> `string` + +Next binding when following this route. + +```yaml +exit: echo_server +``` diff --git a/src/reference/config/bindings/kafka/README.md b/src/reference/config/bindings/kafka/README.md new file mode 100644 index 00000000..0dd6fcc0 --- /dev/null +++ b/src/reference/config/bindings/kafka/README.md @@ -0,0 +1,62 @@ +--- +redirectFrom: /reference/config/bindings/binding-kafka.html +dir: + collapsible: false + link: true +shortTitle: kafka +category: + - Binding +tag: + - kafka + - cache_client + - cache_server + - client +--- + +# kafka Binding + +Defines a binding with `kafka` protocol support, with `cache_client`, `cache_server` or `client` behavior. + +## Cache Behavior + +The `cache_client` and `cache_server` kinds combine to provide a persistent cache of `kafka` messages per `topic` `partition` honoring the `kafka` `topic` configuration for message expiration and compaction. Messages ordering is guaranteed per `partition` and messages are merged into a unified stream for the `topic` spanning all `partitions`. + +The `cache_server` kind supports proactive `fetch` of messages to keep the cache fresh in preparation for new consumers. This is enabled by configuring a list of `bootstrap` topics for the binding. + +The `cache_client` kind supports filtering by `kafka` message key, headers or a combination of key and headers. + +Message conflation occurs implicitly for `compacted` `kafka` topics, where a slower consumer that is not keeping up with the latest messages can safely skip over each older message that has effectively been replaced by a newer message with the same key. + +When a new consumer arrives, the latest messages in the compacted topic are immediately delivered to that consumer, followed by any additional messages as they are produced to the `kafka` `topic`. + +When the `kafka` `topic` is not compacted, then the binding can be configured to either replay historical messages first, or start with upcoming live messages instead. + +The `cache_client` and `cache_server` also combine to provide a staging area when producing new messages as `kafka` requires exact message length up front when producing new messages and `kafka` does not support producing multiple messages in parallel over the same network connection. + +## cache_client + +> [Full config](./cache_client.md) + +```yaml {3} + +``` + +## cache_server + +> [Full config](./cache_server.md) + +```yaml {3} + +``` + +## client + +> [Full config](./client.md) + +The `client` kind `kafka` binding receives inbound application streams and encodes each as a network stream via `kafka` request-response protocol. Note that the same network stream can be reused to encode multiple `kafka` requests, including both `fetch` and `produce` requests. + +Conditional routes based on `kafka` `topic` names are used to route these network streams to an `exit` binding that ultimately reaches a `kafka` broker. + +```yaml {3} + +``` diff --git a/src/reference/config/bindings/kafka/cache_client.md b/src/reference/config/bindings/kafka/cache_client.md new file mode 100644 index 00000000..c6affd1d --- /dev/null +++ b/src/reference/config/bindings/kafka/cache_client.md @@ -0,0 +1,37 @@ +--- +shortTitle: cache_client +--- + +# kafka cache_client + +The kafka cache_client binding supports filtering by `kafka` message key, headers or a combination of key and headers. + +```yaml {3} + +``` + +## Configuration (\* required) + +### options + +> `object` + +The `cache_client` specific options. + +```yaml +options: + topics: + - name: items-requests +``` + +#### options.topics + +> `array` of `object` + +Topic configuration. + + + + + + diff --git a/src/reference/config/bindings/kafka/cache_server.md b/src/reference/config/bindings/kafka/cache_server.md new file mode 100644 index 00000000..af2114fc --- /dev/null +++ b/src/reference/config/bindings/kafka/cache_server.md @@ -0,0 +1,55 @@ +--- +shortTitle: cache_server +--- + +# kafka cache_server + +The kafka cache_server binding supports proactive `fetch` of messages to keep the cache fresh in preparation for new consumers. This is enabled by configuring a list of `bootstrap` topics for the binding. + +```yaml {3} + +``` + +## Configuration (\* required) + +### options + +> `object` + +The `cache_server` specific options. + +```yaml +options: + bootstrap: + - items-requests + - items-responses + topics: + - name: items-requests + defaultOffset: live +``` + +#### options.bootstrap + +> `array` of `string` + +Topics to bootstrap in cache server even when no clients. + +#### options.topics + +> `array` of `object` + +Topic configuration. + + + +#### topics[].defaultOffset + +> `enum` [ `live`, `historical` ] + +Fetch offset to use for new consumers + + + + + + diff --git a/src/reference/config/bindings/kafka/client.md b/src/reference/config/bindings/kafka/client.md new file mode 100644 index 00000000..449ddce3 --- /dev/null +++ b/src/reference/config/bindings/kafka/client.md @@ -0,0 +1,47 @@ +--- +shortTitle: client +--- + +# kafka client + +The kafka client binding receives inbound application streams and encodes each as a network stream via `kafka` request-response protocol. + +```yaml {3} + +``` + +## Configuration (\* required) + +### options + +> `object` + +The `client` specific options. + +```yaml +options: + servers: + - kafka:9092 + sasl: + mechanism: plain + username: my_username + password: my_password +``` + +#### options.servers + +> `array` of `string` + +Bootstrap servers to use when connecting to `kafka` cluster. + +#### options.sasl + +> `object` + +SASL credentials to use when connecting to `kafka` brokers. + + + + + + diff --git a/src/reference/config/bindings/mqtt-kafka/.partials/options.md b/src/reference/config/bindings/mqtt-kafka/.partials/options.md new file mode 100644 index 00000000..89d7dced --- /dev/null +++ b/src/reference/config/bindings/mqtt-kafka/.partials/options.md @@ -0,0 +1,86 @@ +### options\* + +> `object` + +The `mqtt-kafka` specific options. + +#### options.server + +> `string` + +The server reference used by the MQTT server in Zilla. This config enables scaling of the MQTT server when running multiple Zilla instances as it uses [server redirection](https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901255). + +```yaml +options: + server: mqtt-1.example.com:1883 +``` + +#### options.topics\* + +> `object` + +The `kafka` topics Zilla needs when routing MQTT messages + +```yaml +options: + topics: + sessions: mqtt-sessions + messages: mqtt-messages + retained: mqtt-retained +``` + +#### topics.sessions\* + +> `string` + +A Kafka topic for storing mqtt session states. + +::: warning cleanup.policy Required +A `compact` [cleanup.policy](https://kafka.apache.org/30/generated/topic_config.html#topicconfigs_cleanup.policy) is required. +::: + +#### topics.messages\* + +> `string` + +The default Kafka topic used for routing mqtt messages. + +#### topics.retained\* + +> `string` + +A Kafka topic for storing mqtt retained messages. + +::: info cleanup.policy Recommended +A `compact` [cleanup.policy](https://kafka.apache.org/30/generated/topic_config.html#topicconfigs_cleanup.policy) is recommended. +::: + +#### options.clients + +> `array` of `string` + +Pattern defining how to extract client identity from the topic. Using this we can ensure that all messages for the same client identity are produced to Kafka on the same topic partition. + +```yaml +options: + clients: + - place/{identity}/# +``` + +#### options.publish + +> `object` + +The `QTT `publish` specific options. + +#### publish.qosMax\* + +> `enum` [ `at_most_once`, `at_least_once`, `exactly_once` ] | Default: `exactly_once` + +Highest allowed QOS level. + +```yaml +options: + publish: + qosMax: at_most_once +``` diff --git a/src/reference/config/bindings/mqtt-kafka/.partials/proxy.yaml b/src/reference/config/bindings/mqtt-kafka/.partials/proxy.yaml new file mode 100644 index 00000000..0d84d46a --- /dev/null +++ b/src/reference/config/bindings/mqtt-kafka/.partials/proxy.yaml @@ -0,0 +1,21 @@ + mqtt_kafka_proxy: + type: mqtt-kafka + kind: proxy + options: + server: mqtt-1.example.com:1883 + topics: + sessions: mqtt-sessions + messages: mqtt-messages + retained: mqtt-retained + clients: + - place/{identity}/# + routes: + - when: + - publish: + - topic: place/+/device/# + - subscribe: + - topic: place/+/device/# + with: + messages: mqtt-devices + exit: kafka_cache_client + exit: kafka_cache_client diff --git a/src/reference/config/bindings/mqtt-kafka/.partials/routes.md b/src/reference/config/bindings/mqtt-kafka/.partials/routes.md new file mode 100644 index 00000000..cf12ebce --- /dev/null +++ b/src/reference/config/bindings/mqtt-kafka/.partials/routes.md @@ -0,0 +1,105 @@ +### routes + +> `array` of `object` + +Conditional `mqtt-kafka` specific routes. + +```yaml +routes: + - when: + - publish: + - topic: place/+/device/# + - subscribe: + - topic: place/+/device/# + with: + messages: mqtt-devices + exit: kafka_cache_client +``` + +#### routes[].guarded + +> `object` as map of named `array` of `string` + +List of roles required by each named guard to authorize this route. + +```yaml +routes: + - guarded: + my_guard: + - publish:clients +``` + +#### routes[].when + +> `array` of `object` + +List of conditions (any match) to match this route when adapting `mqtt` topic streams to `kafka` topic streams. +Read more: [When a route matches](../../../../../concepts/bindings.md#when-a-route-matches) + +```yaml +routes: + - when: + - publish: + - topic: place/# + - subscribe: + - topic: place/# +``` + +#### when[].publish + +> `array` of `object` + +Array of MQTT topic filters matching topic names for publish. + +```yaml +- publish: + - topic: place/# + - topic: subs/# +``` + +#### publish[].topic + +> `string` + +MQTT topic filter pattern. + +#### when[].subscribe + +> `array` of `object` + +Array of MQTT topic filters matching topic names for subscribe. + +```yaml +- subscribe: + - topic: place/# + - topic: subs/# +``` + +#### subscribe[].topic + +> `string` + +MQTT topic filter pattern. + +#### routes[].exit + +> `string` + +Next binding when following this route. + +#### routes[].with\* + +> `object` + +Kafka parameters for matched route when adapting `mqtt` topic streams to `kafka` topic streams. + +```yaml +with: + messages: mqtt-devices +``` + +#### with.messages + +> `string` + +Kafka topic to use for the route. diff --git a/src/reference/config/bindings/mqtt-kafka/README.md b/src/reference/config/bindings/mqtt-kafka/README.md new file mode 100644 index 00000000..24db2277 --- /dev/null +++ b/src/reference/config/bindings/mqtt-kafka/README.md @@ -0,0 +1,26 @@ +--- +redirectFrom: /reference/config/bindings/binding-mqtt-kafka.html +dir: + collapsible: false + link: true +shortTitle: mqtt-kafka +category: + - Binding +tag: + - mqtt-kafka + - proxy +--- + +# mqtt-kafka Binding + +Defines a binding with `mqtt-kafka` support. + +## proxy + +> [Full config](./proxy.md) + +Behave as a `mqtt-kafka` `proxy` for adapting MQTT topic streams to Kafka topic streams. By configuring the Kafka topics that the proxy will use to route mqtt messages and session states an `mqtt` `server` binding can allow clients to connect and proxy MQTT messages onto Kafka topics. + +```yaml {3} + +``` diff --git a/src/reference/config/bindings/mqtt-kafka/proxy.md b/src/reference/config/bindings/mqtt-kafka/proxy.md new file mode 100644 index 00000000..340003bf --- /dev/null +++ b/src/reference/config/bindings/mqtt-kafka/proxy.md @@ -0,0 +1,18 @@ +--- +shortTitle: proxy +--- + +# mqtt-kafka proxy + +The mqtt-kafka proxy binding for adapting MQTT topic streams to Kafka topic streams. By configuring the Kafka topics that the proxy will use to route mqtt messages and session states an `mqtt` `server` binding can allow clients to connect and proxy MQTT messages onto Kafka topics. + +```yaml {3} + +``` + +## Configuration (\* required) + + + + + diff --git a/src/reference/config/bindings/mqtt/.partials/client.yaml b/src/reference/config/bindings/mqtt/.partials/client.yaml new file mode 100644 index 00000000..48dea020 --- /dev/null +++ b/src/reference/config/bindings/mqtt/.partials/client.yaml @@ -0,0 +1,4 @@ + mqtt_client: + type: mqtt + kind: client + exit: mqtt_client_tcp diff --git a/src/reference/config/bindings/mqtt/.partials/options.md b/src/reference/config/bindings/mqtt/.partials/options.md new file mode 100644 index 00000000..e69de29b diff --git a/src/reference/config/bindings/mqtt/.partials/routes.md b/src/reference/config/bindings/mqtt/.partials/routes.md new file mode 100644 index 00000000..68e75f4a --- /dev/null +++ b/src/reference/config/bindings/mqtt/.partials/routes.md @@ -0,0 +1,86 @@ +### routes\* + +> `array` of `object` + +Conditional `mqtt` specific routes. + +#### routes[].guarded + +> `object` as map of named `array` of `string` + +List of roles required by each named guard to authorize this route. + +```yaml +routes: + - guarded: + my_guard: + - read:items +``` + +#### routes[].when + +> `array` of `object` + +List of conditions (any match) to match this route. +Read more: [When a route matches](../../../../../concepts/bindings.md#when-a-route-matches) + +```yaml +routes: + - when: + - session: + - client-id: "*" + - publish: + - topic: command/one + - topic: command/two + - subscribe: + - topic: reply +``` + +#### when[].session + +> `array` of `object` + +Array of mqtt session properties + +#### session[].client-id + +> `string` + +An MQTT client identifier, allowing the usage of wildcards. + +#### when[].publish + +> `array` of `object` + +Array of MQTT topic names for publish capability. + +#### publish[].topic + +> `string` + +The MQTT topic to match on that supports standard MQTT wildcards `/+/`, `/#`. + +#### when[].subscribe + +> `array` of `object` + +Array of MQTT topic names for subscribe capability. + +#### subscribe[].topic + +> `string` + +The MQTT topic to match on that supports standard MQTT wildcards `/+/`, `/#`. + +#### routes[].exit + +> `string` + +Next binding when following this route. + +```yaml +routes: + - when: + ... + exit: mqtt_kafka_proxy +``` diff --git a/src/reference/config/bindings/mqtt/.partials/server.yaml b/src/reference/config/bindings/mqtt/.partials/server.yaml new file mode 100644 index 00000000..0572d7eb --- /dev/null +++ b/src/reference/config/bindings/mqtt/.partials/server.yaml @@ -0,0 +1,22 @@ + mqtt_server: + type: mqtt + kind: server + options: + authorization: + my_jwt_guard: + credentials: + connect: + username: Bearer {credentials} + versions: + - v5 + - v3.1.1 + routes: + - when: + - session: + - client-id: "*" + - publish: + - topic: command/one + - topic: command/two + - subscribe: + - topic: reply + exit: mqtt_kafka_proxy diff --git a/src/reference/config/bindings/mqtt/README.md b/src/reference/config/bindings/mqtt/README.md new file mode 100644 index 00000000..66ab2245 --- /dev/null +++ b/src/reference/config/bindings/mqtt/README.md @@ -0,0 +1,39 @@ +--- +redirectFrom: /reference/config/bindings/binding-mqtt.html +dir: + collapsible: false + link: true +shortTitle: mqtt +category: + - Binding +tag: + - mqtt + - server + - client +--- + +# mqtt Binding + +Defines a binding with `mqtt` protocol support, with `server` behavior. + +## server + +> [Full config](./server.md) + +The `server` kind `mqtt` binding decodes the MQTT protocol on the inbound network stream, producing higher level application streams for each `publish` or `subscribe` MQTT topic. The `session` state is also described by a higher level application stream. + +Conditional routes based on the MQTT topic name are used to route these application streams to an `exit` binding. + +```yaml {3} + +``` + +## client + +> [Full config](./client.md) + +The `client` kind `mqtt` binding encodes the MQTT protocol to the outbound network stream. + +```yaml {3} + +``` diff --git a/src/reference/config/bindings/mqtt/client.md b/src/reference/config/bindings/mqtt/client.md new file mode 100644 index 00000000..d1437056 --- /dev/null +++ b/src/reference/config/bindings/mqtt/client.md @@ -0,0 +1,53 @@ +--- +shortTitle: client +--- + +# mqtt client + +The mqtt client binding encodes the MQTT protocol to the outbound network stream. + +```yaml {3} + +``` + +## Configuration (\* required) + +### options + +> `object` + +The `client` specific options. + +```yaml +options: + authorization: + my_jwt_guard: + credentials: + connect: + username: Bearer {credentials} + versions: + - v5 + - v3.1.1 +``` + + + +#### options.authorization + +> `object` as map of named `object` properties + +Authorization by a named guard. + +```yaml +authorization: + my_jwt_guard: + credentials: + connect: + username: Bearer {credentials} +``` + + + + + + diff --git a/src/reference/config/bindings/mqtt/server.md b/src/reference/config/bindings/mqtt/server.md new file mode 100644 index 00000000..f422964d --- /dev/null +++ b/src/reference/config/bindings/mqtt/server.md @@ -0,0 +1,102 @@ +--- +shortTitle: server +--- + +# mqtt server + +The mqtt server binding decodes the MQTT protocol on the inbound network stream, producing higher level application streams for each `publish` or `subscribe` MQTT topic. + +```yaml {3} + +``` + +## Configuration (\* required) + +### options + +> `object` + +The `server` specific options. + +```yaml +options: + authorization: + my_jwt_guard: + credentials: + connect: + username: Bearer {credentials} + versions: + - v5 + - v3.1.1 +``` + + + +#### options.authorization + +> `object` as map of named `object` properties + +Authorization by a named guard. + +```yaml +authorization: + my_jwt_guard: + credentials: + connect: + username: Bearer {credentials} +``` + + + +#### options.versions + +> `array` of `enum` [ `v3.1.1`, `v5` ] + +Supported protocol versions. + +#### options.topics + +> `array` of `object` + +Topic configuration. + +#### topics[].name + +> `string` + +Topic name. + +#### topics[].content + +> `enum` [ `double`, `float`, `int32`, `int64`, `json`, `string` ], `object` + +Enforce validation for content + +#### content.model\* + +> `enum` [ `double`, `float`, `int32`, `int64`, `json`, `string` ] + +A schema or type to validate the request content. Refer to the individual [model](../../models/) docs for type specific implementation. + +#### topics[].user-properties + +> `object` as map of named `enum` [ `double`, `float`, `int32`, `int64`, `json`, `string` ], `object` as map of named `object` properties + +Enforce validation for user provided properties. + +```yaml +user-properties: + my-app-prop: + model: int32 + range: 0-100 +``` + +#### user-properties.model\* + +> `enum` [ `double`, `float`, `int32`, `int64`, `json`, `string` ] + +A schema or type to validate the user-properties content. Refer to the individual [model](../../models/) docs for type specific implementation. + + + + diff --git a/src/reference/config/bindings/openapi-asyncapi/.partials/options.md b/src/reference/config/bindings/openapi-asyncapi/.partials/options.md new file mode 100644 index 00000000..71361757 --- /dev/null +++ b/src/reference/config/bindings/openapi-asyncapi/.partials/options.md @@ -0,0 +1,78 @@ +### options + +> `object` + +The `openapi-asyncapi` specific options. + +```yaml +options: + specs: + openapi: + my-openapi-spec: + catalog: + my_catalog: + subject: petstore + version: latest + asyncapi: + my-asyncapi-spec: + catalog: + my_catalog: + subject: petstore + version: latest +``` + +#### options.specs + +> `object` + +OpenAPI and AsyncAPI specs definition. + +#### specs.openapi\* + +> `object` as map of named `object` properties + +Options for each configured OpenAPI spec. + +#### openapi.catalog + +> `object` as map of named `object` properties + +The Catalog specific options. + +#### catalog.subject\* + +> `string` + +Subject name used when storing the catalog artifact. + +#### catalog.version + +> `string` | Default: `latest` + +Catalog artifact version to use. + +#### specs.asyncapi\* + +> `object` as map of named `object` properties + +Options for each configured AsyncAPI spec. + +#### asyncapi.catalog + +> `object` as map of named `object` properties + +The `catalog` catalog specific options. + + +#### catalog.subject\* + +> `string` + +Subject name used when storing the catalog artifact. + +#### catalog.version + +> `string` | Default: `latest` + +Catalog artifact version to use. + diff --git a/src/reference/config/bindings/openapi-asyncapi/.partials/proxy.yaml b/src/reference/config/bindings/openapi-asyncapi/.partials/proxy.yaml new file mode 100644 index 00000000..9e85354f --- /dev/null +++ b/src/reference/config/bindings/openapi-asyncapi/.partials/proxy.yaml @@ -0,0 +1,23 @@ + openapi_asyncapi_proxy: + type: openapi-asyncapi + kind: proxy + options: + specs: + openapi: + my-openapi-spec: + catalog: + my_catalog: + subject: petstore + version: latest + asyncapi: + my-asyncapi-spec: + catalog: + my_catalog: + subject: petstore + version: latest + routes: + - when: + - api-id: my-openapi-spec + exit: asyncapi_client + with: + api-id: my-asyncapi-spec diff --git a/src/reference/config/bindings/openapi-asyncapi/.partials/routes.md b/src/reference/config/bindings/openapi-asyncapi/.partials/routes.md new file mode 100644 index 00000000..f4f4e6fb --- /dev/null +++ b/src/reference/config/bindings/openapi-asyncapi/.partials/routes.md @@ -0,0 +1,73 @@ +### routes + +> `array` of `object` + +Conditional `openapi-asyncapi` specific routes. + +#### routes[].guarded + +> `object` as map of named `array` of `string` + +List of roles required by each named guard to authorize this route. + +```yaml +routes: + - guarded: + my_guard: + - read:items +``` + +#### routes[].when + +> `array` of `object` + +List of conditions to match this route when adapting `openapi` request-response streams to `asyncapi` streams. +Read more: [When a route matches](../../../../../concepts/bindings.md#when-a-route-matches) + +#### when[].api-id + +> `string` + +OpenAPI spec identifier that matches from the `openapi` binding request stream. + +#### when[].operation-id + +> `string` + +OpenAPI OperationId that can be mapped between OpenAPI and AsyncAPI spec + +#### routes[].exit + +> `string` + +Next binding when following this route. + +```yaml +routes: + - when: + ... + exit: asyncapi_client +``` + +#### routes[].with\* + +> `object` + +Defines the route with the AsyncAPI spec identifier and OperationId. + +```yaml +with: + api-id: my-asyncapi-spec +``` + +#### with.api-id + +> `string` + +AsyncAPI spec identifier that the route exits with to the next binding. + +#### with.operation-id + +> `string` + +AsyncAPI OperationId that the route exits with to the next binding. diff --git a/src/reference/config/bindings/openapi-asyncapi/README.md b/src/reference/config/bindings/openapi-asyncapi/README.md new file mode 100644 index 00000000..e2b7be0e --- /dev/null +++ b/src/reference/config/bindings/openapi-asyncapi/README.md @@ -0,0 +1,26 @@ +--- +redirectFrom: /reference/config/bindings/binding-openapi-asyncapi.html +dir: + collapsible: false + link: true +shortTitle: openapi-asyncapi +category: + - Binding +tag: + - openapi-asyncapi + - proxy +--- + +# openapi-asyncapi Binding + +The `proxy` kind `openapi-asyncapi` binding adapts OpenAPI request-response streams to AsyncAPI streams. + +## proxy + +> [Full config](./proxy.md) + +Behave as an `openapi-asyncapi` `proxy` for adapting `openapi` operations to `asyncapi` operations. + +```yaml {3} + +``` diff --git a/src/reference/config/bindings/openapi-asyncapi/proxy.md b/src/reference/config/bindings/openapi-asyncapi/proxy.md new file mode 100644 index 00000000..c6147fa5 --- /dev/null +++ b/src/reference/config/bindings/openapi-asyncapi/proxy.md @@ -0,0 +1,18 @@ +--- +shortTitle: proxy +--- + +# openapi-asyncapi proxy + +The openapi-asyncapi proxy binding for adapting `openapi` operations to `asyncapi` operations. + +```yaml {3} + +``` + +## Configuration (\* required) + + + + + diff --git a/src/reference/config/bindings/openapi/.partials/client.yaml b/src/reference/config/bindings/openapi/.partials/client.yaml new file mode 100644 index 00000000..7dd17bab --- /dev/null +++ b/src/reference/config/bindings/openapi/.partials/client.yaml @@ -0,0 +1,15 @@ + openapi_client: + type: openapi + kind: client + options: + tcp: + host: localhost + port: 8080 + specs: + petstore: + servers: + - url: http://localhost:9090 + catalog: + my_catalog: + subject: petstore + version: latest diff --git a/src/reference/config/bindings/openapi/.partials/options.md b/src/reference/config/bindings/openapi/.partials/options.md new file mode 100644 index 00000000..9ff7069a --- /dev/null +++ b/src/reference/config/bindings/openapi/.partials/options.md @@ -0,0 +1,115 @@ +### options + +> `object` + +The `openapi` specific options. + +```yaml +options: + specs: + petstore: + servers: + - url: http://localhost:9090 + catalog: + my_catalog: + subject: petstore + version: latest +``` + +#### options.specs + +> `object` as map of named `object` properties + +The `specs` specific options. + +#### specs.catalog + +> `object` as map of named `object` properties + +The `catalog` specific options. + +#### catalog.subject\* + +> `string` + +Subject name used when storing the catalog artifact. + +#### catalog.version + +> `string` | Default: `latest` + +Catalog artifact version to use. + +#### specs.servers + +> `array` of `object` + +The servers to match from the schema that are used when defining endpoints. + +#### servers[].url + +> `string` | Pattern: `^([a-zA-Z0-9\\\\.-]+)(:(\\\\{[a-zA-Z_]+\\\\}|[0-9]+))?$` + +The server url to match in openapi spec + +#### options.http + +> `object` + +The http specific options. + +#### http.authorization + +> `object` as map of named `object` properties + +Authorization by guard for the `HTTP/1.1` and `HTTP/2` protocols. + +```yaml +authorization: + my_jwt_guard: + credentials: + headers: + authorization: Bearer {credentials} +``` + +#### authorization.credentials\* + +> `object` + +Defines how to extract credentials from the HTTP request. + +#### credentials.cookies + +> `object` as map of named `string` properties + +Named cookie value pattern with `{credentials}`. + +#### credentials.headers + +> `object` as map of named `string` properties + +Named header value pattern with `{credentials}`, e.g. `"Bearer` `{credentials}"`. + +#### credentials.query\* + +> `object` as map of named `string` properties + +Named query parameter value pattern with `{credentials}`. + +#### options.tcp + +> `object` + +TCP options to connect to an external client. + +#### tcp.host + +> `string` + +Hostname or IP address. + +#### tcp.port + +> `integer`, `string`, `array` + +Port number(s), including port number ranges. diff --git a/src/reference/config/bindings/openapi/.partials/server.yaml b/src/reference/config/bindings/openapi/.partials/server.yaml new file mode 100644 index 00000000..e0dbafb3 --- /dev/null +++ b/src/reference/config/bindings/openapi/.partials/server.yaml @@ -0,0 +1,13 @@ + openapi_server: + type: openapi + kind: server + options: + specs: + petstore: + servers: + - url: http://localhost:9090 + catalog: + my_catalog: + subject: petstore + version: latest + exit: openapi_client diff --git a/src/reference/config/bindings/openapi/README.md b/src/reference/config/bindings/openapi/README.md new file mode 100644 index 00000000..14d7aefb --- /dev/null +++ b/src/reference/config/bindings/openapi/README.md @@ -0,0 +1,37 @@ +--- +redirectFrom: /reference/config/bindings/binding-openapi.html +dir: + collapsible: false + link: true +shortTitle: openapi +category: + - Binding +tag: + - openapi + - server + - client +--- + +# openapi Binding + +Defines a binding with `openapi` spec, with `server` or `client` behavior. + +## server + +> [Full config](./server.md) + +The `server` kind `openapi` binding creates composite of `tcp`, `tls`, and `http` bindings with server kind and adapts HTTP request-response streams to OpenAPI request-response streams. + +```yaml {3} + +``` + +## client + +> [Full config](./client.md) + +The `client` kind `openapi` binding creates composite of `http`, `tls`, and `tcp` bindings with client kind and adapts OpenAPI request-response streams to HTTP request-response streams. + +```yaml {3} + +``` diff --git a/src/reference/config/bindings/openapi/client.md b/src/reference/config/bindings/openapi/client.md new file mode 100644 index 00000000..3df16a26 --- /dev/null +++ b/src/reference/config/bindings/openapi/client.md @@ -0,0 +1,26 @@ +--- +shortTitle: client +--- + +# openapi client + +The openapi client binding creates composite of `http`, `tls`, and `tcp` bindings with client kind and adapts OpenAPI request-response streams to HTTP request-response streams. + +```yaml {3} + +``` + +## Configuration (\* required) + + + + +#### options.tls + +> `object` + +The `tls` specific options. + + + + diff --git a/src/reference/config/bindings/openapi/server.md b/src/reference/config/bindings/openapi/server.md new file mode 100644 index 00000000..7ff3f32c --- /dev/null +++ b/src/reference/config/bindings/openapi/server.md @@ -0,0 +1,27 @@ +--- +shortTitle: server +--- + +# openapi server + +The openapi server binding creates composite of `tcp`, `tls`, and `http` bindings with server kind and adapts HTTP request-response streams to OpenAPI request-response streams. + +```yaml {3} + +``` + +## Configuration (\* required) + + + + + +#### options.tls + +> `object` + +The `tls` specific options. + + + + diff --git a/src/reference/config/bindings/proxy/.partials/client.yaml b/src/reference/config/bindings/proxy/.partials/client.yaml new file mode 100644 index 00000000..fc7c579c --- /dev/null +++ b/src/reference/config/bindings/proxy/.partials/client.yaml @@ -0,0 +1,4 @@ + proxy_server: + type: proxy + kind: client + exit: tcp_server diff --git a/src/reference/config/bindings/proxy/.partials/routes.md b/src/reference/config/bindings/proxy/.partials/routes.md new file mode 100644 index 00000000..213c2064 --- /dev/null +++ b/src/reference/config/bindings/proxy/.partials/routes.md @@ -0,0 +1,142 @@ +### routes + +> `array` of `object` + +Conditional `proxy` specific routes. + +```yaml +routes: + - when: + - transport: stream + family: inet4 + destination: + port: 443 + exit: tls_server +``` + +#### routes[].guarded + +> `object` as map of named `array` of `string` + +List of roles required by each named guard to authorize this route. + +```yaml +routes: + - guarded: + my_guard: + - read:items +``` + +#### routes[].when + +> `array` of `object` + +List of conditions (any match) to match this route. +Read more: [When a route matches](../../../../../concepts/bindings.md#when-a-route-matches) + +#### when[].transport + +> `enum` [ `stream`, `datagram` ] + +Transport type. + +#### when[].family + +> `enum` [ `inet`, `inet4`, `inet6`, `unix` ] + +Address family. + +#### when[].source + +> `object` + +Source address. + +#### source.host + +> `string` + +Hostname or IP address. + +#### source.port + +> `integer` + +Port number. + +#### when[].destination + +> `object` + +Destination address. + +#### destination.host + +> `string` + +Hostname or IP address. + +#### destination.port + +> `integer` + +Port number. + +#### when[].info + +> `object` + + + +#### info.alpn + +> `string` + +#### info.authority + +> `string` + +#### info.identity + +> `string` + +#### info.namespace + +> `string` + +#### info.secure + +> `object` + +#### secure.cipher + +> `string` + +#### secure.key + +> `string` + +#### secure.name + +> `string` + +#### secure.signature + +> `string` + +#### secure.version + +> `string` + +#### routes[].exit + +> `string` + +Next binding when following this route. + +```yaml +routes: + - when: + ... + exit: echo_server +``` diff --git a/src/reference/config/bindings/proxy/.partials/server.yaml b/src/reference/config/bindings/proxy/.partials/server.yaml new file mode 100644 index 00000000..13ef2c64 --- /dev/null +++ b/src/reference/config/bindings/proxy/.partials/server.yaml @@ -0,0 +1,10 @@ + proxy_server: + type: proxy + kind: server + routes: + - when: + - transport: stream + family: inet4 + destination: + port: 443 + exit: tls_server diff --git a/src/reference/config/bindings/proxy/README.md b/src/reference/config/bindings/proxy/README.md new file mode 100644 index 00000000..ad36046e --- /dev/null +++ b/src/reference/config/bindings/proxy/README.md @@ -0,0 +1,37 @@ +--- +redirectFrom: /reference/config/bindings/binding-proxy.html +dir: + collapsible: false + link: true +shortTitle: proxy +category: + - Binding +tag: + - proxy + - server + - client +--- + +# proxy Binding + +Defines a binding with `proxy` protocol support, with `server` or `client` behavior. Conditional routes based on the network transport type or network addresses are used to route these streams to an `exit` binding. + +## server + +> [Full config](./server.md) + +The `server` kind `proxy` binding decodes `Proxy v2` protocol on the inbound network stream, producing higher level application streams for each request. + +```yaml {3} + +``` + +## client + +> [Full config](./client.md) + +The `client` kind `proxy` binding receives inbound application streams and encodes each as a network stream via Proxy v2 protocol. + +```yaml {3} + +``` diff --git a/src/reference/config/bindings/proxy/client.md b/src/reference/config/bindings/proxy/client.md new file mode 100644 index 00000000..c2c35304 --- /dev/null +++ b/src/reference/config/bindings/proxy/client.md @@ -0,0 +1,17 @@ +--- +shortTitle: client +--- + +# proxy client + +The proxy client binding receives inbound application streams and encodes each as a network stream via Proxy v2 protocol. + +```yaml {3} + +``` + +## Configuration (\* required) + + + + diff --git a/src/reference/config/bindings/proxy/server.md b/src/reference/config/bindings/proxy/server.md new file mode 100644 index 00000000..01a9cceb --- /dev/null +++ b/src/reference/config/bindings/proxy/server.md @@ -0,0 +1,17 @@ +--- +shortTitle: server +--- + +# proxy server + +The proxy server binding decodes Proxy v2 protocol on the inbound network stream, producing higher level application streams for each request. + +```yaml {3} + +``` + +## Configuration (\* required) + + + + diff --git a/src/reference/config/bindings/sse-kafka/.partials/proxy.yaml b/src/reference/config/bindings/sse-kafka/.partials/proxy.yaml new file mode 100644 index 00000000..fa98b1c7 --- /dev/null +++ b/src/reference/config/bindings/sse-kafka/.partials/proxy.yaml @@ -0,0 +1,11 @@ + sse_kafka_proxy: + type: sse-kafka + kind: proxy + routes: + - when: + - path: /items + exit: kafka_cache_client + with: + topic: items-snapshots + event: + id: '["${base64(key)}","${etag}"]' diff --git a/src/reference/config/bindings/sse-kafka/.partials/routes.md b/src/reference/config/bindings/sse-kafka/.partials/routes.md new file mode 100644 index 00000000..ab1c026c --- /dev/null +++ b/src/reference/config/bindings/sse-kafka/.partials/routes.md @@ -0,0 +1,105 @@ +### routes + +> `array` of `object` + +Conditional `sse-kafka` specific routes. + +```yaml +routes: + - when: + - path: /items + exit: kafka_cache_client + with: + topic: items-snapshots + event: + id: '["${base64(key)}","${etag}"]' +``` + +#### routes[].guarded + +> `object` as map of named `array` of `string` + +List of roles required by each named guard to authorize this route. + +```yaml +routes: + - guarded: + my_guard: + - read:items +``` + +#### routes[].when + +> `array` of `object` + +List of conditions (any match) to match this route. +Read more: [When a route matches](../../../../../concepts/bindings.md#when-a-route-matches) + +```yaml +routes: + - when: + - path: /items +``` + +#### when[].path + +> `string` + +Path with optional embedded parameter names, such as `/{topic}`. + +#### routes[].exit + +> `string` + +Next binding when following this route. + +```yaml +routes: + - when: + ... + exit: kafka_cache_client +``` + +#### routes[].with + +> `object` + +Kafka parameters used when adapting `sse` data streams to `kafka` data streams. + +#### with.topic\* + +> `string` + +Topic name, optionally referencing path parameter such as `${params.topic}`. + +#### with.filters + +> `array` of `object` + +Kafka filters for matched route when adapting `sse` data streams to `kafka` data streams. + +List of criteria (any match). All specified headers and key must match for the combined criteria to match. + +#### filters[].key + +> `string` + +Message key, optionally referencing path parameter such as `${params.key}`. + +#### filters[].headers + +> `object` as map of named `string` properties + +Message headers, with value optionally referencing path parameter such as `${params.headerX}`. + +#### with.event + +> `object` + +Defines the SSE event syntax used when delivering Kafka messages to SSE clients. + +#### event.id + +> `enum` [ `${etag}`, `["${base64(key)}","${etag}"]` ] | Default: `${etag}` + +Format of `id` field in `sse` `event` diff --git a/src/reference/config/bindings/sse-kafka/README.md b/src/reference/config/bindings/sse-kafka/README.md new file mode 100644 index 00000000..d67798c1 --- /dev/null +++ b/src/reference/config/bindings/sse-kafka/README.md @@ -0,0 +1,34 @@ +--- +redirectFrom: /reference/config/bindings/binding-sse-kafka.html +dir: + collapsible: false + link: true +shortTitle: sse-kafka +category: + - Binding +tag: + - sse-kafka + - proxy +--- + +# sse-kafka Binding + +Defines a binding with `sse-kafka` support, with `proxy` behavior. + +## proxy + +> [Full config](./proxy.md) + +The `proxy` kind `sse-kafka` binding adapts `sse` data streams into `kafka` data streams, so that `kafka` messages can be delivered to `sse` clients. + +Filtering can be performed by `kafka` message key, message headers, or a combination of both message key and headers, extracting the parameter values from the inbound `sse` path. + +Progress across `kafka` topic partitions is conveyed to the `sse` client via event `id` and when the stream is implicitly paused during `sse` client reconnect, the `last-event-id` header in the `sse` reconnect request contains the last received event `id` value, allowing the `sse` stream to resume reliable message delivery automatically. + +The event `id` can be configured to include the message `key` and `etag` of each message, avoiding the need to duplicate the key in the message body and making it suitable for integration with `http-kafka` binding's use of `etag` for conditional `if-match` operations. + +When a `kafka` tombstone (`null` value) message is received by the `sse-kafka` binding, it delivers a `delete` event to the `sse` client. This informs the client which specific message has been deleted by observing the message key from the `sse` `delete` event `id`. + +```yaml {3} + +``` diff --git a/src/reference/config/bindings/sse-kafka/proxy.md b/src/reference/config/bindings/sse-kafka/proxy.md new file mode 100644 index 00000000..99bfe6b8 --- /dev/null +++ b/src/reference/config/bindings/sse-kafka/proxy.md @@ -0,0 +1,17 @@ +--- +shortTitle: proxy +--- + +# sse-kafka proxy + +The sse-kafka proxy binding for adapting `sse` data streams to `kafka` data streams. + +```yaml {3} + +``` + +## Configuration (\* required) + + + + diff --git a/src/reference/config/bindings/sse/.partials/client.yaml b/src/reference/config/bindings/sse/.partials/client.yaml new file mode 100644 index 00000000..523235a4 --- /dev/null +++ b/src/reference/config/bindings/sse/.partials/client.yaml @@ -0,0 +1,4 @@ + sse_server: + type: sse + kind: client + exit: tcp_client diff --git a/src/reference/config/bindings/sse/.partials/options.md b/src/reference/config/bindings/sse/.partials/options.md new file mode 100644 index 00000000..2bf729d9 --- /dev/null +++ b/src/reference/config/bindings/sse/.partials/options.md @@ -0,0 +1,40 @@ +### options + +> `object` + +The `sse` specific options. + +```yaml +options: + retry: 2000 +``` + +#### options.retry + +> `integer` | Default: `2000` + +Retry delay in milliseconds. + +#### options.requests + +> `array` of `object` + +The `requests` specific options. + +#### requests[].path + +> `string` + +The path selector. + +#### requests[].content + +> `enum` [ `double`, `float`, `int32`, `int64`, `json`, `string` ], `object` + +Enforce validation for the request content. + +#### content.model\* + +> `enum` [ `double`, `float`, `int32`, `int64`, `json`, `string` ] + +A schema or type to validate the request content. Refer to the individual [model](../../../models/) docs for type specific implementation. diff --git a/src/reference/config/bindings/sse/.partials/routes.md b/src/reference/config/bindings/sse/.partials/routes.md new file mode 100644 index 00000000..1d404e17 --- /dev/null +++ b/src/reference/config/bindings/sse/.partials/routes.md @@ -0,0 +1,60 @@ +### routes + +> `array` of `object` + +Conditional `sse` specific routes. + +```yaml +routes: + - guarded: + my_guard: + - read:items + when: + - path: /items + exit: sse_kafka_proxy +``` + +#### routes[].guarded + +> `object` as map of named `array` of `string` + +List of roles required by each named guard to authorize this route. + +```yaml +routes: + - guarded: + my_guard: + - read:items +``` + +#### routes[].when + +> `array` of `object` + +List of conditions (any match) to match this route. +Read more: [When a route matches](../../../../../concepts/bindings.md#when-a-route-matches) + +```yaml +routes: + - when: + - path: /items +``` + +#### when[].path + +> `string` + +Path pattern. + +#### routes[].exit + +> `string` + +Next binding when following this route. + +```yaml +routes: + - when: + ... + exit: sse_kafka_proxy +``` diff --git a/src/reference/config/bindings/sse/.partials/server.yaml b/src/reference/config/bindings/sse/.partials/server.yaml new file mode 100644 index 00000000..6851449b --- /dev/null +++ b/src/reference/config/bindings/sse/.partials/server.yaml @@ -0,0 +1,4 @@ + sse_server: + type: sse + kind: server + exit: sse_kafka_proxy diff --git a/src/reference/config/bindings/sse/README.md b/src/reference/config/bindings/sse/README.md new file mode 100644 index 00000000..8d68cecf --- /dev/null +++ b/src/reference/config/bindings/sse/README.md @@ -0,0 +1,39 @@ +--- +redirectFrom: /reference/config/bindings/binding-sse.html +dir: + collapsible: false + link: true +shortTitle: sse +category: + - Binding +tag: + - sse + - server + - client +--- + +# sse Binding + +Defines a binding with Server Sent Events (SSE) protocol support, with `server` behavior. + +## server + +> [Full config](./server.md) + +The `server` kind `sse` binding converts inbound `http` request-response streams into `sse` request-response streams. + +Messages received on the `sse` response stream are encoded using `Server Sent Events` protocol, including support for custom `event` types and last event `id`. + +```yaml {3} + +``` + +## client + +> [Full config](./client.md) + +The `client` kind `sse` binding converts outbound `see` request-response streams into `http` request-response streams. + +```yaml {3} + +``` diff --git a/src/reference/config/bindings/sse/client.md b/src/reference/config/bindings/sse/client.md new file mode 100644 index 00000000..25077620 --- /dev/null +++ b/src/reference/config/bindings/sse/client.md @@ -0,0 +1,18 @@ +--- +shortTitle: client +--- + +# sse client + +The sse client binding converts outbound `see` request-response streams into `http` request-response streams. + +```yaml {3} + +``` + +## Configuration (\* required) + + + + + diff --git a/src/reference/config/bindings/sse/server.md b/src/reference/config/bindings/sse/server.md new file mode 100644 index 00000000..aa8d62b2 --- /dev/null +++ b/src/reference/config/bindings/sse/server.md @@ -0,0 +1,18 @@ +--- +shortTitle: server +--- + +# sse server + +The sse server binding converts inbound `http` request-response streams into `sse` request-response streams. + +```yaml {3} + +``` + +## Configuration (\* required) + + + + + diff --git a/src/reference/config/bindings/tcp/.partials/client.yaml b/src/reference/config/bindings/tcp/.partials/client.yaml new file mode 100644 index 00000000..b4bf595f --- /dev/null +++ b/src/reference/config/bindings/tcp/.partials/client.yaml @@ -0,0 +1,3 @@ + tcp_client: + type: tcp + kind: client diff --git a/src/reference/config/bindings/tcp/.partials/options.md b/src/reference/config/bindings/tcp/.partials/options.md new file mode 100644 index 00000000..42fd8814 --- /dev/null +++ b/src/reference/config/bindings/tcp/.partials/options.md @@ -0,0 +1,35 @@ +### options + +> `object` + +The `tcp` specific options. + +```yaml +options: + host: 0.0.0.0 + port: 12345 +``` + +#### options.host + +> `string` + +Hostname or IP address. + +#### options.port + +> `integer`, `string`, `array` + +Port number(s), including port number ranges with the pattern: `^\\d+(-\\d+)?$`. + +```yaml +options: + port: 12345 +``` + +```yaml +options: + port: + - 12345 + - "54320-54330" +``` diff --git a/src/reference/config/bindings/tcp/.partials/routes.md b/src/reference/config/bindings/tcp/.partials/routes.md new file mode 100644 index 00000000..4d863ad6 --- /dev/null +++ b/src/reference/config/bindings/tcp/.partials/routes.md @@ -0,0 +1,36 @@ +### routes + +> `array` of `object` + +Conditional `tcp` specific routes. + +#### routes[].guarded + +> `object` as map of named `array` of `string` + +List of roles required by each named guard to authorize this route. + +#### routes[].when + +> `array` of `object` + +List of conditions (any match) to match this route. +Read more: [When a route matches](../../../../../concepts/bindings.md#when-a-route-matches) + +#### when[].authority + +> `string` + +Associated authority. + +#### when[].cidr + +> `string` | Pattern: `^[0-9a-fA-F:.]+/(\\d{1,3})$` + +CIDR mask. + +#### when[].port + +> `integer`, `string`, `array` + +Port number(s), including port number ranges. diff --git a/src/reference/config/bindings/tcp/.partials/server.yaml b/src/reference/config/bindings/tcp/.partials/server.yaml new file mode 100644 index 00000000..77ac059c --- /dev/null +++ b/src/reference/config/bindings/tcp/.partials/server.yaml @@ -0,0 +1,7 @@ + tcp_server: + type: tcp + kind: server + exit: echo_server + options: + host: 0.0.0.0 + port: 12345 diff --git a/src/reference/config/bindings/tcp/README.md b/src/reference/config/bindings/tcp/README.md new file mode 100644 index 00000000..5ff952ea --- /dev/null +++ b/src/reference/config/bindings/tcp/README.md @@ -0,0 +1,39 @@ +--- +redirectFrom: /reference/config/bindings/binding-tcp.html +dir: + collapsible: false + link: true +shortTitle: tcp +category: + - Binding +tag: + - tcp + - server + - client +--- + +# tcp Binding + +Defines a binding with `tcp` protocol support, with `server` or `client` behavior. + +Conditional routes based on the hostname authority and network address mask are used to route these streams to an `exit` binding. + +## server + +> [Full config](./server.md) + +The `server` kind `tcp` binding listens for inbound socket connections, producing higher level application streams for each remote TCP client. + +```yaml {3} + +``` + +## client + +> [Full config](./client.md) + +The `client` kind `tcp` binding receives inbound application streams and initiates outbound TCP network connections to a remote TCP server address. + +```yaml {3} + +``` diff --git a/src/reference/config/bindings/tcp/client.md b/src/reference/config/bindings/tcp/client.md new file mode 100644 index 00000000..e9e25f86 --- /dev/null +++ b/src/reference/config/bindings/tcp/client.md @@ -0,0 +1,17 @@ +--- +shortTitle: client +--- + +# tcp client + +The tcp client binding receives inbound application streams and initiates outbound TCP network connections to a remote TCP server address. + +```yaml {3} + +``` + +## Configuration (\* required) + + + + diff --git a/src/reference/config/bindings/tcp/server.md b/src/reference/config/bindings/tcp/server.md new file mode 100644 index 00000000..5852bc9c --- /dev/null +++ b/src/reference/config/bindings/tcp/server.md @@ -0,0 +1,33 @@ +--- +shortTitle: server +--- + +# tcp server + +The tcp server binding listens for inbound socket connections, producing higher level application streams for each remote TCP client. + +```yaml {3} + +``` + +## Configuration (\* required) + + + + + +#### routes[].exit + +> `string` + +Next binding when following this route, for kind `server` only. + +```yaml +routes: + - when: + ... + exit: echo_server +``` + + + diff --git a/src/reference/config/bindings/tls/.partials/client.yaml b/src/reference/config/bindings/tls/.partials/client.yaml new file mode 100644 index 00000000..fee7d878 --- /dev/null +++ b/src/reference/config/bindings/tls/.partials/client.yaml @@ -0,0 +1,3 @@ +tls_client: + type: tls + kind: client diff --git a/src/reference/config/bindings/tls/.partials/options.md b/src/reference/config/bindings/tls/.partials/options.md new file mode 100644 index 00000000..2fb40129 --- /dev/null +++ b/src/reference/config/bindings/tls/.partials/options.md @@ -0,0 +1,63 @@ +### options + +> `object` + +The `tls` specific options. + +```yaml +options: + keys: + - localhost + sni: + - localhost + alpn: + - echo +``` + +#### options.version + +> `string` + +Protocol version. + +#### options.keys + +> `array` of `string` + +A list of reference names for the Vault key. + +#### options.trust + +> `array` of `string` + +A list of reference names for the Vault certificate. + +#### options.signers + +> `array` of `string` + +A list of reference names for the Vault signer certificate. + +#### options.trustcacerts + +> `boolean` + +Trust CA certificates. When the this property is not explicitly set it will be automatically set to `true` if [options.trust](#options-trust) is `null`. + +#### options.sni + +> `array` of `string` + +A list of the Server Name Indications. + +#### options.alpn + +> `array` of `string` + +Application protocols. + +#### options.mutual + +> `enum` [ `required`, `requested`, `none` ] + +Mutual authentication. When the this property is not explicitly set it will be automatically set to `none` if [options.trust](#options-trust) is `null`, otherwise it will be set to `required`. diff --git a/src/reference/config/bindings/tls/.partials/proxy.yaml b/src/reference/config/bindings/tls/.partials/proxy.yaml new file mode 100644 index 00000000..f5a44207 --- /dev/null +++ b/src/reference/config/bindings/tls/.partials/proxy.yaml @@ -0,0 +1,3 @@ +tls_proxy: + type: tls + kind: proxy diff --git a/src/reference/config/bindings/tls/.partials/routes.md b/src/reference/config/bindings/tls/.partials/routes.md new file mode 100644 index 00000000..e46c05bc --- /dev/null +++ b/src/reference/config/bindings/tls/.partials/routes.md @@ -0,0 +1,69 @@ +### routes\* + +> `array` of `object` + +Conditional `tls` specific routes. + +```yaml +routes: + - when: + - alpn: echo + exit: echo_server +``` + +#### routes[].guarded + +> `object` as map of named `array` of `string` + +List of roles required by each named guard to authorize this route. + +```yaml +routes: + - guarded: + my_guard: + - read:items +``` + +#### routes[].when + +> `array` of `object` + +List of conditions (any match) to match this route. +Read more: [When a route matches](../../../../../concepts/bindings.md#when-a-route-matches) + +```yaml +routes: + - when: + - alpn: echo +``` + +#### when[].authority + +> `string` + +Associated authority. + +#### when[].alpn + +> `string` + +Application protocol. + +#### when[].port + +> `integer`, `string`, `array` + +Port number(s), including port number ranges. + +#### routes[].exit + +> `string` + +Next binding when following this route. + +```yaml +routes: + - when: + ... + exit: echo_server +``` diff --git a/src/reference/config/bindings/tls/.partials/server.yaml b/src/reference/config/bindings/tls/.partials/server.yaml new file mode 100644 index 00000000..894620f1 --- /dev/null +++ b/src/reference/config/bindings/tls/.partials/server.yaml @@ -0,0 +1,16 @@ + tls_server: + type: tls + kind: server + vault: server + exit: default_server + options: + keys: + - localhost + sni: + - localhost + alpn: + - echo + routes: + - when: + - alpn: echo + exit: echo_server diff --git a/src/reference/config/bindings/tls/README.md b/src/reference/config/bindings/tls/README.md new file mode 100644 index 00000000..ce282de8 --- /dev/null +++ b/src/reference/config/bindings/tls/README.md @@ -0,0 +1,57 @@ +--- +redirectFrom: /reference/config/bindings/binding-tls.html +dir: + collapsible: false + link: true +shortTitle: tls +category: + - Binding +tag: + - tls + - server + - client +--- + +# tls Binding + +Defines a binding with `tls` protocol support, with `server`, `client` or `proxy` behavior. + +## server + +> [Full config](./server.md) + +The `server` kind `tls` binding decodes encrypted TLS protocol on the inbound network stream, producing higher level cleartext application streams for each request. + +Certificates and keys required to complete the TLS handshake are provided by a `vault` referenced in the binding configuration. + +Conditional routes based on `tls` hostname authority or negotiated ALPN protocol are used to route these streams to an `exit` binding. + +```yaml {3} + +``` + +## client + +> [Full config](./client.md) + +The `client` kind `tls` binding receives inbound application streams and encodes each as an encrypted network stream via TLS protocol. + +Certificates and keys required to complete the TLS handshake are provided by a `vault` referenced in the binding configuration. + +Conditional routes based on `tls` hostname authority or negotiated ALPN protocol are used to route these streams to an `exit` binding. + +```yaml {3} + +``` + +## proxy + +> [Full config](./proxy.md) + +The `proxy` kind `tls` binding detects `ClientHello` `server_name` extension to provide TLS virtual hosting by routing based on server name. + +A `vault` is not required to proxy TLS protocol as the handshake is only observed read-only as it routes through the `tls` `proxy` binding. + +```yaml {3} + +``` diff --git a/src/reference/config/bindings/tls/client.md b/src/reference/config/bindings/tls/client.md new file mode 100644 index 00000000..2d2c49be --- /dev/null +++ b/src/reference/config/bindings/tls/client.md @@ -0,0 +1,19 @@ +--- +shortTitle: client +--- + +# tls client + +The tls client binding receives inbound application streams and encodes each as an encrypted network stream via TLS protocol. + +```yaml {3} + +``` + +## Configuration (\* required) + + + + + + diff --git a/src/reference/config/bindings/tls/proxy.md b/src/reference/config/bindings/tls/proxy.md new file mode 100644 index 00000000..28cd7ffc --- /dev/null +++ b/src/reference/config/bindings/tls/proxy.md @@ -0,0 +1,18 @@ +--- +shortTitle: proxy +--- + +# tls proxy + +The tls proxy binding detects `ClientHello` `server_name` extension to provide TLS virtual hosting by routing based on server name. + +```yaml {3} + +``` + +## Configuration (\* required) + + + + + diff --git a/src/reference/config/bindings/tls/server.md b/src/reference/config/bindings/tls/server.md new file mode 100644 index 00000000..fcb0ba74 --- /dev/null +++ b/src/reference/config/bindings/tls/server.md @@ -0,0 +1,19 @@ +--- +shortTitle: server +--- + +# tls server + +The tls server binding decodes encrypted TLS protocol on the inbound network stream, producing higher level cleartext application streams for each request. + +```yaml {3} + +``` + +## Configuration (\* required) + + + + + + diff --git a/src/reference/config/bindings/ws/.partials/client.yaml b/src/reference/config/bindings/ws/.partials/client.yaml new file mode 100644 index 00000000..6c0bebd8 --- /dev/null +++ b/src/reference/config/bindings/ws/.partials/client.yaml @@ -0,0 +1,3 @@ +ws_client: + type: ws + kind: client diff --git a/src/reference/config/bindings/ws/.partials/options.md b/src/reference/config/bindings/ws/.partials/options.md new file mode 100644 index 00000000..bafedc25 --- /dev/null +++ b/src/reference/config/bindings/ws/.partials/options.md @@ -0,0 +1,35 @@ +### options + +> `object` + +The `ws` specific options. + +#### options.defaults + +> `object` + +Defaults. + +#### defaults.protocol + +> `string` + +Subprotocol. + +#### defaults.scheme + +> `string` + +Scheme. + +#### defaults.authority + +> `string` + +Authority. + +#### defaults.path + +> `string` + +Path. diff --git a/src/reference/config/bindings/ws/.partials/routes.md b/src/reference/config/bindings/ws/.partials/routes.md new file mode 100644 index 00000000..a4407158 --- /dev/null +++ b/src/reference/config/bindings/ws/.partials/routes.md @@ -0,0 +1,75 @@ +### routes\* + +> `array` of `object` + +Conditional `ws` specific routes. + +```yaml +routes: + - when: + - protocol: echo + exit: echo_server +``` + +#### routes[].guarded + +> `object` as map of named `array` of `string` + +List of roles required by each named guard to authorize this route. + +```yaml +routes: + - guarded: + my_guard: + - read:items +``` + +#### routes[].when + +> `array` of `object` + +List of conditions (any match) to match this route. +Read more: [When a route matches](../../../../../concepts/bindings.md#when-a-route-matches) + +```yaml +routes: + - when: + - protocol: echo +``` + +#### when[].protocol + +> `string` + +Subprotocol pattern. + +#### when[].scheme + +> `string` + +Scheme pattern. + +#### when[].authority + +> `string` + +Authority pattern. + +#### when[].path + +> `string` + +Path pattern. + +#### routes[].exit + +> `string` + +Next binding when following this route. + +```yaml +routes: + - when: + ... + exit: echo_server +``` diff --git a/src/reference/config/bindings/ws/.partials/server.yaml b/src/reference/config/bindings/ws/.partials/server.yaml new file mode 100644 index 00000000..c2150f25 --- /dev/null +++ b/src/reference/config/bindings/ws/.partials/server.yaml @@ -0,0 +1,8 @@ + ws_server: + type: ws + kind: server + exit: echo_server + routes: + - when: + - protocol: mqtt + exit: mqtt_server diff --git a/src/reference/config/bindings/ws/README.md b/src/reference/config/bindings/ws/README.md new file mode 100644 index 00000000..fa9dc51a --- /dev/null +++ b/src/reference/config/bindings/ws/README.md @@ -0,0 +1,41 @@ +--- +redirectFrom: /reference/config/bindings/binding-ws.html +dir: + collapsible: false + link: true +shortTitle: ws +category: + - Binding +tag: + - ws + - server + - client +--- + +# ws Binding + +Defines a binding with WebSockets protocol support, with `server` or `client` behavior. + +## server + +> [Full config](./server.md) + +The `server` kind `ws` binding converts inbound `http` request-response streams into `ws` full-duplex streams. + +Conditional routes based on `ws` scheme, authority, path or negotiated subprotocol are used to route these streams to an `exit` binding. + +```yaml {3} + +``` + +## client + +> [Full config](./client.md) + +The `client` kind `ws` binding converts inbound `ws` full duplex streams into `http` request-response streams. + +Conditional routes based on `ws` scheme, authority, path or negotiated subprotocol are used to route these streams to an `exit` binding. + +```yaml {3} + +``` diff --git a/src/reference/config/bindings/ws/client.md b/src/reference/config/bindings/ws/client.md new file mode 100644 index 00000000..190ffe68 --- /dev/null +++ b/src/reference/config/bindings/ws/client.md @@ -0,0 +1,18 @@ +--- +shortTitle: client +--- + +# ws client + +The ws client binding converts inbound `ws` full duplex streams into `http` request-response streams. + +```yaml {3} + +``` + +## Configuration (\* required) + + + + + diff --git a/src/reference/config/bindings/ws/server.md b/src/reference/config/bindings/ws/server.md new file mode 100644 index 00000000..51e30d75 --- /dev/null +++ b/src/reference/config/bindings/ws/server.md @@ -0,0 +1,17 @@ +--- +shortTitle: server +--- + +# ws server + +The ws server binding binding converts inbound `http` request-response streams into `ws` full-duplex streams. + +```yaml {3} + +``` + +## Configuration (\* required) + + + + diff --git a/src/reference/config/catalogs/.partials/options-schema-registry.md b/src/reference/config/catalogs/.partials/options-schema-registry.md new file mode 100644 index 00000000..609b284e --- /dev/null +++ b/src/reference/config/catalogs/.partials/options-schema-registry.md @@ -0,0 +1,23 @@ +### options + +> `object` + +The `schema-registry` specific options. + +#### options.url + +> `string` + +Schema Registry URL to access schemas via API calls. + +#### options.context + +> `string` | Default: `default` + +Schema context represents an independent scope in the Schema Registry. + +#### options.max-age + +> `number` | Default: `300` + +The maximum duration in seconds to keep a cached schema before fetching the schema again. diff --git a/src/reference/config/catalogs/catalog-apicurio-registry.md b/src/reference/config/catalogs/apicurio-registry.md similarity index 62% rename from src/reference/config/catalogs/catalog-apicurio-registry.md rename to src/reference/config/catalogs/apicurio-registry.md index 7a9d1f3a..e377a5af 100644 --- a/src/reference/config/catalogs/catalog-apicurio-registry.md +++ b/src/reference/config/catalogs/apicurio-registry.md @@ -1,13 +1,15 @@ --- +redirectFrom: /reference/config/catalogs/catalog-apicurio-registry.html shortTitle: apicurio-registry -description: Zilla runtime apicurio-registry catalog category: - Catalog +tags: + - apicurio-registry --- # apicurio-registry Catalog -Zilla runtime apicurio-registry catalog. +Defines a catalog with schemas, AsyncAPI/OpenAPI definitions pulled from a remote registry to enforce validation or create APIs. Accepted `type` aliases: `apicurio` @@ -21,31 +23,15 @@ catalog: id-encoding: default ``` -## Summary - -Defines a catalog with schemas, AsyncAPI/OpenAPI definitions pulled from a remote registry to enforce validation or create APIs. - -## Configuration - -:::: note Properties - -- [options](#options) - - [options.url\*](#options-url) - - [options.group-id](#options-group-id) - - [options.use-id](#options-use-id) - - [options.id-encoding](#options-id-encoding) - -::: right -\* required -::: - -:::: +## Configuration (\* required) ### options > `object` -#### options.url\* +The `apicurio-registry` specific options. + +#### options.url > `string` @@ -53,18 +39,24 @@ Apicurio URL to access schemas or AsyncAPI/OpenAPI definitions via API calls. #### options.group-id -> `string` +> `string` | Default: `default` The artifact group ID represents an independent scope in Apicurio. #### options.use-id -> `enum` [ "globalId", "contentId" ] | Default: `"globalId"` +> `enum` [ `globalId`, `contentId` ] | Default: `globalId` Use global or content identifier for resolving schemas in Apicurio. #### options.id-encoding -> `enum` [ "default", "legacy" ] | Default: `"default"` +> `enum` [ `default`, `legacy` ] | Default: `default` Store identifiers as Apicurio default 8-byte long or legacy 4-byte integer. + +#### options.max-age + +> `number` | Default: `300` + +The maximum duration in seconds to keep a cached schema before fetching the schema again. diff --git a/src/reference/config/catalogs/catalog-aws-glue.md b/src/reference/config/catalogs/aws-glue.md similarity index 61% rename from src/reference/config/catalogs/catalog-aws-glue.md rename to src/reference/config/catalogs/aws-glue.md index a7ada167..3944468d 100644 --- a/src/reference/config/catalogs/catalog-aws-glue.md +++ b/src/reference/config/catalogs/aws-glue.md @@ -1,18 +1,20 @@ --- +redirectFrom: /reference/config/catalogs/catalog-aws-glue.html shortTitle: aws-glue -description: Zilla runtime aws-glue catalog icon: aky-zilla-plus category: - Catalog +tags: + - aws-glue --- # aws-glue Catalog +Zilla runtime aws-glue catalog supports the official [AWS Glue](https://aws.amazon.com/glue/) registry. It defines a catalog that can fetch schemas [AWS Glue](https://aws.amazon.com/glue/) to enforce validation. + [Available in ](https://www.aklivity.io/products/zilla-plus) {.zilla-plus-badge .hint-container .info} -Zilla runtime aws-glue catalog supports the official [AWS Glue](https://aws.amazon.com/glue/) registry. - ```yaml {2} catalog: type: aws-glue @@ -22,29 +24,14 @@ catalog: compression: zlib ``` -## Summary - -Defines a catalog that can fetch schemas [AWS Glue](https://aws.amazon.com/glue/) to enforce validation. - -## Configuration - -:::: note Properties - -- [options](#options) - - [options.registry\*](#options-registry) - - [options.max-age](#options-max-age) - - [options.compression](#options-compression) - -::: right -\* required -::: - -:::: +## Configuration (\* required) ### options > `object` +The `aws-glue` specific options. + #### options.registry\* > `string` @@ -53,12 +40,12 @@ The AWS Glue Registry name to access schemas. #### options.max-age -> `number` | Default: `"300"` +> `number` | Default: `300` Configures the time to live in `seconds` for the schema information retrieved against the latest version. The default is 300 seconds or 5 minutes. #### options.compression -> `enum` [ "none", "zlib" ] | Default: `"none"` +> `enum` [ `none`, `zlib` ] | Default: `none` Configures the compression level for the message payloads that are serialized by the models configured in this catalog. diff --git a/src/reference/config/catalogs/catalog-karapace-schema-registry.md b/src/reference/config/catalogs/catalog-karapace-schema-registry.md deleted file mode 100644 index 6fe41024..00000000 --- a/src/reference/config/catalogs/catalog-karapace-schema-registry.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -shortTitle: karapace-schema-registry -description: Zilla runtime karapace-schema-registry catalog -category: - - Catalog ---- - -# karapace-schema-registry Catalog - -Zilla runtime karapace-schema-registry catalog - -Accepted `type` aliases: `karapace` - -```yaml {2} -catalog: - type: karapace-schema-registry - options: - url: http://reg.example.com:8081 - context: default -``` - -## Summary - -Defines a catalog with a schema pulled from a remote schema registry to enforce validation. - -## Configuration - -:::: note Properties - -- [options](#options) - - [options.url\*](#options-url) - - [options.context](#options-context) - -::: right -\* required -::: - -:::: - -### options - -> `object` - -#### options.url\* - -> `string` - -Karapace Schema Registry URL to access schemas via API calls. - -#### options.context - -> `string` | Default: `"default"` - -Schema context represents an independent scope in the Karapace schema registry. diff --git a/src/reference/config/catalogs/catalog-schema-registry.md b/src/reference/config/catalogs/catalog-schema-registry.md deleted file mode 100644 index e2641434..00000000 --- a/src/reference/config/catalogs/catalog-schema-registry.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -shortTitle: schema-registry -description: Zilla runtime schema-registry catalog -category: - - Catalog ---- - -# schema-registry Catalog - -Zilla runtime schema-registry catalog. - -```yaml {2} -catalog: - type: schema-registry - options: - url: http://reg.example.com:8081 - context: default -``` - -## Summary - -Defines a catalog with a schema pulled from a remote schema registry to enforce validation. - -## Configuration - -:::: note Properties - -- [options](#options) - - [options.url\*](#options-url) - - [options.context](#options-context) - -::: right -\* required -::: - -:::: - -### options - -> `object` - -#### options.url\* - -> `string` - -Schema Registry URL to access schemas via API calls. - -#### options.context - -> `string` | Default: `"default"` - -Schema context represents an independent scope in the Schema Registry. diff --git a/src/reference/config/catalogs/catalog-confluent-schema-registry.md b/src/reference/config/catalogs/confluent-schema-registry.md similarity index 56% rename from src/reference/config/catalogs/catalog-confluent-schema-registry.md rename to src/reference/config/catalogs/confluent-schema-registry.md index 2166ac52..37e21b40 100644 --- a/src/reference/config/catalogs/catalog-confluent-schema-registry.md +++ b/src/reference/config/catalogs/confluent-schema-registry.md @@ -1,18 +1,22 @@ --- +redirectFrom: /reference/config/catalogs/catalog-confluent-schema-registry.html shortTitle: confluent-schema-registry -description: Zilla runtime confluent-schema-registry catalog icon: aky-zilla-plus category: - Catalog +tags: + - confluent-schema-registry --- # confluent-schema-registry Catalog -[Available in ](https://www.aklivity.io/products/zilla-plus) -{.zilla-plus-badge .hint-container .info} +Defines a catalog with a schema pulled from a remote schema registry to enforce validation. Zilla runtime confluent-schema-registry catalog supports the official [Confluent](https://docs.confluent.io/platform/current/schema-registry/index.html) schema registry. +[Available in ](https://www.aklivity.io/products/zilla-plus) +{.zilla-plus-badge .hint-container .info} + ```yaml {2} catalog: type: confluent-schema-registry @@ -21,36 +25,6 @@ catalog: context: default ``` -## Summary - -Defines a catalog with a schema pulled from a remote schema registry to enforce validation. - -## Configuration - -:::: note Properties - -- [options](#options) - - [options.url\*](#options-url) - - [options.context](#options-context) - -::: right -\* required -::: - -:::: - -### options - -> `object` - -#### options.url\* - -> `string` - -Schema Registry URL to access schemas via API calls. - -#### options.context - -> `string` | Default: `"default"` +## Configuration (\* required) -Schema context represents an independent scope in the Schema Registry. + diff --git a/src/reference/config/catalogs/catalog-filesystem.md b/src/reference/config/catalogs/filesystem.md similarity index 63% rename from src/reference/config/catalogs/catalog-filesystem.md rename to src/reference/config/catalogs/filesystem.md index 858df507..8a81de1d 100644 --- a/src/reference/config/catalogs/catalog-filesystem.md +++ b/src/reference/config/catalogs/filesystem.md @@ -1,13 +1,15 @@ --- +redirectFrom: /reference/config/catalogs/catalog-filesystem.html shortTitle: filesystem -description: Zilla runtime filesystem catalog category: - Catalog +tags: + - filesystem --- # filesystem Catalog -Zilla runtime filesystem catalog. +Defines a catalog with schemas, AsyncAPI/OpenAPI definitions or proto files pulled from the filesystem relative `zilla.yaml` to enforce validation, create APIs or gRPC services. ```yaml {2} catalogs: @@ -19,35 +21,21 @@ catalogs: path: path/to/local_file.txt ``` -## Summary - -Defines a catalog with schemas, AsyncAPI/OpenAPI definitions or proto files pulled from the filesystem relative `zilla.yaml` to enforce validation, create APIs or gRPC services. - -## Configuration - -:::: note Properties - -- [options](#options) - - [options.subjects\*](#options-subjects) - - [subjects.path\*](#subjects-path) - -::: right -\* required -::: - -:::: +## Configuration (\* required) ### options > `object` -#### options.subjects\* +The `filesystem` specific options. + +#### options.subjects -> `object` as map of named objects +> `object` as map of named `object` properties Unique identifier for artifact categorization in the catalog. -##### subjects.path\* +#### subjects.path\* > `string` diff --git a/src/reference/config/catalogs/catalog-inline.md b/src/reference/config/catalogs/inline.md similarity index 63% rename from src/reference/config/catalogs/catalog-inline.md rename to src/reference/config/catalogs/inline.md index 16d19da3..70631ec4 100644 --- a/src/reference/config/catalogs/catalog-inline.md +++ b/src/reference/config/catalogs/inline.md @@ -1,19 +1,21 @@ --- +redirectFrom: /reference/config/catalogs/catalog-inline.html shortTitle: inline -description: Zilla runtime inline catalog category: - Catalog +tags: + - inline --- # inline Catalog -Zilla runtime inline catalog. +Defines a catalog with schemas to enforce validation. The schemas are defined inline with the other properties. ```yaml {2} catalog: type: inline options: - subjects: + subjects: items-snapshots: schema: | { @@ -33,43 +35,28 @@ catalog: } ``` -## Summary - -Defines a catalog with schemas to enforce validation. The schemas are defined inline with the other properties. - -## Configuration - -:::: note Properties - -- [options](#options) - - [options.subjects\*](#options-subjects) - - [subjects.schema\*](#subjects-schema) - - [subjects.version](#subjects-version) - -::: right -\* required -::: - -:::: +## Configuration (\* required) ### options > `object` -#### options.subjects\* +The `inline` specific options. + +#### options.subjects -> `object` as map of named objects +> `object` as map of named `object` properties Unique identifier for schema categorization in the registry. -##### subjects.schema\* +#### subjects.schema\* > `string` Definition specifying data structure and format in detail. -##### subjects.version +#### subjects.version -> `string` | Default: `"latest"` +> `string` | Default: `latest` Specific iteration or version of a registered schema. diff --git a/src/reference/config/catalogs/karapace-schema-registry.md b/src/reference/config/catalogs/karapace-schema-registry.md new file mode 100644 index 00000000..40c1177e --- /dev/null +++ b/src/reference/config/catalogs/karapace-schema-registry.md @@ -0,0 +1,27 @@ +--- +redirectFrom: /reference/config/catalogs/catalog-karapace-schema-registry.html +shortTitle: karapace-schema-registry + +category: + - Catalog +tags: + - karapace-schema-registry +--- + +# karapace-schema-registry Catalog + +Defines a catalog with a schema pulled from a remote schema registry to enforce validation. + +Accepted `type` aliases: `karapace` + +```yaml {2} +catalog: + type: karapace-schema-registry + options: + url: http://reg.example.com:8081 + context: default +``` + +## Configuration (\* required) + + diff --git a/src/reference/config/catalogs/schema-registry.md b/src/reference/config/catalogs/schema-registry.md new file mode 100644 index 00000000..6dd99d1f --- /dev/null +++ b/src/reference/config/catalogs/schema-registry.md @@ -0,0 +1,24 @@ +--- +redirectFrom: /reference/config/catalogs/catalog-schema-registry.html +shortTitle: schema-registry +category: + - Catalog +tags: + - schema-registry +--- + +# schema-registry Catalog + +Defines a catalog with a schema pulled from a remote schema registry to enforce validation. + +```yaml {2} +catalog: + type: schema-registry + options: + url: http://reg.example.com:8081 + context: default +``` + +## Configuration (\* required) + + diff --git a/src/reference/config/guards/guard-jwt.md b/src/reference/config/guards/jwt.md similarity index 67% rename from src/reference/config/guards/guard-jwt.md rename to src/reference/config/guards/jwt.md index 1dae4cae..bebb014d 100644 --- a/src/reference/config/guards/guard-jwt.md +++ b/src/reference/config/guards/jwt.md @@ -1,15 +1,19 @@ --- +redirectFrom: /reference/config/guards/guard-jwt.html shortTitle: jwt -description: Zilla runtime jwt guard category: - - Binding + - Guard tag: - - Server + - jwt --- # jwt Guard -Zilla runtime jwt guard. +Defines a guard with `JSON Web Token (JWT)` support. + +The `jwt` guard uses public keys to verify the integrity of `JWT` access tokens when identifying authorized subjects and their associated roles scope. The token issuer and audience can also be constrained to prevent access tokens from other applications from being reused inappropriately. + +Each verified JWT access token has an expiration time, and an optional challenge window prior to the expiration time that can be used by specific protocol bindings to send a challenge to renew the access token before it expires. If using an Identity Provider that exposes a `.well-known/jwks.json` file, simply provide the `issuer` and `audience`. The JWKS will be fetched, remotely. @@ -37,52 +41,22 @@ guards: x: MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4 y: 4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM use: enc - kid: '1' + kid: "1" - kty: RSA n: 0vx7agoebGcQSuuPiLJXZptN9nndrQmbXEps2aiAFbWhM78LhWx4cbbfAAtVT86zwu1RK7aPFFxuhDR1L6tSoc_BJECPebWKRXjBZCiFV4n3oknjhMstn64tZ_2W-5JsGY4Hc5n9yBXArwl93lqt7_RN5w6Cf0h4QyQ5v-65YGjQR0_FDW2QvzqY368QQMicAtaSqzs8KJZgnYb9c7d0zgdAZHzu6qMQvRL5hajrn1n91CbOpbISD08qNLyrdkt-bFTWhAI4vMQFh6WeZu0fM4lFd2NcRwr3XPksINHaQ-G_xBniIqbw0Ls1jF44-csFCur-kEgU8awapJzKnqDKgw e: AQAB alg: RS256 - kid: '2011-04-29' + kid: "2011-04-29" challenge: 30 ``` -## Summary - -Defines a guard with `JSON Web Token (JWT)` support. +## Configuration (\* required) -The `jwt` guard uses public keys to verify the integrity of `JWT` access tokens when identifying authorized subjects and their associated roles scope. The token issuer and audience can also be constrained to prevent access tokens from other applications from being reused inappropriately. - -Each verified JWT access token has an expiration time, and an optional challenge window prior to the expiration time that can be used by specific protocol bindings to send a challenge to renew the access token before it expires. - -## Configuration - -:::: note Properties - -- [options](#options) -- [options.issuer](#options-issuer) - - [options.audience](#options-audience) - - [options.challenge](#options-challenge) - - [options.keys](#options-keys) - - [keys\[\].kty](#keys-kty) - - [keys\[\].kid](#keys-kid) - - [keys\[\].n](#keys-n) - - [keys\[\].e](#keys-e) - - [keys\[\].alg](#keys-alg) - - [keys\[\].crv](#keys-crv) - - [keys\[\].x](#keys-x) - - [keys\[\].y](#keys-y) - -::: right -\* required -::: - -:::: - -### options +### options\* > `object` -`jwt`-specific options. +The `jwt` specific options. ```yaml options: @@ -95,15 +69,15 @@ options: x: MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4 y: 4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM use: enc - kid: '1' + kid: "1" - kty: RSA n: 0vx7agoebGcQSuuPiLJXZptN9nndrQmbXEps2aiAFbWhM78LhWx4cbbfAAtVT86zwu1RK7aPFFxuhDR1L6tSoc_BJECPebWKRXjBZCiFV4n3oknjhMstn64tZ_2W-5JsGY4Hc5n9yBXArwl93lqt7_RN5w6Cf0h4QyQ5v-65YGjQR0_FDW2QvzqY368QQMicAtaSqzs8KJZgnYb9c7d0zgdAZHzu6qMQvRL5hajrn1n91CbOpbISD08qNLyrdkt-bFTWhAI4vMQFh6WeZu0fM4lFd2NcRwr3XPksINHaQ-G_xBniIqbw0Ls1jF44-csFCur-kEgU8awapJzKnqDKgw e: AQAB alg: RS256 - kid: '2011-04-29' + kid: "2011-04-29" ``` -### options.issuer +#### options.issuer > `string` @@ -123,60 +97,46 @@ Challenge period (seconds). #### options.keys -> `array` of `object` +> `string`, `array` of `object` -If not provided, relies on the `issuer` to infer the location of a remote `.well-known/jwks.json` file. +If not provided, the `jwt` vault relies on the issuer to infer the location of a remote `.well-known/jwks.json` file. -##### keys[].kty +If a `string` is provided, the value is expected to be a URI. -> `string` +If an `array` of objects is provided, the value is expected to be a list of object with the supported keys and their values. -Key type, e.g. `RSA` , `EC`. +::: note Supported keys -##### keys[].kid +**kty**: `string` -> `string` - -Key ID. - -##### keys[].n - -> `string` - -`RSA` `modulus`. - -##### keys[].e +> Key type, e.g. "RSA" , "EC". -> `string` +**kid**: `string` -`RSA` `exponent`. +> Key ID. -##### keys[].alg +**n**: `string` -> `string` +> "RSA" modulus. -`RSA` algorithm, e.g. `RS256`. +**e**: `string` -##### keys[].crv +> "RSA" exponent. -> `string` +**alg**: `string` -`EC` curve name. +> "RSA" algorithm, e.g. "RS256". -##### keys[].x +**crv**: `string` -> `string` +> "EC" curve name. -`EC` point `x` coordinate. +**x**: `string` -##### keys[].y +> "EC" point X coordinate. -> `string` - -`EC` point `y` coordinate. +**y**: `string` ---- +> "EC" point Y coordinate. -::: right -\* required ::: diff --git a/src/reference/config/models/.partials/cataloged.md b/src/reference/config/models/.partials/cataloged.md new file mode 100644 index 00000000..ba1bbfa2 --- /dev/null +++ b/src/reference/config/models/.partials/cataloged.md @@ -0,0 +1,37 @@ +### catalog\* + +> `object` as map of named `array` + +To map defined catalog for schema retrieval based on catalog specific parameters. Any of the possible combination can be configured. + +> `id` +----- +> `strategy` +> `version` +----- +> `subject` +> `version` + +#### catalog[].id\* + +> `integer` + +Define specific schema id to refer from catalog. + +#### catalog[].version + +> `string` | Default: `latest` + +Specific iteration or version of a registered schema in the defined catalog. + +#### catalog[].strategy\* + +> `enum` [ `topic` ] + +To determine the subject based on the specified strategy + +#### catalog[].subject\* + +> `string` + +Unique identifier for schema categorization in the catalog. diff --git a/src/reference/config/models/.partials/integer.md b/src/reference/config/models/.partials/integer.md new file mode 100644 index 00000000..7ce1bc1b --- /dev/null +++ b/src/reference/config/models/.partials/integer.md @@ -0,0 +1,17 @@ +### format + +> `enum` [ `binary`, `text` ] | Default: `text` + +The format for the integer. + +### multiple + +> `integer` + +Restrict the integer to a multiple of a given integer. + +### range + +> `string` | Pattern: `((?:\\(|\\[))(-?\\d+)?,(-?\\d+)?((?:\\)|\\]))` + +An allowed range of values for the integer. diff --git a/src/reference/config/models/.partials/number.md b/src/reference/config/models/.partials/number.md new file mode 100644 index 00000000..a8f96fbd --- /dev/null +++ b/src/reference/config/models/.partials/number.md @@ -0,0 +1,17 @@ +### format + +> `enum` [ `binary`, `text` ] | Default: `text` + +The format for the number. + +### multiple + +> `number` + +Restrict the number to a multiple of a given number. + +### range + +> `string` | Pattern: `((?:\\(|\\[))(-?\\d+(?:\\.\\d+)?)?,(-?\\d+(?:\\.\\d+)?)?((?:\\)|\\]))` + +An allowed range of values for the number. diff --git a/src/reference/config/models/avro.md b/src/reference/config/models/avro.md new file mode 100644 index 00000000..70b8eb79 --- /dev/null +++ b/src/reference/config/models/avro.md @@ -0,0 +1,40 @@ +--- +redirectFrom: /reference/config/models/model-avro.html +shortTitle: avro +category: + - Models +tags: + - avro +--- + +# avro model + +Defines a model to utilize schema from catalog to enforce validation, ensuring adherence to predefined data structures. + +```yaml {1} +model: avro +view: json +catalog: + items-catalog: + - strategy: topic + version: latest + - subject: items-snapshots + version: latest + - id: 1 +``` + +## Configuration (\* required) + +### model: avro + +> `const` + +Specifies the model is `avro`. + +### view + +> `enum` [ `json` ] + +Transforms the model from this data type to the Avro schema on produce and to this data type from the Avro schema on consume. + + diff --git a/src/reference/config/models/double.md b/src/reference/config/models/double.md new file mode 100644 index 00000000..57202593 --- /dev/null +++ b/src/reference/config/models/double.md @@ -0,0 +1,25 @@ +--- +shortTitle: double +category: + - Models +tags: + - double +--- + +# double Model + +Defines a model to enforce validation for double data. + +```yaml {1} +model: double +``` + +## Configuration (\* required) + +### model: double + +> `const` + +Specifies the model is a `double`. + + diff --git a/src/reference/config/models/float.md b/src/reference/config/models/float.md new file mode 100644 index 00000000..541c8b6a --- /dev/null +++ b/src/reference/config/models/float.md @@ -0,0 +1,29 @@ +--- +shortTitle: float +category: + - Models +tags: + - float +--- + +# float Model + +Defines a model to enforce validation for float data. + +```yaml {1} +model: float +``` + +## Configuration (\* required) + +### model: float + +> `const` + +Specifies the model is a `float`. + + + +### range + +> `string` | Pattern: `((?:\\(|\\[))(-?\\d+(?:\\.\\d+)?)?,(-?\\d+(?:\\.\\d+)?)?((?:\\)|\\]))` diff --git a/src/reference/config/models/int32.md b/src/reference/config/models/int32.md new file mode 100644 index 00000000..cd9dcbe7 --- /dev/null +++ b/src/reference/config/models/int32.md @@ -0,0 +1,26 @@ +--- +redirectFrom: /reference/config/models/model-integer.html +shortTitle: int32 +category: + - Models +tags: + - int32 +--- + +# int32 Model + +Defines a model to enforce validation for int32 data. + +```yaml {1} +model: int32 +``` + +## Configuration (\* required) + +### model: int32 + +> `const` + +Specifies the model is a `int32`. + + diff --git a/src/reference/config/models/int64.md b/src/reference/config/models/int64.md new file mode 100644 index 00000000..0a9e904f --- /dev/null +++ b/src/reference/config/models/int64.md @@ -0,0 +1,25 @@ +--- +shortTitle: int64 +category: + - Models +tags: + - int64 +--- + +# int64 Model + +Defines a model to enforce validation for int64 data. + +```yaml {1} +model: int64 +``` + +## Configuration (\* required) + +### model: int64 + +> `const` + +Specifies the model is a `int64`. + + diff --git a/src/reference/config/models/json.md b/src/reference/config/models/json.md new file mode 100644 index 00000000..459550d7 --- /dev/null +++ b/src/reference/config/models/json.md @@ -0,0 +1,33 @@ +--- +redirectFrom: /reference/config/models/model-json.html +shortTitle: json +category: + - Models +tags: + - json +--- + +# json Model + +Defines a model to utilize schema from catalog to enforce validation, ensuring adherence to predefined data structures. + +```yaml {1} +model: json +catalog: + items-catalog: + - strategy: topic + version: latest + - subject: items-snapshots + version: latest + - id: 1 +``` + +## Configuration (\* required) + +### model: json + +> `const` + +Specifies the model is `json`. + + diff --git a/src/reference/config/models/model-avro.md b/src/reference/config/models/model-avro.md deleted file mode 100644 index 940c74aa..00000000 --- a/src/reference/config/models/model-avro.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -shortTitle: avro -description: Zilla runtime avro model -category: - - Models ---- - -# avro model - -Zilla runtime avro model - -```yaml {1} -model: avro -view: json -catalog: - items-catalog: - - strategy: topic - version: latest - - subject: items-snapshots - version: latest - - id: 1 -``` - -## Summary - -Defines a model to utilize schema from catalog to enforce validation, ensuring adherence to predefined data structures. - -## Configuration - -:::: note Properties - -- [view](#view) -- [catalog\*](#catalog) - - [catalog.strategy](#catalog-strategy) - - [catalog.subject](#catalog-subject) - - [catalog.version](#catalog-version) - - [catalog.id](#catalog-id) - -::: right -\* required -::: - -:::: - -### view - -> `enum` [ "json" ] - -Transforms the model from this data type to the Avro schema on produce and to this data type from the Avro schema on consume. - -### catalog\* - -> `object` - -To map defined catalog for schema retrieval based on catalog specific parameters. Any of the possible combination can be configured. - -> `id` ------ -> `strategy` -> `version` ------ -> `subject` -> `version` - -#### catalog.strategy - -> `enum` [ "topic" ] - -To determine the subject based on the specified strategy - -#### catalog.subject - -> `string` - -Unique identifier for schema categorization in the catalog. - -#### catalog.version - -> `string` | Default: `"latest"` - -Specific iteration or version of a registered schema in the defined catalog. - -#### catalog.id - -> `integer` - -Define specific schema id to refer from catalog. diff --git a/src/reference/config/models/model-integer.md b/src/reference/config/models/model-integer.md deleted file mode 100644 index 7c4db869..00000000 --- a/src/reference/config/models/model-integer.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -shortTitle: integer -description: Zilla runtime integer model -category: - - Models ---- - -# integer Model - -Zilla runtime integer model - -```yaml {1} -model: integer -``` - -## Summary - -Defines a model to enforce validation for integer data. diff --git a/src/reference/config/models/model-json.md b/src/reference/config/models/model-json.md deleted file mode 100644 index 3babcd14..00000000 --- a/src/reference/config/models/model-json.md +++ /dev/null @@ -1,79 +0,0 @@ ---- -shortTitle: json -description: Zilla runtime json model -category: - - Models ---- - -# json Model - -Zilla runtime json model - -```yaml {1} -model: json -catalog: - items-catalog: - - strategy: topic - version: latest - - subject: items-snapshots - version: latest - - id: 1 -``` - -## Summary - -Defines a model to utilize schema from catalog to enforce validation, ensuring adherence to predefined data structures. - -## Configuration - -:::: note Properties - -- [catalog\*](#catalog) - - [catalog.strategy](#catalog-strategy) - - [catalog.subject](#catalog-subject) - - [catalog.version](#catalog-version) - - [catalog.id](#catalog-id) - -::: right -\* required -::: - -:::: - -### catalog\* - -> `object` - -To map defined catalog for schema retrieval based on catalog specific parameters. Any of the possible combination can be configured. - -> `id` ------ -> `strategy` -> `version` ------ -> `subject` -> `version` - -#### catalog.strategy - -> `enum` [ "topic" ] - -To determine the subject based on the specified strategy - -#### catalog.subject - -> `string` - -Unique identifier for schema categorization in the catalog. - -#### catalog.version - -> `string` | Default: `"latest"` - -Specific iteration or version of a registered schema in the defined catalog. - -#### catalog.id - -> `integer` - -Define specific schema id to refer from catalog. diff --git a/src/reference/config/models/model-string.md b/src/reference/config/models/model-string.md deleted file mode 100644 index b0e6ae16..00000000 --- a/src/reference/config/models/model-string.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -shortTitle: string -description: Zilla runtime string model -category: - - Models ---- - -# string Model - -Zilla runtime string model - -```yaml {1} -model: string -encoding: utf_8 -``` - -## Summary - -Defines a model to enforce validation for string data. - -## Configuration - -:::: note Properties - -- [encoding\*](#encoding) - -::: right -\* required -::: - -:::: - -### encoding\* - -> `string` - -Define character encoding for unicode. diff --git a/src/reference/config/models/model-protobuf.md b/src/reference/config/models/protobuf.md similarity index 67% rename from src/reference/config/models/model-protobuf.md rename to src/reference/config/models/protobuf.md index 21d474c4..6ee0640e 100644 --- a/src/reference/config/models/model-protobuf.md +++ b/src/reference/config/models/protobuf.md @@ -1,13 +1,15 @@ --- +redirectFrom: /reference/config/models/model-protobuf.html shortTitle: protobuf -description: Zilla runtime protobuf model category: - Models +tags: + - protobuf --- # protobuf Model -Zilla runtime protobuf model +Defines a model to utilize schema from catalog to enforce validation, ensuring adherence to predefined data structures. ```yaml {1} model: protobuf @@ -24,37 +26,23 @@ catalog: record: EchoMessage ``` -## Summary - -Defines a model to utilize schema from catalog to enforce validation, ensuring adherence to predefined data structures. - -## Configuration - -:::: note Properties +## Configuration (\* required) -- [view](#view) -- [catalog\*](#catalog) - - [catalog.strategy](#catalog-strategy) - - [catalog.subject](#catalog-subject) - - [catalog.version](#catalog-version) - - [catalog.id](#catalog-id) - - [catalog.record\*](#catalog-record) +### model: protobuf -::: right -\* required -::: +> `const` -:::: +Specifies the model is a `protobuf`. ### view -> `enum` [ "json" ] +> `enum` [ `json` ] Transforms the model from this data type to the Protobuf schema on produce and to this data type from the Protobuf schema on consume. ### catalog\* -> `object` +> `object` as map of named `array` To map defined catalog for schema retrieval based on catalog specific parameters. Any of the possible combination can be configured. @@ -69,31 +57,31 @@ To map defined catalog for schema retrieval based on catalog specific parameters > `version` > `record` -#### catalog.strategy +#### catalog[].id\* -> `enum` [ "topic" ] +> `integer` -To determine the subject based on the specified strategy +Define specific schema id to refer from catalog. -#### catalog.subject +#### catalog[].version -> `string` +> `string` | Default: `latest` -Unique identifier for schema categorization in the catalog. +Specific iteration or version of a registered schema in the defined catalog. -#### catalog.version +#### catalog[].strategy\* -> `string` | Default: `"latest"` +> `enum` [ `topic` ] -Specific iteration or version of a registered schema in the defined catalog. +To determine the subject based on the specified strategy -#### catalog.id +#### catalog[].subject\* -> `integer` +> `string` -Define specific schema id to refer from catalog. +Unique identifier for schema categorization in the catalog. -#### catalog.record\* +#### catalog[].record\* > `string` diff --git a/src/reference/config/models/string.md b/src/reference/config/models/string.md new file mode 100644 index 00000000..ba6abfaa --- /dev/null +++ b/src/reference/config/models/string.md @@ -0,0 +1,52 @@ +--- +redirectFrom: /reference/config/models/model-string.html +shortTitle: string +category: + - Models +tags: + - string +--- + +# string Model + +Defines a model to enforce validation for string data. + +## Configuration (\* required) + +### model: string + +> `const` + +Specifies the model is a `string`. + +```yaml {1} +model: string +encoding: utf_8 +minLength: 1 +maxLength: 100 +pattern: ^wait=\d+$ +``` + +### encoding + +> `enum` [ `utf_8`, `utf_16` ] + +Define character encoding for unicode. + +### minLength + +> `integer` | Minimum: `1` + +Define string minimum length. + +### maxLength + +> `integer` | Minimum: `1` + +Define string maximum length. + +### pattern + +> `string` + +Define string regex pattern. diff --git a/src/reference/config/overview.md b/src/reference/config/overview.md index d7f80e28..c6447820 100644 --- a/src/reference/config/overview.md +++ b/src/reference/config/overview.md @@ -26,26 +26,7 @@ telemetry: ... ``` -## Configuration - -:::: note Properties - -- [name\*](#name) -- [bindings](#bindings) - - [routes.exit](#routes-exit) -- [guards](#guards) -- [vaults](#vaults) -- [catalogs](#catalogs) -- [telemetry](#telemetry) - - [attributes](#attributes) - - [exporters](#exporters) - - [metrics](#metrics) - -::: right -\* required -::: - -:::: +## Configuration (\* required) ### name\* @@ -55,7 +36,7 @@ Namespace name. ### bindings -> `object` as map of named [`binding`](./bindings/) properties +> `object` as map of named[`binding`](./bindings/) properties Each configured `binding` represents a step in the pipeline as data streams are decoded, translated or encoded according to a specific protocol `type`. @@ -71,7 +52,7 @@ Unconditional `exit` binding acting as a default if none of the conditional rout ### guards -> `object` as map of named [`guard`](./guards/) properties +> `object` as map of named[`guard`](./guards/) properties Each configured `guard` represents a security checkpoint for one or more bindings based on a specific implementation `type`. @@ -81,7 +62,7 @@ Associated roles can be enforced during routing by only following routes `guarde ### vaults -> `object` as map of named [`vault`](./vaults/) properties +> `object` as map of named[`vault`](./vaults/) properties Each configured `vault` represents a container for digital keys and certificates based on a specific implementation `type`. @@ -89,7 +70,7 @@ Vaults can be used by specific protocol bindings, such as `tls`, to negotiate sh ### catalogs -> `object` as map of named [`catalog`](./catalogs/) properties +> `object` as map of named[`catalog`](./catalogs/) properties Each configured `catalog` represent a catalog of schemas of various format based on a specific implementation `type`. @@ -117,7 +98,7 @@ Default attributes to optionally include when exporting metrics. #### exporters -> `object` as map of named [`exporter`](./telemetry/exporters/) properties +> `object` as map of named[`exporter`](./telemetry/exporters/) properties Map of named exporters. diff --git a/src/reference/config/telemetry/events.md b/src/reference/config/telemetry/events.md index 5d459c41..28698740 100644 --- a/src/reference/config/telemetry/events.md +++ b/src/reference/config/telemetry/events.md @@ -1,6 +1,5 @@ --- shortTitle: Events -description: Zilla runtime telemetry events category: - Telemetry tag: @@ -79,7 +78,7 @@ An MQTT session was successfully authorized and connected. ### BINDING_MQTT_KAFKA_NON_COMPACT_SESSIONS_TOPIC -The sessions topic declared in the [mqtt-kafka](../bindings/binding-mqtt-kafka.md) is required to be log compacted. +The sessions topic declared in the [mqtt-kafka](../bindings/mqtt-kafka/README.md) is required to be log compacted. ### BINDING_TCP_DNS_FAILED diff --git a/src/reference/config/telemetry/exporters/exporter-aws-cloudwatch.md b/src/reference/config/telemetry/exporters/aws-cloudwatch.md similarity index 65% rename from src/reference/config/telemetry/exporters/exporter-aws-cloudwatch.md rename to src/reference/config/telemetry/exporters/aws-cloudwatch.md index 185b0888..8a18737a 100644 --- a/src/reference/config/telemetry/exporters/exporter-aws-cloudwatch.md +++ b/src/reference/config/telemetry/exporters/aws-cloudwatch.md @@ -1,19 +1,21 @@ --- -shortTitle: aws cloudwatch -description: Zilla runtime aws cloudwatch exporter +redirectFrom: /reference/config/telemetry/exporters/exporter-aws-cloudwatch.html +shortTitle: aws-cloudwatch icon: aky-zilla-plus +category: - Telemetry -tag: - Exporters +tag: + - aws-cloudwatch --- # aws-cloudwatch Exporter +Specifies an exporter for transmitting Custom Metrics and Log Events to AWS CloudWatch. + [Available in ](https://www.aklivity.io/products/zilla-plus) {.zilla-plus-badge .hint-container .info} -Zilla runtime aws cloudwatch exporter. - ```yaml {3} exporters: aws_cloudwatch: @@ -27,33 +29,13 @@ exporters: stream: zilla-log-stream ``` -## Summary - -Specifies an exporter for transmitting Custom Metrics and Log Events to AWS CloudWatch. - -## Configuration - -:::: note Properties - -- [options](#options) -- [options.metrics](#options-metrics) - - [metrics.namespace\*](#metrics-namespace) - - [metrics.interval](#metrics-interval) -- [options.logs](#options-logs) - - [logs.group\*](#logs-group) - - [logs.stream\*](#logs-stream) - -::: right -\* required -::: - -:::: +## Configuration (\* required) ### options > `object` -`aws`-specific options. +The `aws` specific options. ```yaml options: @@ -65,7 +47,7 @@ options: stream: zilla-log-stream ``` -### options.metrics +#### options.metrics > `object` @@ -81,11 +63,11 @@ To avoid conflicts with Amazon Web Services service namespaces, you should not s #### metrics.interval -> `integer` +> `integer` | Default: `30` -Interval in seconds to push data to the Amazon CloudWatch. Default: 30 seconds. +Interval in seconds to push data to the Amazon CloudWatch. -### options.logs +#### options.logs > `object` @@ -102,9 +84,3 @@ The name of the log group. > `string` The name of the log stream. - ---- - -::: right -\* required -::: diff --git a/src/reference/config/telemetry/exporters/exporter-otlp.md b/src/reference/config/telemetry/exporters/otlp.md similarity index 50% rename from src/reference/config/telemetry/exporters/exporter-otlp.md rename to src/reference/config/telemetry/exporters/otlp.md index 7b326c5f..ddb48b30 100644 --- a/src/reference/config/telemetry/exporters/exporter-otlp.md +++ b/src/reference/config/telemetry/exporters/otlp.md @@ -1,10 +1,11 @@ --- +redirectFrom: /reference/config/telemetry/exporters/exporter-otlp.html shortTitle: otlp -description: Zilla runtime otlp exporter category: - Telemetry -tag: - Exporters +tag: + - otlp --- # otlp Exporter @@ -21,31 +22,16 @@ exporters: - metrics endpoint: protocol: http - location: http://otlp-collector:4318/v1/metrics + location: http://otlp-collector:4318 ``` -## Configuration - -:::: note Properties - -- [options\*](#options) - - [options.interval](#options-interval) - - [options.signals](#options-signals) - - [options.endpoint\*](#options-endpoint) - - [endpoint.protocol](#endpoint-protocol) - - [endpoint.location\*](#endpoint-location) +## Configuration (\* required) -::: right -\* required -::: - -:::: - -### options +### options\* > `object` -`otlp`-specific options. +The `otlp` specific options. ```yaml options: @@ -55,41 +41,53 @@ options: - metrics endpoint: protocol: http - location: http://otlp-collector:4318/v1/metrics + location: http://otlp-collector:4318 ``` #### options.interval -> `integer` | Default: `30` +> `number` | Default: `30` Interval in seconds to push data to the collector. #### options.signals -> `array` of `enum` [ "logs", "metrics" ] +> `array` of `enum` [ `metrics`, `logs` ] Specifies what signals should be exported. The default behavior is to export all supported signals. -#### options.endpoint +#### options.endpoint\* > `object` Contains details for the OpenTelemetry Protocol collector endpoint. -##### endpoint.protocol +#### endpoint.protocol -> `string` +> `enum` [ `http` ] | Default: `http` -Specifies the protocol to use for exporting data. Currently only `http` is supported. The default is `http`. +Specifies the protocol to use for exporting data for exporting data to the [OTEL Collector](https://opentelemetry.io/docs/collector/). -##### endpoint.location\* +#### endpoint.location\* > `string` -The URL of the collector. +The URI for the collector endpoint. ---- +#### endpoint.overrides + +> `object` + +The options for overriding the endpoint for each signal type. + +#### overrides.logs + +> `string` | Default: `/v1/logs` + +The `logs` signal endpoint URI. + +#### overrides.metrics + +> `string` | Default: `/v1/metrics` -::: right -\* required -::: +The `metrics` signal endpoint URI. diff --git a/src/reference/config/telemetry/exporters/exporter-prometheus.md b/src/reference/config/telemetry/exporters/prometheus.md similarity index 56% rename from src/reference/config/telemetry/exporters/exporter-prometheus.md rename to src/reference/config/telemetry/exporters/prometheus.md index 6b5714ed..716adae0 100644 --- a/src/reference/config/telemetry/exporters/exporter-prometheus.md +++ b/src/reference/config/telemetry/exporters/prometheus.md @@ -1,10 +1,12 @@ --- +redirectFrom: /reference/config/telemetry/exporters/exporter-prometheus.html shortTitle: prometheus -description: Zilla runtime prometheus exporter + category: - Telemetry -tag: - Exporters +tag: + - prometheus --- # prometheus Exporter @@ -22,27 +24,13 @@ exporters: path: /metrics ``` -## Configuration - -:::: note Properties - -- [options](#options) - - [options.endpoints](#options-endpoints) - - [endpoints\[\].scheme](#endpoints-scheme) - - [endpoints\[\].port](#endpoints-port) - - [endpoints\[\].path](#endpoints-path) - -::: right -\* required -::: - -:::: +## Configuration (\* required) ### options > `object` -`prometheus`-specific options. +The `prometheus` specific options. ```yaml options: @@ -58,26 +46,20 @@ options: Contains `prometheus` endpoints. -##### endpoints[].scheme +#### endpoints[].scheme\* -> `enum` [ "http" ] +> `enum` [ `http` ] URL scheme to accept for endpoint. -##### endpoints[].port +#### endpoints[].port\* -> `int` +> `integer` URL port to accept for endpoint. -##### endpoints[].path +#### endpoints[].path > `string` URL path to accept for endpoint. - ---- - -::: right -\* required -::: diff --git a/src/reference/config/telemetry/exporters/exporter-stdout.md b/src/reference/config/telemetry/exporters/stdout.md similarity index 73% rename from src/reference/config/telemetry/exporters/exporter-stdout.md rename to src/reference/config/telemetry/exporters/stdout.md index 252d509b..fe236ca6 100644 --- a/src/reference/config/telemetry/exporters/exporter-stdout.md +++ b/src/reference/config/telemetry/exporters/stdout.md @@ -1,10 +1,12 @@ --- +redirectFrom: /reference/config/telemetry/exporters/exporter-stdout.html shortTitle: stdout -description: Zilla runtime stdout exporter + category: - Telemetry -tag: - Exporters +tag: + - stdout --- # stdout Exporter diff --git a/src/reference/config/telemetry/exporters/exporter-syslog.md b/src/reference/config/telemetry/exporters/syslog.md similarity index 78% rename from src/reference/config/telemetry/exporters/exporter-syslog.md rename to src/reference/config/telemetry/exporters/syslog.md index 56260c73..a996ab6e 100644 --- a/src/reference/config/telemetry/exporters/exporter-syslog.md +++ b/src/reference/config/telemetry/exporters/syslog.md @@ -1,11 +1,13 @@ --- +redirectFrom: /reference/config/telemetry/exporters/exporter-syslog.html shortTitle: syslog -description: Zilla runtime syslog exporter + icon: aky-zilla-plus category: - Telemetry -tag: - Exporters +tag: + - syslog --- # syslog Exporter @@ -48,23 +50,7 @@ exporters: - syslog ``` -## Configuration - -:::: note Properties - -- [vault](#vault) -- [options\*](#options) - - [options.host\*](#options-host) - - [options.port\*](#options-port) - - [options.protocol\*](#options-protocol) - - [options.trust](#options-trust) - - [options.trustcacerts](#options-trustcacerts) - -::: right -\* required -::: - -:::: +## Configuration (\* required) ### vault @@ -76,7 +62,7 @@ Vault name. Only applicable if the protocol is `tls`. > `object` -`syslog`-specific options. +The `syslog` specific options. ```yaml {4} options: @@ -115,7 +101,7 @@ The port of the syslog server. #### options.protocol* -> `enum` [ "tcp", "udp", "tls" ] | Default: `"tcp"` +> `enum` [ `tcp`, `udp`, `tls` ] | Default: `tcp` The protocol to use to communicate with the syslog server. Valid values are: `tcp`, `udp`, `tls`. @@ -131,9 +117,3 @@ or an AWS vault for remote pem format certificates stored in AWS secrets manager > `boolean` Specifies if the CA certs should be trusted. Only valid if the protocol is `tls`. - ---- - -::: right -\* required -::: diff --git a/src/reference/config/telemetry/metrics/metric-grpc.md b/src/reference/config/telemetry/metrics/grpc.md similarity index 94% rename from src/reference/config/telemetry/metrics/metric-grpc.md rename to src/reference/config/telemetry/metrics/grpc.md index 14b6dd70..3413cc7f 100644 --- a/src/reference/config/telemetry/metrics/metric-grpc.md +++ b/src/reference/config/telemetry/metrics/grpc.md @@ -1,6 +1,7 @@ --- +redirectFrom: /reference/config/telemetry/metrics/metric-grpc.html shortTitle: grpc -description: Zilla runtime telemetry type + category: - Telemetry tag: @@ -81,9 +82,3 @@ The number of `grpc` request messages per RPC. > `histogram` The number of `grpc` response messages per RPC. - ---- - -::: right -\* required -::: diff --git a/src/reference/config/telemetry/metrics/metric-http.md b/src/reference/config/telemetry/metrics/http.md similarity index 92% rename from src/reference/config/telemetry/metrics/metric-http.md rename to src/reference/config/telemetry/metrics/http.md index 8dcfb388..4a80cf92 100644 --- a/src/reference/config/telemetry/metrics/metric-http.md +++ b/src/reference/config/telemetry/metrics/http.md @@ -1,6 +1,7 @@ --- +redirectFrom: /reference/config/telemetry/metrics/metric-http.html shortTitle: http -description: Zilla runtime telemetry type + category: - Telemetry tag: @@ -65,9 +66,3 @@ The `http` request content length in `bytes`. > `histogram` The `http` response content length in `bytes`. - ---- - -::: right -\* required -::: diff --git a/src/reference/config/telemetry/metrics/metric-stream.md b/src/reference/config/telemetry/metrics/stream.md similarity index 96% rename from src/reference/config/telemetry/metrics/metric-stream.md rename to src/reference/config/telemetry/metrics/stream.md index d1d59dcf..5afb209e 100644 --- a/src/reference/config/telemetry/metrics/metric-stream.md +++ b/src/reference/config/telemetry/metrics/stream.md @@ -1,6 +1,7 @@ --- +redirectFrom: /reference/config/telemetry/metrics/metric-stream.html shortTitle: stream -description: Zilla runtime telemetry type + category: - Telemetry tag: @@ -113,9 +114,3 @@ The number of closed received streams. > `counter` The number of closed sent streams. - ---- - -::: right -\* required -::: diff --git a/src/reference/config/vaults/vault-aws.md b/src/reference/config/vaults/aws.md similarity index 73% rename from src/reference/config/vaults/vault-aws.md rename to src/reference/config/vaults/aws.md index 52b27424..4bbe79ef 100644 --- a/src/reference/config/vaults/vault-aws.md +++ b/src/reference/config/vaults/aws.md @@ -1,6 +1,6 @@ --- +redirectFrom: /reference/config/vaults/vault-aws.html shortTitle: aws -description: Zilla runtime aws vault icon: aky-zilla-plus category: - Vault @@ -8,11 +8,13 @@ category: # aws Vault +Defines a vault remotely accessing AWS services from an EC2 instance. + +This is typically combined with `tls` binding `vault` property, referencing resources such as `secrets` by Amazon Resource Names (ARNs). + [Available in ](https://www.aklivity.io/products/zilla-plus) {.zilla-plus-badge .hint-container .info} -Zilla runtime aws vault. - ```yaml {2} server: type: aws @@ -24,34 +26,13 @@ server: resourcegroupstaggingapi: http://localhost:8000/resourcegroupstaggingapi ``` -## Summary - -Defines a vault remotely accessing AWS services from an EC2 instance. - -This is typically combined with `tls` binding `vault` property, referencing resources such as `secrets` by Amazon Resource Names (ARNs). - -## Configuration - -:::: note Properties - -- [options](#options) -- [options.overrides](#options-overrides) - - [overrides.acm](#overrides-acm) - - [overrides.acmpca](#overrides-acmpca) - - [overrides.secretsmanager](#overrides-secretsmanager) - - [overrides.resourcegroupstaggingapi](#overrides-resourcegroupstaggingapi) - -::: right -\* required -::: - -:::: +## Configuration (\* required) ### options > `object` -`aws`-specific options. +The `aws` specific options. ```yaml options: @@ -62,7 +43,7 @@ options: resourcegroupstaggingapi: http://localhost:8000/resourcegroupstaggingapi ``` -### options.overrides +#### options.overrides > `object` @@ -91,9 +72,3 @@ Endpoint URL override for AWS Secrets Manager API. > `string` Endpoint URL override for AWS Resource Groups Tagging API. - ---- - -::: right -\* required -::: diff --git a/src/reference/config/vaults/vault-filesystem.md b/src/reference/config/vaults/filesystem.md similarity index 56% rename from src/reference/config/vaults/vault-filesystem.md rename to src/reference/config/vaults/filesystem.md index 1d020b9b..667d0e7f 100644 --- a/src/reference/config/vaults/vault-filesystem.md +++ b/src/reference/config/vaults/filesystem.md @@ -1,26 +1,12 @@ --- +redirectFrom: /reference/config/vaults/vault-filesystem.html shortTitle: filesystem -description: Zilla runtime filesystem vault category: - Vault --- # filesystem Vault -Zilla runtime filesystem vault. - -```yaml {2} -server: - type: filesystem - options: - keys: - store: localhost.p12 - type: pkcs12 - password: ${{env.KEYS_PASSWORD}} -``` - -## Summary - Defines a vault stored on the local filesystem. The `filesystem` vault uses `PKCS12` format to store signed certificates and keys. @@ -31,35 +17,23 @@ The [trust](#options-trust) option is used to verify identity of the remote peer The [signers](#options-signers) option is used to challenge for mutual authentication in a TLS handshake. -## Configuration - -:::: note Properties - -- [options](#options) -- [options.keys](#options-keys) - - [keys.store\*](#keys-store) - - [keys.type](#keys-type) - - [keys.password](#keys-password) -- [options.trust](#options-trust) - - [trust.store\*](#trust-store) - - [trust.type](#trust-type) - - [trust.password](#trust-password) -- [options.signers](#options-signers) - - [signers.store\*](#signers-store) - - [signers.type](#signers-type) - - [signers.password](#signers-password) - -::: right -\* required -::: +```yaml {2} +server: + type: filesystem + options: + keys: + store: localhost.p12 + type: pkcs12 + password: ${{env.KEYS_PASSWORD}} +``` -:::: +## Configuration (\* required) ### options > `object` -`filesystem`-specific options. +The `filesystem` specific options. ```yaml options: @@ -69,13 +43,13 @@ options: password: ${{env.KEYS_PASSWORD}} ``` -### options.keys +#### options.keys > `object` Private keys. -#### keys.store\* +#### keys.store > `string` @@ -83,10 +57,9 @@ Relative path to keystore. #### keys.type -> `string` +> `string` | Default: `pkcs12` -Keystore type,\ -defaults to `"pkcs12"` +Keystore type. #### keys.password @@ -94,13 +67,13 @@ defaults to `"pkcs12"` Keystore password. -### options.trust +#### options.trust > `object` Trust certificates. -#### trust.store\* +#### trust.store > `string` @@ -108,10 +81,9 @@ Relative path to keystore. #### trust.type -> `string` +> `string` | Default: `pkcs12` -Keystore type,\ -defaults to `"pkcs12"` +Keystore type. #### trust.password @@ -119,13 +91,13 @@ defaults to `"pkcs12"` Keystore password. -### options.signers +#### options.signers > `object` Signer certificates. -#### signers.store\* +#### signers.store > `string` @@ -133,19 +105,12 @@ Relative path to keystore. #### signers.type -> `string` +> `string` | Default: `pkcs12` -Keystore type.\ -defaults to `"pkcs12"` +Keystore type. #### signers.password > `string` Keystore password. - ---- - -::: right -\* required -::: diff --git a/src/reference/config/zilla-cli.md b/src/reference/config/zilla-cli.md index aea115ab..c1f41745 100644 --- a/src/reference/config/zilla-cli.md +++ b/src/reference/config/zilla-cli.md @@ -3,7 +3,6 @@ category: - CLI description: The command line interface to control the Zilla runtime. --- - # Zilla Runtime CLI @@ -217,6 +216,7 @@ Set individual Zilla properties. zilla start -P zilla.engine.prop=value -P zilla.other.thing=value ``` + #### -v --verbose > `flag` @@ -226,6 +226,7 @@ Log verbose output to `stdout`. ```bash:no-line-numbers zilla start -v ``` + #### -w --workers diff --git a/src/reference/manager/overview.md b/src/reference/manager/overview.md index c4d2969a..a0cb7967 100644 --- a/src/reference/manager/overview.md +++ b/src/reference/manager/overview.md @@ -97,19 +97,19 @@ Stores the remote repository credentials. List of repository credentials -##### credentials[].host +#### credentials[].host > `string` Repository hostname -##### credentials[].username +#### credentials[].username > `string` Repository credentials username -##### credentials[].password +#### credentials[].password > `string` diff --git a/src/solutions/how-tos/amazon-msk/index.md b/src/solutions/how-tos/amazon-msk/index.md index c98042d2..77904f66 100644 --- a/src/solutions/how-tos/amazon-msk/index.md +++ b/src/solutions/how-tos/amazon-msk/index.md @@ -17,7 +17,9 @@ The IoT Ingest and Control MQTT Broker that lets clients publish messages and su The Secure Public Access Proxy lets authorized Kafka clients connect, publish messages and subscribe to topics in your Amazon MSK cluster via the internet. -> [Amazon MSK Secure Public Access Proxy Guide](./secure-public-access/production.md) +> [Amazon MSK Secure Public Access Proxy with SASL/SCRAM Guide](./secure-public-access/production.md) +> [Amazon MSK Secure Public Access Proxy with Mutual TLS (mTLS) Guide](./secure-public-access/production-mutual-tls.md) +> [Amazon MSK Secure Public Access Proxy with Unauthorized access Guide](./secure-public-access/development.md) ## Web Streaming diff --git a/src/tutorials/grpc/zilla.yaml b/src/tutorials/grpc/zilla.yaml index 0c7bb09a..4025591b 100644 --- a/src/tutorials/grpc/zilla.yaml +++ b/src/tutorials/grpc/zilla.yaml @@ -1,4 +1,11 @@ name: gRPC-example +catalogs: + host_filesystem: + type: filesystem + options: + subjects: + echo: + path: proto/echo.proto bindings: # Proxy service entrypoint north_tcp_server: @@ -22,9 +29,9 @@ bindings: north_grpc_server: type: grpc kind: server - options: - services: - - proto/echo.proto + catalog: + host_filesystem: + - subject: echo routes: - when: - method: example.EchoService/*