From f9328e0298428666790e65755132563ca4b1dc0c Mon Sep 17 00:00:00 2001 From: serverpod_docs Date: Thu, 26 Sep 2024 09:21:21 +0000 Subject: [PATCH] Deployed by Serverpod docs deploy action --- docs/0.9.10.html | 2 +- docs/0.9.10/capabilities.html | 2 +- docs/0.9.10/concepts/authentication.html | 2 +- docs/0.9.10/concepts/caching.html | 2 +- docs/0.9.10/concepts/database-communication.html | 2 +- docs/0.9.10/concepts/file-uploads.html | 2 +- docs/0.9.10/concepts/logging.html | 2 +- docs/0.9.10/concepts/modules.html | 2 +- docs/0.9.10/concepts/serialization.html | 2 +- docs/0.9.10/concepts/streams.html | 2 +- docs/0.9.10/concepts/webserver.html | 2 +- docs/0.9.10/concepts/working-with-endpoints.html | 2 +- docs/0.9.10/contribute.html | 2 +- docs/0.9.10/deployments/deploying-to-aws.html | 2 +- docs/0.9.10/deployments/general.html | 2 +- docs/0.9.10/roadmap.html | 2 +- docs/0.9.10/support.html | 2 +- docs/0.9.11.html | 2 +- docs/0.9.11/capabilities.html | 2 +- docs/0.9.11/concepts/authentication.html | 2 +- docs/0.9.11/concepts/caching.html | 2 +- docs/0.9.11/concepts/database-communication.html | 2 +- docs/0.9.11/concepts/file-uploads.html | 2 +- docs/0.9.11/concepts/logging.html | 2 +- docs/0.9.11/concepts/modules.html | 2 +- docs/0.9.11/concepts/serialization.html | 2 +- docs/0.9.11/concepts/streams.html | 2 +- docs/0.9.11/concepts/webserver.html | 2 +- docs/0.9.11/concepts/working-with-endpoints.html | 2 +- docs/0.9.11/contribute.html | 2 +- docs/0.9.11/deployments/deploying-to-aws.html | 2 +- docs/0.9.11/deployments/general.html | 2 +- docs/0.9.11/roadmap.html | 2 +- docs/0.9.11/support.html | 2 +- docs/0.9.20.html | 2 +- docs/0.9.20/capabilities.html | 2 +- docs/0.9.20/concepts/authentication.html | 2 +- docs/0.9.20/concepts/backward-compatibility.html | 2 +- docs/0.9.20/concepts/caching.html | 2 +- docs/0.9.20/concepts/database-communication.html | 2 +- docs/0.9.20/concepts/file-uploads.html | 2 +- docs/0.9.20/concepts/health-checks.html | 2 +- docs/0.9.20/concepts/logging.html | 2 +- docs/0.9.20/concepts/modules.html | 2 +- docs/0.9.20/concepts/serialization.html | 2 +- docs/0.9.20/concepts/streams.html | 2 +- docs/0.9.20/concepts/webserver.html | 2 +- docs/0.9.20/concepts/working-with-endpoints.html | 2 +- docs/0.9.20/contribute.html | 2 +- docs/0.9.20/deployments/deploying-to-aws.html | 2 +- docs/0.9.20/deployments/general.html | 2 +- docs/0.9.20/roadmap.html | 2 +- docs/0.9.20/support.html | 2 +- docs/0.9.20/tutorials.html | 2 +- docs/0.9.21.html | 2 +- docs/0.9.21/capabilities.html | 2 +- docs/0.9.21/concepts/authentication.html | 2 +- docs/0.9.21/concepts/backward-compatibility.html | 2 +- docs/0.9.21/concepts/caching.html | 2 +- docs/0.9.21/concepts/database-communication.html | 2 +- docs/0.9.21/concepts/file-uploads.html | 2 +- docs/0.9.21/concepts/health-checks.html | 2 +- docs/0.9.21/concepts/logging.html | 2 +- docs/0.9.21/concepts/modules.html | 2 +- docs/0.9.21/concepts/serialization.html | 2 +- docs/0.9.21/concepts/streams.html | 2 +- docs/0.9.21/concepts/webserver.html | 2 +- docs/0.9.21/concepts/working-with-endpoints.html | 2 +- docs/0.9.21/contribute.html | 2 +- docs/0.9.21/deployments/deploying-to-aws.html | 2 +- docs/0.9.21/deployments/general.html | 2 +- docs/0.9.21/roadmap.html | 2 +- docs/0.9.21/support.html | 2 +- docs/0.9.21/tutorials.html | 2 +- docs/0.9.22.html | 2 +- docs/0.9.22/capabilities.html | 2 +- docs/0.9.22/concepts/authentication.html | 2 +- docs/0.9.22/concepts/backward-compatibility.html | 2 +- docs/0.9.22/concepts/caching.html | 2 +- docs/0.9.22/concepts/database-communication.html | 2 +- docs/0.9.22/concepts/file-uploads.html | 2 +- docs/0.9.22/concepts/health-checks.html | 2 +- docs/0.9.22/concepts/logging.html | 2 +- docs/0.9.22/concepts/modules.html | 2 +- docs/0.9.22/concepts/serialization.html | 2 +- docs/0.9.22/concepts/streams.html | 2 +- docs/0.9.22/concepts/webserver.html | 2 +- docs/0.9.22/concepts/working-with-endpoints.html | 2 +- docs/0.9.22/contribute.html | 2 +- docs/0.9.22/deployments/deploying-to-aws.html | 2 +- docs/0.9.22/deployments/general.html | 2 +- docs/0.9.22/roadmap.html | 2 +- docs/0.9.22/support.html | 2 +- docs/0.9.22/tutorials.html | 2 +- docs/0.9.5.html | 2 +- docs/0.9.5/capabilities.html | 2 +- docs/0.9.5/concepts/authentication.html | 2 +- docs/0.9.5/concepts/caching.html | 2 +- docs/0.9.5/concepts/database-communication.html | 2 +- docs/0.9.5/concepts/file-uploads.html | 2 +- docs/0.9.5/concepts/logging.html | 2 +- docs/0.9.5/concepts/modules.html | 2 +- docs/0.9.5/concepts/serialization.html | 2 +- docs/0.9.5/concepts/streams.html | 2 +- docs/0.9.5/concepts/working-with-endpoints.html | 2 +- docs/0.9.5/contribute.html | 2 +- docs/0.9.5/deployments/general.html | 2 +- docs/0.9.5/roadmap.html | 2 +- docs/0.9.6.html | 2 +- docs/0.9.6/capabilities.html | 2 +- docs/0.9.6/concepts/authentication.html | 2 +- docs/0.9.6/concepts/caching.html | 2 +- docs/0.9.6/concepts/database-communication.html | 2 +- docs/0.9.6/concepts/file-uploads.html | 2 +- docs/0.9.6/concepts/logging.html | 2 +- docs/0.9.6/concepts/modules.html | 2 +- docs/0.9.6/concepts/serialization.html | 2 +- docs/0.9.6/concepts/streams.html | 2 +- docs/0.9.6/concepts/working-with-endpoints.html | 2 +- docs/0.9.6/contribute.html | 2 +- docs/0.9.6/deployments/general.html | 2 +- docs/0.9.6/roadmap.html | 2 +- docs/0.9.7.html | 2 +- docs/0.9.7/capabilities.html | 2 +- docs/0.9.7/concepts/authentication.html | 2 +- docs/0.9.7/concepts/caching.html | 2 +- docs/0.9.7/concepts/database-communication.html | 2 +- docs/0.9.7/concepts/file-uploads.html | 2 +- docs/0.9.7/concepts/logging.html | 2 +- docs/0.9.7/concepts/modules.html | 2 +- docs/0.9.7/concepts/serialization.html | 2 +- docs/0.9.7/concepts/streams.html | 2 +- docs/0.9.7/concepts/working-with-endpoints.html | 2 +- docs/0.9.7/contribute.html | 2 +- docs/0.9.7/deployments/general.html | 2 +- docs/0.9.7/roadmap.html | 2 +- docs/0.9.7/support.html | 2 +- docs/0.9.8.html | 2 +- docs/0.9.8/capabilities.html | 2 +- docs/0.9.8/concepts/authentication.html | 2 +- docs/0.9.8/concepts/caching.html | 2 +- docs/0.9.8/concepts/database-communication.html | 2 +- docs/0.9.8/concepts/file-uploads.html | 2 +- docs/0.9.8/concepts/logging.html | 2 +- docs/0.9.8/concepts/modules.html | 2 +- docs/0.9.8/concepts/serialization.html | 2 +- docs/0.9.8/concepts/streams.html | 2 +- docs/0.9.8/concepts/working-with-endpoints.html | 2 +- docs/0.9.8/contribute.html | 2 +- docs/0.9.8/deployments/deploying-to-aws.html | 2 +- docs/0.9.8/deployments/general.html | 2 +- docs/0.9.8/roadmap.html | 2 +- docs/0.9.8/support.html | 2 +- docs/0.9.9.html | 2 +- docs/0.9.9/capabilities.html | 2 +- docs/0.9.9/concepts/authentication.html | 2 +- docs/0.9.9/concepts/caching.html | 2 +- docs/0.9.9/concepts/database-communication.html | 2 +- docs/0.9.9/concepts/file-uploads.html | 2 +- docs/0.9.9/concepts/logging.html | 2 +- docs/0.9.9/concepts/modules.html | 2 +- docs/0.9.9/concepts/serialization.html | 2 +- docs/0.9.9/concepts/streams.html | 2 +- docs/0.9.9/concepts/webserver.html | 2 +- docs/0.9.9/concepts/working-with-endpoints.html | 2 +- docs/0.9.9/contribute.html | 2 +- docs/0.9.9/deployments/deploying-to-aws.html | 2 +- docs/0.9.9/deployments/general.html | 2 +- docs/0.9.9/roadmap.html | 2 +- docs/0.9.9/support.html | 2 +- docs/1.0.0.html | 2 +- docs/1.0.0/capabilities.html | 2 +- docs/1.0.0/concepts/authentication.html | 2 +- docs/1.0.0/concepts/backward-compatibility.html | 2 +- docs/1.0.0/concepts/caching.html | 2 +- docs/1.0.0/concepts/database-communication.html | 2 +- docs/1.0.0/concepts/file-uploads.html | 2 +- docs/1.0.0/concepts/health-checks.html | 2 +- docs/1.0.0/concepts/logging.html | 2 +- docs/1.0.0/concepts/modules.html | 2 +- docs/1.0.0/concepts/serialization.html | 2 +- docs/1.0.0/concepts/streams.html | 2 +- docs/1.0.0/concepts/webserver.html | 2 +- docs/1.0.0/concepts/working-with-endpoints.html | 2 +- docs/1.0.0/contribute.html | 2 +- docs/1.0.0/deployments/deploying-to-aws.html | 2 +- docs/1.0.0/deployments/general.html | 2 +- docs/1.0.0/roadmap.html | 2 +- docs/1.0.0/support.html | 2 +- docs/1.0.0/tutorials.html | 2 +- docs/1.1.0.html | 2 +- docs/1.1.0/capabilities.html | 2 +- docs/1.1.0/concepts/authentication.html | 2 +- docs/1.1.0/concepts/backward-compatibility.html | 2 +- docs/1.1.0/concepts/caching.html | 2 +- docs/1.1.0/concepts/database-communication.html | 2 +- docs/1.1.0/concepts/exceptions.html | 2 +- docs/1.1.0/concepts/file-uploads.html | 2 +- docs/1.1.0/concepts/health-checks.html | 2 +- docs/1.1.0/concepts/logging.html | 2 +- docs/1.1.0/concepts/modules.html | 2 +- docs/1.1.0/concepts/serialization.html | 2 +- docs/1.1.0/concepts/sessions.html | 2 +- docs/1.1.0/concepts/streams.html | 2 +- docs/1.1.0/concepts/webserver.html | 2 +- docs/1.1.0/concepts/working-with-endpoints.html | 2 +- docs/1.1.0/contribute.html | 2 +- docs/1.1.0/deployments/deploying-to-aws.html | 2 +- docs/1.1.0/deployments/deploying-to-gce-terraform.html | 2 +- docs/1.1.0/deployments/deploying-to-gcr-console.html | 2 +- docs/1.1.0/deployments/deployment-strategy.html | 2 +- docs/1.1.0/deployments/general.html | 2 +- docs/1.1.0/insights.html | 2 +- docs/1.1.0/roadmap.html | 2 +- docs/1.1.0/support.html | 2 +- docs/1.1.0/tutorials.html | 2 +- docs/1.1.1.html | 2 +- docs/1.1.1/capabilities.html | 2 +- docs/1.1.1/concepts/authentication/basics.html | 2 +- docs/1.1.1/concepts/authentication/providers/apple.html | 2 +- docs/1.1.1/concepts/authentication/providers/email.html | 2 +- docs/1.1.1/concepts/authentication/providers/firebase.html | 2 +- docs/1.1.1/concepts/authentication/providers/google.html | 2 +- docs/1.1.1/concepts/authentication/setup.html | 2 +- docs/1.1.1/concepts/authentication/working-with-users.html | 2 +- docs/1.1.1/concepts/backward-compatibility.html | 2 +- docs/1.1.1/concepts/caching.html | 2 +- docs/1.1.1/concepts/database-communication.html | 2 +- docs/1.1.1/concepts/exceptions.html | 2 +- docs/1.1.1/concepts/file-uploads.html | 2 +- docs/1.1.1/concepts/health-checks.html | 2 +- docs/1.1.1/concepts/logging.html | 2 +- docs/1.1.1/concepts/modules.html | 2 +- docs/1.1.1/concepts/serialization.html | 2 +- docs/1.1.1/concepts/sessions.html | 2 +- docs/1.1.1/concepts/streams.html | 2 +- docs/1.1.1/concepts/webserver.html | 2 +- docs/1.1.1/concepts/working-with-endpoints.html | 2 +- docs/1.1.1/contribute.html | 2 +- docs/1.1.1/deployments/deploying-to-aws.html | 2 +- docs/1.1.1/deployments/deploying-to-gce-terraform.html | 2 +- docs/1.1.1/deployments/deploying-to-gcr-console.html | 2 +- docs/1.1.1/deployments/deployment-strategy.html | 2 +- docs/1.1.1/deployments/general.html | 2 +- docs/1.1.1/get-started.html | 2 +- docs/1.1.1/insights.html | 2 +- docs/1.1.1/roadmap.html | 2 +- docs/1.1.1/support.html | 2 +- docs/1.1.1/tutorials/authentication.html | 2 +- docs/1.1.1/tutorials/code-example.html | 2 +- docs/1.1.1/tutorials/first-app.html | 2 +- docs/1.1.1/tutorials/videos.html | 2 +- docs/1.2.0.html | 2 +- docs/1.2.0/capabilities.html | 2 +- docs/1.2.0/cli.html | 2 +- docs/1.2.0/concepts/authentication/basics.html | 2 +- docs/1.2.0/concepts/authentication/custom-overrides.html | 2 +- docs/1.2.0/concepts/authentication/providers/apple.html | 2 +- .../concepts/authentication/providers/custom-providers.html | 2 +- docs/1.2.0/concepts/authentication/providers/email.html | 2 +- docs/1.2.0/concepts/authentication/providers/firebase.html | 2 +- docs/1.2.0/concepts/authentication/providers/google.html | 2 +- docs/1.2.0/concepts/authentication/setup.html | 2 +- docs/1.2.0/concepts/authentication/working-with-users.html | 2 +- docs/1.2.0/concepts/backward-compatibility.html | 2 +- docs/1.2.0/concepts/caching.html | 2 +- docs/1.2.0/concepts/database/connection.html | 2 +- docs/1.2.0/concepts/database/crud.html | 2 +- docs/1.2.0/concepts/database/filter.html | 2 +- docs/1.2.0/concepts/database/indexing.html | 2 +- docs/1.2.0/concepts/database/migrations.html | 2 +- docs/1.2.0/concepts/database/models.html | 2 +- docs/1.2.0/concepts/database/pagination.html | 2 +- docs/1.2.0/concepts/database/raw-access.html | 2 +- docs/1.2.0/concepts/database/relation-queries.html | 2 +- docs/1.2.0/concepts/database/relations/many-to-many.html | 2 +- docs/1.2.0/concepts/database/relations/modules.html | 2 +- docs/1.2.0/concepts/database/relations/one-to-many.html | 2 +- docs/1.2.0/concepts/database/relations/one-to-one.html | 2 +- .../concepts/database/relations/referential-actions.html | 2 +- docs/1.2.0/concepts/database/relations/self-relations.html | 2 +- docs/1.2.0/concepts/database/sort.html | 2 +- docs/1.2.0/concepts/database/transactions.html | 2 +- docs/1.2.0/concepts/exceptions.html | 2 +- docs/1.2.0/concepts/file-uploads.html | 2 +- docs/1.2.0/concepts/health-checks.html | 2 +- docs/1.2.0/concepts/logging.html | 2 +- docs/1.2.0/concepts/models.html | 2 +- docs/1.2.0/concepts/modules.html | 2 +- docs/1.2.0/concepts/scheduling.html | 2 +- docs/1.2.0/concepts/serialization.html | 2 +- docs/1.2.0/concepts/sessions.html | 2 +- docs/1.2.0/concepts/streams.html | 2 +- docs/1.2.0/concepts/webserver.html | 2 +- docs/1.2.0/concepts/working-with-endpoints.html | 2 +- docs/1.2.0/contribute.html | 2 +- docs/1.2.0/deployments/deploying-to-aws.html | 2 +- docs/1.2.0/deployments/deploying-to-gce-terraform.html | 2 +- docs/1.2.0/deployments/deploying-to-gcr-console.html | 2 +- docs/1.2.0/deployments/deployment-strategy.html | 2 +- docs/1.2.0/deployments/general.html | 2 +- docs/1.2.0/get-started.html | 2 +- docs/1.2.0/insights.html | 2 +- docs/1.2.0/lsp.html | 2 +- docs/1.2.0/roadmap.html | 2 +- docs/1.2.0/support.html | 2 +- docs/1.2.0/tutorials/authentication.html | 2 +- docs/1.2.0/tutorials/code-example.html | 2 +- docs/1.2.0/tutorials/first-app.html | 2 +- docs/1.2.0/tutorials/videos.html | 2 +- docs/1.2.0/upgrading/upgrade-to-one-point-two.html | 2 +- docs/2.0.0.html | 2 +- docs/2.0.0/capabilities.html | 2 +- docs/2.0.0/concepts/authentication/basics.html | 2 +- docs/2.0.0/concepts/authentication/custom-overrides.html | 2 +- docs/2.0.0/concepts/authentication/providers/apple.html | 2 +- .../concepts/authentication/providers/custom-providers.html | 2 +- docs/2.0.0/concepts/authentication/providers/email.html | 2 +- docs/2.0.0/concepts/authentication/providers/firebase.html | 2 +- docs/2.0.0/concepts/authentication/providers/google.html | 2 +- docs/2.0.0/concepts/authentication/setup.html | 2 +- docs/2.0.0/concepts/authentication/working-with-users.html | 2 +- docs/2.0.0/concepts/backward-compatibility.html | 2 +- docs/2.0.0/concepts/caching.html | 2 +- docs/2.0.0/concepts/database/connection.html | 2 +- docs/2.0.0/concepts/database/crud.html | 2 +- docs/2.0.0/concepts/database/filter.html | 2 +- docs/2.0.0/concepts/database/indexing.html | 2 +- docs/2.0.0/concepts/database/migrations.html | 2 +- docs/2.0.0/concepts/database/models.html | 2 +- docs/2.0.0/concepts/database/pagination.html | 2 +- docs/2.0.0/concepts/database/raw-access.html | 2 +- docs/2.0.0/concepts/database/relation-queries.html | 2 +- docs/2.0.0/concepts/database/relations/many-to-many.html | 2 +- docs/2.0.0/concepts/database/relations/modules.html | 2 +- docs/2.0.0/concepts/database/relations/one-to-many.html | 2 +- docs/2.0.0/concepts/database/relations/one-to-one.html | 2 +- .../concepts/database/relations/referential-actions.html | 2 +- docs/2.0.0/concepts/database/relations/self-relations.html | 2 +- docs/2.0.0/concepts/database/sort.html | 2 +- docs/2.0.0/concepts/database/transactions.html | 2 +- docs/2.0.0/concepts/exceptions.html | 2 +- docs/2.0.0/concepts/file-uploads.html | 2 +- docs/2.0.0/concepts/health-checks.html | 2 +- docs/2.0.0/concepts/logging.html | 2 +- docs/2.0.0/concepts/models.html | 2 +- docs/2.0.0/concepts/modules.html | 2 +- docs/2.0.0/concepts/scheduling.html | 2 +- docs/2.0.0/concepts/serialization.html | 2 +- docs/2.0.0/concepts/sessions.html | 2 +- docs/2.0.0/concepts/streams.html | 2 +- docs/2.0.0/concepts/webserver.html | 2 +- docs/2.0.0/concepts/working-with-endpoints.html | 2 +- docs/2.0.0/contribute.html | 2 +- docs/2.0.0/deployments/deploying-to-aws.html | 2 +- docs/2.0.0/deployments/deploying-to-gce-terraform.html | 2 +- docs/2.0.0/deployments/deploying-to-gcr-console.html | 2 +- docs/2.0.0/deployments/deployment-strategy.html | 2 +- docs/2.0.0/deployments/general.html | 2 +- docs/2.0.0/get-started.html | 2 +- docs/2.0.0/roadmap.html | 2 +- docs/2.0.0/support.html | 2 +- docs/2.0.0/tools/cli.html | 2 +- docs/2.0.0/tools/insights.html | 2 +- docs/2.0.0/tools/lsp.html | 2 +- docs/2.0.0/tutorials/authentication.html | 2 +- docs/2.0.0/tutorials/code-example.html | 2 +- docs/2.0.0/tutorials/first-app.html | 2 +- docs/2.0.0/tutorials/videos.html | 2 +- docs/2.0.0/upgrading/upgrade-to-one-point-two.html | 2 +- docs/2.0.0/upgrading/upgrade-to-two.html | 2 +- docs/404.html | 2 +- docs/assets/js/0c6fe626.3530bd34.js | 1 - docs/assets/js/0c6fe626.96dcbb61.js | 1 + docs/assets/js/5cde491b.adda50dd.js | 1 + docs/assets/js/5cde491b.cb7b6cda.js | 1 - docs/assets/js/78ae7ec8.5253f8ae.js | 1 + docs/assets/js/78ae7ec8.6ea9b967.js | 1 - docs/assets/js/df15bc7d.486261d6.js | 1 + docs/assets/js/df15bc7d.d24d19f0.js | 1 - .../{runtime~main.00b4f806.js => runtime~main.c0093c61.js} | 2 +- docs/capabilities.html | 2 +- docs/concepts/authentication/basics.html | 2 +- docs/concepts/authentication/custom-overrides.html | 2 +- docs/concepts/authentication/providers/apple.html | 2 +- .../concepts/authentication/providers/custom-providers.html | 2 +- docs/concepts/authentication/providers/email.html | 2 +- docs/concepts/authentication/providers/firebase.html | 2 +- docs/concepts/authentication/providers/google.html | 2 +- docs/concepts/authentication/setup.html | 2 +- docs/concepts/authentication/working-with-users.html | 2 +- docs/concepts/backward-compatibility.html | 2 +- docs/concepts/caching.html | 2 +- docs/concepts/configuration.html | 2 +- docs/concepts/database/connection.html | 2 +- docs/concepts/database/crud.html | 2 +- docs/concepts/database/filter.html | 2 +- docs/concepts/database/indexing.html | 2 +- docs/concepts/database/migrations.html | 2 +- docs/concepts/database/models.html | 2 +- docs/concepts/database/pagination.html | 2 +- docs/concepts/database/raw-access.html | 2 +- docs/concepts/database/relation-queries.html | 2 +- docs/concepts/database/relations/many-to-many.html | 2 +- docs/concepts/database/relations/modules.html | 2 +- docs/concepts/database/relations/one-to-many.html | 2 +- docs/concepts/database/relations/one-to-one.html | 2 +- docs/concepts/database/relations/referential-actions.html | 2 +- docs/concepts/database/relations/self-relations.html | 2 +- docs/concepts/database/sort.html | 2 +- docs/concepts/database/transactions.html | 2 +- docs/concepts/exceptions.html | 2 +- docs/concepts/file-uploads.html | 2 +- docs/concepts/health-checks.html | 2 +- docs/concepts/logging.html | 2 +- docs/concepts/models.html | 2 +- docs/concepts/modules.html | 2 +- docs/concepts/scheduling.html | 2 +- docs/concepts/serialization.html | 2 +- docs/concepts/sessions.html | 2 +- docs/concepts/streams.html | 2 +- docs/concepts/webserver.html | 2 +- docs/concepts/working-with-endpoints.html | 2 +- docs/contribute.html | 2 +- docs/deployments/deploying-to-aws.html | 2 +- docs/deployments/deploying-to-gce-terraform.html | 2 +- docs/deployments/deploying-to-gcr-console.html | 2 +- docs/deployments/deployment-strategy.html | 2 +- docs/deployments/general.html | 2 +- docs/get-started-with-mini.html | 6 ++++-- docs/get-started.html | 2 +- docs/index.html | 2 +- docs/next.html | 2 +- docs/next/capabilities.html | 2 +- docs/next/concepts/authentication/basics.html | 2 +- docs/next/concepts/authentication/custom-overrides.html | 2 +- docs/next/concepts/authentication/providers/apple.html | 2 +- .../concepts/authentication/providers/custom-providers.html | 2 +- docs/next/concepts/authentication/providers/email.html | 2 +- docs/next/concepts/authentication/providers/firebase.html | 2 +- docs/next/concepts/authentication/providers/google.html | 2 +- docs/next/concepts/authentication/setup.html | 2 +- docs/next/concepts/authentication/working-with-users.html | 2 +- docs/next/concepts/backward-compatibility.html | 2 +- docs/next/concepts/caching.html | 2 +- docs/next/concepts/configuration.html | 2 +- docs/next/concepts/database/connection.html | 2 +- docs/next/concepts/database/crud.html | 2 +- docs/next/concepts/database/filter.html | 2 +- docs/next/concepts/database/indexing.html | 2 +- docs/next/concepts/database/migrations.html | 2 +- docs/next/concepts/database/models.html | 2 +- docs/next/concepts/database/pagination.html | 2 +- docs/next/concepts/database/raw-access.html | 2 +- docs/next/concepts/database/relation-queries.html | 2 +- docs/next/concepts/database/relations/many-to-many.html | 2 +- docs/next/concepts/database/relations/modules.html | 2 +- docs/next/concepts/database/relations/one-to-many.html | 2 +- docs/next/concepts/database/relations/one-to-one.html | 2 +- .../concepts/database/relations/referential-actions.html | 2 +- docs/next/concepts/database/relations/self-relations.html | 2 +- docs/next/concepts/database/sort.html | 2 +- docs/next/concepts/database/transactions.html | 2 +- docs/next/concepts/exceptions.html | 2 +- docs/next/concepts/file-uploads.html | 2 +- docs/next/concepts/health-checks.html | 2 +- docs/next/concepts/logging.html | 2 +- docs/next/concepts/models.html | 2 +- docs/next/concepts/modules.html | 2 +- docs/next/concepts/scheduling.html | 2 +- docs/next/concepts/serialization.html | 2 +- docs/next/concepts/sessions.html | 2 +- docs/next/concepts/streams.html | 2 +- docs/next/concepts/webserver.html | 2 +- docs/next/concepts/working-with-endpoints.html | 2 +- docs/next/contribute.html | 2 +- docs/next/deployments/deploying-to-aws.html | 2 +- docs/next/deployments/deploying-to-gce-terraform.html | 2 +- docs/next/deployments/deploying-to-gcr-console.html | 2 +- docs/next/deployments/deployment-strategy.html | 2 +- docs/next/deployments/general.html | 2 +- docs/next/get-started-with-mini.html | 6 ++++-- docs/next/get-started.html | 2 +- docs/next/support.html | 2 +- docs/next/tools/insights.html | 2 +- docs/next/tools/lsp.html | 2 +- docs/next/tutorials/authentication.html | 2 +- docs/next/tutorials/code-example.html | 2 +- docs/next/tutorials/first-app.html | 2 +- docs/next/tutorials/real-time-communication.html | 4 +++- docs/next/upgrading/upgrade-from-mini.html | 2 +- docs/next/upgrading/upgrade-to-one-point-two.html | 2 +- docs/next/upgrading/upgrade-to-two.html | 2 +- docs/support.html | 2 +- docs/tools/insights.html | 2 +- docs/tools/lsp.html | 2 +- docs/tutorials/authentication.html | 2 +- docs/tutorials/code-example.html | 2 +- docs/tutorials/first-app.html | 2 +- docs/tutorials/real-time-communication.html | 4 +++- docs/upgrading/upgrade-from-mini.html | 2 +- docs/upgrading/upgrade-to-one-point-two.html | 2 +- docs/upgrading/upgrade-to-two.html | 2 +- 503 files changed, 509 insertions(+), 501 deletions(-) delete mode 100644 docs/assets/js/0c6fe626.3530bd34.js create mode 100644 docs/assets/js/0c6fe626.96dcbb61.js create mode 100644 docs/assets/js/5cde491b.adda50dd.js delete mode 100644 docs/assets/js/5cde491b.cb7b6cda.js create mode 100644 docs/assets/js/78ae7ec8.5253f8ae.js delete mode 100644 docs/assets/js/78ae7ec8.6ea9b967.js create mode 100644 docs/assets/js/df15bc7d.486261d6.js delete mode 100644 docs/assets/js/df15bc7d.d24d19f0.js rename docs/assets/js/{runtime~main.00b4f806.js => runtime~main.c0093c61.js} (93%) diff --git a/docs/0.9.10.html b/docs/0.9.10.html index 1a69fe978..8412adf8e 100644 --- a/docs/0.9.10.html +++ b/docs/0.9.10.html @@ -4,7 +4,7 @@ Get started | Serverpod - + diff --git a/docs/0.9.10/capabilities.html b/docs/0.9.10/capabilities.html index 2d65f0e84..c1138116d 100644 --- a/docs/0.9.10/capabilities.html +++ b/docs/0.9.10/capabilities.html @@ -4,7 +4,7 @@ Capabilities | Serverpod - + diff --git a/docs/0.9.10/concepts/authentication.html b/docs/0.9.10/concepts/authentication.html index a5dedc3f5..6cbb27391 100644 --- a/docs/0.9.10/concepts/authentication.html +++ b/docs/0.9.10/concepts/authentication.html @@ -4,7 +4,7 @@ Authentication | Serverpod - + diff --git a/docs/0.9.10/concepts/caching.html b/docs/0.9.10/concepts/caching.html index 6dc3df91d..71c617cd1 100644 --- a/docs/0.9.10/concepts/caching.html +++ b/docs/0.9.10/concepts/caching.html @@ -4,7 +4,7 @@ Caching | Serverpod - + diff --git a/docs/0.9.10/concepts/database-communication.html b/docs/0.9.10/concepts/database-communication.html index 649798cef..960bd7350 100644 --- a/docs/0.9.10/concepts/database-communication.html +++ b/docs/0.9.10/concepts/database-communication.html @@ -4,7 +4,7 @@ Database communication | Serverpod - + diff --git a/docs/0.9.10/concepts/file-uploads.html b/docs/0.9.10/concepts/file-uploads.html index c93bd3cbf..aaf17d50d 100644 --- a/docs/0.9.10/concepts/file-uploads.html +++ b/docs/0.9.10/concepts/file-uploads.html @@ -4,7 +4,7 @@ Uploading files | Serverpod - + diff --git a/docs/0.9.10/concepts/logging.html b/docs/0.9.10/concepts/logging.html index f602b0455..0cac9e7cc 100644 --- a/docs/0.9.10/concepts/logging.html +++ b/docs/0.9.10/concepts/logging.html @@ -4,7 +4,7 @@ Logging | Serverpod - + diff --git a/docs/0.9.10/concepts/modules.html b/docs/0.9.10/concepts/modules.html index 9a2388f3b..fd621eecb 100644 --- a/docs/0.9.10/concepts/modules.html +++ b/docs/0.9.10/concepts/modules.html @@ -4,7 +4,7 @@ Modules | Serverpod - + diff --git a/docs/0.9.10/concepts/serialization.html b/docs/0.9.10/concepts/serialization.html index 6c2bf463a..9e034e293 100644 --- a/docs/0.9.10/concepts/serialization.html +++ b/docs/0.9.10/concepts/serialization.html @@ -4,7 +4,7 @@ Serialization | Serverpod - + diff --git a/docs/0.9.10/concepts/streams.html b/docs/0.9.10/concepts/streams.html index c73785ccf..ff00e9cbb 100644 --- a/docs/0.9.10/concepts/streams.html +++ b/docs/0.9.10/concepts/streams.html @@ -4,7 +4,7 @@ Streams and messaging | Serverpod - + diff --git a/docs/0.9.10/concepts/webserver.html b/docs/0.9.10/concepts/webserver.html index ebb0597cf..cdd276648 100644 --- a/docs/0.9.10/concepts/webserver.html +++ b/docs/0.9.10/concepts/webserver.html @@ -4,7 +4,7 @@ Web server | Serverpod - + diff --git a/docs/0.9.10/concepts/working-with-endpoints.html b/docs/0.9.10/concepts/working-with-endpoints.html index cbb1c57db..d8bf5dd18 100644 --- a/docs/0.9.10/concepts/working-with-endpoints.html +++ b/docs/0.9.10/concepts/working-with-endpoints.html @@ -4,7 +4,7 @@ Working with endpoints | Serverpod - + diff --git a/docs/0.9.10/contribute.html b/docs/0.9.10/contribute.html index 6cd765688..61decb652 100644 --- a/docs/0.9.10/contribute.html +++ b/docs/0.9.10/contribute.html @@ -4,7 +4,7 @@ Contribute | Serverpod - + diff --git a/docs/0.9.10/deployments/deploying-to-aws.html b/docs/0.9.10/deployments/deploying-to-aws.html index bbda10dd2..3fa766d58 100644 --- a/docs/0.9.10/deployments/deploying-to-aws.html +++ b/docs/0.9.10/deployments/deploying-to-aws.html @@ -4,7 +4,7 @@ Deploying to AWS | Serverpod - + diff --git a/docs/0.9.10/deployments/general.html b/docs/0.9.10/deployments/general.html index f92acd620..838b4bc7f 100644 --- a/docs/0.9.10/deployments/general.html +++ b/docs/0.9.10/deployments/general.html @@ -4,7 +4,7 @@ General notes | Serverpod - + diff --git a/docs/0.9.10/roadmap.html b/docs/0.9.10/roadmap.html index fd94cf76c..41dae6533 100644 --- a/docs/0.9.10/roadmap.html +++ b/docs/0.9.10/roadmap.html @@ -4,7 +4,7 @@ Roadmap | Serverpod - + diff --git a/docs/0.9.10/support.html b/docs/0.9.10/support.html index a695c29dd..9c661670f 100644 --- a/docs/0.9.10/support.html +++ b/docs/0.9.10/support.html @@ -4,7 +4,7 @@ Support & community | Serverpod - + diff --git a/docs/0.9.11.html b/docs/0.9.11.html index 47e498282..fdfa9ccb1 100644 --- a/docs/0.9.11.html +++ b/docs/0.9.11.html @@ -4,7 +4,7 @@ Get started | Serverpod - + diff --git a/docs/0.9.11/capabilities.html b/docs/0.9.11/capabilities.html index 1bc708989..be2e4c8cc 100644 --- a/docs/0.9.11/capabilities.html +++ b/docs/0.9.11/capabilities.html @@ -4,7 +4,7 @@ Capabilities | Serverpod - + diff --git a/docs/0.9.11/concepts/authentication.html b/docs/0.9.11/concepts/authentication.html index 67ed3c076..38ee5ab94 100644 --- a/docs/0.9.11/concepts/authentication.html +++ b/docs/0.9.11/concepts/authentication.html @@ -4,7 +4,7 @@ Authentication | Serverpod - + diff --git a/docs/0.9.11/concepts/caching.html b/docs/0.9.11/concepts/caching.html index b456ce8ff..693c56e56 100644 --- a/docs/0.9.11/concepts/caching.html +++ b/docs/0.9.11/concepts/caching.html @@ -4,7 +4,7 @@ Caching | Serverpod - + diff --git a/docs/0.9.11/concepts/database-communication.html b/docs/0.9.11/concepts/database-communication.html index 5530979c1..0d32540f7 100644 --- a/docs/0.9.11/concepts/database-communication.html +++ b/docs/0.9.11/concepts/database-communication.html @@ -4,7 +4,7 @@ Database communication | Serverpod - + diff --git a/docs/0.9.11/concepts/file-uploads.html b/docs/0.9.11/concepts/file-uploads.html index 6911bffe5..fefee6f68 100644 --- a/docs/0.9.11/concepts/file-uploads.html +++ b/docs/0.9.11/concepts/file-uploads.html @@ -4,7 +4,7 @@ Uploading files | Serverpod - + diff --git a/docs/0.9.11/concepts/logging.html b/docs/0.9.11/concepts/logging.html index c36d83115..642eeeeb9 100644 --- a/docs/0.9.11/concepts/logging.html +++ b/docs/0.9.11/concepts/logging.html @@ -4,7 +4,7 @@ Logging | Serverpod - + diff --git a/docs/0.9.11/concepts/modules.html b/docs/0.9.11/concepts/modules.html index d3b26bfc1..f0ca11f9e 100644 --- a/docs/0.9.11/concepts/modules.html +++ b/docs/0.9.11/concepts/modules.html @@ -4,7 +4,7 @@ Modules | Serverpod - + diff --git a/docs/0.9.11/concepts/serialization.html b/docs/0.9.11/concepts/serialization.html index 671b24f52..a332f116f 100644 --- a/docs/0.9.11/concepts/serialization.html +++ b/docs/0.9.11/concepts/serialization.html @@ -4,7 +4,7 @@ Serialization | Serverpod - + diff --git a/docs/0.9.11/concepts/streams.html b/docs/0.9.11/concepts/streams.html index bd644e7eb..ded6b7c45 100644 --- a/docs/0.9.11/concepts/streams.html +++ b/docs/0.9.11/concepts/streams.html @@ -4,7 +4,7 @@ Streams and messaging | Serverpod - + diff --git a/docs/0.9.11/concepts/webserver.html b/docs/0.9.11/concepts/webserver.html index b22cc26e0..9e2c16d5e 100644 --- a/docs/0.9.11/concepts/webserver.html +++ b/docs/0.9.11/concepts/webserver.html @@ -4,7 +4,7 @@ Web server | Serverpod - + diff --git a/docs/0.9.11/concepts/working-with-endpoints.html b/docs/0.9.11/concepts/working-with-endpoints.html index 206cec33c..cd26bc690 100644 --- a/docs/0.9.11/concepts/working-with-endpoints.html +++ b/docs/0.9.11/concepts/working-with-endpoints.html @@ -4,7 +4,7 @@ Working with endpoints | Serverpod - + diff --git a/docs/0.9.11/contribute.html b/docs/0.9.11/contribute.html index 7fa2c9ae1..2fe05693a 100644 --- a/docs/0.9.11/contribute.html +++ b/docs/0.9.11/contribute.html @@ -4,7 +4,7 @@ Contribute | Serverpod - + diff --git a/docs/0.9.11/deployments/deploying-to-aws.html b/docs/0.9.11/deployments/deploying-to-aws.html index e39684df6..52fbf8c6a 100644 --- a/docs/0.9.11/deployments/deploying-to-aws.html +++ b/docs/0.9.11/deployments/deploying-to-aws.html @@ -4,7 +4,7 @@ Deploying to AWS | Serverpod - + diff --git a/docs/0.9.11/deployments/general.html b/docs/0.9.11/deployments/general.html index 75679ea75..e10766336 100644 --- a/docs/0.9.11/deployments/general.html +++ b/docs/0.9.11/deployments/general.html @@ -4,7 +4,7 @@ General notes | Serverpod - + diff --git a/docs/0.9.11/roadmap.html b/docs/0.9.11/roadmap.html index 288afaca8..172aaa798 100644 --- a/docs/0.9.11/roadmap.html +++ b/docs/0.9.11/roadmap.html @@ -4,7 +4,7 @@ Roadmap | Serverpod - + diff --git a/docs/0.9.11/support.html b/docs/0.9.11/support.html index dfc9a1b78..3c9f9050b 100644 --- a/docs/0.9.11/support.html +++ b/docs/0.9.11/support.html @@ -4,7 +4,7 @@ Support & community | Serverpod - + diff --git a/docs/0.9.20.html b/docs/0.9.20.html index ca544e461..040a1b4cb 100644 --- a/docs/0.9.20.html +++ b/docs/0.9.20.html @@ -4,7 +4,7 @@ Get started | Serverpod - + diff --git a/docs/0.9.20/capabilities.html b/docs/0.9.20/capabilities.html index f21623795..6deef0695 100644 --- a/docs/0.9.20/capabilities.html +++ b/docs/0.9.20/capabilities.html @@ -4,7 +4,7 @@ Capabilities | Serverpod - + diff --git a/docs/0.9.20/concepts/authentication.html b/docs/0.9.20/concepts/authentication.html index 49ae58e49..756d4b544 100644 --- a/docs/0.9.20/concepts/authentication.html +++ b/docs/0.9.20/concepts/authentication.html @@ -4,7 +4,7 @@ Authentication | Serverpod - + diff --git a/docs/0.9.20/concepts/backward-compatibility.html b/docs/0.9.20/concepts/backward-compatibility.html index 00541b468..3ef061646 100644 --- a/docs/0.9.20/concepts/backward-compatibility.html +++ b/docs/0.9.20/concepts/backward-compatibility.html @@ -4,7 +4,7 @@ Backward compatibility | Serverpod - + diff --git a/docs/0.9.20/concepts/caching.html b/docs/0.9.20/concepts/caching.html index 5d37622a9..16c745ccd 100644 --- a/docs/0.9.20/concepts/caching.html +++ b/docs/0.9.20/concepts/caching.html @@ -4,7 +4,7 @@ Caching | Serverpod - + diff --git a/docs/0.9.20/concepts/database-communication.html b/docs/0.9.20/concepts/database-communication.html index 61bd80161..5b1b1c332 100644 --- a/docs/0.9.20/concepts/database-communication.html +++ b/docs/0.9.20/concepts/database-communication.html @@ -4,7 +4,7 @@ Database communication | Serverpod - + diff --git a/docs/0.9.20/concepts/file-uploads.html b/docs/0.9.20/concepts/file-uploads.html index 9eb73bd8c..65d5303df 100644 --- a/docs/0.9.20/concepts/file-uploads.html +++ b/docs/0.9.20/concepts/file-uploads.html @@ -4,7 +4,7 @@ Uploading files | Serverpod - + diff --git a/docs/0.9.20/concepts/health-checks.html b/docs/0.9.20/concepts/health-checks.html index 54901d550..f31156566 100644 --- a/docs/0.9.20/concepts/health-checks.html +++ b/docs/0.9.20/concepts/health-checks.html @@ -4,7 +4,7 @@ Health checks | Serverpod - + diff --git a/docs/0.9.20/concepts/logging.html b/docs/0.9.20/concepts/logging.html index a3d15d30b..6dd8fdee1 100644 --- a/docs/0.9.20/concepts/logging.html +++ b/docs/0.9.20/concepts/logging.html @@ -4,7 +4,7 @@ Logging | Serverpod - + diff --git a/docs/0.9.20/concepts/modules.html b/docs/0.9.20/concepts/modules.html index 7662bb4fe..00dc253af 100644 --- a/docs/0.9.20/concepts/modules.html +++ b/docs/0.9.20/concepts/modules.html @@ -4,7 +4,7 @@ Modules | Serverpod - + diff --git a/docs/0.9.20/concepts/serialization.html b/docs/0.9.20/concepts/serialization.html index f5e8a8100..facad2d26 100644 --- a/docs/0.9.20/concepts/serialization.html +++ b/docs/0.9.20/concepts/serialization.html @@ -4,7 +4,7 @@ Serialization | Serverpod - + diff --git a/docs/0.9.20/concepts/streams.html b/docs/0.9.20/concepts/streams.html index e936175a4..3b04c6119 100644 --- a/docs/0.9.20/concepts/streams.html +++ b/docs/0.9.20/concepts/streams.html @@ -4,7 +4,7 @@ Streams and messaging | Serverpod - + diff --git a/docs/0.9.20/concepts/webserver.html b/docs/0.9.20/concepts/webserver.html index d9c7ed65c..5630059b9 100644 --- a/docs/0.9.20/concepts/webserver.html +++ b/docs/0.9.20/concepts/webserver.html @@ -4,7 +4,7 @@ Web server | Serverpod - + diff --git a/docs/0.9.20/concepts/working-with-endpoints.html b/docs/0.9.20/concepts/working-with-endpoints.html index ad01aa207..ebcb14989 100644 --- a/docs/0.9.20/concepts/working-with-endpoints.html +++ b/docs/0.9.20/concepts/working-with-endpoints.html @@ -4,7 +4,7 @@ Working with endpoints | Serverpod - + diff --git a/docs/0.9.20/contribute.html b/docs/0.9.20/contribute.html index dd8f5d237..b4ecd74f3 100644 --- a/docs/0.9.20/contribute.html +++ b/docs/0.9.20/contribute.html @@ -4,7 +4,7 @@ Contribute | Serverpod - + diff --git a/docs/0.9.20/deployments/deploying-to-aws.html b/docs/0.9.20/deployments/deploying-to-aws.html index 2910241f8..37d127e6d 100644 --- a/docs/0.9.20/deployments/deploying-to-aws.html +++ b/docs/0.9.20/deployments/deploying-to-aws.html @@ -4,7 +4,7 @@ Deploying to AWS | Serverpod - + diff --git a/docs/0.9.20/deployments/general.html b/docs/0.9.20/deployments/general.html index 38e2a0e68..0ae08290a 100644 --- a/docs/0.9.20/deployments/general.html +++ b/docs/0.9.20/deployments/general.html @@ -4,7 +4,7 @@ General notes | Serverpod - + diff --git a/docs/0.9.20/roadmap.html b/docs/0.9.20/roadmap.html index 561590e23..786c7c130 100644 --- a/docs/0.9.20/roadmap.html +++ b/docs/0.9.20/roadmap.html @@ -4,7 +4,7 @@ Roadmap | Serverpod - + diff --git a/docs/0.9.20/support.html b/docs/0.9.20/support.html index 4b477f205..b7b051a76 100644 --- a/docs/0.9.20/support.html +++ b/docs/0.9.20/support.html @@ -4,7 +4,7 @@ Support & community | Serverpod - + diff --git a/docs/0.9.20/tutorials.html b/docs/0.9.20/tutorials.html index 09fbde3a5..102f67e6d 100644 --- a/docs/0.9.20/tutorials.html +++ b/docs/0.9.20/tutorials.html @@ -4,7 +4,7 @@ Tutorials & Examples | Serverpod - + diff --git a/docs/0.9.21.html b/docs/0.9.21.html index 6489b42ff..9926a9cc4 100644 --- a/docs/0.9.21.html +++ b/docs/0.9.21.html @@ -4,7 +4,7 @@ Get started | Serverpod - + diff --git a/docs/0.9.21/capabilities.html b/docs/0.9.21/capabilities.html index c4b6ad4b7..9fc074708 100644 --- a/docs/0.9.21/capabilities.html +++ b/docs/0.9.21/capabilities.html @@ -4,7 +4,7 @@ Capabilities | Serverpod - + diff --git a/docs/0.9.21/concepts/authentication.html b/docs/0.9.21/concepts/authentication.html index f35602b2d..f51ae6949 100644 --- a/docs/0.9.21/concepts/authentication.html +++ b/docs/0.9.21/concepts/authentication.html @@ -4,7 +4,7 @@ Authentication | Serverpod - + diff --git a/docs/0.9.21/concepts/backward-compatibility.html b/docs/0.9.21/concepts/backward-compatibility.html index 59de51b4f..402659e23 100644 --- a/docs/0.9.21/concepts/backward-compatibility.html +++ b/docs/0.9.21/concepts/backward-compatibility.html @@ -4,7 +4,7 @@ Backward compatibility | Serverpod - + diff --git a/docs/0.9.21/concepts/caching.html b/docs/0.9.21/concepts/caching.html index 62488c966..bcf703a49 100644 --- a/docs/0.9.21/concepts/caching.html +++ b/docs/0.9.21/concepts/caching.html @@ -4,7 +4,7 @@ Caching | Serverpod - + diff --git a/docs/0.9.21/concepts/database-communication.html b/docs/0.9.21/concepts/database-communication.html index 3651e18e2..24fd6a7d1 100644 --- a/docs/0.9.21/concepts/database-communication.html +++ b/docs/0.9.21/concepts/database-communication.html @@ -4,7 +4,7 @@ Database communication | Serverpod - + diff --git a/docs/0.9.21/concepts/file-uploads.html b/docs/0.9.21/concepts/file-uploads.html index 978aa98f3..30246766b 100644 --- a/docs/0.9.21/concepts/file-uploads.html +++ b/docs/0.9.21/concepts/file-uploads.html @@ -4,7 +4,7 @@ Uploading files | Serverpod - + diff --git a/docs/0.9.21/concepts/health-checks.html b/docs/0.9.21/concepts/health-checks.html index 7d78fc81b..67fa1c672 100644 --- a/docs/0.9.21/concepts/health-checks.html +++ b/docs/0.9.21/concepts/health-checks.html @@ -4,7 +4,7 @@ Health checks | Serverpod - + diff --git a/docs/0.9.21/concepts/logging.html b/docs/0.9.21/concepts/logging.html index a7b936be0..8c34d00ec 100644 --- a/docs/0.9.21/concepts/logging.html +++ b/docs/0.9.21/concepts/logging.html @@ -4,7 +4,7 @@ Logging | Serverpod - + diff --git a/docs/0.9.21/concepts/modules.html b/docs/0.9.21/concepts/modules.html index 75274b9ad..f5afea7be 100644 --- a/docs/0.9.21/concepts/modules.html +++ b/docs/0.9.21/concepts/modules.html @@ -4,7 +4,7 @@ Modules | Serverpod - + diff --git a/docs/0.9.21/concepts/serialization.html b/docs/0.9.21/concepts/serialization.html index 7c41ff7fb..3af91750b 100644 --- a/docs/0.9.21/concepts/serialization.html +++ b/docs/0.9.21/concepts/serialization.html @@ -4,7 +4,7 @@ Serialization | Serverpod - + diff --git a/docs/0.9.21/concepts/streams.html b/docs/0.9.21/concepts/streams.html index a9cc1b25d..67c7c85c8 100644 --- a/docs/0.9.21/concepts/streams.html +++ b/docs/0.9.21/concepts/streams.html @@ -4,7 +4,7 @@ Streams and messaging | Serverpod - + diff --git a/docs/0.9.21/concepts/webserver.html b/docs/0.9.21/concepts/webserver.html index 17cd0c069..e5f3a8e75 100644 --- a/docs/0.9.21/concepts/webserver.html +++ b/docs/0.9.21/concepts/webserver.html @@ -4,7 +4,7 @@ Web server | Serverpod - + diff --git a/docs/0.9.21/concepts/working-with-endpoints.html b/docs/0.9.21/concepts/working-with-endpoints.html index c8ec67b58..67fad463a 100644 --- a/docs/0.9.21/concepts/working-with-endpoints.html +++ b/docs/0.9.21/concepts/working-with-endpoints.html @@ -4,7 +4,7 @@ Working with endpoints | Serverpod - + diff --git a/docs/0.9.21/contribute.html b/docs/0.9.21/contribute.html index 2b62ad56c..6ff93d89c 100644 --- a/docs/0.9.21/contribute.html +++ b/docs/0.9.21/contribute.html @@ -4,7 +4,7 @@ Contribute | Serverpod - + diff --git a/docs/0.9.21/deployments/deploying-to-aws.html b/docs/0.9.21/deployments/deploying-to-aws.html index 5f69f25a1..632278f71 100644 --- a/docs/0.9.21/deployments/deploying-to-aws.html +++ b/docs/0.9.21/deployments/deploying-to-aws.html @@ -4,7 +4,7 @@ Deploying to AWS | Serverpod - + diff --git a/docs/0.9.21/deployments/general.html b/docs/0.9.21/deployments/general.html index a63dc0bf5..d97e75e30 100644 --- a/docs/0.9.21/deployments/general.html +++ b/docs/0.9.21/deployments/general.html @@ -4,7 +4,7 @@ General notes | Serverpod - + diff --git a/docs/0.9.21/roadmap.html b/docs/0.9.21/roadmap.html index 521dc832d..95e248f9d 100644 --- a/docs/0.9.21/roadmap.html +++ b/docs/0.9.21/roadmap.html @@ -4,7 +4,7 @@ Roadmap | Serverpod - + diff --git a/docs/0.9.21/support.html b/docs/0.9.21/support.html index 2f55c66e1..fa4dea59f 100644 --- a/docs/0.9.21/support.html +++ b/docs/0.9.21/support.html @@ -4,7 +4,7 @@ Support & community | Serverpod - + diff --git a/docs/0.9.21/tutorials.html b/docs/0.9.21/tutorials.html index 3e6c6dfae..d450e5a39 100644 --- a/docs/0.9.21/tutorials.html +++ b/docs/0.9.21/tutorials.html @@ -4,7 +4,7 @@ Tutorials & Examples | Serverpod - + diff --git a/docs/0.9.22.html b/docs/0.9.22.html index 57a440519..0ba7fdbc5 100644 --- a/docs/0.9.22.html +++ b/docs/0.9.22.html @@ -4,7 +4,7 @@ Get started | Serverpod - + diff --git a/docs/0.9.22/capabilities.html b/docs/0.9.22/capabilities.html index 0459c2f59..4aca1fdb9 100644 --- a/docs/0.9.22/capabilities.html +++ b/docs/0.9.22/capabilities.html @@ -4,7 +4,7 @@ Capabilities | Serverpod - + diff --git a/docs/0.9.22/concepts/authentication.html b/docs/0.9.22/concepts/authentication.html index f66afcca6..f8b07245d 100644 --- a/docs/0.9.22/concepts/authentication.html +++ b/docs/0.9.22/concepts/authentication.html @@ -4,7 +4,7 @@ Authentication | Serverpod - + diff --git a/docs/0.9.22/concepts/backward-compatibility.html b/docs/0.9.22/concepts/backward-compatibility.html index 329ffc5a3..1ad82e3a8 100644 --- a/docs/0.9.22/concepts/backward-compatibility.html +++ b/docs/0.9.22/concepts/backward-compatibility.html @@ -4,7 +4,7 @@ Backward compatibility | Serverpod - + diff --git a/docs/0.9.22/concepts/caching.html b/docs/0.9.22/concepts/caching.html index d7ad564dd..d1ad629ab 100644 --- a/docs/0.9.22/concepts/caching.html +++ b/docs/0.9.22/concepts/caching.html @@ -4,7 +4,7 @@ Caching | Serverpod - + diff --git a/docs/0.9.22/concepts/database-communication.html b/docs/0.9.22/concepts/database-communication.html index c697010b6..215b61e99 100644 --- a/docs/0.9.22/concepts/database-communication.html +++ b/docs/0.9.22/concepts/database-communication.html @@ -4,7 +4,7 @@ Database communication | Serverpod - + diff --git a/docs/0.9.22/concepts/file-uploads.html b/docs/0.9.22/concepts/file-uploads.html index df11639ec..f9e565a84 100644 --- a/docs/0.9.22/concepts/file-uploads.html +++ b/docs/0.9.22/concepts/file-uploads.html @@ -4,7 +4,7 @@ Uploading files | Serverpod - + diff --git a/docs/0.9.22/concepts/health-checks.html b/docs/0.9.22/concepts/health-checks.html index 2b52bf75e..21b1c466b 100644 --- a/docs/0.9.22/concepts/health-checks.html +++ b/docs/0.9.22/concepts/health-checks.html @@ -4,7 +4,7 @@ Health checks | Serverpod - + diff --git a/docs/0.9.22/concepts/logging.html b/docs/0.9.22/concepts/logging.html index 6227a4ba6..cc47bbc3f 100644 --- a/docs/0.9.22/concepts/logging.html +++ b/docs/0.9.22/concepts/logging.html @@ -4,7 +4,7 @@ Logging | Serverpod - + diff --git a/docs/0.9.22/concepts/modules.html b/docs/0.9.22/concepts/modules.html index 91bddfcd8..52d575199 100644 --- a/docs/0.9.22/concepts/modules.html +++ b/docs/0.9.22/concepts/modules.html @@ -4,7 +4,7 @@ Modules | Serverpod - + diff --git a/docs/0.9.22/concepts/serialization.html b/docs/0.9.22/concepts/serialization.html index df5e7ea36..983ea83c6 100644 --- a/docs/0.9.22/concepts/serialization.html +++ b/docs/0.9.22/concepts/serialization.html @@ -4,7 +4,7 @@ Serialization | Serverpod - + diff --git a/docs/0.9.22/concepts/streams.html b/docs/0.9.22/concepts/streams.html index 6ace06fcc..ed8a9fd0f 100644 --- a/docs/0.9.22/concepts/streams.html +++ b/docs/0.9.22/concepts/streams.html @@ -4,7 +4,7 @@ Streams and messaging | Serverpod - + diff --git a/docs/0.9.22/concepts/webserver.html b/docs/0.9.22/concepts/webserver.html index e263228a1..0d416bcac 100644 --- a/docs/0.9.22/concepts/webserver.html +++ b/docs/0.9.22/concepts/webserver.html @@ -4,7 +4,7 @@ Web server | Serverpod - + diff --git a/docs/0.9.22/concepts/working-with-endpoints.html b/docs/0.9.22/concepts/working-with-endpoints.html index 061e04bb2..a93762418 100644 --- a/docs/0.9.22/concepts/working-with-endpoints.html +++ b/docs/0.9.22/concepts/working-with-endpoints.html @@ -4,7 +4,7 @@ Working with endpoints | Serverpod - + diff --git a/docs/0.9.22/contribute.html b/docs/0.9.22/contribute.html index b245c4aa1..002cb42ab 100644 --- a/docs/0.9.22/contribute.html +++ b/docs/0.9.22/contribute.html @@ -4,7 +4,7 @@ Contribute | Serverpod - + diff --git a/docs/0.9.22/deployments/deploying-to-aws.html b/docs/0.9.22/deployments/deploying-to-aws.html index e30ff9116..5099ccbf7 100644 --- a/docs/0.9.22/deployments/deploying-to-aws.html +++ b/docs/0.9.22/deployments/deploying-to-aws.html @@ -4,7 +4,7 @@ Deploying to AWS | Serverpod - + diff --git a/docs/0.9.22/deployments/general.html b/docs/0.9.22/deployments/general.html index c1e17e9f5..a0d40e42d 100644 --- a/docs/0.9.22/deployments/general.html +++ b/docs/0.9.22/deployments/general.html @@ -4,7 +4,7 @@ General notes | Serverpod - + diff --git a/docs/0.9.22/roadmap.html b/docs/0.9.22/roadmap.html index 8179380c1..0cb38cf4a 100644 --- a/docs/0.9.22/roadmap.html +++ b/docs/0.9.22/roadmap.html @@ -4,7 +4,7 @@ Roadmap | Serverpod - + diff --git a/docs/0.9.22/support.html b/docs/0.9.22/support.html index c7afac57f..8c2ab662a 100644 --- a/docs/0.9.22/support.html +++ b/docs/0.9.22/support.html @@ -4,7 +4,7 @@ Support & community | Serverpod - + diff --git a/docs/0.9.22/tutorials.html b/docs/0.9.22/tutorials.html index 33b34334a..6a966bb52 100644 --- a/docs/0.9.22/tutorials.html +++ b/docs/0.9.22/tutorials.html @@ -4,7 +4,7 @@ Tutorials & Examples | Serverpod - + diff --git a/docs/0.9.5.html b/docs/0.9.5.html index fce7d23b4..eeaf02da8 100644 --- a/docs/0.9.5.html +++ b/docs/0.9.5.html @@ -4,7 +4,7 @@ Get started | Serverpod - + diff --git a/docs/0.9.5/capabilities.html b/docs/0.9.5/capabilities.html index ca67f354a..d22e678a6 100644 --- a/docs/0.9.5/capabilities.html +++ b/docs/0.9.5/capabilities.html @@ -4,7 +4,7 @@ Capabilities | Serverpod - + diff --git a/docs/0.9.5/concepts/authentication.html b/docs/0.9.5/concepts/authentication.html index 510c52d03..e3162a52f 100644 --- a/docs/0.9.5/concepts/authentication.html +++ b/docs/0.9.5/concepts/authentication.html @@ -4,7 +4,7 @@ Authentication | Serverpod - + diff --git a/docs/0.9.5/concepts/caching.html b/docs/0.9.5/concepts/caching.html index 235937441..21bc8b070 100644 --- a/docs/0.9.5/concepts/caching.html +++ b/docs/0.9.5/concepts/caching.html @@ -4,7 +4,7 @@ Caching | Serverpod - + diff --git a/docs/0.9.5/concepts/database-communication.html b/docs/0.9.5/concepts/database-communication.html index 14b669b63..4f9c3e894 100644 --- a/docs/0.9.5/concepts/database-communication.html +++ b/docs/0.9.5/concepts/database-communication.html @@ -4,7 +4,7 @@ Database communication | Serverpod - + diff --git a/docs/0.9.5/concepts/file-uploads.html b/docs/0.9.5/concepts/file-uploads.html index 6fa4201d2..7a146660f 100644 --- a/docs/0.9.5/concepts/file-uploads.html +++ b/docs/0.9.5/concepts/file-uploads.html @@ -4,7 +4,7 @@ Uploading files | Serverpod - + diff --git a/docs/0.9.5/concepts/logging.html b/docs/0.9.5/concepts/logging.html index 7b1d052b5..1bf95e50d 100644 --- a/docs/0.9.5/concepts/logging.html +++ b/docs/0.9.5/concepts/logging.html @@ -4,7 +4,7 @@ Logging | Serverpod - + diff --git a/docs/0.9.5/concepts/modules.html b/docs/0.9.5/concepts/modules.html index bd0fb50ec..e268054e3 100644 --- a/docs/0.9.5/concepts/modules.html +++ b/docs/0.9.5/concepts/modules.html @@ -4,7 +4,7 @@ Modules | Serverpod - + diff --git a/docs/0.9.5/concepts/serialization.html b/docs/0.9.5/concepts/serialization.html index cb30e3bdf..4fb7ac11e 100644 --- a/docs/0.9.5/concepts/serialization.html +++ b/docs/0.9.5/concepts/serialization.html @@ -4,7 +4,7 @@ Serialization | Serverpod - + diff --git a/docs/0.9.5/concepts/streams.html b/docs/0.9.5/concepts/streams.html index ad5f1cad4..ad9d974e9 100644 --- a/docs/0.9.5/concepts/streams.html +++ b/docs/0.9.5/concepts/streams.html @@ -4,7 +4,7 @@ Streams and messaging | Serverpod - + diff --git a/docs/0.9.5/concepts/working-with-endpoints.html b/docs/0.9.5/concepts/working-with-endpoints.html index 1cc7f862b..f0bc70e7e 100644 --- a/docs/0.9.5/concepts/working-with-endpoints.html +++ b/docs/0.9.5/concepts/working-with-endpoints.html @@ -4,7 +4,7 @@ Working with endpoints | Serverpod - + diff --git a/docs/0.9.5/contribute.html b/docs/0.9.5/contribute.html index 17cddab97..d261cddba 100644 --- a/docs/0.9.5/contribute.html +++ b/docs/0.9.5/contribute.html @@ -4,7 +4,7 @@ Contribute | Serverpod - + diff --git a/docs/0.9.5/deployments/general.html b/docs/0.9.5/deployments/general.html index 2d5b4449f..7a4a705c5 100644 --- a/docs/0.9.5/deployments/general.html +++ b/docs/0.9.5/deployments/general.html @@ -4,7 +4,7 @@ General notes | Serverpod - + diff --git a/docs/0.9.5/roadmap.html b/docs/0.9.5/roadmap.html index 693382a04..c06843503 100644 --- a/docs/0.9.5/roadmap.html +++ b/docs/0.9.5/roadmap.html @@ -4,7 +4,7 @@ Roadmap | Serverpod - + diff --git a/docs/0.9.6.html b/docs/0.9.6.html index 759e22676..5a115bbd1 100644 --- a/docs/0.9.6.html +++ b/docs/0.9.6.html @@ -4,7 +4,7 @@ Get started | Serverpod - + diff --git a/docs/0.9.6/capabilities.html b/docs/0.9.6/capabilities.html index 7bad5419c..6fd83f0e9 100644 --- a/docs/0.9.6/capabilities.html +++ b/docs/0.9.6/capabilities.html @@ -4,7 +4,7 @@ Capabilities | Serverpod - + diff --git a/docs/0.9.6/concepts/authentication.html b/docs/0.9.6/concepts/authentication.html index f57e52937..7886ba9bc 100644 --- a/docs/0.9.6/concepts/authentication.html +++ b/docs/0.9.6/concepts/authentication.html @@ -4,7 +4,7 @@ Authentication | Serverpod - + diff --git a/docs/0.9.6/concepts/caching.html b/docs/0.9.6/concepts/caching.html index 6a061b6e3..289b93fbc 100644 --- a/docs/0.9.6/concepts/caching.html +++ b/docs/0.9.6/concepts/caching.html @@ -4,7 +4,7 @@ Caching | Serverpod - + diff --git a/docs/0.9.6/concepts/database-communication.html b/docs/0.9.6/concepts/database-communication.html index 3800b20df..fa9e24415 100644 --- a/docs/0.9.6/concepts/database-communication.html +++ b/docs/0.9.6/concepts/database-communication.html @@ -4,7 +4,7 @@ Database communication | Serverpod - + diff --git a/docs/0.9.6/concepts/file-uploads.html b/docs/0.9.6/concepts/file-uploads.html index eabe392b1..57f567896 100644 --- a/docs/0.9.6/concepts/file-uploads.html +++ b/docs/0.9.6/concepts/file-uploads.html @@ -4,7 +4,7 @@ Uploading files | Serverpod - + diff --git a/docs/0.9.6/concepts/logging.html b/docs/0.9.6/concepts/logging.html index f7e5deaf0..59b4951df 100644 --- a/docs/0.9.6/concepts/logging.html +++ b/docs/0.9.6/concepts/logging.html @@ -4,7 +4,7 @@ Logging | Serverpod - + diff --git a/docs/0.9.6/concepts/modules.html b/docs/0.9.6/concepts/modules.html index ee69a29b0..3e4d7b1e0 100644 --- a/docs/0.9.6/concepts/modules.html +++ b/docs/0.9.6/concepts/modules.html @@ -4,7 +4,7 @@ Modules | Serverpod - + diff --git a/docs/0.9.6/concepts/serialization.html b/docs/0.9.6/concepts/serialization.html index e325aff02..ead04ce7a 100644 --- a/docs/0.9.6/concepts/serialization.html +++ b/docs/0.9.6/concepts/serialization.html @@ -4,7 +4,7 @@ Serialization | Serverpod - + diff --git a/docs/0.9.6/concepts/streams.html b/docs/0.9.6/concepts/streams.html index fbec8d853..ea52126fc 100644 --- a/docs/0.9.6/concepts/streams.html +++ b/docs/0.9.6/concepts/streams.html @@ -4,7 +4,7 @@ Streams and messaging | Serverpod - + diff --git a/docs/0.9.6/concepts/working-with-endpoints.html b/docs/0.9.6/concepts/working-with-endpoints.html index 39e204e67..9b4965e39 100644 --- a/docs/0.9.6/concepts/working-with-endpoints.html +++ b/docs/0.9.6/concepts/working-with-endpoints.html @@ -4,7 +4,7 @@ Working with endpoints | Serverpod - + diff --git a/docs/0.9.6/contribute.html b/docs/0.9.6/contribute.html index e59d075a0..3bc8715cb 100644 --- a/docs/0.9.6/contribute.html +++ b/docs/0.9.6/contribute.html @@ -4,7 +4,7 @@ Contribute | Serverpod - + diff --git a/docs/0.9.6/deployments/general.html b/docs/0.9.6/deployments/general.html index 34b8cd84b..9a659173f 100644 --- a/docs/0.9.6/deployments/general.html +++ b/docs/0.9.6/deployments/general.html @@ -4,7 +4,7 @@ General notes | Serverpod - + diff --git a/docs/0.9.6/roadmap.html b/docs/0.9.6/roadmap.html index ebaef5fbd..7d5227cdc 100644 --- a/docs/0.9.6/roadmap.html +++ b/docs/0.9.6/roadmap.html @@ -4,7 +4,7 @@ Roadmap | Serverpod - + diff --git a/docs/0.9.7.html b/docs/0.9.7.html index e15d3bae6..ef31db456 100644 --- a/docs/0.9.7.html +++ b/docs/0.9.7.html @@ -4,7 +4,7 @@ Get started | Serverpod - + diff --git a/docs/0.9.7/capabilities.html b/docs/0.9.7/capabilities.html index 19eac7571..f41175115 100644 --- a/docs/0.9.7/capabilities.html +++ b/docs/0.9.7/capabilities.html @@ -4,7 +4,7 @@ Capabilities | Serverpod - + diff --git a/docs/0.9.7/concepts/authentication.html b/docs/0.9.7/concepts/authentication.html index 968202579..c85998f9c 100644 --- a/docs/0.9.7/concepts/authentication.html +++ b/docs/0.9.7/concepts/authentication.html @@ -4,7 +4,7 @@ Authentication | Serverpod - + diff --git a/docs/0.9.7/concepts/caching.html b/docs/0.9.7/concepts/caching.html index c7f14ad56..f919b889a 100644 --- a/docs/0.9.7/concepts/caching.html +++ b/docs/0.9.7/concepts/caching.html @@ -4,7 +4,7 @@ Caching | Serverpod - + diff --git a/docs/0.9.7/concepts/database-communication.html b/docs/0.9.7/concepts/database-communication.html index a6cb5a6ae..7cb360087 100644 --- a/docs/0.9.7/concepts/database-communication.html +++ b/docs/0.9.7/concepts/database-communication.html @@ -4,7 +4,7 @@ Database communication | Serverpod - + diff --git a/docs/0.9.7/concepts/file-uploads.html b/docs/0.9.7/concepts/file-uploads.html index 126596277..43c372a8f 100644 --- a/docs/0.9.7/concepts/file-uploads.html +++ b/docs/0.9.7/concepts/file-uploads.html @@ -4,7 +4,7 @@ Uploading files | Serverpod - + diff --git a/docs/0.9.7/concepts/logging.html b/docs/0.9.7/concepts/logging.html index c92aae432..96d31034a 100644 --- a/docs/0.9.7/concepts/logging.html +++ b/docs/0.9.7/concepts/logging.html @@ -4,7 +4,7 @@ Logging | Serverpod - + diff --git a/docs/0.9.7/concepts/modules.html b/docs/0.9.7/concepts/modules.html index 2438f2af9..7aacee971 100644 --- a/docs/0.9.7/concepts/modules.html +++ b/docs/0.9.7/concepts/modules.html @@ -4,7 +4,7 @@ Modules | Serverpod - + diff --git a/docs/0.9.7/concepts/serialization.html b/docs/0.9.7/concepts/serialization.html index 45761d821..2931bf9fa 100644 --- a/docs/0.9.7/concepts/serialization.html +++ b/docs/0.9.7/concepts/serialization.html @@ -4,7 +4,7 @@ Serialization | Serverpod - + diff --git a/docs/0.9.7/concepts/streams.html b/docs/0.9.7/concepts/streams.html index d7146830d..9563dd138 100644 --- a/docs/0.9.7/concepts/streams.html +++ b/docs/0.9.7/concepts/streams.html @@ -4,7 +4,7 @@ Streams and messaging | Serverpod - + diff --git a/docs/0.9.7/concepts/working-with-endpoints.html b/docs/0.9.7/concepts/working-with-endpoints.html index 0e6d02560..e26d0a6ed 100644 --- a/docs/0.9.7/concepts/working-with-endpoints.html +++ b/docs/0.9.7/concepts/working-with-endpoints.html @@ -4,7 +4,7 @@ Working with endpoints | Serverpod - + diff --git a/docs/0.9.7/contribute.html b/docs/0.9.7/contribute.html index 4ca5860c2..c736d88a4 100644 --- a/docs/0.9.7/contribute.html +++ b/docs/0.9.7/contribute.html @@ -4,7 +4,7 @@ Contribute | Serverpod - + diff --git a/docs/0.9.7/deployments/general.html b/docs/0.9.7/deployments/general.html index a7547b8f1..eecf14959 100644 --- a/docs/0.9.7/deployments/general.html +++ b/docs/0.9.7/deployments/general.html @@ -4,7 +4,7 @@ General notes | Serverpod - + diff --git a/docs/0.9.7/roadmap.html b/docs/0.9.7/roadmap.html index 51792a0c1..0a557bd68 100644 --- a/docs/0.9.7/roadmap.html +++ b/docs/0.9.7/roadmap.html @@ -4,7 +4,7 @@ Roadmap | Serverpod - + diff --git a/docs/0.9.7/support.html b/docs/0.9.7/support.html index 8efd42723..1132164f2 100644 --- a/docs/0.9.7/support.html +++ b/docs/0.9.7/support.html @@ -4,7 +4,7 @@ Support | Serverpod - + diff --git a/docs/0.9.8.html b/docs/0.9.8.html index 23384311a..9be8680e8 100644 --- a/docs/0.9.8.html +++ b/docs/0.9.8.html @@ -4,7 +4,7 @@ Get started | Serverpod - + diff --git a/docs/0.9.8/capabilities.html b/docs/0.9.8/capabilities.html index 81698b602..4fab9919b 100644 --- a/docs/0.9.8/capabilities.html +++ b/docs/0.9.8/capabilities.html @@ -4,7 +4,7 @@ Capabilities | Serverpod - + diff --git a/docs/0.9.8/concepts/authentication.html b/docs/0.9.8/concepts/authentication.html index 3713e3f2f..ac5fd4d04 100644 --- a/docs/0.9.8/concepts/authentication.html +++ b/docs/0.9.8/concepts/authentication.html @@ -4,7 +4,7 @@ Authentication | Serverpod - + diff --git a/docs/0.9.8/concepts/caching.html b/docs/0.9.8/concepts/caching.html index 00cf37153..43d8ea587 100644 --- a/docs/0.9.8/concepts/caching.html +++ b/docs/0.9.8/concepts/caching.html @@ -4,7 +4,7 @@ Caching | Serverpod - + diff --git a/docs/0.9.8/concepts/database-communication.html b/docs/0.9.8/concepts/database-communication.html index 61a9c32d8..537b2a5cc 100644 --- a/docs/0.9.8/concepts/database-communication.html +++ b/docs/0.9.8/concepts/database-communication.html @@ -4,7 +4,7 @@ Database communication | Serverpod - + diff --git a/docs/0.9.8/concepts/file-uploads.html b/docs/0.9.8/concepts/file-uploads.html index f7732bdf0..0a5b5e57b 100644 --- a/docs/0.9.8/concepts/file-uploads.html +++ b/docs/0.9.8/concepts/file-uploads.html @@ -4,7 +4,7 @@ Uploading files | Serverpod - + diff --git a/docs/0.9.8/concepts/logging.html b/docs/0.9.8/concepts/logging.html index 52a277dac..0373ff851 100644 --- a/docs/0.9.8/concepts/logging.html +++ b/docs/0.9.8/concepts/logging.html @@ -4,7 +4,7 @@ Logging | Serverpod - + diff --git a/docs/0.9.8/concepts/modules.html b/docs/0.9.8/concepts/modules.html index 3bfdb0221..62843da66 100644 --- a/docs/0.9.8/concepts/modules.html +++ b/docs/0.9.8/concepts/modules.html @@ -4,7 +4,7 @@ Modules | Serverpod - + diff --git a/docs/0.9.8/concepts/serialization.html b/docs/0.9.8/concepts/serialization.html index 73301c902..78b33f1bb 100644 --- a/docs/0.9.8/concepts/serialization.html +++ b/docs/0.9.8/concepts/serialization.html @@ -4,7 +4,7 @@ Serialization | Serverpod - + diff --git a/docs/0.9.8/concepts/streams.html b/docs/0.9.8/concepts/streams.html index e3f2156c6..40f44979e 100644 --- a/docs/0.9.8/concepts/streams.html +++ b/docs/0.9.8/concepts/streams.html @@ -4,7 +4,7 @@ Streams and messaging | Serverpod - + diff --git a/docs/0.9.8/concepts/working-with-endpoints.html b/docs/0.9.8/concepts/working-with-endpoints.html index de01c08a7..24af4af2e 100644 --- a/docs/0.9.8/concepts/working-with-endpoints.html +++ b/docs/0.9.8/concepts/working-with-endpoints.html @@ -4,7 +4,7 @@ Working with endpoints | Serverpod - + diff --git a/docs/0.9.8/contribute.html b/docs/0.9.8/contribute.html index 7949179da..fcce68b8d 100644 --- a/docs/0.9.8/contribute.html +++ b/docs/0.9.8/contribute.html @@ -4,7 +4,7 @@ Contribute | Serverpod - + diff --git a/docs/0.9.8/deployments/deploying-to-aws.html b/docs/0.9.8/deployments/deploying-to-aws.html index 83688d193..220a54084 100644 --- a/docs/0.9.8/deployments/deploying-to-aws.html +++ b/docs/0.9.8/deployments/deploying-to-aws.html @@ -4,7 +4,7 @@ Deploying to AWS | Serverpod - + diff --git a/docs/0.9.8/deployments/general.html b/docs/0.9.8/deployments/general.html index 721ebc073..ed6511f7a 100644 --- a/docs/0.9.8/deployments/general.html +++ b/docs/0.9.8/deployments/general.html @@ -4,7 +4,7 @@ General notes | Serverpod - + diff --git a/docs/0.9.8/roadmap.html b/docs/0.9.8/roadmap.html index 469de3acd..c240be197 100644 --- a/docs/0.9.8/roadmap.html +++ b/docs/0.9.8/roadmap.html @@ -4,7 +4,7 @@ Roadmap | Serverpod - + diff --git a/docs/0.9.8/support.html b/docs/0.9.8/support.html index 142859f11..4cc87d411 100644 --- a/docs/0.9.8/support.html +++ b/docs/0.9.8/support.html @@ -4,7 +4,7 @@ Support | Serverpod - + diff --git a/docs/0.9.9.html b/docs/0.9.9.html index ccd4ac7bb..10fd379da 100644 --- a/docs/0.9.9.html +++ b/docs/0.9.9.html @@ -4,7 +4,7 @@ Get started | Serverpod - + diff --git a/docs/0.9.9/capabilities.html b/docs/0.9.9/capabilities.html index ccbc59179..905fdc5ec 100644 --- a/docs/0.9.9/capabilities.html +++ b/docs/0.9.9/capabilities.html @@ -4,7 +4,7 @@ Capabilities | Serverpod - + diff --git a/docs/0.9.9/concepts/authentication.html b/docs/0.9.9/concepts/authentication.html index a3c975178..e20a7e081 100644 --- a/docs/0.9.9/concepts/authentication.html +++ b/docs/0.9.9/concepts/authentication.html @@ -4,7 +4,7 @@ Authentication | Serverpod - + diff --git a/docs/0.9.9/concepts/caching.html b/docs/0.9.9/concepts/caching.html index 7e9d94055..6f5e063fb 100644 --- a/docs/0.9.9/concepts/caching.html +++ b/docs/0.9.9/concepts/caching.html @@ -4,7 +4,7 @@ Caching | Serverpod - + diff --git a/docs/0.9.9/concepts/database-communication.html b/docs/0.9.9/concepts/database-communication.html index 3470b2b15..40866f807 100644 --- a/docs/0.9.9/concepts/database-communication.html +++ b/docs/0.9.9/concepts/database-communication.html @@ -4,7 +4,7 @@ Database communication | Serverpod - + diff --git a/docs/0.9.9/concepts/file-uploads.html b/docs/0.9.9/concepts/file-uploads.html index 93f42c29c..ff9a8d75c 100644 --- a/docs/0.9.9/concepts/file-uploads.html +++ b/docs/0.9.9/concepts/file-uploads.html @@ -4,7 +4,7 @@ Uploading files | Serverpod - + diff --git a/docs/0.9.9/concepts/logging.html b/docs/0.9.9/concepts/logging.html index 945ee2530..3ca8ba1ae 100644 --- a/docs/0.9.9/concepts/logging.html +++ b/docs/0.9.9/concepts/logging.html @@ -4,7 +4,7 @@ Logging | Serverpod - + diff --git a/docs/0.9.9/concepts/modules.html b/docs/0.9.9/concepts/modules.html index 5385cfe68..4f5a9e7f5 100644 --- a/docs/0.9.9/concepts/modules.html +++ b/docs/0.9.9/concepts/modules.html @@ -4,7 +4,7 @@ Modules | Serverpod - + diff --git a/docs/0.9.9/concepts/serialization.html b/docs/0.9.9/concepts/serialization.html index bcdbd9e8f..b8111a068 100644 --- a/docs/0.9.9/concepts/serialization.html +++ b/docs/0.9.9/concepts/serialization.html @@ -4,7 +4,7 @@ Serialization | Serverpod - + diff --git a/docs/0.9.9/concepts/streams.html b/docs/0.9.9/concepts/streams.html index b3c241cf0..3494d8ef0 100644 --- a/docs/0.9.9/concepts/streams.html +++ b/docs/0.9.9/concepts/streams.html @@ -4,7 +4,7 @@ Streams and messaging | Serverpod - + diff --git a/docs/0.9.9/concepts/webserver.html b/docs/0.9.9/concepts/webserver.html index 91efb5dc3..cad6dcfbf 100644 --- a/docs/0.9.9/concepts/webserver.html +++ b/docs/0.9.9/concepts/webserver.html @@ -4,7 +4,7 @@ Web server | Serverpod - + diff --git a/docs/0.9.9/concepts/working-with-endpoints.html b/docs/0.9.9/concepts/working-with-endpoints.html index dd896e0b5..44deabe09 100644 --- a/docs/0.9.9/concepts/working-with-endpoints.html +++ b/docs/0.9.9/concepts/working-with-endpoints.html @@ -4,7 +4,7 @@ Working with endpoints | Serverpod - + diff --git a/docs/0.9.9/contribute.html b/docs/0.9.9/contribute.html index 8576ac564..442cc34d7 100644 --- a/docs/0.9.9/contribute.html +++ b/docs/0.9.9/contribute.html @@ -4,7 +4,7 @@ Contribute | Serverpod - + diff --git a/docs/0.9.9/deployments/deploying-to-aws.html b/docs/0.9.9/deployments/deploying-to-aws.html index a467d9aaa..2e4831789 100644 --- a/docs/0.9.9/deployments/deploying-to-aws.html +++ b/docs/0.9.9/deployments/deploying-to-aws.html @@ -4,7 +4,7 @@ Deploying to AWS | Serverpod - + diff --git a/docs/0.9.9/deployments/general.html b/docs/0.9.9/deployments/general.html index 3670249ae..01e8f7061 100644 --- a/docs/0.9.9/deployments/general.html +++ b/docs/0.9.9/deployments/general.html @@ -4,7 +4,7 @@ General notes | Serverpod - + diff --git a/docs/0.9.9/roadmap.html b/docs/0.9.9/roadmap.html index bd151061f..579b98ca1 100644 --- a/docs/0.9.9/roadmap.html +++ b/docs/0.9.9/roadmap.html @@ -4,7 +4,7 @@ Roadmap | Serverpod - + diff --git a/docs/0.9.9/support.html b/docs/0.9.9/support.html index 258c0ec79..e29367084 100644 --- a/docs/0.9.9/support.html +++ b/docs/0.9.9/support.html @@ -4,7 +4,7 @@ Support & community | Serverpod - + diff --git a/docs/1.0.0.html b/docs/1.0.0.html index 131ecb1d6..8034edd58 100644 --- a/docs/1.0.0.html +++ b/docs/1.0.0.html @@ -4,7 +4,7 @@ Get started | Serverpod - + diff --git a/docs/1.0.0/capabilities.html b/docs/1.0.0/capabilities.html index 5c42a8718..674a448fb 100644 --- a/docs/1.0.0/capabilities.html +++ b/docs/1.0.0/capabilities.html @@ -4,7 +4,7 @@ Capabilities | Serverpod - + diff --git a/docs/1.0.0/concepts/authentication.html b/docs/1.0.0/concepts/authentication.html index f19682936..691eec65f 100644 --- a/docs/1.0.0/concepts/authentication.html +++ b/docs/1.0.0/concepts/authentication.html @@ -4,7 +4,7 @@ Authentication | Serverpod - + diff --git a/docs/1.0.0/concepts/backward-compatibility.html b/docs/1.0.0/concepts/backward-compatibility.html index e872def2b..2ffa24061 100644 --- a/docs/1.0.0/concepts/backward-compatibility.html +++ b/docs/1.0.0/concepts/backward-compatibility.html @@ -4,7 +4,7 @@ Backward compatibility | Serverpod - + diff --git a/docs/1.0.0/concepts/caching.html b/docs/1.0.0/concepts/caching.html index 8a1fa80e7..cd1490e2e 100644 --- a/docs/1.0.0/concepts/caching.html +++ b/docs/1.0.0/concepts/caching.html @@ -4,7 +4,7 @@ Caching | Serverpod - + diff --git a/docs/1.0.0/concepts/database-communication.html b/docs/1.0.0/concepts/database-communication.html index b89a4f14e..859f66a4f 100644 --- a/docs/1.0.0/concepts/database-communication.html +++ b/docs/1.0.0/concepts/database-communication.html @@ -4,7 +4,7 @@ Database communication | Serverpod - + diff --git a/docs/1.0.0/concepts/file-uploads.html b/docs/1.0.0/concepts/file-uploads.html index 01ef6e170..d1cce0807 100644 --- a/docs/1.0.0/concepts/file-uploads.html +++ b/docs/1.0.0/concepts/file-uploads.html @@ -4,7 +4,7 @@ Uploading files | Serverpod - + diff --git a/docs/1.0.0/concepts/health-checks.html b/docs/1.0.0/concepts/health-checks.html index 727e5153c..bd11f234e 100644 --- a/docs/1.0.0/concepts/health-checks.html +++ b/docs/1.0.0/concepts/health-checks.html @@ -4,7 +4,7 @@ Health checks | Serverpod - + diff --git a/docs/1.0.0/concepts/logging.html b/docs/1.0.0/concepts/logging.html index 1513412bf..9e11f2c50 100644 --- a/docs/1.0.0/concepts/logging.html +++ b/docs/1.0.0/concepts/logging.html @@ -4,7 +4,7 @@ Logging | Serverpod - + diff --git a/docs/1.0.0/concepts/modules.html b/docs/1.0.0/concepts/modules.html index 6ddc35ffe..23dd4ade8 100644 --- a/docs/1.0.0/concepts/modules.html +++ b/docs/1.0.0/concepts/modules.html @@ -4,7 +4,7 @@ Modules | Serverpod - + diff --git a/docs/1.0.0/concepts/serialization.html b/docs/1.0.0/concepts/serialization.html index 3c5409c68..a7d089f94 100644 --- a/docs/1.0.0/concepts/serialization.html +++ b/docs/1.0.0/concepts/serialization.html @@ -4,7 +4,7 @@ Serialization | Serverpod - + diff --git a/docs/1.0.0/concepts/streams.html b/docs/1.0.0/concepts/streams.html index 4266228bc..aef801ad6 100644 --- a/docs/1.0.0/concepts/streams.html +++ b/docs/1.0.0/concepts/streams.html @@ -4,7 +4,7 @@ Streams and messaging | Serverpod - + diff --git a/docs/1.0.0/concepts/webserver.html b/docs/1.0.0/concepts/webserver.html index 9ae7f6042..3d5ad0621 100644 --- a/docs/1.0.0/concepts/webserver.html +++ b/docs/1.0.0/concepts/webserver.html @@ -4,7 +4,7 @@ Web server | Serverpod - + diff --git a/docs/1.0.0/concepts/working-with-endpoints.html b/docs/1.0.0/concepts/working-with-endpoints.html index 333aed515..0806b4344 100644 --- a/docs/1.0.0/concepts/working-with-endpoints.html +++ b/docs/1.0.0/concepts/working-with-endpoints.html @@ -4,7 +4,7 @@ Working with endpoints | Serverpod - + diff --git a/docs/1.0.0/contribute.html b/docs/1.0.0/contribute.html index d3f458e92..65c3e9576 100644 --- a/docs/1.0.0/contribute.html +++ b/docs/1.0.0/contribute.html @@ -4,7 +4,7 @@ Contribute | Serverpod - + diff --git a/docs/1.0.0/deployments/deploying-to-aws.html b/docs/1.0.0/deployments/deploying-to-aws.html index 26d2b5f0c..63d684bfb 100644 --- a/docs/1.0.0/deployments/deploying-to-aws.html +++ b/docs/1.0.0/deployments/deploying-to-aws.html @@ -4,7 +4,7 @@ Deploying to AWS | Serverpod - + diff --git a/docs/1.0.0/deployments/general.html b/docs/1.0.0/deployments/general.html index 9061b3773..e7f238aad 100644 --- a/docs/1.0.0/deployments/general.html +++ b/docs/1.0.0/deployments/general.html @@ -4,7 +4,7 @@ General notes | Serverpod - + diff --git a/docs/1.0.0/roadmap.html b/docs/1.0.0/roadmap.html index 5bbb09b54..b023e792a 100644 --- a/docs/1.0.0/roadmap.html +++ b/docs/1.0.0/roadmap.html @@ -4,7 +4,7 @@ Roadmap | Serverpod - + diff --git a/docs/1.0.0/support.html b/docs/1.0.0/support.html index e84156bd2..869339031 100644 --- a/docs/1.0.0/support.html +++ b/docs/1.0.0/support.html @@ -4,7 +4,7 @@ Support & community | Serverpod - + diff --git a/docs/1.0.0/tutorials.html b/docs/1.0.0/tutorials.html index cc33150c0..49b635c98 100644 --- a/docs/1.0.0/tutorials.html +++ b/docs/1.0.0/tutorials.html @@ -4,7 +4,7 @@ Tutorials & Examples | Serverpod - + diff --git a/docs/1.1.0.html b/docs/1.1.0.html index b4e62178d..e87a20768 100644 --- a/docs/1.1.0.html +++ b/docs/1.1.0.html @@ -4,7 +4,7 @@ Get started | Serverpod - + diff --git a/docs/1.1.0/capabilities.html b/docs/1.1.0/capabilities.html index 5fca07cbc..a72d0f003 100644 --- a/docs/1.1.0/capabilities.html +++ b/docs/1.1.0/capabilities.html @@ -4,7 +4,7 @@ Capabilities | Serverpod - + diff --git a/docs/1.1.0/concepts/authentication.html b/docs/1.1.0/concepts/authentication.html index ebb290963..d12c3a4e5 100644 --- a/docs/1.1.0/concepts/authentication.html +++ b/docs/1.1.0/concepts/authentication.html @@ -4,7 +4,7 @@ Authentication | Serverpod - + diff --git a/docs/1.1.0/concepts/backward-compatibility.html b/docs/1.1.0/concepts/backward-compatibility.html index 8c7f3a4ce..798d8ea23 100644 --- a/docs/1.1.0/concepts/backward-compatibility.html +++ b/docs/1.1.0/concepts/backward-compatibility.html @@ -4,7 +4,7 @@ Backward compatibility | Serverpod - + diff --git a/docs/1.1.0/concepts/caching.html b/docs/1.1.0/concepts/caching.html index 68effd68b..1f60e02d7 100644 --- a/docs/1.1.0/concepts/caching.html +++ b/docs/1.1.0/concepts/caching.html @@ -4,7 +4,7 @@ Caching | Serverpod - + diff --git a/docs/1.1.0/concepts/database-communication.html b/docs/1.1.0/concepts/database-communication.html index 2aa59e5f3..97a302522 100644 --- a/docs/1.1.0/concepts/database-communication.html +++ b/docs/1.1.0/concepts/database-communication.html @@ -4,7 +4,7 @@ Database communication | Serverpod - + diff --git a/docs/1.1.0/concepts/exceptions.html b/docs/1.1.0/concepts/exceptions.html index db30270aa..263b2e2d3 100644 --- a/docs/1.1.0/concepts/exceptions.html +++ b/docs/1.1.0/concepts/exceptions.html @@ -4,7 +4,7 @@ Error handling and exceptions | Serverpod - + diff --git a/docs/1.1.0/concepts/file-uploads.html b/docs/1.1.0/concepts/file-uploads.html index 814e87f32..95ac5627b 100644 --- a/docs/1.1.0/concepts/file-uploads.html +++ b/docs/1.1.0/concepts/file-uploads.html @@ -4,7 +4,7 @@ Uploading files | Serverpod - + diff --git a/docs/1.1.0/concepts/health-checks.html b/docs/1.1.0/concepts/health-checks.html index 46bee01a8..128b4eb1e 100644 --- a/docs/1.1.0/concepts/health-checks.html +++ b/docs/1.1.0/concepts/health-checks.html @@ -4,7 +4,7 @@ Health checks | Serverpod - + diff --git a/docs/1.1.0/concepts/logging.html b/docs/1.1.0/concepts/logging.html index 6c4f8e371..84b265710 100644 --- a/docs/1.1.0/concepts/logging.html +++ b/docs/1.1.0/concepts/logging.html @@ -4,7 +4,7 @@ Logging | Serverpod - + diff --git a/docs/1.1.0/concepts/modules.html b/docs/1.1.0/concepts/modules.html index b427223e2..89575312a 100644 --- a/docs/1.1.0/concepts/modules.html +++ b/docs/1.1.0/concepts/modules.html @@ -4,7 +4,7 @@ Modules | Serverpod - + diff --git a/docs/1.1.0/concepts/serialization.html b/docs/1.1.0/concepts/serialization.html index cbfa986b2..4d651f4bf 100644 --- a/docs/1.1.0/concepts/serialization.html +++ b/docs/1.1.0/concepts/serialization.html @@ -4,7 +4,7 @@ Serialization | Serverpod - + diff --git a/docs/1.1.0/concepts/sessions.html b/docs/1.1.0/concepts/sessions.html index 68448e768..ab5cfaabc 100644 --- a/docs/1.1.0/concepts/sessions.html +++ b/docs/1.1.0/concepts/sessions.html @@ -4,7 +4,7 @@ Sessions | Serverpod - + diff --git a/docs/1.1.0/concepts/streams.html b/docs/1.1.0/concepts/streams.html index 59e019d0d..f43ef008c 100644 --- a/docs/1.1.0/concepts/streams.html +++ b/docs/1.1.0/concepts/streams.html @@ -4,7 +4,7 @@ Streams and messaging | Serverpod - + diff --git a/docs/1.1.0/concepts/webserver.html b/docs/1.1.0/concepts/webserver.html index 66efc3a0b..33a27c155 100644 --- a/docs/1.1.0/concepts/webserver.html +++ b/docs/1.1.0/concepts/webserver.html @@ -4,7 +4,7 @@ Web server | Serverpod - + diff --git a/docs/1.1.0/concepts/working-with-endpoints.html b/docs/1.1.0/concepts/working-with-endpoints.html index 9672f4f18..68b5553b5 100644 --- a/docs/1.1.0/concepts/working-with-endpoints.html +++ b/docs/1.1.0/concepts/working-with-endpoints.html @@ -4,7 +4,7 @@ Working with endpoints | Serverpod - + diff --git a/docs/1.1.0/contribute.html b/docs/1.1.0/contribute.html index ec36a37a2..dae135364 100644 --- a/docs/1.1.0/contribute.html +++ b/docs/1.1.0/contribute.html @@ -4,7 +4,7 @@ Contribute | Serverpod - + diff --git a/docs/1.1.0/deployments/deploying-to-aws.html b/docs/1.1.0/deployments/deploying-to-aws.html index 9645a9cf2..d90f9f6ba 100644 --- a/docs/1.1.0/deployments/deploying-to-aws.html +++ b/docs/1.1.0/deployments/deploying-to-aws.html @@ -4,7 +4,7 @@ AWS EC2 with Terraform | Serverpod - + diff --git a/docs/1.1.0/deployments/deploying-to-gce-terraform.html b/docs/1.1.0/deployments/deploying-to-gce-terraform.html index 959aee951..be3e0f03a 100644 --- a/docs/1.1.0/deployments/deploying-to-gce-terraform.html +++ b/docs/1.1.0/deployments/deploying-to-gce-terraform.html @@ -4,7 +4,7 @@ Google Cloud Engine with Terraform | Serverpod - + diff --git a/docs/1.1.0/deployments/deploying-to-gcr-console.html b/docs/1.1.0/deployments/deploying-to-gcr-console.html index 819cb53d0..ef6083a3d 100644 --- a/docs/1.1.0/deployments/deploying-to-gcr-console.html +++ b/docs/1.1.0/deployments/deploying-to-gcr-console.html @@ -4,7 +4,7 @@ Google Cloud Run with CGP Console | Serverpod - + diff --git a/docs/1.1.0/deployments/deployment-strategy.html b/docs/1.1.0/deployments/deployment-strategy.html index 4db76c38c..2cf702a2f 100644 --- a/docs/1.1.0/deployments/deployment-strategy.html +++ b/docs/1.1.0/deployments/deployment-strategy.html @@ -4,7 +4,7 @@ Choosing deployment strategy | Serverpod - + diff --git a/docs/1.1.0/deployments/general.html b/docs/1.1.0/deployments/general.html index f0060802a..8612dc964 100644 --- a/docs/1.1.0/deployments/general.html +++ b/docs/1.1.0/deployments/general.html @@ -4,7 +4,7 @@ Hosting elsewhere | Serverpod - + diff --git a/docs/1.1.0/insights.html b/docs/1.1.0/insights.html index db38ba0da..76716a542 100644 --- a/docs/1.1.0/insights.html +++ b/docs/1.1.0/insights.html @@ -4,7 +4,7 @@ Serverpod Insights | Serverpod - + diff --git a/docs/1.1.0/roadmap.html b/docs/1.1.0/roadmap.html index d9e172e3b..c0818ae02 100644 --- a/docs/1.1.0/roadmap.html +++ b/docs/1.1.0/roadmap.html @@ -4,7 +4,7 @@ Roadmap | Serverpod - + diff --git a/docs/1.1.0/support.html b/docs/1.1.0/support.html index 751bb9511..b03aa8e37 100644 --- a/docs/1.1.0/support.html +++ b/docs/1.1.0/support.html @@ -4,7 +4,7 @@ Support & community | Serverpod - + diff --git a/docs/1.1.0/tutorials.html b/docs/1.1.0/tutorials.html index 55f3c0e10..ec334b49f 100644 --- a/docs/1.1.0/tutorials.html +++ b/docs/1.1.0/tutorials.html @@ -4,7 +4,7 @@ Tutorials & Examples | Serverpod - + diff --git a/docs/1.1.1.html b/docs/1.1.1.html index f8ea2b73f..32b51764f 100644 --- a/docs/1.1.1.html +++ b/docs/1.1.1.html @@ -4,7 +4,7 @@ Installing Serverpod | Serverpod - + diff --git a/docs/1.1.1/capabilities.html b/docs/1.1.1/capabilities.html index a672a66dd..462d59db3 100644 --- a/docs/1.1.1/capabilities.html +++ b/docs/1.1.1/capabilities.html @@ -4,7 +4,7 @@ Capabilities | Serverpod - + diff --git a/docs/1.1.1/concepts/authentication/basics.html b/docs/1.1.1/concepts/authentication/basics.html index 0cf4da7a4..3945680fd 100644 --- a/docs/1.1.1/concepts/authentication/basics.html +++ b/docs/1.1.1/concepts/authentication/basics.html @@ -4,7 +4,7 @@ The basics | Serverpod - + diff --git a/docs/1.1.1/concepts/authentication/providers/apple.html b/docs/1.1.1/concepts/authentication/providers/apple.html index 96d0102e9..23f4bba3f 100644 --- a/docs/1.1.1/concepts/authentication/providers/apple.html +++ b/docs/1.1.1/concepts/authentication/providers/apple.html @@ -4,7 +4,7 @@ Apple | Serverpod - + diff --git a/docs/1.1.1/concepts/authentication/providers/email.html b/docs/1.1.1/concepts/authentication/providers/email.html index 393e4e84b..4199a5e82 100644 --- a/docs/1.1.1/concepts/authentication/providers/email.html +++ b/docs/1.1.1/concepts/authentication/providers/email.html @@ -4,7 +4,7 @@ Email | Serverpod - + diff --git a/docs/1.1.1/concepts/authentication/providers/firebase.html b/docs/1.1.1/concepts/authentication/providers/firebase.html index b9ffaf79e..72a049fb9 100644 --- a/docs/1.1.1/concepts/authentication/providers/firebase.html +++ b/docs/1.1.1/concepts/authentication/providers/firebase.html @@ -4,7 +4,7 @@ Firebase | Serverpod - + diff --git a/docs/1.1.1/concepts/authentication/providers/google.html b/docs/1.1.1/concepts/authentication/providers/google.html index e98a63b97..a9421d6d8 100644 --- a/docs/1.1.1/concepts/authentication/providers/google.html +++ b/docs/1.1.1/concepts/authentication/providers/google.html @@ -4,7 +4,7 @@ Google | Serverpod - + diff --git a/docs/1.1.1/concepts/authentication/setup.html b/docs/1.1.1/concepts/authentication/setup.html index f68e817db..16b605f61 100644 --- a/docs/1.1.1/concepts/authentication/setup.html +++ b/docs/1.1.1/concepts/authentication/setup.html @@ -4,7 +4,7 @@ Setup | Serverpod - + diff --git a/docs/1.1.1/concepts/authentication/working-with-users.html b/docs/1.1.1/concepts/authentication/working-with-users.html index 280a8b028..fe0d869fc 100644 --- a/docs/1.1.1/concepts/authentication/working-with-users.html +++ b/docs/1.1.1/concepts/authentication/working-with-users.html @@ -4,7 +4,7 @@ Working with users | Serverpod - + diff --git a/docs/1.1.1/concepts/backward-compatibility.html b/docs/1.1.1/concepts/backward-compatibility.html index 6f4d2d41f..3e31f910c 100644 --- a/docs/1.1.1/concepts/backward-compatibility.html +++ b/docs/1.1.1/concepts/backward-compatibility.html @@ -4,7 +4,7 @@ Backward compatibility | Serverpod - + diff --git a/docs/1.1.1/concepts/caching.html b/docs/1.1.1/concepts/caching.html index d34467cd4..49dda3a1d 100644 --- a/docs/1.1.1/concepts/caching.html +++ b/docs/1.1.1/concepts/caching.html @@ -4,7 +4,7 @@ Caching | Serverpod - + diff --git a/docs/1.1.1/concepts/database-communication.html b/docs/1.1.1/concepts/database-communication.html index 77abf1b14..ae95f2715 100644 --- a/docs/1.1.1/concepts/database-communication.html +++ b/docs/1.1.1/concepts/database-communication.html @@ -4,7 +4,7 @@ Database communication | Serverpod - + diff --git a/docs/1.1.1/concepts/exceptions.html b/docs/1.1.1/concepts/exceptions.html index 9a510aa1c..f904f856b 100644 --- a/docs/1.1.1/concepts/exceptions.html +++ b/docs/1.1.1/concepts/exceptions.html @@ -4,7 +4,7 @@ Error handling and exceptions | Serverpod - + diff --git a/docs/1.1.1/concepts/file-uploads.html b/docs/1.1.1/concepts/file-uploads.html index 998e3d630..ea0f9921c 100644 --- a/docs/1.1.1/concepts/file-uploads.html +++ b/docs/1.1.1/concepts/file-uploads.html @@ -4,7 +4,7 @@ Uploading files | Serverpod - + diff --git a/docs/1.1.1/concepts/health-checks.html b/docs/1.1.1/concepts/health-checks.html index 1fb2c127f..43a841386 100644 --- a/docs/1.1.1/concepts/health-checks.html +++ b/docs/1.1.1/concepts/health-checks.html @@ -4,7 +4,7 @@ Health checks | Serverpod - + diff --git a/docs/1.1.1/concepts/logging.html b/docs/1.1.1/concepts/logging.html index 2df3e9b5b..a50c2278f 100644 --- a/docs/1.1.1/concepts/logging.html +++ b/docs/1.1.1/concepts/logging.html @@ -4,7 +4,7 @@ Logging | Serverpod - + diff --git a/docs/1.1.1/concepts/modules.html b/docs/1.1.1/concepts/modules.html index b5616bd01..8787eea48 100644 --- a/docs/1.1.1/concepts/modules.html +++ b/docs/1.1.1/concepts/modules.html @@ -4,7 +4,7 @@ Modules | Serverpod - + diff --git a/docs/1.1.1/concepts/serialization.html b/docs/1.1.1/concepts/serialization.html index b8b991b1b..7e7b80abd 100644 --- a/docs/1.1.1/concepts/serialization.html +++ b/docs/1.1.1/concepts/serialization.html @@ -4,7 +4,7 @@ Serialization | Serverpod - + diff --git a/docs/1.1.1/concepts/sessions.html b/docs/1.1.1/concepts/sessions.html index c52fc9161..704b46da9 100644 --- a/docs/1.1.1/concepts/sessions.html +++ b/docs/1.1.1/concepts/sessions.html @@ -4,7 +4,7 @@ Sessions | Serverpod - + diff --git a/docs/1.1.1/concepts/streams.html b/docs/1.1.1/concepts/streams.html index da4c70cda..65dce740f 100644 --- a/docs/1.1.1/concepts/streams.html +++ b/docs/1.1.1/concepts/streams.html @@ -4,7 +4,7 @@ Streams and messaging | Serverpod - + diff --git a/docs/1.1.1/concepts/webserver.html b/docs/1.1.1/concepts/webserver.html index 91e88a5c3..babfc02d2 100644 --- a/docs/1.1.1/concepts/webserver.html +++ b/docs/1.1.1/concepts/webserver.html @@ -4,7 +4,7 @@ Web server | Serverpod - + diff --git a/docs/1.1.1/concepts/working-with-endpoints.html b/docs/1.1.1/concepts/working-with-endpoints.html index ee7fc6d73..3b04d5ed7 100644 --- a/docs/1.1.1/concepts/working-with-endpoints.html +++ b/docs/1.1.1/concepts/working-with-endpoints.html @@ -4,7 +4,7 @@ Working with endpoints | Serverpod - + diff --git a/docs/1.1.1/contribute.html b/docs/1.1.1/contribute.html index 20dae2e48..82c9b53ff 100644 --- a/docs/1.1.1/contribute.html +++ b/docs/1.1.1/contribute.html @@ -4,7 +4,7 @@ Contribute | Serverpod - + diff --git a/docs/1.1.1/deployments/deploying-to-aws.html b/docs/1.1.1/deployments/deploying-to-aws.html index 25e0cd6be..ba0b7642e 100644 --- a/docs/1.1.1/deployments/deploying-to-aws.html +++ b/docs/1.1.1/deployments/deploying-to-aws.html @@ -4,7 +4,7 @@ AWS EC2 with Terraform | Serverpod - + diff --git a/docs/1.1.1/deployments/deploying-to-gce-terraform.html b/docs/1.1.1/deployments/deploying-to-gce-terraform.html index 7cbf261d6..ce6f68cb7 100644 --- a/docs/1.1.1/deployments/deploying-to-gce-terraform.html +++ b/docs/1.1.1/deployments/deploying-to-gce-terraform.html @@ -4,7 +4,7 @@ Google Cloud Engine with Terraform | Serverpod - + diff --git a/docs/1.1.1/deployments/deploying-to-gcr-console.html b/docs/1.1.1/deployments/deploying-to-gcr-console.html index 1083287f5..e38c3147b 100644 --- a/docs/1.1.1/deployments/deploying-to-gcr-console.html +++ b/docs/1.1.1/deployments/deploying-to-gcr-console.html @@ -4,7 +4,7 @@ Google Cloud Run with CGP Console | Serverpod - + diff --git a/docs/1.1.1/deployments/deployment-strategy.html b/docs/1.1.1/deployments/deployment-strategy.html index 8f0f07630..74531c8c8 100644 --- a/docs/1.1.1/deployments/deployment-strategy.html +++ b/docs/1.1.1/deployments/deployment-strategy.html @@ -4,7 +4,7 @@ Choosing deployment strategy | Serverpod - + diff --git a/docs/1.1.1/deployments/general.html b/docs/1.1.1/deployments/general.html index d28b68906..43375e8cc 100644 --- a/docs/1.1.1/deployments/general.html +++ b/docs/1.1.1/deployments/general.html @@ -4,7 +4,7 @@ Hosting elsewhere | Serverpod - + diff --git a/docs/1.1.1/get-started.html b/docs/1.1.1/get-started.html index 694c5eee5..bd0dff4df 100644 --- a/docs/1.1.1/get-started.html +++ b/docs/1.1.1/get-started.html @@ -4,7 +4,7 @@ Get started | Serverpod - + diff --git a/docs/1.1.1/insights.html b/docs/1.1.1/insights.html index 8cf791bfd..27288eecd 100644 --- a/docs/1.1.1/insights.html +++ b/docs/1.1.1/insights.html @@ -4,7 +4,7 @@ Serverpod Insights | Serverpod - + diff --git a/docs/1.1.1/roadmap.html b/docs/1.1.1/roadmap.html index 4cbde59cc..8351dc50a 100644 --- a/docs/1.1.1/roadmap.html +++ b/docs/1.1.1/roadmap.html @@ -4,7 +4,7 @@ Roadmap | Serverpod - + diff --git a/docs/1.1.1/support.html b/docs/1.1.1/support.html index 790eceb24..0e8d05ce7 100644 --- a/docs/1.1.1/support.html +++ b/docs/1.1.1/support.html @@ -4,7 +4,7 @@ Support & community | Serverpod - + diff --git a/docs/1.1.1/tutorials/authentication.html b/docs/1.1.1/tutorials/authentication.html index 680182582..84676ff83 100644 --- a/docs/1.1.1/tutorials/authentication.html +++ b/docs/1.1.1/tutorials/authentication.html @@ -4,7 +4,7 @@ Authentication | Serverpod - + diff --git a/docs/1.1.1/tutorials/code-example.html b/docs/1.1.1/tutorials/code-example.html index 3a9627844..57509d51b 100644 --- a/docs/1.1.1/tutorials/code-example.html +++ b/docs/1.1.1/tutorials/code-example.html @@ -4,7 +4,7 @@ Code examples | Serverpod - + diff --git a/docs/1.1.1/tutorials/first-app.html b/docs/1.1.1/tutorials/first-app.html index 206d4c1bf..e58ac8672 100644 --- a/docs/1.1.1/tutorials/first-app.html +++ b/docs/1.1.1/tutorials/first-app.html @@ -4,7 +4,7 @@ Build your first app | Serverpod - + diff --git a/docs/1.1.1/tutorials/videos.html b/docs/1.1.1/tutorials/videos.html index 79c9583a9..2a0144c80 100644 --- a/docs/1.1.1/tutorials/videos.html +++ b/docs/1.1.1/tutorials/videos.html @@ -4,7 +4,7 @@ Videos | Serverpod - + diff --git a/docs/1.2.0.html b/docs/1.2.0.html index e29148550..97a97724d 100644 --- a/docs/1.2.0.html +++ b/docs/1.2.0.html @@ -4,7 +4,7 @@ Installing Serverpod | Serverpod - + diff --git a/docs/1.2.0/capabilities.html b/docs/1.2.0/capabilities.html index 1eb5f1390..d27ed4048 100644 --- a/docs/1.2.0/capabilities.html +++ b/docs/1.2.0/capabilities.html @@ -4,7 +4,7 @@ Capabilities | Serverpod - + diff --git a/docs/1.2.0/cli.html b/docs/1.2.0/cli.html index d6f12a4f7..74a4836b9 100644 --- a/docs/1.2.0/cli.html +++ b/docs/1.2.0/cli.html @@ -4,7 +4,7 @@ Serverpod CLI | Serverpod - + diff --git a/docs/1.2.0/concepts/authentication/basics.html b/docs/1.2.0/concepts/authentication/basics.html index 46a2efd98..707f4edfa 100644 --- a/docs/1.2.0/concepts/authentication/basics.html +++ b/docs/1.2.0/concepts/authentication/basics.html @@ -4,7 +4,7 @@ The basics | Serverpod - + diff --git a/docs/1.2.0/concepts/authentication/custom-overrides.html b/docs/1.2.0/concepts/authentication/custom-overrides.html index 5bc6b6ec4..75a9d550b 100644 --- a/docs/1.2.0/concepts/authentication/custom-overrides.html +++ b/docs/1.2.0/concepts/authentication/custom-overrides.html @@ -4,7 +4,7 @@ Custom overrides | Serverpod - + diff --git a/docs/1.2.0/concepts/authentication/providers/apple.html b/docs/1.2.0/concepts/authentication/providers/apple.html index b4115efc8..4ad6175f6 100644 --- a/docs/1.2.0/concepts/authentication/providers/apple.html +++ b/docs/1.2.0/concepts/authentication/providers/apple.html @@ -4,7 +4,7 @@ Apple | Serverpod - + diff --git a/docs/1.2.0/concepts/authentication/providers/custom-providers.html b/docs/1.2.0/concepts/authentication/providers/custom-providers.html index 3a0dbd847..4b1992dfc 100644 --- a/docs/1.2.0/concepts/authentication/providers/custom-providers.html +++ b/docs/1.2.0/concepts/authentication/providers/custom-providers.html @@ -4,7 +4,7 @@ Custom providers | Serverpod - + diff --git a/docs/1.2.0/concepts/authentication/providers/email.html b/docs/1.2.0/concepts/authentication/providers/email.html index 62cff8b92..b01a0f120 100644 --- a/docs/1.2.0/concepts/authentication/providers/email.html +++ b/docs/1.2.0/concepts/authentication/providers/email.html @@ -4,7 +4,7 @@ Email | Serverpod - + diff --git a/docs/1.2.0/concepts/authentication/providers/firebase.html b/docs/1.2.0/concepts/authentication/providers/firebase.html index ae064dff8..dd96dcb07 100644 --- a/docs/1.2.0/concepts/authentication/providers/firebase.html +++ b/docs/1.2.0/concepts/authentication/providers/firebase.html @@ -4,7 +4,7 @@ Firebase | Serverpod - + diff --git a/docs/1.2.0/concepts/authentication/providers/google.html b/docs/1.2.0/concepts/authentication/providers/google.html index 632e18153..acc1ca9a2 100644 --- a/docs/1.2.0/concepts/authentication/providers/google.html +++ b/docs/1.2.0/concepts/authentication/providers/google.html @@ -4,7 +4,7 @@ Google | Serverpod - + diff --git a/docs/1.2.0/concepts/authentication/setup.html b/docs/1.2.0/concepts/authentication/setup.html index f594275f8..089e8762e 100644 --- a/docs/1.2.0/concepts/authentication/setup.html +++ b/docs/1.2.0/concepts/authentication/setup.html @@ -4,7 +4,7 @@ Setup | Serverpod - + diff --git a/docs/1.2.0/concepts/authentication/working-with-users.html b/docs/1.2.0/concepts/authentication/working-with-users.html index d1f960a1f..c760dcafc 100644 --- a/docs/1.2.0/concepts/authentication/working-with-users.html +++ b/docs/1.2.0/concepts/authentication/working-with-users.html @@ -4,7 +4,7 @@ Working with users | Serverpod - + diff --git a/docs/1.2.0/concepts/backward-compatibility.html b/docs/1.2.0/concepts/backward-compatibility.html index 2c265cd75..b17df651b 100644 --- a/docs/1.2.0/concepts/backward-compatibility.html +++ b/docs/1.2.0/concepts/backward-compatibility.html @@ -4,7 +4,7 @@ Backward compatibility | Serverpod - + diff --git a/docs/1.2.0/concepts/caching.html b/docs/1.2.0/concepts/caching.html index 146fb2d12..58d2d410d 100644 --- a/docs/1.2.0/concepts/caching.html +++ b/docs/1.2.0/concepts/caching.html @@ -4,7 +4,7 @@ Caching | Serverpod - + diff --git a/docs/1.2.0/concepts/database/connection.html b/docs/1.2.0/concepts/database/connection.html index 0aeeab160..4fe161995 100644 --- a/docs/1.2.0/concepts/database/connection.html +++ b/docs/1.2.0/concepts/database/connection.html @@ -4,7 +4,7 @@ Connection | Serverpod - + diff --git a/docs/1.2.0/concepts/database/crud.html b/docs/1.2.0/concepts/database/crud.html index cbf868b46..53d451a9c 100644 --- a/docs/1.2.0/concepts/database/crud.html +++ b/docs/1.2.0/concepts/database/crud.html @@ -4,7 +4,7 @@ CRUD | Serverpod - + diff --git a/docs/1.2.0/concepts/database/filter.html b/docs/1.2.0/concepts/database/filter.html index e72e93f9e..5e309b290 100644 --- a/docs/1.2.0/concepts/database/filter.html +++ b/docs/1.2.0/concepts/database/filter.html @@ -4,7 +4,7 @@ Filter | Serverpod - + diff --git a/docs/1.2.0/concepts/database/indexing.html b/docs/1.2.0/concepts/database/indexing.html index 055bfbbed..7c4bbe486 100644 --- a/docs/1.2.0/concepts/database/indexing.html +++ b/docs/1.2.0/concepts/database/indexing.html @@ -4,7 +4,7 @@ Indexing | Serverpod - + diff --git a/docs/1.2.0/concepts/database/migrations.html b/docs/1.2.0/concepts/database/migrations.html index bd89bcba7..a63ce2dcd 100644 --- a/docs/1.2.0/concepts/database/migrations.html +++ b/docs/1.2.0/concepts/database/migrations.html @@ -4,7 +4,7 @@ Migrations | Serverpod - + diff --git a/docs/1.2.0/concepts/database/models.html b/docs/1.2.0/concepts/database/models.html index 1340c97a0..8eff40817 100644 --- a/docs/1.2.0/concepts/database/models.html +++ b/docs/1.2.0/concepts/database/models.html @@ -4,7 +4,7 @@ Models | Serverpod - + diff --git a/docs/1.2.0/concepts/database/pagination.html b/docs/1.2.0/concepts/database/pagination.html index 7739dd008..558107334 100644 --- a/docs/1.2.0/concepts/database/pagination.html +++ b/docs/1.2.0/concepts/database/pagination.html @@ -4,7 +4,7 @@ Pagination | Serverpod - + diff --git a/docs/1.2.0/concepts/database/raw-access.html b/docs/1.2.0/concepts/database/raw-access.html index 173abe931..032ebc4c0 100644 --- a/docs/1.2.0/concepts/database/raw-access.html +++ b/docs/1.2.0/concepts/database/raw-access.html @@ -4,7 +4,7 @@ Raw access | Serverpod - + diff --git a/docs/1.2.0/concepts/database/relation-queries.html b/docs/1.2.0/concepts/database/relation-queries.html index ab93545c6..8d5b184ca 100644 --- a/docs/1.2.0/concepts/database/relation-queries.html +++ b/docs/1.2.0/concepts/database/relation-queries.html @@ -4,7 +4,7 @@ Relation queries | Serverpod - + diff --git a/docs/1.2.0/concepts/database/relations/many-to-many.html b/docs/1.2.0/concepts/database/relations/many-to-many.html index 69d71710a..e9e097003 100644 --- a/docs/1.2.0/concepts/database/relations/many-to-many.html +++ b/docs/1.2.0/concepts/database/relations/many-to-many.html @@ -4,7 +4,7 @@ Many-to-Many | Serverpod - + diff --git a/docs/1.2.0/concepts/database/relations/modules.html b/docs/1.2.0/concepts/database/relations/modules.html index 051fe81c1..36e6e3c31 100644 --- a/docs/1.2.0/concepts/database/relations/modules.html +++ b/docs/1.2.0/concepts/database/relations/modules.html @@ -4,7 +4,7 @@ Relations with modules | Serverpod - + diff --git a/docs/1.2.0/concepts/database/relations/one-to-many.html b/docs/1.2.0/concepts/database/relations/one-to-many.html index 91bc9c192..b2b278b64 100644 --- a/docs/1.2.0/concepts/database/relations/one-to-many.html +++ b/docs/1.2.0/concepts/database/relations/one-to-many.html @@ -4,7 +4,7 @@ One-to-many | Serverpod - + diff --git a/docs/1.2.0/concepts/database/relations/one-to-one.html b/docs/1.2.0/concepts/database/relations/one-to-one.html index 2273aee3b..4cbf5e4f7 100644 --- a/docs/1.2.0/concepts/database/relations/one-to-one.html +++ b/docs/1.2.0/concepts/database/relations/one-to-one.html @@ -4,7 +4,7 @@ One-to-one | Serverpod - + diff --git a/docs/1.2.0/concepts/database/relations/referential-actions.html b/docs/1.2.0/concepts/database/relations/referential-actions.html index c55ec8096..86a1fd7ec 100644 --- a/docs/1.2.0/concepts/database/relations/referential-actions.html +++ b/docs/1.2.0/concepts/database/relations/referential-actions.html @@ -4,7 +4,7 @@ Referential actions | Serverpod - + diff --git a/docs/1.2.0/concepts/database/relations/self-relations.html b/docs/1.2.0/concepts/database/relations/self-relations.html index 5a78b1514..a616d8202 100644 --- a/docs/1.2.0/concepts/database/relations/self-relations.html +++ b/docs/1.2.0/concepts/database/relations/self-relations.html @@ -4,7 +4,7 @@ Self-relations | Serverpod - + diff --git a/docs/1.2.0/concepts/database/sort.html b/docs/1.2.0/concepts/database/sort.html index 885775080..024620494 100644 --- a/docs/1.2.0/concepts/database/sort.html +++ b/docs/1.2.0/concepts/database/sort.html @@ -4,7 +4,7 @@ Sort | Serverpod - + diff --git a/docs/1.2.0/concepts/database/transactions.html b/docs/1.2.0/concepts/database/transactions.html index 9f491a9dc..4eb42a505 100644 --- a/docs/1.2.0/concepts/database/transactions.html +++ b/docs/1.2.0/concepts/database/transactions.html @@ -4,7 +4,7 @@ Transactions | Serverpod - + diff --git a/docs/1.2.0/concepts/exceptions.html b/docs/1.2.0/concepts/exceptions.html index 8bca1e629..f0667b29b 100644 --- a/docs/1.2.0/concepts/exceptions.html +++ b/docs/1.2.0/concepts/exceptions.html @@ -4,7 +4,7 @@ Error handling and exceptions | Serverpod - + diff --git a/docs/1.2.0/concepts/file-uploads.html b/docs/1.2.0/concepts/file-uploads.html index 840922298..d2a1b7b7f 100644 --- a/docs/1.2.0/concepts/file-uploads.html +++ b/docs/1.2.0/concepts/file-uploads.html @@ -4,7 +4,7 @@ Uploading files | Serverpod - + diff --git a/docs/1.2.0/concepts/health-checks.html b/docs/1.2.0/concepts/health-checks.html index 3c0dfeb08..ead9027de 100644 --- a/docs/1.2.0/concepts/health-checks.html +++ b/docs/1.2.0/concepts/health-checks.html @@ -4,7 +4,7 @@ Health checks | Serverpod - + diff --git a/docs/1.2.0/concepts/logging.html b/docs/1.2.0/concepts/logging.html index 12450e5a4..923ca96cf 100644 --- a/docs/1.2.0/concepts/logging.html +++ b/docs/1.2.0/concepts/logging.html @@ -4,7 +4,7 @@ Logging | Serverpod - + diff --git a/docs/1.2.0/concepts/models.html b/docs/1.2.0/concepts/models.html index d96001d00..b1d7c88f4 100644 --- a/docs/1.2.0/concepts/models.html +++ b/docs/1.2.0/concepts/models.html @@ -4,7 +4,7 @@ Working with models | Serverpod - + diff --git a/docs/1.2.0/concepts/modules.html b/docs/1.2.0/concepts/modules.html index 751902fad..370f488a4 100644 --- a/docs/1.2.0/concepts/modules.html +++ b/docs/1.2.0/concepts/modules.html @@ -4,7 +4,7 @@ Modules | Serverpod - + diff --git a/docs/1.2.0/concepts/scheduling.html b/docs/1.2.0/concepts/scheduling.html index c838e6183..e57ee9229 100644 --- a/docs/1.2.0/concepts/scheduling.html +++ b/docs/1.2.0/concepts/scheduling.html @@ -4,7 +4,7 @@ Scheduling | Serverpod - + diff --git a/docs/1.2.0/concepts/serialization.html b/docs/1.2.0/concepts/serialization.html index 37fb6c86f..ee1d38e7a 100644 --- a/docs/1.2.0/concepts/serialization.html +++ b/docs/1.2.0/concepts/serialization.html @@ -4,7 +4,7 @@ Custom serialization | Serverpod - + diff --git a/docs/1.2.0/concepts/sessions.html b/docs/1.2.0/concepts/sessions.html index 43f07ec89..55100c0c9 100644 --- a/docs/1.2.0/concepts/sessions.html +++ b/docs/1.2.0/concepts/sessions.html @@ -4,7 +4,7 @@ Sessions | Serverpod - + diff --git a/docs/1.2.0/concepts/streams.html b/docs/1.2.0/concepts/streams.html index b064a74d4..1e257f4e8 100644 --- a/docs/1.2.0/concepts/streams.html +++ b/docs/1.2.0/concepts/streams.html @@ -4,7 +4,7 @@ Streams and messaging | Serverpod - + diff --git a/docs/1.2.0/concepts/webserver.html b/docs/1.2.0/concepts/webserver.html index 49a7b1555..af82b08aa 100644 --- a/docs/1.2.0/concepts/webserver.html +++ b/docs/1.2.0/concepts/webserver.html @@ -4,7 +4,7 @@ Web server | Serverpod - + diff --git a/docs/1.2.0/concepts/working-with-endpoints.html b/docs/1.2.0/concepts/working-with-endpoints.html index ef7712f55..592b70f54 100644 --- a/docs/1.2.0/concepts/working-with-endpoints.html +++ b/docs/1.2.0/concepts/working-with-endpoints.html @@ -4,7 +4,7 @@ Working with endpoints | Serverpod - + diff --git a/docs/1.2.0/contribute.html b/docs/1.2.0/contribute.html index 4c6d47acd..07a55ccf6 100644 --- a/docs/1.2.0/contribute.html +++ b/docs/1.2.0/contribute.html @@ -4,7 +4,7 @@ Contribute | Serverpod - + diff --git a/docs/1.2.0/deployments/deploying-to-aws.html b/docs/1.2.0/deployments/deploying-to-aws.html index fdae0ac60..ba93ddf57 100644 --- a/docs/1.2.0/deployments/deploying-to-aws.html +++ b/docs/1.2.0/deployments/deploying-to-aws.html @@ -4,7 +4,7 @@ AWS EC2 with Terraform | Serverpod - + diff --git a/docs/1.2.0/deployments/deploying-to-gce-terraform.html b/docs/1.2.0/deployments/deploying-to-gce-terraform.html index 667dae8d6..db13292e1 100644 --- a/docs/1.2.0/deployments/deploying-to-gce-terraform.html +++ b/docs/1.2.0/deployments/deploying-to-gce-terraform.html @@ -4,7 +4,7 @@ Google Cloud Engine with Terraform | Serverpod - + diff --git a/docs/1.2.0/deployments/deploying-to-gcr-console.html b/docs/1.2.0/deployments/deploying-to-gcr-console.html index fcca894a9..1cd8633c1 100644 --- a/docs/1.2.0/deployments/deploying-to-gcr-console.html +++ b/docs/1.2.0/deployments/deploying-to-gcr-console.html @@ -4,7 +4,7 @@ Google Cloud Run with CGP Console | Serverpod - + diff --git a/docs/1.2.0/deployments/deployment-strategy.html b/docs/1.2.0/deployments/deployment-strategy.html index 2ea902b3c..45143e2bf 100644 --- a/docs/1.2.0/deployments/deployment-strategy.html +++ b/docs/1.2.0/deployments/deployment-strategy.html @@ -4,7 +4,7 @@ Choosing deployment strategy | Serverpod - + diff --git a/docs/1.2.0/deployments/general.html b/docs/1.2.0/deployments/general.html index 3294de5c3..4ab0a4147 100644 --- a/docs/1.2.0/deployments/general.html +++ b/docs/1.2.0/deployments/general.html @@ -4,7 +4,7 @@ Hosting elsewhere | Serverpod - + diff --git a/docs/1.2.0/get-started.html b/docs/1.2.0/get-started.html index a747d2a0d..7263d3275 100644 --- a/docs/1.2.0/get-started.html +++ b/docs/1.2.0/get-started.html @@ -4,7 +4,7 @@ Get started | Serverpod - + diff --git a/docs/1.2.0/insights.html b/docs/1.2.0/insights.html index 25591ce3a..2a2066c3e 100644 --- a/docs/1.2.0/insights.html +++ b/docs/1.2.0/insights.html @@ -4,7 +4,7 @@ Serverpod Insights | Serverpod - + diff --git a/docs/1.2.0/lsp.html b/docs/1.2.0/lsp.html index c11257c95..b658ce216 100644 --- a/docs/1.2.0/lsp.html +++ b/docs/1.2.0/lsp.html @@ -4,7 +4,7 @@ Serverpod LSP | Serverpod - + diff --git a/docs/1.2.0/roadmap.html b/docs/1.2.0/roadmap.html index 445339898..c4a991695 100644 --- a/docs/1.2.0/roadmap.html +++ b/docs/1.2.0/roadmap.html @@ -4,7 +4,7 @@ Roadmap | Serverpod - + diff --git a/docs/1.2.0/support.html b/docs/1.2.0/support.html index 5ed5a221d..68836dcf6 100644 --- a/docs/1.2.0/support.html +++ b/docs/1.2.0/support.html @@ -4,7 +4,7 @@ Support & community | Serverpod - + diff --git a/docs/1.2.0/tutorials/authentication.html b/docs/1.2.0/tutorials/authentication.html index becc52392..92b8bbaa9 100644 --- a/docs/1.2.0/tutorials/authentication.html +++ b/docs/1.2.0/tutorials/authentication.html @@ -4,7 +4,7 @@ Authentication | Serverpod - + diff --git a/docs/1.2.0/tutorials/code-example.html b/docs/1.2.0/tutorials/code-example.html index b8adcf007..9b0723f95 100644 --- a/docs/1.2.0/tutorials/code-example.html +++ b/docs/1.2.0/tutorials/code-example.html @@ -4,7 +4,7 @@ Code examples | Serverpod - + diff --git a/docs/1.2.0/tutorials/first-app.html b/docs/1.2.0/tutorials/first-app.html index 35364a066..9c5e60655 100644 --- a/docs/1.2.0/tutorials/first-app.html +++ b/docs/1.2.0/tutorials/first-app.html @@ -4,7 +4,7 @@ Build your first app | Serverpod - + diff --git a/docs/1.2.0/tutorials/videos.html b/docs/1.2.0/tutorials/videos.html index 4aa7bfb72..abaf222ab 100644 --- a/docs/1.2.0/tutorials/videos.html +++ b/docs/1.2.0/tutorials/videos.html @@ -4,7 +4,7 @@ Videos | Serverpod - + diff --git a/docs/1.2.0/upgrading/upgrade-to-one-point-two.html b/docs/1.2.0/upgrading/upgrade-to-one-point-two.html index 72633b595..1b548ab94 100644 --- a/docs/1.2.0/upgrading/upgrade-to-one-point-two.html +++ b/docs/1.2.0/upgrading/upgrade-to-one-point-two.html @@ -4,7 +4,7 @@ Upgrade to 1.2 | Serverpod - + diff --git a/docs/2.0.0.html b/docs/2.0.0.html index 821f71f9a..de4b39c64 100644 --- a/docs/2.0.0.html +++ b/docs/2.0.0.html @@ -4,7 +4,7 @@ Installing Serverpod | Serverpod - + diff --git a/docs/2.0.0/capabilities.html b/docs/2.0.0/capabilities.html index ea6e46ea3..eafbf5665 100644 --- a/docs/2.0.0/capabilities.html +++ b/docs/2.0.0/capabilities.html @@ -4,7 +4,7 @@ Capabilities | Serverpod - + diff --git a/docs/2.0.0/concepts/authentication/basics.html b/docs/2.0.0/concepts/authentication/basics.html index 37e2cb136..b839be0a4 100644 --- a/docs/2.0.0/concepts/authentication/basics.html +++ b/docs/2.0.0/concepts/authentication/basics.html @@ -4,7 +4,7 @@ The basics | Serverpod - + diff --git a/docs/2.0.0/concepts/authentication/custom-overrides.html b/docs/2.0.0/concepts/authentication/custom-overrides.html index 27a0f0318..633588d59 100644 --- a/docs/2.0.0/concepts/authentication/custom-overrides.html +++ b/docs/2.0.0/concepts/authentication/custom-overrides.html @@ -4,7 +4,7 @@ Custom overrides | Serverpod - + diff --git a/docs/2.0.0/concepts/authentication/providers/apple.html b/docs/2.0.0/concepts/authentication/providers/apple.html index 9548142dc..a53d8b2f4 100644 --- a/docs/2.0.0/concepts/authentication/providers/apple.html +++ b/docs/2.0.0/concepts/authentication/providers/apple.html @@ -4,7 +4,7 @@ Apple | Serverpod - + diff --git a/docs/2.0.0/concepts/authentication/providers/custom-providers.html b/docs/2.0.0/concepts/authentication/providers/custom-providers.html index c56f05e62..7acb4fe41 100644 --- a/docs/2.0.0/concepts/authentication/providers/custom-providers.html +++ b/docs/2.0.0/concepts/authentication/providers/custom-providers.html @@ -4,7 +4,7 @@ Custom providers | Serverpod - + diff --git a/docs/2.0.0/concepts/authentication/providers/email.html b/docs/2.0.0/concepts/authentication/providers/email.html index 3ce290be4..e00450529 100644 --- a/docs/2.0.0/concepts/authentication/providers/email.html +++ b/docs/2.0.0/concepts/authentication/providers/email.html @@ -4,7 +4,7 @@ Email | Serverpod - + diff --git a/docs/2.0.0/concepts/authentication/providers/firebase.html b/docs/2.0.0/concepts/authentication/providers/firebase.html index 966bd6487..c2d645566 100644 --- a/docs/2.0.0/concepts/authentication/providers/firebase.html +++ b/docs/2.0.0/concepts/authentication/providers/firebase.html @@ -4,7 +4,7 @@ Firebase | Serverpod - + diff --git a/docs/2.0.0/concepts/authentication/providers/google.html b/docs/2.0.0/concepts/authentication/providers/google.html index 0e75dce62..e8a8aa434 100644 --- a/docs/2.0.0/concepts/authentication/providers/google.html +++ b/docs/2.0.0/concepts/authentication/providers/google.html @@ -4,7 +4,7 @@ Google | Serverpod - + diff --git a/docs/2.0.0/concepts/authentication/setup.html b/docs/2.0.0/concepts/authentication/setup.html index e09cf8b87..2019362a1 100644 --- a/docs/2.0.0/concepts/authentication/setup.html +++ b/docs/2.0.0/concepts/authentication/setup.html @@ -4,7 +4,7 @@ Setup | Serverpod - + diff --git a/docs/2.0.0/concepts/authentication/working-with-users.html b/docs/2.0.0/concepts/authentication/working-with-users.html index 363b90ba6..b1dea3184 100644 --- a/docs/2.0.0/concepts/authentication/working-with-users.html +++ b/docs/2.0.0/concepts/authentication/working-with-users.html @@ -4,7 +4,7 @@ Working with users | Serverpod - + diff --git a/docs/2.0.0/concepts/backward-compatibility.html b/docs/2.0.0/concepts/backward-compatibility.html index cd79ae1c8..acb2a74f0 100644 --- a/docs/2.0.0/concepts/backward-compatibility.html +++ b/docs/2.0.0/concepts/backward-compatibility.html @@ -4,7 +4,7 @@ Backward compatibility | Serverpod - + diff --git a/docs/2.0.0/concepts/caching.html b/docs/2.0.0/concepts/caching.html index d113af3c4..92464d4a6 100644 --- a/docs/2.0.0/concepts/caching.html +++ b/docs/2.0.0/concepts/caching.html @@ -4,7 +4,7 @@ Caching | Serverpod - + diff --git a/docs/2.0.0/concepts/database/connection.html b/docs/2.0.0/concepts/database/connection.html index 292ced884..60d4c6116 100644 --- a/docs/2.0.0/concepts/database/connection.html +++ b/docs/2.0.0/concepts/database/connection.html @@ -4,7 +4,7 @@ Connection | Serverpod - + diff --git a/docs/2.0.0/concepts/database/crud.html b/docs/2.0.0/concepts/database/crud.html index 17566c90e..eb7c179c4 100644 --- a/docs/2.0.0/concepts/database/crud.html +++ b/docs/2.0.0/concepts/database/crud.html @@ -4,7 +4,7 @@ CRUD | Serverpod - + diff --git a/docs/2.0.0/concepts/database/filter.html b/docs/2.0.0/concepts/database/filter.html index 6649bddab..ba8f808c4 100644 --- a/docs/2.0.0/concepts/database/filter.html +++ b/docs/2.0.0/concepts/database/filter.html @@ -4,7 +4,7 @@ Filter | Serverpod - + diff --git a/docs/2.0.0/concepts/database/indexing.html b/docs/2.0.0/concepts/database/indexing.html index 9c24800f8..57cf10afb 100644 --- a/docs/2.0.0/concepts/database/indexing.html +++ b/docs/2.0.0/concepts/database/indexing.html @@ -4,7 +4,7 @@ Indexing | Serverpod - + diff --git a/docs/2.0.0/concepts/database/migrations.html b/docs/2.0.0/concepts/database/migrations.html index 31a4f6046..a40027a51 100644 --- a/docs/2.0.0/concepts/database/migrations.html +++ b/docs/2.0.0/concepts/database/migrations.html @@ -4,7 +4,7 @@ Migrations | Serverpod - + diff --git a/docs/2.0.0/concepts/database/models.html b/docs/2.0.0/concepts/database/models.html index 1002f09fb..077ce4c29 100644 --- a/docs/2.0.0/concepts/database/models.html +++ b/docs/2.0.0/concepts/database/models.html @@ -4,7 +4,7 @@ Models | Serverpod - + diff --git a/docs/2.0.0/concepts/database/pagination.html b/docs/2.0.0/concepts/database/pagination.html index 956a9ba22..77366dcf7 100644 --- a/docs/2.0.0/concepts/database/pagination.html +++ b/docs/2.0.0/concepts/database/pagination.html @@ -4,7 +4,7 @@ Pagination | Serverpod - + diff --git a/docs/2.0.0/concepts/database/raw-access.html b/docs/2.0.0/concepts/database/raw-access.html index fabbde85a..cadba7b89 100644 --- a/docs/2.0.0/concepts/database/raw-access.html +++ b/docs/2.0.0/concepts/database/raw-access.html @@ -4,7 +4,7 @@ Raw Access | Serverpod - + diff --git a/docs/2.0.0/concepts/database/relation-queries.html b/docs/2.0.0/concepts/database/relation-queries.html index c42169405..1316323e0 100644 --- a/docs/2.0.0/concepts/database/relation-queries.html +++ b/docs/2.0.0/concepts/database/relation-queries.html @@ -4,7 +4,7 @@ Relation queries | Serverpod - + diff --git a/docs/2.0.0/concepts/database/relations/many-to-many.html b/docs/2.0.0/concepts/database/relations/many-to-many.html index 40e0658d5..afdac8008 100644 --- a/docs/2.0.0/concepts/database/relations/many-to-many.html +++ b/docs/2.0.0/concepts/database/relations/many-to-many.html @@ -4,7 +4,7 @@ Many-to-Many | Serverpod - + diff --git a/docs/2.0.0/concepts/database/relations/modules.html b/docs/2.0.0/concepts/database/relations/modules.html index 00e6cad35..f52967871 100644 --- a/docs/2.0.0/concepts/database/relations/modules.html +++ b/docs/2.0.0/concepts/database/relations/modules.html @@ -4,7 +4,7 @@ Relations with modules | Serverpod - + diff --git a/docs/2.0.0/concepts/database/relations/one-to-many.html b/docs/2.0.0/concepts/database/relations/one-to-many.html index da82a5b5f..845132778 100644 --- a/docs/2.0.0/concepts/database/relations/one-to-many.html +++ b/docs/2.0.0/concepts/database/relations/one-to-many.html @@ -4,7 +4,7 @@ One-to-many | Serverpod - + diff --git a/docs/2.0.0/concepts/database/relations/one-to-one.html b/docs/2.0.0/concepts/database/relations/one-to-one.html index 0e877dc40..c3e9c4217 100644 --- a/docs/2.0.0/concepts/database/relations/one-to-one.html +++ b/docs/2.0.0/concepts/database/relations/one-to-one.html @@ -4,7 +4,7 @@ One-to-one | Serverpod - + diff --git a/docs/2.0.0/concepts/database/relations/referential-actions.html b/docs/2.0.0/concepts/database/relations/referential-actions.html index cceeb7837..7cf3affe8 100644 --- a/docs/2.0.0/concepts/database/relations/referential-actions.html +++ b/docs/2.0.0/concepts/database/relations/referential-actions.html @@ -4,7 +4,7 @@ Referential actions | Serverpod - + diff --git a/docs/2.0.0/concepts/database/relations/self-relations.html b/docs/2.0.0/concepts/database/relations/self-relations.html index d5c384078..ad9886566 100644 --- a/docs/2.0.0/concepts/database/relations/self-relations.html +++ b/docs/2.0.0/concepts/database/relations/self-relations.html @@ -4,7 +4,7 @@ Self-relations | Serverpod - + diff --git a/docs/2.0.0/concepts/database/sort.html b/docs/2.0.0/concepts/database/sort.html index 5e214811e..41c3c3bf6 100644 --- a/docs/2.0.0/concepts/database/sort.html +++ b/docs/2.0.0/concepts/database/sort.html @@ -4,7 +4,7 @@ Sort | Serverpod - + diff --git a/docs/2.0.0/concepts/database/transactions.html b/docs/2.0.0/concepts/database/transactions.html index df0e94492..6ca9c228d 100644 --- a/docs/2.0.0/concepts/database/transactions.html +++ b/docs/2.0.0/concepts/database/transactions.html @@ -4,7 +4,7 @@ Transactions | Serverpod - + diff --git a/docs/2.0.0/concepts/exceptions.html b/docs/2.0.0/concepts/exceptions.html index fb0ad4e87..e013148e1 100644 --- a/docs/2.0.0/concepts/exceptions.html +++ b/docs/2.0.0/concepts/exceptions.html @@ -4,7 +4,7 @@ Error handling and exceptions | Serverpod - + diff --git a/docs/2.0.0/concepts/file-uploads.html b/docs/2.0.0/concepts/file-uploads.html index 177277cd4..65e64760b 100644 --- a/docs/2.0.0/concepts/file-uploads.html +++ b/docs/2.0.0/concepts/file-uploads.html @@ -4,7 +4,7 @@ Uploading files | Serverpod - + diff --git a/docs/2.0.0/concepts/health-checks.html b/docs/2.0.0/concepts/health-checks.html index 5a3701695..166423eff 100644 --- a/docs/2.0.0/concepts/health-checks.html +++ b/docs/2.0.0/concepts/health-checks.html @@ -4,7 +4,7 @@ Health checks | Serverpod - + diff --git a/docs/2.0.0/concepts/logging.html b/docs/2.0.0/concepts/logging.html index b55bc4796..27297d236 100644 --- a/docs/2.0.0/concepts/logging.html +++ b/docs/2.0.0/concepts/logging.html @@ -4,7 +4,7 @@ Logging | Serverpod - + diff --git a/docs/2.0.0/concepts/models.html b/docs/2.0.0/concepts/models.html index f0b2f7a73..ffc6ab701 100644 --- a/docs/2.0.0/concepts/models.html +++ b/docs/2.0.0/concepts/models.html @@ -4,7 +4,7 @@ Working with models | Serverpod - + diff --git a/docs/2.0.0/concepts/modules.html b/docs/2.0.0/concepts/modules.html index 95a843c04..2c9356b54 100644 --- a/docs/2.0.0/concepts/modules.html +++ b/docs/2.0.0/concepts/modules.html @@ -4,7 +4,7 @@ Modules | Serverpod - + diff --git a/docs/2.0.0/concepts/scheduling.html b/docs/2.0.0/concepts/scheduling.html index fc6ee5ce8..bf95a3587 100644 --- a/docs/2.0.0/concepts/scheduling.html +++ b/docs/2.0.0/concepts/scheduling.html @@ -4,7 +4,7 @@ Scheduling | Serverpod - + diff --git a/docs/2.0.0/concepts/serialization.html b/docs/2.0.0/concepts/serialization.html index e88661f34..48bec92a5 100644 --- a/docs/2.0.0/concepts/serialization.html +++ b/docs/2.0.0/concepts/serialization.html @@ -4,7 +4,7 @@ Custom serialization | Serverpod - + diff --git a/docs/2.0.0/concepts/sessions.html b/docs/2.0.0/concepts/sessions.html index efc838b20..3676de0a6 100644 --- a/docs/2.0.0/concepts/sessions.html +++ b/docs/2.0.0/concepts/sessions.html @@ -4,7 +4,7 @@ Sessions | Serverpod - + diff --git a/docs/2.0.0/concepts/streams.html b/docs/2.0.0/concepts/streams.html index 69c924338..975bf615d 100644 --- a/docs/2.0.0/concepts/streams.html +++ b/docs/2.0.0/concepts/streams.html @@ -4,7 +4,7 @@ Streams and messaging | Serverpod - + diff --git a/docs/2.0.0/concepts/webserver.html b/docs/2.0.0/concepts/webserver.html index 4cc71cf53..9664c34c7 100644 --- a/docs/2.0.0/concepts/webserver.html +++ b/docs/2.0.0/concepts/webserver.html @@ -4,7 +4,7 @@ Web server | Serverpod - + diff --git a/docs/2.0.0/concepts/working-with-endpoints.html b/docs/2.0.0/concepts/working-with-endpoints.html index 6a2730d77..e53544af5 100644 --- a/docs/2.0.0/concepts/working-with-endpoints.html +++ b/docs/2.0.0/concepts/working-with-endpoints.html @@ -4,7 +4,7 @@ Working with endpoints | Serverpod - + diff --git a/docs/2.0.0/contribute.html b/docs/2.0.0/contribute.html index 366df3f52..0c84cb775 100644 --- a/docs/2.0.0/contribute.html +++ b/docs/2.0.0/contribute.html @@ -4,7 +4,7 @@ Contribute | Serverpod - + diff --git a/docs/2.0.0/deployments/deploying-to-aws.html b/docs/2.0.0/deployments/deploying-to-aws.html index f81c3f2e7..7050fb2a6 100644 --- a/docs/2.0.0/deployments/deploying-to-aws.html +++ b/docs/2.0.0/deployments/deploying-to-aws.html @@ -4,7 +4,7 @@ AWS EC2 with Terraform | Serverpod - + diff --git a/docs/2.0.0/deployments/deploying-to-gce-terraform.html b/docs/2.0.0/deployments/deploying-to-gce-terraform.html index 8821106fd..72066327c 100644 --- a/docs/2.0.0/deployments/deploying-to-gce-terraform.html +++ b/docs/2.0.0/deployments/deploying-to-gce-terraform.html @@ -4,7 +4,7 @@ Google Cloud Engine with Terraform | Serverpod - + diff --git a/docs/2.0.0/deployments/deploying-to-gcr-console.html b/docs/2.0.0/deployments/deploying-to-gcr-console.html index a14c285c6..b458fcbda 100644 --- a/docs/2.0.0/deployments/deploying-to-gcr-console.html +++ b/docs/2.0.0/deployments/deploying-to-gcr-console.html @@ -4,7 +4,7 @@ Google Cloud Run with CGP Console | Serverpod - + diff --git a/docs/2.0.0/deployments/deployment-strategy.html b/docs/2.0.0/deployments/deployment-strategy.html index 77a980515..052460cbe 100644 --- a/docs/2.0.0/deployments/deployment-strategy.html +++ b/docs/2.0.0/deployments/deployment-strategy.html @@ -4,7 +4,7 @@ Choosing deployment strategy | Serverpod - + diff --git a/docs/2.0.0/deployments/general.html b/docs/2.0.0/deployments/general.html index a13eaf54e..598562cdb 100644 --- a/docs/2.0.0/deployments/general.html +++ b/docs/2.0.0/deployments/general.html @@ -4,7 +4,7 @@ Hosting elsewhere | Serverpod - + diff --git a/docs/2.0.0/get-started.html b/docs/2.0.0/get-started.html index b23103180..b248b04da 100644 --- a/docs/2.0.0/get-started.html +++ b/docs/2.0.0/get-started.html @@ -4,7 +4,7 @@ Get started | Serverpod - + diff --git a/docs/2.0.0/roadmap.html b/docs/2.0.0/roadmap.html index 5ad70546c..b9ec7d00e 100644 --- a/docs/2.0.0/roadmap.html +++ b/docs/2.0.0/roadmap.html @@ -4,7 +4,7 @@ Roadmap | Serverpod - + diff --git a/docs/2.0.0/support.html b/docs/2.0.0/support.html index 8a80d7a69..03b793d68 100644 --- a/docs/2.0.0/support.html +++ b/docs/2.0.0/support.html @@ -4,7 +4,7 @@ Support & community | Serverpod - + diff --git a/docs/2.0.0/tools/cli.html b/docs/2.0.0/tools/cli.html index aedbbddb3..c6aaa6792 100644 --- a/docs/2.0.0/tools/cli.html +++ b/docs/2.0.0/tools/cli.html @@ -4,7 +4,7 @@ Serverpod CLI | Serverpod - + diff --git a/docs/2.0.0/tools/insights.html b/docs/2.0.0/tools/insights.html index d7fe2f044..44e0c6a56 100644 --- a/docs/2.0.0/tools/insights.html +++ b/docs/2.0.0/tools/insights.html @@ -4,7 +4,7 @@ Serverpod Insights | Serverpod - + diff --git a/docs/2.0.0/tools/lsp.html b/docs/2.0.0/tools/lsp.html index 2d11c9620..fdde490c6 100644 --- a/docs/2.0.0/tools/lsp.html +++ b/docs/2.0.0/tools/lsp.html @@ -4,7 +4,7 @@ Serverpod LSP | Serverpod - + diff --git a/docs/2.0.0/tutorials/authentication.html b/docs/2.0.0/tutorials/authentication.html index 8b7af0eff..9c4eac6aa 100644 --- a/docs/2.0.0/tutorials/authentication.html +++ b/docs/2.0.0/tutorials/authentication.html @@ -4,7 +4,7 @@ Authentication | Serverpod - + diff --git a/docs/2.0.0/tutorials/code-example.html b/docs/2.0.0/tutorials/code-example.html index cd79a49cd..34f23a08a 100644 --- a/docs/2.0.0/tutorials/code-example.html +++ b/docs/2.0.0/tutorials/code-example.html @@ -4,7 +4,7 @@ Code examples | Serverpod - + diff --git a/docs/2.0.0/tutorials/first-app.html b/docs/2.0.0/tutorials/first-app.html index 8f4b9554a..dfad552c7 100644 --- a/docs/2.0.0/tutorials/first-app.html +++ b/docs/2.0.0/tutorials/first-app.html @@ -4,7 +4,7 @@ Build your first app | Serverpod - + diff --git a/docs/2.0.0/tutorials/videos.html b/docs/2.0.0/tutorials/videos.html index b9dfb6593..2b53cc980 100644 --- a/docs/2.0.0/tutorials/videos.html +++ b/docs/2.0.0/tutorials/videos.html @@ -4,7 +4,7 @@ Videos | Serverpod - + diff --git a/docs/2.0.0/upgrading/upgrade-to-one-point-two.html b/docs/2.0.0/upgrading/upgrade-to-one-point-two.html index bd9ff8042..f09ded4ff 100644 --- a/docs/2.0.0/upgrading/upgrade-to-one-point-two.html +++ b/docs/2.0.0/upgrading/upgrade-to-one-point-two.html @@ -4,7 +4,7 @@ Upgrade to 1.2 | Serverpod - + diff --git a/docs/2.0.0/upgrading/upgrade-to-two.html b/docs/2.0.0/upgrading/upgrade-to-two.html index cdb92c108..37f706e7b 100644 --- a/docs/2.0.0/upgrading/upgrade-to-two.html +++ b/docs/2.0.0/upgrading/upgrade-to-two.html @@ -4,7 +4,7 @@ Upgrade to 2.0 | Serverpod - + diff --git a/docs/404.html b/docs/404.html index 4bc9b34f0..6e0b676ce 100644 --- a/docs/404.html +++ b/docs/404.html @@ -4,7 +4,7 @@ Serverpod - + diff --git a/docs/assets/js/0c6fe626.3530bd34.js b/docs/assets/js/0c6fe626.3530bd34.js deleted file mode 100644 index 0f4cd15c6..000000000 --- a/docs/assets/js/0c6fe626.3530bd34.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkserverpod_docs=self.webpackChunkserverpod_docs||[]).push([[46148],{25219:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>o,toc:()=>l});var a=t(85893),i=t(11151);const r={},s="Real-time communication",o={id:"tutorials/real-time-communication",title:"Real-time communication",description:"Have you ever found real-time communication in apps challenging? It doesn't have to be. Today, we're diving into how to build a collaborative drawing experience using Flutter and Serverpod. We'll call our app Pixorama\u200a-\u200aa fun and interactive project inspired by Reddit's r/place. Pixorama lets users draw together on a shared grid, with every pixel placed updating in real-time across all connected devices.",source:"@site/docs/05-tutorials/02-real-time-communication.md",sourceDirName:"05-tutorials",slug:"/tutorials/real-time-communication",permalink:"/next/tutorials/real-time-communication",draft:!1,unlisted:!1,editUrl:"https://github.com/serverpod/serverpod_docs/tree/main/docs/05-tutorials/02-real-time-communication.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Build your first app",permalink:"/next/tutorials/first-app"},next:{title:"Code examples",permalink:"/next/tutorials/code-example"}},d={},l=[{value:"What is Pixorama?",id:"what-is-pixorama",level:2},{value:"Understanding real-time communication",id:"understanding-real-time-communication",level:2},{value:"Setting up the\xa0project",id:"setting-up-theproject",level:2},{value:"Creating models",id:"creating-models",level:2},{value:"Building the\xa0server",id:"building-theserver",level:2},{value:"Handling pixel\xa0updates",id:"handling-pixelupdates",level:3},{value:"Building the Flutter\xa0app",id:"building-the-flutterapp",level:2},{value:"Building the Interface",id:"building-the-interface",level:3},{value:"Running Pixorama",id:"running-pixorama",level:2},{value:"Conclusion",id:"conclusion",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",p:"p",pre:"pre",...(0,i.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"real-time-communication",children:"Real-time communication"})}),"\n",(0,a.jsx)(n.p,{children:"Have you ever found real-time communication in apps challenging? It doesn't have to be. Today, we're diving into how to build a collaborative drawing experience using Flutter and Serverpod. We'll call our app Pixorama\u200a-\u200aa fun and interactive project inspired by Reddit's r/place. Pixorama lets users draw together on a shared grid, with every pixel placed updating in real-time across all connected devices."}),"\n",(0,a.jsx)(n.admonition,{type:"info",children:(0,a.jsxs)(n.p,{children:["Before you begin, make sure that you have ",(0,a.jsx)(n.a,{href:"/",children:"installed Serverpod"}),". It's also recommended that you read the ",(0,a.jsx)(n.a,{href:"../get-started-with-mini",children:"Get started with Mini"})," guide."]})}),"\n",(0,a.jsxs)(n.p,{children:["You can try out the final app here: ",(0,a.jsx)(n.a,{href:"https://pixorama.live",children:"https://pixorama.live"})]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.img,{alt:"Serverpod Insights",src:t(73381).Z+"",width:"2428",height:"2912"})}),"\n",(0,a.jsx)(n.h2,{id:"what-is-pixorama",children:"What is Pixorama?"}),"\n",(0,a.jsx)(n.p,{children:"Pixorama is a collaborative drawing app where users can place pixels on a grid to create images together. Imagine two instances of the app running simultaneously\u200a-\u200adraw a pixel on one and watch it instantly appear on the other. This seamless synchronization happens because each time you draw a pixel, a message is sent to the server, which then broadcasts it to all connected clients."}),"\n",(0,a.jsx)(n.h2,{id:"understanding-real-time-communication",children:"Understanding real-time communication"}),"\n",(0,a.jsx)(n.p,{children:"In traditional REST APIs, communication with the server involves sending a request and receiving a response. However, real-time communication requires the server to push updates to clients as they happen. This is commonly achieved using web sockets, which maintain an open connection between the server and client, allowing for continuous data exchange. While web sockets can be tricky, requiring data serialization and connection management, Serverpod simplifies this process."}),"\n",(0,a.jsxs)(n.p,{children:["With the release of Serverpod 2.1, a new feature called ",(0,a.jsx)(n.a,{href:"../concepts/streams",children:"streaming methods"})," was introduced. This feature allows us to return a stream from a server method and call it from our app. Serverpod handles the underlying web socket connection for us. Now, let's get started with building Pixorama."]}),"\n",(0,a.jsx)(n.h2,{id:"setting-up-theproject",children:"Setting up the\xa0project"}),"\n",(0,a.jsxs)(n.p,{children:["We begin by creating a new project with the ",(0,a.jsx)(n.code,{children:"serverpod create"})," command. Since we don't need to store data in a database, we'll use the Mini version of Serverpod. Serverpod Mini is a lightweight version of Serverpod without a database, advanced logging, and other features\u200a-\u200aperfect for our needs. Create the project with the command:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"serverpod create pixorama --mini\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Now, let's open the project in VS Code and explore the structure. The server code resides in the ",(0,a.jsx)(n.code,{children:"pixorama_server"})," package. We'll start by creating models\u200a-\u200aclasses that we can serialize and pass between the client and server. Our models will be placed in the ",(0,a.jsx)(n.code,{children:"lib/src/models"})," directory."]}),"\n",(0,a.jsx)(n.h2,{id:"creating-models",children:"Creating models"}),"\n",(0,a.jsxs)(n.p,{children:["First, we remove the ",(0,a.jsx)(n.code,{children:"example.spy.yaml"})," model, as we won't need it. We'll create two new models: ",(0,a.jsx)(n.code,{children:"ImageData"})," and ",(0,a.jsx)(n.code,{children:"ImageUpdate"}),". Place them in the ",(0,a.jsx)(n.code,{children:"lib/src/models"})," directory and call them ",(0,a.jsx)(n.code,{children:"image_data.spy.yaml"})," and ",(0,a.jsx)(n.code,{children:"image_update.spy.yaml"}),"."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:"# lib/src/models/image_data.spy.yaml\n\nclass: ImageData\nfields:\n pixels: ByteData\n width: int\n height: int\n"})}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"ImageData"})," model represents the entire image that will be sent to the app when it connects to the server. It stores the image's pixels as ByteData, where each byte represents a pixel. Additionally, it includes the image's width and height."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:"# lib/src/models/image_update.spy.yaml\n\nclass: ImageUpdate\nfields:\n pixelIndex: int\n colorIndex: int\n"})}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"ImageUpdate"})," model captures changes to individual pixels, including the pixel's index in the byte array and its new color value."]}),"\n",(0,a.jsxs)(n.p,{children:["With our models defined, we run serverpod generate to create the actual Dart files for these models. Run the command from your server's root directory (",(0,a.jsx)(n.code,{children:"pixorama_server"}),")."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"cd pixorama_server\nserverpod generate\n"})}),"\n",(0,a.jsx)(n.h2,{id:"building-theserver",children:"Building the\xa0server"}),"\n",(0,a.jsxs)(n.p,{children:["Next, we'll build the server. We need to create a new endpoint. An endpoint is a connection point for the client to interact with the server. In Serverpod, you create endpoints by extending the ",(0,a.jsx)(n.code,{children:"Endpoint"})," class and placing it in the ",(0,a.jsx)(n.code,{children:"lib/src/endpoints"})," directory. The endpoint will manage our pixel data and handle client updates."]}),"\n",(0,a.jsxs)(n.p,{children:["We will start by creating a ",(0,a.jsx)(n.code,{children:"PixoramaEndpoint"})," class, which we place in a file called ",(0,a.jsx)(n.code,{children:"pixorama_endpoint.dart"})," in the ",(0,a.jsx)(n.code,{children:"lib/src/endpoints"})," directory."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"// lib/src/endpoints/pixorama_endpoint.dart\n\nimport 'dart:typed_data';\n\nimport 'package:serverpod/serverpod.dart';\n\nclass PixoramaEndpoint extends Endpoint {\n static const _imageWidth = 64;\n static const _imageHeight = 64;\n static const _numPixels = _imageWidth * _imageHeight;\n\n static const _numColorsInPalette = 16;\n static const _defaultPixelColor = 2;\n \n final _pixelData = Uint8List(_numPixels)\n ..fillRange(\n 0,\n _numPixels,\n _defaultPixelColor,\n );\n}\n"})}),"\n",(0,a.jsxs)(n.p,{children:["We define a number of constants that define the dimensions of our image. We represent the image itself with a ",(0,a.jsx)(n.code,{children:"Uint8List"}),". Each byte in the list will be a pixel in our image."]}),"\n",(0,a.jsx)(n.h3,{id:"handling-pixelupdates",children:"Handling pixel\xa0updates"}),"\n",(0,a.jsxs)(n.p,{children:["The core functionality of Pixorama lies in how the server passes image data to clients and keeps them updated. Serverpod's built-in messaging system, Message Central, allows us to publish and subscribe to events. We create a channel named ",(0,a.jsx)(n.code,{children:"pixel-added"})," to handle pixel updates in our ",(0,a.jsx)(n.code,{children:"PixoramaEndpoint"})," class."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"// lib/src/endpoints/pixorama_endpoint.dart\n\nclass PixoramaEndpoint extends Endpoint {\n // ...\n\n static const _channelPixelAdded = 'pixel-added';\n}\n"})}),"\n",(0,a.jsxs)(n.p,{children:["When a user draws a pixel, the ",(0,a.jsx)(n.code,{children:"setPixel"})," endpoint method is called. This method verifies the validity of the input (ensuring the color index is within the valid range and the pixel index is within bounds). If valid, it updates our pixel data and broadcasts the update to all listeners within the server via the ",(0,a.jsx)(n.code,{children:"pixel-added"})," channel."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"// lib/src/endpoints/pixorama_endpoint.dart\n\n// Here we need to import the model files from our generated protocol.\nimport 'package:pixorama_server/src/generated/protocol.dart';\n\nclass PixoramaEndpoint extends Endpoint {\n // ...\n\n static const _channelPixelAdded = 'pixel-added';\n\n /// Sets a single pixel and notifies all connected clients about the change.\n Future setPixel(\n Session session, {\n required int colorIndex,\n required int pixelIndex,\n }) async {\n // Check that the input parameters are valid. If not, throw a\n // `FormatException`, which will be logged and thrown as\n // `ServerpodClientException` in the app.\n if (colorIndex < 0 || colorIndex >= _numColorsInPalette) {\n throw FormatException('colorIndex is out of range: $colorIndex');\n }\n if (pixelIndex < 0 || pixelIndex >= _numPixels) {\n throw FormatException('pixelIndex is out of range: $pixelIndex');\n }\n\n // Update our global image.\n _pixelData[pixelIndex] = colorIndex;\n\n // Notify all connected clients that we set a pixel, by posting a message\n // to the _channelPixelAdded channel.\n session.messages.postMessage(\n _channelPixelAdded,\n ImageUpdate(\n pixelIndex: pixelIndex,\n colorIndex: colorIndex,\n ),\n );\n }\n}\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Finally, we create an ",(0,a.jsx)(n.code,{children:"imageUpdates"})," method, which returns a stream of updates to clients. This method first sends the full image data to the client, followed by any subsequent pixel updates. This method will listen to updates from our ",(0,a.jsx)(n.code,{children:"pixel-added"})," channel and relay them to the client. By creating the stream from the message channel before sending the first update to our client, we ensure no message risks being lost between the first full update and the first individual pixel being sent."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"// lib/src/endpoints/pixorama_endpoint.dart\nclass PixoramaEndpoint extends Endpoint {\n // ...\n\n /// Returns a stream of image updates. The first message will always be a\n /// `ImageData` object, which contains the full image. Sequential updates\n /// will be `ImageUpdate` objects, which contains a single updated pixel.\n Stream imageUpdates(Session session) async* {\n // Request a stream of updates from the pixel-added channel in\n // MessageCentral.\n var updateStream =\n session.messages.createStream(_channelPixelAdded);\n\n // Yield a first full image to the client.\n yield ImageData(\n pixels: _pixelData.buffer.asByteData(),\n width: _imageWidth,\n height: _imageHeight,\n );\n\n // Relay all individual pixel updates from the pixel-added channel to\n // the client.\n await for (var imageUpdate in updateStream) {\n yield imageUpdate;\n }\n }\n}\n"})}),"\n",(0,a.jsx)(n.p,{children:"That's all the code we need to write for the server side. To make the new endpoint available to our Flutter app, we run serverpod generate in the root directory of our server."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"cd pixorama_server\nserverpod generate\n"})}),"\n",(0,a.jsx)(n.h2,{id:"building-the-flutterapp",children:"Building the Flutter\xa0app"}),"\n",(0,a.jsxs)(n.p,{children:["With the server side complete, it's time to build the Flutter app. When we created the project, Serverpod set up a basic Flutter app for us in the ",(0,a.jsx)(n.code,{children:"pixorama_flutter"})," package."]}),"\n",(0,a.jsxs)(n.p,{children:["First, we will use the pixels package to draw our pixel editor. Import it by running the following command in your ",(0,a.jsx)(n.code,{children:"pixorama_flutter"})," directory:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"cd pixorama_flutter\nflutter pub add pixels\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Next, let's open the ",(0,a.jsx)(n.code,{children:"main.dart"})," file and rename the ",(0,a.jsx)(n.code,{children:"MyHomePage"})," class to ",(0,a.jsx)(n.code,{children:"PixoramaApp"}),". We also remove the demo code and replace it with a ",(0,a.jsx)(n.code,{children:"Scaffold"})," containing a ",(0,a.jsx)(n.code,{children:"Pixorama"})," widget. This is our new main file:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"// lib/main.dart\n\nimport 'package:pixorama_client/pixorama_client.dart';\nimport 'package:flutter/material.dart';\nimport 'package:serverpod_flutter/serverpod_flutter.dart';\n\nimport 'src/pixorama.dart';\n\nvar client = Client('http://$localhost:8080/')\n ..connectivityMonitor = FlutterConnectivityMonitor();\n\nvoid main() {\n // Start the app.\n runApp(const PixoramaApp());\n}\n\nclass PixoramaApp extends StatelessWidget {\n const PixoramaApp({super.key});\n\n @override\n Widget build(BuildContext context) {\n return MaterialApp(\n title: 'Pixorama',\n theme: ThemeData(\n primarySwatch: Colors.blue,\n ),\n home: Scaffold(\n body: const Pixorama(),\n ),\n );\n }\n}\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Now, we will create the ",(0,a.jsx)(n.code,{children:"Pixorama"})," widget. This is where all the drawing magic will happen. Create a new file called ",(0,a.jsx)(n.code,{children:"pixorama.dart"})," and place it in ",(0,a.jsx)(n.code,{children:"lib/src"}),". Start by creating a new stateful widget called ",(0,a.jsx)(n.code,{children:"Pixorama"}),". We are also importing a few of the packages and files we are going to use:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"// lib/src/pixorama.dart\n\nimport 'package:flutter/material.dart';\nimport 'package:pixels/pixels.dart';\nimport 'package:pixorama_client/pixorama_client.dart';\n\nimport '../../main.dart';\n\nclass Pixorama extends StatefulWidget {\n const Pixorama({super.key});\n\n @override\n State createState() => _PixoramaState();\n}\n\nclass _PixoramaState extends State {\n}\n"})}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"Pixorama"})," widget draws the image using the ",(0,a.jsx)(n.code,{children:"PixelEditor"})," from the ",(0,a.jsx)(n.code,{children:"pixels"})," package. A ",(0,a.jsx)(n.code,{children:"PixelImageController"})," manages the pixel data, and in the ",(0,a.jsx)(n.code,{children:"initState"})," method, we call a ",(0,a.jsx)(n.code,{children:"_listenToUpdates"})," method to connect to the server and listen for updates. Let's add the ",(0,a.jsx)(n.code,{children:"PixelImageController"})," and ",(0,a.jsx)(n.code,{children:"initState"})," method to our ",(0,a.jsx)(n.code,{children:"_PixoramaState"})," class:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"// lib/src/pixorama.dart\n\nclass _PixoramaState extends State {\n // The pixel image controller contains our image data and handles updates.\n // If it is null, the image has not yet been loaded from the server.\n PixelImageController? _imageController;\n\n @override\n void initState() {\n super.initState();\n\n // Connect to the server and start listening to updates.\n _listenToUpdates();\n }\n}\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Next, let's implement the ",(0,a.jsx)(n.code,{children:"_listenToUpdates"})," method. The ",(0,a.jsx)(n.code,{children:"_listenToUpdates"})," method runs indefinitely, maintaining a connection to the server and processing updates as they arrive. It handles both ",(0,a.jsx)(n.code,{children:"ImageData"})," (the full image) and ",(0,a.jsx)(n.code,{children:"ImageUpdate"})," (individual pixel changes), updating the ",(0,a.jsx)(n.code,{children:"PixelImageController"})," accordingly. If the connection is lost, it will wait 5 seconds before it tries to reconnect to the server."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"// lib/src/pixorama.dart\n\nclass _PixoramaState extends State {\n // ...\n\n Future _listenToUpdates() async {\n // Indefinitely try to connect and listen to updates from the server.\n while (true) {\n try {\n // Get the stream of updates from the server.\n final imageUpdates = client.pixorama.imageUpdates();\n\n // Listen for updates from the stream. The await for construct will\n // wait for a message to arrive from the server, then run through the\n // body of the loop.\n await for (final update in imageUpdates) {\n // Check which type of update we have received.\n if (update is ImageData) {\n // This is a complete image update, containing all pixels in the\n // image. Create a new PixelImageController with the pixel data.\n setState(() {\n _imageController = PixelImageController(\n pixels: update.pixels,\n palette: PixelPalette.rPlace(),\n width: update.width,\n height: update.height,\n );\n });\n } else if (update is ImageUpdate) {\n // Got an incremental update of the image. Just set the single\n // pixel.\n _imageController?.setPixelIndex(\n pixelIndex: update.pixelIndex,\n colorIndex: update.colorIndex,\n );\n }\n }\n } on MethodStreamException catch (_) {\n // We lost the connection to the server, or failed to connect.\n setState(() {\n _imageController = null;\n });\n }\n\n // Wait 5 seconds until we try to connect again.\n await Future.delayed(Duration(seconds: 5));\n }\n }\n}\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Worth noting is that the ",(0,a.jsx)(n.code,{children:"MethodStreamException"})," is a superclass of a set of more detailed exceptions. It's often sufficient to catch all types of failures (like what we do here) that can happen when streaming data, but it's possible to detect if the stream failed because we failed to connect, if the server went down, or if the connection was lost."]}),"\n",(0,a.jsx)(n.h3,{id:"building-the-interface",children:"Building the Interface"}),"\n",(0,a.jsxs)(n.p,{children:["Finally, we need to implement the widget's ",(0,a.jsx)(n.code,{children:"build"})," method, where we create the user interface for drawing pixels. We display a progress indicator if the ",(0,a.jsx)(n.code,{children:"_imageController"})," is ",(0,a.jsx)(n.code,{children:"null"})," (indicating no image has been received yet). Once the image is received, we use the ",(0,a.jsx)(n.code,{children:"PixelEditor"})," widget to render it, and any pixel changes made by the user are sent to the server via the ",(0,a.jsx)(n.code,{children:"setPixel"})," method."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"// lib/src/pixorama.dart\n\nclass _PixoramaState extends State {\n // ...\n\n @override\n Widget build(BuildContext context) {\n return Center(\n child: _imageController == null\n ? const CircularProgressIndicator()\n : PixelEditor(\n controller: _imageController!,\n onSetPixel: (details) {\n // When a user clicks a pixel we will get a callback from the\n // PixelImageController, with information about the changed\n // pixel. When that happens we call the setPixels method on\n // the server.\n client.pixorama.setPixel(\n pixelIndex: details.tapDetails.index,\n colorIndex: details.colorIndex,\n );\n },\n ),\n );\n }\n}\n"})}),"\n",(0,a.jsx)(n.h2,{id:"running-pixorama",children:"Running Pixorama"}),"\n",(0,a.jsxs)(n.p,{children:["To test Pixorama, start the server by navigating to the ",(0,a.jsx)(n.code,{children:"pixorama_server"})," directory and running:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"dart bin/main.dart\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Then, launch the Flutter app by changing to the ",(0,a.jsx)(n.code,{children:"pixorama_flutter"})," directory and running:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"flutter run -d chrome\n"})}),"\n",(0,a.jsx)(n.p,{children:"You can also start a second instance of the app to see real-time updates reflected across both instances."}),"\n",(0,a.jsx)(n.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,a.jsxs)(n.p,{children:["This project was a brief introduction to building real-time apps with Flutter and Serverpod. With less than a page of code on the server side, we created a collaborative drawing app that's both fun and functional. You can find the full Pixorama code on GitHub here:\n",(0,a.jsx)(n.a,{href:"https://github.com/serverpod/pixorama",children:"https://github.com/serverpod/pixorama"})]}),"\n",(0,a.jsx)(n.p,{children:"Happy coding!"})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},73381:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/pixorama-183dc43ee2a7c5cec50ac9da4ee25e1d.png"},11151:(e,n,t)=>{t.d(n,{Z:()=>o,a:()=>s});var a=t(67294);const i={},r=a.createContext(i);function s(e){const n=a.useContext(r);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),a.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/0c6fe626.96dcbb61.js b/docs/assets/js/0c6fe626.96dcbb61.js new file mode 100644 index 000000000..d01099ea5 --- /dev/null +++ b/docs/assets/js/0c6fe626.96dcbb61.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkserverpod_docs=self.webpackChunkserverpod_docs||[]).push([[46148],{25219:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>o,toc:()=>l});var a=t(85893),i=t(11151);const r={},s="Real-time communication",o={id:"tutorials/real-time-communication",title:"Real-time communication",description:"Have you ever found real-time communication in apps challenging? It doesn't have to be. Today, we're diving into how to build a collaborative drawing experience using Flutter and Serverpod. We'll call our app Pixorama\u200a-\u200aa fun and interactive project inspired by Reddit's r/place. Pixorama lets users draw together on a shared grid, with every pixel placed updating in real-time across all connected devices.",source:"@site/docs/05-tutorials/02-real-time-communication.md",sourceDirName:"05-tutorials",slug:"/tutorials/real-time-communication",permalink:"/next/tutorials/real-time-communication",draft:!1,unlisted:!1,editUrl:"https://github.com/serverpod/serverpod_docs/tree/main/docs/05-tutorials/02-real-time-communication.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Build your first app",permalink:"/next/tutorials/first-app"},next:{title:"Code examples",permalink:"/next/tutorials/code-example"}},d={},l=[{value:"What is Pixorama?",id:"what-is-pixorama",level:2},{value:"Understanding real-time communication",id:"understanding-real-time-communication",level:2},{value:"Setting up the\xa0project",id:"setting-up-theproject",level:2},{value:"Creating models",id:"creating-models",level:2},{value:"Building the\xa0server",id:"building-theserver",level:2},{value:"Handling pixel\xa0updates",id:"handling-pixelupdates",level:3},{value:"Building the Flutter\xa0app",id:"building-the-flutterapp",level:2},{value:"Building the Interface",id:"building-the-interface",level:3},{value:"Running Pixorama",id:"running-pixorama",level:2},{value:"Conclusion",id:"conclusion",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",p:"p",pre:"pre",...(0,i.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"real-time-communication",children:"Real-time communication"})}),"\n",(0,a.jsx)(n.p,{children:"Have you ever found real-time communication in apps challenging? It doesn't have to be. Today, we're diving into how to build a collaborative drawing experience using Flutter and Serverpod. We'll call our app Pixorama\u200a-\u200aa fun and interactive project inspired by Reddit's r/place. Pixorama lets users draw together on a shared grid, with every pixel placed updating in real-time across all connected devices."}),"\n",(0,a.jsx)("div",{style:{position:"relative",paddingBottom:"56.25%",height:"0"},children:(0,a.jsx)("iframe",{style:{position:"absolute",top:"0",left:"0",width:"100%",height:"100%"},width:"560",height:"315",src:"https://www.youtube-nocookie.com/embed/iCDeAvuMj8I",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:!0})}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.em,{children:"This tutorial is also available as a video."})}),"\n",(0,a.jsx)(n.admonition,{type:"info",children:(0,a.jsxs)(n.p,{children:["Before you begin, make sure that you have ",(0,a.jsx)(n.a,{href:"/",children:"installed Serverpod"}),". It's also recommended that you read the ",(0,a.jsx)(n.a,{href:"../get-started-with-mini",children:"Get started with Mini"})," guide."]})}),"\n",(0,a.jsxs)(n.p,{children:["You can try out the final app here: ",(0,a.jsx)(n.a,{href:"https://pixorama.live",children:"https://pixorama.live"})]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.img,{alt:"Serverpod Insights",src:t(73381).Z+"",width:"2428",height:"2912"})}),"\n",(0,a.jsx)(n.h2,{id:"what-is-pixorama",children:"What is Pixorama?"}),"\n",(0,a.jsx)(n.p,{children:"Pixorama is a collaborative drawing app where users can place pixels on a grid to create images together. Imagine two instances of the app running simultaneously\u200a-\u200adraw a pixel on one and watch it instantly appear on the other. This seamless synchronization happens because each time you draw a pixel, a message is sent to the server, which then broadcasts it to all connected clients."}),"\n",(0,a.jsx)(n.h2,{id:"understanding-real-time-communication",children:"Understanding real-time communication"}),"\n",(0,a.jsx)(n.p,{children:"In traditional REST APIs, communication with the server involves sending a request and receiving a response. However, real-time communication requires the server to push updates to clients as they happen. This is commonly achieved using web sockets, which maintain an open connection between the server and client, allowing for continuous data exchange. While web sockets can be tricky, requiring data serialization and connection management, Serverpod simplifies this process."}),"\n",(0,a.jsxs)(n.p,{children:["With the release of Serverpod 2.1, a new feature called ",(0,a.jsx)(n.a,{href:"../concepts/streams",children:"streaming methods"})," was introduced. This feature allows us to return a stream from a server method and call it from our app. Serverpod handles the underlying web socket connection for us. Now, let's get started with building Pixorama."]}),"\n",(0,a.jsx)(n.h2,{id:"setting-up-theproject",children:"Setting up the\xa0project"}),"\n",(0,a.jsxs)(n.p,{children:["We begin by creating a new project with the ",(0,a.jsx)(n.code,{children:"serverpod create"})," command. Since we don't need to store data in a database, we'll use the Mini version of Serverpod. Serverpod Mini is a lightweight version of Serverpod without a database, advanced logging, and other features\u200a-\u200aperfect for our needs. Create the project with the command:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"serverpod create pixorama --mini\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Now, let's open the project in VS Code and explore the structure. The server code resides in the ",(0,a.jsx)(n.code,{children:"pixorama_server"})," package. We'll start by creating models\u200a-\u200aclasses that we can serialize and pass between the client and server. Our models will be placed in the ",(0,a.jsx)(n.code,{children:"lib/src/models"})," directory."]}),"\n",(0,a.jsx)(n.h2,{id:"creating-models",children:"Creating models"}),"\n",(0,a.jsxs)(n.p,{children:["First, we remove the ",(0,a.jsx)(n.code,{children:"example.spy.yaml"})," model, as we won't need it. We'll create two new models: ",(0,a.jsx)(n.code,{children:"ImageData"})," and ",(0,a.jsx)(n.code,{children:"ImageUpdate"}),". Place them in the ",(0,a.jsx)(n.code,{children:"lib/src/models"})," directory and call them ",(0,a.jsx)(n.code,{children:"image_data.spy.yaml"})," and ",(0,a.jsx)(n.code,{children:"image_update.spy.yaml"}),"."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:"# lib/src/models/image_data.spy.yaml\n\nclass: ImageData\nfields:\n pixels: ByteData\n width: int\n height: int\n"})}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"ImageData"})," model represents the entire image that will be sent to the app when it connects to the server. It stores the image's pixels as ByteData, where each byte represents a pixel. Additionally, it includes the image's width and height."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:"# lib/src/models/image_update.spy.yaml\n\nclass: ImageUpdate\nfields:\n pixelIndex: int\n colorIndex: int\n"})}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"ImageUpdate"})," model captures changes to individual pixels, including the pixel's index in the byte array and its new color value."]}),"\n",(0,a.jsxs)(n.p,{children:["With our models defined, we run serverpod generate to create the actual Dart files for these models. Run the command from your server's root directory (",(0,a.jsx)(n.code,{children:"pixorama_server"}),")."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"cd pixorama_server\nserverpod generate\n"})}),"\n",(0,a.jsx)(n.h2,{id:"building-theserver",children:"Building the\xa0server"}),"\n",(0,a.jsxs)(n.p,{children:["Next, we'll build the server. We need to create a new endpoint. An endpoint is a connection point for the client to interact with the server. In Serverpod, you create endpoints by extending the ",(0,a.jsx)(n.code,{children:"Endpoint"})," class and placing it in the ",(0,a.jsx)(n.code,{children:"lib/src/endpoints"})," directory. The endpoint will manage our pixel data and handle client updates."]}),"\n",(0,a.jsxs)(n.p,{children:["We will start by creating a ",(0,a.jsx)(n.code,{children:"PixoramaEndpoint"})," class, which we place in a file called ",(0,a.jsx)(n.code,{children:"pixorama_endpoint.dart"})," in the ",(0,a.jsx)(n.code,{children:"lib/src/endpoints"})," directory."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"// lib/src/endpoints/pixorama_endpoint.dart\n\nimport 'dart:typed_data';\n\nimport 'package:serverpod/serverpod.dart';\n\nclass PixoramaEndpoint extends Endpoint {\n static const _imageWidth = 64;\n static const _imageHeight = 64;\n static const _numPixels = _imageWidth * _imageHeight;\n\n static const _numColorsInPalette = 16;\n static const _defaultPixelColor = 2;\n \n final _pixelData = Uint8List(_numPixels)\n ..fillRange(\n 0,\n _numPixels,\n _defaultPixelColor,\n );\n}\n"})}),"\n",(0,a.jsxs)(n.p,{children:["We define a number of constants that define the dimensions of our image. We represent the image itself with a ",(0,a.jsx)(n.code,{children:"Uint8List"}),". Each byte in the list will be a pixel in our image."]}),"\n",(0,a.jsx)(n.h3,{id:"handling-pixelupdates",children:"Handling pixel\xa0updates"}),"\n",(0,a.jsxs)(n.p,{children:["The core functionality of Pixorama lies in how the server passes image data to clients and keeps them updated. Serverpod's built-in messaging system, Message Central, allows us to publish and subscribe to events. We create a channel named ",(0,a.jsx)(n.code,{children:"pixel-added"})," to handle pixel updates in our ",(0,a.jsx)(n.code,{children:"PixoramaEndpoint"})," class."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"// lib/src/endpoints/pixorama_endpoint.dart\n\nclass PixoramaEndpoint extends Endpoint {\n // ...\n\n static const _channelPixelAdded = 'pixel-added';\n}\n"})}),"\n",(0,a.jsxs)(n.p,{children:["When a user draws a pixel, the ",(0,a.jsx)(n.code,{children:"setPixel"})," endpoint method is called. This method verifies the validity of the input (ensuring the color index is within the valid range and the pixel index is within bounds). If valid, it updates our pixel data and broadcasts the update to all listeners within the server via the ",(0,a.jsx)(n.code,{children:"pixel-added"})," channel."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"// lib/src/endpoints/pixorama_endpoint.dart\n\n// Here we need to import the model files from our generated protocol.\nimport 'package:pixorama_server/src/generated/protocol.dart';\n\nclass PixoramaEndpoint extends Endpoint {\n // ...\n\n static const _channelPixelAdded = 'pixel-added';\n\n /// Sets a single pixel and notifies all connected clients about the change.\n Future setPixel(\n Session session, {\n required int colorIndex,\n required int pixelIndex,\n }) async {\n // Check that the input parameters are valid. If not, throw a\n // `FormatException`, which will be logged and thrown as\n // `ServerpodClientException` in the app.\n if (colorIndex < 0 || colorIndex >= _numColorsInPalette) {\n throw FormatException('colorIndex is out of range: $colorIndex');\n }\n if (pixelIndex < 0 || pixelIndex >= _numPixels) {\n throw FormatException('pixelIndex is out of range: $pixelIndex');\n }\n\n // Update our global image.\n _pixelData[pixelIndex] = colorIndex;\n\n // Notify all connected clients that we set a pixel, by posting a message\n // to the _channelPixelAdded channel.\n session.messages.postMessage(\n _channelPixelAdded,\n ImageUpdate(\n pixelIndex: pixelIndex,\n colorIndex: colorIndex,\n ),\n );\n }\n}\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Finally, we create an ",(0,a.jsx)(n.code,{children:"imageUpdates"})," method, which returns a stream of updates to clients. This method first sends the full image data to the client, followed by any subsequent pixel updates. This method will listen to updates from our ",(0,a.jsx)(n.code,{children:"pixel-added"})," channel and relay them to the client. By creating the stream from the message channel before sending the first update to our client, we ensure no message risks being lost between the first full update and the first individual pixel being sent."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"// lib/src/endpoints/pixorama_endpoint.dart\nclass PixoramaEndpoint extends Endpoint {\n // ...\n\n /// Returns a stream of image updates. The first message will always be a\n /// `ImageData` object, which contains the full image. Sequential updates\n /// will be `ImageUpdate` objects, which contains a single updated pixel.\n Stream imageUpdates(Session session) async* {\n // Request a stream of updates from the pixel-added channel in\n // MessageCentral.\n var updateStream =\n session.messages.createStream(_channelPixelAdded);\n\n // Yield a first full image to the client.\n yield ImageData(\n pixels: _pixelData.buffer.asByteData(),\n width: _imageWidth,\n height: _imageHeight,\n );\n\n // Relay all individual pixel updates from the pixel-added channel to\n // the client.\n await for (var imageUpdate in updateStream) {\n yield imageUpdate;\n }\n }\n}\n"})}),"\n",(0,a.jsx)(n.p,{children:"That's all the code we need to write for the server side. To make the new endpoint available to our Flutter app, we run serverpod generate in the root directory of our server."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"cd pixorama_server\nserverpod generate\n"})}),"\n",(0,a.jsx)(n.h2,{id:"building-the-flutterapp",children:"Building the Flutter\xa0app"}),"\n",(0,a.jsxs)(n.p,{children:["With the server side complete, it's time to build the Flutter app. When we created the project, Serverpod set up a basic Flutter app for us in the ",(0,a.jsx)(n.code,{children:"pixorama_flutter"})," package."]}),"\n",(0,a.jsxs)(n.p,{children:["First, we will use the pixels package to draw our pixel editor. Import it by running the following command in your ",(0,a.jsx)(n.code,{children:"pixorama_flutter"})," directory:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"cd pixorama_flutter\nflutter pub add pixels\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Next, let's open the ",(0,a.jsx)(n.code,{children:"main.dart"})," file and rename the ",(0,a.jsx)(n.code,{children:"MyHomePage"})," class to ",(0,a.jsx)(n.code,{children:"PixoramaApp"}),". We also remove the demo code and replace it with a ",(0,a.jsx)(n.code,{children:"Scaffold"})," containing a ",(0,a.jsx)(n.code,{children:"Pixorama"})," widget. This is our new main file:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"// lib/main.dart\n\nimport 'package:pixorama_client/pixorama_client.dart';\nimport 'package:flutter/material.dart';\nimport 'package:serverpod_flutter/serverpod_flutter.dart';\n\nimport 'src/pixorama.dart';\n\nvar client = Client('http://$localhost:8080/')\n ..connectivityMonitor = FlutterConnectivityMonitor();\n\nvoid main() {\n // Start the app.\n runApp(const PixoramaApp());\n}\n\nclass PixoramaApp extends StatelessWidget {\n const PixoramaApp({super.key});\n\n @override\n Widget build(BuildContext context) {\n return MaterialApp(\n title: 'Pixorama',\n theme: ThemeData(\n primarySwatch: Colors.blue,\n ),\n home: Scaffold(\n body: const Pixorama(),\n ),\n );\n }\n}\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Now, we will create the ",(0,a.jsx)(n.code,{children:"Pixorama"})," widget. This is where all the drawing magic will happen. Create a new file called ",(0,a.jsx)(n.code,{children:"pixorama.dart"})," and place it in ",(0,a.jsx)(n.code,{children:"lib/src"}),". Start by creating a new stateful widget called ",(0,a.jsx)(n.code,{children:"Pixorama"}),". We are also importing a few of the packages and files we are going to use:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"// lib/src/pixorama.dart\n\nimport 'package:flutter/material.dart';\nimport 'package:pixels/pixels.dart';\nimport 'package:pixorama_client/pixorama_client.dart';\n\nimport '../../main.dart';\n\nclass Pixorama extends StatefulWidget {\n const Pixorama({super.key});\n\n @override\n State createState() => _PixoramaState();\n}\n\nclass _PixoramaState extends State {\n}\n"})}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"Pixorama"})," widget draws the image using the ",(0,a.jsx)(n.code,{children:"PixelEditor"})," from the ",(0,a.jsx)(n.code,{children:"pixels"})," package. A ",(0,a.jsx)(n.code,{children:"PixelImageController"})," manages the pixel data, and in the ",(0,a.jsx)(n.code,{children:"initState"})," method, we call a ",(0,a.jsx)(n.code,{children:"_listenToUpdates"})," method to connect to the server and listen for updates. Let's add the ",(0,a.jsx)(n.code,{children:"PixelImageController"})," and ",(0,a.jsx)(n.code,{children:"initState"})," method to our ",(0,a.jsx)(n.code,{children:"_PixoramaState"})," class:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"// lib/src/pixorama.dart\n\nclass _PixoramaState extends State {\n // The pixel image controller contains our image data and handles updates.\n // If it is null, the image has not yet been loaded from the server.\n PixelImageController? _imageController;\n\n @override\n void initState() {\n super.initState();\n\n // Connect to the server and start listening to updates.\n _listenToUpdates();\n }\n}\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Next, let's implement the ",(0,a.jsx)(n.code,{children:"_listenToUpdates"})," method. The ",(0,a.jsx)(n.code,{children:"_listenToUpdates"})," method runs indefinitely, maintaining a connection to the server and processing updates as they arrive. It handles both ",(0,a.jsx)(n.code,{children:"ImageData"})," (the full image) and ",(0,a.jsx)(n.code,{children:"ImageUpdate"})," (individual pixel changes), updating the ",(0,a.jsx)(n.code,{children:"PixelImageController"})," accordingly. If the connection is lost, it will wait 5 seconds before it tries to reconnect to the server."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"// lib/src/pixorama.dart\n\nclass _PixoramaState extends State {\n // ...\n\n Future _listenToUpdates() async {\n // Indefinitely try to connect and listen to updates from the server.\n while (true) {\n try {\n // Get the stream of updates from the server.\n final imageUpdates = client.pixorama.imageUpdates();\n\n // Listen for updates from the stream. The await for construct will\n // wait for a message to arrive from the server, then run through the\n // body of the loop.\n await for (final update in imageUpdates) {\n // Check which type of update we have received.\n if (update is ImageData) {\n // This is a complete image update, containing all pixels in the\n // image. Create a new PixelImageController with the pixel data.\n setState(() {\n _imageController = PixelImageController(\n pixels: update.pixels,\n palette: PixelPalette.rPlace(),\n width: update.width,\n height: update.height,\n );\n });\n } else if (update is ImageUpdate) {\n // Got an incremental update of the image. Just set the single\n // pixel.\n _imageController?.setPixelIndex(\n pixelIndex: update.pixelIndex,\n colorIndex: update.colorIndex,\n );\n }\n }\n } on MethodStreamException catch (_) {\n // We lost the connection to the server, or failed to connect.\n setState(() {\n _imageController = null;\n });\n }\n\n // Wait 5 seconds until we try to connect again.\n await Future.delayed(Duration(seconds: 5));\n }\n }\n}\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Worth noting is that the ",(0,a.jsx)(n.code,{children:"MethodStreamException"})," is a superclass of a set of more detailed exceptions. It's often sufficient to catch all types of failures (like what we do here) that can happen when streaming data, but it's possible to detect if the stream failed because we failed to connect, if the server went down, or if the connection was lost."]}),"\n",(0,a.jsx)(n.h3,{id:"building-the-interface",children:"Building the Interface"}),"\n",(0,a.jsxs)(n.p,{children:["Finally, we need to implement the widget's ",(0,a.jsx)(n.code,{children:"build"})," method, where we create the user interface for drawing pixels. We display a progress indicator if the ",(0,a.jsx)(n.code,{children:"_imageController"})," is ",(0,a.jsx)(n.code,{children:"null"})," (indicating no image has been received yet). Once the image is received, we use the ",(0,a.jsx)(n.code,{children:"PixelEditor"})," widget to render it, and any pixel changes made by the user are sent to the server via the ",(0,a.jsx)(n.code,{children:"setPixel"})," method."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"// lib/src/pixorama.dart\n\nclass _PixoramaState extends State {\n // ...\n\n @override\n Widget build(BuildContext context) {\n return Center(\n child: _imageController == null\n ? const CircularProgressIndicator()\n : PixelEditor(\n controller: _imageController!,\n onSetPixel: (details) {\n // When a user clicks a pixel we will get a callback from the\n // PixelImageController, with information about the changed\n // pixel. When that happens we call the setPixels method on\n // the server.\n client.pixorama.setPixel(\n pixelIndex: details.tapDetails.index,\n colorIndex: details.colorIndex,\n );\n },\n ),\n );\n }\n}\n"})}),"\n",(0,a.jsx)(n.h2,{id:"running-pixorama",children:"Running Pixorama"}),"\n",(0,a.jsxs)(n.p,{children:["To test Pixorama, start the server by navigating to the ",(0,a.jsx)(n.code,{children:"pixorama_server"})," directory and running:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"dart bin/main.dart\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Then, launch the Flutter app by changing to the ",(0,a.jsx)(n.code,{children:"pixorama_flutter"})," directory and running:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"flutter run -d chrome\n"})}),"\n",(0,a.jsx)(n.p,{children:"You can also start a second instance of the app to see real-time updates reflected across both instances."}),"\n",(0,a.jsx)(n.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,a.jsxs)(n.p,{children:["This project was a brief introduction to building real-time apps with Flutter and Serverpod. With less than a page of code on the server side, we created a collaborative drawing app that's both fun and functional. You can find the full Pixorama code on GitHub here:\n",(0,a.jsx)(n.a,{href:"https://github.com/serverpod/pixorama",children:"https://github.com/serverpod/pixorama"})]}),"\n",(0,a.jsx)(n.p,{children:"Happy coding!"})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},73381:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/pixorama-183dc43ee2a7c5cec50ac9da4ee25e1d.png"},11151:(e,n,t)=>{t.d(n,{Z:()=>o,a:()=>s});var a=t(67294);const i={},r=a.createContext(i);function s(e){const n=a.useContext(r);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),a.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/5cde491b.adda50dd.js b/docs/assets/js/5cde491b.adda50dd.js new file mode 100644 index 000000000..620e5bb78 --- /dev/null +++ b/docs/assets/js/5cde491b.adda50dd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkserverpod_docs=self.webpackChunkserverpod_docs||[]).push([[93911],{67475:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>s,default:()=>h,frontMatter:()=>i,metadata:()=>a,toc:()=>l});var r=t(85893),o=t(11151);const i={},s="Get started with Mini",a={id:"get-started-with-mini",title:"Get started with Mini",description:"Serverpod Mini is a slimmer version of Serverpod that does not need to be connected to a Postgres database. Before you begin, make sure that you have Flutter and Serverpod installed.",source:"@site/docs/02-get-started-with-mini.md",sourceDirName:".",slug:"/get-started-with-mini",permalink:"/next/get-started-with-mini",draft:!1,unlisted:!1,editUrl:"https://github.com/serverpod/serverpod_docs/tree/main/docs/02-get-started-with-mini.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Get started",permalink:"/next/get-started"},next:{title:"Capabilities",permalink:"/next/capabilities"}},d={},l=[{value:"Create a new project",id:"create-a-new-project",level:2},{value:"Creating models",id:"creating-models",level:2},{value:"Adding methods to your server",id:"adding-methods-to-your-server",level:2},{value:"Calling the server methods from the app",id:"calling-the-server-methods-from-the-app",level:2},{value:"Conclusion",id:"conclusion",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"get-started-with-mini",children:"Get started with Mini"})}),"\n",(0,r.jsxs)(n.p,{children:["Serverpod Mini is a slimmer version of Serverpod that does not need to be connected to a Postgres database. Before you begin, make sure that you have ",(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.a,{href:"https://flutter.dev/docs/get-started/install",children:"Flutter"})})," and ",(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.a,{href:"/",children:"Serverpod"})})," installed."]}),"\n",(0,r.jsx)("div",{style:{position:"relative",paddingBottom:"56.25%",height:"0"},children:(0,r.jsx)("iframe",{style:{position:"absolute",top:"0",left:"0",width:"100%",height:"100%"},width:"560",height:"315",src:"https://www.youtube-nocookie.com/embed/dSBK4JOZRyI",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:!0})}),"\n",(0,r.jsx)(n.h2,{id:"create-a-new-project",children:"Create a new project"}),"\n",(0,r.jsx)(n.p,{children:"Create a mini project by running:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"$ serverpod create myminipod --mini\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Serverpod will create a new project for you. It contains three Dart packages, but you only need to pay attention to the ",(0,r.jsx)(n.code,{children:"myminipod_server"})," and ",(0,r.jsx)(n.code,{children:"myminipod_flutter"})," directories. The server directory contains your server files, and the flutter directory contains your app. The third package (",(0,r.jsx)(n.code,{children:"myminipod_client"}),") contains generated code that is used by the Flutter app to communicate with the server."]}),"\n",(0,r.jsxs)(n.p,{children:["Start your server by changing directory into your server directory, and run the ",(0,r.jsx)(n.code,{children:"bin/main.dart"})," file:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"$ cd myminipod/myminipod_server\n$ dart bin/main.dart\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Your default project comes with a sample Flutter app, all hooked up to talk with your server. Run it with the ",(0,r.jsx)(n.code,{children:"flutter"})," command:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"$ cd myminipod/myminipod_flutter\n$ flutter run -d chrome\n"})}),"\n",(0,r.jsx)(n.p,{children:"Easy as that. \ud83e\udd73"}),"\n",(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsx)(n.p,{children:"If you are using VS Code, install our Serverpod extension. It will help you validate any Serverpod-related files in your project!"})}),"\n",(0,r.jsx)(n.h2,{id:"creating-models",children:"Creating models"}),"\n",(0,r.jsxs)(n.p,{children:["In Serverpod, you define your models in easy-to-read YAML-files, which you place in your server\u2019s ",(0,r.jsx)(n.code,{children:"lib/src/models"})," directory. Model files will be converted to Dart classes that can be serialized and sent to and from the server to your app. This is an example of a model file:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:"class: Company\nfields:\n name: String\n foundedDate: DateTime?\n employees: List\n"})}),"\n",(0,r.jsxs)(n.p,{children:["For types, you can use most basic Dart types, such as ",(0,r.jsx)(n.code,{children:"String"}),", ",(0,r.jsx)(n.code,{children:"double"}),", ",(0,r.jsx)(n.code,{children:"int"}),", ",(0,r.jsx)(n.code,{children:"bool"}),", ",(0,r.jsx)(n.code,{children:"DateTime"}),", and ",(0,r.jsx)(n.code,{children:"ByteData"}),". You can also include ",(0,r.jsx)(n.code,{children:"List"})," and ",(0,r.jsx)(n.code,{children:"Map"}),", just make sure to specify their types. Any other class specified among your models is also supported."]}),"\n",(0,r.jsxs)(n.p,{children:["Whenever you add or edit a model file, run ",(0,r.jsx)(n.code,{children:"serverpod generate"})," in your server directory. Then, Serverpod will generate all the updated Dart classes:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"$ cd myminipod/myminipod_server\n$ serverpod generate\n"})}),"\n",(0,r.jsx)(n.h2,{id:"adding-methods-to-your-server",children:"Adding methods to your server"}),"\n",(0,r.jsxs)(n.p,{children:["With Serverpod, you add Dart methods to endpoints placed in your server\u2019s ",(0,r.jsx)(n.code,{children:"lib/src/endpoints"})," directory. By doing so, Serverpod will analyze your server code and automatically generate the corresponding methods in your Flutter app. Calling a method on the server is just like calling a local method in your app."]}),"\n",(0,r.jsx)(n.p,{children:"For the server methods to work, there are a few things you need to keep in mind:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"You must place the methods in a class that extends the Endpoint class."}),"\n",(0,r.jsx)(n.li,{children:"The methods must return a typed Future. The types you use in your methods are the same as those supported by your models."}),"\n",(0,r.jsx)(n.li,{children:"The first parameter of your method must be a Session object. The session contains extra information about the call being made to the server, such as the HTTP request object."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"This is an example of an endpoint that uses the Company class that we defined in the example model in the previous section."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-dart",children:"import 'package:serverpod/serverpod.dart';\n\nclass CompanyEndpoint extends Endpoint {\n Future isLegit(Session session, Company company) async {\n // Check if the company has the foundedDate set and that it\n // has been around for more than one year.\n\n if (company.foundedDate == null) {\n return false;\n }\n\n var oneYearAgo = DateTime.now().subract(Duration(days: 365));\n return company.foundedDate!.isBefore(oneYearAgo);\n }\n}\n"})}),"\n",(0,r.jsxs)(n.p,{children:["After adding or modifying endpoints and endpoint methods, you must run ",(0,r.jsx)(n.code,{children:"serverpod generate"})," to keep your Flutter app up-to-date."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"$ cd myminipod/myminipod_server\n$ serverpod generate\n"})}),"\n",(0,r.jsx)(n.h2,{id:"calling-the-server-methods-from-the-app",children:"Calling the server methods from the app"}),"\n",(0,r.jsxs)(n.p,{children:["When you run ",(0,r.jsx)(n.code,{children:"serverpod generate"})," Serverpod will add your endpoints and server methods to the ",(0,r.jsx)(n.code,{children:"client"})," object in your Flutter app. From the client, you can access all endpoints and methods."]}),"\n",(0,r.jsxs)(n.p,{children:["To call the endpoint method we just created from Flutter, just create a ",(0,r.jsx)(n.code,{children:"Company"})," object, call the method, and await the result:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-dart",children:"var company = Company(\n name: 'Serverpod',\n foundedDate: DateTime(2021, 9, 27),\n employees: [\n 'Alex',\n 'Isak',\n 'Viktor',\n ],\n);\n\nvar result = await client.company.isLegit(company);\n"})}),"\n",(0,r.jsx)(n.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,r.jsxs)(n.p,{children:["You are now ready to start exploring the exciting world of Serverpod! And even if you start out with Serverpod mini, you can always ",(0,r.jsx)(n.a,{href:"upgrading/upgrade-from-mini",children:"upgrade"})," to the full version later."]})]})}function h(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>s});var r=t(67294);const o={},i=r.createContext(o);function s(e){const n=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/5cde491b.cb7b6cda.js b/docs/assets/js/5cde491b.cb7b6cda.js deleted file mode 100644 index 2d1d546ef..000000000 --- a/docs/assets/js/5cde491b.cb7b6cda.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkserverpod_docs=self.webpackChunkserverpod_docs||[]).push([[93911],{67475:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>i,default:()=>h,frontMatter:()=>s,metadata:()=>d,toc:()=>l});var r=t(85893),o=t(11151);const s={},i="Get started with Mini",d={id:"get-started-with-mini",title:"Get started with Mini",description:"Serverpod Mini is a slimmer version of Serverpod that does not need to be connected to a Postgres database. Before you begin, make sure that you have Flutter and Serverpod installed.",source:"@site/docs/02-get-started-with-mini.md",sourceDirName:".",slug:"/get-started-with-mini",permalink:"/next/get-started-with-mini",draft:!1,unlisted:!1,editUrl:"https://github.com/serverpod/serverpod_docs/tree/main/docs/02-get-started-with-mini.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Get started",permalink:"/next/get-started"},next:{title:"Capabilities",permalink:"/next/capabilities"}},a={},l=[{value:"Creating models",id:"creating-models",level:2},{value:"Adding methods to your server",id:"adding-methods-to-your-server",level:2},{value:"Calling the server methods from the app",id:"calling-the-server-methods-from-the-app",level:2},{value:"Conclusion",id:"conclusion",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"get-started-with-mini",children:"Get started with Mini"})}),"\n",(0,r.jsxs)(n.p,{children:["Serverpod Mini is a slimmer version of Serverpod that does not need to be connected to a Postgres database. Before you begin, make sure that you have ",(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.a,{href:"https://flutter.dev/docs/get-started/install",children:"Flutter"})})," and ",(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.a,{href:"/",children:"Serverpod"})})," installed."]}),"\n",(0,r.jsx)(n.p,{children:"Create a mini project by running:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"$ serverpod create myminipod --mini\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Serverpod will create a new project for you. It contains three Dart packages, but you only need to pay attention to the ",(0,r.jsx)(n.code,{children:"myminipod_server"})," and ",(0,r.jsx)(n.code,{children:"myminipod_flutter"})," directories. The server directory contains your server files, and the flutter directory contains your app. The third package (",(0,r.jsx)(n.code,{children:"myminipod_client"}),") contains generated code that is used by the Flutter app to communicate with the server."]}),"\n",(0,r.jsxs)(n.p,{children:["Start your server by changing directory into your server directory, and run the ",(0,r.jsx)(n.code,{children:"bin/main.dart"})," file:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"$ cd myminipod/myminipod_server\n$ dart bin/main.dart\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Your default project comes with a sample Flutter app, all hooked up to talk with your server. Run it with the ",(0,r.jsx)(n.code,{children:"flutter"})," command:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"$ cd myminipod/myminipod_flutter\n$ flutter run -d chrome\n"})}),"\n",(0,r.jsx)(n.p,{children:"Easy as that. \ud83e\udd73"}),"\n",(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsx)(n.p,{children:"If you are using VS Code, install our Serverpod extension. It will help you validate any Serverpod-related files in your project!"})}),"\n",(0,r.jsx)(n.h2,{id:"creating-models",children:"Creating models"}),"\n",(0,r.jsxs)(n.p,{children:["In Serverpod, you define your models in easy-to-read YAML-files, which you place in your server\u2019s ",(0,r.jsx)(n.code,{children:"lib/src/models"})," directory. Model files will be converted to Dart classes that can be serialized and sent to and from the server to your app. This is an example of a model file:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:"class: Company\nfields:\n name: String\n foundedDate: DateTime?\n employees: List\n"})}),"\n",(0,r.jsxs)(n.p,{children:["For types, you can use most basic Dart types, such as ",(0,r.jsx)(n.code,{children:"String"}),", ",(0,r.jsx)(n.code,{children:"double"}),", ",(0,r.jsx)(n.code,{children:"int"}),", ",(0,r.jsx)(n.code,{children:"bool"}),", ",(0,r.jsx)(n.code,{children:"DateTime"}),", and ",(0,r.jsx)(n.code,{children:"ByteData"}),". You can also include ",(0,r.jsx)(n.code,{children:"List"})," and ",(0,r.jsx)(n.code,{children:"Map"}),", just make sure to specify their types. Any other class specified among your models is also supported."]}),"\n",(0,r.jsxs)(n.p,{children:["Whenever you add or edit a model file, run ",(0,r.jsx)(n.code,{children:"serverpod generate"})," in your server directory. Then, Serverpod will generate all the updated Dart classes:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"$ cd myminipod/myminipod_server\n$ serverpod generate\n"})}),"\n",(0,r.jsx)(n.h2,{id:"adding-methods-to-your-server",children:"Adding methods to your server"}),"\n",(0,r.jsxs)(n.p,{children:["With Serverpod, you add Dart methods to endpoints placed in your server\u2019s ",(0,r.jsx)(n.code,{children:"lib/src/endpoints"})," directory. By doing so, Serverpod will analyze your server code and automatically generate the corresponding methods in your Flutter app. Calling a method on the server is just like calling a local method in your app."]}),"\n",(0,r.jsx)(n.p,{children:"For the server methods to work, there are a few things you need to keep in mind:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"You must place the methods in a class that extends the Endpoint class."}),"\n",(0,r.jsx)(n.li,{children:"The methods must return a typed Future. The types you use in your methods are the same as those supported by your models."}),"\n",(0,r.jsx)(n.li,{children:"The first parameter of your method must be a Session object. The session contains extra information about the call being made to the server, such as the HTTP request object."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"This is an example of an endpoint that uses the Company class that we defined in the example model in the previous section."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-dart",children:"import 'package:serverpod/serverpod.dart';\n\nclass CompanyEndpoint extends Endpoint {\n Future isLegit(Session session, Company company) async {\n // Check if the company has the foundedDate set and that it\n // has been around for more than one year.\n\n if (company.foundedDate == null) {\n return false;\n }\n\n var oneYearAgo = DateTime.now().subract(Duration(days: 365));\n return company.foundedDate!.isBefore(oneYearAgo);\n }\n}\n"})}),"\n",(0,r.jsxs)(n.p,{children:["After adding or modifying endpoints and endpoint methods, you must run ",(0,r.jsx)(n.code,{children:"serverpod generate"})," to keep your Flutter app up-to-date."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"$ cd myminipod/myminipod_server\n$ serverpod generate\n"})}),"\n",(0,r.jsx)(n.h2,{id:"calling-the-server-methods-from-the-app",children:"Calling the server methods from the app"}),"\n",(0,r.jsxs)(n.p,{children:["When you run ",(0,r.jsx)(n.code,{children:"serverpod generate"})," Serverpod will add your endpoints and server methods to the ",(0,r.jsx)(n.code,{children:"client"})," object in your Flutter app. From the client, you can access all endpoints and methods."]}),"\n",(0,r.jsxs)(n.p,{children:["To call the endpoint method we just created from Flutter, just create a ",(0,r.jsx)(n.code,{children:"Company"})," object, call the method, and await the result:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-dart",children:"var company = Company(\n name: 'Serverpod',\n foundedDate: DateTime(2021, 9, 27),\n employees: [\n 'Alex',\n 'Isak',\n 'Viktor',\n ],\n);\n\nvar result = await client.company.isLegit(company);\n"})}),"\n",(0,r.jsx)(n.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,r.jsxs)(n.p,{children:["You are now ready to start exploring the exciting world of Serverpod! And even if you start out with Serverpod mini, you can always ",(0,r.jsx)(n.a,{href:"upgrading/upgrade-from-mini",children:"upgrade"})," to the full version later."]})]})}function h(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>d,a:()=>i});var r=t(67294);const o={},s=r.createContext(o);function i(e){const n=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),r.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/78ae7ec8.5253f8ae.js b/docs/assets/js/78ae7ec8.5253f8ae.js new file mode 100644 index 000000000..f47b829dc --- /dev/null +++ b/docs/assets/js/78ae7ec8.5253f8ae.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkserverpod_docs=self.webpackChunkserverpod_docs||[]).push([[86517],{69786:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>o,toc:()=>l});var a=t(85893),i=t(11151);const r={},s="Real-time communication",o={id:"tutorials/real-time-communication",title:"Real-time communication",description:"Have you ever found real-time communication in apps challenging? It doesn't have to be. Today, we're diving into how to build a collaborative drawing experience using Flutter and Serverpod. We'll call our app Pixorama\u200a-\u200aa fun and interactive project inspired by Reddit's r/place. Pixorama lets users draw together on a shared grid, with every pixel placed updating in real-time across all connected devices.",source:"@site/versioned_docs/version-2.1.0/05-tutorials/02-real-time-communication.md",sourceDirName:"05-tutorials",slug:"/tutorials/real-time-communication",permalink:"/tutorials/real-time-communication",draft:!1,unlisted:!1,editUrl:"https://github.com/serverpod/serverpod_docs/tree/main/versioned_docs/version-2.1.0/05-tutorials/02-real-time-communication.md",tags:[],version:"2.1.0",sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Build your first app",permalink:"/tutorials/first-app"},next:{title:"Code examples",permalink:"/tutorials/code-example"}},d={},l=[{value:"What is Pixorama?",id:"what-is-pixorama",level:2},{value:"Understanding real-time communication",id:"understanding-real-time-communication",level:2},{value:"Setting up the\xa0project",id:"setting-up-theproject",level:2},{value:"Creating models",id:"creating-models",level:2},{value:"Building the\xa0server",id:"building-theserver",level:2},{value:"Handling pixel\xa0updates",id:"handling-pixelupdates",level:3},{value:"Building the Flutter\xa0app",id:"building-the-flutterapp",level:2},{value:"Building the Interface",id:"building-the-interface",level:3},{value:"Running Pixorama",id:"running-pixorama",level:2},{value:"Conclusion",id:"conclusion",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",p:"p",pre:"pre",...(0,i.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"real-time-communication",children:"Real-time communication"})}),"\n",(0,a.jsx)(n.p,{children:"Have you ever found real-time communication in apps challenging? It doesn't have to be. Today, we're diving into how to build a collaborative drawing experience using Flutter and Serverpod. We'll call our app Pixorama\u200a-\u200aa fun and interactive project inspired by Reddit's r/place. Pixorama lets users draw together on a shared grid, with every pixel placed updating in real-time across all connected devices."}),"\n",(0,a.jsx)("div",{style:{position:"relative",paddingBottom:"56.25%",height:"0"},children:(0,a.jsx)("iframe",{style:{position:"absolute",top:"0",left:"0",width:"100%",height:"100%"},width:"560",height:"315",src:"https://www.youtube-nocookie.com/embed/iCDeAvuMj8I",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:!0})}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.em,{children:"This tutorial is also available as a video."})}),"\n",(0,a.jsx)(n.admonition,{type:"info",children:(0,a.jsxs)(n.p,{children:["Before you begin, make sure that you have ",(0,a.jsx)(n.a,{href:"/",children:"installed Serverpod"}),". It's also recommended that you read the ",(0,a.jsx)(n.a,{href:"../get-started-with-mini",children:"Get started with Mini"})," guide."]})}),"\n",(0,a.jsxs)(n.p,{children:["You can try out the final app here: ",(0,a.jsx)(n.a,{href:"https://pixorama.live",children:"https://pixorama.live"})]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.img,{alt:"Serverpod Insights",src:t(73381).Z+"",width:"2428",height:"2912"})}),"\n",(0,a.jsx)(n.h2,{id:"what-is-pixorama",children:"What is Pixorama?"}),"\n",(0,a.jsx)(n.p,{children:"Pixorama is a collaborative drawing app where users can place pixels on a grid to create images together. Imagine two instances of the app running simultaneously\u200a-\u200adraw a pixel on one and watch it instantly appear on the other. This seamless synchronization happens because each time you draw a pixel, a message is sent to the server, which then broadcasts it to all connected clients."}),"\n",(0,a.jsx)(n.h2,{id:"understanding-real-time-communication",children:"Understanding real-time communication"}),"\n",(0,a.jsx)(n.p,{children:"In traditional REST APIs, communication with the server involves sending a request and receiving a response. However, real-time communication requires the server to push updates to clients as they happen. This is commonly achieved using web sockets, which maintain an open connection between the server and client, allowing for continuous data exchange. While web sockets can be tricky, requiring data serialization and connection management, Serverpod simplifies this process."}),"\n",(0,a.jsxs)(n.p,{children:["With the release of Serverpod 2.1, a new feature called ",(0,a.jsx)(n.a,{href:"../concepts/streams",children:"streaming methods"})," was introduced. This feature allows us to return a stream from a server method and call it from our app. Serverpod handles the underlying web socket connection for us. Now, let's get started with building Pixorama."]}),"\n",(0,a.jsx)(n.h2,{id:"setting-up-theproject",children:"Setting up the\xa0project"}),"\n",(0,a.jsxs)(n.p,{children:["We begin by creating a new project with the ",(0,a.jsx)(n.code,{children:"serverpod create"})," command. Since we don't need to store data in a database, we'll use the Mini version of Serverpod. Serverpod Mini is a lightweight version of Serverpod without a database, advanced logging, and other features\u200a-\u200aperfect for our needs. Create the project with the command:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"serverpod create pixorama --mini\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Now, let's open the project in VS Code and explore the structure. The server code resides in the ",(0,a.jsx)(n.code,{children:"pixorama_server"})," package. We'll start by creating models\u200a-\u200aclasses that we can serialize and pass between the client and server. Our models will be placed in the ",(0,a.jsx)(n.code,{children:"lib/src/models"})," directory."]}),"\n",(0,a.jsx)(n.h2,{id:"creating-models",children:"Creating models"}),"\n",(0,a.jsxs)(n.p,{children:["First, we remove the ",(0,a.jsx)(n.code,{children:"example.spy.yaml"})," model, as we won't need it. We'll create two new models: ",(0,a.jsx)(n.code,{children:"ImageData"})," and ",(0,a.jsx)(n.code,{children:"ImageUpdate"}),". Place them in the ",(0,a.jsx)(n.code,{children:"lib/src/models"})," directory and call them ",(0,a.jsx)(n.code,{children:"image_data.spy.yaml"})," and ",(0,a.jsx)(n.code,{children:"image_update.spy.yaml"}),"."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:"# lib/src/models/image_data.spy.yaml\n\nclass: ImageData\nfields:\n pixels: ByteData\n width: int\n height: int\n"})}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"ImageData"})," model represents the entire image that will be sent to the app when it connects to the server. It stores the image's pixels as ByteData, where each byte represents a pixel. Additionally, it includes the image's width and height."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:"# lib/src/models/image_update.spy.yaml\n\nclass: ImageUpdate\nfields:\n pixelIndex: int\n colorIndex: int\n"})}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"ImageUpdate"})," model captures changes to individual pixels, including the pixel's index in the byte array and its new color value."]}),"\n",(0,a.jsxs)(n.p,{children:["With our models defined, we run serverpod generate to create the actual Dart files for these models. Run the command from your server's root directory (",(0,a.jsx)(n.code,{children:"pixorama_server"}),")."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"cd pixorama_server\nserverpod generate\n"})}),"\n",(0,a.jsx)(n.h2,{id:"building-theserver",children:"Building the\xa0server"}),"\n",(0,a.jsxs)(n.p,{children:["Next, we'll build the server. We need to create a new endpoint. An endpoint is a connection point for the client to interact with the server. In Serverpod, you create endpoints by extending the ",(0,a.jsx)(n.code,{children:"Endpoint"})," class and placing it in the ",(0,a.jsx)(n.code,{children:"lib/src/endpoints"})," directory. The endpoint will manage our pixel data and handle client updates."]}),"\n",(0,a.jsxs)(n.p,{children:["We will start by creating a ",(0,a.jsx)(n.code,{children:"PixoramaEndpoint"})," class, which we place in a file called ",(0,a.jsx)(n.code,{children:"pixorama_endpoint.dart"})," in the ",(0,a.jsx)(n.code,{children:"lib/src/endpoints"})," directory."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"// lib/src/endpoints/pixorama_endpoint.dart\n\nimport 'dart:typed_data';\n\nimport 'package:serverpod/serverpod.dart';\n\nclass PixoramaEndpoint extends Endpoint {\n static const _imageWidth = 64;\n static const _imageHeight = 64;\n static const _numPixels = _imageWidth * _imageHeight;\n\n static const _numColorsInPalette = 16;\n static const _defaultPixelColor = 2;\n \n final _pixelData = Uint8List(_numPixels)\n ..fillRange(\n 0,\n _numPixels,\n _defaultPixelColor,\n );\n}\n"})}),"\n",(0,a.jsxs)(n.p,{children:["We define a number of constants that define the dimensions of our image. We represent the image itself with a ",(0,a.jsx)(n.code,{children:"Uint8List"}),". Each byte in the list will be a pixel in our image."]}),"\n",(0,a.jsx)(n.h3,{id:"handling-pixelupdates",children:"Handling pixel\xa0updates"}),"\n",(0,a.jsxs)(n.p,{children:["The core functionality of Pixorama lies in how the server passes image data to clients and keeps them updated. Serverpod's built-in messaging system, Message Central, allows us to publish and subscribe to events. We create a channel named ",(0,a.jsx)(n.code,{children:"pixel-added"})," to handle pixel updates in our ",(0,a.jsx)(n.code,{children:"PixoramaEndpoint"})," class."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"// lib/src/endpoints/pixorama_endpoint.dart\n\nclass PixoramaEndpoint extends Endpoint {\n // ...\n\n static const _channelPixelAdded = 'pixel-added';\n}\n"})}),"\n",(0,a.jsxs)(n.p,{children:["When a user draws a pixel, the ",(0,a.jsx)(n.code,{children:"setPixel"})," endpoint method is called. This method verifies the validity of the input (ensuring the color index is within the valid range and the pixel index is within bounds). If valid, it updates our pixel data and broadcasts the update to all listeners within the server via the ",(0,a.jsx)(n.code,{children:"pixel-added"})," channel."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"// lib/src/endpoints/pixorama_endpoint.dart\n\n// Here we need to import the model files from our generated protocol.\nimport 'package:pixorama_server/src/generated/protocol.dart';\n\nclass PixoramaEndpoint extends Endpoint {\n // ...\n\n static const _channelPixelAdded = 'pixel-added';\n\n /// Sets a single pixel and notifies all connected clients about the change.\n Future setPixel(\n Session session, {\n required int colorIndex,\n required int pixelIndex,\n }) async {\n // Check that the input parameters are valid. If not, throw a\n // `FormatException`, which will be logged and thrown as\n // `ServerpodClientException` in the app.\n if (colorIndex < 0 || colorIndex >= _numColorsInPalette) {\n throw FormatException('colorIndex is out of range: $colorIndex');\n }\n if (pixelIndex < 0 || pixelIndex >= _numPixels) {\n throw FormatException('pixelIndex is out of range: $pixelIndex');\n }\n\n // Update our global image.\n _pixelData[pixelIndex] = colorIndex;\n\n // Notify all connected clients that we set a pixel, by posting a message\n // to the _channelPixelAdded channel.\n session.messages.postMessage(\n _channelPixelAdded,\n ImageUpdate(\n pixelIndex: pixelIndex,\n colorIndex: colorIndex,\n ),\n );\n }\n}\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Finally, we create an ",(0,a.jsx)(n.code,{children:"imageUpdates"})," method, which returns a stream of updates to clients. This method first sends the full image data to the client, followed by any subsequent pixel updates. This method will listen to updates from our ",(0,a.jsx)(n.code,{children:"pixel-added"})," channel and relay them to the client. By creating the stream from the message channel before sending the first update to our client, we ensure no message risks being lost between the first full update and the first individual pixel being sent."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"// lib/src/endpoints/pixorama_endpoint.dart\nclass PixoramaEndpoint extends Endpoint {\n // ...\n\n /// Returns a stream of image updates. The first message will always be a\n /// `ImageData` object, which contains the full image. Sequential updates\n /// will be `ImageUpdate` objects, which contains a single updated pixel.\n Stream imageUpdates(Session session) async* {\n // Request a stream of updates from the pixel-added channel in\n // MessageCentral.\n var updateStream =\n session.messages.createStream(_channelPixelAdded);\n\n // Yield a first full image to the client.\n yield ImageData(\n pixels: _pixelData.buffer.asByteData(),\n width: _imageWidth,\n height: _imageHeight,\n );\n\n // Relay all individual pixel updates from the pixel-added channel to\n // the client.\n await for (var imageUpdate in updateStream) {\n yield imageUpdate;\n }\n }\n}\n"})}),"\n",(0,a.jsx)(n.p,{children:"That's all the code we need to write for the server side. To make the new endpoint available to our Flutter app, we run serverpod generate in the root directory of our server."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"cd pixorama_server\nserverpod generate\n"})}),"\n",(0,a.jsx)(n.h2,{id:"building-the-flutterapp",children:"Building the Flutter\xa0app"}),"\n",(0,a.jsxs)(n.p,{children:["With the server side complete, it's time to build the Flutter app. When we created the project, Serverpod set up a basic Flutter app for us in the ",(0,a.jsx)(n.code,{children:"pixorama_flutter"})," package."]}),"\n",(0,a.jsxs)(n.p,{children:["First, we will use the pixels package to draw our pixel editor. Import it by running the following command in your ",(0,a.jsx)(n.code,{children:"pixorama_flutter"})," directory:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"cd pixorama_flutter\nflutter pub add pixels\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Next, let's open the ",(0,a.jsx)(n.code,{children:"main.dart"})," file and rename the ",(0,a.jsx)(n.code,{children:"MyHomePage"})," class to ",(0,a.jsx)(n.code,{children:"PixoramaApp"}),". We also remove the demo code and replace it with a ",(0,a.jsx)(n.code,{children:"Scaffold"})," containing a ",(0,a.jsx)(n.code,{children:"Pixorama"})," widget. This is our new main file:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"// lib/main.dart\n\nimport 'package:pixorama_client/pixorama_client.dart';\nimport 'package:flutter/material.dart';\nimport 'package:serverpod_flutter/serverpod_flutter.dart';\n\nimport 'src/pixorama.dart';\n\nvar client = Client('http://$localhost:8080/')\n ..connectivityMonitor = FlutterConnectivityMonitor();\n\nvoid main() {\n // Start the app.\n runApp(const PixoramaApp());\n}\n\nclass PixoramaApp extends StatelessWidget {\n const PixoramaApp({super.key});\n\n @override\n Widget build(BuildContext context) {\n return MaterialApp(\n title: 'Pixorama',\n theme: ThemeData(\n primarySwatch: Colors.blue,\n ),\n home: Scaffold(\n body: const Pixorama(),\n ),\n );\n }\n}\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Now, we will create the ",(0,a.jsx)(n.code,{children:"Pixorama"})," widget. This is where all the drawing magic will happen. Create a new file called ",(0,a.jsx)(n.code,{children:"pixorama.dart"})," and place it in ",(0,a.jsx)(n.code,{children:"lib/src"}),". Start by creating a new stateful widget called ",(0,a.jsx)(n.code,{children:"Pixorama"}),". We are also importing a few of the packages and files we are going to use:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"// lib/src/pixorama.dart\n\nimport 'package:flutter/material.dart';\nimport 'package:pixels/pixels.dart';\nimport 'package:pixorama_client/pixorama_client.dart';\n\nimport '../../main.dart';\n\nclass Pixorama extends StatefulWidget {\n const Pixorama({super.key});\n\n @override\n State createState() => _PixoramaState();\n}\n\nclass _PixoramaState extends State {\n}\n"})}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"Pixorama"})," widget draws the image using the ",(0,a.jsx)(n.code,{children:"PixelEditor"})," from the ",(0,a.jsx)(n.code,{children:"pixels"})," package. A ",(0,a.jsx)(n.code,{children:"PixelImageController"})," manages the pixel data, and in the ",(0,a.jsx)(n.code,{children:"initState"})," method, we call a ",(0,a.jsx)(n.code,{children:"_listenToUpdates"})," method to connect to the server and listen for updates. Let's add the ",(0,a.jsx)(n.code,{children:"PixelImageController"})," and ",(0,a.jsx)(n.code,{children:"initState"})," method to our ",(0,a.jsx)(n.code,{children:"_PixoramaState"})," class:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"// lib/src/pixorama.dart\n\nclass _PixoramaState extends State {\n // The pixel image controller contains our image data and handles updates.\n // If it is null, the image has not yet been loaded from the server.\n PixelImageController? _imageController;\n\n @override\n void initState() {\n super.initState();\n\n // Connect to the server and start listening to updates.\n _listenToUpdates();\n }\n}\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Next, let's implement the ",(0,a.jsx)(n.code,{children:"_listenToUpdates"})," method. The ",(0,a.jsx)(n.code,{children:"_listenToUpdates"})," method runs indefinitely, maintaining a connection to the server and processing updates as they arrive. It handles both ",(0,a.jsx)(n.code,{children:"ImageData"})," (the full image) and ",(0,a.jsx)(n.code,{children:"ImageUpdate"})," (individual pixel changes), updating the ",(0,a.jsx)(n.code,{children:"PixelImageController"})," accordingly. If the connection is lost, it will wait 5 seconds before it tries to reconnect to the server."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"// lib/src/pixorama.dart\n\nclass _PixoramaState extends State {\n // ...\n\n Future _listenToUpdates() async {\n // Indefinitely try to connect and listen to updates from the server.\n while (true) {\n try {\n // Get the stream of updates from the server.\n final imageUpdates = client.pixorama.imageUpdates();\n\n // Listen for updates from the stream. The await for construct will\n // wait for a message to arrive from the server, then run through the\n // body of the loop.\n await for (final update in imageUpdates) {\n // Check which type of update we have received.\n if (update is ImageData) {\n // This is a complete image update, containing all pixels in the\n // image. Create a new PixelImageController with the pixel data.\n setState(() {\n _imageController = PixelImageController(\n pixels: update.pixels,\n palette: PixelPalette.rPlace(),\n width: update.width,\n height: update.height,\n );\n });\n } else if (update is ImageUpdate) {\n // Got an incremental update of the image. Just set the single\n // pixel.\n _imageController?.setPixelIndex(\n pixelIndex: update.pixelIndex,\n colorIndex: update.colorIndex,\n );\n }\n }\n } on MethodStreamException catch (_) {\n // We lost the connection to the server, or failed to connect.\n setState(() {\n _imageController = null;\n });\n }\n\n // Wait 5 seconds until we try to connect again.\n await Future.delayed(Duration(seconds: 5));\n }\n }\n}\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Worth noting is that the ",(0,a.jsx)(n.code,{children:"MethodStreamException"})," is a superclass of a set of more detailed exceptions. It's often sufficient to catch all types of failures (like what we do here) that can happen when streaming data, but it's possible to detect if the stream failed because we failed to connect, if the server went down, or if the connection was lost."]}),"\n",(0,a.jsx)(n.h3,{id:"building-the-interface",children:"Building the Interface"}),"\n",(0,a.jsxs)(n.p,{children:["Finally, we need to implement the widget's ",(0,a.jsx)(n.code,{children:"build"})," method, where we create the user interface for drawing pixels. We display a progress indicator if the ",(0,a.jsx)(n.code,{children:"_imageController"})," is ",(0,a.jsx)(n.code,{children:"null"})," (indicating no image has been received yet). Once the image is received, we use the ",(0,a.jsx)(n.code,{children:"PixelEditor"})," widget to render it, and any pixel changes made by the user are sent to the server via the ",(0,a.jsx)(n.code,{children:"setPixel"})," method."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"// lib/src/pixorama.dart\n\nclass _PixoramaState extends State {\n // ...\n\n @override\n Widget build(BuildContext context) {\n return Center(\n child: _imageController == null\n ? const CircularProgressIndicator()\n : PixelEditor(\n controller: _imageController!,\n onSetPixel: (details) {\n // When a user clicks a pixel we will get a callback from the\n // PixelImageController, with information about the changed\n // pixel. When that happens we call the setPixels method on\n // the server.\n client.pixorama.setPixel(\n pixelIndex: details.tapDetails.index,\n colorIndex: details.colorIndex,\n );\n },\n ),\n );\n }\n}\n"})}),"\n",(0,a.jsx)(n.h2,{id:"running-pixorama",children:"Running Pixorama"}),"\n",(0,a.jsxs)(n.p,{children:["To test Pixorama, start the server by navigating to the ",(0,a.jsx)(n.code,{children:"pixorama_server"})," directory and running:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"dart bin/main.dart\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Then, launch the Flutter app by changing to the ",(0,a.jsx)(n.code,{children:"pixorama_flutter"})," directory and running:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"flutter run -d chrome\n"})}),"\n",(0,a.jsx)(n.p,{children:"You can also start a second instance of the app to see real-time updates reflected across both instances."}),"\n",(0,a.jsx)(n.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,a.jsxs)(n.p,{children:["This project was a brief introduction to building real-time apps with Flutter and Serverpod. With less than a page of code on the server side, we created a collaborative drawing app that's both fun and functional. You can find the full Pixorama code on GitHub here:\n",(0,a.jsx)(n.a,{href:"https://github.com/serverpod/pixorama",children:"https://github.com/serverpod/pixorama"})]}),"\n",(0,a.jsx)(n.p,{children:"Happy coding!"})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},73381:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/pixorama-183dc43ee2a7c5cec50ac9da4ee25e1d.png"},11151:(e,n,t)=>{t.d(n,{Z:()=>o,a:()=>s});var a=t(67294);const i={},r=a.createContext(i);function s(e){const n=a.useContext(r);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),a.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/78ae7ec8.6ea9b967.js b/docs/assets/js/78ae7ec8.6ea9b967.js deleted file mode 100644 index c7395fb1f..000000000 --- a/docs/assets/js/78ae7ec8.6ea9b967.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkserverpod_docs=self.webpackChunkserverpod_docs||[]).push([[86517],{69786:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>o,toc:()=>l});var a=t(85893),i=t(11151);const r={},s="Real-time communication",o={id:"tutorials/real-time-communication",title:"Real-time communication",description:"Have you ever found real-time communication in apps challenging? It doesn't have to be. Today, we're diving into how to build a collaborative drawing experience using Flutter and Serverpod. We'll call our app Pixorama\u200a-\u200aa fun and interactive project inspired by Reddit's r/place. Pixorama lets users draw together on a shared grid, with every pixel placed updating in real-time across all connected devices.",source:"@site/versioned_docs/version-2.1.0/05-tutorials/02-real-time-communication.md",sourceDirName:"05-tutorials",slug:"/tutorials/real-time-communication",permalink:"/tutorials/real-time-communication",draft:!1,unlisted:!1,editUrl:"https://github.com/serverpod/serverpod_docs/tree/main/versioned_docs/version-2.1.0/05-tutorials/02-real-time-communication.md",tags:[],version:"2.1.0",sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Build your first app",permalink:"/tutorials/first-app"},next:{title:"Code examples",permalink:"/tutorials/code-example"}},d={},l=[{value:"What is Pixorama?",id:"what-is-pixorama",level:2},{value:"Understanding real-time communication",id:"understanding-real-time-communication",level:2},{value:"Setting up the\xa0project",id:"setting-up-theproject",level:2},{value:"Creating models",id:"creating-models",level:2},{value:"Building the\xa0server",id:"building-theserver",level:2},{value:"Handling pixel\xa0updates",id:"handling-pixelupdates",level:3},{value:"Building the Flutter\xa0app",id:"building-the-flutterapp",level:2},{value:"Building the Interface",id:"building-the-interface",level:3},{value:"Running Pixorama",id:"running-pixorama",level:2},{value:"Conclusion",id:"conclusion",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",p:"p",pre:"pre",...(0,i.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"real-time-communication",children:"Real-time communication"})}),"\n",(0,a.jsx)(n.p,{children:"Have you ever found real-time communication in apps challenging? It doesn't have to be. Today, we're diving into how to build a collaborative drawing experience using Flutter and Serverpod. We'll call our app Pixorama\u200a-\u200aa fun and interactive project inspired by Reddit's r/place. Pixorama lets users draw together on a shared grid, with every pixel placed updating in real-time across all connected devices."}),"\n",(0,a.jsx)(n.admonition,{type:"info",children:(0,a.jsxs)(n.p,{children:["Before you begin, make sure that you have ",(0,a.jsx)(n.a,{href:"/",children:"installed Serverpod"}),". It's also recommended that you read the ",(0,a.jsx)(n.a,{href:"../get-started-with-mini",children:"Get started with Mini"})," guide."]})}),"\n",(0,a.jsxs)(n.p,{children:["You can try out the final app here: ",(0,a.jsx)(n.a,{href:"https://pixorama.live",children:"https://pixorama.live"})]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.img,{alt:"Serverpod Insights",src:t(73381).Z+"",width:"2428",height:"2912"})}),"\n",(0,a.jsx)(n.h2,{id:"what-is-pixorama",children:"What is Pixorama?"}),"\n",(0,a.jsx)(n.p,{children:"Pixorama is a collaborative drawing app where users can place pixels on a grid to create images together. Imagine two instances of the app running simultaneously\u200a-\u200adraw a pixel on one and watch it instantly appear on the other. This seamless synchronization happens because each time you draw a pixel, a message is sent to the server, which then broadcasts it to all connected clients."}),"\n",(0,a.jsx)(n.h2,{id:"understanding-real-time-communication",children:"Understanding real-time communication"}),"\n",(0,a.jsx)(n.p,{children:"In traditional REST APIs, communication with the server involves sending a request and receiving a response. However, real-time communication requires the server to push updates to clients as they happen. This is commonly achieved using web sockets, which maintain an open connection between the server and client, allowing for continuous data exchange. While web sockets can be tricky, requiring data serialization and connection management, Serverpod simplifies this process."}),"\n",(0,a.jsxs)(n.p,{children:["With the release of Serverpod 2.1, a new feature called ",(0,a.jsx)(n.a,{href:"../concepts/streams",children:"streaming methods"})," was introduced. This feature allows us to return a stream from a server method and call it from our app. Serverpod handles the underlying web socket connection for us. Now, let's get started with building Pixorama."]}),"\n",(0,a.jsx)(n.h2,{id:"setting-up-theproject",children:"Setting up the\xa0project"}),"\n",(0,a.jsxs)(n.p,{children:["We begin by creating a new project with the ",(0,a.jsx)(n.code,{children:"serverpod create"})," command. Since we don't need to store data in a database, we'll use the Mini version of Serverpod. Serverpod Mini is a lightweight version of Serverpod without a database, advanced logging, and other features\u200a-\u200aperfect for our needs. Create the project with the command:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"serverpod create pixorama --mini\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Now, let's open the project in VS Code and explore the structure. The server code resides in the ",(0,a.jsx)(n.code,{children:"pixorama_server"})," package. We'll start by creating models\u200a-\u200aclasses that we can serialize and pass between the client and server. Our models will be placed in the ",(0,a.jsx)(n.code,{children:"lib/src/models"})," directory."]}),"\n",(0,a.jsx)(n.h2,{id:"creating-models",children:"Creating models"}),"\n",(0,a.jsxs)(n.p,{children:["First, we remove the ",(0,a.jsx)(n.code,{children:"example.spy.yaml"})," model, as we won't need it. We'll create two new models: ",(0,a.jsx)(n.code,{children:"ImageData"})," and ",(0,a.jsx)(n.code,{children:"ImageUpdate"}),". Place them in the ",(0,a.jsx)(n.code,{children:"lib/src/models"})," directory and call them ",(0,a.jsx)(n.code,{children:"image_data.spy.yaml"})," and ",(0,a.jsx)(n.code,{children:"image_update.spy.yaml"}),"."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:"# lib/src/models/image_data.spy.yaml\n\nclass: ImageData\nfields:\n pixels: ByteData\n width: int\n height: int\n"})}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"ImageData"})," model represents the entire image that will be sent to the app when it connects to the server. It stores the image's pixels as ByteData, where each byte represents a pixel. Additionally, it includes the image's width and height."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:"# lib/src/models/image_update.spy.yaml\n\nclass: ImageUpdate\nfields:\n pixelIndex: int\n colorIndex: int\n"})}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"ImageUpdate"})," model captures changes to individual pixels, including the pixel's index in the byte array and its new color value."]}),"\n",(0,a.jsxs)(n.p,{children:["With our models defined, we run serverpod generate to create the actual Dart files for these models. Run the command from your server's root directory (",(0,a.jsx)(n.code,{children:"pixorama_server"}),")."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"cd pixorama_server\nserverpod generate\n"})}),"\n",(0,a.jsx)(n.h2,{id:"building-theserver",children:"Building the\xa0server"}),"\n",(0,a.jsxs)(n.p,{children:["Next, we'll build the server. We need to create a new endpoint. An endpoint is a connection point for the client to interact with the server. In Serverpod, you create endpoints by extending the ",(0,a.jsx)(n.code,{children:"Endpoint"})," class and placing it in the ",(0,a.jsx)(n.code,{children:"lib/src/endpoints"})," directory. The endpoint will manage our pixel data and handle client updates."]}),"\n",(0,a.jsxs)(n.p,{children:["We will start by creating a ",(0,a.jsx)(n.code,{children:"PixoramaEndpoint"})," class, which we place in a file called ",(0,a.jsx)(n.code,{children:"pixorama_endpoint.dart"})," in the ",(0,a.jsx)(n.code,{children:"lib/src/endpoints"})," directory."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"// lib/src/endpoints/pixorama_endpoint.dart\n\nimport 'dart:typed_data';\n\nimport 'package:serverpod/serverpod.dart';\n\nclass PixoramaEndpoint extends Endpoint {\n static const _imageWidth = 64;\n static const _imageHeight = 64;\n static const _numPixels = _imageWidth * _imageHeight;\n\n static const _numColorsInPalette = 16;\n static const _defaultPixelColor = 2;\n \n final _pixelData = Uint8List(_numPixels)\n ..fillRange(\n 0,\n _numPixels,\n _defaultPixelColor,\n );\n}\n"})}),"\n",(0,a.jsxs)(n.p,{children:["We define a number of constants that define the dimensions of our image. We represent the image itself with a ",(0,a.jsx)(n.code,{children:"Uint8List"}),". Each byte in the list will be a pixel in our image."]}),"\n",(0,a.jsx)(n.h3,{id:"handling-pixelupdates",children:"Handling pixel\xa0updates"}),"\n",(0,a.jsxs)(n.p,{children:["The core functionality of Pixorama lies in how the server passes image data to clients and keeps them updated. Serverpod's built-in messaging system, Message Central, allows us to publish and subscribe to events. We create a channel named ",(0,a.jsx)(n.code,{children:"pixel-added"})," to handle pixel updates in our ",(0,a.jsx)(n.code,{children:"PixoramaEndpoint"})," class."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"// lib/src/endpoints/pixorama_endpoint.dart\n\nclass PixoramaEndpoint extends Endpoint {\n // ...\n\n static const _channelPixelAdded = 'pixel-added';\n}\n"})}),"\n",(0,a.jsxs)(n.p,{children:["When a user draws a pixel, the ",(0,a.jsx)(n.code,{children:"setPixel"})," endpoint method is called. This method verifies the validity of the input (ensuring the color index is within the valid range and the pixel index is within bounds). If valid, it updates our pixel data and broadcasts the update to all listeners within the server via the ",(0,a.jsx)(n.code,{children:"pixel-added"})," channel."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"// lib/src/endpoints/pixorama_endpoint.dart\n\n// Here we need to import the model files from our generated protocol.\nimport 'package:pixorama_server/src/generated/protocol.dart';\n\nclass PixoramaEndpoint extends Endpoint {\n // ...\n\n static const _channelPixelAdded = 'pixel-added';\n\n /// Sets a single pixel and notifies all connected clients about the change.\n Future setPixel(\n Session session, {\n required int colorIndex,\n required int pixelIndex,\n }) async {\n // Check that the input parameters are valid. If not, throw a\n // `FormatException`, which will be logged and thrown as\n // `ServerpodClientException` in the app.\n if (colorIndex < 0 || colorIndex >= _numColorsInPalette) {\n throw FormatException('colorIndex is out of range: $colorIndex');\n }\n if (pixelIndex < 0 || pixelIndex >= _numPixels) {\n throw FormatException('pixelIndex is out of range: $pixelIndex');\n }\n\n // Update our global image.\n _pixelData[pixelIndex] = colorIndex;\n\n // Notify all connected clients that we set a pixel, by posting a message\n // to the _channelPixelAdded channel.\n session.messages.postMessage(\n _channelPixelAdded,\n ImageUpdate(\n pixelIndex: pixelIndex,\n colorIndex: colorIndex,\n ),\n );\n }\n}\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Finally, we create an ",(0,a.jsx)(n.code,{children:"imageUpdates"})," method, which returns a stream of updates to clients. This method first sends the full image data to the client, followed by any subsequent pixel updates. This method will listen to updates from our ",(0,a.jsx)(n.code,{children:"pixel-added"})," channel and relay them to the client. By creating the stream from the message channel before sending the first update to our client, we ensure no message risks being lost between the first full update and the first individual pixel being sent."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"// lib/src/endpoints/pixorama_endpoint.dart\nclass PixoramaEndpoint extends Endpoint {\n // ...\n\n /// Returns a stream of image updates. The first message will always be a\n /// `ImageData` object, which contains the full image. Sequential updates\n /// will be `ImageUpdate` objects, which contains a single updated pixel.\n Stream imageUpdates(Session session) async* {\n // Request a stream of updates from the pixel-added channel in\n // MessageCentral.\n var updateStream =\n session.messages.createStream(_channelPixelAdded);\n\n // Yield a first full image to the client.\n yield ImageData(\n pixels: _pixelData.buffer.asByteData(),\n width: _imageWidth,\n height: _imageHeight,\n );\n\n // Relay all individual pixel updates from the pixel-added channel to\n // the client.\n await for (var imageUpdate in updateStream) {\n yield imageUpdate;\n }\n }\n}\n"})}),"\n",(0,a.jsx)(n.p,{children:"That's all the code we need to write for the server side. To make the new endpoint available to our Flutter app, we run serverpod generate in the root directory of our server."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"cd pixorama_server\nserverpod generate\n"})}),"\n",(0,a.jsx)(n.h2,{id:"building-the-flutterapp",children:"Building the Flutter\xa0app"}),"\n",(0,a.jsxs)(n.p,{children:["With the server side complete, it's time to build the Flutter app. When we created the project, Serverpod set up a basic Flutter app for us in the ",(0,a.jsx)(n.code,{children:"pixorama_flutter"})," package."]}),"\n",(0,a.jsxs)(n.p,{children:["First, we will use the pixels package to draw our pixel editor. Import it by running the following command in your ",(0,a.jsx)(n.code,{children:"pixorama_flutter"})," directory:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"cd pixorama_flutter\nflutter pub add pixels\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Next, let's open the ",(0,a.jsx)(n.code,{children:"main.dart"})," file and rename the ",(0,a.jsx)(n.code,{children:"MyHomePage"})," class to ",(0,a.jsx)(n.code,{children:"PixoramaApp"}),". We also remove the demo code and replace it with a ",(0,a.jsx)(n.code,{children:"Scaffold"})," containing a ",(0,a.jsx)(n.code,{children:"Pixorama"})," widget. This is our new main file:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"// lib/main.dart\n\nimport 'package:pixorama_client/pixorama_client.dart';\nimport 'package:flutter/material.dart';\nimport 'package:serverpod_flutter/serverpod_flutter.dart';\n\nimport 'src/pixorama.dart';\n\nvar client = Client('http://$localhost:8080/')\n ..connectivityMonitor = FlutterConnectivityMonitor();\n\nvoid main() {\n // Start the app.\n runApp(const PixoramaApp());\n}\n\nclass PixoramaApp extends StatelessWidget {\n const PixoramaApp({super.key});\n\n @override\n Widget build(BuildContext context) {\n return MaterialApp(\n title: 'Pixorama',\n theme: ThemeData(\n primarySwatch: Colors.blue,\n ),\n home: Scaffold(\n body: const Pixorama(),\n ),\n );\n }\n}\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Now, we will create the ",(0,a.jsx)(n.code,{children:"Pixorama"})," widget. This is where all the drawing magic will happen. Create a new file called ",(0,a.jsx)(n.code,{children:"pixorama.dart"})," and place it in ",(0,a.jsx)(n.code,{children:"lib/src"}),". Start by creating a new stateful widget called ",(0,a.jsx)(n.code,{children:"Pixorama"}),". We are also importing a few of the packages and files we are going to use:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"// lib/src/pixorama.dart\n\nimport 'package:flutter/material.dart';\nimport 'package:pixels/pixels.dart';\nimport 'package:pixorama_client/pixorama_client.dart';\n\nimport '../../main.dart';\n\nclass Pixorama extends StatefulWidget {\n const Pixorama({super.key});\n\n @override\n State createState() => _PixoramaState();\n}\n\nclass _PixoramaState extends State {\n}\n"})}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"Pixorama"})," widget draws the image using the ",(0,a.jsx)(n.code,{children:"PixelEditor"})," from the ",(0,a.jsx)(n.code,{children:"pixels"})," package. A ",(0,a.jsx)(n.code,{children:"PixelImageController"})," manages the pixel data, and in the ",(0,a.jsx)(n.code,{children:"initState"})," method, we call a ",(0,a.jsx)(n.code,{children:"_listenToUpdates"})," method to connect to the server and listen for updates. Let's add the ",(0,a.jsx)(n.code,{children:"PixelImageController"})," and ",(0,a.jsx)(n.code,{children:"initState"})," method to our ",(0,a.jsx)(n.code,{children:"_PixoramaState"})," class:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"// lib/src/pixorama.dart\n\nclass _PixoramaState extends State {\n // The pixel image controller contains our image data and handles updates.\n // If it is null, the image has not yet been loaded from the server.\n PixelImageController? _imageController;\n\n @override\n void initState() {\n super.initState();\n\n // Connect to the server and start listening to updates.\n _listenToUpdates();\n }\n}\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Next, let's implement the ",(0,a.jsx)(n.code,{children:"_listenToUpdates"})," method. The ",(0,a.jsx)(n.code,{children:"_listenToUpdates"})," method runs indefinitely, maintaining a connection to the server and processing updates as they arrive. It handles both ",(0,a.jsx)(n.code,{children:"ImageData"})," (the full image) and ",(0,a.jsx)(n.code,{children:"ImageUpdate"})," (individual pixel changes), updating the ",(0,a.jsx)(n.code,{children:"PixelImageController"})," accordingly. If the connection is lost, it will wait 5 seconds before it tries to reconnect to the server."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"// lib/src/pixorama.dart\n\nclass _PixoramaState extends State {\n // ...\n\n Future _listenToUpdates() async {\n // Indefinitely try to connect and listen to updates from the server.\n while (true) {\n try {\n // Get the stream of updates from the server.\n final imageUpdates = client.pixorama.imageUpdates();\n\n // Listen for updates from the stream. The await for construct will\n // wait for a message to arrive from the server, then run through the\n // body of the loop.\n await for (final update in imageUpdates) {\n // Check which type of update we have received.\n if (update is ImageData) {\n // This is a complete image update, containing all pixels in the\n // image. Create a new PixelImageController with the pixel data.\n setState(() {\n _imageController = PixelImageController(\n pixels: update.pixels,\n palette: PixelPalette.rPlace(),\n width: update.width,\n height: update.height,\n );\n });\n } else if (update is ImageUpdate) {\n // Got an incremental update of the image. Just set the single\n // pixel.\n _imageController?.setPixelIndex(\n pixelIndex: update.pixelIndex,\n colorIndex: update.colorIndex,\n );\n }\n }\n } on MethodStreamException catch (_) {\n // We lost the connection to the server, or failed to connect.\n setState(() {\n _imageController = null;\n });\n }\n\n // Wait 5 seconds until we try to connect again.\n await Future.delayed(Duration(seconds: 5));\n }\n }\n}\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Worth noting is that the ",(0,a.jsx)(n.code,{children:"MethodStreamException"})," is a superclass of a set of more detailed exceptions. It's often sufficient to catch all types of failures (like what we do here) that can happen when streaming data, but it's possible to detect if the stream failed because we failed to connect, if the server went down, or if the connection was lost."]}),"\n",(0,a.jsx)(n.h3,{id:"building-the-interface",children:"Building the Interface"}),"\n",(0,a.jsxs)(n.p,{children:["Finally, we need to implement the widget's ",(0,a.jsx)(n.code,{children:"build"})," method, where we create the user interface for drawing pixels. We display a progress indicator if the ",(0,a.jsx)(n.code,{children:"_imageController"})," is ",(0,a.jsx)(n.code,{children:"null"})," (indicating no image has been received yet). Once the image is received, we use the ",(0,a.jsx)(n.code,{children:"PixelEditor"})," widget to render it, and any pixel changes made by the user are sent to the server via the ",(0,a.jsx)(n.code,{children:"setPixel"})," method."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-dart",children:"// lib/src/pixorama.dart\n\nclass _PixoramaState extends State {\n // ...\n\n @override\n Widget build(BuildContext context) {\n return Center(\n child: _imageController == null\n ? const CircularProgressIndicator()\n : PixelEditor(\n controller: _imageController!,\n onSetPixel: (details) {\n // When a user clicks a pixel we will get a callback from the\n // PixelImageController, with information about the changed\n // pixel. When that happens we call the setPixels method on\n // the server.\n client.pixorama.setPixel(\n pixelIndex: details.tapDetails.index,\n colorIndex: details.colorIndex,\n );\n },\n ),\n );\n }\n}\n"})}),"\n",(0,a.jsx)(n.h2,{id:"running-pixorama",children:"Running Pixorama"}),"\n",(0,a.jsxs)(n.p,{children:["To test Pixorama, start the server by navigating to the ",(0,a.jsx)(n.code,{children:"pixorama_server"})," directory and running:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"dart bin/main.dart\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Then, launch the Flutter app by changing to the ",(0,a.jsx)(n.code,{children:"pixorama_flutter"})," directory and running:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"flutter run -d chrome\n"})}),"\n",(0,a.jsx)(n.p,{children:"You can also start a second instance of the app to see real-time updates reflected across both instances."}),"\n",(0,a.jsx)(n.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,a.jsxs)(n.p,{children:["This project was a brief introduction to building real-time apps with Flutter and Serverpod. With less than a page of code on the server side, we created a collaborative drawing app that's both fun and functional. You can find the full Pixorama code on GitHub here:\n",(0,a.jsx)(n.a,{href:"https://github.com/serverpod/pixorama",children:"https://github.com/serverpod/pixorama"})]}),"\n",(0,a.jsx)(n.p,{children:"Happy coding!"})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},73381:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/pixorama-183dc43ee2a7c5cec50ac9da4ee25e1d.png"},11151:(e,n,t)=>{t.d(n,{Z:()=>o,a:()=>s});var a=t(67294);const i={},r=a.createContext(i);function s(e){const n=a.useContext(r);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),a.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/df15bc7d.486261d6.js b/docs/assets/js/df15bc7d.486261d6.js new file mode 100644 index 000000000..456387328 --- /dev/null +++ b/docs/assets/js/df15bc7d.486261d6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkserverpod_docs=self.webpackChunkserverpod_docs||[]).push([[18154],{24405:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>s,default:()=>h,frontMatter:()=>i,metadata:()=>a,toc:()=>l});var r=t(85893),o=t(11151);const i={},s="Get started with Mini",a={id:"get-started-with-mini",title:"Get started with Mini",description:"Serverpod Mini is a slimmer version of Serverpod that does not need to be connected to a Postgres database. Before you begin, make sure that you have Flutter and Serverpod installed.",source:"@site/versioned_docs/version-2.1.0/02-get-started-with-mini.md",sourceDirName:".",slug:"/get-started-with-mini",permalink:"/get-started-with-mini",draft:!1,unlisted:!1,editUrl:"https://github.com/serverpod/serverpod_docs/tree/main/versioned_docs/version-2.1.0/02-get-started-with-mini.md",tags:[],version:"2.1.0",sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Get started",permalink:"/get-started"},next:{title:"Capabilities",permalink:"/capabilities"}},d={},l=[{value:"Create a new project",id:"create-a-new-project",level:2},{value:"Creating models",id:"creating-models",level:2},{value:"Adding methods to your server",id:"adding-methods-to-your-server",level:2},{value:"Calling the server methods from the app",id:"calling-the-server-methods-from-the-app",level:2},{value:"Conclusion",id:"conclusion",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"get-started-with-mini",children:"Get started with Mini"})}),"\n",(0,r.jsxs)(n.p,{children:["Serverpod Mini is a slimmer version of Serverpod that does not need to be connected to a Postgres database. Before you begin, make sure that you have ",(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.a,{href:"https://flutter.dev/docs/get-started/install",children:"Flutter"})})," and ",(0,r.jsx)(n.strong,{children:(0,r.jsx)(n.a,{href:"/",children:"Serverpod"})})," installed."]}),"\n",(0,r.jsx)("div",{style:{position:"relative",paddingBottom:"56.25%",height:"0"},children:(0,r.jsx)("iframe",{style:{position:"absolute",top:"0",left:"0",width:"100%",height:"100%"},width:"560",height:"315",src:"https://www.youtube-nocookie.com/embed/dSBK4JOZRyI",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:!0})}),"\n",(0,r.jsx)(n.h2,{id:"create-a-new-project",children:"Create a new project"}),"\n",(0,r.jsx)(n.p,{children:"Create a mini project by running:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"$ serverpod create myminipod --mini\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Serverpod will create a new project for you. It contains three Dart packages, but you only need to pay attention to the ",(0,r.jsx)(n.code,{children:"myminipod_server"})," and ",(0,r.jsx)(n.code,{children:"myminipod_flutter"})," directories. The server directory contains your server files, and the flutter directory contains your app. The third package (",(0,r.jsx)(n.code,{children:"myminipod_client"}),") contains generated code that is used by the Flutter app to communicate with the server."]}),"\n",(0,r.jsxs)(n.p,{children:["Start your server by changing directory into your server directory, and run the ",(0,r.jsx)(n.code,{children:"bin/main.dart"})," file:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"$ cd myminipod/myminipod_server\n$ dart bin/main.dart\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Your default project comes with a sample Flutter app, all hooked up to talk with your server. Run it with the ",(0,r.jsx)(n.code,{children:"flutter"})," command:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"$ cd myminipod/myminipod_flutter\n$ flutter run -d chrome\n"})}),"\n",(0,r.jsx)(n.p,{children:"Easy as that. \ud83e\udd73"}),"\n",(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsx)(n.p,{children:"If you are using VS Code, install our Serverpod extension. It will help you validate any Serverpod-related files in your project!"})}),"\n",(0,r.jsx)(n.h2,{id:"creating-models",children:"Creating models"}),"\n",(0,r.jsxs)(n.p,{children:["In Serverpod, you define your models in easy-to-read YAML-files, which you place in your server\u2019s ",(0,r.jsx)(n.code,{children:"lib/src/models"})," directory. Model files will be converted to Dart classes that can be serialized and sent to and from the server to your app. This is an example of a model file:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-yaml",children:"class: Company\nfields:\n name: String\n foundedDate: DateTime?\n employees: List\n"})}),"\n",(0,r.jsxs)(n.p,{children:["For types, you can use most basic Dart types, such as ",(0,r.jsx)(n.code,{children:"String"}),", ",(0,r.jsx)(n.code,{children:"double"}),", ",(0,r.jsx)(n.code,{children:"int"}),", ",(0,r.jsx)(n.code,{children:"bool"}),", ",(0,r.jsx)(n.code,{children:"DateTime"}),", and ",(0,r.jsx)(n.code,{children:"ByteData"}),". You can also include ",(0,r.jsx)(n.code,{children:"List"})," and ",(0,r.jsx)(n.code,{children:"Map"}),", just make sure to specify their types. Any other class specified among your models is also supported."]}),"\n",(0,r.jsxs)(n.p,{children:["Whenever you add or edit a model file, run ",(0,r.jsx)(n.code,{children:"serverpod generate"})," in your server directory. Then, Serverpod will generate all the updated Dart classes:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"$ cd myminipod/myminipod_server\n$ serverpod generate\n"})}),"\n",(0,r.jsx)(n.h2,{id:"adding-methods-to-your-server",children:"Adding methods to your server"}),"\n",(0,r.jsxs)(n.p,{children:["With Serverpod, you add Dart methods to endpoints placed in your server\u2019s ",(0,r.jsx)(n.code,{children:"lib/src/endpoints"})," directory. By doing so, Serverpod will analyze your server code and automatically generate the corresponding methods in your Flutter app. Calling a method on the server is just like calling a local method in your app."]}),"\n",(0,r.jsx)(n.p,{children:"For the server methods to work, there are a few things you need to keep in mind:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"You must place the methods in a class that extends the Endpoint class."}),"\n",(0,r.jsx)(n.li,{children:"The methods must return a typed Future. The types you use in your methods are the same as those supported by your models."}),"\n",(0,r.jsx)(n.li,{children:"The first parameter of your method must be a Session object. The session contains extra information about the call being made to the server, such as the HTTP request object."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"This is an example of an endpoint that uses the Company class that we defined in the example model in the previous section."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-dart",children:"import 'package:serverpod/serverpod.dart';\n\nclass CompanyEndpoint extends Endpoint {\n Future isLegit(Session session, Company company) async {\n // Check if the company has the foundedDate set and that it\n // has been around for more than one year.\n\n if (company.foundedDate == null) {\n return false;\n }\n\n var oneYearAgo = DateTime.now().subract(Duration(days: 365));\n return company.foundedDate!.isBefore(oneYearAgo);\n }\n}\n"})}),"\n",(0,r.jsxs)(n.p,{children:["After adding or modifying endpoints and endpoint methods, you must run ",(0,r.jsx)(n.code,{children:"serverpod generate"})," to keep your Flutter app up-to-date."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"$ cd myminipod/myminipod_server\n$ serverpod generate\n"})}),"\n",(0,r.jsx)(n.h2,{id:"calling-the-server-methods-from-the-app",children:"Calling the server methods from the app"}),"\n",(0,r.jsxs)(n.p,{children:["When you run ",(0,r.jsx)(n.code,{children:"serverpod generate"})," Serverpod will add your endpoints and server methods to the ",(0,r.jsx)(n.code,{children:"client"})," object in your Flutter app. From the client, you can access all endpoints and methods."]}),"\n",(0,r.jsxs)(n.p,{children:["To call the endpoint method we just created from Flutter, just create a ",(0,r.jsx)(n.code,{children:"Company"})," object, call the method, and await the result:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-dart",children:"var company = Company(\n name: 'Serverpod',\n foundedDate: DateTime(2021, 9, 27),\n employees: [\n 'Alex',\n 'Isak',\n 'Viktor',\n ],\n);\n\nvar result = await client.company.isLegit(company);\n"})}),"\n",(0,r.jsx)(n.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,r.jsxs)(n.p,{children:["You are now ready to start exploring the exciting world of Serverpod! And even if you start out with Serverpod mini, you can always ",(0,r.jsx)(n.a,{href:"upgrading/upgrade-from-mini",children:"upgrade"})," to the full version later."]})]})}function h(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},11151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>s});var r=t(67294);const o={},i=r.createContext(o);function s(e){const n=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/df15bc7d.d24d19f0.js b/docs/assets/js/df15bc7d.d24d19f0.js deleted file mode 100644 index b2894c849..000000000 --- a/docs/assets/js/df15bc7d.d24d19f0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkserverpod_docs=self.webpackChunkserverpod_docs||[]).push([[18154],{24405:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>a,contentTitle:()=>i,default:()=>h,frontMatter:()=>s,metadata:()=>d,toc:()=>l});var t=r(85893),o=r(11151);const s={},i="Get started with Mini",d={id:"get-started-with-mini",title:"Get started with Mini",description:"Serverpod Mini is a slimmer version of Serverpod that does not need to be connected to a Postgres database. Before you begin, make sure that you have Flutter and Serverpod installed.",source:"@site/versioned_docs/version-2.1.0/02-get-started-with-mini.md",sourceDirName:".",slug:"/get-started-with-mini",permalink:"/get-started-with-mini",draft:!1,unlisted:!1,editUrl:"https://github.com/serverpod/serverpod_docs/tree/main/versioned_docs/version-2.1.0/02-get-started-with-mini.md",tags:[],version:"2.1.0",sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Get started",permalink:"/get-started"},next:{title:"Capabilities",permalink:"/capabilities"}},a={},l=[{value:"Creating models",id:"creating-models",level:2},{value:"Adding methods to your server",id:"adding-methods-to-your-server",level:2},{value:"Calling the server methods from the app",id:"calling-the-server-methods-from-the-app",level:2},{value:"Conclusion",id:"conclusion",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"get-started-with-mini",children:"Get started with Mini"})}),"\n",(0,t.jsxs)(n.p,{children:["Serverpod Mini is a slimmer version of Serverpod that does not need to be connected to a Postgres database. Before you begin, make sure that you have ",(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.a,{href:"https://flutter.dev/docs/get-started/install",children:"Flutter"})})," and ",(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.a,{href:"/",children:"Serverpod"})})," installed."]}),"\n",(0,t.jsx)(n.p,{children:"Create a mini project by running:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"$ serverpod create myminipod --mini\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Serverpod will create a new project for you. It contains three Dart packages, but you only need to pay attention to the ",(0,t.jsx)(n.code,{children:"myminipod_server"})," and ",(0,t.jsx)(n.code,{children:"myminipod_flutter"})," directories. The server directory contains your server files, and the flutter directory contains your app. The third package (",(0,t.jsx)(n.code,{children:"myminipod_client"}),") contains generated code that is used by the Flutter app to communicate with the server."]}),"\n",(0,t.jsxs)(n.p,{children:["Start your server by changing directory into your server directory, and run the ",(0,t.jsx)(n.code,{children:"bin/main.dart"})," file:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"$ cd myminipod/myminipod_server\n$ dart bin/main.dart\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Your default project comes with a sample Flutter app, all hooked up to talk with your server. Run it with the ",(0,t.jsx)(n.code,{children:"flutter"})," command:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"$ cd myminipod/myminipod_flutter\n$ flutter run -d chrome\n"})}),"\n",(0,t.jsx)(n.p,{children:"Easy as that. \ud83e\udd73"}),"\n",(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsx)(n.p,{children:"If you are using VS Code, install our Serverpod extension. It will help you validate any Serverpod-related files in your project!"})}),"\n",(0,t.jsx)(n.h2,{id:"creating-models",children:"Creating models"}),"\n",(0,t.jsxs)(n.p,{children:["In Serverpod, you define your models in easy-to-read YAML-files, which you place in your server\u2019s ",(0,t.jsx)(n.code,{children:"lib/src/models"})," directory. Model files will be converted to Dart classes that can be serialized and sent to and from the server to your app. This is an example of a model file:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:"class: Company\nfields:\n name: String\n foundedDate: DateTime?\n employees: List\n"})}),"\n",(0,t.jsxs)(n.p,{children:["For types, you can use most basic Dart types, such as ",(0,t.jsx)(n.code,{children:"String"}),", ",(0,t.jsx)(n.code,{children:"double"}),", ",(0,t.jsx)(n.code,{children:"int"}),", ",(0,t.jsx)(n.code,{children:"bool"}),", ",(0,t.jsx)(n.code,{children:"DateTime"}),", and ",(0,t.jsx)(n.code,{children:"ByteData"}),". You can also include ",(0,t.jsx)(n.code,{children:"List"})," and ",(0,t.jsx)(n.code,{children:"Map"}),", just make sure to specify their types. Any other class specified among your models is also supported."]}),"\n",(0,t.jsxs)(n.p,{children:["Whenever you add or edit a model file, run ",(0,t.jsx)(n.code,{children:"serverpod generate"})," in your server directory. Then, Serverpod will generate all the updated Dart classes:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"$ cd myminipod/myminipod_server\n$ serverpod generate\n"})}),"\n",(0,t.jsx)(n.h2,{id:"adding-methods-to-your-server",children:"Adding methods to your server"}),"\n",(0,t.jsxs)(n.p,{children:["With Serverpod, you add Dart methods to endpoints placed in your server\u2019s ",(0,t.jsx)(n.code,{children:"lib/src/endpoints"})," directory. By doing so, Serverpod will analyze your server code and automatically generate the corresponding methods in your Flutter app. Calling a method on the server is just like calling a local method in your app."]}),"\n",(0,t.jsx)(n.p,{children:"For the server methods to work, there are a few things you need to keep in mind:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"You must place the methods in a class that extends the Endpoint class."}),"\n",(0,t.jsx)(n.li,{children:"The methods must return a typed Future. The types you use in your methods are the same as those supported by your models."}),"\n",(0,t.jsx)(n.li,{children:"The first parameter of your method must be a Session object. The session contains extra information about the call being made to the server, such as the HTTP request object."}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"This is an example of an endpoint that uses the Company class that we defined in the example model in the previous section."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-dart",children:"import 'package:serverpod/serverpod.dart';\n\nclass CompanyEndpoint extends Endpoint {\n Future isLegit(Session session, Company company) async {\n // Check if the company has the foundedDate set and that it\n // has been around for more than one year.\n\n if (company.foundedDate == null) {\n return false;\n }\n\n var oneYearAgo = DateTime.now().subract(Duration(days: 365));\n return company.foundedDate!.isBefore(oneYearAgo);\n }\n}\n"})}),"\n",(0,t.jsxs)(n.p,{children:["After adding or modifying endpoints and endpoint methods, you must run ",(0,t.jsx)(n.code,{children:"serverpod generate"})," to keep your Flutter app up-to-date."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"$ cd myminipod/myminipod_server\n$ serverpod generate\n"})}),"\n",(0,t.jsx)(n.h2,{id:"calling-the-server-methods-from-the-app",children:"Calling the server methods from the app"}),"\n",(0,t.jsxs)(n.p,{children:["When you run ",(0,t.jsx)(n.code,{children:"serverpod generate"})," Serverpod will add your endpoints and server methods to the ",(0,t.jsx)(n.code,{children:"client"})," object in your Flutter app. From the client, you can access all endpoints and methods."]}),"\n",(0,t.jsxs)(n.p,{children:["To call the endpoint method we just created from Flutter, just create a ",(0,t.jsx)(n.code,{children:"Company"})," object, call the method, and await the result:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-dart",children:"var company = Company(\n name: 'Serverpod',\n foundedDate: DateTime(2021, 9, 27),\n employees: [\n 'Alex',\n 'Isak',\n 'Viktor',\n ],\n);\n\nvar result = await client.company.isLegit(company);\n"})}),"\n",(0,t.jsx)(n.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,t.jsxs)(n.p,{children:["You are now ready to start exploring the exciting world of Serverpod! And even if you start out with Serverpod mini, you can always ",(0,t.jsx)(n.a,{href:"upgrading/upgrade-from-mini",children:"upgrade"})," to the full version later."]})]})}function h(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},11151:(e,n,r)=>{r.d(n,{Z:()=>d,a:()=>i});var t=r(67294);const o={},s=t.createContext(o);function i(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/runtime~main.00b4f806.js b/docs/assets/js/runtime~main.c0093c61.js similarity index 93% rename from docs/assets/js/runtime~main.00b4f806.js rename to docs/assets/js/runtime~main.c0093c61.js index c452bfa87..76cb6108d 100644 --- a/docs/assets/js/runtime~main.00b4f806.js +++ b/docs/assets/js/runtime~main.c0093c61.js @@ -1 +1 @@ -(()=>{"use strict";var e,a,d,c,f,b={},r={};function t(e){var a=r[e];if(void 0!==a)return a.exports;var d=r[e]={exports:{}};return b[e].call(d.exports,d,d.exports,t),d.exports}t.m=b,e=[],t.O=(a,d,c,f)=>{if(!d){var b=1/0;for(n=0;n=f)&&Object.keys(t.O).every((e=>t.O[e](d[o])))?d.splice(o--,1):(r=!1,f0&&e[n-1][2]>f;n--)e[n]=e[n-1];e[n]=[d,c,f]},t.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return t.d(a,{a:a}),a},d=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,t.t=function(e,c){if(1&c&&(e=this(e)),8&c)return e;if("object"==typeof e&&e){if(4&c&&e.__esModule)return e;if(16&c&&"function"==typeof e.then)return e}var f=Object.create(null);t.r(f);var b={};a=a||[null,d({}),d([]),d(d)];for(var r=2&c&&e;"object"==typeof r&&!~a.indexOf(r);r=d(r))Object.getOwnPropertyNames(r).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,t.d(f,b),f},t.d=(e,a)=>{for(var d in a)t.o(a,d)&&!t.o(e,d)&&Object.defineProperty(e,d,{enumerable:!0,get:a[d]})},t.f={},t.e=e=>Promise.all(Object.keys(t.f).reduce(((a,d)=>(t.f[d](e,a),a)),[])),t.u=e=>"assets/js/"+({3:"2890c80c",84:"96523456",420:"da071cb8",578:"4f0519c7",838:"3b66921f",1129:"a4adf53f",1315:"6feb7661",1414:"9c9052d1",1481:"3d277f18",1527:"3d1ae229",1651:"ea237062",1681:"44a83f6a",1733:"61ff6850",1816:"3817c387",2154:"2b67eda4",2400:"1577f7ed",2500:"46b54090",2631:"071f33a8",3905:"f7ae65ac",3949:"82ea7079",4039:"24557dbc",4081:"5c6f6ba9",4086:"b5dcbe95",4235:"abd13aa2",4847:"b91fbf2a",5038:"ef2492df",5255:"90ec8c6b",5500:"3fbaac07",5515:"726a6c22",5805:"42abcd4d",6125:"reactPlayerSoundCloud",7115:"32b8fafb",7265:"9d36f238",7425:"44145933",7450:"cf3c245e",7492:"81e4ed6a",7539:"616bfcf6",7677:"c75d145e",8251:"4951b372",8456:"f584139f",8847:"6f44ab90",9120:"e0bec135",9419:"bc03f89b",9533:"8baf194b",9638:"05ec9480",10131:"986f0f98",10261:"reactPlayerKaltura",10281:"566f49fb",10399:"511f9951",10435:"1d7c691c",10507:"02c0cfe0",10832:"719163ad",11103:"a1154d73",11372:"8552f549",11629:"4a55fe3a",12068:"819b642a",12105:"cdc118a8",12121:"reactPlayerFacebook",12394:"9b4ab8cd",12500:"ae0eacdd",12544:"5f6b1733",12663:"69fcd2fc",12696:"1921e4ca",13033:"2fca5c64",13254:"b7b014bf",13721:"19e323d1",13990:"8615e055",14013:"9e0c2c37",14135:"fc8b5a5d",14218:"1111b27e",14442:"fe522f67",14477:"070c8c93",14667:"af68ae04",14669:"b467d32a",14807:"099a3596",14842:"813cfb2f",14969:"fac0eceb",15002:"ee65edec",15172:"b26210db",15243:"1b218eaa",16023:"ae22b856",16092:"b28bd8b1",16189:"d9107a6a",16383:"dc7352a7",16506:"03b2528f",16665:"d3938b1f",16963:"df1414bb",16974:"954e932f",17051:"c2b45dbb",17311:"8bed5a26",17503:"16116660",17613:"2e18ba50",17670:"49145cdf",17908:"a7f483d1",18044:"e64edb60",18154:"df15bc7d",18518:"a7bd4aaa",18823:"5390e21f",18924:"b916a1ab",19231:"31b73615",19284:"0d271e1e",19667:"cbf3c4ec",19784:"16b03284",20099:"b1394c86",20969:"45939ed5",21308:"fc6f07d2",21453:"c3373259",21681:"e84b4e80",21826:"7de3e81f",22372:"33c1d41a",22436:"d3af5b3c",22743:"c3094240",22917:"44463284",23095:"d2aa311d",23128:"2ca08277",23396:"b6f81eaa",23770:"6da448d1",24101:"da54b976",24243:"21e10cde",24378:"daec0d60",24650:"c090764b",24665:"327b0a57",24905:"468d57a9",25151:"e2d6ba1f",25278:"50f2f9f3",25482:"90239e6e",26011:"reactPlayerFilePlayer",26288:"a4c89d62",26378:"eaeab60b",26845:"141135bb",27112:"88a48c42",27164:"39ec0930",27236:"ed772d97",27317:"a271ef09",27427:"e3443ce0",27512:"07006f9e",27754:"5596dd05",27773:"06a408fe",27800:"59df87e8",27918:"17896441",28076:"169f3d24",28213:"98c94590",28548:"96331245",29073:"a64b2578",29385:"05fbef88",29661:"5e95c892",29735:"b1218054",29766:"c868bccf",29781:"9037180b",30102:"7d63aba8",30282:"1e1f8072",30290:"307525ba",30397:"b809d820",30870:"85d514f3",30887:"71ba2dc1",31017:"0d76317c",31131:"bd118f84",31370:"2bbc2deb",31499:"87ab7385",31656:"1d39c85d",32001:"e7977816",32795:"441fd5fc",32797:"ff5ed6ba",32831:"5b2d7e3c",32981:"526e379a",33029:"b9ec56c8",33314:"d2f6d210",33629:"aba21aa0",34165:"ebde045d",34302:"999788b8",34535:"087cd58c",34571:"51e50f95",34945:"812775a4",34956:"1a39ee04",35154:"5a96e453",35321:"c0650537",35478:"d58f1ee2",35801:"a81cb65f",35844:"2ed96714",35873:"564db590",36019:"ecaa7076",36107:"82e43b76",36187:"ac9d9d69",36426:"828ace52",36433:"c5313007",36570:"79840965",36643:"55f37562",36762:"6d717251",36777:"d802bb56",37065:"8dfd8953",37485:"b7ea99f7",37566:"063d75bd",37927:"68401255",38041:"076cf272",38202:"9644aa4e",38247:"7b06977d",38457:"ac3101e9",38464:"ac5db01d",38658:"2c2832e4",39055:"10ad1fa6",39523:"05fa9a60",40669:"bd568e77",40697:"fca5fdb4",40770:"94b2bc9a",41251:"1323771c",41306:"965931d7",41569:"805a59dc",41577:"897331c0",42005:"8f509517",42265:"0893faed",42330:"6d2a4d3f",42382:"c7507218",42682:"20d56cb7",42699:"17f04a83",42733:"1457ddcd",42784:"3e87058f",43310:"30bd0f5b",43357:"49849746",43768:"5d707891",43983:"2db5c390",44161:"da698f4c",44174:"f527bef3",44384:"bafd283f",44622:"7800d508",44980:"22dd74f7",45183:"21b7a589",45399:"3f04b2f3",46055:"cb867d98",46148:"0c6fe626",46536:"65c67349",46740:"53e9dd7a",46863:"c7156cf2",46971:"c377a04b",47001:"82444e58",47190:"9270ba4f",47365:"65b7208a",47596:"reactPlayerDailyMotion",47980:"db7d4591",48172:"4934de22",48357:"cd64d641",48378:"38e32826",48439:"9c5d9512",48571:"056b386b",48609:"2d4af3bf",48818:"d636c09f",48891:"27e827f8",49048:"640696ee",49627:"f3467f26",49654:"caf7731d",49787:"c2237e68",50137:"4118187a",50239:"b685e31b",50334:"f28f059c",50428:"358c2507",50860:"1a84c7fd",51086:"17dc776d",51162:"dc4059b2",51427:"f6f476f1",51485:"da19ecb4",51490:"71319bec",51582:"4519f039",51898:"801276a1",52428:"fe76eed8",52546:"reactPlayerStreamable",53012:"710ac1c1",53238:"dc8c27bd",53283:"ef4456b5",53457:"068743c8",53602:"0841186f",53695:"7a3d47b3",53718:"19a6be06",53866:"0c695afe",53978:"cce58fe7",54037:"5144cf5e",54708:"94f11012",54801:"378935ce",54857:"51c7df8c",54942:"a6c3ea4a",55080:"a6397568",55239:"89b55a09",55261:"18910d94",55367:"9e09f891",55688:"2e1ee4ed",55730:"f5fed352",55969:"5c1eff22",56031:"4aec9039",56297:"45926b62",56401:"0a5c01b2",56495:"e4eafb12",56640:"3f80bb14",56714:"92466816",56847:"ac002d2b",56864:"08aab21d",56983:"4ed1e0ac",57123:"fd4b36bb",57139:"bdc5a52e",57262:"9a594c98",57932:"5af30237",57955:"b8787c81",58413:"ac6e050c",58807:"49fed513",59006:"0f4a5c74",59168:"308471de",59215:"2e3fc0f9",59450:"3874f1bf",59570:"f149b10e",59705:"a7edc2bd",59876:"57012fa6",59953:"2020ed93",60114:"c10a0985",60161:"af1c5d2b",60896:"c134ef8a",61101:"5a0a1617",61385:"a2757506",61400:"5143312c",61834:"419cd6b8",61876:"3aa0ab0a",62151:"7570de64",62276:"f5a589e7",62418:"b48f41b9",62475:"869ae8a7",62890:"ad61550a",63552:"fb72d7b2",63889:"b0f19176",63954:"2db99065",64033:"ce86e3e6",64258:"reactPlayerMux",64325:"9fbfaf6d",64439:"reactPlayerYouTube",64652:"ebd05845",64786:"52f87500",65069:"9107c65f",65337:"fc8c8cde",65413:"06393fc1",65532:"26398b18",65597:"280af06a",65630:"79d28454",65718:"53998120",66527:"07e708e9",66719:"5bc657fa",67139:"926056c1",67291:"1caa8cdb",67513:"91aed80e",67645:"8186ecf9",67673:"83c6f999",68349:"eac16e1d",68888:"reactPlayerVidyard",68993:"d38e3f9f",69241:"dd31e7e9",69297:"f9bde383",69434:"8ee9837e",69569:"036b5431",69624:"36fcb744",69929:"3edac44d",69983:"62de5d73",70058:"313c9eb1",70537:"da202fdd",70594:"fc67ad3d",70967:"51ddac88",71332:"6e29a506",71444:"dec2bd4a",71567:"e66f2658",71606:"4ead9a95",71843:"ce4dbf6d",72181:"c8139b75",72281:"dbf9e27d",72423:"95ec96e5",72768:"676f1bdb",73057:"4e689a0b",73109:"d8d6d57b",73348:"08d55cf7",73380:"13798859",73525:"227d1fc4",73743:"reactPlayerVimeo",73929:"4ab30eec",74055:"272aa200",74515:"356ce494",74641:"a32c313f",74801:"444a6d4e",75217:"3cc71396",75293:"5839343c",75577:"1312139a",75724:"704545ab",75935:"03b3cfd2",76107:"9f1829f0",76183:"adce8179",77136:"098f2604",77328:"4c5c4c2e",77395:"7af31c45",77554:"98d962c5",78018:"0d7acd84",78143:"0773e78b",78230:"fe2e2e26",78486:"a0aa5253",78616:"bf519c8d",78618:"00d14154",78675:"28967b3e",78746:"8af032d3",78752:"d44e0d1c",78778:"5e7d099e",78810:"7ac69e68",79298:"6aee17c2",79301:"d0b9ca74",79349:"46eeb6cb",79726:"10ea0b82",79784:"8093477b",79789:"0f2c2e36",79835:"4ac2e930",80372:"2d11a680",80503:"8d02075b",80789:"510b9307",80845:"eecc43ff",81085:"8eead450",81137:"bc69c5bc",81483:"9f8e6d57",81524:"cc180519",81921:"1877d9d5",81938:"afb7a97b",82040:"54cab4d4",82128:"4aa94ec1",82165:"956829f8",82816:"6fbf0c67",82916:"3c4af576",83148:"4048090e",83303:"7b33c27b",83377:"7f0714d1",83414:"ec91ff36",83537:"c342bcae",83786:"4867e743",83854:"21a4ba71",83860:"e58556b2",83943:"50a12feb",83962:"af754a1f",84102:"98f4e1ec",84635:"39dec3ba",84667:"reactPlayerMixcloud",84955:"646cbece",85285:"45dd886d",85664:"504d78e0",85690:"aeef55f7",85738:"efe5610c",85900:"616631fd",86024:"fe170cc9",86216:"reactPlayerTwitch",86223:"bd6f2233",86517:"78ae7ec8",86553:"4bfca71d",87251:"b32c213b",87259:"2115313f",87273:"cdd4a9c6",87486:"67e77328",87489:"3e4a4cb2",87534:"42a9b3c5",87664:"reactPlayerPreview",87673:"638e38ae",87819:"3141060a",87858:"7ca2e59a",88047:"3d150a24",88055:"reactPlayerWistia",88067:"7517a61c",88757:"73ca4188",88849:"5e253f2f",88856:"afde3230",89639:"4c781063",89652:"bb9c591b",89670:"86a8bb6c",89783:"4b6eee9a",90045:"984d6493",90187:"a2a1c245",90285:"3cf6fa35",90550:"6ba85e75",90847:"1b6591f7",91027:"f6adf820",91351:"7c8e5227",91419:"9d779d8b",91458:"e3d58533",91616:"25c6d77a",91982:"ecb3c634",92058:"93dcedec",92106:"4fa4eafa",92130:"dcbfe205",92332:"f6affd6e",92908:"6f56eca8",92909:"0eebd274",92924:"95a5d2b2",93174:"4a49065b",93624:"a6311318",93866:"d9e7b984",93911:"5cde491b",94008:"431ffdb5",94056:"27b43779",94075:"aefdd881",94086:"1ebbfca8",94169:"e4a796aa",94331:"8e7261c9",94362:"65e04ea3",94368:"a94703ab",94958:"9d217e1f",95109:"3c9432f0",95227:"522ca66b",95248:"83ac10ed",95264:"e7ee6027",95767:"2d16d24d",95801:"f29fc884",95908:"22f51758",96099:"e8f4756d",96265:"3fe65583",96490:"62037464",96502:"95bf5f56",96738:"5112ebe3",96918:"b2419a00",97129:"23975af2",97177:"76259cc3",97718:"ed64c12e",97987:"8abbb0ee",98278:"fe3f3783",98287:"d4fc3158",98317:"d26a73b8",98341:"bd1cffff",98492:"eb4c176e",98524:"9d7352c0",98560:"6a734661",98686:"02e41de2",98864:"4eee9c87",99241:"092bf57d",99291:"f8189ec4",99311:"db42f242",99654:"5589c54d",99773:"12407b36"}[e]||e)+"."+{3:"75f661b1",84:"26a3794d",420:"aab455f2",578:"3039c890",838:"3f5b34cc",1129:"ab1fe72f",1315:"ca0fde8c",1414:"769fb929",1481:"3be990da",1527:"35b01eb9",1651:"4be3828c",1681:"d4c01e4c",1733:"9aa1b7c7",1816:"ee9d42ab",2154:"a0b98ed5",2400:"1299a61f",2500:"5ca680a6",2631:"8d1f3fae",3905:"1a9dacf8",3949:"86071e75",4039:"5d0cb40d",4081:"2d05ca22",4086:"0b064355",4235:"a4712490",4847:"a585227d",5038:"c26cacbf",5255:"0b910fc2",5500:"9ee7f827",5515:"9c86a4a7",5805:"a4810eb0",6125:"8eed9d23",7115:"15b91298",7265:"d5a3620b",7425:"7b75e8bd",7450:"69336175",7492:"41df2776",7539:"fc7ac5ec",7677:"37fc9eeb",8251:"ab9717fe",8456:"1e58679f",8847:"bb6f5fd9",9120:"6f7c3a72",9419:"d7833d70",9533:"4bd22d4a",9638:"5efe5897",10131:"7390c60d",10261:"00e7b539",10281:"6e162917",10399:"c580d9b7",10435:"8bd7131e",10507:"7aa842cb",10832:"6b51c80b",11103:"645db913",11372:"584c5b06",11629:"4491ddea",12068:"6256fb3c",12105:"a66654ce",12121:"977103e0",12394:"b799bbe6",12500:"9b18f985",12544:"cc6f63c1",12663:"1351b648",12696:"dc97eb61",13033:"2e6abaf7",13254:"bb420e6e",13721:"8a5f13d6",13990:"25dd71fc",14013:"e0d573e4",14135:"5d4089b4",14218:"70b885ac",14442:"fe73dd8a",14477:"39d016ad",14667:"1554ec17",14669:"abbd94dc",14807:"f1e1ba7e",14842:"3b76b8e2",14969:"79beb605",15002:"f2203186",15172:"cd596aed",15243:"d374b006",16023:"f5df73e2",16092:"2d466a26",16189:"089b5e69",16383:"379de6a4",16506:"aad10a0e",16665:"2c354e72",16963:"1c60a2f3",16974:"12153a27",17051:"021a849c",17311:"9cd8c2bc",17503:"056036bb",17613:"da94e453",17670:"fedf3ff0",17908:"6aa89b73",18044:"d75fe625",18154:"d24d19f0",18518:"1c053dec",18823:"b10f9812",18924:"3a80b720",19231:"e5cd57dc",19284:"173f2390",19667:"c4958815",19784:"7af7501a",20099:"a8b4682a",20969:"a9b55130",21308:"f239be32",21453:"a94c03b9",21681:"e7cc5a5e",21826:"801da589",22372:"fd47170e",22436:"6901bbfe",22743:"a75500df",22917:"474bde29",23095:"a6cf541f",23128:"54a66d64",23396:"cc469673",23770:"f3ae2ec2",24101:"6b527b68",24243:"e8e94a47",24378:"4c9b9d5c",24650:"f61b7ce3",24665:"4d0b5614",24905:"1ffa1b92",25151:"6a78ba03",25278:"d754c8f9",25482:"9263ca63",26011:"2b057ca2",26288:"9e05f40b",26378:"71d7893d",26845:"b7f640bd",27112:"0c55d154",27164:"2fed0622",27236:"67cf6adb",27317:"9dc06e49",27427:"b2b32648",27512:"b719d816",27754:"0baf468b",27773:"1be849df",27800:"ae5caefc",27918:"cd669df1",28076:"25e16ebe",28213:"549a7b2e",28548:"365a8f3d",29073:"2c843ab9",29385:"009b957a",29661:"3b47735c",29735:"13727b98",29766:"e2ad6498",29781:"28bb49ee",30102:"ea06eaab",30282:"53d228a4",30290:"077de47f",30397:"d76d5346",30870:"02c30bc8",30887:"f7d9174f",31017:"e6f13d0a",31131:"c15e6124",31370:"6cec3e33",31499:"b72e0f01",31656:"ac78e307",32001:"2fae73fa",32795:"594ee532",32797:"bf1d4afd",32831:"f7ee5e09",32981:"d6b93dd9",33029:"3478598a",33314:"8fb022f5",33629:"7c03689e",34165:"f2cb9cab",34302:"c562cbe4",34535:"ed233d8c",34571:"3cedca2d",34945:"e40e9706",34956:"e044e52a",35154:"9d2e0975",35321:"994b7726",35478:"8d5cd521",35801:"0c4c3508",35844:"a82af6c6",35873:"230acb4f",36019:"681c75b6",36107:"360bdd89",36187:"3a0bee87",36426:"ee64835e",36433:"aa57fcd7",36570:"262756f6",36643:"0a825a24",36762:"f529791a",36777:"e0a42f92",37065:"d89ce7e7",37485:"a2e9d83e",37566:"633b3306",37927:"794b27cd",38041:"39d30b93",38202:"f68dde27",38247:"149318cc",38457:"c6f4fb47",38464:"c9cf0aa8",38658:"9ff14cf9",39055:"c557c3f1",39523:"4815f8d5",40669:"a9c52acd",40697:"82991fdf",40770:"433f0e55",41251:"a60b254e",41306:"e5932022",41569:"bc462018",41577:"6fbd4c02",42005:"a76d74f9",42265:"94a5e8e4",42330:"633de8a2",42382:"1111cbc1",42682:"14ae6a47",42699:"1d9f8d80",42733:"e1924e87",42784:"22ec577b",43310:"1207e3fe",43357:"6fa564ca",43768:"e5a176c1",43983:"5159813e",44161:"412448c5",44174:"559eaaa9",44384:"ad5d3f30",44622:"f37415d0",44980:"26a74fd4",45183:"cd93aed5",45399:"6f9d77e9",46055:"667f5a50",46148:"3530bd34",46536:"2a9c30f7",46740:"c930e94e",46863:"1a803374",46971:"ffb0f20a",47001:"4ec865e0",47190:"66178334",47365:"38ea3c68",47596:"a7f04970",47980:"5e3ad485",48172:"6d3ff64c",48357:"0788d4b0",48378:"3e9e76d8",48439:"c8751d5f",48571:"cae846cc",48609:"1e6b0709",48818:"f01a031e",48891:"222bc988",49048:"e5ef8d8b",49627:"d30eaa84",49654:"af0be173",49787:"70b5bfea",50137:"66c4b34e",50239:"9b8f460a",50334:"606263c7",50428:"3102e5f2",50860:"8bd0920a",51086:"1d87f1ce",51162:"6b5d8e65",51427:"51100e45",51485:"6af36c5f",51490:"d53027c9",51582:"039703f0",51772:"fb481a8c",51898:"2213e5ad",52428:"1690bd10",52546:"e83f6791",53012:"05357409",53238:"0b4b3113",53283:"65c669d5",53457:"cb2b3a44",53602:"adbcbc18",53695:"8c37a7d4",53718:"5aafc1e0",53866:"61d7ccad",53978:"7cede654",54037:"abc934ba",54685:"28c1300f",54708:"f2481c6c",54801:"7d94b820",54857:"567c05c1",54942:"bc9e4639",55080:"0a531bc5",55239:"e9ae5357",55261:"6697c116",55367:"4476c256",55688:"b21074b1",55730:"deed774b",55969:"57a474b8",56031:"cf941899",56297:"76a146bb",56401:"f406d9c1",56495:"54c68cbb",56640:"4876c855",56714:"ac0ccb0b",56847:"35caa55d",56864:"063e6e05",56983:"fbef2c67",57123:"b36a02bf",57139:"7f7585a1",57262:"83928373",57932:"4d4f19bb",57955:"40a79a7d",58413:"5bcd1c07",58807:"77898ce5",59006:"64514fee",59168:"74dc60be",59215:"1f7e1ed4",59450:"7ba00a55",59570:"5f157872",59705:"c11b211f",59876:"8f7b8b1e",59953:"1d665e1d",60114:"8ecef555",60161:"2f495aef",60896:"5ed2946e",61101:"6d2caf7a",61385:"0fe37aea",61400:"51d0d960",61834:"f3a1647b",61876:"ca335b68",62151:"4414dc02",62276:"3d580a4d",62418:"511bfacb",62475:"0ea09a83",62890:"5f48c447",63552:"3a94cf62",63889:"bd1bf780",63954:"4626d0c0",64033:"75d52ac4",64258:"690c851a",64325:"44ea8856",64439:"f1aa2932",64652:"c7b38dad",64786:"77725d1b",65069:"fea6874a",65337:"2a3654b5",65413:"21f8d340",65532:"563e3c53",65597:"cb2fa42b",65630:"f0ab8054",65718:"ba83d43f",66527:"fd321622",66719:"4d770cb0",67139:"15215280",67291:"2c994423",67513:"eabb15cb",67645:"eb5c880f",67673:"c0db3aa6",68349:"e1f6af29",68888:"541e4438",68993:"4876f7ab",69241:"ace060dc",69297:"47bcb887",69434:"b8e07c7e",69569:"18d318c2",69624:"abbc097d",69929:"3fb8deea",69983:"4794515f",70058:"6517bbde",70537:"a377fa8c",70594:"a0cfabe5",70967:"d9203f17",71332:"4d6b8368",71444:"dcb14cb5",71567:"234a8dcf",71606:"f09466e1",71843:"e8fc0f97",72181:"53d829e9",72281:"d86b5e7f",72423:"bdc6d5c9",72768:"f852e086",73057:"ee2429cb",73109:"2edc3af7",73348:"e5904d8e",73380:"555211f9",73525:"74ab4c44",73743:"89e0cc50",73929:"96491be9",74055:"ca07ae90",74515:"bd4a01de",74641:"bfa301f7",74801:"0aa61af5",75217:"9a0f3a5e",75293:"d1e6d5b5",75577:"6d8d3f8a",75724:"cdf5e69a",75935:"6f9212ca",76107:"8ff72d15",76183:"f9a2bd6d",77136:"c98541cb",77328:"b138da0e",77395:"2520dc6a",77554:"31fba531",78018:"c65dad47",78143:"7485297d",78230:"bbe4e751",78486:"a6ce80ef",78616:"4a9de205",78618:"eb086189",78675:"90949b94",78746:"afe18f97",78752:"45fa03e5",78778:"8e0ef027",78810:"b9ffa43c",79298:"ef1e218e",79301:"655783e1",79349:"37b91405",79726:"78fc74cf",79784:"2cf9b967",79789:"5b2cc511",79835:"5d4d6409",80372:"0ed563f9",80503:"3adf5d36",80789:"d6917018",80845:"e50b1415",81085:"ab22e79c",81137:"e1ac08ce",81483:"50d4f4d4",81524:"3d30d2f9",81921:"13335aa7",81938:"fd7799b1",82040:"d36bbdf0",82128:"e4520d7d",82165:"ec2c5e1a",82816:"c0c9ba42",82916:"dc431db5",83148:"34e31dab",83303:"e439fe48",83377:"72d4d6fe",83414:"e02df74a",83537:"bdc05ae9",83786:"a860f482",83854:"4904ee11",83860:"75c7b6fb",83943:"391e4904",83962:"36204f23",84102:"feaa5bb1",84635:"4aa3e88f",84667:"f8d3e830",84955:"c360b029",85285:"67256fd8",85664:"c23a2370",85690:"37a9224d",85738:"149f7582",85900:"85a6a496",86024:"89e0a6bf",86216:"13afb3aa",86223:"2831912b",86517:"6ea9b967",86553:"4b20f022",87251:"162f5a01",87259:"d2282453",87273:"f0b0d4ab",87486:"54c1438a",87489:"9af0a7b1",87534:"e40435f6",87664:"bc7ce717",87673:"b781fac3",87819:"3b721182",87858:"3fe96248",88047:"00b8706c",88055:"c879b70f",88067:"3bd76c08",88757:"322bba55",88849:"ee36c726",88856:"e661e7b0",89639:"3f830e86",89652:"ebe590ce",89670:"439e5ea7",89783:"11ba4885",90045:"ac53b79f",90187:"5e0ea21b",90285:"0a664c71",90550:"19972a1a",90847:"d07c60b1",91027:"f3a25e54",91351:"706fea2f",91419:"fb7eb88e",91458:"017e56c8",91616:"0c9be476",91982:"6a799ead",92058:"53183f72",92106:"cce50912",92130:"2612a88c",92332:"b1e812c7",92908:"71d7d119",92909:"9150f007",92924:"755e1498",93174:"b29b8f24",93624:"5223dfaf",93866:"42cb5229",93911:"cb7b6cda",94008:"af845cd2",94056:"aa206f3b",94075:"8eee3da2",94086:"da24ae47",94169:"3205eeff",94331:"2b4fb5f8",94362:"dfe2f9dc",94368:"6d77cbf5",94958:"1780303f",95109:"9f6cf702",95227:"fada0b48",95248:"7f1affac",95264:"e4e08990",95767:"1079dd8b",95801:"4025e357",95908:"fbb281d1",96099:"3b0fc25b",96265:"09d2e3bd",96490:"ba22f4be",96502:"28f0f17b",96738:"95b4daf0",96918:"115335af",97129:"c7dfbe70",97177:"6cd4a702",97718:"cb0a6af2",97987:"59b0f6f7",98278:"a621ad89",98287:"22a53a95",98317:"57390857",98341:"04d2b0ea",98492:"d08942ec",98524:"720eb3bb",98560:"73998455",98686:"7f024dce",98864:"9c710f38",99241:"bdbba32d",99291:"04ff4fbd",99311:"9e20176a",99654:"ce53ba60",99773:"bebd473c"}[e]+".js",t.miniCssF=e=>{},t.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),t.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),c={},f="serverpod-docs:",t.l=(e,a,d,b)=>{if(c[e])c[e].push(a);else{var r,o;if(void 0!==d)for(var l=document.getElementsByTagName("script"),n=0;n{r.onerror=r.onload=null,clearTimeout(s);var f=c[e];if(delete c[e],r.parentNode&&r.parentNode.removeChild(r),f&&f.forEach((e=>e(d))),a)return a(d)},s=setTimeout(u.bind(null,void 0,{type:"timeout",target:r}),12e4);r.onerror=u.bind(null,r.onerror),r.onload=u.bind(null,r.onload),o&&document.head.appendChild(r)}},t.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.p="/",t.gca=function(e){return e={13798859:"73380",16116660:"17503",17896441:"27918",44145933:"7425",44463284:"22917",49849746:"43357",53998120:"65718",62037464:"96490",68401255:"37927",79840965:"36570",92466816:"56714",96331245:"28548",96523456:"84","2890c80c":"3",da071cb8:"420","4f0519c7":"578","3b66921f":"838",a4adf53f:"1129","6feb7661":"1315","9c9052d1":"1414","3d277f18":"1481","3d1ae229":"1527",ea237062:"1651","44a83f6a":"1681","61ff6850":"1733","3817c387":"1816","2b67eda4":"2154","1577f7ed":"2400","46b54090":"2500","071f33a8":"2631",f7ae65ac:"3905","82ea7079":"3949","24557dbc":"4039","5c6f6ba9":"4081",b5dcbe95:"4086",abd13aa2:"4235",b91fbf2a:"4847",ef2492df:"5038","90ec8c6b":"5255","3fbaac07":"5500","726a6c22":"5515","42abcd4d":"5805",reactPlayerSoundCloud:"6125","32b8fafb":"7115","9d36f238":"7265",cf3c245e:"7450","81e4ed6a":"7492","616bfcf6":"7539",c75d145e:"7677","4951b372":"8251",f584139f:"8456","6f44ab90":"8847",e0bec135:"9120",bc03f89b:"9419","8baf194b":"9533","05ec9480":"9638","986f0f98":"10131",reactPlayerKaltura:"10261","566f49fb":"10281","511f9951":"10399","1d7c691c":"10435","02c0cfe0":"10507","719163ad":"10832",a1154d73:"11103","8552f549":"11372","4a55fe3a":"11629","819b642a":"12068",cdc118a8:"12105",reactPlayerFacebook:"12121","9b4ab8cd":"12394",ae0eacdd:"12500","5f6b1733":"12544","69fcd2fc":"12663","1921e4ca":"12696","2fca5c64":"13033",b7b014bf:"13254","19e323d1":"13721","8615e055":"13990","9e0c2c37":"14013",fc8b5a5d:"14135","1111b27e":"14218",fe522f67:"14442","070c8c93":"14477",af68ae04:"14667",b467d32a:"14669","099a3596":"14807","813cfb2f":"14842",fac0eceb:"14969",ee65edec:"15002",b26210db:"15172","1b218eaa":"15243",ae22b856:"16023",b28bd8b1:"16092",d9107a6a:"16189",dc7352a7:"16383","03b2528f":"16506",d3938b1f:"16665",df1414bb:"16963","954e932f":"16974",c2b45dbb:"17051","8bed5a26":"17311","2e18ba50":"17613","49145cdf":"17670",a7f483d1:"17908",e64edb60:"18044",df15bc7d:"18154",a7bd4aaa:"18518","5390e21f":"18823",b916a1ab:"18924","31b73615":"19231","0d271e1e":"19284",cbf3c4ec:"19667","16b03284":"19784",b1394c86:"20099","45939ed5":"20969",fc6f07d2:"21308",c3373259:"21453",e84b4e80:"21681","7de3e81f":"21826","33c1d41a":"22372",d3af5b3c:"22436",c3094240:"22743",d2aa311d:"23095","2ca08277":"23128",b6f81eaa:"23396","6da448d1":"23770",da54b976:"24101","21e10cde":"24243",daec0d60:"24378",c090764b:"24650","327b0a57":"24665","468d57a9":"24905",e2d6ba1f:"25151","50f2f9f3":"25278","90239e6e":"25482",reactPlayerFilePlayer:"26011",a4c89d62:"26288",eaeab60b:"26378","141135bb":"26845","88a48c42":"27112","39ec0930":"27164",ed772d97:"27236",a271ef09:"27317",e3443ce0:"27427","07006f9e":"27512","5596dd05":"27754","06a408fe":"27773","59df87e8":"27800","169f3d24":"28076","98c94590":"28213",a64b2578:"29073","05fbef88":"29385","5e95c892":"29661",b1218054:"29735",c868bccf:"29766","9037180b":"29781","7d63aba8":"30102","1e1f8072":"30282","307525ba":"30290",b809d820:"30397","85d514f3":"30870","71ba2dc1":"30887","0d76317c":"31017",bd118f84:"31131","2bbc2deb":"31370","87ab7385":"31499","1d39c85d":"31656",e7977816:"32001","441fd5fc":"32795",ff5ed6ba:"32797","5b2d7e3c":"32831","526e379a":"32981",b9ec56c8:"33029",d2f6d210:"33314",aba21aa0:"33629",ebde045d:"34165","999788b8":"34302","087cd58c":"34535","51e50f95":"34571","812775a4":"34945","1a39ee04":"34956","5a96e453":"35154",c0650537:"35321",d58f1ee2:"35478",a81cb65f:"35801","2ed96714":"35844","564db590":"35873",ecaa7076:"36019","82e43b76":"36107",ac9d9d69:"36187","828ace52":"36426",c5313007:"36433","55f37562":"36643","6d717251":"36762",d802bb56:"36777","8dfd8953":"37065",b7ea99f7:"37485","063d75bd":"37566","076cf272":"38041","9644aa4e":"38202","7b06977d":"38247",ac3101e9:"38457",ac5db01d:"38464","2c2832e4":"38658","10ad1fa6":"39055","05fa9a60":"39523",bd568e77:"40669",fca5fdb4:"40697","94b2bc9a":"40770","1323771c":"41251","965931d7":"41306","805a59dc":"41569","897331c0":"41577","8f509517":"42005","0893faed":"42265","6d2a4d3f":"42330",c7507218:"42382","20d56cb7":"42682","17f04a83":"42699","1457ddcd":"42733","3e87058f":"42784","30bd0f5b":"43310","5d707891":"43768","2db5c390":"43983",da698f4c:"44161",f527bef3:"44174",bafd283f:"44384","7800d508":"44622","22dd74f7":"44980","21b7a589":"45183","3f04b2f3":"45399",cb867d98:"46055","0c6fe626":"46148","65c67349":"46536","53e9dd7a":"46740",c7156cf2:"46863",c377a04b:"46971","82444e58":"47001","9270ba4f":"47190","65b7208a":"47365",reactPlayerDailyMotion:"47596",db7d4591:"47980","4934de22":"48172",cd64d641:"48357","38e32826":"48378","9c5d9512":"48439","056b386b":"48571","2d4af3bf":"48609",d636c09f:"48818","27e827f8":"48891","640696ee":"49048",f3467f26:"49627",caf7731d:"49654",c2237e68:"49787","4118187a":"50137",b685e31b:"50239",f28f059c:"50334","358c2507":"50428","1a84c7fd":"50860","17dc776d":"51086",dc4059b2:"51162",f6f476f1:"51427",da19ecb4:"51485","71319bec":"51490","4519f039":"51582","801276a1":"51898",fe76eed8:"52428",reactPlayerStreamable:"52546","710ac1c1":"53012",dc8c27bd:"53238",ef4456b5:"53283","068743c8":"53457","0841186f":"53602","7a3d47b3":"53695","19a6be06":"53718","0c695afe":"53866",cce58fe7:"53978","5144cf5e":"54037","94f11012":"54708","378935ce":"54801","51c7df8c":"54857",a6c3ea4a:"54942",a6397568:"55080","89b55a09":"55239","18910d94":"55261","9e09f891":"55367","2e1ee4ed":"55688",f5fed352:"55730","5c1eff22":"55969","4aec9039":"56031","45926b62":"56297","0a5c01b2":"56401",e4eafb12:"56495","3f80bb14":"56640",ac002d2b:"56847","08aab21d":"56864","4ed1e0ac":"56983",fd4b36bb:"57123",bdc5a52e:"57139","9a594c98":"57262","5af30237":"57932",b8787c81:"57955",ac6e050c:"58413","49fed513":"58807","0f4a5c74":"59006","308471de":"59168","2e3fc0f9":"59215","3874f1bf":"59450",f149b10e:"59570",a7edc2bd:"59705","57012fa6":"59876","2020ed93":"59953",c10a0985:"60114",af1c5d2b:"60161",c134ef8a:"60896","5a0a1617":"61101",a2757506:"61385","5143312c":"61400","419cd6b8":"61834","3aa0ab0a":"61876","7570de64":"62151",f5a589e7:"62276",b48f41b9:"62418","869ae8a7":"62475",ad61550a:"62890",fb72d7b2:"63552",b0f19176:"63889","2db99065":"63954",ce86e3e6:"64033",reactPlayerMux:"64258","9fbfaf6d":"64325",reactPlayerYouTube:"64439",ebd05845:"64652","52f87500":"64786","9107c65f":"65069",fc8c8cde:"65337","06393fc1":"65413","26398b18":"65532","280af06a":"65597","79d28454":"65630","07e708e9":"66527","5bc657fa":"66719","926056c1":"67139","1caa8cdb":"67291","91aed80e":"67513","8186ecf9":"67645","83c6f999":"67673",eac16e1d:"68349",reactPlayerVidyard:"68888",d38e3f9f:"68993",dd31e7e9:"69241",f9bde383:"69297","8ee9837e":"69434","036b5431":"69569","36fcb744":"69624","3edac44d":"69929","62de5d73":"69983","313c9eb1":"70058",da202fdd:"70537",fc67ad3d:"70594","51ddac88":"70967","6e29a506":"71332",dec2bd4a:"71444",e66f2658:"71567","4ead9a95":"71606",ce4dbf6d:"71843",c8139b75:"72181",dbf9e27d:"72281","95ec96e5":"72423","676f1bdb":"72768","4e689a0b":"73057",d8d6d57b:"73109","08d55cf7":"73348","227d1fc4":"73525",reactPlayerVimeo:"73743","4ab30eec":"73929","272aa200":"74055","356ce494":"74515",a32c313f:"74641","444a6d4e":"74801","3cc71396":"75217","5839343c":"75293","1312139a":"75577","704545ab":"75724","03b3cfd2":"75935","9f1829f0":"76107",adce8179:"76183","098f2604":"77136","4c5c4c2e":"77328","7af31c45":"77395","98d962c5":"77554","0d7acd84":"78018","0773e78b":"78143",fe2e2e26:"78230",a0aa5253:"78486",bf519c8d:"78616","00d14154":"78618","28967b3e":"78675","8af032d3":"78746",d44e0d1c:"78752","5e7d099e":"78778","7ac69e68":"78810","6aee17c2":"79298",d0b9ca74:"79301","46eeb6cb":"79349","10ea0b82":"79726","8093477b":"79784","0f2c2e36":"79789","4ac2e930":"79835","2d11a680":"80372","8d02075b":"80503","510b9307":"80789",eecc43ff:"80845","8eead450":"81085",bc69c5bc:"81137","9f8e6d57":"81483",cc180519:"81524","1877d9d5":"81921",afb7a97b:"81938","54cab4d4":"82040","4aa94ec1":"82128","956829f8":"82165","6fbf0c67":"82816","3c4af576":"82916","4048090e":"83148","7b33c27b":"83303","7f0714d1":"83377",ec91ff36:"83414",c342bcae:"83537","4867e743":"83786","21a4ba71":"83854",e58556b2:"83860","50a12feb":"83943",af754a1f:"83962","98f4e1ec":"84102","39dec3ba":"84635",reactPlayerMixcloud:"84667","646cbece":"84955","45dd886d":"85285","504d78e0":"85664",aeef55f7:"85690",efe5610c:"85738","616631fd":"85900",fe170cc9:"86024",reactPlayerTwitch:"86216",bd6f2233:"86223","78ae7ec8":"86517","4bfca71d":"86553",b32c213b:"87251","2115313f":"87259",cdd4a9c6:"87273","67e77328":"87486","3e4a4cb2":"87489","42a9b3c5":"87534",reactPlayerPreview:"87664","638e38ae":"87673","3141060a":"87819","7ca2e59a":"87858","3d150a24":"88047",reactPlayerWistia:"88055","7517a61c":"88067","73ca4188":"88757","5e253f2f":"88849",afde3230:"88856","4c781063":"89639",bb9c591b:"89652","86a8bb6c":"89670","4b6eee9a":"89783","984d6493":"90045",a2a1c245:"90187","3cf6fa35":"90285","6ba85e75":"90550","1b6591f7":"90847",f6adf820:"91027","7c8e5227":"91351","9d779d8b":"91419",e3d58533:"91458","25c6d77a":"91616",ecb3c634:"91982","93dcedec":"92058","4fa4eafa":"92106",dcbfe205:"92130",f6affd6e:"92332","6f56eca8":"92908","0eebd274":"92909","95a5d2b2":"92924","4a49065b":"93174",a6311318:"93624",d9e7b984:"93866","5cde491b":"93911","431ffdb5":"94008","27b43779":"94056",aefdd881:"94075","1ebbfca8":"94086",e4a796aa:"94169","8e7261c9":"94331","65e04ea3":"94362",a94703ab:"94368","9d217e1f":"94958","3c9432f0":"95109","522ca66b":"95227","83ac10ed":"95248",e7ee6027:"95264","2d16d24d":"95767",f29fc884:"95801","22f51758":"95908",e8f4756d:"96099","3fe65583":"96265","95bf5f56":"96502","5112ebe3":"96738",b2419a00:"96918","23975af2":"97129","76259cc3":"97177",ed64c12e:"97718","8abbb0ee":"97987",fe3f3783:"98278",d4fc3158:"98287",d26a73b8:"98317",bd1cffff:"98341",eb4c176e:"98492","9d7352c0":"98524","6a734661":"98560","02e41de2":"98686","4eee9c87":"98864","092bf57d":"99241",f8189ec4:"99291",db42f242:"99311","5589c54d":"99654","12407b36":"99773"}[e]||e,t.p+t.u(e)},(()=>{var e={51303:0,40532:0};t.f.j=(a,d)=>{var c=t.o(e,a)?e[a]:void 0;if(0!==c)if(c)d.push(c[2]);else if(/^(40532|51303)$/.test(a))e[a]=0;else{var f=new Promise(((d,f)=>c=e[a]=[d,f]));d.push(c[2]=f);var b=t.p+t.u(a),r=new Error;t.l(b,(d=>{if(t.o(e,a)&&(0!==(c=e[a])&&(e[a]=void 0),c)){var f=d&&("load"===d.type?"missing":d.type),b=d&&d.target&&d.target.src;r.message="Loading chunk "+a+" failed.\n("+f+": "+b+")",r.name="ChunkLoadError",r.type=f,r.request=b,c[1](r)}}),"chunk-"+a,a)}},t.O.j=a=>0===e[a];var a=(a,d)=>{var c,f,b=d[0],r=d[1],o=d[2],l=0;if(b.some((a=>0!==e[a]))){for(c in r)t.o(r,c)&&(t.m[c]=r[c]);if(o)var n=o(t)}for(a&&a(d);l{"use strict";var e,a,d,f,c,b={},r={};function t(e){var a=r[e];if(void 0!==a)return a.exports;var d=r[e]={exports:{}};return b[e].call(d.exports,d,d.exports,t),d.exports}t.m=b,e=[],t.O=(a,d,f,c)=>{if(!d){var b=1/0;for(n=0;n=c)&&Object.keys(t.O).every((e=>t.O[e](d[o])))?d.splice(o--,1):(r=!1,c0&&e[n-1][2]>c;n--)e[n]=e[n-1];e[n]=[d,f,c]},t.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return t.d(a,{a:a}),a},d=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,t.t=function(e,f){if(1&f&&(e=this(e)),8&f)return e;if("object"==typeof e&&e){if(4&f&&e.__esModule)return e;if(16&f&&"function"==typeof e.then)return e}var c=Object.create(null);t.r(c);var b={};a=a||[null,d({}),d([]),d(d)];for(var r=2&f&&e;"object"==typeof r&&!~a.indexOf(r);r=d(r))Object.getOwnPropertyNames(r).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,t.d(c,b),c},t.d=(e,a)=>{for(var d in a)t.o(a,d)&&!t.o(e,d)&&Object.defineProperty(e,d,{enumerable:!0,get:a[d]})},t.f={},t.e=e=>Promise.all(Object.keys(t.f).reduce(((a,d)=>(t.f[d](e,a),a)),[])),t.u=e=>"assets/js/"+({3:"2890c80c",84:"96523456",420:"da071cb8",578:"4f0519c7",838:"3b66921f",1129:"a4adf53f",1315:"6feb7661",1414:"9c9052d1",1481:"3d277f18",1527:"3d1ae229",1651:"ea237062",1681:"44a83f6a",1733:"61ff6850",1816:"3817c387",2154:"2b67eda4",2400:"1577f7ed",2500:"46b54090",2631:"071f33a8",3905:"f7ae65ac",3949:"82ea7079",4039:"24557dbc",4081:"5c6f6ba9",4086:"b5dcbe95",4235:"abd13aa2",4847:"b91fbf2a",5038:"ef2492df",5255:"90ec8c6b",5500:"3fbaac07",5515:"726a6c22",5805:"42abcd4d",6125:"reactPlayerSoundCloud",7115:"32b8fafb",7265:"9d36f238",7425:"44145933",7450:"cf3c245e",7492:"81e4ed6a",7539:"616bfcf6",7677:"c75d145e",8251:"4951b372",8456:"f584139f",8847:"6f44ab90",9120:"e0bec135",9419:"bc03f89b",9533:"8baf194b",9638:"05ec9480",10131:"986f0f98",10261:"reactPlayerKaltura",10281:"566f49fb",10399:"511f9951",10435:"1d7c691c",10507:"02c0cfe0",10832:"719163ad",11103:"a1154d73",11372:"8552f549",11629:"4a55fe3a",12068:"819b642a",12105:"cdc118a8",12121:"reactPlayerFacebook",12394:"9b4ab8cd",12500:"ae0eacdd",12544:"5f6b1733",12663:"69fcd2fc",12696:"1921e4ca",13033:"2fca5c64",13254:"b7b014bf",13721:"19e323d1",13990:"8615e055",14013:"9e0c2c37",14135:"fc8b5a5d",14218:"1111b27e",14442:"fe522f67",14477:"070c8c93",14667:"af68ae04",14669:"b467d32a",14807:"099a3596",14842:"813cfb2f",14969:"fac0eceb",15002:"ee65edec",15172:"b26210db",15243:"1b218eaa",16023:"ae22b856",16092:"b28bd8b1",16189:"d9107a6a",16383:"dc7352a7",16506:"03b2528f",16665:"d3938b1f",16963:"df1414bb",16974:"954e932f",17051:"c2b45dbb",17311:"8bed5a26",17503:"16116660",17613:"2e18ba50",17670:"49145cdf",17908:"a7f483d1",18044:"e64edb60",18154:"df15bc7d",18518:"a7bd4aaa",18823:"5390e21f",18924:"b916a1ab",19231:"31b73615",19284:"0d271e1e",19667:"cbf3c4ec",19784:"16b03284",20099:"b1394c86",20969:"45939ed5",21308:"fc6f07d2",21453:"c3373259",21681:"e84b4e80",21826:"7de3e81f",22372:"33c1d41a",22436:"d3af5b3c",22743:"c3094240",22917:"44463284",23095:"d2aa311d",23128:"2ca08277",23396:"b6f81eaa",23770:"6da448d1",24101:"da54b976",24243:"21e10cde",24378:"daec0d60",24650:"c090764b",24665:"327b0a57",24905:"468d57a9",25151:"e2d6ba1f",25278:"50f2f9f3",25482:"90239e6e",26011:"reactPlayerFilePlayer",26288:"a4c89d62",26378:"eaeab60b",26845:"141135bb",27112:"88a48c42",27164:"39ec0930",27236:"ed772d97",27317:"a271ef09",27427:"e3443ce0",27512:"07006f9e",27754:"5596dd05",27773:"06a408fe",27800:"59df87e8",27918:"17896441",28076:"169f3d24",28213:"98c94590",28548:"96331245",29073:"a64b2578",29385:"05fbef88",29661:"5e95c892",29735:"b1218054",29766:"c868bccf",29781:"9037180b",30102:"7d63aba8",30282:"1e1f8072",30290:"307525ba",30397:"b809d820",30870:"85d514f3",30887:"71ba2dc1",31017:"0d76317c",31131:"bd118f84",31370:"2bbc2deb",31499:"87ab7385",31656:"1d39c85d",32001:"e7977816",32795:"441fd5fc",32797:"ff5ed6ba",32831:"5b2d7e3c",32981:"526e379a",33029:"b9ec56c8",33314:"d2f6d210",33629:"aba21aa0",34165:"ebde045d",34302:"999788b8",34535:"087cd58c",34571:"51e50f95",34945:"812775a4",34956:"1a39ee04",35154:"5a96e453",35321:"c0650537",35478:"d58f1ee2",35801:"a81cb65f",35844:"2ed96714",35873:"564db590",36019:"ecaa7076",36107:"82e43b76",36187:"ac9d9d69",36426:"828ace52",36433:"c5313007",36570:"79840965",36643:"55f37562",36762:"6d717251",36777:"d802bb56",37065:"8dfd8953",37485:"b7ea99f7",37566:"063d75bd",37927:"68401255",38041:"076cf272",38202:"9644aa4e",38247:"7b06977d",38457:"ac3101e9",38464:"ac5db01d",38658:"2c2832e4",39055:"10ad1fa6",39523:"05fa9a60",40669:"bd568e77",40697:"fca5fdb4",40770:"94b2bc9a",41251:"1323771c",41306:"965931d7",41569:"805a59dc",41577:"897331c0",42005:"8f509517",42265:"0893faed",42330:"6d2a4d3f",42382:"c7507218",42682:"20d56cb7",42699:"17f04a83",42733:"1457ddcd",42784:"3e87058f",43310:"30bd0f5b",43357:"49849746",43768:"5d707891",43983:"2db5c390",44161:"da698f4c",44174:"f527bef3",44384:"bafd283f",44622:"7800d508",44980:"22dd74f7",45183:"21b7a589",45399:"3f04b2f3",46055:"cb867d98",46148:"0c6fe626",46536:"65c67349",46740:"53e9dd7a",46863:"c7156cf2",46971:"c377a04b",47001:"82444e58",47190:"9270ba4f",47365:"65b7208a",47596:"reactPlayerDailyMotion",47980:"db7d4591",48172:"4934de22",48357:"cd64d641",48378:"38e32826",48439:"9c5d9512",48571:"056b386b",48609:"2d4af3bf",48818:"d636c09f",48891:"27e827f8",49048:"640696ee",49627:"f3467f26",49654:"caf7731d",49787:"c2237e68",50137:"4118187a",50239:"b685e31b",50334:"f28f059c",50428:"358c2507",50860:"1a84c7fd",51086:"17dc776d",51162:"dc4059b2",51427:"f6f476f1",51485:"da19ecb4",51490:"71319bec",51582:"4519f039",51898:"801276a1",52428:"fe76eed8",52546:"reactPlayerStreamable",53012:"710ac1c1",53238:"dc8c27bd",53283:"ef4456b5",53457:"068743c8",53602:"0841186f",53695:"7a3d47b3",53718:"19a6be06",53866:"0c695afe",53978:"cce58fe7",54037:"5144cf5e",54708:"94f11012",54801:"378935ce",54857:"51c7df8c",54942:"a6c3ea4a",55080:"a6397568",55239:"89b55a09",55261:"18910d94",55367:"9e09f891",55688:"2e1ee4ed",55730:"f5fed352",55969:"5c1eff22",56031:"4aec9039",56297:"45926b62",56401:"0a5c01b2",56495:"e4eafb12",56640:"3f80bb14",56714:"92466816",56847:"ac002d2b",56864:"08aab21d",56983:"4ed1e0ac",57123:"fd4b36bb",57139:"bdc5a52e",57262:"9a594c98",57932:"5af30237",57955:"b8787c81",58413:"ac6e050c",58807:"49fed513",59006:"0f4a5c74",59168:"308471de",59215:"2e3fc0f9",59450:"3874f1bf",59570:"f149b10e",59705:"a7edc2bd",59876:"57012fa6",59953:"2020ed93",60114:"c10a0985",60161:"af1c5d2b",60896:"c134ef8a",61101:"5a0a1617",61385:"a2757506",61400:"5143312c",61834:"419cd6b8",61876:"3aa0ab0a",62151:"7570de64",62276:"f5a589e7",62418:"b48f41b9",62475:"869ae8a7",62890:"ad61550a",63552:"fb72d7b2",63889:"b0f19176",63954:"2db99065",64033:"ce86e3e6",64258:"reactPlayerMux",64325:"9fbfaf6d",64439:"reactPlayerYouTube",64652:"ebd05845",64786:"52f87500",65069:"9107c65f",65337:"fc8c8cde",65413:"06393fc1",65532:"26398b18",65597:"280af06a",65630:"79d28454",65718:"53998120",66527:"07e708e9",66719:"5bc657fa",67139:"926056c1",67291:"1caa8cdb",67513:"91aed80e",67645:"8186ecf9",67673:"83c6f999",68349:"eac16e1d",68888:"reactPlayerVidyard",68993:"d38e3f9f",69241:"dd31e7e9",69297:"f9bde383",69434:"8ee9837e",69569:"036b5431",69624:"36fcb744",69929:"3edac44d",69983:"62de5d73",70058:"313c9eb1",70537:"da202fdd",70594:"fc67ad3d",70967:"51ddac88",71332:"6e29a506",71444:"dec2bd4a",71567:"e66f2658",71606:"4ead9a95",71843:"ce4dbf6d",72181:"c8139b75",72281:"dbf9e27d",72423:"95ec96e5",72768:"676f1bdb",73057:"4e689a0b",73109:"d8d6d57b",73348:"08d55cf7",73380:"13798859",73525:"227d1fc4",73743:"reactPlayerVimeo",73929:"4ab30eec",74055:"272aa200",74515:"356ce494",74641:"a32c313f",74801:"444a6d4e",75217:"3cc71396",75293:"5839343c",75577:"1312139a",75724:"704545ab",75935:"03b3cfd2",76107:"9f1829f0",76183:"adce8179",77136:"098f2604",77328:"4c5c4c2e",77395:"7af31c45",77554:"98d962c5",78018:"0d7acd84",78143:"0773e78b",78230:"fe2e2e26",78486:"a0aa5253",78616:"bf519c8d",78618:"00d14154",78675:"28967b3e",78746:"8af032d3",78752:"d44e0d1c",78778:"5e7d099e",78810:"7ac69e68",79298:"6aee17c2",79301:"d0b9ca74",79349:"46eeb6cb",79726:"10ea0b82",79784:"8093477b",79789:"0f2c2e36",79835:"4ac2e930",80372:"2d11a680",80503:"8d02075b",80789:"510b9307",80845:"eecc43ff",81085:"8eead450",81137:"bc69c5bc",81483:"9f8e6d57",81524:"cc180519",81921:"1877d9d5",81938:"afb7a97b",82040:"54cab4d4",82128:"4aa94ec1",82165:"956829f8",82816:"6fbf0c67",82916:"3c4af576",83148:"4048090e",83303:"7b33c27b",83377:"7f0714d1",83414:"ec91ff36",83537:"c342bcae",83786:"4867e743",83854:"21a4ba71",83860:"e58556b2",83943:"50a12feb",83962:"af754a1f",84102:"98f4e1ec",84635:"39dec3ba",84667:"reactPlayerMixcloud",84955:"646cbece",85285:"45dd886d",85664:"504d78e0",85690:"aeef55f7",85738:"efe5610c",85900:"616631fd",86024:"fe170cc9",86216:"reactPlayerTwitch",86223:"bd6f2233",86517:"78ae7ec8",86553:"4bfca71d",87251:"b32c213b",87259:"2115313f",87273:"cdd4a9c6",87486:"67e77328",87489:"3e4a4cb2",87534:"42a9b3c5",87664:"reactPlayerPreview",87673:"638e38ae",87819:"3141060a",87858:"7ca2e59a",88047:"3d150a24",88055:"reactPlayerWistia",88067:"7517a61c",88757:"73ca4188",88849:"5e253f2f",88856:"afde3230",89639:"4c781063",89652:"bb9c591b",89670:"86a8bb6c",89783:"4b6eee9a",90045:"984d6493",90187:"a2a1c245",90285:"3cf6fa35",90550:"6ba85e75",90847:"1b6591f7",91027:"f6adf820",91351:"7c8e5227",91419:"9d779d8b",91458:"e3d58533",91616:"25c6d77a",91982:"ecb3c634",92058:"93dcedec",92106:"4fa4eafa",92130:"dcbfe205",92332:"f6affd6e",92908:"6f56eca8",92909:"0eebd274",92924:"95a5d2b2",93174:"4a49065b",93624:"a6311318",93866:"d9e7b984",93911:"5cde491b",94008:"431ffdb5",94056:"27b43779",94075:"aefdd881",94086:"1ebbfca8",94169:"e4a796aa",94331:"8e7261c9",94362:"65e04ea3",94368:"a94703ab",94958:"9d217e1f",95109:"3c9432f0",95227:"522ca66b",95248:"83ac10ed",95264:"e7ee6027",95767:"2d16d24d",95801:"f29fc884",95908:"22f51758",96099:"e8f4756d",96265:"3fe65583",96490:"62037464",96502:"95bf5f56",96738:"5112ebe3",96918:"b2419a00",97129:"23975af2",97177:"76259cc3",97718:"ed64c12e",97987:"8abbb0ee",98278:"fe3f3783",98287:"d4fc3158",98317:"d26a73b8",98341:"bd1cffff",98492:"eb4c176e",98524:"9d7352c0",98560:"6a734661",98686:"02e41de2",98864:"4eee9c87",99241:"092bf57d",99291:"f8189ec4",99311:"db42f242",99654:"5589c54d",99773:"12407b36"}[e]||e)+"."+{3:"75f661b1",84:"26a3794d",420:"aab455f2",578:"3039c890",838:"3f5b34cc",1129:"ab1fe72f",1315:"ca0fde8c",1414:"769fb929",1481:"3be990da",1527:"35b01eb9",1651:"4be3828c",1681:"d4c01e4c",1733:"9aa1b7c7",1816:"ee9d42ab",2154:"a0b98ed5",2400:"1299a61f",2500:"5ca680a6",2631:"8d1f3fae",3905:"1a9dacf8",3949:"86071e75",4039:"5d0cb40d",4081:"2d05ca22",4086:"0b064355",4235:"a4712490",4847:"a585227d",5038:"c26cacbf",5255:"0b910fc2",5500:"9ee7f827",5515:"9c86a4a7",5805:"a4810eb0",6125:"8eed9d23",7115:"15b91298",7265:"d5a3620b",7425:"7b75e8bd",7450:"69336175",7492:"41df2776",7539:"fc7ac5ec",7677:"37fc9eeb",8251:"ab9717fe",8456:"1e58679f",8847:"bb6f5fd9",9120:"6f7c3a72",9419:"d7833d70",9533:"4bd22d4a",9638:"5efe5897",10131:"7390c60d",10261:"00e7b539",10281:"6e162917",10399:"c580d9b7",10435:"8bd7131e",10507:"7aa842cb",10832:"6b51c80b",11103:"645db913",11372:"584c5b06",11629:"4491ddea",12068:"6256fb3c",12105:"a66654ce",12121:"977103e0",12394:"b799bbe6",12500:"9b18f985",12544:"cc6f63c1",12663:"1351b648",12696:"dc97eb61",13033:"2e6abaf7",13254:"bb420e6e",13721:"8a5f13d6",13990:"25dd71fc",14013:"e0d573e4",14135:"5d4089b4",14218:"70b885ac",14442:"fe73dd8a",14477:"39d016ad",14667:"1554ec17",14669:"abbd94dc",14807:"f1e1ba7e",14842:"3b76b8e2",14969:"79beb605",15002:"f2203186",15172:"cd596aed",15243:"d374b006",16023:"f5df73e2",16092:"2d466a26",16189:"089b5e69",16383:"379de6a4",16506:"aad10a0e",16665:"2c354e72",16963:"1c60a2f3",16974:"12153a27",17051:"021a849c",17311:"9cd8c2bc",17503:"056036bb",17613:"da94e453",17670:"fedf3ff0",17908:"6aa89b73",18044:"d75fe625",18154:"486261d6",18518:"1c053dec",18823:"b10f9812",18924:"3a80b720",19231:"e5cd57dc",19284:"173f2390",19667:"c4958815",19784:"7af7501a",20099:"a8b4682a",20969:"a9b55130",21308:"f239be32",21453:"a94c03b9",21681:"e7cc5a5e",21826:"801da589",22372:"fd47170e",22436:"6901bbfe",22743:"a75500df",22917:"474bde29",23095:"a6cf541f",23128:"54a66d64",23396:"cc469673",23770:"f3ae2ec2",24101:"6b527b68",24243:"e8e94a47",24378:"4c9b9d5c",24650:"f61b7ce3",24665:"4d0b5614",24905:"1ffa1b92",25151:"6a78ba03",25278:"d754c8f9",25482:"9263ca63",26011:"2b057ca2",26288:"9e05f40b",26378:"71d7893d",26845:"b7f640bd",27112:"0c55d154",27164:"2fed0622",27236:"67cf6adb",27317:"9dc06e49",27427:"b2b32648",27512:"b719d816",27754:"0baf468b",27773:"1be849df",27800:"ae5caefc",27918:"cd669df1",28076:"25e16ebe",28213:"549a7b2e",28548:"365a8f3d",29073:"2c843ab9",29385:"009b957a",29661:"3b47735c",29735:"13727b98",29766:"e2ad6498",29781:"28bb49ee",30102:"ea06eaab",30282:"53d228a4",30290:"077de47f",30397:"d76d5346",30870:"02c30bc8",30887:"f7d9174f",31017:"e6f13d0a",31131:"c15e6124",31370:"6cec3e33",31499:"b72e0f01",31656:"ac78e307",32001:"2fae73fa",32795:"594ee532",32797:"bf1d4afd",32831:"f7ee5e09",32981:"d6b93dd9",33029:"3478598a",33314:"8fb022f5",33629:"7c03689e",34165:"f2cb9cab",34302:"c562cbe4",34535:"ed233d8c",34571:"3cedca2d",34945:"e40e9706",34956:"e044e52a",35154:"9d2e0975",35321:"994b7726",35478:"8d5cd521",35801:"0c4c3508",35844:"a82af6c6",35873:"230acb4f",36019:"681c75b6",36107:"360bdd89",36187:"3a0bee87",36426:"ee64835e",36433:"aa57fcd7",36570:"262756f6",36643:"0a825a24",36762:"f529791a",36777:"e0a42f92",37065:"d89ce7e7",37485:"a2e9d83e",37566:"633b3306",37927:"794b27cd",38041:"39d30b93",38202:"f68dde27",38247:"149318cc",38457:"c6f4fb47",38464:"c9cf0aa8",38658:"9ff14cf9",39055:"c557c3f1",39523:"4815f8d5",40669:"a9c52acd",40697:"82991fdf",40770:"433f0e55",41251:"a60b254e",41306:"e5932022",41569:"bc462018",41577:"6fbd4c02",42005:"a76d74f9",42265:"94a5e8e4",42330:"633de8a2",42382:"1111cbc1",42682:"14ae6a47",42699:"1d9f8d80",42733:"e1924e87",42784:"22ec577b",43310:"1207e3fe",43357:"6fa564ca",43768:"e5a176c1",43983:"5159813e",44161:"412448c5",44174:"559eaaa9",44384:"ad5d3f30",44622:"f37415d0",44980:"26a74fd4",45183:"cd93aed5",45399:"6f9d77e9",46055:"667f5a50",46148:"96dcbb61",46536:"2a9c30f7",46740:"c930e94e",46863:"1a803374",46971:"ffb0f20a",47001:"4ec865e0",47190:"66178334",47365:"38ea3c68",47596:"a7f04970",47980:"5e3ad485",48172:"6d3ff64c",48357:"0788d4b0",48378:"3e9e76d8",48439:"c8751d5f",48571:"cae846cc",48609:"1e6b0709",48818:"f01a031e",48891:"222bc988",49048:"e5ef8d8b",49627:"d30eaa84",49654:"af0be173",49787:"70b5bfea",50137:"66c4b34e",50239:"9b8f460a",50334:"606263c7",50428:"3102e5f2",50860:"8bd0920a",51086:"1d87f1ce",51162:"6b5d8e65",51427:"51100e45",51485:"6af36c5f",51490:"d53027c9",51582:"039703f0",51772:"fb481a8c",51898:"2213e5ad",52428:"1690bd10",52546:"e83f6791",53012:"05357409",53238:"0b4b3113",53283:"65c669d5",53457:"cb2b3a44",53602:"adbcbc18",53695:"8c37a7d4",53718:"5aafc1e0",53866:"61d7ccad",53978:"7cede654",54037:"abc934ba",54685:"28c1300f",54708:"f2481c6c",54801:"7d94b820",54857:"567c05c1",54942:"bc9e4639",55080:"0a531bc5",55239:"e9ae5357",55261:"6697c116",55367:"4476c256",55688:"b21074b1",55730:"deed774b",55969:"57a474b8",56031:"cf941899",56297:"76a146bb",56401:"f406d9c1",56495:"54c68cbb",56640:"4876c855",56714:"ac0ccb0b",56847:"35caa55d",56864:"063e6e05",56983:"fbef2c67",57123:"b36a02bf",57139:"7f7585a1",57262:"83928373",57932:"4d4f19bb",57955:"40a79a7d",58413:"5bcd1c07",58807:"77898ce5",59006:"64514fee",59168:"74dc60be",59215:"1f7e1ed4",59450:"7ba00a55",59570:"5f157872",59705:"c11b211f",59876:"8f7b8b1e",59953:"1d665e1d",60114:"8ecef555",60161:"2f495aef",60896:"5ed2946e",61101:"6d2caf7a",61385:"0fe37aea",61400:"51d0d960",61834:"f3a1647b",61876:"ca335b68",62151:"4414dc02",62276:"3d580a4d",62418:"511bfacb",62475:"0ea09a83",62890:"5f48c447",63552:"3a94cf62",63889:"bd1bf780",63954:"4626d0c0",64033:"75d52ac4",64258:"690c851a",64325:"44ea8856",64439:"f1aa2932",64652:"c7b38dad",64786:"77725d1b",65069:"fea6874a",65337:"2a3654b5",65413:"21f8d340",65532:"563e3c53",65597:"cb2fa42b",65630:"f0ab8054",65718:"ba83d43f",66527:"fd321622",66719:"4d770cb0",67139:"15215280",67291:"2c994423",67513:"eabb15cb",67645:"eb5c880f",67673:"c0db3aa6",68349:"e1f6af29",68888:"541e4438",68993:"4876f7ab",69241:"ace060dc",69297:"47bcb887",69434:"b8e07c7e",69569:"18d318c2",69624:"abbc097d",69929:"3fb8deea",69983:"4794515f",70058:"6517bbde",70537:"a377fa8c",70594:"a0cfabe5",70967:"d9203f17",71332:"4d6b8368",71444:"dcb14cb5",71567:"234a8dcf",71606:"f09466e1",71843:"e8fc0f97",72181:"53d829e9",72281:"d86b5e7f",72423:"bdc6d5c9",72768:"f852e086",73057:"ee2429cb",73109:"2edc3af7",73348:"e5904d8e",73380:"555211f9",73525:"74ab4c44",73743:"89e0cc50",73929:"96491be9",74055:"ca07ae90",74515:"bd4a01de",74641:"bfa301f7",74801:"0aa61af5",75217:"9a0f3a5e",75293:"d1e6d5b5",75577:"6d8d3f8a",75724:"cdf5e69a",75935:"6f9212ca",76107:"8ff72d15",76183:"f9a2bd6d",77136:"c98541cb",77328:"b138da0e",77395:"2520dc6a",77554:"31fba531",78018:"c65dad47",78143:"7485297d",78230:"bbe4e751",78486:"a6ce80ef",78616:"4a9de205",78618:"eb086189",78675:"90949b94",78746:"afe18f97",78752:"45fa03e5",78778:"8e0ef027",78810:"b9ffa43c",79298:"ef1e218e",79301:"655783e1",79349:"37b91405",79726:"78fc74cf",79784:"2cf9b967",79789:"5b2cc511",79835:"5d4d6409",80372:"0ed563f9",80503:"3adf5d36",80789:"d6917018",80845:"e50b1415",81085:"ab22e79c",81137:"e1ac08ce",81483:"50d4f4d4",81524:"3d30d2f9",81921:"13335aa7",81938:"fd7799b1",82040:"d36bbdf0",82128:"e4520d7d",82165:"ec2c5e1a",82816:"c0c9ba42",82916:"dc431db5",83148:"34e31dab",83303:"e439fe48",83377:"72d4d6fe",83414:"e02df74a",83537:"bdc05ae9",83786:"a860f482",83854:"4904ee11",83860:"75c7b6fb",83943:"391e4904",83962:"36204f23",84102:"feaa5bb1",84635:"4aa3e88f",84667:"f8d3e830",84955:"c360b029",85285:"67256fd8",85664:"c23a2370",85690:"37a9224d",85738:"149f7582",85900:"85a6a496",86024:"89e0a6bf",86216:"13afb3aa",86223:"2831912b",86517:"5253f8ae",86553:"4b20f022",87251:"162f5a01",87259:"d2282453",87273:"f0b0d4ab",87486:"54c1438a",87489:"9af0a7b1",87534:"e40435f6",87664:"bc7ce717",87673:"b781fac3",87819:"3b721182",87858:"3fe96248",88047:"00b8706c",88055:"c879b70f",88067:"3bd76c08",88757:"322bba55",88849:"ee36c726",88856:"e661e7b0",89639:"3f830e86",89652:"ebe590ce",89670:"439e5ea7",89783:"11ba4885",90045:"ac53b79f",90187:"5e0ea21b",90285:"0a664c71",90550:"19972a1a",90847:"d07c60b1",91027:"f3a25e54",91351:"706fea2f",91419:"fb7eb88e",91458:"017e56c8",91616:"0c9be476",91982:"6a799ead",92058:"53183f72",92106:"cce50912",92130:"2612a88c",92332:"b1e812c7",92908:"71d7d119",92909:"9150f007",92924:"755e1498",93174:"b29b8f24",93624:"5223dfaf",93866:"42cb5229",93911:"adda50dd",94008:"af845cd2",94056:"aa206f3b",94075:"8eee3da2",94086:"da24ae47",94169:"3205eeff",94331:"2b4fb5f8",94362:"dfe2f9dc",94368:"6d77cbf5",94958:"1780303f",95109:"9f6cf702",95227:"fada0b48",95248:"7f1affac",95264:"e4e08990",95767:"1079dd8b",95801:"4025e357",95908:"fbb281d1",96099:"3b0fc25b",96265:"09d2e3bd",96490:"ba22f4be",96502:"28f0f17b",96738:"95b4daf0",96918:"115335af",97129:"c7dfbe70",97177:"6cd4a702",97718:"cb0a6af2",97987:"59b0f6f7",98278:"a621ad89",98287:"22a53a95",98317:"57390857",98341:"04d2b0ea",98492:"d08942ec",98524:"720eb3bb",98560:"73998455",98686:"7f024dce",98864:"9c710f38",99241:"bdbba32d",99291:"04ff4fbd",99311:"9e20176a",99654:"ce53ba60",99773:"bebd473c"}[e]+".js",t.miniCssF=e=>{},t.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),t.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),f={},c="serverpod-docs:",t.l=(e,a,d,b)=>{if(f[e])f[e].push(a);else{var r,o;if(void 0!==d)for(var l=document.getElementsByTagName("script"),n=0;n{r.onerror=r.onload=null,clearTimeout(s);var c=f[e];if(delete f[e],r.parentNode&&r.parentNode.removeChild(r),c&&c.forEach((e=>e(d))),a)return a(d)},s=setTimeout(u.bind(null,void 0,{type:"timeout",target:r}),12e4);r.onerror=u.bind(null,r.onerror),r.onload=u.bind(null,r.onload),o&&document.head.appendChild(r)}},t.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.p="/",t.gca=function(e){return e={13798859:"73380",16116660:"17503",17896441:"27918",44145933:"7425",44463284:"22917",49849746:"43357",53998120:"65718",62037464:"96490",68401255:"37927",79840965:"36570",92466816:"56714",96331245:"28548",96523456:"84","2890c80c":"3",da071cb8:"420","4f0519c7":"578","3b66921f":"838",a4adf53f:"1129","6feb7661":"1315","9c9052d1":"1414","3d277f18":"1481","3d1ae229":"1527",ea237062:"1651","44a83f6a":"1681","61ff6850":"1733","3817c387":"1816","2b67eda4":"2154","1577f7ed":"2400","46b54090":"2500","071f33a8":"2631",f7ae65ac:"3905","82ea7079":"3949","24557dbc":"4039","5c6f6ba9":"4081",b5dcbe95:"4086",abd13aa2:"4235",b91fbf2a:"4847",ef2492df:"5038","90ec8c6b":"5255","3fbaac07":"5500","726a6c22":"5515","42abcd4d":"5805",reactPlayerSoundCloud:"6125","32b8fafb":"7115","9d36f238":"7265",cf3c245e:"7450","81e4ed6a":"7492","616bfcf6":"7539",c75d145e:"7677","4951b372":"8251",f584139f:"8456","6f44ab90":"8847",e0bec135:"9120",bc03f89b:"9419","8baf194b":"9533","05ec9480":"9638","986f0f98":"10131",reactPlayerKaltura:"10261","566f49fb":"10281","511f9951":"10399","1d7c691c":"10435","02c0cfe0":"10507","719163ad":"10832",a1154d73:"11103","8552f549":"11372","4a55fe3a":"11629","819b642a":"12068",cdc118a8:"12105",reactPlayerFacebook:"12121","9b4ab8cd":"12394",ae0eacdd:"12500","5f6b1733":"12544","69fcd2fc":"12663","1921e4ca":"12696","2fca5c64":"13033",b7b014bf:"13254","19e323d1":"13721","8615e055":"13990","9e0c2c37":"14013",fc8b5a5d:"14135","1111b27e":"14218",fe522f67:"14442","070c8c93":"14477",af68ae04:"14667",b467d32a:"14669","099a3596":"14807","813cfb2f":"14842",fac0eceb:"14969",ee65edec:"15002",b26210db:"15172","1b218eaa":"15243",ae22b856:"16023",b28bd8b1:"16092",d9107a6a:"16189",dc7352a7:"16383","03b2528f":"16506",d3938b1f:"16665",df1414bb:"16963","954e932f":"16974",c2b45dbb:"17051","8bed5a26":"17311","2e18ba50":"17613","49145cdf":"17670",a7f483d1:"17908",e64edb60:"18044",df15bc7d:"18154",a7bd4aaa:"18518","5390e21f":"18823",b916a1ab:"18924","31b73615":"19231","0d271e1e":"19284",cbf3c4ec:"19667","16b03284":"19784",b1394c86:"20099","45939ed5":"20969",fc6f07d2:"21308",c3373259:"21453",e84b4e80:"21681","7de3e81f":"21826","33c1d41a":"22372",d3af5b3c:"22436",c3094240:"22743",d2aa311d:"23095","2ca08277":"23128",b6f81eaa:"23396","6da448d1":"23770",da54b976:"24101","21e10cde":"24243",daec0d60:"24378",c090764b:"24650","327b0a57":"24665","468d57a9":"24905",e2d6ba1f:"25151","50f2f9f3":"25278","90239e6e":"25482",reactPlayerFilePlayer:"26011",a4c89d62:"26288",eaeab60b:"26378","141135bb":"26845","88a48c42":"27112","39ec0930":"27164",ed772d97:"27236",a271ef09:"27317",e3443ce0:"27427","07006f9e":"27512","5596dd05":"27754","06a408fe":"27773","59df87e8":"27800","169f3d24":"28076","98c94590":"28213",a64b2578:"29073","05fbef88":"29385","5e95c892":"29661",b1218054:"29735",c868bccf:"29766","9037180b":"29781","7d63aba8":"30102","1e1f8072":"30282","307525ba":"30290",b809d820:"30397","85d514f3":"30870","71ba2dc1":"30887","0d76317c":"31017",bd118f84:"31131","2bbc2deb":"31370","87ab7385":"31499","1d39c85d":"31656",e7977816:"32001","441fd5fc":"32795",ff5ed6ba:"32797","5b2d7e3c":"32831","526e379a":"32981",b9ec56c8:"33029",d2f6d210:"33314",aba21aa0:"33629",ebde045d:"34165","999788b8":"34302","087cd58c":"34535","51e50f95":"34571","812775a4":"34945","1a39ee04":"34956","5a96e453":"35154",c0650537:"35321",d58f1ee2:"35478",a81cb65f:"35801","2ed96714":"35844","564db590":"35873",ecaa7076:"36019","82e43b76":"36107",ac9d9d69:"36187","828ace52":"36426",c5313007:"36433","55f37562":"36643","6d717251":"36762",d802bb56:"36777","8dfd8953":"37065",b7ea99f7:"37485","063d75bd":"37566","076cf272":"38041","9644aa4e":"38202","7b06977d":"38247",ac3101e9:"38457",ac5db01d:"38464","2c2832e4":"38658","10ad1fa6":"39055","05fa9a60":"39523",bd568e77:"40669",fca5fdb4:"40697","94b2bc9a":"40770","1323771c":"41251","965931d7":"41306","805a59dc":"41569","897331c0":"41577","8f509517":"42005","0893faed":"42265","6d2a4d3f":"42330",c7507218:"42382","20d56cb7":"42682","17f04a83":"42699","1457ddcd":"42733","3e87058f":"42784","30bd0f5b":"43310","5d707891":"43768","2db5c390":"43983",da698f4c:"44161",f527bef3:"44174",bafd283f:"44384","7800d508":"44622","22dd74f7":"44980","21b7a589":"45183","3f04b2f3":"45399",cb867d98:"46055","0c6fe626":"46148","65c67349":"46536","53e9dd7a":"46740",c7156cf2:"46863",c377a04b:"46971","82444e58":"47001","9270ba4f":"47190","65b7208a":"47365",reactPlayerDailyMotion:"47596",db7d4591:"47980","4934de22":"48172",cd64d641:"48357","38e32826":"48378","9c5d9512":"48439","056b386b":"48571","2d4af3bf":"48609",d636c09f:"48818","27e827f8":"48891","640696ee":"49048",f3467f26:"49627",caf7731d:"49654",c2237e68:"49787","4118187a":"50137",b685e31b:"50239",f28f059c:"50334","358c2507":"50428","1a84c7fd":"50860","17dc776d":"51086",dc4059b2:"51162",f6f476f1:"51427",da19ecb4:"51485","71319bec":"51490","4519f039":"51582","801276a1":"51898",fe76eed8:"52428",reactPlayerStreamable:"52546","710ac1c1":"53012",dc8c27bd:"53238",ef4456b5:"53283","068743c8":"53457","0841186f":"53602","7a3d47b3":"53695","19a6be06":"53718","0c695afe":"53866",cce58fe7:"53978","5144cf5e":"54037","94f11012":"54708","378935ce":"54801","51c7df8c":"54857",a6c3ea4a:"54942",a6397568:"55080","89b55a09":"55239","18910d94":"55261","9e09f891":"55367","2e1ee4ed":"55688",f5fed352:"55730","5c1eff22":"55969","4aec9039":"56031","45926b62":"56297","0a5c01b2":"56401",e4eafb12:"56495","3f80bb14":"56640",ac002d2b:"56847","08aab21d":"56864","4ed1e0ac":"56983",fd4b36bb:"57123",bdc5a52e:"57139","9a594c98":"57262","5af30237":"57932",b8787c81:"57955",ac6e050c:"58413","49fed513":"58807","0f4a5c74":"59006","308471de":"59168","2e3fc0f9":"59215","3874f1bf":"59450",f149b10e:"59570",a7edc2bd:"59705","57012fa6":"59876","2020ed93":"59953",c10a0985:"60114",af1c5d2b:"60161",c134ef8a:"60896","5a0a1617":"61101",a2757506:"61385","5143312c":"61400","419cd6b8":"61834","3aa0ab0a":"61876","7570de64":"62151",f5a589e7:"62276",b48f41b9:"62418","869ae8a7":"62475",ad61550a:"62890",fb72d7b2:"63552",b0f19176:"63889","2db99065":"63954",ce86e3e6:"64033",reactPlayerMux:"64258","9fbfaf6d":"64325",reactPlayerYouTube:"64439",ebd05845:"64652","52f87500":"64786","9107c65f":"65069",fc8c8cde:"65337","06393fc1":"65413","26398b18":"65532","280af06a":"65597","79d28454":"65630","07e708e9":"66527","5bc657fa":"66719","926056c1":"67139","1caa8cdb":"67291","91aed80e":"67513","8186ecf9":"67645","83c6f999":"67673",eac16e1d:"68349",reactPlayerVidyard:"68888",d38e3f9f:"68993",dd31e7e9:"69241",f9bde383:"69297","8ee9837e":"69434","036b5431":"69569","36fcb744":"69624","3edac44d":"69929","62de5d73":"69983","313c9eb1":"70058",da202fdd:"70537",fc67ad3d:"70594","51ddac88":"70967","6e29a506":"71332",dec2bd4a:"71444",e66f2658:"71567","4ead9a95":"71606",ce4dbf6d:"71843",c8139b75:"72181",dbf9e27d:"72281","95ec96e5":"72423","676f1bdb":"72768","4e689a0b":"73057",d8d6d57b:"73109","08d55cf7":"73348","227d1fc4":"73525",reactPlayerVimeo:"73743","4ab30eec":"73929","272aa200":"74055","356ce494":"74515",a32c313f:"74641","444a6d4e":"74801","3cc71396":"75217","5839343c":"75293","1312139a":"75577","704545ab":"75724","03b3cfd2":"75935","9f1829f0":"76107",adce8179:"76183","098f2604":"77136","4c5c4c2e":"77328","7af31c45":"77395","98d962c5":"77554","0d7acd84":"78018","0773e78b":"78143",fe2e2e26:"78230",a0aa5253:"78486",bf519c8d:"78616","00d14154":"78618","28967b3e":"78675","8af032d3":"78746",d44e0d1c:"78752","5e7d099e":"78778","7ac69e68":"78810","6aee17c2":"79298",d0b9ca74:"79301","46eeb6cb":"79349","10ea0b82":"79726","8093477b":"79784","0f2c2e36":"79789","4ac2e930":"79835","2d11a680":"80372","8d02075b":"80503","510b9307":"80789",eecc43ff:"80845","8eead450":"81085",bc69c5bc:"81137","9f8e6d57":"81483",cc180519:"81524","1877d9d5":"81921",afb7a97b:"81938","54cab4d4":"82040","4aa94ec1":"82128","956829f8":"82165","6fbf0c67":"82816","3c4af576":"82916","4048090e":"83148","7b33c27b":"83303","7f0714d1":"83377",ec91ff36:"83414",c342bcae:"83537","4867e743":"83786","21a4ba71":"83854",e58556b2:"83860","50a12feb":"83943",af754a1f:"83962","98f4e1ec":"84102","39dec3ba":"84635",reactPlayerMixcloud:"84667","646cbece":"84955","45dd886d":"85285","504d78e0":"85664",aeef55f7:"85690",efe5610c:"85738","616631fd":"85900",fe170cc9:"86024",reactPlayerTwitch:"86216",bd6f2233:"86223","78ae7ec8":"86517","4bfca71d":"86553",b32c213b:"87251","2115313f":"87259",cdd4a9c6:"87273","67e77328":"87486","3e4a4cb2":"87489","42a9b3c5":"87534",reactPlayerPreview:"87664","638e38ae":"87673","3141060a":"87819","7ca2e59a":"87858","3d150a24":"88047",reactPlayerWistia:"88055","7517a61c":"88067","73ca4188":"88757","5e253f2f":"88849",afde3230:"88856","4c781063":"89639",bb9c591b:"89652","86a8bb6c":"89670","4b6eee9a":"89783","984d6493":"90045",a2a1c245:"90187","3cf6fa35":"90285","6ba85e75":"90550","1b6591f7":"90847",f6adf820:"91027","7c8e5227":"91351","9d779d8b":"91419",e3d58533:"91458","25c6d77a":"91616",ecb3c634:"91982","93dcedec":"92058","4fa4eafa":"92106",dcbfe205:"92130",f6affd6e:"92332","6f56eca8":"92908","0eebd274":"92909","95a5d2b2":"92924","4a49065b":"93174",a6311318:"93624",d9e7b984:"93866","5cde491b":"93911","431ffdb5":"94008","27b43779":"94056",aefdd881:"94075","1ebbfca8":"94086",e4a796aa:"94169","8e7261c9":"94331","65e04ea3":"94362",a94703ab:"94368","9d217e1f":"94958","3c9432f0":"95109","522ca66b":"95227","83ac10ed":"95248",e7ee6027:"95264","2d16d24d":"95767",f29fc884:"95801","22f51758":"95908",e8f4756d:"96099","3fe65583":"96265","95bf5f56":"96502","5112ebe3":"96738",b2419a00:"96918","23975af2":"97129","76259cc3":"97177",ed64c12e:"97718","8abbb0ee":"97987",fe3f3783:"98278",d4fc3158:"98287",d26a73b8:"98317",bd1cffff:"98341",eb4c176e:"98492","9d7352c0":"98524","6a734661":"98560","02e41de2":"98686","4eee9c87":"98864","092bf57d":"99241",f8189ec4:"99291",db42f242:"99311","5589c54d":"99654","12407b36":"99773"}[e]||e,t.p+t.u(e)},(()=>{var e={51303:0,40532:0};t.f.j=(a,d)=>{var f=t.o(e,a)?e[a]:void 0;if(0!==f)if(f)d.push(f[2]);else if(/^(40532|51303)$/.test(a))e[a]=0;else{var c=new Promise(((d,c)=>f=e[a]=[d,c]));d.push(f[2]=c);var b=t.p+t.u(a),r=new Error;t.l(b,(d=>{if(t.o(e,a)&&(0!==(f=e[a])&&(e[a]=void 0),f)){var c=d&&("load"===d.type?"missing":d.type),b=d&&d.target&&d.target.src;r.message="Loading chunk "+a+" failed.\n("+c+": "+b+")",r.name="ChunkLoadError",r.type=c,r.request=b,f[1](r)}}),"chunk-"+a,a)}},t.O.j=a=>0===e[a];var a=(a,d)=>{var f,c,b=d[0],r=d[1],o=d[2],l=0;if(b.some((a=>0!==e[a]))){for(f in r)t.o(r,f)&&(t.m[f]=r[f]);if(o)var n=o(t)}for(a&&a(d);l Capabilities | Serverpod - + diff --git a/docs/concepts/authentication/basics.html b/docs/concepts/authentication/basics.html index 5197e33eb..393002390 100644 --- a/docs/concepts/authentication/basics.html +++ b/docs/concepts/authentication/basics.html @@ -4,7 +4,7 @@ The basics | Serverpod - + diff --git a/docs/concepts/authentication/custom-overrides.html b/docs/concepts/authentication/custom-overrides.html index d4e2738de..888ef02ab 100644 --- a/docs/concepts/authentication/custom-overrides.html +++ b/docs/concepts/authentication/custom-overrides.html @@ -4,7 +4,7 @@ Custom overrides | Serverpod - + diff --git a/docs/concepts/authentication/providers/apple.html b/docs/concepts/authentication/providers/apple.html index a66075e60..0518bc383 100644 --- a/docs/concepts/authentication/providers/apple.html +++ b/docs/concepts/authentication/providers/apple.html @@ -4,7 +4,7 @@ Apple | Serverpod - + diff --git a/docs/concepts/authentication/providers/custom-providers.html b/docs/concepts/authentication/providers/custom-providers.html index 92deddf67..35675acf7 100644 --- a/docs/concepts/authentication/providers/custom-providers.html +++ b/docs/concepts/authentication/providers/custom-providers.html @@ -4,7 +4,7 @@ Custom providers | Serverpod - + diff --git a/docs/concepts/authentication/providers/email.html b/docs/concepts/authentication/providers/email.html index 706d4045b..327ace7ea 100644 --- a/docs/concepts/authentication/providers/email.html +++ b/docs/concepts/authentication/providers/email.html @@ -4,7 +4,7 @@ Email | Serverpod - + diff --git a/docs/concepts/authentication/providers/firebase.html b/docs/concepts/authentication/providers/firebase.html index 51c68ced7..1e605b0c4 100644 --- a/docs/concepts/authentication/providers/firebase.html +++ b/docs/concepts/authentication/providers/firebase.html @@ -4,7 +4,7 @@ Firebase | Serverpod - + diff --git a/docs/concepts/authentication/providers/google.html b/docs/concepts/authentication/providers/google.html index 458f02ad2..350e62f2e 100644 --- a/docs/concepts/authentication/providers/google.html +++ b/docs/concepts/authentication/providers/google.html @@ -4,7 +4,7 @@ Google | Serverpod - + diff --git a/docs/concepts/authentication/setup.html b/docs/concepts/authentication/setup.html index f2c85f884..24e1506e6 100644 --- a/docs/concepts/authentication/setup.html +++ b/docs/concepts/authentication/setup.html @@ -4,7 +4,7 @@ Setup | Serverpod - + diff --git a/docs/concepts/authentication/working-with-users.html b/docs/concepts/authentication/working-with-users.html index df88bf8ac..bf106c29b 100644 --- a/docs/concepts/authentication/working-with-users.html +++ b/docs/concepts/authentication/working-with-users.html @@ -4,7 +4,7 @@ Working with users | Serverpod - + diff --git a/docs/concepts/backward-compatibility.html b/docs/concepts/backward-compatibility.html index 355111d25..d3452a2e5 100644 --- a/docs/concepts/backward-compatibility.html +++ b/docs/concepts/backward-compatibility.html @@ -4,7 +4,7 @@ Backward compatibility | Serverpod - + diff --git a/docs/concepts/caching.html b/docs/concepts/caching.html index 24fba3e61..de461c611 100644 --- a/docs/concepts/caching.html +++ b/docs/concepts/caching.html @@ -4,7 +4,7 @@ Caching | Serverpod - + diff --git a/docs/concepts/configuration.html b/docs/concepts/configuration.html index dbe582ded..c5a1ad52d 100644 --- a/docs/concepts/configuration.html +++ b/docs/concepts/configuration.html @@ -4,7 +4,7 @@ Configurations | Serverpod - + diff --git a/docs/concepts/database/connection.html b/docs/concepts/database/connection.html index b9a505a24..99a352019 100644 --- a/docs/concepts/database/connection.html +++ b/docs/concepts/database/connection.html @@ -4,7 +4,7 @@ Connection | Serverpod - + diff --git a/docs/concepts/database/crud.html b/docs/concepts/database/crud.html index 030e9cef4..6aa74edae 100644 --- a/docs/concepts/database/crud.html +++ b/docs/concepts/database/crud.html @@ -4,7 +4,7 @@ CRUD | Serverpod - + diff --git a/docs/concepts/database/filter.html b/docs/concepts/database/filter.html index fc36b276d..b307cc31e 100644 --- a/docs/concepts/database/filter.html +++ b/docs/concepts/database/filter.html @@ -4,7 +4,7 @@ Filter | Serverpod - + diff --git a/docs/concepts/database/indexing.html b/docs/concepts/database/indexing.html index beb581b4d..cad3f8211 100644 --- a/docs/concepts/database/indexing.html +++ b/docs/concepts/database/indexing.html @@ -4,7 +4,7 @@ Indexing | Serverpod - + diff --git a/docs/concepts/database/migrations.html b/docs/concepts/database/migrations.html index 7ef98aec9..6e34ea21e 100644 --- a/docs/concepts/database/migrations.html +++ b/docs/concepts/database/migrations.html @@ -4,7 +4,7 @@ Migrations | Serverpod - + diff --git a/docs/concepts/database/models.html b/docs/concepts/database/models.html index 4a0422ed6..9caedfbf5 100644 --- a/docs/concepts/database/models.html +++ b/docs/concepts/database/models.html @@ -4,7 +4,7 @@ Models | Serverpod - + diff --git a/docs/concepts/database/pagination.html b/docs/concepts/database/pagination.html index 06412a543..39297045a 100644 --- a/docs/concepts/database/pagination.html +++ b/docs/concepts/database/pagination.html @@ -4,7 +4,7 @@ Pagination | Serverpod - + diff --git a/docs/concepts/database/raw-access.html b/docs/concepts/database/raw-access.html index 69c6ac29f..3b53da8a4 100644 --- a/docs/concepts/database/raw-access.html +++ b/docs/concepts/database/raw-access.html @@ -4,7 +4,7 @@ Raw Access | Serverpod - + diff --git a/docs/concepts/database/relation-queries.html b/docs/concepts/database/relation-queries.html index e4ec35a3f..d2fd737bb 100644 --- a/docs/concepts/database/relation-queries.html +++ b/docs/concepts/database/relation-queries.html @@ -4,7 +4,7 @@ Relation queries | Serverpod - + diff --git a/docs/concepts/database/relations/many-to-many.html b/docs/concepts/database/relations/many-to-many.html index 7cd264bb7..d4dab9956 100644 --- a/docs/concepts/database/relations/many-to-many.html +++ b/docs/concepts/database/relations/many-to-many.html @@ -4,7 +4,7 @@ Many-to-Many | Serverpod - + diff --git a/docs/concepts/database/relations/modules.html b/docs/concepts/database/relations/modules.html index 691bb7307..7b36270ad 100644 --- a/docs/concepts/database/relations/modules.html +++ b/docs/concepts/database/relations/modules.html @@ -4,7 +4,7 @@ Relations with modules | Serverpod - + diff --git a/docs/concepts/database/relations/one-to-many.html b/docs/concepts/database/relations/one-to-many.html index 094b5ee4e..236d7ea3c 100644 --- a/docs/concepts/database/relations/one-to-many.html +++ b/docs/concepts/database/relations/one-to-many.html @@ -4,7 +4,7 @@ One-to-many | Serverpod - + diff --git a/docs/concepts/database/relations/one-to-one.html b/docs/concepts/database/relations/one-to-one.html index a65436061..de08cc58e 100644 --- a/docs/concepts/database/relations/one-to-one.html +++ b/docs/concepts/database/relations/one-to-one.html @@ -4,7 +4,7 @@ One-to-one | Serverpod - + diff --git a/docs/concepts/database/relations/referential-actions.html b/docs/concepts/database/relations/referential-actions.html index 7145e7fd0..3293d3269 100644 --- a/docs/concepts/database/relations/referential-actions.html +++ b/docs/concepts/database/relations/referential-actions.html @@ -4,7 +4,7 @@ Referential actions | Serverpod - + diff --git a/docs/concepts/database/relations/self-relations.html b/docs/concepts/database/relations/self-relations.html index 0b72b77b4..3c09e5328 100644 --- a/docs/concepts/database/relations/self-relations.html +++ b/docs/concepts/database/relations/self-relations.html @@ -4,7 +4,7 @@ Self-relations | Serverpod - + diff --git a/docs/concepts/database/sort.html b/docs/concepts/database/sort.html index e674edb53..5b2083db6 100644 --- a/docs/concepts/database/sort.html +++ b/docs/concepts/database/sort.html @@ -4,7 +4,7 @@ Sort | Serverpod - + diff --git a/docs/concepts/database/transactions.html b/docs/concepts/database/transactions.html index 52660d360..7025f7433 100644 --- a/docs/concepts/database/transactions.html +++ b/docs/concepts/database/transactions.html @@ -4,7 +4,7 @@ Transactions | Serverpod - + diff --git a/docs/concepts/exceptions.html b/docs/concepts/exceptions.html index a324e2b0f..8c1f6a632 100644 --- a/docs/concepts/exceptions.html +++ b/docs/concepts/exceptions.html @@ -4,7 +4,7 @@ Error handling and exceptions | Serverpod - + diff --git a/docs/concepts/file-uploads.html b/docs/concepts/file-uploads.html index 29e945dd4..254f709d2 100644 --- a/docs/concepts/file-uploads.html +++ b/docs/concepts/file-uploads.html @@ -4,7 +4,7 @@ Uploading files | Serverpod - + diff --git a/docs/concepts/health-checks.html b/docs/concepts/health-checks.html index a6e06ceaa..f242d2bb9 100644 --- a/docs/concepts/health-checks.html +++ b/docs/concepts/health-checks.html @@ -4,7 +4,7 @@ Health checks | Serverpod - + diff --git a/docs/concepts/logging.html b/docs/concepts/logging.html index 65ed47028..60ba5ca80 100644 --- a/docs/concepts/logging.html +++ b/docs/concepts/logging.html @@ -4,7 +4,7 @@ Logging | Serverpod - + diff --git a/docs/concepts/models.html b/docs/concepts/models.html index 6b075174d..cfd5bdda3 100644 --- a/docs/concepts/models.html +++ b/docs/concepts/models.html @@ -4,7 +4,7 @@ Working with models | Serverpod - + diff --git a/docs/concepts/modules.html b/docs/concepts/modules.html index 9d84c1636..cd503f3c9 100644 --- a/docs/concepts/modules.html +++ b/docs/concepts/modules.html @@ -4,7 +4,7 @@ Modules | Serverpod - + diff --git a/docs/concepts/scheduling.html b/docs/concepts/scheduling.html index 8952cce6d..e830e182d 100644 --- a/docs/concepts/scheduling.html +++ b/docs/concepts/scheduling.html @@ -4,7 +4,7 @@ Scheduling | Serverpod - + diff --git a/docs/concepts/serialization.html b/docs/concepts/serialization.html index 66fe4e4ad..40e1d3a06 100644 --- a/docs/concepts/serialization.html +++ b/docs/concepts/serialization.html @@ -4,7 +4,7 @@ Custom serialization | Serverpod - + diff --git a/docs/concepts/sessions.html b/docs/concepts/sessions.html index 71db5c475..5a3773331 100644 --- a/docs/concepts/sessions.html +++ b/docs/concepts/sessions.html @@ -4,7 +4,7 @@ Sessions | Serverpod - + diff --git a/docs/concepts/streams.html b/docs/concepts/streams.html index 2ff35cb2e..6416684b7 100644 --- a/docs/concepts/streams.html +++ b/docs/concepts/streams.html @@ -4,7 +4,7 @@ Streams and messaging | Serverpod - + diff --git a/docs/concepts/webserver.html b/docs/concepts/webserver.html index 5b4b5f883..d596ad40f 100644 --- a/docs/concepts/webserver.html +++ b/docs/concepts/webserver.html @@ -4,7 +4,7 @@ Web server | Serverpod - + diff --git a/docs/concepts/working-with-endpoints.html b/docs/concepts/working-with-endpoints.html index 3b2c729cf..d96912904 100644 --- a/docs/concepts/working-with-endpoints.html +++ b/docs/concepts/working-with-endpoints.html @@ -4,7 +4,7 @@ Working with endpoints | Serverpod - + diff --git a/docs/contribute.html b/docs/contribute.html index 6ce6e104b..56f636e9a 100644 --- a/docs/contribute.html +++ b/docs/contribute.html @@ -4,7 +4,7 @@ Roadmap & contributions | Serverpod - + diff --git a/docs/deployments/deploying-to-aws.html b/docs/deployments/deploying-to-aws.html index f46c00924..b12484030 100644 --- a/docs/deployments/deploying-to-aws.html +++ b/docs/deployments/deploying-to-aws.html @@ -4,7 +4,7 @@ AWS EC2 with Terraform | Serverpod - + diff --git a/docs/deployments/deploying-to-gce-terraform.html b/docs/deployments/deploying-to-gce-terraform.html index 1aec96d99..f62466a97 100644 --- a/docs/deployments/deploying-to-gce-terraform.html +++ b/docs/deployments/deploying-to-gce-terraform.html @@ -4,7 +4,7 @@ Google Cloud Engine with Terraform | Serverpod - + diff --git a/docs/deployments/deploying-to-gcr-console.html b/docs/deployments/deploying-to-gcr-console.html index 6df14192e..e772c4439 100644 --- a/docs/deployments/deploying-to-gcr-console.html +++ b/docs/deployments/deploying-to-gcr-console.html @@ -4,7 +4,7 @@ Google Cloud Run with CGP Console | Serverpod - + diff --git a/docs/deployments/deployment-strategy.html b/docs/deployments/deployment-strategy.html index 9c61e388d..7348dc010 100644 --- a/docs/deployments/deployment-strategy.html +++ b/docs/deployments/deployment-strategy.html @@ -4,7 +4,7 @@ Choosing deployment strategy | Serverpod - + diff --git a/docs/deployments/general.html b/docs/deployments/general.html index b5e566bf0..127d2b489 100644 --- a/docs/deployments/general.html +++ b/docs/deployments/general.html @@ -4,7 +4,7 @@ Hosting elsewhere | Serverpod - + diff --git a/docs/get-started-with-mini.html b/docs/get-started-with-mini.html index f7440c581..fac42fcbc 100644 --- a/docs/get-started-with-mini.html +++ b/docs/get-started-with-mini.html @@ -4,12 +4,14 @@ Get started with Mini | Serverpod - +
Version: 2.1.0

Get started with Mini

Serverpod Mini is a slimmer version of Serverpod that does not need to be connected to a Postgres database. Before you begin, make sure that you have Flutter and Serverpod installed.

+
+

Create a new project

Create a mini project by running:

$ serverpod create myminipod --mini

Serverpod will create a new project for you. It contains three Dart packages, but you only need to pay attention to the myminipod_server and myminipod_flutter directories. The server directory contains your server files, and the flutter directory contains your app. The third package (myminipod_client) contains generated code that is used by the Flutter app to communicate with the server.

@@ -42,6 +44,6 @@

var company = Company(
name: 'Serverpod',
foundedDate: DateTime(2021, 9, 27),
employees: [
'Alex',
'Isak',
'Viktor',
],
);

var result = await client.company.isLegit(company);

Conclusion

-

You are now ready to start exploring the exciting world of Serverpod! And even if you start out with Serverpod mini, you can always upgrade to the full version later.

+

You are now ready to start exploring the exciting world of Serverpod! And even if you start out with Serverpod mini, you can always upgrade to the full version later.

\ No newline at end of file diff --git a/docs/get-started.html b/docs/get-started.html index a8a243a01..54f0c043c 100644 --- a/docs/get-started.html +++ b/docs/get-started.html @@ -4,7 +4,7 @@ Get started | Serverpod - + diff --git a/docs/index.html b/docs/index.html index 7fb63ad07..526b6412b 100644 --- a/docs/index.html +++ b/docs/index.html @@ -4,7 +4,7 @@ Installing Serverpod | Serverpod - + diff --git a/docs/next.html b/docs/next.html index 3373b6282..1cea3819e 100644 --- a/docs/next.html +++ b/docs/next.html @@ -4,7 +4,7 @@ Installing Serverpod | Serverpod - + diff --git a/docs/next/capabilities.html b/docs/next/capabilities.html index d8aac1ca7..4b097122f 100644 --- a/docs/next/capabilities.html +++ b/docs/next/capabilities.html @@ -4,7 +4,7 @@ Capabilities | Serverpod - + diff --git a/docs/next/concepts/authentication/basics.html b/docs/next/concepts/authentication/basics.html index d8be3e117..b05923b3c 100644 --- a/docs/next/concepts/authentication/basics.html +++ b/docs/next/concepts/authentication/basics.html @@ -4,7 +4,7 @@ The basics | Serverpod - + diff --git a/docs/next/concepts/authentication/custom-overrides.html b/docs/next/concepts/authentication/custom-overrides.html index 013556335..8899d2cd6 100644 --- a/docs/next/concepts/authentication/custom-overrides.html +++ b/docs/next/concepts/authentication/custom-overrides.html @@ -4,7 +4,7 @@ Custom overrides | Serverpod - + diff --git a/docs/next/concepts/authentication/providers/apple.html b/docs/next/concepts/authentication/providers/apple.html index b44ac4687..c8fc0d2c7 100644 --- a/docs/next/concepts/authentication/providers/apple.html +++ b/docs/next/concepts/authentication/providers/apple.html @@ -4,7 +4,7 @@ Apple | Serverpod - + diff --git a/docs/next/concepts/authentication/providers/custom-providers.html b/docs/next/concepts/authentication/providers/custom-providers.html index 50792a31f..1e624c684 100644 --- a/docs/next/concepts/authentication/providers/custom-providers.html +++ b/docs/next/concepts/authentication/providers/custom-providers.html @@ -4,7 +4,7 @@ Custom providers | Serverpod - + diff --git a/docs/next/concepts/authentication/providers/email.html b/docs/next/concepts/authentication/providers/email.html index 604b8e830..307a4f18d 100644 --- a/docs/next/concepts/authentication/providers/email.html +++ b/docs/next/concepts/authentication/providers/email.html @@ -4,7 +4,7 @@ Email | Serverpod - + diff --git a/docs/next/concepts/authentication/providers/firebase.html b/docs/next/concepts/authentication/providers/firebase.html index c968d655f..d2ec66e8f 100644 --- a/docs/next/concepts/authentication/providers/firebase.html +++ b/docs/next/concepts/authentication/providers/firebase.html @@ -4,7 +4,7 @@ Firebase | Serverpod - + diff --git a/docs/next/concepts/authentication/providers/google.html b/docs/next/concepts/authentication/providers/google.html index 7bbec8559..54607ef94 100644 --- a/docs/next/concepts/authentication/providers/google.html +++ b/docs/next/concepts/authentication/providers/google.html @@ -4,7 +4,7 @@ Google | Serverpod - + diff --git a/docs/next/concepts/authentication/setup.html b/docs/next/concepts/authentication/setup.html index 13771119d..671efae06 100644 --- a/docs/next/concepts/authentication/setup.html +++ b/docs/next/concepts/authentication/setup.html @@ -4,7 +4,7 @@ Setup | Serverpod - + diff --git a/docs/next/concepts/authentication/working-with-users.html b/docs/next/concepts/authentication/working-with-users.html index 22ad0ca80..63d32becd 100644 --- a/docs/next/concepts/authentication/working-with-users.html +++ b/docs/next/concepts/authentication/working-with-users.html @@ -4,7 +4,7 @@ Working with users | Serverpod - + diff --git a/docs/next/concepts/backward-compatibility.html b/docs/next/concepts/backward-compatibility.html index 7dcca424f..de3a83e19 100644 --- a/docs/next/concepts/backward-compatibility.html +++ b/docs/next/concepts/backward-compatibility.html @@ -4,7 +4,7 @@ Backward compatibility | Serverpod - + diff --git a/docs/next/concepts/caching.html b/docs/next/concepts/caching.html index 19e0194c7..5b4c8b0d8 100644 --- a/docs/next/concepts/caching.html +++ b/docs/next/concepts/caching.html @@ -4,7 +4,7 @@ Caching | Serverpod - + diff --git a/docs/next/concepts/configuration.html b/docs/next/concepts/configuration.html index cdc32ce27..c8a14517d 100644 --- a/docs/next/concepts/configuration.html +++ b/docs/next/concepts/configuration.html @@ -4,7 +4,7 @@ Configurations | Serverpod - + diff --git a/docs/next/concepts/database/connection.html b/docs/next/concepts/database/connection.html index 999e277f1..7417993a6 100644 --- a/docs/next/concepts/database/connection.html +++ b/docs/next/concepts/database/connection.html @@ -4,7 +4,7 @@ Connection | Serverpod - + diff --git a/docs/next/concepts/database/crud.html b/docs/next/concepts/database/crud.html index 766ed7c27..542a6f0f9 100644 --- a/docs/next/concepts/database/crud.html +++ b/docs/next/concepts/database/crud.html @@ -4,7 +4,7 @@ CRUD | Serverpod - + diff --git a/docs/next/concepts/database/filter.html b/docs/next/concepts/database/filter.html index 5aa642d6b..4bec5b7a0 100644 --- a/docs/next/concepts/database/filter.html +++ b/docs/next/concepts/database/filter.html @@ -4,7 +4,7 @@ Filter | Serverpod - + diff --git a/docs/next/concepts/database/indexing.html b/docs/next/concepts/database/indexing.html index 8c3facc2d..44a7eaf57 100644 --- a/docs/next/concepts/database/indexing.html +++ b/docs/next/concepts/database/indexing.html @@ -4,7 +4,7 @@ Indexing | Serverpod - + diff --git a/docs/next/concepts/database/migrations.html b/docs/next/concepts/database/migrations.html index 5113b79ca..6db777f03 100644 --- a/docs/next/concepts/database/migrations.html +++ b/docs/next/concepts/database/migrations.html @@ -4,7 +4,7 @@ Migrations | Serverpod - + diff --git a/docs/next/concepts/database/models.html b/docs/next/concepts/database/models.html index 4bd83f360..9ec9bd0be 100644 --- a/docs/next/concepts/database/models.html +++ b/docs/next/concepts/database/models.html @@ -4,7 +4,7 @@ Models | Serverpod - + diff --git a/docs/next/concepts/database/pagination.html b/docs/next/concepts/database/pagination.html index 86328241b..1d5acd697 100644 --- a/docs/next/concepts/database/pagination.html +++ b/docs/next/concepts/database/pagination.html @@ -4,7 +4,7 @@ Pagination | Serverpod - + diff --git a/docs/next/concepts/database/raw-access.html b/docs/next/concepts/database/raw-access.html index d991d7888..ab784f633 100644 --- a/docs/next/concepts/database/raw-access.html +++ b/docs/next/concepts/database/raw-access.html @@ -4,7 +4,7 @@ Raw Access | Serverpod - + diff --git a/docs/next/concepts/database/relation-queries.html b/docs/next/concepts/database/relation-queries.html index 948cc4ef9..e6bb35b74 100644 --- a/docs/next/concepts/database/relation-queries.html +++ b/docs/next/concepts/database/relation-queries.html @@ -4,7 +4,7 @@ Relation queries | Serverpod - + diff --git a/docs/next/concepts/database/relations/many-to-many.html b/docs/next/concepts/database/relations/many-to-many.html index b4c72d60b..a4ecfd338 100644 --- a/docs/next/concepts/database/relations/many-to-many.html +++ b/docs/next/concepts/database/relations/many-to-many.html @@ -4,7 +4,7 @@ Many-to-Many | Serverpod - + diff --git a/docs/next/concepts/database/relations/modules.html b/docs/next/concepts/database/relations/modules.html index 8ae136262..bd820560f 100644 --- a/docs/next/concepts/database/relations/modules.html +++ b/docs/next/concepts/database/relations/modules.html @@ -4,7 +4,7 @@ Relations with modules | Serverpod - + diff --git a/docs/next/concepts/database/relations/one-to-many.html b/docs/next/concepts/database/relations/one-to-many.html index fc56fe984..292b77fb8 100644 --- a/docs/next/concepts/database/relations/one-to-many.html +++ b/docs/next/concepts/database/relations/one-to-many.html @@ -4,7 +4,7 @@ One-to-many | Serverpod - + diff --git a/docs/next/concepts/database/relations/one-to-one.html b/docs/next/concepts/database/relations/one-to-one.html index d5c2d46a3..ab726ba2e 100644 --- a/docs/next/concepts/database/relations/one-to-one.html +++ b/docs/next/concepts/database/relations/one-to-one.html @@ -4,7 +4,7 @@ One-to-one | Serverpod - + diff --git a/docs/next/concepts/database/relations/referential-actions.html b/docs/next/concepts/database/relations/referential-actions.html index 16c21268f..e8acf8d6b 100644 --- a/docs/next/concepts/database/relations/referential-actions.html +++ b/docs/next/concepts/database/relations/referential-actions.html @@ -4,7 +4,7 @@ Referential actions | Serverpod - + diff --git a/docs/next/concepts/database/relations/self-relations.html b/docs/next/concepts/database/relations/self-relations.html index 060f7a9aa..9959f3f03 100644 --- a/docs/next/concepts/database/relations/self-relations.html +++ b/docs/next/concepts/database/relations/self-relations.html @@ -4,7 +4,7 @@ Self-relations | Serverpod - + diff --git a/docs/next/concepts/database/sort.html b/docs/next/concepts/database/sort.html index 9da3d8470..81c475ec9 100644 --- a/docs/next/concepts/database/sort.html +++ b/docs/next/concepts/database/sort.html @@ -4,7 +4,7 @@ Sort | Serverpod - + diff --git a/docs/next/concepts/database/transactions.html b/docs/next/concepts/database/transactions.html index 93d244222..7f427ef65 100644 --- a/docs/next/concepts/database/transactions.html +++ b/docs/next/concepts/database/transactions.html @@ -4,7 +4,7 @@ Transactions | Serverpod - + diff --git a/docs/next/concepts/exceptions.html b/docs/next/concepts/exceptions.html index 241d2bab2..ec98c36f7 100644 --- a/docs/next/concepts/exceptions.html +++ b/docs/next/concepts/exceptions.html @@ -4,7 +4,7 @@ Error handling and exceptions | Serverpod - + diff --git a/docs/next/concepts/file-uploads.html b/docs/next/concepts/file-uploads.html index 505688a0e..a496129f1 100644 --- a/docs/next/concepts/file-uploads.html +++ b/docs/next/concepts/file-uploads.html @@ -4,7 +4,7 @@ Uploading files | Serverpod - + diff --git a/docs/next/concepts/health-checks.html b/docs/next/concepts/health-checks.html index 008ad8921..2d9694cf3 100644 --- a/docs/next/concepts/health-checks.html +++ b/docs/next/concepts/health-checks.html @@ -4,7 +4,7 @@ Health checks | Serverpod - + diff --git a/docs/next/concepts/logging.html b/docs/next/concepts/logging.html index 58c1ddd9a..f91ba9db5 100644 --- a/docs/next/concepts/logging.html +++ b/docs/next/concepts/logging.html @@ -4,7 +4,7 @@ Logging | Serverpod - + diff --git a/docs/next/concepts/models.html b/docs/next/concepts/models.html index c28cc0ef1..46f10e2c5 100644 --- a/docs/next/concepts/models.html +++ b/docs/next/concepts/models.html @@ -4,7 +4,7 @@ Working with models | Serverpod - + diff --git a/docs/next/concepts/modules.html b/docs/next/concepts/modules.html index ba3725f69..7db30828e 100644 --- a/docs/next/concepts/modules.html +++ b/docs/next/concepts/modules.html @@ -4,7 +4,7 @@ Modules | Serverpod - + diff --git a/docs/next/concepts/scheduling.html b/docs/next/concepts/scheduling.html index 1c49dbd50..2fe73729e 100644 --- a/docs/next/concepts/scheduling.html +++ b/docs/next/concepts/scheduling.html @@ -4,7 +4,7 @@ Scheduling | Serverpod - + diff --git a/docs/next/concepts/serialization.html b/docs/next/concepts/serialization.html index 07cc1e31d..5ce5dff6d 100644 --- a/docs/next/concepts/serialization.html +++ b/docs/next/concepts/serialization.html @@ -4,7 +4,7 @@ Custom serialization | Serverpod - + diff --git a/docs/next/concepts/sessions.html b/docs/next/concepts/sessions.html index a9d817f99..64b58c3de 100644 --- a/docs/next/concepts/sessions.html +++ b/docs/next/concepts/sessions.html @@ -4,7 +4,7 @@ Sessions | Serverpod - + diff --git a/docs/next/concepts/streams.html b/docs/next/concepts/streams.html index 10597d022..5ecc7210d 100644 --- a/docs/next/concepts/streams.html +++ b/docs/next/concepts/streams.html @@ -4,7 +4,7 @@ Streams and messaging | Serverpod - + diff --git a/docs/next/concepts/webserver.html b/docs/next/concepts/webserver.html index 8bf3a2db5..65bc401b9 100644 --- a/docs/next/concepts/webserver.html +++ b/docs/next/concepts/webserver.html @@ -4,7 +4,7 @@ Web server | Serverpod - + diff --git a/docs/next/concepts/working-with-endpoints.html b/docs/next/concepts/working-with-endpoints.html index e2e2c8a20..0aa197d1a 100644 --- a/docs/next/concepts/working-with-endpoints.html +++ b/docs/next/concepts/working-with-endpoints.html @@ -4,7 +4,7 @@ Working with endpoints | Serverpod - + diff --git a/docs/next/contribute.html b/docs/next/contribute.html index 969933961..aeef65960 100644 --- a/docs/next/contribute.html +++ b/docs/next/contribute.html @@ -4,7 +4,7 @@ Roadmap & contributions | Serverpod - + diff --git a/docs/next/deployments/deploying-to-aws.html b/docs/next/deployments/deploying-to-aws.html index a08e843d8..29bc786e3 100644 --- a/docs/next/deployments/deploying-to-aws.html +++ b/docs/next/deployments/deploying-to-aws.html @@ -4,7 +4,7 @@ AWS EC2 with Terraform | Serverpod - + diff --git a/docs/next/deployments/deploying-to-gce-terraform.html b/docs/next/deployments/deploying-to-gce-terraform.html index daf5d82e9..2086f0310 100644 --- a/docs/next/deployments/deploying-to-gce-terraform.html +++ b/docs/next/deployments/deploying-to-gce-terraform.html @@ -4,7 +4,7 @@ Google Cloud Engine with Terraform | Serverpod - + diff --git a/docs/next/deployments/deploying-to-gcr-console.html b/docs/next/deployments/deploying-to-gcr-console.html index c64ae0df1..e46e9c5e1 100644 --- a/docs/next/deployments/deploying-to-gcr-console.html +++ b/docs/next/deployments/deploying-to-gcr-console.html @@ -4,7 +4,7 @@ Google Cloud Run with CGP Console | Serverpod - + diff --git a/docs/next/deployments/deployment-strategy.html b/docs/next/deployments/deployment-strategy.html index 2ef89c789..b92bdf1bd 100644 --- a/docs/next/deployments/deployment-strategy.html +++ b/docs/next/deployments/deployment-strategy.html @@ -4,7 +4,7 @@ Choosing deployment strategy | Serverpod - + diff --git a/docs/next/deployments/general.html b/docs/next/deployments/general.html index 6d08a7ae2..65613cf98 100644 --- a/docs/next/deployments/general.html +++ b/docs/next/deployments/general.html @@ -4,7 +4,7 @@ Hosting elsewhere | Serverpod - + diff --git a/docs/next/get-started-with-mini.html b/docs/next/get-started-with-mini.html index 9f23b11ac..170e9d191 100644 --- a/docs/next/get-started-with-mini.html +++ b/docs/next/get-started-with-mini.html @@ -4,12 +4,14 @@ Get started with Mini | Serverpod - +
Version: Next

Get started with Mini

Serverpod Mini is a slimmer version of Serverpod that does not need to be connected to a Postgres database. Before you begin, make sure that you have Flutter and Serverpod installed.

+
+

Create a new project

Create a mini project by running:

$ serverpod create myminipod --mini

Serverpod will create a new project for you. It contains three Dart packages, but you only need to pay attention to the myminipod_server and myminipod_flutter directories. The server directory contains your server files, and the flutter directory contains your app. The third package (myminipod_client) contains generated code that is used by the Flutter app to communicate with the server.

@@ -42,6 +44,6 @@

var company = Company(
name: 'Serverpod',
foundedDate: DateTime(2021, 9, 27),
employees: [
'Alex',
'Isak',
'Viktor',
],
);

var result = await client.company.isLegit(company);

Conclusion

-

You are now ready to start exploring the exciting world of Serverpod! And even if you start out with Serverpod mini, you can always upgrade to the full version later.

+

You are now ready to start exploring the exciting world of Serverpod! And even if you start out with Serverpod mini, you can always upgrade to the full version later.

\ No newline at end of file diff --git a/docs/next/get-started.html b/docs/next/get-started.html index dfc63b459..94535631c 100644 --- a/docs/next/get-started.html +++ b/docs/next/get-started.html @@ -4,7 +4,7 @@ Get started | Serverpod - + diff --git a/docs/next/support.html b/docs/next/support.html index a5d306348..b17965e92 100644 --- a/docs/next/support.html +++ b/docs/next/support.html @@ -4,7 +4,7 @@ Support & community | Serverpod - + diff --git a/docs/next/tools/insights.html b/docs/next/tools/insights.html index 1043d225e..9742bb9d0 100644 --- a/docs/next/tools/insights.html +++ b/docs/next/tools/insights.html @@ -4,7 +4,7 @@ Serverpod Insights | Serverpod - + diff --git a/docs/next/tools/lsp.html b/docs/next/tools/lsp.html index 0b9e75157..ad84a210e 100644 --- a/docs/next/tools/lsp.html +++ b/docs/next/tools/lsp.html @@ -4,7 +4,7 @@ LSP server | Serverpod - + diff --git a/docs/next/tutorials/authentication.html b/docs/next/tutorials/authentication.html index 6fcb43fe8..a5aebf979 100644 --- a/docs/next/tutorials/authentication.html +++ b/docs/next/tutorials/authentication.html @@ -4,7 +4,7 @@ Authentication | Serverpod - + diff --git a/docs/next/tutorials/code-example.html b/docs/next/tutorials/code-example.html index f5b7d2d17..7ec16d930 100644 --- a/docs/next/tutorials/code-example.html +++ b/docs/next/tutorials/code-example.html @@ -4,7 +4,7 @@ Code examples | Serverpod - + diff --git a/docs/next/tutorials/first-app.html b/docs/next/tutorials/first-app.html index 6cca0c100..eeb7812e5 100644 --- a/docs/next/tutorials/first-app.html +++ b/docs/next/tutorials/first-app.html @@ -4,7 +4,7 @@ Build your first app | Serverpod - + diff --git a/docs/next/tutorials/real-time-communication.html b/docs/next/tutorials/real-time-communication.html index 0d3445e28..81f81efca 100644 --- a/docs/next/tutorials/real-time-communication.html +++ b/docs/next/tutorials/real-time-communication.html @@ -4,12 +4,14 @@ Real-time communication | Serverpod - +
Version: Next

Real-time communication

Have you ever found real-time communication in apps challenging? It doesn't have to be. Today, we're diving into how to build a collaborative drawing experience using Flutter and Serverpod. We'll call our app Pixorama - a fun and interactive project inspired by Reddit's r/place. Pixorama lets users draw together on a shared grid, with every pixel placed updating in real-time across all connected devices.

+
+

This tutorial is also available as a video.

info

Before you begin, make sure that you have installed Serverpod. It's also recommended that you read the Get started with Mini guide.

You can try out the final app here: https://pixorama.live

Serverpod Insights

diff --git a/docs/next/upgrading/upgrade-from-mini.html b/docs/next/upgrading/upgrade-from-mini.html index ec3cfe5ed..f8b526533 100644 --- a/docs/next/upgrading/upgrade-from-mini.html +++ b/docs/next/upgrading/upgrade-from-mini.html @@ -4,7 +4,7 @@ Upgrade from Mini to full | Serverpod - + diff --git a/docs/next/upgrading/upgrade-to-one-point-two.html b/docs/next/upgrading/upgrade-to-one-point-two.html index b7a86c46e..e237c5c2c 100644 --- a/docs/next/upgrading/upgrade-to-one-point-two.html +++ b/docs/next/upgrading/upgrade-to-one-point-two.html @@ -4,7 +4,7 @@ Upgrade to 1.2 | Serverpod - + diff --git a/docs/next/upgrading/upgrade-to-two.html b/docs/next/upgrading/upgrade-to-two.html index 38b3119ad..7bbca824a 100644 --- a/docs/next/upgrading/upgrade-to-two.html +++ b/docs/next/upgrading/upgrade-to-two.html @@ -4,7 +4,7 @@ Upgrade to 2.0 | Serverpod - + diff --git a/docs/support.html b/docs/support.html index 93a81a29b..17990ade9 100644 --- a/docs/support.html +++ b/docs/support.html @@ -4,7 +4,7 @@ Support & community | Serverpod - + diff --git a/docs/tools/insights.html b/docs/tools/insights.html index 83076f765..ea7863a52 100644 --- a/docs/tools/insights.html +++ b/docs/tools/insights.html @@ -4,7 +4,7 @@ Serverpod Insights | Serverpod - + diff --git a/docs/tools/lsp.html b/docs/tools/lsp.html index 23c5c4ae0..34a5a0013 100644 --- a/docs/tools/lsp.html +++ b/docs/tools/lsp.html @@ -4,7 +4,7 @@ LSP server | Serverpod - + diff --git a/docs/tutorials/authentication.html b/docs/tutorials/authentication.html index dbdf15ada..84638ead1 100644 --- a/docs/tutorials/authentication.html +++ b/docs/tutorials/authentication.html @@ -4,7 +4,7 @@ Authentication | Serverpod - + diff --git a/docs/tutorials/code-example.html b/docs/tutorials/code-example.html index c67d281bb..5e39b6ff3 100644 --- a/docs/tutorials/code-example.html +++ b/docs/tutorials/code-example.html @@ -4,7 +4,7 @@ Code examples | Serverpod - + diff --git a/docs/tutorials/first-app.html b/docs/tutorials/first-app.html index 4628deb06..adf554006 100644 --- a/docs/tutorials/first-app.html +++ b/docs/tutorials/first-app.html @@ -4,7 +4,7 @@ Build your first app | Serverpod - + diff --git a/docs/tutorials/real-time-communication.html b/docs/tutorials/real-time-communication.html index c5dc5a911..b216db8ab 100644 --- a/docs/tutorials/real-time-communication.html +++ b/docs/tutorials/real-time-communication.html @@ -4,12 +4,14 @@ Real-time communication | Serverpod - +
Version: 2.1.0

Real-time communication

Have you ever found real-time communication in apps challenging? It doesn't have to be. Today, we're diving into how to build a collaborative drawing experience using Flutter and Serverpod. We'll call our app Pixorama - a fun and interactive project inspired by Reddit's r/place. Pixorama lets users draw together on a shared grid, with every pixel placed updating in real-time across all connected devices.

+
+

This tutorial is also available as a video.

info

Before you begin, make sure that you have installed Serverpod. It's also recommended that you read the Get started with Mini guide.

You can try out the final app here: https://pixorama.live

Serverpod Insights

diff --git a/docs/upgrading/upgrade-from-mini.html b/docs/upgrading/upgrade-from-mini.html index 18832f9c4..d0bc3d0af 100644 --- a/docs/upgrading/upgrade-from-mini.html +++ b/docs/upgrading/upgrade-from-mini.html @@ -4,7 +4,7 @@ Upgrade from Mini to full | Serverpod - + diff --git a/docs/upgrading/upgrade-to-one-point-two.html b/docs/upgrading/upgrade-to-one-point-two.html index bb0755ec3..087a46bde 100644 --- a/docs/upgrading/upgrade-to-one-point-two.html +++ b/docs/upgrading/upgrade-to-one-point-two.html @@ -4,7 +4,7 @@ Upgrade to 1.2 | Serverpod - + diff --git a/docs/upgrading/upgrade-to-two.html b/docs/upgrading/upgrade-to-two.html index 2a5d34cd5..46361edbf 100644 --- a/docs/upgrading/upgrade-to-two.html +++ b/docs/upgrading/upgrade-to-two.html @@ -4,7 +4,7 @@ Upgrade to 2.0 | Serverpod - +