From 6a2ce14618d076c2e019578a9247edbe626cedf4 Mon Sep 17 00:00:00 2001 From: Benjamin Cavy Date: Sun, 16 Jun 2024 01:16:37 +0200 Subject: [PATCH] feat: configurable exponential backoff for webhooks retry --- .../maif/izanami/jobs/WebhookListener.scala | 60 +-- conf/application.conf | 12 + .../default/generated.js | 10 +- manual/.docusaurus/client-modules.js | 8 +- .../docusaurus-debug-all-content-673.json | 38 +- manual/.docusaurus/registry.js | 166 +++++---- manual/.docusaurus/routes.js | 43 ++- manual/.docusaurus/routesChunkNames.json | 345 ++++++++++-------- manual/.docusaurus/site-metadata.json | 4 +- manual/docs/04-guides/11-configuration.mdx | 18 + manual/docs/04-guides/12-webhooks.mdx | 13 +- 11 files changed, 441 insertions(+), 276 deletions(-) diff --git a/app/fr/maif/izanami/jobs/WebhookListener.scala b/app/fr/maif/izanami/jobs/WebhookListener.scala index 5c6ab0b95..57335c8bc 100644 --- a/app/fr/maif/izanami/jobs/WebhookListener.scala +++ b/app/fr/maif/izanami/jobs/WebhookListener.scala @@ -18,12 +18,28 @@ import scala.concurrent.duration._ import scala.concurrent.{ExecutionContext, Future} class WebhookListener(env: Env, eventService: EventService) { - private val handlebars = new Handlebars() - private val mapper = new ObjectMapper() - private val logger = env.logger - private implicit val ec: ExecutionContext = env.executionContext - private implicit val actorSystem: ActorSystem = env.actorSystem + private val handlebars = new Handlebars() + private val mapper = new ObjectMapper() + private val logger = env.logger + private implicit val ec: ExecutionContext = env.executionContext + private implicit val actorSystem: ActorSystem = env.actorSystem private val cancelSwitch: Map[String, Cancellable] = Map() + private val retryCount: Long = env.configuration.getOptional[Long]("app.webhooks.retry.count").getOrElse { + logger.warn("Failed to parse app.webhooks.retry.count as long, will use 5 as default value") + 5L + } + private val retryInitialDelay = env.configuration.getOptional[Long]("app.webhooks.retry.intial-delay").getOrElse { + logger.warn("Failed to parse app.webhooks.retry.intial-delay as long, will use 5 as default value") + 5L + } + private val retryMaxDelay = env.configuration.getOptional[Long]("app.webhooks.retry.max-delay").getOrElse { + logger.warn("Failed to parse app.webhooks.retry.max-delay as long, will use 600 as default value") + 600L + } + private val retryMultiplier = env.configuration.getOptional[Long]("app.webhooks.retry.multiplier").getOrElse { + logger.warn("Failed to parse app.webhooks.retry.multiplier as long, will use 2 as default value") + 2L + } def onStart(): Future[Unit] = { env.datastores.tenants @@ -43,16 +59,14 @@ class WebhookListener(env: Env, eventService: EventService) { def handleGlobalEvent(event: IzanamiEvent): Unit = { event match { case TenantCreated(eventId, tenant, _) => startListening(tenant) - case TenantDeleted(_, tenant, _) => cancelSwitch.get(tenant).map(c => c.cancel()) - case _ => () + case TenantDeleted(_, tenant, _) => cancelSwitch.get(tenant).map(c => c.cancel()) + case _ => () } } - - def startListening(tenant: String): Unit = { logger.info(s"Initializing webhook event listener for tenant $tenant") - val cancelRef = new AtomicReference[Cancellable]() + val cancelRef = new AtomicReference[Cancellable]() val cancellable = env.actorSystem.scheduler.scheduleAtFixedRate(0.minutes, 5.minutes)(() => { env.datastores.webhook .findAbandoneddWebhooks(tenant) @@ -66,7 +80,7 @@ class WebhookListener(env: Env, eventService: EventService) { handleEventForHook(tenant, event.asInstanceOf[FeatureEvent], webhook) } } - case None => cancelRef.get().cancel() + case None => cancelRef.get().cancel() } }) @@ -138,25 +152,23 @@ class WebhookListener(env: Env, eventService: EventService) { private def futureWithRetry[T]( expression: () => Future[T], onFailure: () => Future[Any], - factor: Float = 1.5f, - previousWait: FiniteDuration = 5.seconds, - max: Int = 5, cur: Int = 0 )(implicit as: ActorSystem): Future[T] = { expression().recoverWith { case e => onFailure().flatMap(_ => { logger.error(s"Call failed", e) - val next: FiniteDuration = - if (cur == 0) previousWait - else (Math.round(previousWait.toMillis * factor)).milliseconds + var next: FiniteDuration = Math.round(retryInitialDelay * 1000 * (Math.pow(retryMultiplier, cur))).milliseconds + if(next > retryMaxDelay.seconds) { + next = retryMaxDelay.seconds + } - if (cur >= max) { - logger.error(s"Exceeded max retry ($max), stopping...") + if (cur >= retryCount) { + logger.error(s"Exceeded max retry ($retryCount), stopping...") Future.failed(WebhookRetryCountExceeded()) } else { - logger.error(s"Will retry after ${next.toSeconds} seconds (${cur + 1} / $max)") + logger.error(s"Will retry after ${next.toSeconds} seconds (${cur + 1} / $retryCount)") after(next, as.scheduler, global, () => Future.successful(1)).flatMap { _ => - futureWithRetry(expression, onFailure, factor, next, max, cur + 1)(actorSystem) + futureWithRetry(expression, onFailure, cur + 1)(actorSystem) } } }) @@ -182,10 +194,10 @@ class WebhookListener(env: Env, eventService: EventService) { private def callWebhook(webhook: LightWebhook, body: String): Future[Unit] = { logger.info(s"Calling ${webhook.url.toString}") - val hasContentType = webhook.headers.exists { - case (name, _) => name.equalsIgnoreCase("Content-Type") + val hasContentType = webhook.headers.exists { case (name, _) => + name.equalsIgnoreCase("Content-Type") } - val headers = if(hasContentType) { + val headers = if (hasContentType) { webhook.headers } else { webhook.headers + ("Content-Type" -> "application/json") diff --git a/conf/application.conf b/conf/application.conf index 4d46e2c21..25891e8a9 100644 --- a/conf/application.conf +++ b/conf/application.conf @@ -9,6 +9,18 @@ app { url = "https://reporting.otoroshi.io/izanami/ingest" url = ${?IZANAMI_REPORTING_URL} } + webhooks { + retry { + count = 5 + count = ${?IZANAMI_WEBHOOK_RETRY_COUNT} + intial-delay = 5 + intial-delay = ${?IZANAMI_WEBHOOK_RETRY_INITIAL_DELAY} + max-delay = 600 + max-delay = ${?IZANAMI_WEBHOOK_RETRY_MAX_DELAY} + multiplier = 2 + multiplier = ${?IZANAMI_WEBHOOK_RETRY_MULTIPLIER} + } + } wasm { cache { ttl = 60000 diff --git a/manual/.docusaurus/@easyops-cn/docusaurus-search-local/default/generated.js b/manual/.docusaurus/@easyops-cn/docusaurus-search-local/default/generated.js index db589086e..c6a4f5770 100644 --- a/manual/.docusaurus/@easyops-cn/docusaurus-search-local/default/generated.js +++ b/manual/.docusaurus/@easyops-cn/docusaurus-search-local/default/generated.js @@ -1,12 +1,12 @@ -import lunr from "/home/runner/work/izanami/izanami/manual/node_modules/lunr/lunr.js"; -require("/home/runner/work/izanami/izanami/manual/node_modules/lunr-languages/lunr.stemmer.support.js")(lunr); +import lunr from "/Users/77199M/workspace/oss/izanami-v2/manual/node_modules/lunr/lunr.js"; +require("/Users/77199M/workspace/oss/izanami-v2/manual/node_modules/lunr-languages/lunr.stemmer.support.js")(lunr); require("@easyops-cn/docusaurus-search-local/dist/client/shared/lunrLanguageZh").lunrLanguageZh(lunr); -require("/home/runner/work/izanami/izanami/manual/node_modules/lunr-languages/lunr.multi.js")(lunr); +require("/Users/77199M/workspace/oss/izanami-v2/manual/node_modules/lunr-languages/lunr.multi.js")(lunr); export const language = ["en","zh"]; export const removeDefaultStopWordFilter = false; export const removeDefaultStemmer = false; -export { default as Mark } from "/home/runner/work/izanami/izanami/manual/node_modules/mark.js/dist/mark.js" -export const searchIndexUrl = "search-index{dir}.json?_=2de5ae58"; +export { default as Mark } from "/Users/77199M/workspace/oss/izanami-v2/manual/node_modules/mark.js/dist/mark.js" +export const searchIndexUrl = "search-index{dir}.json?_=11a1c7b8"; export const searchResultLimits = 8; export const searchResultContextMaxLength = 50; export const explicitSearchResultPath = true; diff --git a/manual/.docusaurus/client-modules.js b/manual/.docusaurus/client-modules.js index 91bb32e5c..fbef0a2f1 100644 --- a/manual/.docusaurus/client-modules.js +++ b/manual/.docusaurus/client-modules.js @@ -1,6 +1,6 @@ export default [ - require("/home/runner/work/izanami/izanami/manual/node_modules/infima/dist/css/default/default.css"), - require("/home/runner/work/izanami/izanami/manual/node_modules/@docusaurus/theme-classic/lib/prism-include-languages"), - require("/home/runner/work/izanami/izanami/manual/node_modules/@docusaurus/theme-classic/lib/nprogress"), - require("/home/runner/work/izanami/izanami/manual/src/css/custom.css"), + require("/Users/77199M/workspace/oss/izanami-v2/manual/node_modules/infima/dist/css/default/default.css"), + require("/Users/77199M/workspace/oss/izanami-v2/manual/node_modules/@docusaurus/theme-classic/lib/prism-include-languages"), + require("/Users/77199M/workspace/oss/izanami-v2/manual/node_modules/@docusaurus/theme-classic/lib/nprogress"), + require("/Users/77199M/workspace/oss/izanami-v2/manual/src/css/custom.css"), ]; diff --git a/manual/.docusaurus/docusaurus-plugin-debug/default/docusaurus-debug-all-content-673.json b/manual/.docusaurus/docusaurus-plugin-debug/default/docusaurus-debug-all-content-673.json index 067e51210..6cd7fff5b 100644 --- a/manual/.docusaurus/docusaurus-plugin-debug/default/docusaurus-debug-all-content-673.json +++ b/manual/.docusaurus/docusaurus-plugin-debug/default/docusaurus-debug-all-content-673.json @@ -34,8 +34,8 @@ }, "sidebar": "tutorialSidebar", "previous": { - "title": "Configuring Izanami", - "permalink": "/izanami/docs/guides/configuration" + "title": "Webhooks", + "permalink": "/izanami/docs/guides/webhooks" }, "next": { "title": "Java client", @@ -235,8 +235,8 @@ "permalink": "/izanami/docs/guides/mailer-configuration" }, "next": { - "title": "Clients", - "permalink": "/izanami/docs/clients/" + "title": "Webhooks", + "permalink": "/izanami/docs/guides/webhooks" } }, { @@ -498,6 +498,32 @@ "permalink": "/izanami/docs/guides/key-configuration" } }, + { + "id": "guides/webhooks", + "title": "Webhooks", + "description": "Webhooks are a way to make Izanami call a provided URL when a feature is modified.", + "source": "@site/docs/04-guides/12-webhooks.mdx", + "sourceDirName": "04-guides", + "slug": "/guides/webhooks", + "permalink": "/izanami/docs/guides/webhooks", + "draft": false, + "unlisted": false, + "tags": [], + "version": "current", + "sidebarPosition": 12, + "frontMatter": { + "title": "Webhooks" + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "Configuring Izanami", + "permalink": "/izanami/docs/guides/configuration" + }, + "next": { + "title": "Clients", + "permalink": "/izanami/docs/clients/" + } + }, { "id": "usages/contexts", "title": "Contexts", @@ -718,6 +744,10 @@ { "type": "doc", "id": "guides/configuration" + }, + { + "type": "doc", + "id": "guides/webhooks" } ], "link": { diff --git a/manual/.docusaurus/registry.js b/manual/.docusaurus/registry.js index 0147b5b2b..c05929c2b 100644 --- a/manual/.docusaurus/registry.js +++ b/manual/.docusaurus/registry.js @@ -1,80 +1,88 @@ export default { - "0f98d465": [() => import(/* webpackChunkName: "0f98d465" */ "@site/v1/18-tutorials/index.mdx"), "@site/v1/18-tutorials/index.mdx", require.resolveWeak("@site/v1/18-tutorials/index.mdx")], - "12625af8": [() => import(/* webpackChunkName: "12625af8" */ "@site/v1/13-keys.mdx"), "@site/v1/13-keys.mdx", require.resolveWeak("@site/v1/13-keys.mdx")], - "144ae2b5": [() => import(/* webpackChunkName: "144ae2b5" */ "@site/v1/10-configs/01-ui.mdx"), "@site/v1/10-configs/01-ui.mdx", require.resolveWeak("@site/v1/10-configs/01-ui.mdx")], - "1457b77c": [() => import(/* webpackChunkName: "1457b77c" */ "/home/runner/work/izanami/izanami/manual/.docusaurus/@easyops-cn/docusaurus-search-local/default/plugin-route-context-module-100.json"), "/home/runner/work/izanami/izanami/manual/.docusaurus/@easyops-cn/docusaurus-search-local/default/plugin-route-context-module-100.json", require.resolveWeak("/home/runner/work/izanami/izanami/manual/.docusaurus/@easyops-cn/docusaurus-search-local/default/plugin-route-context-module-100.json")], - "1756af0d": [() => import(/* webpackChunkName: "1756af0d" */ "@site/docs/03-usages/01-features.mdx"), "@site/docs/03-usages/01-features.mdx", require.resolveWeak("@site/docs/03-usages/01-features.mdx")], - "17896441": [() => import(/* webpackChunkName: "17896441" */ "@theme/DocItem"), "@theme/DocItem", require.resolveWeak("@theme/DocItem")], - "1a4e3797": [() => import(/* webpackChunkName: "1a4e3797" */ "@theme/SearchPage"), "@theme/SearchPage", require.resolveWeak("@theme/SearchPage")], - "1ad66b9e": [() => import(/* webpackChunkName: "1ad66b9e" */ "/home/runner/work/izanami/izanami/manual/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json"), "/home/runner/work/izanami/izanami/manual/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json", require.resolveWeak("/home/runner/work/izanami/izanami/manual/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json")], - "1ee94ba8": [() => import(/* webpackChunkName: "1ee94ba8" */ "@site/docs/04-guides/11-configuration.mdx"), "@site/docs/04-guides/11-configuration.mdx", require.resolveWeak("@site/docs/04-guides/11-configuration.mdx")], - "22a808b3": [() => import(/* webpackChunkName: "22a808b3" */ "@site/v1/08-ui.mdx"), "@site/v1/08-ui.mdx", require.resolveWeak("@site/v1/08-ui.mdx")], - "2524d653": [() => import(/* webpackChunkName: "2524d653" */ "@site/docs/03-usages/03-organisation.mdx"), "@site/docs/03-usages/03-organisation.mdx", require.resolveWeak("@site/docs/03-usages/03-organisation.mdx")], - "28294f75": [() => import(/* webpackChunkName: "28294f75" */ "@site/docs/04-guides/01-env-contexts.mdx"), "@site/docs/04-guides/01-env-contexts.mdx", require.resolveWeak("@site/docs/04-guides/01-env-contexts.mdx")], - "28ea13a0": [() => import(/* webpackChunkName: "28ea13a0" */ "@site/v1/17-clients/03-node.mdx"), "@site/v1/17-clients/03-node.mdx", require.resolveWeak("@site/v1/17-clients/03-node.mdx")], - "2c55d6de": [() => import(/* webpackChunkName: "2c55d6de" */ "@site/v1/11-features-flipping/03-api.mdx"), "@site/v1/11-features-flipping/03-api.mdx", require.resolveWeak("@site/v1/11-features-flipping/03-api.mdx")], - "2e7f27e2": [() => import(/* webpackChunkName: "2e7f27e2" */ "@site/docs/04-guides/index.mdx"), "@site/docs/04-guides/index.mdx", require.resolveWeak("@site/docs/04-guides/index.mdx")], - "309e43de": [() => import(/* webpackChunkName: "309e43de" */ "@site/v1/12-experiments/01-ui.mdx"), "@site/v1/12-experiments/01-ui.mdx", require.resolveWeak("@site/v1/12-experiments/01-ui.mdx")], - "3651c730": [() => import(/* webpackChunkName: "3651c730" */ "@site/v1/11-features-flipping/index.mdx"), "@site/v1/11-features-flipping/index.mdx", require.resolveWeak("@site/v1/11-features-flipping/index.mdx")], - "37d37b99": [() => import(/* webpackChunkName: "37d37b99" */ "@site/v1/11-features-flipping/04-lock.mdx"), "@site/v1/11-features-flipping/04-lock.mdx", require.resolveWeak("@site/v1/11-features-flipping/04-lock.mdx")], - "382abdc7": [() => import(/* webpackChunkName: "382abdc7" */ "@site/docs/04-guides/08-user-invitation.mdx"), "@site/docs/04-guides/08-user-invitation.mdx", require.resolveWeak("@site/docs/04-guides/08-user-invitation.mdx")], - "38c1ccfe": [() => import(/* webpackChunkName: "38c1ccfe" */ "@site/v1/index.mdx"), "@site/v1/index.mdx", require.resolveWeak("@site/v1/index.mdx")], - "39cf9c2b": [() => import(/* webpackChunkName: "39cf9c2b" */ "@site/docs/02-concepts/index.mdx"), "@site/docs/02-concepts/index.mdx", require.resolveWeak("@site/docs/02-concepts/index.mdx")], - "3cfbbc0f": [() => import(/* webpackChunkName: "3cfbbc0f" */ "@site/v1/17-clients/04-cli.mdx"), "@site/v1/17-clients/04-cli.mdx", require.resolveWeak("@site/v1/17-clients/04-cli.mdx")], - "3e4b204b": [() => import(/* webpackChunkName: "3e4b204b" */ "@site/v1/10-configs/index.mdx"), "@site/v1/10-configs/index.mdx", require.resolveWeak("@site/v1/10-configs/index.mdx")], - "404820e5": [() => import(/* webpackChunkName: "404820e5" */ "@site/v1/02-about.mdx"), "@site/v1/02-about.mdx", require.resolveWeak("@site/v1/02-about.mdx")], - "404d2a01": [() => import(/* webpackChunkName: "404d2a01" */ "@site/v1/18-tutorials/02-oauth2.mdx"), "@site/v1/18-tutorials/02-oauth2.mdx", require.resolveWeak("@site/v1/18-tutorials/02-oauth2.mdx")], - "44ca1fc6": [() => import(/* webpackChunkName: "44ca1fc6" */ "@site/v1/17-clients/01-jvm.mdx"), "@site/v1/17-clients/01-jvm.mdx", require.resolveWeak("@site/v1/17-clients/01-jvm.mdx")], - "45bf6ac8": [() => import(/* webpackChunkName: "45bf6ac8" */ "@site/docs/04-guides/06-local-scripts.mdx"), "@site/docs/04-guides/06-local-scripts.mdx", require.resolveWeak("@site/docs/04-guides/06-local-scripts.mdx")], - "4cb46bbe": [() => import(/* webpackChunkName: "4cb46bbe" */ "/home/runner/work/izanami/izanami/manual/.docusaurus/docusaurus-plugin-content-docs/v1/plugin-route-context-module-100.json"), "/home/runner/work/izanami/izanami/manual/.docusaurus/docusaurus-plugin-content-docs/v1/plugin-route-context-module-100.json", require.resolveWeak("/home/runner/work/izanami/izanami/manual/.docusaurus/docusaurus-plugin-content-docs/v1/plugin-route-context-module-100.json")], - "52d2f9c5": [() => import(/* webpackChunkName: "52d2f9c5" */ "@site/docs/04-guides/05-import-from-v1.mdx"), "@site/docs/04-guides/05-import-from-v1.mdx", require.resolveWeak("@site/docs/04-guides/05-import-from-v1.mdx")], - "54014a70": [() => import(/* webpackChunkName: "54014a70" */ "@site/v1/07-settings/database.mdx"), "@site/v1/07-settings/database.mdx", require.resolveWeak("@site/v1/07-settings/database.mdx")], - "55940994": [() => import(/* webpackChunkName: "55940994" */ "@site/docs/01-getstarted/index.mdx"), "@site/docs/01-getstarted/index.mdx", require.resolveWeak("@site/docs/01-getstarted/index.mdx")], - "5a1e6866": [() => import(/* webpackChunkName: "5a1e6866" */ "@site/docs/04-guides/10-mailer-configuration.mdx"), "@site/docs/04-guides/10-mailer-configuration.mdx", require.resolveWeak("@site/docs/04-guides/10-mailer-configuration.mdx")], - "5e95c892": [() => import(/* webpackChunkName: "5e95c892" */ "@theme/DocsRoot"), "@theme/DocsRoot", require.resolveWeak("@theme/DocsRoot")], - "5e9f5e1a": [() => import(/* webpackChunkName: "5e9f5e1a" */ "@generated/docusaurus.config"), "@generated/docusaurus.config", require.resolveWeak("@generated/docusaurus.config")], - "5ec15e41": [() => import(/* webpackChunkName: "5ec15e41" */ "@site/docs/04-guides/07-remote-script.mdx"), "@site/docs/04-guides/07-remote-script.mdx", require.resolveWeak("@site/docs/04-guides/07-remote-script.mdx")], - "604919e7": [() => import(/* webpackChunkName: "604919e7" */ "@site/v1/07-settings/settings.mdx"), "@site/v1/07-settings/settings.mdx", require.resolveWeak("@site/v1/07-settings/settings.mdx")], - "61d10066": [() => import(/* webpackChunkName: "61d10066" */ "@site/v1/10-configs/03-springconfig.mdx"), "@site/v1/10-configs/03-springconfig.mdx", require.resolveWeak("@site/v1/10-configs/03-springconfig.mdx")], - "62eca57d": [() => import(/* webpackChunkName: "62eca57d" */ "@site/v1/03-philosophy.mdx"), "@site/v1/03-philosophy.mdx", require.resolveWeak("@site/v1/03-philosophy.mdx")], - "692c4667": [() => import(/* webpackChunkName: "692c4667" */ "@site/docs/04-guides/09-key-configuration.mdx"), "@site/docs/04-guides/09-key-configuration.mdx", require.resolveWeak("@site/docs/04-guides/09-key-configuration.mdx")], - "6a24d81d": [() => import(/* webpackChunkName: "6a24d81d" */ "@site/v1/10-configs/02-api.mdx"), "@site/v1/10-configs/02-api.mdx", require.resolveWeak("@site/v1/10-configs/02-api.mdx")], - "6b55a23b": [() => import(/* webpackChunkName: "6b55a23b" */ "@site/v1/11-features-flipping/02-scripts.mdx"), "@site/v1/11-features-flipping/02-scripts.mdx", require.resolveWeak("@site/v1/11-features-flipping/02-scripts.mdx")], - "7329b9d1": [() => import(/* webpackChunkName: "7329b9d1" */ "~docs/v1/version-current-metadata-prop-751.json"), "~docs/v1/version-current-metadata-prop-751.json", require.resolveWeak("~docs/v1/version-current-metadata-prop-751.json")], - "7a055ef3": [() => import(/* webpackChunkName: "7a055ef3" */ "@site/v1/20-developers.mdx"), "@site/v1/20-developers.mdx", require.resolveWeak("@site/v1/20-developers.mdx")], - "7a3092a3": [() => import(/* webpackChunkName: "7a3092a3" */ "@site/v1/17-clients/05-spring-starter.mdx"), "@site/v1/17-clients/05-spring-starter.mdx", require.resolveWeak("@site/v1/17-clients/05-spring-starter.mdx")], - "83cf5a0e": [() => import(/* webpackChunkName: "83cf5a0e" */ "@site/v1/06-getizanami/01-binaries.mdx"), "@site/v1/06-getizanami/01-binaries.mdx", require.resolveWeak("@site/v1/06-getizanami/01-binaries.mdx")], - "858bfcaf": [() => import(/* webpackChunkName: "858bfcaf" */ "@site/docs/05-clients/01-java/index.mdx"), "@site/docs/05-clients/01-java/index.mdx", require.resolveWeak("@site/docs/05-clients/01-java/index.mdx")], - "868bc92e": [() => import(/* webpackChunkName: "868bc92e" */ "@site/v1/04-features.mdx"), "@site/v1/04-features.mdx", require.resolveWeak("@site/v1/04-features.mdx")], - "88f2e2fd": [() => import(/* webpackChunkName: "88f2e2fd" */ "@site/docs/04-guides/12-webhooks.mdx"), "@site/docs/04-guides/12-webhooks.mdx", require.resolveWeak("@site/docs/04-guides/12-webhooks.mdx")], - "8a163022": [() => import(/* webpackChunkName: "8a163022" */ "@site/v1/07-settings/index.mdx"), "@site/v1/07-settings/index.mdx", require.resolveWeak("@site/v1/07-settings/index.mdx")], - "8c817def": [() => import(/* webpackChunkName: "8c817def" */ "@site/v1/09-api.mdx"), "@site/v1/09-api.mdx", require.resolveWeak("@site/v1/09-api.mdx")], - "915e538f": [() => import(/* webpackChunkName: "915e538f" */ "@site/v1/17-clients/index.mdx"), "@site/v1/17-clients/index.mdx", require.resolveWeak("@site/v1/17-clients/index.mdx")], - "935f2afb": [() => import(/* webpackChunkName: "935f2afb" */ "~docs/default/version-current-metadata-prop-751.json"), "~docs/default/version-current-metadata-prop-751.json", require.resolveWeak("~docs/default/version-current-metadata-prop-751.json")], - "95f95e10": [() => import(/* webpackChunkName: "95f95e10" */ "@site/docs/05-clients/01-java/02-error-handling.mdx"), "@site/docs/05-clients/01-java/02-error-handling.mdx", require.resolveWeak("@site/docs/05-clients/01-java/02-error-handling.mdx")], - "9af8677d": [() => import(/* webpackChunkName: "9af8677d" */ "@site/docs/04-guides/04-bulk-feature-modification.mdx"), "@site/docs/04-guides/04-bulk-feature-modification.mdx", require.resolveWeak("@site/docs/04-guides/04-bulk-feature-modification.mdx")], - "a5a0f36f": [() => import(/* webpackChunkName: "a5a0f36f" */ "/home/runner/work/izanami/izanami/manual/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json"), "/home/runner/work/izanami/izanami/manual/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json", require.resolveWeak("/home/runner/work/izanami/izanami/manual/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json")], - "a7bd4aaa": [() => import(/* webpackChunkName: "a7bd4aaa" */ "@theme/DocVersionRoot"), "@theme/DocVersionRoot", require.resolveWeak("@theme/DocVersionRoot")], - "a94703ab": [() => import(/* webpackChunkName: "a94703ab" */ "@theme/DocRoot"), "@theme/DocRoot", require.resolveWeak("@theme/DocRoot")], - "aa63221d": [() => import(/* webpackChunkName: "aa63221d" */ "@site/docs/05-clients/01-java/03-sse.mdx"), "@site/docs/05-clients/01-java/03-sse.mdx", require.resolveWeak("@site/docs/05-clients/01-java/03-sse.mdx")], - "b35c709e": [() => import(/* webpackChunkName: "b35c709e" */ "@site/docs/03-usages/02-contexts.mdx"), "@site/docs/03-usages/02-contexts.mdx", require.resolveWeak("@site/docs/03-usages/02-contexts.mdx")], - "c4f5d8e4": [() => import(/* webpackChunkName: "c4f5d8e4" */ "@site/src/pages/index.js"), "@site/src/pages/index.js", require.resolveWeak("@site/src/pages/index.js")], - "cbc90340": [() => import(/* webpackChunkName: "cbc90340" */ "@site/docs/04-guides/02-multi-conditions-feature.mdx"), "@site/docs/04-guides/02-multi-conditions-feature.mdx", require.resolveWeak("@site/docs/04-guides/02-multi-conditions-feature.mdx")], - "cced1e3d": [() => import(/* webpackChunkName: "cced1e3d" */ "@site/v1/05-architecture.mdx"), "@site/v1/05-architecture.mdx", require.resolveWeak("@site/v1/05-architecture.mdx")], - "cdfb9db4": [() => import(/* webpackChunkName: "cdfb9db4" */ "@site/v1/17-clients/02-react.mdx"), "@site/v1/17-clients/02-react.mdx", require.resolveWeak("@site/v1/17-clients/02-react.mdx")], - "cf997756": [() => import(/* webpackChunkName: "cf997756" */ "@site/v1/18-tutorials/01-spring.mdx"), "@site/v1/18-tutorials/01-spring.mdx", require.resolveWeak("@site/v1/18-tutorials/01-spring.mdx")], - "d5980866": [() => import(/* webpackChunkName: "d5980866" */ "@site/v1/19-performances.mdx"), "@site/v1/19-performances.mdx", require.resolveWeak("@site/v1/19-performances.mdx")], - "d86837dc": [() => import(/* webpackChunkName: "d86837dc" */ "@site/docs/03-usages/04-request.mdx"), "@site/docs/03-usages/04-request.mdx", require.resolveWeak("@site/docs/03-usages/04-request.mdx")], - "d98f6b02": [() => import(/* webpackChunkName: "d98f6b02" */ "@site/docs/05-clients/01-java/01-cache.mdx"), "@site/docs/05-clients/01-java/01-cache.mdx", require.resolveWeak("@site/docs/05-clients/01-java/01-cache.mdx")], - "d9a19508": [() => import(/* webpackChunkName: "d9a19508" */ "@site/v1/06-getizanami/index.mdx"), "@site/v1/06-getizanami/index.mdx", require.resolveWeak("@site/v1/06-getizanami/index.mdx")], - "dc8f53ac": [() => import(/* webpackChunkName: "dc8f53ac" */ "@site/v1/06-getizanami/02-docker.mdx"), "@site/v1/06-getizanami/02-docker.mdx", require.resolveWeak("@site/v1/06-getizanami/02-docker.mdx")], - "dfda2e39": [() => import(/* webpackChunkName: "dfda2e39" */ "@site/v1/14-events.mdx"), "@site/v1/14-events.mdx", require.resolveWeak("@site/v1/14-events.mdx")], - "e157316e": [() => import(/* webpackChunkName: "e157316e" */ "@site/v1/12-experiments/02-api.mdx"), "@site/v1/12-experiments/02-api.mdx", require.resolveWeak("@site/v1/12-experiments/02-api.mdx")], - "e90300dd": [() => import(/* webpackChunkName: "e90300dd" */ "@site/v1/12-experiments/index.mdx"), "@site/v1/12-experiments/index.mdx", require.resolveWeak("@site/v1/12-experiments/index.mdx")], - "ea391ed7": [() => import(/* webpackChunkName: "ea391ed7" */ "@site/v1/16-authprovider.mdx"), "@site/v1/16-authprovider.mdx", require.resolveWeak("@site/v1/16-authprovider.mdx")], - "efe36f9c": [() => import(/* webpackChunkName: "efe36f9c" */ "@site/v1/11-features-flipping/01-ui.mdx"), "@site/v1/11-features-flipping/01-ui.mdx", require.resolveWeak("@site/v1/11-features-flipping/01-ui.mdx")], - "f09d0f18": [() => import(/* webpackChunkName: "f09d0f18" */ "@site/docs/03-usages/index.mdx"), "@site/docs/03-usages/index.mdx", require.resolveWeak("@site/docs/03-usages/index.mdx")], - "f3281aa5": [() => import(/* webpackChunkName: "f3281aa5" */ "@site/v1/15-metrics.mdx"), "@site/v1/15-metrics.mdx", require.resolveWeak("@site/v1/15-metrics.mdx")], - "f53bace1": [() => import(/* webpackChunkName: "f53bace1" */ "@site/docs/05-clients/index.mdx"), "@site/docs/05-clients/index.mdx", require.resolveWeak("@site/docs/05-clients/index.mdx")], - "f5ac983d": [() => import(/* webpackChunkName: "f5ac983d" */ "@site/v1/06-getizanami/03-fromsources.mdx"), "@site/v1/06-getizanami/03-fromsources.mdx", require.resolveWeak("@site/v1/06-getizanami/03-fromsources.mdx")], - "f7b0431a": [() => import(/* webpackChunkName: "f7b0431a" */ "@site/docs/04-guides/03-query-builder.mdx"), "@site/docs/04-guides/03-query-builder.mdx", require.resolveWeak("@site/docs/04-guides/03-query-builder.mdx")],}; + "__comp---site-src-pages-index-jsc-4-f-f99": [() => import(/* webpackChunkName: "__comp---site-src-pages-index-jsc-4-f-f99" */ "@site/src/pages/index.js"), "@site/src/pages/index.js", require.resolveWeak("@site/src/pages/index.js")], + "__comp---theme-debug-config-23-a-2ff": [() => import(/* webpackChunkName: "__comp---theme-debug-config-23-a-2ff" */ "@theme/DebugConfig"), "@theme/DebugConfig", require.resolveWeak("@theme/DebugConfig")], + "__comp---theme-debug-contentba-8-ce7": [() => import(/* webpackChunkName: "__comp---theme-debug-contentba-8-ce7" */ "@theme/DebugContent"), "@theme/DebugContent", require.resolveWeak("@theme/DebugContent")], + "__comp---theme-debug-global-dataede-0fa": [() => import(/* webpackChunkName: "__comp---theme-debug-global-dataede-0fa" */ "@theme/DebugGlobalData"), "@theme/DebugGlobalData", require.resolveWeak("@theme/DebugGlobalData")], + "__comp---theme-debug-registry-679-501": [() => import(/* webpackChunkName: "__comp---theme-debug-registry-679-501" */ "@theme/DebugRegistry"), "@theme/DebugRegistry", require.resolveWeak("@theme/DebugRegistry")], + "__comp---theme-debug-routes-946-699": [() => import(/* webpackChunkName: "__comp---theme-debug-routes-946-699" */ "@theme/DebugRoutes"), "@theme/DebugRoutes", require.resolveWeak("@theme/DebugRoutes")], + "__comp---theme-debug-site-metadata-68-e-3d4": [() => import(/* webpackChunkName: "__comp---theme-debug-site-metadata-68-e-3d4" */ "@theme/DebugSiteMetadata"), "@theme/DebugSiteMetadata", require.resolveWeak("@theme/DebugSiteMetadata")], + "__comp---theme-doc-item-178-a40": [() => import(/* webpackChunkName: "__comp---theme-doc-item-178-a40" */ "@theme/DocItem"), "@theme/DocItem", require.resolveWeak("@theme/DocItem")], + "__comp---theme-doc-roota-94-67a": [() => import(/* webpackChunkName: "__comp---theme-doc-roota-94-67a" */ "@theme/DocRoot"), "@theme/DocRoot", require.resolveWeak("@theme/DocRoot")], + "__comp---theme-doc-version-roota-7-b-5de": [() => import(/* webpackChunkName: "__comp---theme-doc-version-roota-7-b-5de" */ "@theme/DocVersionRoot"), "@theme/DocVersionRoot", require.resolveWeak("@theme/DocVersionRoot")], + "__comp---theme-docs-root-5-e-9-0b6": [() => import(/* webpackChunkName: "__comp---theme-docs-root-5-e-9-0b6" */ "@theme/DocsRoot"), "@theme/DocsRoot", require.resolveWeak("@theme/DocsRoot")], + "__comp---theme-search-page-1-a-4-d6f": [() => import(/* webpackChunkName: "__comp---theme-search-page-1-a-4-d6f" */ "@theme/SearchPage"), "@theme/SearchPage", require.resolveWeak("@theme/SearchPage")], + "allContent---izanami-docusaurus-debug-content-246-c61": [() => import(/* webpackChunkName: "allContent---izanami-docusaurus-debug-content-246-c61" */ "~debug/default/docusaurus-debug-all-content-673.json"), "~debug/default/docusaurus-debug-all-content-673.json", require.resolveWeak("~debug/default/docusaurus-debug-all-content-673.json")], + "config---izanami-5-e-9-485": [() => import(/* webpackChunkName: "config---izanami-5-e-9-485" */ "@generated/docusaurus.config"), "@generated/docusaurus.config", require.resolveWeak("@generated/docusaurus.config")], + "content---izanami-docs-clients-f-53-ddb": [() => import(/* webpackChunkName: "content---izanami-docs-clients-f-53-ddb" */ "@site/docs/05-clients/index.mdx"), "@site/docs/05-clients/index.mdx", require.resolveWeak("@site/docs/05-clients/index.mdx")], + "content---izanami-docs-clients-java-858-68f": [() => import(/* webpackChunkName: "content---izanami-docs-clients-java-858-68f" */ "@site/docs/05-clients/01-java/index.mdx"), "@site/docs/05-clients/01-java/index.mdx", require.resolveWeak("@site/docs/05-clients/01-java/index.mdx")], + "content---izanami-docs-clients-java-cached-98-38e": [() => import(/* webpackChunkName: "content---izanami-docs-clients-java-cached-98-38e" */ "@site/docs/05-clients/01-java/01-cache.mdx"), "@site/docs/05-clients/01-java/01-cache.mdx", require.resolveWeak("@site/docs/05-clients/01-java/01-cache.mdx")], + "content---izanami-docs-clients-java-error-handling-95-f-d67": [() => import(/* webpackChunkName: "content---izanami-docs-clients-java-error-handling-95-f-d67" */ "@site/docs/05-clients/01-java/02-error-handling.mdx"), "@site/docs/05-clients/01-java/02-error-handling.mdx", require.resolveWeak("@site/docs/05-clients/01-java/02-error-handling.mdx")], + "content---izanami-docs-clients-java-sseaa-6-ecb": [() => import(/* webpackChunkName: "content---izanami-docs-clients-java-sseaa-6-ecb" */ "@site/docs/05-clients/01-java/03-sse.mdx"), "@site/docs/05-clients/01-java/03-sse.mdx", require.resolveWeak("@site/docs/05-clients/01-java/03-sse.mdx")], + "content---izanami-docs-concepts-39-c-d27": [() => import(/* webpackChunkName: "content---izanami-docs-concepts-39-c-d27" */ "@site/docs/02-concepts/index.mdx"), "@site/docs/02-concepts/index.mdx", require.resolveWeak("@site/docs/02-concepts/index.mdx")], + "content---izanami-docs-getstarted-559-e25": [() => import(/* webpackChunkName: "content---izanami-docs-getstarted-559-e25" */ "@site/docs/01-getstarted/index.mdx"), "@site/docs/01-getstarted/index.mdx", require.resolveWeak("@site/docs/01-getstarted/index.mdx")], + "content---izanami-docs-guides-2-e-7-90c": [() => import(/* webpackChunkName: "content---izanami-docs-guides-2-e-7-90c" */ "@site/docs/04-guides/index.mdx"), "@site/docs/04-guides/index.mdx", require.resolveWeak("@site/docs/04-guides/index.mdx")], + "content---izanami-docs-guides-bulk-feature-modification-9-af-8db": [() => import(/* webpackChunkName: "content---izanami-docs-guides-bulk-feature-modification-9-af-8db" */ "@site/docs/04-guides/04-bulk-feature-modification.mdx"), "@site/docs/04-guides/04-bulk-feature-modification.mdx", require.resolveWeak("@site/docs/04-guides/04-bulk-feature-modification.mdx")], + "content---izanami-docs-guides-configuration-1-ee-ee3": [() => import(/* webpackChunkName: "content---izanami-docs-guides-configuration-1-ee-ee3" */ "@site/docs/04-guides/11-configuration.mdx"), "@site/docs/04-guides/11-configuration.mdx", require.resolveWeak("@site/docs/04-guides/11-configuration.mdx")], + "content---izanami-docs-guides-env-contexts-282-25d": [() => import(/* webpackChunkName: "content---izanami-docs-guides-env-contexts-282-25d" */ "@site/docs/04-guides/01-env-contexts.mdx"), "@site/docs/04-guides/01-env-contexts.mdx", require.resolveWeak("@site/docs/04-guides/01-env-contexts.mdx")], + "content---izanami-docs-guides-import-from-v-152-d-389": [() => import(/* webpackChunkName: "content---izanami-docs-guides-import-from-v-152-d-389" */ "@site/docs/04-guides/05-import-from-v1.mdx"), "@site/docs/04-guides/05-import-from-v1.mdx", require.resolveWeak("@site/docs/04-guides/05-import-from-v1.mdx")], + "content---izanami-docs-guides-key-configuration-692-f34": [() => import(/* webpackChunkName: "content---izanami-docs-guides-key-configuration-692-f34" */ "@site/docs/04-guides/09-key-configuration.mdx"), "@site/docs/04-guides/09-key-configuration.mdx", require.resolveWeak("@site/docs/04-guides/09-key-configuration.mdx")], + "content---izanami-docs-guides-local-scripts-45-b-d3d": [() => import(/* webpackChunkName: "content---izanami-docs-guides-local-scripts-45-b-d3d" */ "@site/docs/04-guides/06-local-scripts.mdx"), "@site/docs/04-guides/06-local-scripts.mdx", require.resolveWeak("@site/docs/04-guides/06-local-scripts.mdx")], + "content---izanami-docs-guides-mailer-configuration-5-a-1-826": [() => import(/* webpackChunkName: "content---izanami-docs-guides-mailer-configuration-5-a-1-826" */ "@site/docs/04-guides/10-mailer-configuration.mdx"), "@site/docs/04-guides/10-mailer-configuration.mdx", require.resolveWeak("@site/docs/04-guides/10-mailer-configuration.mdx")], + "content---izanami-docs-guides-multi-conditions-featurecbc-67a": [() => import(/* webpackChunkName: "content---izanami-docs-guides-multi-conditions-featurecbc-67a" */ "@site/docs/04-guides/02-multi-conditions-feature.mdx"), "@site/docs/04-guides/02-multi-conditions-feature.mdx", require.resolveWeak("@site/docs/04-guides/02-multi-conditions-feature.mdx")], + "content---izanami-docs-guides-query-builderf-7-b-4f8": [() => import(/* webpackChunkName: "content---izanami-docs-guides-query-builderf-7-b-4f8" */ "@site/docs/04-guides/03-query-builder.mdx"), "@site/docs/04-guides/03-query-builder.mdx", require.resolveWeak("@site/docs/04-guides/03-query-builder.mdx")], + "content---izanami-docs-guides-remote-script-5-ec-5c2": [() => import(/* webpackChunkName: "content---izanami-docs-guides-remote-script-5-ec-5c2" */ "@site/docs/04-guides/07-remote-script.mdx"), "@site/docs/04-guides/07-remote-script.mdx", require.resolveWeak("@site/docs/04-guides/07-remote-script.mdx")], + "content---izanami-docs-guides-user-invitation-382-89d": [() => import(/* webpackChunkName: "content---izanami-docs-guides-user-invitation-382-89d" */ "@site/docs/04-guides/08-user-invitation.mdx"), "@site/docs/04-guides/08-user-invitation.mdx", require.resolveWeak("@site/docs/04-guides/08-user-invitation.mdx")], + "content---izanami-docs-guides-webhooks-88-f-a97": [() => import(/* webpackChunkName: "content---izanami-docs-guides-webhooks-88-f-a97" */ "@site/docs/04-guides/12-webhooks.mdx"), "@site/docs/04-guides/12-webhooks.mdx", require.resolveWeak("@site/docs/04-guides/12-webhooks.mdx")], + "content---izanami-docs-usages-contextsb-35-a79": [() => import(/* webpackChunkName: "content---izanami-docs-usages-contextsb-35-a79" */ "@site/docs/03-usages/02-contexts.mdx"), "@site/docs/03-usages/02-contexts.mdx", require.resolveWeak("@site/docs/03-usages/02-contexts.mdx")], + "content---izanami-docs-usages-f-09-ee0": [() => import(/* webpackChunkName: "content---izanami-docs-usages-f-09-ee0" */ "@site/docs/03-usages/index.mdx"), "@site/docs/03-usages/index.mdx", require.resolveWeak("@site/docs/03-usages/index.mdx")], + "content---izanami-docs-usages-features-175-9e5": [() => import(/* webpackChunkName: "content---izanami-docs-usages-features-175-9e5" */ "@site/docs/03-usages/01-features.mdx"), "@site/docs/03-usages/01-features.mdx", require.resolveWeak("@site/docs/03-usages/01-features.mdx")], + "content---izanami-docs-usages-organisation-252-2d5": [() => import(/* webpackChunkName: "content---izanami-docs-usages-organisation-252-2d5" */ "@site/docs/03-usages/03-organisation.mdx"), "@site/docs/03-usages/03-organisation.mdx", require.resolveWeak("@site/docs/03-usages/03-organisation.mdx")], + "content---izanami-docs-usages-requestd-86-68b": [() => import(/* webpackChunkName: "content---izanami-docs-usages-requestd-86-68b" */ "@site/docs/03-usages/04-request.mdx"), "@site/docs/03-usages/04-request.mdx", require.resolveWeak("@site/docs/03-usages/04-request.mdx")], + "content---izanami-v-1-38-c-105": [() => import(/* webpackChunkName: "content---izanami-v-1-38-c-105" */ "@site/v1/index.mdx"), "@site/v1/index.mdx", require.resolveWeak("@site/v1/index.mdx")], + "content---izanami-v-1-about-404-3f5": [() => import(/* webpackChunkName: "content---izanami-v-1-about-404-3f5" */ "@site/v1/02-about.mdx"), "@site/v1/02-about.mdx", require.resolveWeak("@site/v1/02-about.mdx")], + "content---izanami-v-1-api-8-c-8-676": [() => import(/* webpackChunkName: "content---izanami-v-1-api-8-c-8-676" */ "@site/v1/09-api.mdx"), "@site/v1/09-api.mdx", require.resolveWeak("@site/v1/09-api.mdx")], + "content---izanami-v-1-architecturecce-931": [() => import(/* webpackChunkName: "content---izanami-v-1-architecturecce-931" */ "@site/v1/05-architecture.mdx"), "@site/v1/05-architecture.mdx", require.resolveWeak("@site/v1/05-architecture.mdx")], + "content---izanami-v-1-authproviderea-3-644": [() => import(/* webpackChunkName: "content---izanami-v-1-authproviderea-3-644" */ "@site/v1/16-authprovider.mdx"), "@site/v1/16-authprovider.mdx", require.resolveWeak("@site/v1/16-authprovider.mdx")], + "content---izanami-v-1-clients-915-d28": [() => import(/* webpackChunkName: "content---izanami-v-1-clients-915-d28" */ "@site/v1/17-clients/index.mdx"), "@site/v1/17-clients/index.mdx", require.resolveWeak("@site/v1/17-clients/index.mdx")], + "content---izanami-v-1-clients-cli-3-cf-9a1": [() => import(/* webpackChunkName: "content---izanami-v-1-clients-cli-3-cf-9a1" */ "@site/v1/17-clients/04-cli.mdx"), "@site/v1/17-clients/04-cli.mdx", require.resolveWeak("@site/v1/17-clients/04-cli.mdx")], + "content---izanami-v-1-clients-jvm-44-c-096": [() => import(/* webpackChunkName: "content---izanami-v-1-clients-jvm-44-c-096" */ "@site/v1/17-clients/01-jvm.mdx"), "@site/v1/17-clients/01-jvm.mdx", require.resolveWeak("@site/v1/17-clients/01-jvm.mdx")], + "content---izanami-v-1-clients-node-28-e-d45": [() => import(/* webpackChunkName: "content---izanami-v-1-clients-node-28-e-d45" */ "@site/v1/17-clients/03-node.mdx"), "@site/v1/17-clients/03-node.mdx", require.resolveWeak("@site/v1/17-clients/03-node.mdx")], + "content---izanami-v-1-clients-reactcdf-b19": [() => import(/* webpackChunkName: "content---izanami-v-1-clients-reactcdf-b19" */ "@site/v1/17-clients/02-react.mdx"), "@site/v1/17-clients/02-react.mdx", require.resolveWeak("@site/v1/17-clients/02-react.mdx")], + "content---izanami-v-1-clients-spring-starter-7-a-3-7a6": [() => import(/* webpackChunkName: "content---izanami-v-1-clients-spring-starter-7-a-3-7a6" */ "@site/v1/17-clients/05-spring-starter.mdx"), "@site/v1/17-clients/05-spring-starter.mdx", require.resolveWeak("@site/v1/17-clients/05-spring-starter.mdx")], + "content---izanami-v-1-configs-3-e-4-2ff": [() => import(/* webpackChunkName: "content---izanami-v-1-configs-3-e-4-2ff" */ "@site/v1/10-configs/index.mdx"), "@site/v1/10-configs/index.mdx", require.resolveWeak("@site/v1/10-configs/index.mdx")], + "content---izanami-v-1-configs-api-6-a-2-69d": [() => import(/* webpackChunkName: "content---izanami-v-1-configs-api-6-a-2-69d" */ "@site/v1/10-configs/02-api.mdx"), "@site/v1/10-configs/02-api.mdx", require.resolveWeak("@site/v1/10-configs/02-api.mdx")], + "content---izanami-v-1-configs-springconfig-61-d-f30": [() => import(/* webpackChunkName: "content---izanami-v-1-configs-springconfig-61-d-f30" */ "@site/v1/10-configs/03-springconfig.mdx"), "@site/v1/10-configs/03-springconfig.mdx", require.resolveWeak("@site/v1/10-configs/03-springconfig.mdx")], + "content---izanami-v-1-configs-ui-144-a34": [() => import(/* webpackChunkName: "content---izanami-v-1-configs-ui-144-a34" */ "@site/v1/10-configs/01-ui.mdx"), "@site/v1/10-configs/01-ui.mdx", require.resolveWeak("@site/v1/10-configs/01-ui.mdx")], + "content---izanami-v-1-developers-7-a-0-9c7": [() => import(/* webpackChunkName: "content---izanami-v-1-developers-7-a-0-9c7" */ "@site/v1/20-developers.mdx"), "@site/v1/20-developers.mdx", require.resolveWeak("@site/v1/20-developers.mdx")], + "content---izanami-v-1-eventsdfd-d43": [() => import(/* webpackChunkName: "content---izanami-v-1-eventsdfd-d43" */ "@site/v1/14-events.mdx"), "@site/v1/14-events.mdx", require.resolveWeak("@site/v1/14-events.mdx")], + "content---izanami-v-1-experiments-apie-15-10a": [() => import(/* webpackChunkName: "content---izanami-v-1-experiments-apie-15-10a" */ "@site/v1/12-experiments/02-api.mdx"), "@site/v1/12-experiments/02-api.mdx", require.resolveWeak("@site/v1/12-experiments/02-api.mdx")], + "content---izanami-v-1-experiments-e-90-974": [() => import(/* webpackChunkName: "content---izanami-v-1-experiments-e-90-974" */ "@site/v1/12-experiments/index.mdx"), "@site/v1/12-experiments/index.mdx", require.resolveWeak("@site/v1/12-experiments/index.mdx")], + "content---izanami-v-1-experiments-ui-309-5ca": [() => import(/* webpackChunkName: "content---izanami-v-1-experiments-ui-309-5ca" */ "@site/v1/12-experiments/01-ui.mdx"), "@site/v1/12-experiments/01-ui.mdx", require.resolveWeak("@site/v1/12-experiments/01-ui.mdx")], + "content---izanami-v-1-features-868-d79": [() => import(/* webpackChunkName: "content---izanami-v-1-features-868-d79" */ "@site/v1/04-features.mdx"), "@site/v1/04-features.mdx", require.resolveWeak("@site/v1/04-features.mdx")], + "content---izanami-v-1-features-flipping-365-731": [() => import(/* webpackChunkName: "content---izanami-v-1-features-flipping-365-731" */ "@site/v1/11-features-flipping/index.mdx"), "@site/v1/11-features-flipping/index.mdx", require.resolveWeak("@site/v1/11-features-flipping/index.mdx")], + "content---izanami-v-1-features-flipping-api-2-c-5-4c6": [() => import(/* webpackChunkName: "content---izanami-v-1-features-flipping-api-2-c-5-4c6" */ "@site/v1/11-features-flipping/03-api.mdx"), "@site/v1/11-features-flipping/03-api.mdx", require.resolveWeak("@site/v1/11-features-flipping/03-api.mdx")], + "content---izanami-v-1-features-flipping-lock-37-d-be6": [() => import(/* webpackChunkName: "content---izanami-v-1-features-flipping-lock-37-d-be6" */ "@site/v1/11-features-flipping/04-lock.mdx"), "@site/v1/11-features-flipping/04-lock.mdx", require.resolveWeak("@site/v1/11-features-flipping/04-lock.mdx")], + "content---izanami-v-1-features-flipping-scripts-6-b-5-325": [() => import(/* webpackChunkName: "content---izanami-v-1-features-flipping-scripts-6-b-5-325" */ "@site/v1/11-features-flipping/02-scripts.mdx"), "@site/v1/11-features-flipping/02-scripts.mdx", require.resolveWeak("@site/v1/11-features-flipping/02-scripts.mdx")], + "content---izanami-v-1-features-flipping-uiefe-4c7": [() => import(/* webpackChunkName: "content---izanami-v-1-features-flipping-uiefe-4c7" */ "@site/v1/11-features-flipping/01-ui.mdx"), "@site/v1/11-features-flipping/01-ui.mdx", require.resolveWeak("@site/v1/11-features-flipping/01-ui.mdx")], + "content---izanami-v-1-getizanami-binaries-83-c-595": [() => import(/* webpackChunkName: "content---izanami-v-1-getizanami-binaries-83-c-595" */ "@site/v1/06-getizanami/01-binaries.mdx"), "@site/v1/06-getizanami/01-binaries.mdx", require.resolveWeak("@site/v1/06-getizanami/01-binaries.mdx")], + "content---izanami-v-1-getizanami-d-9-a-7e0": [() => import(/* webpackChunkName: "content---izanami-v-1-getizanami-d-9-a-7e0" */ "@site/v1/06-getizanami/index.mdx"), "@site/v1/06-getizanami/index.mdx", require.resolveWeak("@site/v1/06-getizanami/index.mdx")], + "content---izanami-v-1-getizanami-dockerdc-8-cc8": [() => import(/* webpackChunkName: "content---izanami-v-1-getizanami-dockerdc-8-cc8" */ "@site/v1/06-getizanami/02-docker.mdx"), "@site/v1/06-getizanami/02-docker.mdx", require.resolveWeak("@site/v1/06-getizanami/02-docker.mdx")], + "content---izanami-v-1-getizanami-fromsourcesf-5-a-707": [() => import(/* webpackChunkName: "content---izanami-v-1-getizanami-fromsourcesf-5-a-707" */ "@site/v1/06-getizanami/03-fromsources.mdx"), "@site/v1/06-getizanami/03-fromsources.mdx", require.resolveWeak("@site/v1/06-getizanami/03-fromsources.mdx")], + "content---izanami-v-1-keys-126-146": [() => import(/* webpackChunkName: "content---izanami-v-1-keys-126-146" */ "@site/v1/13-keys.mdx"), "@site/v1/13-keys.mdx", require.resolveWeak("@site/v1/13-keys.mdx")], + "content---izanami-v-1-metricsf-32-a4e": [() => import(/* webpackChunkName: "content---izanami-v-1-metricsf-32-a4e" */ "@site/v1/15-metrics.mdx"), "@site/v1/15-metrics.mdx", require.resolveWeak("@site/v1/15-metrics.mdx")], + "content---izanami-v-1-performancesd-59-76a": [() => import(/* webpackChunkName: "content---izanami-v-1-performancesd-59-76a" */ "@site/v1/19-performances.mdx"), "@site/v1/19-performances.mdx", require.resolveWeak("@site/v1/19-performances.mdx")], + "content---izanami-v-1-philosophy-62-e-298": [() => import(/* webpackChunkName: "content---izanami-v-1-philosophy-62-e-298" */ "@site/v1/03-philosophy.mdx"), "@site/v1/03-philosophy.mdx", require.resolveWeak("@site/v1/03-philosophy.mdx")], + "content---izanami-v-1-settings-8-a-1-b9e": [() => import(/* webpackChunkName: "content---izanami-v-1-settings-8-a-1-b9e" */ "@site/v1/07-settings/index.mdx"), "@site/v1/07-settings/index.mdx", require.resolveWeak("@site/v1/07-settings/index.mdx")], + "content---izanami-v-1-settings-database-540-759": [() => import(/* webpackChunkName: "content---izanami-v-1-settings-database-540-759" */ "@site/v1/07-settings/database.mdx"), "@site/v1/07-settings/database.mdx", require.resolveWeak("@site/v1/07-settings/database.mdx")], + "content---izanami-v-1-settings-settings-604-766": [() => import(/* webpackChunkName: "content---izanami-v-1-settings-settings-604-766" */ "@site/v1/07-settings/settings.mdx"), "@site/v1/07-settings/settings.mdx", require.resolveWeak("@site/v1/07-settings/settings.mdx")], + "content---izanami-v-1-tutorials-0-f-9-bed": [() => import(/* webpackChunkName: "content---izanami-v-1-tutorials-0-f-9-bed" */ "@site/v1/18-tutorials/index.mdx"), "@site/v1/18-tutorials/index.mdx", require.resolveWeak("@site/v1/18-tutorials/index.mdx")], + "content---izanami-v-1-tutorials-oauth-2404-9d8": [() => import(/* webpackChunkName: "content---izanami-v-1-tutorials-oauth-2404-9d8" */ "@site/v1/18-tutorials/02-oauth2.mdx"), "@site/v1/18-tutorials/02-oauth2.mdx", require.resolveWeak("@site/v1/18-tutorials/02-oauth2.mdx")], + "content---izanami-v-1-tutorials-springcf-9-f2f": [() => import(/* webpackChunkName: "content---izanami-v-1-tutorials-springcf-9-f2f" */ "@site/v1/18-tutorials/01-spring.mdx"), "@site/v1/18-tutorials/01-spring.mdx", require.resolveWeak("@site/v1/18-tutorials/01-spring.mdx")], + "content---izanami-v-1-ui-22-a-7e8": [() => import(/* webpackChunkName: "content---izanami-v-1-ui-22-a-7e8" */ "@site/v1/08-ui.mdx"), "@site/v1/08-ui.mdx", require.resolveWeak("@site/v1/08-ui.mdx")], + "plugin---izanami-49-c-56d": [() => import(/* webpackChunkName: "plugin---izanami-49-c-56d" */ "/Users/77199M/workspace/oss/izanami-v2/manual/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json"), "/Users/77199M/workspace/oss/izanami-v2/manual/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json", require.resolveWeak("/Users/77199M/workspace/oss/izanami-v2/manual/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json")], + "plugin---izanami-docs-18-d-414": [() => import(/* webpackChunkName: "plugin---izanami-docs-18-d-414" */ "/Users/77199M/workspace/oss/izanami-v2/manual/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json"), "/Users/77199M/workspace/oss/izanami-v2/manual/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json", require.resolveWeak("/Users/77199M/workspace/oss/izanami-v2/manual/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json")], + "plugin---izanami-docusaurus-debugf-75-018": [() => import(/* webpackChunkName: "plugin---izanami-docusaurus-debugf-75-018" */ "/Users/77199M/workspace/oss/izanami-v2/manual/.docusaurus/docusaurus-plugin-debug/default/plugin-route-context-module-100.json"), "/Users/77199M/workspace/oss/izanami-v2/manual/.docusaurus/docusaurus-plugin-debug/default/plugin-route-context-module-100.json", require.resolveWeak("/Users/77199M/workspace/oss/izanami-v2/manual/.docusaurus/docusaurus-plugin-debug/default/plugin-route-context-module-100.json")], + "plugin---izanami-searchaaf-832": [() => import(/* webpackChunkName: "plugin---izanami-searchaaf-832" */ "/Users/77199M/workspace/oss/izanami-v2/manual/.docusaurus/@easyops-cn/docusaurus-search-local/default/plugin-route-context-module-100.json"), "/Users/77199M/workspace/oss/izanami-v2/manual/.docusaurus/@easyops-cn/docusaurus-search-local/default/plugin-route-context-module-100.json", require.resolveWeak("/Users/77199M/workspace/oss/izanami-v2/manual/.docusaurus/@easyops-cn/docusaurus-search-local/default/plugin-route-context-module-100.json")], + "plugin---izanami-v-19-ad-71a": [() => import(/* webpackChunkName: "plugin---izanami-v-19-ad-71a" */ "/Users/77199M/workspace/oss/izanami-v2/manual/.docusaurus/docusaurus-plugin-content-docs/v1/plugin-route-context-module-100.json"), "/Users/77199M/workspace/oss/izanami-v2/manual/.docusaurus/docusaurus-plugin-content-docs/v1/plugin-route-context-module-100.json", require.resolveWeak("/Users/77199M/workspace/oss/izanami-v2/manual/.docusaurus/docusaurus-plugin-content-docs/v1/plugin-route-context-module-100.json")], + "version---izanami-docs-935-49b": [() => import(/* webpackChunkName: "version---izanami-docs-935-49b" */ "~docs/default/version-current-metadata-prop-751.json"), "~docs/default/version-current-metadata-prop-751.json", require.resolveWeak("~docs/default/version-current-metadata-prop-751.json")], + "version---izanami-v-1732-153": [() => import(/* webpackChunkName: "version---izanami-v-1732-153" */ "~docs/v1/version-current-metadata-prop-751.json"), "~docs/v1/version-current-metadata-prop-751.json", require.resolveWeak("~docs/v1/version-current-metadata-prop-751.json")],}; diff --git a/manual/.docusaurus/routes.js b/manual/.docusaurus/routes.js index e2b72cc96..7175bf715 100644 --- a/manual/.docusaurus/routes.js +++ b/manual/.docusaurus/routes.js @@ -2,14 +2,49 @@ import React from 'react'; import ComponentCreator from '@docusaurus/ComponentCreator'; export default [ + { + path: '/izanami/__docusaurus/debug', + component: ComponentCreator('/izanami/__docusaurus/debug', 'ab4'), + exact: true + }, + { + path: '/izanami/__docusaurus/debug/config', + component: ComponentCreator('/izanami/__docusaurus/debug/config', '71e'), + exact: true + }, + { + path: '/izanami/__docusaurus/debug/content', + component: ComponentCreator('/izanami/__docusaurus/debug/content', '7bd'), + exact: true + }, + { + path: '/izanami/__docusaurus/debug/globalData', + component: ComponentCreator('/izanami/__docusaurus/debug/globalData', '1a4'), + exact: true + }, + { + path: '/izanami/__docusaurus/debug/metadata', + component: ComponentCreator('/izanami/__docusaurus/debug/metadata', 'd94'), + exact: true + }, + { + path: '/izanami/__docusaurus/debug/registry', + component: ComponentCreator('/izanami/__docusaurus/debug/registry', '49c'), + exact: true + }, + { + path: '/izanami/__docusaurus/debug/routes', + component: ComponentCreator('/izanami/__docusaurus/debug/routes', '108'), + exact: true + }, { path: '/izanami/search', - component: ComponentCreator('/izanami/search', '67a'), + component: ComponentCreator('/izanami/search', 'b82'), exact: true }, { path: '/izanami/docs', - component: ComponentCreator('/izanami/docs', '77d'), + component: ComponentCreator('/izanami/docs', '005'), routes: [ { path: '/izanami/docs', @@ -177,7 +212,7 @@ export default [ }, { path: '/izanami/v1', - component: ComponentCreator('/izanami/v1', '433'), + component: ComponentCreator('/izanami/v1', 'b1a'), routes: [ { path: '/izanami/v1', @@ -441,7 +476,7 @@ export default [ }, { path: '/izanami/', - component: ComponentCreator('/izanami/', 'a38'), + component: ComponentCreator('/izanami/', '89a'), exact: true }, { diff --git a/manual/.docusaurus/routesChunkNames.json b/manual/.docusaurus/routesChunkNames.json index daf52d93c..2683da0e1 100644 --- a/manual/.docusaurus/routesChunkNames.json +++ b/manual/.docusaurus/routesChunkNames.json @@ -1,305 +1,348 @@ { - "/izanami/search-67a": { - "__comp": "1a4e3797", + "/izanami/__docusaurus/debug-ab4": { + "__comp": "__comp---theme-debug-config-23-a-2ff", "__context": { - "plugin": "1457b77c" + "plugin": "plugin---izanami-docusaurus-debugf-75-018" } }, - "/izanami/docs-77d": { - "__comp": "5e95c892", + "/izanami/__docusaurus/debug/config-71e": { + "__comp": "__comp---theme-debug-config-23-a-2ff", "__context": { - "plugin": "1ad66b9e" + "plugin": "plugin---izanami-docusaurus-debugf-75-018" + } + }, + "/izanami/__docusaurus/debug/content-7bd": { + "__comp": "__comp---theme-debug-contentba-8-ce7", + "__context": { + "plugin": "plugin---izanami-docusaurus-debugf-75-018" + }, + "allContent": "allContent---izanami-docusaurus-debug-content-246-c61" + }, + "/izanami/__docusaurus/debug/globalData-1a4": { + "__comp": "__comp---theme-debug-global-dataede-0fa", + "__context": { + "plugin": "plugin---izanami-docusaurus-debugf-75-018" + } + }, + "/izanami/__docusaurus/debug/metadata-d94": { + "__comp": "__comp---theme-debug-site-metadata-68-e-3d4", + "__context": { + "plugin": "plugin---izanami-docusaurus-debugf-75-018" + } + }, + "/izanami/__docusaurus/debug/registry-49c": { + "__comp": "__comp---theme-debug-registry-679-501", + "__context": { + "plugin": "plugin---izanami-docusaurus-debugf-75-018" + } + }, + "/izanami/__docusaurus/debug/routes-108": { + "__comp": "__comp---theme-debug-routes-946-699", + "__context": { + "plugin": "plugin---izanami-docusaurus-debugf-75-018" + } + }, + "/izanami/search-b82": { + "__comp": "__comp---theme-search-page-1-a-4-d6f", + "__context": { + "plugin": "plugin---izanami-searchaaf-832" + } + }, + "/izanami/docs-005": { + "__comp": "__comp---theme-docs-root-5-e-9-0b6", + "__context": { + "plugin": "plugin---izanami-docs-18-d-414" } }, "/izanami/docs-53e": { - "__comp": "a7bd4aaa", - "version": "935f2afb" + "__comp": "__comp---theme-doc-version-roota-7-b-5de", + "version": "version---izanami-docs-935-49b" }, "/izanami/docs-ec2": { - "__comp": "a94703ab" + "__comp": "__comp---theme-doc-roota-94-67a" }, "/izanami/docs/clients/-7b7": { - "__comp": "17896441", - "content": "f53bace1" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-docs-clients-f-53-ddb" }, "/izanami/docs/clients/java/-37a": { - "__comp": "17896441", - "content": "858bfcaf" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-docs-clients-java-858-68f" }, "/izanami/docs/clients/java/cache-625": { - "__comp": "17896441", - "content": "d98f6b02" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-docs-clients-java-cached-98-38e" }, "/izanami/docs/clients/java/error-handling-d1a": { - "__comp": "17896441", - "content": "95f95e10" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-docs-clients-java-error-handling-95-f-d67" }, "/izanami/docs/clients/java/sse-4df": { - "__comp": "17896441", - "content": "aa63221d" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-docs-clients-java-sseaa-6-ecb" }, "/izanami/docs/concepts/-580": { - "__comp": "17896441", - "content": "39cf9c2b" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-docs-concepts-39-c-d27" }, "/izanami/docs/getstarted/-9f8": { - "__comp": "17896441", - "content": "55940994" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-docs-getstarted-559-e25" }, "/izanami/docs/guides/-7c0": { - "__comp": "17896441", - "content": "2e7f27e2" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-docs-guides-2-e-7-90c" }, "/izanami/docs/guides/bulk-feature-modification-f37": { - "__comp": "17896441", - "content": "9af8677d" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-docs-guides-bulk-feature-modification-9-af-8db" }, "/izanami/docs/guides/configuration-91e": { - "__comp": "17896441", - "content": "1ee94ba8" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-docs-guides-configuration-1-ee-ee3" }, "/izanami/docs/guides/env-contexts-3a6": { - "__comp": "17896441", - "content": "28294f75" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-docs-guides-env-contexts-282-25d" }, "/izanami/docs/guides/import-from-v1-b45": { - "__comp": "17896441", - "content": "52d2f9c5" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-docs-guides-import-from-v-152-d-389" }, "/izanami/docs/guides/key-configuration-e58": { - "__comp": "17896441", - "content": "692c4667" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-docs-guides-key-configuration-692-f34" }, "/izanami/docs/guides/local-scripts-122": { - "__comp": "17896441", - "content": "45bf6ac8" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-docs-guides-local-scripts-45-b-d3d" }, "/izanami/docs/guides/mailer-configuration-ae4": { - "__comp": "17896441", - "content": "5a1e6866" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-docs-guides-mailer-configuration-5-a-1-826" }, "/izanami/docs/guides/multi-conditions-feature-39f": { - "__comp": "17896441", - "content": "cbc90340" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-docs-guides-multi-conditions-featurecbc-67a" }, "/izanami/docs/guides/query-builder-b4b": { - "__comp": "17896441", - "content": "f7b0431a" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-docs-guides-query-builderf-7-b-4f8" }, "/izanami/docs/guides/remote-script-e46": { - "__comp": "17896441", - "content": "5ec15e41" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-docs-guides-remote-script-5-ec-5c2" }, "/izanami/docs/guides/user-invitation-eba": { - "__comp": "17896441", - "content": "382abdc7" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-docs-guides-user-invitation-382-89d" }, "/izanami/docs/guides/webhooks-724": { - "__comp": "17896441", - "content": "88f2e2fd" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-docs-guides-webhooks-88-f-a97" }, "/izanami/docs/usages/-f2d": { - "__comp": "17896441", - "content": "f09d0f18" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-docs-usages-f-09-ee0" }, "/izanami/docs/usages/contexts-7d8": { - "__comp": "17896441", - "content": "b35c709e" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-docs-usages-contextsb-35-a79" }, "/izanami/docs/usages/features-06a": { - "__comp": "17896441", - "content": "1756af0d" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-docs-usages-features-175-9e5" }, "/izanami/docs/usages/organisation-d57": { - "__comp": "17896441", - "content": "2524d653" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-docs-usages-organisation-252-2d5" }, "/izanami/docs/usages/request-944": { - "__comp": "17896441", - "content": "d86837dc" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-docs-usages-requestd-86-68b" }, - "/izanami/v1-433": { - "__comp": "5e95c892", + "/izanami/v1-b1a": { + "__comp": "__comp---theme-docs-root-5-e-9-0b6", "__context": { - "plugin": "4cb46bbe" + "plugin": "plugin---izanami-v-19-ad-71a" } }, "/izanami/v1-0b2": { - "__comp": "a7bd4aaa", - "version": "7329b9d1" + "__comp": "__comp---theme-doc-version-roota-7-b-5de", + "version": "version---izanami-v-1732-153" }, "/izanami/v1-995": { - "__comp": "a94703ab" + "__comp": "__comp---theme-doc-roota-94-67a" }, "/izanami/v1/-4b6": { - "__comp": "17896441", - "content": "38c1ccfe" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-38-c-105" }, "/izanami/v1/about-92c": { - "__comp": "17896441", - "content": "404820e5" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-about-404-3f5" }, "/izanami/v1/api-4d6": { - "__comp": "17896441", - "content": "8c817def" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-api-8-c-8-676" }, "/izanami/v1/architecture-13a": { - "__comp": "17896441", - "content": "cced1e3d" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-architecturecce-931" }, "/izanami/v1/authprovider-05e": { - "__comp": "17896441", - "content": "ea391ed7" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-authproviderea-3-644" }, "/izanami/v1/clients/-b28": { - "__comp": "17896441", - "content": "915e538f" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-clients-915-d28" }, "/izanami/v1/clients/cli-f96": { - "__comp": "17896441", - "content": "3cfbbc0f" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-clients-cli-3-cf-9a1" }, "/izanami/v1/clients/jvm-4da": { - "__comp": "17896441", - "content": "44ca1fc6" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-clients-jvm-44-c-096" }, "/izanami/v1/clients/node-afe": { - "__comp": "17896441", - "content": "28ea13a0" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-clients-node-28-e-d45" }, "/izanami/v1/clients/react-58a": { - "__comp": "17896441", - "content": "cdfb9db4" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-clients-reactcdf-b19" }, "/izanami/v1/clients/spring-starter-dfe": { - "__comp": "17896441", - "content": "7a3092a3" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-clients-spring-starter-7-a-3-7a6" }, "/izanami/v1/configs/-bf8": { - "__comp": "17896441", - "content": "3e4b204b" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-configs-3-e-4-2ff" }, "/izanami/v1/configs/api-a47": { - "__comp": "17896441", - "content": "6a24d81d" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-configs-api-6-a-2-69d" }, "/izanami/v1/configs/springconfig-1f0": { - "__comp": "17896441", - "content": "61d10066" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-configs-springconfig-61-d-f30" }, "/izanami/v1/configs/ui-18c": { - "__comp": "17896441", - "content": "144ae2b5" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-configs-ui-144-a34" }, "/izanami/v1/developers-811": { - "__comp": "17896441", - "content": "7a055ef3" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-developers-7-a-0-9c7" }, "/izanami/v1/events-f8b": { - "__comp": "17896441", - "content": "dfda2e39" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-eventsdfd-d43" }, "/izanami/v1/experiments/-0cf": { - "__comp": "17896441", - "content": "e90300dd" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-experiments-e-90-974" }, "/izanami/v1/experiments/api-5e6": { - "__comp": "17896441", - "content": "e157316e" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-experiments-apie-15-10a" }, "/izanami/v1/experiments/ui-22b": { - "__comp": "17896441", - "content": "309e43de" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-experiments-ui-309-5ca" }, "/izanami/v1/features-c6a": { - "__comp": "17896441", - "content": "868bc92e" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-features-868-d79" }, "/izanami/v1/features-flipping/-ab5": { - "__comp": "17896441", - "content": "3651c730" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-features-flipping-365-731" }, "/izanami/v1/features-flipping/api-e84": { - "__comp": "17896441", - "content": "2c55d6de" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-features-flipping-api-2-c-5-4c6" }, "/izanami/v1/features-flipping/lock-4e5": { - "__comp": "17896441", - "content": "37d37b99" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-features-flipping-lock-37-d-be6" }, "/izanami/v1/features-flipping/scripts-494": { - "__comp": "17896441", - "content": "6b55a23b" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-features-flipping-scripts-6-b-5-325" }, "/izanami/v1/features-flipping/ui-401": { - "__comp": "17896441", - "content": "efe36f9c" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-features-flipping-uiefe-4c7" }, "/izanami/v1/getizanami/-68e": { - "__comp": "17896441", - "content": "d9a19508" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-getizanami-d-9-a-7e0" }, "/izanami/v1/getizanami/binaries-206": { - "__comp": "17896441", - "content": "83cf5a0e" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-getizanami-binaries-83-c-595" }, "/izanami/v1/getizanami/docker-775": { - "__comp": "17896441", - "content": "dc8f53ac" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-getizanami-dockerdc-8-cc8" }, "/izanami/v1/getizanami/fromsources-1f1": { - "__comp": "17896441", - "content": "f5ac983d" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-getizanami-fromsourcesf-5-a-707" }, "/izanami/v1/keys-eb4": { - "__comp": "17896441", - "content": "12625af8" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-keys-126-146" }, "/izanami/v1/metrics-415": { - "__comp": "17896441", - "content": "f3281aa5" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-metricsf-32-a4e" }, "/izanami/v1/performances-22b": { - "__comp": "17896441", - "content": "d5980866" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-performancesd-59-76a" }, "/izanami/v1/philosophy-e21": { - "__comp": "17896441", - "content": "62eca57d" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-philosophy-62-e-298" }, "/izanami/v1/settings/-3c2": { - "__comp": "17896441", - "content": "8a163022" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-settings-8-a-1-b9e" }, "/izanami/v1/settings/database-f13": { - "__comp": "17896441", - "content": "54014a70" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-settings-database-540-759" }, "/izanami/v1/settings/settings-0b0": { - "__comp": "17896441", - "content": "604919e7" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-settings-settings-604-766" }, "/izanami/v1/tutorials/-d91": { - "__comp": "17896441", - "content": "0f98d465" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-tutorials-0-f-9-bed" }, "/izanami/v1/tutorials/oauth2-4ba": { - "__comp": "17896441", - "content": "404d2a01" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-tutorials-oauth-2404-9d8" }, "/izanami/v1/tutorials/spring-94e": { - "__comp": "17896441", - "content": "cf997756" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-tutorials-springcf-9-f2f" }, "/izanami/v1/ui-95e": { - "__comp": "17896441", - "content": "22a808b3" + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---izanami-v-1-ui-22-a-7e8" }, - "/izanami/-a38": { - "__comp": "c4f5d8e4", + "/izanami/-89a": { + "__comp": "__comp---site-src-pages-index-jsc-4-f-f99", "__context": { - "plugin": "a5a0f36f" + "plugin": "plugin---izanami-49-c-56d" }, - "config": "5e9f5e1a" + "config": "config---izanami-5-e-9-485" } } \ No newline at end of file diff --git a/manual/.docusaurus/site-metadata.json b/manual/.docusaurus/site-metadata.json index 932b97e7e..7a59194f7 100644 --- a/manual/.docusaurus/site-metadata.json +++ b/manual/.docusaurus/site-metadata.json @@ -17,9 +17,9 @@ "name": "@docusaurus/plugin-content-pages", "version": "3.1.1" }, - "docusaurus-plugin-sitemap": { + "docusaurus-plugin-debug": { "type": "package", - "name": "@docusaurus/plugin-sitemap", + "name": "@docusaurus/plugin-debug", "version": "3.1.1" }, "docusaurus-theme-classic": { diff --git a/manual/docs/04-guides/11-configuration.mdx b/manual/docs/04-guides/11-configuration.mdx index 4c101eb09..806783307 100644 --- a/manual/docs/04-guides/11-configuration.mdx +++ b/manual/docs/04-guides/11-configuration.mdx @@ -111,3 +111,21 @@ Alternatively, Izanami re-exposes these configuration keys with below env variab | play.filters.cors.supportsCredentials | IZANAMI_CORS_SUPPORTS_CREDENTIALS | | play.filters.cors.preflightMaxAge | IZANAMI_CORS_PREFLIGHT_MAX_AGE | | play.filters.cors.serveForbiddenOrigins | IZANAMI_CORS_SERVE_FORBIDDEN_ORIGINS | + +### Webhooks + +Webhooks use exponential backoff algorithm to space out retries in case of failures. +If retry exceed max allowed retry count, it stops trying and webhook won't be called. + +Duration is computed as : + +`retryDelay = Math.min(initialDelay * Math.pow(multiplier, currentCount), maxDelay)` + +With configurable values + +| | Play configuration key | Environnement variable | +| -------------------------- | ------------------------------- | ----------------------------------- | +| max retry count | app.webhooks.retry.count | IZANAMI_WEBHOOK_RETRY_COUNT | +| initial delay (in seconds) | app.webhooks.retry.intial-delay | IZANAMI_WEBHOOK_RETRY_INITIAL_DELAY | +| max delay (in seconds) | app.webhooks.retry.max-delay | IZANAMI_WEBHOOK_RETRY_MAX_DELAY | +| multiplier | app.webhooks.retry.multiplier | IZANAMI_WEBHOOK_RETRY_MULTIPLIER | diff --git a/manual/docs/04-guides/12-webhooks.mdx b/manual/docs/04-guides/12-webhooks.mdx index dcee1f79e..a96f2b671 100644 --- a/manual/docs/04-guides/12-webhooks.mdx +++ b/manual/docs/04-guides/12-webhooks.mdx @@ -28,12 +28,19 @@ This form allows to configure your webhook : Izanami offers some guaranties for webhook resilience. -If webhook call timeout or if remote server respond with an error code, Izanami will retry the call several times (TODO) with an increased interval between calls (TODO). +If webhook call timeout or if remote server respond with an error code, +Izanami will retry the call several times with an increased interval between calls. +To do so, Izanami will use [exponential backoff algorithm](https://en.wikipedia.org/wiki/Exponential_backoff) +elements of this algorithm can be configured, see [dedicated configuration section](./configuration#webhooks) for details. If Izanami instance is shut down (or crashes) while making initial or retry call, webhook call will be retried after some times either when Izanami instances restart or by another instance if Izanami has multiple instances. ## Rights -Izanami has a fine grain right management on hooks. +Each hook has a dedicated right section, as for keys, tenants or projects, users can have 3 right levels on hooks : -User can either read +| Read hook information | Read hook information | Create/update webhook | Delete webhook | +| ------------------------------ | --------------------- | --------------------- | -------------- | +| Read | ✅ | ❌ | ❌ | +| Write | ✅ | ✅ | ❌ | +| Admin (or tenant/global admin) | ✅ | ✅ | ✅ |