diff --git a/docs/0.9.10.html b/docs/0.9.10.html index 1ce39738b..3a7baa45a 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 f984ee01e..abc937fce 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 72c6e2023..d9f272af0 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 58adb4233..e9ddb178c 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 7af0b3d29..d122649b5 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 c3959b6ea..02d09e0cc 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 906845482..bcd8b0289 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 930b08733..079d631c6 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 85f379574..f7add1efe 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 a0099c4e4..9e1a91067 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 3faf56633..0367e2f12 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 57277d8a5..739caaaee 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 1e91767ec..f8e925b26 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 cf93bad1f..352a8ab85 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 bb3fac5a9..54621162c 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 989f2ab53..dbd44fd12 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 22ab1b561..4a97a5043 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 f155dfc0d..fbaa57ef6 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 9ed3f694d..486919233 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 ea1979691..5fe5c438d 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 cdda473e0..ec534c15d 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 46f578d6b..b689de579 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 31fd95024..974f6ff29 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 618eee996..a066de9b0 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 8dd0a5a0b..af48ba5fa 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 cd00e8b2b..3b856d523 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 6b08a2df8..4f3437829 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 b4c7063ca..db0d0a842 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 e12646984..04e0a5933 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 02fef8965..9ca1183f1 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 191d42690..0309f360c 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 741fff7fb..c02c5245e 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 72f14f661..01b93ee41 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 9b02dd378..d3b8d146e 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 e85eb2cc2..bbbeb4277 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 50cee8786..2639cc8b8 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 5502573d0..a3877d56c 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 f73c098ad..3dbd8c8e9 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 8f6fffb02..230f4c61a 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 e35dba72b..1bc0f85a3 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 cafd0e1d1..bdc528d1f 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 9692aff14..03ffbdc0e 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 67f37696c..6fe74e78a 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 397eb4ab2..252d8b226 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 2bbff85ea..de77cd1b6 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 609de58b4..e80d02474 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 5d65ead93..4a9fc8c3e 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 85d94f357..3dc1f8340 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 774c6b12a..abfcf5f80 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 930f2c740..b21c3c267 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 5bc78a703..d886e5a98 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 f47aaa1a7..a8cfa398e 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 165582d2b..22a598ce2 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 853b5e667..f391537ac 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 f3fdd3a36..55b3ac6b0 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 10cb80134..d6f9d0bea 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 652f86f3d..32b19c2bc 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 7751bae44..14064987a 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 3ed40fc46..34fb835a6 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 e37d05a2e..e4f61cbfc 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 a50e55fdb..e40238e14 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 1add5aadd..0d836c233 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 0398f3dc6..f2bd99305 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 88eb18294..dcbca2e30 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 c8a59d67b..d9e16ee90 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 e96357afe..37fd50757 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 f59795fe6..8bfc86b21 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 c1ab9079f..e3cd05546 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 14de15932..0ed4184b2 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 f05848ed2..6c26fb13d 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 2687a03ca..885b77411 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 093ec3ad8..6ad52d819 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 d32ba7053..c7ecf0bd3 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 c375b8c39..859cbd58a 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 7c61aec53..5ca9f8557 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 7dda1746f..fdb457e3e 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 481305c59..d1b039ef2 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 08020da92..72cfaaee7 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 4f0cb95bf..8d358ceef 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 37c08f82a..e01701b58 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 0c5abe244..c4ebbfb9f 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 1bc232180..dc889d981 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 25a18c6ce..72c6ccc04 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 9d04cf78f..fe3beba32 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 638fb4903..cb133fcea 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 4d273fad6..7f285e62e 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 c86019d85..f330830bd 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 c77d225ef..9dfe7393e 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 15369dde2..801dafb61 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 552cbb90d..8f5003ab8 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 9f51818ab..36aa4c1f8 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 389537cfa..4f0468151 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 1042c8e68..3a7c17bb7 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 045b7b817..7a0e584c2 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 81e9eaf00..5cc8e89bd 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 b6a493889..fc87bb68e 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 60d50cdbe..4e3547066 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 856cedfa5..a2add12eb 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 b1e757c5a..da109bdc8 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 e4573242c..4a2b52770 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 4f2528c2f..6e6d6cc35 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 d3df9cc3a..b095d46fb 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 63b3360f1..f38d257e6 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 74678adea..9c9be594f 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 9b6670190..75ba46e96 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 18402d68b..482e68d50 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 c088008f6..c653ecdd1 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 76602ba01..c09888415 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 530cff601..318e5577a 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 0aed1e4aa..056673678 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 e2472bc74..6ec15e782 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 0121340aa..cadeaf654 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 c9fb6c3f1..c09faaf1f 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 88b3f6470..55429056b 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 039ac2c88..70ed34dac 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 b512b866b..4649db382 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 33ba87b74..0087a5861 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 ef68889cb..b2b8ed132 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 7b6a58139..39fbfc1da 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 2bc212b58..ed1dd089e 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 efb79138c..50e0e6fb0 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 001018953..ba4869d84 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 9424ee04c..c5cb6aa57 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 71bfa0696..cdde03ad4 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 8bfb981f0..05009dc64 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 77a09eb89..b72afdb7e 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 54e9b314c..83957ff72 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 0f6152ebf..36cc8382e 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 9eb555194..bc7d5aded 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 7f74ccab8..3a6222fb2 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 069c42403..acdcbf8ff 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 cccf11b7b..e7227e997 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 e41b79969..06b28dc05 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 7777cb808..923d29403 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 2b84f9f50..d3aa3d998 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 d1a4abc07..d42648550 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 731d31e23..857b90ceb 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 c9b9801f2..a39c2df85 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 1e1c2b73d..6dbb0473c 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 f4efa2d9f..f40e5a313 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 6d197503c..bd06aad17 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 5a4facfd8..b8fa20e6f 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 50eb66397..5eed99493 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 acac4d730..88710ffac 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 a9cf27ebd..cbd3a5b7a 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 5527d5f2d..c94cbd2ff 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 bf391d900..a341e7166 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 c7700e18e..4b7a5b418 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 74da44b2f..15444cac4 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 625177e0e..c78b76b34 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 3978744b5..725196a0d 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 91f153a6d..f80ff6e76 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 9b29a369c..915a31674 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 b682f41b1..f51303116 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 7401a031f..b6343d1fc 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 0ec1ea8b7..a5b047905 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 d4b6e6426..752fe97fc 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 a0cdd635d..07e73a8f7 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 83bb006be..23233049c 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 448311e59..a98631cc2 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 072d7732c..5ce2a3e12 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 e9f0123a5..b55df219c 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 a0351d804..eea6554ce 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 633e4567d..7fa6de488 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 98201e346..f915a0730 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 da3cbc92b..2f1ccc91b 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 adb1831d9..8e27ad7ad 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 e9be5c813..c049008b9 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 0a73c93ab..a640909ff 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 1412be816..a02f41460 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 616ab5ff4..3be57f630 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 e1efb0f9f..85878441d 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 1c67a9c0c..810ec706d 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 a5ae21e35..d9ea9f5a1 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 f0dc6b4ca..5635719ee 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 df71001bc..36d6a4234 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 d31e999e4..7f068a3bf 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 5fe5a6c42..ad785fe8c 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 977dcd83b..680b746f8 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 9a26e2fca..57c7ef7c2 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 f013569c3..293749fbe 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 fd4c9e14f..79a4b2f31 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 3669474ae..46905ef89 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 0404d74f5..5fbad7c46 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 86cf47790..524690a15 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 3293d11b3..f4852c43f 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 5ac83a185..9a7a8df6b 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 2135d15a9..664dfc759 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 3f8d7f8c3..084c8baef 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 00b8df980..c5c2f50a8 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 220756f17..53893720f 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 d2caeb6ff..7fe6fa7cc 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 cf7165c6c..cf373a5da 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 b2e74725c..1d90f80bf 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 ba9e2120d..1fcd91745 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 a4a890865..1c5dfeb9c 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 490db3af8..eabca464a 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 d333b9bec..7080f5c20 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 7372dfcb3..a6f68b131 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 38c07d3ee..12d873cfa 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 050e0ed88..7c26806dd 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 3a2db5c2f..f9c90d006 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 4430bb612..4db1b4c47 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 469a7974a..8db1840e6 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 fd9fa6f93..ba6d2a48a 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 146f386c5..2d500fe46 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 fa7483ee3..9b694f315 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 b489f1dbd..884947e78 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 03edf83ce..c2ad38cbe 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 5dd7613fa..1a29752eb 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 ce159bdf3..7469889fd 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 23eb5ae3c..7f389c4e9 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 270e478ba..516d8c0b5 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 58e7a3944..50a3feda4 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 6e4d77187..d316656b6 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 1e2b2d0ea..20e224302 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 a77eaa30d..d52f7df21 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 33532626d..189e2ef16 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 5ea816d0a..004adae51 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 491bcc860..a13e61b13 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 a46827b6d..395e9eae2 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 abba085f5..078b50167 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 58affc1cc..1d48ce9a2 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 a4fa77209..1783e36f1 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 e61309ef9..3100eb113 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 ea325e224..09849f1e1 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 d447641a1..ab7363335 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 8a010ac1e..bd31bd8a2 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 d00ed988a..c04e85b4a 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 63e0462d6..b51feb217 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 9ff2424b0..11061c9a2 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 9e92b9919..e1b05ca2a 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 de1f6785f..a06063586 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 e5330cfd7..9b1a89599 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 889f51029..809a28b22 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 f9aec4a60..d9d8d6004 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 a667dda0f..399d746a0 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 a1b811e46..57834ed86 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 1f61f8cea..5ec3d7911 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 0ac2687e1..bc890bb29 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 5ea6bb7da..fd554e967 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 58b2743d6..7dc42ce4e 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 a88f04136..35fdfe30d 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 7193ea241..1298979ac 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 881dae223..6a01df22b 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 4cdad2049..05156c372 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 1a7a94ab1..b916008c5 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 48b7a2707..6ceb3efcb 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 3bb97c412..994cc62c6 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 ae85f1f70..e39952d33 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 bb2fd9007..7923e9613 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 fa32bb311..202990f4f 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 910193dca..f4068ec8d 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 e9782a4a7..97d7287ac 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 1eeb45305..78e8fdc30 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 eb70d3bb0..ffa32d2ff 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 a4893d9be..de18fb0b7 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 621ccaca8..ee3579ed3 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 d60a78aee..a1ca2aa14 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 10e8eca68..5288b4a4b 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 69f2c86f4..59ae2a02d 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 4d48c721e..a7308e3e4 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 4439500c2..24ccc97c7 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 1ce51d27d..f78cc2c46 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 708395907..57bd03df1 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 df7295fab..b361c60d7 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 10bd43ad1..9dc1c5043 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 7fa91d94a..a648fd687 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 b73b21b5d..4ab548aa4 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 e9a45e697..533803e1e 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 0b1926063..c2fcd0ba7 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 304413001..11fffe3a5 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 2e65798de..64ec8ce3f 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 9c9c02ab8..4daf5aadf 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 09564b188..46a2807d2 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 ba86e32fc..4cc8f74ea 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 563bd2bc3..927b4bb46 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 8f9805f97..dfc5328f9 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 e6f48998e..d695161c5 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 4495ef734..f45e79935 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 ce36e87c0..b55efd721 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 5123b7278..b950f168f 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 83c201a76..e8a46cedc 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 c8ce7ba91..7bb181d96 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 27d11c9a2..b2d553130 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 3c3278cb7..a49ff4228 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 bca64802f..6b5e94fe2 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 d8d11cfe0..c006ea38c 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 bae3067d6..c105d9f93 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 e4dee0abd..f8db05f85 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 08117847d..2179acdc8 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 99bbb524f..f15d673f9 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 aab476b0b..1d83beaa4 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 3662c75fe..27627ee2e 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 90d0007b4..e3b82f379 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 e0f343d71..0df50b6f6 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 588aacd2e..f67a7a64a 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 c2bdf67f9..cea9c8a80 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 3899dae67..7fdf6341b 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 0dc77bfbe..71c42dc85 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 99583fe9a..eb37a370b 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 3ea240763..9a7583995 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 06c42b581..cd5197b80 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 82c848b51..9521d978f 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 7c24c27df..f3242880a 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 28773fb29..2a772f01f 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 cbe844917..c8994e03d 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 45a25aae7..203462fa3 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 35b3dc59d..419fb07f5 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 b84572334..76c6b7b94 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 cbd83c9c5..43be3a96e 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 96da5aef1..109e8c550 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 8994be1c0..16d0f179f 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 93301947b..93697cff0 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 93f4fe7b4..e0bf3e649 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 292a34290..b0a5aeebc 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 bd4b0d496..7cea62276 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 12988840e..68ecdd911 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 a38f849d5..accb78572 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 2b6158c81..5dec9be6a 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 60a970076..d0fd71309 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 ca5918f1c..ad5a25f4a 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 cb918e513..9bb7e16ca 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 310a5c714..52006d5e0 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 9ca2ad86f..fced6f70e 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 432610ccd..02b66a1df 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 0f914af3c..9cc47612e 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 31fa3bda3..dc331dc03 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 e37954525..dc19e1819 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 ed6988940..dee72169e 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 e994e7867..f738b3d59 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 3596e1528..7736e79de 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 eb14e101a..920b92721 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 c7212b740..2e024d55a 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 8307f7d06..26d318417 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 5e82af7e7..d8b075c1b 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 bbd49221a..0e64e518e 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 c397f29d7..bd158062c 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 4b5c1d00a..0fbda88fe 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 507d856a2..d49cd4c14 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 caedc3b91..3e570aee2 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 2c5ecca42..2dd4bd1eb 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 e6529f852..103084d75 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 02c813bd2..6ef9538a7 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 ba699f158..b5af180d5 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 b5500cf59..d3f878fa4 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 5632b8ff7..7db889e90 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 9f852ab45..01bd15bae 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 8954f5cdc..5a93408e0 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 e0cbc4217..0ac386ffa 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 1a9451359..eb5c9c1a0 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 9765dff0f..4eeeaf849 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 6b247a078..71a13f4d5 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 ec5888ee7..072373f2a 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 efc673dfc..878680361 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 7db60d28b..601d9435a 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 e1408a0ee..5601eabf7 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 8909d907b..8123a73dc 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 d4c9c4691..4b7329f79 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 3e06db344..fc1436c0c 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 49d4ddc32..c672c8438 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 efb17eadc..38197ae2e 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 0932a5377..ecfc9fdc0 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 f29699d69..c6964551d 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 c2f35cfc2..3a470bdd5 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 4f10f5ef9..82bce6ed7 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 5c36949b1..b88b235ff 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 575e6965d..9b4bd6c60 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 43f9ea453..1bd0d13ac 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 e153f4683..e9c0ea4ff 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 ed98a97cf..75cbbdae1 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 a61c8d36e..86ef6aa56 100644 --- a/docs/404.html +++ b/docs/404.html @@ -4,7 +4,7 @@ Serverpod - + diff --git a/docs/assets/js/50a12feb.1a4e721e.js b/docs/assets/js/50a12feb.1a4e721e.js new file mode 100644 index 000000000..5cc65c57e --- /dev/null +++ b/docs/assets/js/50a12feb.1a4e721e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkserverpod_docs=self.webpackChunkserverpod_docs||[]).push([[97499],{46577:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>d,toc:()=>c});var s=n(74848),i=n(28453);const r={},l="Setup",d={id:"concepts/authentication/setup",title:"Setup",description:"Serverpod comes with built-in user management and authentication. It is possible to build a custom authentication implementation, but the recommended way to authenticate users is to use the serverpod_auth module. The module makes it easy to authenticate with email or social sign-ins and currently supports signing in with email, Google, Apple, and Firebase.",source:"@site/docs/06-concepts/11-authentication/01-setup.md",sourceDirName:"06-concepts/11-authentication",slug:"/concepts/authentication/setup",permalink:"/next/concepts/authentication/setup",draft:!1,unlisted:!1,editUrl:"https://github.com/serverpod/serverpod_docs/tree/main/docs/06-concepts/11-authentication/01-setup.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Modules",permalink:"/next/concepts/modules"},next:{title:"The basics",permalink:"/next/concepts/authentication/basics"}},a={},c=[{value:"Installing the auth module",id:"installing-the-auth-module",level:2},{value:"Server setup",id:"server-setup",level:2},{value:"Initialize the auth database",id:"initialize-the-auth-database",level:3},{value:"Configure Authentication",id:"configure-authentication",level:3},{value:"Client setup",id:"client-setup",level:2},{value:"App setup",id:"app-setup",level:2},{value:"Check authentication state",id:"check-authentication-state",level:4},{value:"Access current user",id:"access-current-user",level:4},{value:"Register authentication",id:"register-authentication",level:4},{value:"Monitor authentication changes",id:"monitor-authentication-changes",level:4},{value:"Sign out current device",id:"sign-out-current-device",level:4},{value:"Sign out all devices",id:"sign-out-all-devices",level:4}];function o(e){const t={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",img:"img",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"setup",children:"Setup"})}),"\n",(0,s.jsxs)(t.p,{children:["Serverpod comes with built-in user management and authentication. It is possible to build a ",(0,s.jsx)(t.a,{href:"custom-overrides",children:"custom authentication implementation"}),", but the recommended way to authenticate users is to use the ",(0,s.jsx)(t.code,{children:"serverpod_auth"})," module. The module makes it easy to authenticate with email or social sign-ins and currently supports signing in with email, Google, Apple, and Firebase."]}),"\n",(0,s.jsxs)(t.p,{children:["Future versions of the authentication module will include more options. If you write another authentication module, please consider ",(0,s.jsx)(t.a,{href:"/contribute",children:"contributing"})," your code."]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{src:"https://github.com/serverpod/serverpod/raw/main/misc/images/sign-in.png",alt:"Sign-in with Serverpod"})}),"\n",(0,s.jsx)(t.h2,{id:"installing-the-auth-module",children:"Installing the auth module"}),"\n",(0,s.jsx)(t.p,{children:"Serverpod's auth module makes it easy to authenticate users through email or 3rd parties. The authentication module also handles basic user information, such as user names and profile pictures. Make sure to use the same version numbers as for Serverpod itself for all dependencies."}),"\n",(0,s.jsx)(t.h2,{id:"server-setup",children:"Server setup"}),"\n",(0,s.jsxs)(t.p,{children:["Add the module as a dependency to the server project's ",(0,s.jsx)(t.code,{children:"pubspec.yaml"}),"."]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-sh",children:"$ dart pub add serverpod_auth_server\n"})}),"\n",(0,s.jsx)(t.p,{children:"Add the authentication handler to the Serverpod instance."}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-dart",children:"import 'package:serverpod_auth_server/serverpod_auth_server.dart' as auth;\n\nvoid run(List args) async {\n var pod = Serverpod(\n args,\n Protocol(),\n Endpoints(),\n authenticationHandler: auth.authenticationHandler, // Add this line\n );\n\n ...\n}\n"})}),"\n",(0,s.jsxs)(t.p,{children:["Optionally, add a nickname for the module in the ",(0,s.jsx)(t.code,{children:"config/generator.yaml"})," file. This nickname will be used as the name of the module in the code."]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-yaml",children:"modules:\n serverpod_auth:\n nickname: auth\n"})}),"\n",(0,s.jsxs)(t.p,{children:["While still in the server project, generate the client code and endpoint methods for the auth module by running the ",(0,s.jsx)(t.code,{children:"serverpod generate"})," command line tool."]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"$ serverpod generate\n"})}),"\n",(0,s.jsx)(t.h3,{id:"initialize-the-auth-database",children:"Initialize the auth database"}),"\n",(0,s.jsxs)(t.p,{children:["After adding the module to the server project, you need to initialize the database. First you have to create a new migration that includes the auth module tables. This is done by running the ",(0,s.jsx)(t.code,{children:"serverpod create-migration"})," command line tool in the server project."]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"$ serverpod create-migration\n"})}),"\n",(0,s.jsx)(t.p,{children:"Start your database container from the server project."}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"$ docker-compose up --build --detach\n"})}),"\n",(0,s.jsxs)(t.p,{children:["Then apply the migration by starting the server with the ",(0,s.jsx)(t.code,{children:"apply-migrations"})," flag."]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"$ dart run bin/main.dart --role maintenance --apply-migrations\n"})}),"\n",(0,s.jsxs)(t.p,{children:["The full migration instructions can be found in the ",(0,s.jsx)(t.a,{href:"../database/migrations",children:"migration guide"}),"."]}),"\n",(0,s.jsx)(t.h3,{id:"configure-authentication",children:"Configure Authentication"}),"\n",(0,s.jsxs)(t.p,{children:["Serverpod's auth module comes with a default Authentication Configuration. To customize it, go to your main ",(0,s.jsx)(t.code,{children:"server.dart"})," file, import the ",(0,s.jsx)(t.code,{children:"serverpod_auth_server"})," module and set up the authentication configuration:"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-dart",children:"import 'package:serverpod_auth_server/module.dart' as auth; \n \nvoid run(List args) async {\n\n auth.AuthConfig.set(auth.AuthConfig( \n minPasswordLength: 12,\n )); \n \n // Start the Serverpod server. \n await pod.start();\n}\n\n"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"Property"})}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"Description"})}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:(0,s.jsx)(t.strong,{children:"Default"})})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"allowUnsecureRandom"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"True if unsecure random number generation is allowed. If set to false, an error will be thrown if the platform does not support secure random number generation."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"false"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"emailSignInFailureResetTime"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"The reset period for email sign in attempts. Defaults to 5 minutes."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"5min"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"enableUserImages"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"True if user images are enabled."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"true"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"extraSaltyHash"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"True if the server should use the accounts email address as part of the salt when storing password hashes (strongly recommended)."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"true"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"firebaseServiceAccountKeyJson"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Firebase service account key JSON file. Generate and download from the Firebase console."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"-"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"importUserImagesFromGoogleSignIn"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"True if user images should be imported when signing in with Google."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"true"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"legacyUserSignOutBehavior"})}),(0,s.jsxs)(t.td,{style:{textAlign:"left"},children:["Defines the default behavior for the deprecated ",(0,s.jsx)(t.code,{children:"signOut"})," method used in the status endpoint. This setting controls whether users are signed out from all active devices (",(0,s.jsx)(t.code,{children:"SignOutOption.allDevices"}),") or just the current device (",(0,s.jsx)(t.code,{children:"SignOutOption.currentDevice"}),")."]}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:(0,s.jsx)(t.code,{children:"SignOutOption.allDevices"})})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"maxAllowedEmailSignInAttempts"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Max allowed failed email sign in attempts within the reset period."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"5"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"maxPasswordLength"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"The maximum length of passwords when signing up with email."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"128"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"minPasswordLength"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"The minimum length of passwords when signing up with email."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"8"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"onUserCreated"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Called after a user has been created. Listen to this callback if you need to do additional setup."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"-"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"onUserUpdated"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Called whenever a user has been updated. This can be when the user name is changed or if the user uploads a new profile picture."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"-"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"onUserWillBeCreated"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Called when a user is about to be created, gives a chance to abort the creation by returning false."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"-"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"passwordResetExpirationTime"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"The time for password resets to be valid."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"24h"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"sendPasswordResetEmail"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Called when a user should be sent a reset code by email."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"-"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"sendValidationEmail"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Called when a user should be sent a validation code on account setup."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"-"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"userCanEditFullName"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"True if users can edit their full name."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"false"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"userCanEditUserImage"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"True if users can update their profile images."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"true"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"userCanEditUserName"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"True if users can edit their user names."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"true"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"userCanSeeFullName"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"True if users can view their full name."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"true"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"userCanSeeUserName"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"True if users can view their user name."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"true"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"userImageFormat"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"The format used to store user images."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"jpg"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"userImageGenerator"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Generator used to produce default user images."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"-"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"userImageQuality"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"The quality setting for images if JPG format is used."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"70"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"userImageSize"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"The size of user images."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"256"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"userInfoCacheLifetime"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"The duration which user infos are cached locally in the server."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"1min"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"validationCodeLength"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"The length of the validation code used in the authentication process. This value determines the number of digits in the validation code. Setting this value to less than 3 reduces security."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"8"})]})]})]}),"\n",(0,s.jsx)(t.h2,{id:"client-setup",children:"Client setup"}),"\n",(0,s.jsxs)(t.p,{children:["Add the auth client in your client project's ",(0,s.jsx)(t.code,{children:"pubspec.yaml"}),"."]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-yaml",children:"dependencies:\n ...\n serverpod_auth_client: ^1.x.x\n"})}),"\n",(0,s.jsx)(t.h2,{id:"app-setup",children:"App setup"}),"\n",(0,s.jsxs)(t.p,{children:["First, add dependencies to your app's ",(0,s.jsx)(t.code,{children:"pubspec.yaml"})," file for the methods of signing in that you want to support."]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-yaml",children:"dependencies:\n flutter:\n sdk: flutter\n serverpod_flutter: ^1.x.x\n auth_example_client:\n path: ../auth_example_client\n \n serverpod_auth_shared_flutter: ^1.x.x\n"})}),"\n",(0,s.jsxs)(t.p,{children:["Next, you need to set up a ",(0,s.jsx)(t.code,{children:"SessionManager"}),", which keeps track of the user's state. It will also handle the authentication keys passed to the client from the server, upload user profile images, etc."]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-dart",children:"late SessionManager sessionManager;\nlate Client client;\n\nvoid main() async {\n // Need to call this as we are using Flutter bindings before runApp is called.\n WidgetsFlutterBinding.ensureInitialized();\n\n // The android emulator does not have access to the localhost of the machine.\n // const ipAddress = '10.0.2.2'; // Android emulator ip for the host\n\n // On a real device replace the ipAddress with the IP address of your computer.\n const ipAddress = 'localhost';\n\n // Sets up a singleton client object that can be used to talk to the server from\n // anywhere in our app. The client is generated from your server code.\n // The client is set up to connect to a Serverpod running on a local server on\n // the default port. You will need to modify this to connect to staging or\n // production servers.\n client = Client(\n 'http://$ipAddress:8080/',\n authenticationKeyManager: FlutterAuthenticationKeyManager(),\n )..connectivityMonitor = FlutterConnectivityMonitor();\n\n // The session manager keeps track of the signed-in state of the user. You\n // can query it to see if the user is currently signed in and get information\n // about the user.\n sessionManager = SessionManager(\n caller: client.modules.auth,\n );\n await sessionManager.initialize();\n\n runApp(MyApp());\n}\n"})}),"\n",(0,s.jsxs)(t.p,{children:["The ",(0,s.jsx)(t.code,{children:"SessionManager"})," has useful methods for viewing and monitoring the user's current state."]}),"\n",(0,s.jsx)(t.h4,{id:"check-authentication-state",children:"Check authentication state"}),"\n",(0,s.jsx)(t.p,{children:"To check if the user is signed in:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-dart",children:"sessionManager.isSignedIn;\n"})}),"\n",(0,s.jsxs)(t.p,{children:["Returns ",(0,s.jsx)(t.code,{children:"true"})," if the user is signed in, or ",(0,s.jsx)(t.code,{children:"false"})," otherwise."]}),"\n",(0,s.jsx)(t.h4,{id:"access-current-user",children:"Access current user"}),"\n",(0,s.jsx)(t.p,{children:"To retrieve information about the current user:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-dart",children:"sessionManager.signedInUser;\n"})}),"\n",(0,s.jsxs)(t.p,{children:["Returns a ",(0,s.jsx)(t.code,{children:"UserInfo"})," object if the user is currently signed in, or ",(0,s.jsx)(t.code,{children:"null"})," if the user is not."]}),"\n",(0,s.jsx)(t.h4,{id:"register-authentication",children:"Register authentication"}),"\n",(0,s.jsx)(t.p,{children:"To register a signed in user in the session manager:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-dart",children:"await sessionManager.registerSignedInUser(\n userInfo,\n keyId,\n authKey,\n);\n"})}),"\n",(0,s.jsxs)(t.p,{children:["This will persist the user information and refresh any open streaming connection, see ",(0,s.jsx)(t.a,{href:"providers/custom-providers#client-setup",children:"Custom Providers - Client Setup"})," for more details."]}),"\n",(0,s.jsx)(t.h4,{id:"monitor-authentication-changes",children:"Monitor authentication changes"}),"\n",(0,s.jsx)(t.p,{children:"To add a listener that tracks changes in the user's authentication state, useful for updating the UI:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-dart",children:"@override\nvoid initState() {\n super.initState();\n \n // Rebuild the page if authentication state changes.\n sessionManager.addListener(() {\n setState(() {});\n });\n}\n"})}),"\n",(0,s.jsx)(t.p,{children:"The listener is triggered whenever the user's sign-in state changes."}),"\n",(0,s.jsx)(t.h4,{id:"sign-out-current-device",children:"Sign out current device"}),"\n",(0,s.jsx)(t.p,{children:"To sign the user out on from the current device:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-dart",children:"await sessionManager.signOutDevice();\n"})}),"\n",(0,s.jsxs)(t.p,{children:["Returns ",(0,s.jsx)(t.code,{children:"true"})," if the sign-out is successful, or ",(0,s.jsx)(t.code,{children:"false"})," if it fails."]}),"\n",(0,s.jsx)(t.h4,{id:"sign-out-all-devices",children:"Sign out all devices"}),"\n",(0,s.jsx)(t.p,{children:"To sign the user out across all devices:"}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-dart",children:"await sessionManager.signOutAllDevices();\n"})}),"\n",(0,s.jsxs)(t.p,{children:["Returns ",(0,s.jsx)(t.code,{children:"true"})," if the user is successfully signed out from all devices, or ",(0,s.jsx)(t.code,{children:"false"})," if it fails."]}),"\n",(0,s.jsxs)(t.admonition,{type:"info",children:[(0,s.jsxs)(t.p,{children:["The ",(0,s.jsx)(t.code,{children:"signOut"})," method is deprecated. This method calls the deprecated ",(0,s.jsx)(t.code,{children:"signOut"})," status endpoint. For additional details, see the ",(0,s.jsx)(t.a,{href:"basics#deprecated-signout-endpoint",children:"deprecated signout endpoint"})," section. Use ",(0,s.jsx)(t.code,{children:"signOutDevice"})," or ",(0,s.jsx)(t.code,{children:"signOutAllDevices"})," instead."]}),(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-dart",children:"await sessionManager.signOut(); // Deprecated\n"})})]})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(o,{...e})}):o(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>l,x:()=>d});var s=n(96540);const i={},r=s.createContext(i);function l(e){const t=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/50a12feb.f788ffc1.js b/docs/assets/js/50a12feb.f788ffc1.js deleted file mode 100644 index d135122c4..000000000 --- a/docs/assets/js/50a12feb.f788ffc1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkserverpod_docs=self.webpackChunkserverpod_docs||[]).push([[97499],{46577:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>d,toc:()=>o});var s=n(74848),i=n(28453);const r={},l="Setup",d={id:"concepts/authentication/setup",title:"Setup",description:"Serverpod comes with built-in user management and authentication. It is possible to build a custom authentication implementation, but the recommended way to authenticate users is to use the serverpod_auth module. The module makes it easy to authenticate with email or social sign-ins and currently supports signing in with email, Google, Apple, and Firebase.",source:"@site/docs/06-concepts/11-authentication/01-setup.md",sourceDirName:"06-concepts/11-authentication",slug:"/concepts/authentication/setup",permalink:"/next/concepts/authentication/setup",draft:!1,unlisted:!1,editUrl:"https://github.com/serverpod/serverpod_docs/tree/main/docs/06-concepts/11-authentication/01-setup.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Modules",permalink:"/next/concepts/modules"},next:{title:"The basics",permalink:"/next/concepts/authentication/basics"}},a={},o=[{value:"Installing the auth module",id:"installing-the-auth-module",level:2},{value:"Server setup",id:"server-setup",level:2},{value:"Initialize the auth database",id:"initialize-the-auth-database",level:3},{value:"Configure Authentication",id:"configure-authentication",level:3},{value:"Client setup",id:"client-setup",level:2},{value:"App setup",id:"app-setup",level:2}];function c(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"setup",children:"Setup"})}),"\n",(0,s.jsxs)(t.p,{children:["Serverpod comes with built-in user management and authentication. It is possible to build a ",(0,s.jsx)(t.a,{href:"custom-overrides",children:"custom authentication implementation"}),", but the recommended way to authenticate users is to use the ",(0,s.jsx)(t.code,{children:"serverpod_auth"})," module. The module makes it easy to authenticate with email or social sign-ins and currently supports signing in with email, Google, Apple, and Firebase."]}),"\n",(0,s.jsxs)(t.p,{children:["Future versions of the authentication module will include more options. If you write another authentication module, please consider ",(0,s.jsx)(t.a,{href:"/contribute",children:"contributing"})," your code."]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{src:"https://github.com/serverpod/serverpod/raw/main/misc/images/sign-in.png",alt:"Sign-in with Serverpod"})}),"\n",(0,s.jsx)(t.h2,{id:"installing-the-auth-module",children:"Installing the auth module"}),"\n",(0,s.jsx)(t.p,{children:"Serverpod's auth module makes it easy to authenticate users through email or 3rd parties. The authentication module also handles basic user information, such as user names and profile pictures. Make sure to use the same version numbers as for Serverpod itself for all dependencies."}),"\n",(0,s.jsx)(t.h2,{id:"server-setup",children:"Server setup"}),"\n",(0,s.jsxs)(t.p,{children:["Add the module as a dependency to the server project's ",(0,s.jsx)(t.code,{children:"pubspec.yaml"}),"."]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-sh",children:"$ dart pub add serverpod_auth_server\n"})}),"\n",(0,s.jsx)(t.p,{children:"Add the authentication handler to the Serverpod instance."}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-dart",children:"import 'package:serverpod_auth_server/serverpod_auth_server.dart' as auth;\n\nvoid run(List args) async {\n var pod = Serverpod(\n args,\n Protocol(),\n Endpoints(),\n authenticationHandler: auth.authenticationHandler, // Add this line\n );\n\n ...\n}\n"})}),"\n",(0,s.jsxs)(t.p,{children:["Optionally, add a nickname for the module in the ",(0,s.jsx)(t.code,{children:"config/generator.yaml"})," file. This nickname will be used as the name of the module in the code."]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-yaml",children:"modules:\n serverpod_auth:\n nickname: auth\n"})}),"\n",(0,s.jsxs)(t.p,{children:["While still in the server project, generate the client code and endpoint methods for the auth module by running the ",(0,s.jsx)(t.code,{children:"serverpod generate"})," command line tool."]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"$ serverpod generate\n"})}),"\n",(0,s.jsx)(t.h3,{id:"initialize-the-auth-database",children:"Initialize the auth database"}),"\n",(0,s.jsxs)(t.p,{children:["After adding the module to the server project, you need to initialize the database. First you have to create a new migration that includes the auth module tables. This is done by running the ",(0,s.jsx)(t.code,{children:"serverpod create-migration"})," command line tool in the server project."]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"$ serverpod create-migration\n"})}),"\n",(0,s.jsx)(t.p,{children:"Start your database container from the server project."}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"$ docker-compose up --build --detach\n"})}),"\n",(0,s.jsxs)(t.p,{children:["Then apply the migration by starting the server with the ",(0,s.jsx)(t.code,{children:"apply-migrations"})," flag."]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-bash",children:"$ dart run bin/main.dart --role maintenance --apply-migrations\n"})}),"\n",(0,s.jsxs)(t.p,{children:["The full migration instructions can be found in the ",(0,s.jsx)(t.a,{href:"../database/migrations",children:"migration guide"}),"."]}),"\n",(0,s.jsx)(t.h3,{id:"configure-authentication",children:"Configure Authentication"}),"\n",(0,s.jsxs)(t.p,{children:["Serverpod's auth module comes with a default Authentication Configuration. To customize it, go to your main ",(0,s.jsx)(t.code,{children:"server.dart"})," file, import the ",(0,s.jsx)(t.code,{children:"serverpod_auth_server"})," module and set up the authentication configuration:"]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-dart",children:"import 'package:serverpod_auth_server/module.dart' as auth; \n \nvoid run(List args) async {\n\n auth.AuthConfig.set(auth.AuthConfig( \n minPasswordLength: 12,\n )); \n \n // Start the Serverpod server. \n await pod.start();\n}\n\n"})}),"\n",(0,s.jsxs)(t.table,{children:[(0,s.jsx)(t.thead,{children:(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.th,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"Property"})}),(0,s.jsx)(t.th,{style:{textAlign:"left"},children:"Description"}),(0,s.jsx)(t.th,{style:{textAlign:"center"},children:"Default"})]})}),(0,s.jsxs)(t.tbody,{children:[(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"maxAllowedEmailSignInAttempts"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Max allowed failed email sign in attempts within the reset period."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"5"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"emailSignInFailureResetTime"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"The reset period for email sign in attempts. Defaults to 5 minutes."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"5min"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"userCanEditUserImage"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"True if users can update their profile images."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"true"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"userCanEditUserName"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"True if users can edit their user names."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"true"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"userCanEditFullName"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"True if users can edit their full name."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"false"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"userCanSeeUserName"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"True if users can view their user name."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"true"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"userCanSeeFullName"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"True if users can view their full name."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"true"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"enableUserImages"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"True if user images are enabled."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"true"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"importUserImagesFromGoogleSignIn"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"True if user images should be imported when signing in with Google."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"true"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"userImageSize"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"The size of user images."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"256"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"userImageFormat"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"The format used to store user images"}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"jpg"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"userImageQuality"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"The quality setting for images if JPG format is used."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"70"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"userImageGenerator"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Generator used to produce default user images."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"-"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"userInfoCacheLifetime"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"The duration which user infos are cached locally in the server."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"1min"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"onUserWillBeCreated"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Called when a user is about to be created, gives a chance to abort the creation by returning false."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"-"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"onUserCreated"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Called after a user has been created. Listen to this callback if you need to do additional setup."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"-"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"onUserUpdated"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Called whenever a user has been updated. This can be when the user name is changed or if the user uploads a new profile picture."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"-"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"sendPasswordResetEmail"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Called when a user should be sent a reset code by email."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"-"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"sendValidationEmail"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Called when a user should be sent a validation code on account setup."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"-"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"validationCodeLength"})}),(0,s.jsxs)(t.td,{style:{textAlign:"left"},children:["The length of the validation code used in the authentication process. This value determines the number of digits in the validation code. Setting this value to ",(0,s.jsx)(t.strong,{children:"less than 3 reduces security."})]}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"8"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"passwordResetExpirationTime"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"The time for password resets to be valid."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"24h"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"extraSaltyHash"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"True if the server should use the accounts email address as part of the salt when storing password hashes (strongly recommended)."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"true"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"firebaseServiceAccountKeyJson"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"Firebase service account key JSON file. Generate and download from the Firebase console."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"-"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"maxPasswordLength"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"The maximum length of passwords when signing up with email."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"128"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"minPasswordLength"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"The minimum length of passwords when signing up with email."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"8"})]}),(0,s.jsxs)(t.tr,{children:[(0,s.jsx)(t.td,{style:{textAlign:"left"},children:(0,s.jsx)(t.strong,{children:"allowUnsecureRandom"})}),(0,s.jsx)(t.td,{style:{textAlign:"left"},children:"True if unsecure random number generation is allowed. If set to false, an error will be thrown if the platform does not support secure random number generation."}),(0,s.jsx)(t.td,{style:{textAlign:"center"},children:"false"})]})]})]}),"\n",(0,s.jsx)(t.h2,{id:"client-setup",children:"Client setup"}),"\n",(0,s.jsxs)(t.p,{children:["Add the auth client in your client project's ",(0,s.jsx)(t.code,{children:"pubspec.yaml"}),"."]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-yaml",children:"dependencies:\n ...\n serverpod_auth_client: ^1.x.x\n"})}),"\n",(0,s.jsx)(t.h2,{id:"app-setup",children:"App setup"}),"\n",(0,s.jsxs)(t.p,{children:["First, add dependencies to your app's ",(0,s.jsx)(t.code,{children:"pubspec.yaml"})," file for the methods of signing in that you want to support."]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-yaml",children:"dependencies:\n flutter:\n sdk: flutter\n serverpod_flutter: ^1.x.x\n auth_example_client:\n path: ../auth_example_client\n \n serverpod_auth_shared_flutter: ^1.x.x\n"})}),"\n",(0,s.jsxs)(t.p,{children:["Next, you need to set up a ",(0,s.jsx)(t.code,{children:"SessionManager"}),", which keeps track of the user's state. It will also handle the authentication keys passed to the client from the server, upload user profile images, etc."]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-dart",children:"late SessionManager sessionManager;\nlate Client client;\n\nvoid main() async {\n // Need to call this as we are using Flutter bindings before runApp is called.\n WidgetsFlutterBinding.ensureInitialized();\n\n // The android emulator does not have access to the localhost of the machine.\n // const ipAddress = '10.0.2.2'; // Android emulator ip for the host\n\n // On a real device replace the ipAddress with the IP address of your computer.\n const ipAddress = 'localhost';\n\n // Sets up a singleton client object that can be used to talk to the server from\n // anywhere in our app. The client is generated from your server code.\n // The client is set up to connect to a Serverpod running on a local server on\n // the default port. You will need to modify this to connect to staging or\n // production servers.\n client = Client(\n 'http://$ipAddress:8080/',\n authenticationKeyManager: FlutterAuthenticationKeyManager(),\n )..connectivityMonitor = FlutterConnectivityMonitor();\n\n // The session manager keeps track of the signed-in state of the user. You\n // can query it to see if the user is currently signed in and get information\n // about the user.\n sessionManager = SessionManager(\n caller: client.modules.auth,\n );\n await sessionManager.initialize();\n\n runApp(MyApp());\n}\n"})}),"\n",(0,s.jsxs)(t.p,{children:["The ",(0,s.jsx)(t.code,{children:"SessionManager"})," has useful methods for viewing and monitoring the user's current state:"]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["The ",(0,s.jsx)(t.code,{children:"signedInUser"})," will return a ",(0,s.jsx)(t.code,{children:"UserInfo"})," if the user is currently signed in (or ",(0,s.jsx)(t.code,{children:"null"})," if the user isn't signed in)."]}),"\n",(0,s.jsxs)(t.li,{children:["Use the ",(0,s.jsx)(t.code,{children:"addListener"})," method to get notified of changes to the user's signed in state."]}),"\n",(0,s.jsxs)(t.li,{children:["Sign out a user by calling the ",(0,s.jsx)(t.code,{children:"signOut"})," method."]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["For example it can be useful to subscribe to changes in the ",(0,s.jsx)(t.code,{children:"SessionManager"})," and force a rerender of your app."]}),"\n",(0,s.jsx)(t.pre,{children:(0,s.jsx)(t.code,{className:"language-dart",children:"@override\nvoid initState() {\n super.initState();\n\n // Rebuild the page if signed in status changes.\n sessionManager.addListener(() {\n setState(() {});\n });\n}\n"})})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},28453:(e,t,n)=>{n.d(t,{R:()=>l,x:()=>d});var s=n(96540);const i={},r=s.createContext(i);function l(e){const t=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/5144cf5e.b2beda30.js b/docs/assets/js/5144cf5e.b2beda30.js deleted file mode 100644 index 73a99b77b..000000000 --- a/docs/assets/js/5144cf5e.b2beda30.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkserverpod_docs=self.webpackChunkserverpod_docs||[]).push([[58800],{83698:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>a,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>c,toc:()=>d});var t=s(74848),o=s(28453);const i={},r="The basics",c={id:"concepts/authentication/basics",title:"The basics",description:"Serverpod automatically checks if the user is logged in and if the user has the right privileges to access the endpoint. When using the serverpod_auth module you will not have to worry about keeping track of tokens, refreshing them or, even including them in requests as this all happens automatically under the hood.",source:"@site/docs/06-concepts/11-authentication/02-basics.md",sourceDirName:"06-concepts/11-authentication",slug:"/concepts/authentication/basics",permalink:"/next/concepts/authentication/basics",draft:!1,unlisted:!1,editUrl:"https://github.com/serverpod/serverpod_docs/tree/main/docs/06-concepts/11-authentication/02-basics.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Setup",permalink:"/next/concepts/authentication/setup"},next:{title:"Working with users",permalink:"/next/concepts/authentication/working-with-users"}},a={},d=[{value:"Requiring authentication on endpoints",id:"requiring-authentication-on-endpoints",level:2},{value:"Authorization on endpoints",id:"authorization-on-endpoints",level:2},{value:"Managing scopes",id:"managing-scopes",level:3},{value:"Custom scopes",id:"custom-scopes",level:3}];function u(e){const n={admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"the-basics",children:"The basics"})}),"\n",(0,t.jsxs)(n.p,{children:["Serverpod automatically checks if the user is logged in and if the user has the right privileges to access the endpoint. When using the ",(0,t.jsx)(n.code,{children:"serverpod_auth"})," module you will not have to worry about keeping track of tokens, refreshing them or, even including them in requests as this all happens automatically under the hood."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"Session"})," object provides information about the current user. A unique ",(0,t.jsx)(n.code,{children:"userId"})," identifies a user. You should use this id whenever you a referring to a user. Access the id of a signed-in user through the ",(0,t.jsx)(n.code,{children:"auth"})," field of the ",(0,t.jsx)(n.code,{children:"Session"})," object."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-dart",children:"Future myMethod(Session session) async {\n var userId = await session.auth.authenticatedUserId;\n ...\n}\n"})}),"\n",(0,t.jsx)(n.p,{children:"You can also use the Session object to check if a user is authenticated:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-dart",children:"Future myMethod(Session session) async {\n var isSignedIn = await session.isUserSignedIn;\n ...\n}\n"})}),"\n",(0,t.jsx)(n.h2,{id:"requiring-authentication-on-endpoints",children:"Requiring authentication on endpoints"}),"\n",(0,t.jsxs)(n.p,{children:["It is common to want to restrict access to an endpoint to users that have signed in. You can do this by overriding the ",(0,t.jsx)(n.code,{children:"requireLogin"})," property of the ",(0,t.jsx)(n.code,{children:"Endpoint"})," class."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-dart",children:"class MyEndpoint extends Endpoint {\n @override\n bool get requireLogin => true;\n\n Future myMethod(Session session) async {\n ...\n }\n ...\n}\n"})}),"\n",(0,t.jsx)(n.h2,{id:"authorization-on-endpoints",children:"Authorization on endpoints"}),"\n",(0,t.jsxs)(n.p,{children:["Serverpod also supports scopes for restricting access. One or more scopes can be associated with a user. For instance, this can be used to give admin access to a specific user. To restrict access for an endpoint, override the ",(0,t.jsx)(n.code,{children:"requiredScopes"})," property. Note that setting ",(0,t.jsx)(n.code,{children:"requiredScopes"})," implicitly sets ",(0,t.jsx)(n.code,{children:"requireLogin"})," to true."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-dart",children:"class MyEndpoint extends Endpoint {\n @override\n bool get requireLogin => true;\n\n @override\n Set get requiredScopes => {Scope.admin};\n\n Future myMethod(Session session) async {\n ...\n }\n ...\n}\n"})}),"\n",(0,t.jsx)(n.h3,{id:"managing-scopes",children:"Managing scopes"}),"\n",(0,t.jsxs)(n.p,{children:["New users are created without any scopes. To update a user's scopes, use the ",(0,t.jsx)(n.code,{children:"Users"})," class's ",(0,t.jsx)(n.code,{children:"updateUserScopes"})," method (requires the ",(0,t.jsx)(n.code,{children:"serverpod_auth_server"})," package). This method replaces all previously stored scopes."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-dart",children:"await Users.updateUserScopes(session, userId, {Scope.admin});\n"})}),"\n",(0,t.jsx)(n.h3,{id:"custom-scopes",children:"Custom scopes"}),"\n",(0,t.jsx)(n.p,{children:"You may need more granular access control for specific endpoints. To create custom scopes, extend the Scope class, as shown below:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-dart",children:"class CustomScope extends Scope {\n const CustomScope(String name) : super(name);\n\n static const userRead = CustomScope('userRead');\n static const userWrite = CustomScope('userWrite');\n}\n"})}),"\n",(0,t.jsx)(n.p,{children:"Then use the custom scopes like this:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-dart",children:"class MyEndpoint extends Endpoint {\n @override\n bool get requireLogin => true;\n\n @override\n Set get requiredScopes => {CustomScope.userRead, CustomScope.userWrite};\n\n Future myMethod(Session session) async {\n ...\n }\n ...\n}\n"})}),"\n",(0,t.jsx)(n.admonition,{type:"caution",children:(0,t.jsx)(n.p,{children:"Keep in mind that a scope is merely an arbitrary string and can be written in any format you prefer. However, it's crucial to use unique strings for each scope, as duplicated scope strings may lead to unintentional data exposure."})})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},28453:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>c});var t=s(96540);const o={},i=t.createContext(o);function r(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/5144cf5e.e98ceb1d.js b/docs/assets/js/5144cf5e.e98ceb1d.js new file mode 100644 index 000000000..63101d0db --- /dev/null +++ b/docs/assets/js/5144cf5e.e98ceb1d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkserverpod_docs=self.webpackChunkserverpod_docs||[]).push([[58800],{83698:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>d});var t=s(74848),i=s(28453);const o={},r="The basics",a={id:"concepts/authentication/basics",title:"The basics",description:"Serverpod automatically checks if the user is logged in and if the user has the right privileges to access the endpoint. When using the serverpod_auth module you will not have to worry about keeping track of tokens, refreshing them or, even including them in requests as this all happens automatically under the hood.",source:"@site/docs/06-concepts/11-authentication/02-basics.md",sourceDirName:"06-concepts/11-authentication",slug:"/concepts/authentication/basics",permalink:"/next/concepts/authentication/basics",draft:!1,unlisted:!1,editUrl:"https://github.com/serverpod/serverpod_docs/tree/main/docs/06-concepts/11-authentication/02-basics.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Setup",permalink:"/next/concepts/authentication/setup"},next:{title:"Working with users",permalink:"/next/concepts/authentication/working-with-users"}},c={},d=[{value:"Requiring authentication on endpoints",id:"requiring-authentication-on-endpoints",level:2},{value:"Authorization on endpoints",id:"authorization-on-endpoints",level:2},{value:"Managing scopes",id:"managing-scopes",level:3},{value:"Custom scopes",id:"custom-scopes",level:3},{value:"User authentication",id:"user-authentication",level:2},{value:"Sign out device",id:"sign-out-device",level:4},{value:"Sign out all devices",id:"sign-out-all-devices",level:4}];function u(e){const n={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",mdxAdmonitionTitle:"mdxAdmonitionTitle",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"the-basics",children:"The basics"})}),"\n",(0,t.jsxs)(n.p,{children:["Serverpod automatically checks if the user is logged in and if the user has the right privileges to access the endpoint. When using the ",(0,t.jsx)(n.code,{children:"serverpod_auth"})," module you will not have to worry about keeping track of tokens, refreshing them or, even including them in requests as this all happens automatically under the hood."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"Session"})," object provides information about the current user. A unique ",(0,t.jsx)(n.code,{children:"userId"})," identifies a user. You should use this id whenever you a referring to a user. Access the id of a signed-in user through the ",(0,t.jsx)(n.code,{children:"authenticated"})," field of the ",(0,t.jsx)(n.code,{children:"Session"})," object."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-dart",children:"Future myMethod(Session session) async {\n var userId = (await session.authenticated)?.userId;\n ...\n}\n"})}),"\n",(0,t.jsx)(n.p,{children:"You can also use the Session object to check if a user is authenticated:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-dart",children:"Future myMethod(Session session) async {\n var isSignedIn = await session.isUserSignedIn;\n ...\n}\n"})}),"\n",(0,t.jsx)(n.h2,{id:"requiring-authentication-on-endpoints",children:"Requiring authentication on endpoints"}),"\n",(0,t.jsxs)(n.p,{children:["It is common to want to restrict access to an endpoint to users that have signed in. You can do this by overriding the ",(0,t.jsx)(n.code,{children:"requireLogin"})," property of the ",(0,t.jsx)(n.code,{children:"Endpoint"})," class."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-dart",children:"class MyEndpoint extends Endpoint {\n @override\n bool get requireLogin => true;\n\n Future myMethod(Session session) async {\n ...\n }\n ...\n}\n"})}),"\n",(0,t.jsx)(n.h2,{id:"authorization-on-endpoints",children:"Authorization on endpoints"}),"\n",(0,t.jsxs)(n.p,{children:["Serverpod also supports scopes for restricting access. One or more scopes can be associated with a user. For instance, this can be used to give admin access to a specific user. To restrict access for an endpoint, override the ",(0,t.jsx)(n.code,{children:"requiredScopes"})," property. Note that setting ",(0,t.jsx)(n.code,{children:"requiredScopes"})," implicitly sets ",(0,t.jsx)(n.code,{children:"requireLogin"})," to true."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-dart",children:"class MyEndpoint extends Endpoint {\n @override\n bool get requireLogin => true;\n\n @override\n Set get requiredScopes => {Scope.admin};\n\n Future myMethod(Session session) async {\n ...\n }\n ...\n}\n"})}),"\n",(0,t.jsx)(n.h3,{id:"managing-scopes",children:"Managing scopes"}),"\n",(0,t.jsxs)(n.p,{children:["New users are created without any scopes. To update a user's scopes, use the ",(0,t.jsx)(n.code,{children:"Users"})," class's ",(0,t.jsx)(n.code,{children:"updateUserScopes"})," method (requires the ",(0,t.jsx)(n.code,{children:"serverpod_auth_server"})," package). This method replaces all previously stored scopes."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-dart",children:"await Users.updateUserScopes(session, userId, {Scope.admin});\n"})}),"\n",(0,t.jsx)(n.h3,{id:"custom-scopes",children:"Custom scopes"}),"\n",(0,t.jsx)(n.p,{children:"You may need more granular access control for specific endpoints. To create custom scopes, extend the Scope class, as shown below:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-dart",children:"class CustomScope extends Scope {\n const CustomScope(String name) : super(name);\n\n static const userRead = CustomScope('userRead');\n static const userWrite = CustomScope('userWrite');\n}\n"})}),"\n",(0,t.jsx)(n.p,{children:"Then use the custom scopes like this:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-dart",children:"class MyEndpoint extends Endpoint {\n @override\n bool get requireLogin => true;\n\n @override\n Set get requiredScopes => {CustomScope.userRead, CustomScope.userWrite};\n\n Future myMethod(Session session) async {\n ...\n }\n ...\n}\n"})}),"\n",(0,t.jsx)(n.admonition,{type:"caution",children:(0,t.jsx)(n.p,{children:"Keep in mind that a scope is merely an arbitrary string and can be written in any format you prefer. However, it's crucial to use unique strings for each scope, as duplicated scope strings may lead to unintentional data exposure."})}),"\n",(0,t.jsx)(n.h2,{id:"user-authentication",children:"User authentication"}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"StatusEndpoint"})," class includes methods for handling user sign-outs, whether from a single device or all devices."]}),"\n",(0,t.jsxs)(n.admonition,{type:"info",children:[(0,t.jsxs)(n.p,{children:["In addition to the ",(0,t.jsx)(n.code,{children:"StatusEndpoint"})," methods, Serverpod provides more comprehensive tools for managing user authentication and sign-out processes across multiple devices."]}),(0,t.jsxs)(n.p,{children:["For more detailed information on managing and revoking authentication keys, please refer to the ",(0,t.jsx)(n.a,{href:"providers/custom-providers#revoking-authentication-keys",children:"Revoking authentication keys"})," section."]})]}),"\n",(0,t.jsx)(n.h4,{id:"sign-out-device",children:"Sign out device"}),"\n",(0,t.jsx)(n.p,{children:"To sign out a single device:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-dart",children:"await client.modules.auth.status.signOutDevice();\n"})}),"\n",(0,t.jsx)(n.p,{children:"This status endpoint method obtains the authentication key from session's authentication information, then revokes that key."}),"\n",(0,t.jsx)(n.h4,{id:"sign-out-all-devices",children:"Sign out all devices"}),"\n",(0,t.jsx)(n.p,{children:"To sign the user out across all devices:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-dart",children:"await client.modules.auth.status.signOutAllDevices();\n"})}),"\n",(0,t.jsx)(n.p,{children:"This status endpoint retrieves the user ID from session's authentication information, then revokes all authentication keys related to that user."}),"\n",(0,t.jsxs)(n.admonition,{type:"info",children:[(0,t.jsx)(n.mdxAdmonitionTitle,{}),(0,t.jsx)("span",{id:"deprecated-signout-endpoint"}),(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"signOut"})," status endpoint is deprecated. Use ",(0,t.jsx)(n.code,{children:"signOutDevice"})," or ",(0,t.jsx)(n.code,{children:"signOutAllDevices"})," instead."]}),(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-dart",children:"await client.modules.auth.status.signOut(); // Deprecated\n"})}),(0,t.jsxs)(n.p,{children:["The behavior of ",(0,t.jsx)(n.code,{children:"signOut"})," is controlled by ",(0,t.jsx)(n.code,{children:"legacyUserSignOutBehavior"}),", which you can adjust in the ",(0,t.jsx)(n.a,{href:"setup#configure-authentication",children:"configure authentication"})," section. This allows you to control the signout behaviour of already shipped clients."]})]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},28453:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>a});var t=s(96540);const i={},o=t.createContext(i);function r(e){const n=t.useContext(o);return t.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(i):e.components||i:r(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/cd64d641.bed1a1d3.js b/docs/assets/js/cd64d641.bed1a1d3.js new file mode 100644 index 000000000..5d272379b --- /dev/null +++ b/docs/assets/js/cd64d641.bed1a1d3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkserverpod_docs=self.webpackChunkserverpod_docs||[]).push([[92687],{64419:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>r,metadata:()=>o,toc:()=>d});var s=t(74848),i=t(28453);const r={},a="Custom providers",o={id:"concepts/authentication/providers/custom-providers",title:"Custom providers",description:"Serverpod's authentication module makes it easy to implement custom authentication providers. This allows you to leverage all the existing providers supplied by the module along with the specific providers your project requires.",source:"@site/docs/06-concepts/11-authentication/04-providers/06-custom-providers.md",sourceDirName:"06-concepts/11-authentication/04-providers",slug:"/concepts/authentication/providers/custom-providers",permalink:"/next/concepts/authentication/providers/custom-providers",draft:!1,unlisted:!1,editUrl:"https://github.com/serverpod/serverpod_docs/tree/main/docs/06-concepts/11-authentication/04-providers/06-custom-providers.md",tags:[],version:"current",sidebarPosition:6,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Firebase",permalink:"/next/concepts/authentication/providers/firebase"},next:{title:"Custom overrides",permalink:"/next/concepts/authentication/custom-overrides"}},c={},d=[{value:"Server setup",id:"server-setup",level:2},{value:"Connect user",id:"connect-user",level:3},{value:"Custom identification methods",id:"custom-identification-methods",level:3},{value:"Create auth token",id:"create-auth-token",level:3},{value:"Send auth token to client",id:"send-auth-token-to-client",level:3},{value:"Revoking authentication keys",id:"revoking-authentication-keys",level:3},{value:"Revoking specific keys",id:"revoking-specific-keys",level:4},{value:"Fetching and revoking an authentication key using AuthenticationInfo",id:"fetching-and-revoking-an-authentication-key-using-authenticationinfo",level:5},{value:"Fetching and revoking a specific authentication key for a user",id:"fetching-and-revoking-a-specific-authentication-key-for-a-user",level:5},{value:"Removing specific tokens (direct deletion)",id:"removing-specific-tokens-direct-deletion",level:5},{value:"Signing out all devices",id:"signing-out-all-devices",level:4},{value:"Signing out a specific user",id:"signing-out-a-specific-user",level:5},{value:"Signing out the currently authenticated user",id:"signing-out-the-currently-authenticated-user",level:5},{value:"Creating a logout endpoint",id:"creating-a-logout-endpoint",level:4},{value:"Client setup",id:"client-setup",level:2}];function h(e){const n={admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"custom-providers",children:"Custom providers"})}),"\n",(0,s.jsx)(n.p,{children:"Serverpod's authentication module makes it easy to implement custom authentication providers. This allows you to leverage all the existing providers supplied by the module along with the specific providers your project requires."}),"\n",(0,s.jsx)(n.h2,{id:"server-setup",children:"Server setup"}),"\n",(0,s.jsx)(n.p,{children:"After successfully authenticating a user through a customer provider, an auth token can be created and connected to the user to preserve the authenticated user's permissions. This token is used to identify the user and facilitate endpoint authorization validation. The token can be removed when the user signs out to prevent further access."}),"\n",(0,s.jsx)(n.h3,{id:"connect-user",children:"Connect user"}),"\n",(0,s.jsx)(n.p,{children:"The authentication module provides methods to find or create users. This ensures that all authentication tokens from the same user are connected."}),"\n",(0,s.jsxs)(n.p,{children:["Users can be identified either by their email through the ",(0,s.jsx)(n.code,{children:"Users.findUserByEmail(...)"})," method or by a unique identifier through the ",(0,s.jsx)(n.code,{children:"Users.findUserByIdentifier(...)"})," method."]}),"\n",(0,s.jsxs)(n.p,{children:["If no user is found, a new user can be created through the ",(0,s.jsx)(n.code,{children:"Users.createUser(...)"})," method."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-dart",children:"UserInfo? userInfo;\nuserInfo = await Users.findUserByEmail(session, email);\nuserInfo ??= await Users.findUserByIdentifier(session, userIdentifier);\nif (userInfo == null) {\n userInfo = UserInfo(\n userIdentifier: userIdentifier,\n userName: name,\n email: email,\n blocked: false,\n created: DateTime.now().toUtc(),\n scopeNames: [],\n );\n userInfo = await Users.createUser(session, userInfo, _authMethod);\n}\n"})}),"\n",(0,s.jsx)(n.p,{children:"The example above tries to find a user by email and user identifier. If no user is found, a new user is created with the provided information."}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsxs)(n.p,{children:["For many authentication platforms the ",(0,s.jsx)(n.code,{children:"userIdentifier"})," is the user's email, but it can also be another unique identifier such as a phone number or a social security number."]})}),"\n",(0,s.jsx)(n.h3,{id:"custom-identification-methods",children:"Custom identification methods"}),"\n",(0,s.jsxs)(n.p,{children:["If other identification methods are required you can easily implement them by accessing the database directly. The ",(0,s.jsx)(n.code,{children:"UserInfo"})," model can be interacted with in the same way as any other model with a database in Serverpod."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-dart",children:"var userInfo = await UserInfo.db.findFirstRow(\n session,\n where: (t) => t.fullName.equals(name),\n);\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The example above shows how to find a user by name using the ",(0,s.jsx)(n.code,{children:"UserInfo"})," model."]}),"\n",(0,s.jsx)(n.h3,{id:"create-auth-token",children:"Create auth token"}),"\n",(0,s.jsx)(n.p,{children:"When a user has been found or created, an auth token that is connected to the user should be created."}),"\n",(0,s.jsxs)(n.p,{children:["To create an auth token, call the ",(0,s.jsx)(n.code,{children:"signInUser"})," method in the ",(0,s.jsx)(n.code,{children:"UserAuthentication"})," class, accessible as a static method, e.g. ",(0,s.jsx)(n.code,{children:"UserAuthentication.signInUser"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"signInUser"})," method takes four arguments: the first is the session object, the second is the user ID, the third is information about the method of authentication, and the fourth is a set of scopes granted to the auth token."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-dart",children:"var authToken = await UserAuthentication.signInUser(userInfo.id, 'myAuthMethod', scopes: {\n Scope('delete'),\n Scope('create'),\n});\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The example above creates an auth token for a user with the unique identifier taken from the ",(0,s.jsx)(n.code,{children:"userInfo"}),". The auth token preserves that it was created using the method ",(0,s.jsx)(n.code,{children:"myAuthMethod"})," and has the scopes ",(0,s.jsx)(n.code,{children:"delete"})," and ",(0,s.jsx)(n.code,{children:"create"}),"."]}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsx)(n.p,{children:"The unique identifier for the user should uniquely identify the user regardless of authentication method. The information allows authentication tokens associated with the same user to be grouped."})}),"\n",(0,s.jsx)(n.h3,{id:"send-auth-token-to-client",children:"Send auth token to client"}),"\n",(0,s.jsxs)(n.p,{children:["Once the auth token is created, it should be sent to the client. We recommend doing this using an ",(0,s.jsx)(n.code,{children:"AuthenticationResponse"}),". This ensures compatibility with the client-side authentication module."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-dart",children:"class MyAuthenticationEndpoint extends Endpoint {\n Future login(\n Session session,\n String username,\n String password,\n ) async {\n // Authenticates a user with email and password.\n if (!authenticateUser(session, username, password)) {\n return AuthenticationResponse(success: false);\n }\n\n // Finds or creates a user in the database using the User methods.\n var userInfo = findOrCreateUser(session, username);\n\n // Creates an authentication key for the user.\n var authToken = await UserAuthentication.signInUser(\n session,\n userInfo.id!,\n 'myAuth',\n scopes: {},\n );\n\n // Returns the authentication response.\n return AuthenticationResponse(\n success: true,\n keyId: authToken.id,\n key: authToken.key,\n userInfo: userInfo,\n );\n }\n}\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The example above shows how to create an ",(0,s.jsx)(n.code,{children:"AuthenticationResponse"})," with the auth token and user information."]}),"\n",(0,s.jsx)(n.h3,{id:"revoking-authentication-keys",children:"Revoking authentication keys"}),"\n",(0,s.jsxs)(n.p,{children:["Serverpod provides built-in methods for managing user authentication across multiple devices. These methods handle several critical security and state management processes automatically, ensuring consistent and secure authentication state across your servers. When using the authentication management methods (",(0,s.jsx)(n.code,{children:"signOutUser"})," or ",(0,s.jsx)(n.code,{children:"revokeAuthKey"}),"), the following key actions are automatically handled:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Closing all affected method streaming connections to maintain connection integrity."}),"\n",(0,s.jsx)(n.li,{children:"Synchronizing authentication state across all connected servers."}),"\n",(0,s.jsxs)(n.li,{children:["Updating the session's authentication state with ",(0,s.jsx)(n.code,{children:"session.updateAuthenticated(null)"})," if the affected user is currently authenticated."]}),"\n"]}),"\n",(0,s.jsx)(n.h4,{id:"revoking-specific-keys",children:"Revoking specific keys"}),"\n",(0,s.jsxs)(n.p,{children:["To revoke specific authentication keys, use the ",(0,s.jsx)(n.code,{children:"revokeAuthKey"})," method:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-dart",children:"await UserAuthentication.revokeAuthKey(\n session,\n authKeyId: 'auth-key-id-here',\n);\n"})}),"\n",(0,s.jsx)(n.h5,{id:"fetching-and-revoking-an-authentication-key-using-authenticationinfo",children:"Fetching and revoking an authentication key using AuthenticationInfo"}),"\n",(0,s.jsxs)(n.p,{children:["To revoke a specific authentication key for the current session, you can directly access the session's authentication information and call the ",(0,s.jsx)(n.code,{children:"revokeAuthKey"})," method:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-dart",children:"// Fetch the authentication information for the current session\nvar authId = (await session.authenticated)?.authId;\n\n// Revoke the authentication key if the session is authenticated and has an authId\nif (authId != null) {\n await UserAuthentication.revokeAuthKey(\n session,\n authKeyId: authId,\n );\n}\n"})}),"\n",(0,s.jsx)(n.h5,{id:"fetching-and-revoking-a-specific-authentication-key-for-a-user",children:"Fetching and revoking a specific authentication key for a user"}),"\n",(0,s.jsx)(n.p,{children:"To revoke a specific authentication key associated with a user, you can retrieve all authentication keys for that user and select the key you wish to revoke:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-dart",children:"// Fetch all authentication keys for the user\nvar authKeys = await AuthKey.db.find(\n session,\n where: (t) => t.userId.equals(userId),\n);\n\n// Revoke a specific key (for example, the last one)\nif (authKeys.isNotEmpty) {\n var authKeyId = authKeys.last.id.toString(); // Convert the ID to string\n await UserAuthentication.revokeAuthKey(\n session,\n authKeyId: authKeyId,\n );\n}\n"})}),"\n",(0,s.jsx)(n.h5,{id:"removing-specific-tokens-direct-deletion",children:"Removing specific tokens (direct deletion)"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-dart",children:"await AuthKey.db.deleteWhere(\n session,\n where: (t) => t.userId.equals(userId) & t.method.equals('username'),\n);\n"})}),"\n",(0,s.jsx)(n.admonition,{type:"warning",children:(0,s.jsxs)(n.p,{children:["Directly removing authentication tokens from the ",(0,s.jsx)(n.code,{children:"AuthKey"})," table bypasses necessary processes such as closing method streaming connections and synchronizing servers state. It is strongly recommended to use ",(0,s.jsx)(n.code,{children:"UserAuthentication.revokeAuthKey"})," to ensure a complete and consistent sign-out."]})}),"\n",(0,s.jsx)(n.h4,{id:"signing-out-all-devices",children:"Signing out all devices"}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"signOutUser"})," method signs a user out from all devices:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-dart",children:"await UserAuthentication.signOutUser(\n session,\n userId: 123, // Optional: If omitted, the currently authenticated user will be signed out\n);\n"})}),"\n",(0,s.jsx)(n.p,{children:"This method deletes all authentication keys associated with the user."}),"\n",(0,s.jsx)(n.h5,{id:"signing-out-a-specific-user",children:"Signing out a specific user"}),"\n",(0,s.jsxs)(n.p,{children:["In this example, a specific ",(0,s.jsx)(n.code,{children:"userId"})," is provided to sign out that user from all their devices:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-dart",children:"// Sign out the user with ID 123 from all devices\nawait UserAuthentication.signOutUser(\n session,\n userId: 123,\n);\n"})}),"\n",(0,s.jsx)(n.h5,{id:"signing-out-the-currently-authenticated-user",children:"Signing out the currently authenticated user"}),"\n",(0,s.jsxs)(n.p,{children:["If no ",(0,s.jsx)(n.code,{children:"userId"})," is provided, ",(0,s.jsx)(n.code,{children:"signOutUser"})," will automatically sign out the user who is currently authenticated in the session:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-dart",children:"// Sign out the currently authenticated user\nawait UserAuthentication.signOutUser(\n session, // No userId provided, signs out the current user\n);\n"})}),"\n",(0,s.jsx)(n.h4,{id:"creating-a-logout-endpoint",children:"Creating a logout endpoint"}),"\n",(0,s.jsxs)(n.p,{children:["To sign out a user on all devices using an endpoint, the ",(0,s.jsx)(n.code,{children:"signOutUser"})," method in the ",(0,s.jsx)(n.code,{children:"UserAuthentication"})," class can be used:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-dart",children:"class AuthenticatedEndpoint extends Endpoint {\n @override\n bool get requireLogin => true;\n\n Future logout(Session session) async {\n await UserAuthentication.signOutUser(session);\n }\n}\n"})}),"\n",(0,s.jsx)(n.h2,{id:"client-setup",children:"Client setup"}),"\n",(0,s.jsxs)(n.p,{children:["The client must store and include the auth token in communication with the server. Luckily, the client-side authentication module handles this for you through the ",(0,s.jsx)(n.code,{children:"SessionManager"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"The session manager is responsible for storing the auth token and user information. It is initialized on client startup and will restore any existing user session from local storage."}),"\n",(0,s.jsxs)(n.p,{children:["After a successful authentication where an authentication response is returned from the server, the user should be registered in the session manager through the ",(0,s.jsx)(n.code,{children:"sessionManager.registerSignedInUser(...)"})," method. The session manager singleton is accessible by calling ",(0,s.jsx)(n.code,{children:"SessionManager.instance"}),"."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-dart",children:"var serverResponse = await caller.myAuthentication.login(username, password);\n\nif (serverResponse.success) {\n // Store the user info in the session manager.\n SessionManager sessionManager = await SessionManager.instance;\n await sessionManager.registerSignedInUser(\n serverResponse.userInfo!,\n serverResponse.keyId!,\n serverResponse.key!,\n );\n}\n"})}),"\n",(0,s.jsx)(n.p,{children:"The example above shows how to register a signed-in user in the session manager."})]})}function u(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>o});var s=t(96540);const i={},r=s.createContext(i);function a(e){const n=s.useContext(r);return s.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:a(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/cd64d641.c63cd876.js b/docs/assets/js/cd64d641.c63cd876.js deleted file mode 100644 index 28ca8d1d7..000000000 --- a/docs/assets/js/cd64d641.c63cd876.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkserverpod_docs=self.webpackChunkserverpod_docs||[]).push([[92687],{64419:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>u,frontMatter:()=>r,metadata:()=>a,toc:()=>h});var s=t(74848),i=t(28453);const r={},o="Custom providers",a={id:"concepts/authentication/providers/custom-providers",title:"Custom providers",description:"Serverpod's authentication module makes it easy to implement custom authentication providers. This allows you to leverage all the existing providers supplied by the module along with the specific providers your project requires.",source:"@site/docs/06-concepts/11-authentication/04-providers/06-custom-providers.md",sourceDirName:"06-concepts/11-authentication/04-providers",slug:"/concepts/authentication/providers/custom-providers",permalink:"/next/concepts/authentication/providers/custom-providers",draft:!1,unlisted:!1,editUrl:"https://github.com/serverpod/serverpod_docs/tree/main/docs/06-concepts/11-authentication/04-providers/06-custom-providers.md",tags:[],version:"current",sidebarPosition:6,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Firebase",permalink:"/next/concepts/authentication/providers/firebase"},next:{title:"Custom overrides",permalink:"/next/concepts/authentication/custom-overrides"}},d={},h=[{value:"Server setup",id:"server-setup",level:2},{value:"Connect user",id:"connect-user",level:3},{value:"Custom identification methods",id:"custom-identification-methods",level:3},{value:"Create auth token",id:"create-auth-token",level:3},{value:"Send auth token to client",id:"send-auth-token-to-client",level:3},{value:"Remove auth token",id:"remove-auth-token",level:3},{value:"Remove specific tokens",id:"remove-specific-tokens",level:4},{value:"Client setup",id:"client-setup",level:2}];function c(e){const n={admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"custom-providers",children:"Custom providers"})}),"\n",(0,s.jsx)(n.p,{children:"Serverpod's authentication module makes it easy to implement custom authentication providers. This allows you to leverage all the existing providers supplied by the module along with the specific providers your project requires."}),"\n",(0,s.jsx)(n.h2,{id:"server-setup",children:"Server setup"}),"\n",(0,s.jsx)(n.p,{children:"After successfully authenticating a user through a customer provider, an auth token can be created and connected to the user to preserve the authenticated user's permissions. This token is used to identify the user and facilitate endpoint authorization validation. The token can be removed when the user signs out to prevent further access."}),"\n",(0,s.jsx)(n.h3,{id:"connect-user",children:"Connect user"}),"\n",(0,s.jsx)(n.p,{children:"The authentication module provides methods to find or create users. This ensures that all authentication tokens from the same user are connected."}),"\n",(0,s.jsxs)(n.p,{children:["Users can be identified either by their email through the ",(0,s.jsx)(n.code,{children:"Users.findUserByEmail(...)"})," method or by a unique identifier through the ",(0,s.jsx)(n.code,{children:"Users.findUserByIdentifier(...)"})," method."]}),"\n",(0,s.jsxs)(n.p,{children:["If no user is found, a new user can be created through the ",(0,s.jsx)(n.code,{children:"Users.createUser(...)"})," method."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-dart",children:"UserInfo? userInfo;\nuserInfo = await Users.findUserByEmail(session, email);\nuserInfo ??= await Users.findUserByIdentifier(session, userIdentifier);\nif (userInfo == null) {\n userInfo = UserInfo(\n userIdentifier: userIdentifier,\n userName: name,\n email: email,\n blocked: false,\n created: DateTime.now().toUtc(),\n scopeNames: [],\n );\n userInfo = await Users.createUser(session, userInfo, _authMethod);\n}\n"})}),"\n",(0,s.jsx)(n.p,{children:"The example above tries to find a user by email and user identifier. If no user is found, a new user is created with the provided information."}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsxs)(n.p,{children:["For many authentication platforms the ",(0,s.jsx)(n.code,{children:"userIdentifier"})," is the user's email, but it can also be another unique identifier such as a phone number or a social security number."]})}),"\n",(0,s.jsx)(n.h3,{id:"custom-identification-methods",children:"Custom identification methods"}),"\n",(0,s.jsxs)(n.p,{children:["If other identification methods are required you can easily implement them by accessing the database directly. The ",(0,s.jsx)(n.code,{children:"UserInfo"})," model can be interacted with in the same way as any other model with a database in Serverpod."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-dart",children:"var userInfo = await UserInfo.db.findFirstRow(\n session,\n where: (t) => t.fullName.equals(name),\n);\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The example above shows how to find a user by name using the ",(0,s.jsx)(n.code,{children:"UserInfo"})," model."]}),"\n",(0,s.jsx)(n.h3,{id:"create-auth-token",children:"Create auth token"}),"\n",(0,s.jsx)(n.p,{children:"When a user has been found or created, an auth token that is connected to the user should be created."}),"\n",(0,s.jsxs)(n.p,{children:["To create an auth token, call the ",(0,s.jsx)(n.code,{children:"signInUser"})," method in the ",(0,s.jsx)(n.code,{children:"UserAuthentication"})," class, accessible as a static method, e.g. ",(0,s.jsx)(n.code,{children:"UserAuthentication.signInUser"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"signInUser"})," method takes four arguments: the first is the session object, the second is the user ID, the third is information about the method of authentication, and the fourth is a set of scopes granted to the auth token."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-dart",children:"var authToken = await UserAuthentication.signInUser(userInfo.id, 'myAuthMethod', scopes: {\n Scope('delete'),\n Scope('create'),\n});\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The example above creates an auth token for a user with the unique identifier taken from the ",(0,s.jsx)(n.code,{children:"userInfo"}),". The auth token preserves that it was created using the method ",(0,s.jsx)(n.code,{children:"myAuthMethod"})," and has the scopes ",(0,s.jsx)(n.code,{children:"delete"})," and ",(0,s.jsx)(n.code,{children:"create"}),"."]}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsx)(n.p,{children:"The unique identifier for the user should uniquely identify the user regardless of authentication method. The information allows authentication tokens associated with the same user to be grouped."})}),"\n",(0,s.jsx)(n.h3,{id:"send-auth-token-to-client",children:"Send auth token to client"}),"\n",(0,s.jsxs)(n.p,{children:["Once the auth token is created, it should be sent to the client. We recommend doing this using an ",(0,s.jsx)(n.code,{children:"AuthenticationResponse"}),". This ensures compatibility with the client-side authentication module."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-dart",children:"class MyAuthenticationEndpoint extends Endpoint {\n Future login(\n Session session,\n String username,\n String password,\n ) async {\n // Authenticates a user with email and password.\n if (!authenticateUser(session, username, password)) {\n return AuthenticationResponse(success: false);\n }\n\n // Finds or creates a user in the database using the User methods.\n var userInfo = findOrCreateUser(session, username);\n\n // Creates an authentication key for the user.\n var authToken = await UserAuthentication.signInUser(\n session,\n userInfo.id!,\n 'myAuth',\n scopes: {},\n );\n\n // Returns the authentication response.\n return AuthenticationResponse(\n success: true,\n keyId: authToken.id,\n key: authToken.key,\n userInfo: userInfo,\n );\n }\n}\n"})}),"\n",(0,s.jsxs)(n.p,{children:["The example above shows how to create an ",(0,s.jsx)(n.code,{children:"AuthenticationResponse"})," with the auth token and user information."]}),"\n",(0,s.jsx)(n.h3,{id:"remove-auth-token",children:"Remove auth token"}),"\n",(0,s.jsxs)(n.p,{children:["Signing out a user on all devices is made simple with the ",(0,s.jsx)(n.code,{children:"signOutUser"})," method in the ",(0,s.jsx)(n.code,{children:"UserAuthentication"})," class. The method removes all auth tokens associated with the user."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-dart",children:"class AuthenticatedEndpoint extends Endpoint {\n @override\n bool get requireLogin => true;\n Future logout(Session session) async {\n await UserAuthentication.signOutUser(session);\n }\n}\n"})}),"\n",(0,s.jsxs)(n.p,{children:["In the above example, the ",(0,s.jsx)(n.code,{children:"logout"})," endpoint removes all auth tokens associated with the user. The user is then signed out and loses access to any protected endpoints."]}),"\n",(0,s.jsx)(n.h4,{id:"remove-specific-tokens",children:"Remove specific tokens"}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"AuthKey"})," table stores all auth tokens and can be interacted with in the same way as any other model with a database in Serverpod. To remove specific tokens, the ",(0,s.jsx)(n.code,{children:"AuthKey"})," table can be interacted with directly."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-dart",children:"await AuthKey.db.deleteWhere(\n session,\n where: (t) => t.userId.equals(userId) & t.method.equals('username'),\n);\n"})}),"\n",(0,s.jsxs)(n.p,{children:["In the above example, all auth tokens associated with the user ",(0,s.jsx)(n.code,{children:"userId"})," and created with the method ",(0,s.jsx)(n.code,{children:"username"})," are removed from the ",(0,s.jsx)(n.code,{children:"AuthKey"})," table."]}),"\n",(0,s.jsx)(n.h2,{id:"client-setup",children:"Client setup"}),"\n",(0,s.jsxs)(n.p,{children:["The client must store and include the auth token in communication with the server. Luckily, the client-side authentication module handles this for you through the ",(0,s.jsx)(n.code,{children:"SessionManager"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"The session manager is responsible for storing the auth token and user information. It is initialized on client startup and will restore any existing user session from local storage."}),"\n",(0,s.jsxs)(n.p,{children:["After a successful authentication where an authentication response is returned from the server, the user should be registered in the session manager through the ",(0,s.jsx)(n.code,{children:"sessionManager.registerSignedInUser(...)"})," method. The session manager singleton is accessible by calling ",(0,s.jsx)(n.code,{children:"SessionManager.instance"}),"."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-dart",children:"var serverResponse = await caller.myAuthentication.login(username, password);\n\nif (serverResponse.success) {\n // Store the user info in the session manager.\n SessionManager sessionManager = await SessionManager.instance;\n await sessionManager.registerSignedInUser(\n serverResponse.userInfo!,\n serverResponse.keyId!,\n serverResponse.key!,\n );\n}\n"})}),"\n",(0,s.jsx)(n.p,{children:"The example above shows how to register a signed-in user in the session manager."})]})}function u(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>a});var s=t(96540);const i={},r=s.createContext(i);function o(e){const n=s.useContext(r);return s.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(i):e.components||i:o(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/runtime~main.6d8fb288.js b/docs/assets/js/runtime~main.f96c9334.js similarity index 99% rename from docs/assets/js/runtime~main.6d8fb288.js rename to docs/assets/js/runtime~main.f96c9334.js index 3917d6603..0f7812b8b 100644 --- a/docs/assets/js/runtime~main.6d8fb288.js +++ b/docs/assets/js/runtime~main.f96c9334.js @@ -1 +1 @@ -(()=>{"use strict";var e,a,c,f,d,b={},r={};function t(e){var a=r[e];if(void 0!==a)return a.exports;var c=r[e]={exports:{}};return b[e].call(c.exports,c,c.exports,t),c.exports}t.m=b,e=[],t.O=(a,c,f,d)=>{if(!c){var b=1/0;for(n=0;n=d)&&Object.keys(t.O).every((e=>t.O[e](c[o])))?c.splice(o--,1):(r=!1,d0&&e[n-1][2]>d;n--)e[n]=e[n-1];e[n]=[c,f,d]},t.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return t.d(a,{a:a}),a},c=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 d=Object.create(null);t.r(d);var b={};a=a||[null,c({}),c([]),c(c)];for(var r=2&f&&e;"object"==typeof r&&!~a.indexOf(r);r=c(r))Object.getOwnPropertyNames(r).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,t.d(d,b),d},t.d=(e,a)=>{for(var c in a)t.o(a,c)&&!t.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:a[c]})},t.f={},t.e=e=>Promise.all(Object.keys(t.f).reduce(((a,c)=>(t.f[c](e,a),a)),[])),t.u=e=>"assets/js/"+({456:"cb867d98",565:"3f04b2f3",762:"cdc118a8",1160:"638e38ae",1171:"b685e31b",1572:"02c0cfe0",1705:"1921e4ca",1832:"bdc5a52e",1923:"b32c213b",1970:"dbf9e27d",2278:"27e827f8",2295:"0a5c01b2",2496:"3874f1bf",2730:"ac6e050c",3202:"8e7261c9",3230:"9d217e1f",3249:"05ec9480",3392:"reactPlayerVidyard",3607:"d8d6d57b",3783:"a6c3ea4a",3877:"79840965",3900:"ecb3c634",4272:"17dc776d",4276:"7a3d47b3",4499:"f149b10e",4550:"e3443ce0",4574:"976a2d80",4645:"9644aa4e",5e3:"da698f4c",5344:"8baf194b",5352:"52f87500",5441:"af1c5d2b",5623:"10ad1fa6",5819:"e4a796aa",5827:"3d277f18",5885:"3e4a4cb2",6157:"cce58fe7",6215:"f3467f26",6262:"27b43779",6265:"46b54090",6308:"2890c80c",6463:"reactPlayerKaltura",6486:"2e1ee4ed",6497:"5112ebe3",6615:"7b06977d",6918:"89b55a09",7161:"19e323d1",7267:"2db5c390",7606:"7517a61c",7701:"c2b45dbb",7785:"95bf5f56",8271:"94b2bc9a",8349:"06a408fe",8500:"4c5c4c2e",8734:"82e43b76",8927:"b8787c81",9264:"1caa8cdb",9524:"daec0d60",9606:"4519f039",9640:"5589c54d",9647:"5e95c892",9671:"e64edb60",9837:"5a0a1617",10348:"fca5fdb4",10700:"313c9eb1",10845:"5c1eff22",10907:"f7ae65ac",11139:"dc7352a7",11184:"8af032d3",11301:"f584139f",11567:"22dd74f7",11607:"ef2492df",11784:"45dd886d",11934:"b809d820",11965:"1457ddcd",12007:"90ec8c6b",12042:"reactPlayerTwitch",12237:"b6f81eaa",12716:"d2aa311d",12766:"4934de22",12827:"28967b3e",13018:"076cf272",13019:"d3938b1f",13455:"5839343c",13535:"e84b4e80",13585:"ea237062",13650:"2d11a680",14237:"95a5d2b2",14715:"fc8c8cde",14936:"7c8e5227",15066:"fe3f3783",15246:"83c6f999",15447:"30bd0f5b",16328:"reactPlayerDailyMotion",16602:"616631fd",16678:"710ac1c1",16869:"444a6d4e",16884:"4ed1e0ac",16945:"5596dd05",17021:"828ace52",17209:"f9bde383",17289:"45939ed5",17320:"55f37562",17776:"070c8c93",17820:"ebd05845",18093:"0841186f",18401:"17896441",18446:"reactPlayerYouTube",19049:"2fca5c64",19738:"87ab7385",20033:"986f0f98",20210:"68401255",20423:"22f51758",20515:"704545ab",20681:"e66f2658",20773:"d4fc3158",20826:"4ab30eec",21611:"82444e58",21983:"57012fa6",22422:"d3af5b3c",22451:"f5a589e7",22611:"59df87e8",22750:"141135bb",23321:"676f1bdb",23452:"5af30237",23453:"ed64c12e",23619:"f6affd6e",23870:"956829f8",24078:"ec91ff36",24158:"1d39c85d",24295:"96523456",24832:"02e41de2",25362:"5bc657fa",25427:"3edac44d",25504:"0f2c2e36",25666:"522ca66b",25691:"9a594c98",25692:"7ca2e59a",26173:"reactPlayerVimeo",26376:"431ffdb5",26499:"a4adf53f",26622:"d9107a6a",27168:"7ac69e68",27350:"65e04ea3",27646:"12407b36",27685:"6aee17c2",27740:"38e32826",28235:"965931d7",29248:"4a49065b",29250:"dec2bd4a",29436:"dc8c27bd",29773:"1a84c7fd",30248:"b1218054",30418:"6feb7661",30473:"3141060a",30528:"1323771c",30765:"85d514f3",30799:"1a39ee04",30941:"4aa94ec1",31165:"926056c1",31267:"08d55cf7",31471:"3f80bb14",31474:"564db590",31727:"2e18ba50",32055:"9037180b",32096:"c090764b",32141:"df1414bb",32163:"3d150a24",32178:"16116660",32406:"5cde491b",32461:"a6311318",32492:"4e689a0b",32504:"7de3e81f",32741:"d9e7b984",32759:"7800d508",32944:"272aa200",33048:"25c6d77a",33098:"71ba2dc1",33460:"9107c65f",33577:"a32c313f",33992:"cbf3c4ec",34321:"6f56eca8",34438:"54cab4d4",34662:"cf3c245e",34726:"1b6591f7",34750:"07e708e9",34935:"6da448d1",34975:"ff5ed6ba",35223:"db7d4591",35540:"ce86e3e6",35563:"e7977816",35654:"dc4059b2",35742:"aba21aa0",35748:"1312139a",35884:"9c9052d1",36058:"a2a1c245",36132:"e8f4756d",36353:"reactPlayerPreview",36731:"bd568e77",36886:"8abbb0ee",36920:"ed772d97",37107:"3817c387",37296:"a2757506",37516:"9f1829f0",37710:"abd13aa2",37850:"b28bd8b1",37990:"441fd5fc",38031:"8ee9837e",38419:"bd6f2233",38471:"caf7731d",38527:"5e7d099e",38610:"c868bccf",38691:"036b5431",38717:"897331c0",38792:"4f0519c7",38853:"fc67ad3d",38864:"fac0eceb",39026:"c7156cf2",39056:"5f6b1733",39080:"511f9951",39408:"fe2e2e26",39431:"cdd4a9c6",39482:"327b0a57",39558:"50f2f9f3",39757:"9e0c2c37",39911:"92466816",40271:"6a734661",40374:"b5dcbe95",40563:"39dec3ba",40575:"33c1d41a",41237:"88a48c42",41507:"16b03284",41865:"fe76eed8",42083:"4048090e",42206:"91aed80e",42434:"5b2d7e3c",42800:"3aa0ab0a",42901:"2115313f",43174:"6ba85e75",43246:"2d16d24d",43444:"d2f6d210",43773:"a81cb65f",43848:"44145933",43888:"ad61550a",43903:"8186ecf9",44046:"5d707891",44486:"c0650537",44602:"69fcd2fc",44609:"c5313007",44630:"65b7208a",44816:"36fcb744",44947:"39ec0930",45141:"b1394c86",45268:"ef4456b5",45295:"f29fc884",45474:"79d28454",45655:"4a55fe3a",45724:"8dfd8953",45742:"c377a04b",46119:"d58f1ee2",46364:"fe522f67",46563:"aeef55f7",46688:"ac3101e9",46921:"d0b9ca74",46961:"2bbc2deb",47120:"dcbfe205",47127:"999788b8",47264:"b9ec56c8",47341:"7f0714d1",47527:"93dcedec",47627:"reactPlayerStreamable",47719:"b7ea99f7",48124:"8f509517",48134:"356ce494",48235:"df15bc7d",48276:"b467d32a",48436:"f6adf820",48552:"954e932f",48579:"566f49fb",48665:"0f4a5c74",49316:"510b9307",49406:"b26210db",49455:"c8139b75",49658:"0d76317c",49921:"fc8b5a5d",50041:"ac002d2b",50404:"98f4e1ec",50765:"bf519c8d",50908:"3fbaac07",51143:"fc6f07d2",51205:"db42f242",51349:"4aec9039",51379:"17f04a83",51637:"81e4ed6a",51780:"eecc43ff",52302:"e7ee6027",52365:"280af06a",52529:"e3d58533",52723:"reactPlayerMux",53084:"23975af2",53148:"9b4ab8cd",53357:"1577f7ed",53774:"53998120",54049:"4867e743",54220:"092bf57d",54530:"a271ef09",54582:"984d6493",54905:"98d962c5",55011:"49145cdf",55388:"b2419a00",55664:"169f3d24",56264:"46eeb6cb",56282:"d636c09f",56383:"ecaa7076",56420:"fd4b36bb",56684:"378935ce",56764:"805a59dc",57035:"f527bef3",57356:"bb9c591b",57694:"21b7a589",57790:"1b218eaa",57869:"a7edc2bd",58022:"c134ef8a",58215:"1111b27e",58718:"afb7a97b",58800:"5144cf5e",59075:"6e29a506",59221:"76259cc3",59332:"857097c6",59409:"a64b2578",59599:"1e1f8072",59600:"ac9d9d69",59949:"5c6f6ba9",60365:"bd118f84",60759:"719163ad",60880:"640696ee",60886:"c10a0985",60893:"6fbf0c67",60908:"0eebd274",61114:"3cc71396",61252:"3b66921f",61273:"099a3596",61291:"d38e3f9f",61358:"3d1ae229",61368:"f28f059c",61505:"e58556b2",61977:"7570de64",62059:"0893faed",62134:"0d7acd84",62357:"6d2a4d3f",62362:"44463284",62573:"bd1cffff",62921:"1d7c691c",62929:"f5fed352",63474:"98c94590",63538:"06393fc1",63706:"2b67eda4",63737:"53e9dd7a",63747:"fb72d7b2",63960:"a6397568",64558:"b91fbf2a",64641:"eac16e1d",64651:"4c781063",64665:"6f44ab90",65110:"063d75bd",65142:"eb4c176e",65433:"616bfcf6",65542:"af754a1f",65655:"1ebbfca8",65755:"bafd283f",65784:"90239e6e",65866:"419cd6b8",66225:"9f8e6d57",66339:"03b2528f",66811:"3e87058f",66850:"0c695afe",66868:"3c4af576",66885:"5e253f2f",66929:"da54b976",67068:"ae0eacdd",67098:"a7bd4aaa",67217:"726a6c22",67349:"61ff6850",67458:"0d271e1e",67532:"49fed513",67570:"reactPlayerMixcloud",67714:"9d7352c0",68230:"3cf6fa35",68364:"812775a4",68391:"24557dbc",68700:"96331245",68874:"10ea0b82",68912:"2c2832e4",68915:"62de5d73",68960:"358c2507",68962:"af68ae04",69050:"4ac2e930",69779:"3c9432f0",69816:"20d56cb7",69891:"62037464",69979:"reactPlayerSoundCloud",70326:"c3373259",70934:"d44e0d1c",71247:"308471de",71383:"087cd58c",71826:"a4c89d62",71907:"86a8bb6c",71967:"4fa4eafa",72074:"71319bec",72132:"83ac10ed",72231:"fe170cc9",72561:"adce8179",73107:"646cbece",73379:"9d779d8b",73932:"2020ed93",73939:"2ed96714",74081:"ce4dbf6d",74583:"4bfca71d",74780:"ebde045d",74834:"d26a73b8",74860:"00d14154",75412:"5390e21f",75702:"307525ba",75822:"2db99065",75868:"071f33a8",75965:"b48f41b9",76093:"7d63aba8",76224:"03b3cfd2",76238:"8615e055",76372:"d802bb56",76768:"8bed5a26",76973:"78ae7ec8",77137:"42abcd4d",77313:"ee65edec",77318:"67e77328",77757:"f6f476f1",78007:"8eead450",78416:"068743c8",78631:"b7b014bf",78702:"82ea7079",79048:"a94703ab",79052:"6d717251",79225:"526e379a",79354:"4118187a",79825:"2d4af3bf",79956:"9e09f891",79983:"a7f483d1",80549:"afde3230",80721:"05fa9a60",81509:"4ead9a95",81657:"f8189ec4",81790:"42a9b3c5",81849:"2e3fc0f9",82075:"056b386b",82201:"18910d94",82261:"0c6fe626",82439:"e4eafb12",82477:"2ca08277",83287:"7af31c45",83752:"efe5610c",83943:"9c5d9512",84219:"51e50f95",84331:"79e0e7f1",84605:"8552f549",84656:"813cfb2f",84750:"aefdd881",84850:"bc03f89b",85462:"9270ba4f",85527:"5143312c",85528:"21e10cde",85556:"21a4ba71",85943:"05fbef88",86012:"da202fdd",86037:"eaeab60b",86057:"9fbfaf6d",86106:"1877d9d5",86298:"e2d6ba1f",86886:"7b33c27b",86887:"reactPlayerFacebook",86992:"3fe65583",87012:"869ae8a7",87126:"b916a1ab",87402:"c3094240",87510:"9d36f238",87760:"0773e78b",88048:"73ca4188",88131:"c2237e68",88494:"504d78e0",88495:"801276a1",88790:"51c7df8c",88843:"45926b62",88946:"95ec96e5",89598:"4b6eee9a",90049:"cc180519",90381:"869d42f3",90642:"07006f9e",90780:"098f2604",91131:"468d57a9",91258:"227d1fc4",91395:"a0aa5253",92113:"32b8fafb",92170:"4951b372",92687:"cd64d641",92811:"8093477b",92896:"bc69c5bc",93036:"c342bcae",93087:"b0f19176",93842:"26398b18",94594:"c7507218",94642:"da19ecb4",94725:"dd31e7e9",94811:"da071cb8",95191:"c75d145e",95409:"94f11012",96449:"19a6be06",96815:"8d02075b",96991:"4eee9c87",97191:"31b73615",97458:"reactPlayerFilePlayer",97499:"50a12feb",97785:"ac5db01d",98042:"819b642a",98116:"49849746",98175:"5a96e453",98498:"ae22b856",98548:"44a83f6a",98601:"13798859",98996:"65c67349",99094:"08aab21d",99180:"32ebcda7",99340:"reactPlayerWistia",99341:"a1154d73",99591:"e0bec135",99989:"51ddac88"}[e]||e)+"."+{456:"5c30ecdd",565:"94a09b6c",762:"df50c981",1160:"918efc1f",1171:"de34cd0e",1572:"ffbe0cfc",1705:"038460b6",1832:"9614689c",1923:"cb2bc5be",1970:"cac2a9b8",2278:"d475be2b",2295:"e81bbf25",2496:"b540b729",2730:"923b54e1",3202:"f35694a9",3230:"4129121e",3249:"82c7846c",3392:"8464e17b",3607:"2981ded1",3783:"71a2f8e8",3877:"58749100",3900:"0ba32b97",4272:"0900e2a1",4276:"8faf83a5",4499:"ca8d1432",4550:"46f5f770",4574:"1c78d390",4645:"e160e737",5e3:"e340e97d",5344:"1d1077a2",5352:"5ee75c06",5441:"151c62bf",5623:"9548c1a1",5819:"a4a89c82",5827:"5cc9996e",5885:"fcb3bbcb",6157:"dbb843db",6215:"51944600",6262:"794fd95d",6265:"83c21074",6308:"350484bc",6463:"bec1a06c",6486:"4b0eb0a1",6497:"42707b0b",6615:"7db76aa6",6918:"031ec4ab",7161:"2c411627",7267:"ce74b45c",7606:"45b626ad",7701:"316b1161",7785:"f569d217",8271:"bce6ddee",8349:"03f95123",8500:"a390a5ca",8734:"2de05990",8927:"f986535a",9264:"6ae52032",9524:"e7c42f6f",9606:"bff55b72",9640:"b703cc22",9647:"cac24016",9671:"0a30cd6c",9837:"ede23a01",10348:"ec8b3811",10700:"708d8037",10845:"2bc04da3",10907:"eb9d65c3",11139:"303df097",11184:"9d69cbad",11301:"8387b5bf",11567:"432c7b35",11607:"b64b2d67",11784:"9d3408ab",11934:"da61538a",11965:"d6e5dd4d",12007:"fb425a62",12042:"a0c42814",12237:"8a850fa6",12716:"faed95e1",12766:"97abbc05",12827:"144f3020",13018:"c5ad98c6",13019:"c5e3aef7",13455:"1451755d",13535:"88a06537",13585:"a746e017",13650:"62810914",14237:"8c2a2bc3",14715:"95abf808",14936:"6ee147d1",15066:"38ece79e",15246:"fd5943dc",15447:"82977fde",16328:"4fa8d3c8",16602:"f2bf07f8",16678:"cb38a105",16869:"995c6ef6",16884:"bf9abfa1",16945:"1eaf58e9",17021:"6c74822a",17209:"e94a64b5",17289:"e2e7eec1",17320:"9ddeadd7",17776:"f89fd2b8",17820:"623e6e0e",18093:"d4afddde",18401:"30c4f83a",18446:"150ff8a0",19049:"08036f4e",19738:"a816c680",20033:"fa674d6a",20210:"4ea135dd",20423:"076d2946",20515:"85d707fe",20681:"7e97a650",20773:"a2cebc00",20826:"8b874cbc",21611:"6e533a7e",21983:"f9a941e2",22422:"feb00a9e",22451:"ef972e5e",22611:"18587ae4",22750:"a52908e5",23321:"84054f56",23452:"ebba4448",23453:"2ff5cbe7",23619:"c27273de",23870:"3742bfab",24078:"730ca41c",24158:"ce6a000b",24295:"4aae9b71",24832:"af6b73df",25362:"f0170814",25427:"3244da9c",25504:"28938478",25666:"2f0c77bf",25691:"426557b6",25692:"585ab289",26173:"076fef9c",26376:"a1f11cb7",26499:"dd7640ab",26622:"f0629b1b",27168:"07813519",27350:"5fd6e6d7",27646:"0678c8f9",27685:"f20ffda9",27740:"8f7d4d98",28235:"f6cbcccb",29248:"d7c12529",29250:"925abd2b",29436:"7ca95c22",29773:"b8c6f670",30248:"0ad8a16e",30418:"5fc7b2a0",30473:"0abc4692",30528:"435813db",30765:"d86090af",30799:"388c9414",30941:"49876b37",31165:"02614496",31267:"933156b4",31471:"450344fc",31474:"dbbf8152",31727:"d3f3b0b1",32055:"a95bfc3b",32096:"04828676",32141:"bcdc361b",32163:"70936a3c",32178:"36e60316",32406:"bd1dc0ac",32461:"6b4a958d",32492:"30cd7c7f",32504:"754ac7de",32741:"552767cd",32759:"d8e2798a",32944:"6f349f74",33048:"1a010730",33098:"480f07f7",33460:"8f3f92e4",33577:"ce38b0c8",33992:"a7260a35",34321:"ab8e5c20",34438:"8f46a7dd",34662:"8da76618",34726:"90739fe9",34750:"13529313",34935:"59f5597e",34975:"41c5c4bb",35223:"2367e813",35540:"daa770e8",35563:"22b8fd33",35654:"72cb9c74",35742:"e08a145a",35748:"816249d7",35884:"a0bf4e6b",36058:"b63b94d9",36132:"75cbf3f9",36353:"4de9bab6",36731:"1ab1d6ee",36886:"9c9e515a",36920:"3a69befa",37107:"f19c047b",37296:"20763684",37516:"2ab4897d",37710:"5cf4ff57",37850:"ed2f760b",37990:"c6c289b1",38031:"396006c8",38419:"a12c2499",38471:"93b2d4dd",38527:"73056614",38610:"37df5efb",38691:"137dc0f8",38717:"6dbb7b59",38792:"7deb9f3e",38853:"5c9e45fe",38864:"4813ef31",39026:"f2f8a69b",39056:"60f70f39",39080:"b0c77b48",39408:"88db313c",39431:"2bcf2e6d",39482:"7e3b08ef",39503:"18fac5cf",39558:"41945f10",39757:"47703e3b",39911:"646e7dec",40271:"f790e023",40374:"179979e4",40563:"94247613",40575:"4d0b112e",41237:"3bbdf534",41507:"77c30778",41865:"c835f8b0",42083:"2aff9481",42206:"18d5693f",42434:"1f6d6607",42800:"bf6545c0",42901:"2fdbe13a",43174:"013544f4",43246:"ddc98077",43444:"cff02423",43773:"3cc7db7d",43848:"57247e24",43888:"d74ff318",43903:"41a52d13",44046:"a946825c",44486:"28ccbcec",44602:"aaf93cb1",44609:"32c1fd2c",44630:"f2d8976e",44816:"0e7f93b4",44947:"a24467f3",45141:"e3968051",45268:"7006193f",45295:"b0715bed",45474:"1abec566",45655:"c2164e90",45724:"b59ddc1b",45742:"2497dd34",46119:"7805de88",46364:"fdfddfc0",46563:"2e6253c5",46688:"a1d131c8",46921:"260d54e0",46961:"94b493aa",47120:"723a0b3e",47127:"de5390c4",47264:"44b44216",47341:"18ca620e",47527:"d950e87e",47627:"bb35fa43",47719:"646275e7",48124:"55af4038",48134:"b6137268",48235:"bc75728e",48276:"231a1e55",48436:"89305d4a",48552:"c704b5f4",48579:"bbd9e592",48665:"b81074e2",49316:"5e345ac8",49406:"a3ecaee8",49455:"15c58fe1",49658:"3da918b0",49921:"f2c2a1f0",50041:"f7cb55c7",50404:"eb1ab0f9",50765:"479f1916",50908:"a5b524ad",51143:"136727d9",51205:"ee2e77cb",51349:"1e076875",51379:"27ea6246",51637:"ffb79940",51780:"ce9149be",52302:"340b0e6b",52365:"d23ef6a9",52529:"e7cefacb",52723:"3e4df075",53084:"315da40f",53148:"4212deb6",53357:"b5a1c415",53774:"72126425",54049:"4089600b",54220:"d4f185d8",54530:"0bd12311",54582:"4e5700b0",54905:"feb41c26",55011:"95879cb0",55388:"33179a2f",55664:"258a4e6b",56264:"6318e439",56282:"b46c91af",56383:"1ff19ca5",56420:"1972625f",56684:"ab8eab18",56764:"ac5b41d7",57035:"ad79c7ab",57356:"42441995",57694:"a34951a6",57790:"7f79a47a",57869:"89931416",58022:"7b3238f1",58215:"5be13c8d",58718:"a820c36e",58800:"b2beda30",59075:"25749229",59221:"658e6207",59332:"84712487",59409:"be73a79d",59599:"780630f8",59600:"ca1b31c5",59949:"0c457c29",60365:"1fd2fa70",60759:"d322d307",60880:"f6ba7287",60886:"67c47b8d",60893:"fe1ea3f9",60908:"e76a5e92",61114:"46cf560e",61252:"c36d8746",61273:"05750299",61291:"0f509abf",61358:"9defced7",61368:"88200516",61505:"1a21d780",61977:"3a915ac8",62059:"27a610be",62134:"136bb77a",62357:"dd821bdf",62362:"8db1be48",62573:"09b3ebf3",62921:"9d42f085",62929:"c76283aa",63474:"bb220697",63538:"7b7f0e14",63706:"6f94bc8f",63737:"af78b6a2",63747:"7c5b8fbd",63960:"9f0fe283",64558:"25e0c733",64641:"4002d9f9",64651:"7df9a0dc",64665:"b140ef8f",65110:"0c2123d1",65142:"d226848c",65433:"d959ad9b",65542:"a7c67c53",65655:"3f647a48",65755:"c46f5968",65784:"b94d85b3",65866:"f9e10c84",66225:"f10f224f",66339:"800c2e61",66811:"945f99d9",66850:"7753ee7f",66868:"65080ded",66885:"1bd3e9c3",66929:"d218d95f",67068:"046fc798",67098:"03929b29",67217:"c9c29188",67349:"b94a3a6a",67458:"f760b356",67532:"60df9b16",67570:"12aff88e",67714:"973cd9fc",68230:"835eaee7",68364:"53e94f68",68391:"262895ce",68700:"64fe7812",68874:"d1febe02",68912:"0c81f713",68915:"57e00474",68960:"18b5e3ad",68962:"d845c0a4",69050:"358b5513",69779:"faba2980",69816:"58af7b00",69891:"80af80ae",69979:"f8f19bc3",70326:"fafebdcb",70934:"73854ef9",71247:"5a63971c",71383:"75b257bc",71826:"9f1c6fe5",71907:"0751c0f3",71967:"1af4694c",72074:"522fdb31",72132:"6e4054d2",72231:"e3c174bf",72561:"1f9fbc90",73107:"ecc6be9c",73379:"16b17994",73932:"b35fd796",73939:"aba6bb06",74081:"b57cba4e",74583:"ce4c9b2f",74780:"b7d71cb3",74834:"15357603",74860:"426c5862",75412:"d72a934a",75702:"3926a131",75822:"1d9852b1",75868:"3118d0c9",75965:"19020673",76093:"8e28eeb6",76224:"8f29238e",76238:"46cbd86e",76372:"297afbc9",76768:"c3ca6e24",76973:"a72e321d",77137:"daff0432",77313:"b92d7b2e",77318:"44e1adab",77757:"eb1c1544",78007:"2b6a8f00",78416:"2ad246f2",78631:"b6f33b62",78702:"ed155bd3",79048:"0f54d2a9",79052:"634be361",79225:"bad5b331",79354:"d6957fa9",79825:"8c4cf900",79956:"4d5ec1eb",79983:"52b6f63f",80549:"a1b3777a",80721:"cdf43ae5",81509:"5a98113a",81657:"d230bb30",81790:"c56f6a89",81849:"0f44253c",82075:"7a5a588a",82201:"c855be90",82237:"787c04ec",82261:"2fc96e72",82439:"18a56b6c",82477:"12d174de",83287:"084dde1a",83752:"d91cc53e",83943:"a64bf43a",84219:"d24c437b",84331:"b37577e8",84605:"8cf0495c",84656:"73c53ede",84750:"1857e769",84850:"f287e029",85462:"ddca2c18",85527:"3afd894d",85528:"74b87448",85556:"fee97575",85943:"e5b4cdd6",86012:"ab7bdaa5",86037:"04050011",86057:"db95e34c",86106:"1290858d",86298:"92e42ef4",86886:"dad3b87b",86887:"508da014",86992:"82004d70",87012:"fd4f4b30",87126:"89adbb17",87402:"abdfd46c",87510:"720f0f93",87760:"72f8f4bb",88048:"2a1833d8",88131:"e11652fa",88494:"7d33658e",88495:"efabda4c",88790:"c5a360b0",88843:"ba8ab281",88946:"350ed3aa",89598:"30bcd67d",90049:"70470979",90381:"4acaccf6",90642:"83acf9a9",90780:"75e3e359",91131:"759062e1",91258:"0a10d55b",91395:"31f57203",92113:"d51c7aa0",92170:"f7b1e9bd",92687:"c63cd876",92811:"8a204457",92896:"b265749e",93036:"7c8d08ac",93087:"0090bbd7",93842:"d418eca4",94594:"42c52295",94642:"c0efeaa4",94725:"7118b112",94811:"933445a7",95191:"0ee87f70",95409:"6f87b63a",96449:"9cfed380",96815:"362b1a69",96991:"eca5cf70",97191:"ca75b3a5",97458:"036de6e1",97499:"f788ffc1",97785:"433c50c6",98042:"14a96714",98116:"a22cb511",98175:"b8bdaaeb",98498:"1128c3c9",98548:"0250dbf6",98601:"75b6fdce",98996:"433b1eca",99094:"54319916",99180:"e5d0a4e7",99340:"c5c0cf6c",99341:"4403c816",99591:"4e74c25b",99989:"1ffc7914"}[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={},d="serverpod-docs:",t.l=(e,a,c,b)=>{if(f[e])f[e].push(a);else{var r,o;if(void 0!==c)for(var l=document.getElementsByTagName("script"),n=0;n{r.onerror=r.onload=null,clearTimeout(s);var d=f[e];if(delete f[e],r.parentNode&&r.parentNode.removeChild(r),d&&d.forEach((e=>e(c))),a)return a(c)},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:"98601",16116660:"32178",17896441:"18401",44145933:"43848",44463284:"62362",49849746:"98116",53998120:"53774",62037464:"69891",68401255:"20210",79840965:"3877",92466816:"39911",96331245:"68700",96523456:"24295",cb867d98:"456","3f04b2f3":"565",cdc118a8:"762","638e38ae":"1160",b685e31b:"1171","02c0cfe0":"1572","1921e4ca":"1705",bdc5a52e:"1832",b32c213b:"1923",dbf9e27d:"1970","27e827f8":"2278","0a5c01b2":"2295","3874f1bf":"2496",ac6e050c:"2730","8e7261c9":"3202","9d217e1f":"3230","05ec9480":"3249",reactPlayerVidyard:"3392",d8d6d57b:"3607",a6c3ea4a:"3783",ecb3c634:"3900","17dc776d":"4272","7a3d47b3":"4276",f149b10e:"4499",e3443ce0:"4550","976a2d80":"4574","9644aa4e":"4645",da698f4c:"5000","8baf194b":"5344","52f87500":"5352",af1c5d2b:"5441","10ad1fa6":"5623",e4a796aa:"5819","3d277f18":"5827","3e4a4cb2":"5885",cce58fe7:"6157",f3467f26:"6215","27b43779":"6262","46b54090":"6265","2890c80c":"6308",reactPlayerKaltura:"6463","2e1ee4ed":"6486","5112ebe3":"6497","7b06977d":"6615","89b55a09":"6918","19e323d1":"7161","2db5c390":"7267","7517a61c":"7606",c2b45dbb:"7701","95bf5f56":"7785","94b2bc9a":"8271","06a408fe":"8349","4c5c4c2e":"8500","82e43b76":"8734",b8787c81:"8927","1caa8cdb":"9264",daec0d60:"9524","4519f039":"9606","5589c54d":"9640","5e95c892":"9647",e64edb60:"9671","5a0a1617":"9837",fca5fdb4:"10348","313c9eb1":"10700","5c1eff22":"10845",f7ae65ac:"10907",dc7352a7:"11139","8af032d3":"11184",f584139f:"11301","22dd74f7":"11567",ef2492df:"11607","45dd886d":"11784",b809d820:"11934","1457ddcd":"11965","90ec8c6b":"12007",reactPlayerTwitch:"12042",b6f81eaa:"12237",d2aa311d:"12716","4934de22":"12766","28967b3e":"12827","076cf272":"13018",d3938b1f:"13019","5839343c":"13455",e84b4e80:"13535",ea237062:"13585","2d11a680":"13650","95a5d2b2":"14237",fc8c8cde:"14715","7c8e5227":"14936",fe3f3783:"15066","83c6f999":"15246","30bd0f5b":"15447",reactPlayerDailyMotion:"16328","616631fd":"16602","710ac1c1":"16678","444a6d4e":"16869","4ed1e0ac":"16884","5596dd05":"16945","828ace52":"17021",f9bde383:"17209","45939ed5":"17289","55f37562":"17320","070c8c93":"17776",ebd05845:"17820","0841186f":"18093",reactPlayerYouTube:"18446","2fca5c64":"19049","87ab7385":"19738","986f0f98":"20033","22f51758":"20423","704545ab":"20515",e66f2658:"20681",d4fc3158:"20773","4ab30eec":"20826","82444e58":"21611","57012fa6":"21983",d3af5b3c:"22422",f5a589e7:"22451","59df87e8":"22611","141135bb":"22750","676f1bdb":"23321","5af30237":"23452",ed64c12e:"23453",f6affd6e:"23619","956829f8":"23870",ec91ff36:"24078","1d39c85d":"24158","02e41de2":"24832","5bc657fa":"25362","3edac44d":"25427","0f2c2e36":"25504","522ca66b":"25666","9a594c98":"25691","7ca2e59a":"25692",reactPlayerVimeo:"26173","431ffdb5":"26376",a4adf53f:"26499",d9107a6a:"26622","7ac69e68":"27168","65e04ea3":"27350","12407b36":"27646","6aee17c2":"27685","38e32826":"27740","965931d7":"28235","4a49065b":"29248",dec2bd4a:"29250",dc8c27bd:"29436","1a84c7fd":"29773",b1218054:"30248","6feb7661":"30418","3141060a":"30473","1323771c":"30528","85d514f3":"30765","1a39ee04":"30799","4aa94ec1":"30941","926056c1":"31165","08d55cf7":"31267","3f80bb14":"31471","564db590":"31474","2e18ba50":"31727","9037180b":"32055",c090764b:"32096",df1414bb:"32141","3d150a24":"32163","5cde491b":"32406",a6311318:"32461","4e689a0b":"32492","7de3e81f":"32504",d9e7b984:"32741","7800d508":"32759","272aa200":"32944","25c6d77a":"33048","71ba2dc1":"33098","9107c65f":"33460",a32c313f:"33577",cbf3c4ec:"33992","6f56eca8":"34321","54cab4d4":"34438",cf3c245e:"34662","1b6591f7":"34726","07e708e9":"34750","6da448d1":"34935",ff5ed6ba:"34975",db7d4591:"35223",ce86e3e6:"35540",e7977816:"35563",dc4059b2:"35654",aba21aa0:"35742","1312139a":"35748","9c9052d1":"35884",a2a1c245:"36058",e8f4756d:"36132",reactPlayerPreview:"36353",bd568e77:"36731","8abbb0ee":"36886",ed772d97:"36920","3817c387":"37107",a2757506:"37296","9f1829f0":"37516",abd13aa2:"37710",b28bd8b1:"37850","441fd5fc":"37990","8ee9837e":"38031",bd6f2233:"38419",caf7731d:"38471","5e7d099e":"38527",c868bccf:"38610","036b5431":"38691","897331c0":"38717","4f0519c7":"38792",fc67ad3d:"38853",fac0eceb:"38864",c7156cf2:"39026","5f6b1733":"39056","511f9951":"39080",fe2e2e26:"39408",cdd4a9c6:"39431","327b0a57":"39482","50f2f9f3":"39558","9e0c2c37":"39757","6a734661":"40271",b5dcbe95:"40374","39dec3ba":"40563","33c1d41a":"40575","88a48c42":"41237","16b03284":"41507",fe76eed8:"41865","4048090e":"42083","91aed80e":"42206","5b2d7e3c":"42434","3aa0ab0a":"42800","2115313f":"42901","6ba85e75":"43174","2d16d24d":"43246",d2f6d210:"43444",a81cb65f:"43773",ad61550a:"43888","8186ecf9":"43903","5d707891":"44046",c0650537:"44486","69fcd2fc":"44602",c5313007:"44609","65b7208a":"44630","36fcb744":"44816","39ec0930":"44947",b1394c86:"45141",ef4456b5:"45268",f29fc884:"45295","79d28454":"45474","4a55fe3a":"45655","8dfd8953":"45724",c377a04b:"45742",d58f1ee2:"46119",fe522f67:"46364",aeef55f7:"46563",ac3101e9:"46688",d0b9ca74:"46921","2bbc2deb":"46961",dcbfe205:"47120","999788b8":"47127",b9ec56c8:"47264","7f0714d1":"47341","93dcedec":"47527",reactPlayerStreamable:"47627",b7ea99f7:"47719","8f509517":"48124","356ce494":"48134",df15bc7d:"48235",b467d32a:"48276",f6adf820:"48436","954e932f":"48552","566f49fb":"48579","0f4a5c74":"48665","510b9307":"49316",b26210db:"49406",c8139b75:"49455","0d76317c":"49658",fc8b5a5d:"49921",ac002d2b:"50041","98f4e1ec":"50404",bf519c8d:"50765","3fbaac07":"50908",fc6f07d2:"51143",db42f242:"51205","4aec9039":"51349","17f04a83":"51379","81e4ed6a":"51637",eecc43ff:"51780",e7ee6027:"52302","280af06a":"52365",e3d58533:"52529",reactPlayerMux:"52723","23975af2":"53084","9b4ab8cd":"53148","1577f7ed":"53357","4867e743":"54049","092bf57d":"54220",a271ef09:"54530","984d6493":"54582","98d962c5":"54905","49145cdf":"55011",b2419a00:"55388","169f3d24":"55664","46eeb6cb":"56264",d636c09f:"56282",ecaa7076:"56383",fd4b36bb:"56420","378935ce":"56684","805a59dc":"56764",f527bef3:"57035",bb9c591b:"57356","21b7a589":"57694","1b218eaa":"57790",a7edc2bd:"57869",c134ef8a:"58022","1111b27e":"58215",afb7a97b:"58718","5144cf5e":"58800","6e29a506":"59075","76259cc3":"59221","857097c6":"59332",a64b2578:"59409","1e1f8072":"59599",ac9d9d69:"59600","5c6f6ba9":"59949",bd118f84:"60365","719163ad":"60759","640696ee":"60880",c10a0985:"60886","6fbf0c67":"60893","0eebd274":"60908","3cc71396":"61114","3b66921f":"61252","099a3596":"61273",d38e3f9f:"61291","3d1ae229":"61358",f28f059c:"61368",e58556b2:"61505","7570de64":"61977","0893faed":"62059","0d7acd84":"62134","6d2a4d3f":"62357",bd1cffff:"62573","1d7c691c":"62921",f5fed352:"62929","98c94590":"63474","06393fc1":"63538","2b67eda4":"63706","53e9dd7a":"63737",fb72d7b2:"63747",a6397568:"63960",b91fbf2a:"64558",eac16e1d:"64641","4c781063":"64651","6f44ab90":"64665","063d75bd":"65110",eb4c176e:"65142","616bfcf6":"65433",af754a1f:"65542","1ebbfca8":"65655",bafd283f:"65755","90239e6e":"65784","419cd6b8":"65866","9f8e6d57":"66225","03b2528f":"66339","3e87058f":"66811","0c695afe":"66850","3c4af576":"66868","5e253f2f":"66885",da54b976:"66929",ae0eacdd:"67068",a7bd4aaa:"67098","726a6c22":"67217","61ff6850":"67349","0d271e1e":"67458","49fed513":"67532",reactPlayerMixcloud:"67570","9d7352c0":"67714","3cf6fa35":"68230","812775a4":"68364","24557dbc":"68391","10ea0b82":"68874","2c2832e4":"68912","62de5d73":"68915","358c2507":"68960",af68ae04:"68962","4ac2e930":"69050","3c9432f0":"69779","20d56cb7":"69816",reactPlayerSoundCloud:"69979",c3373259:"70326",d44e0d1c:"70934","308471de":"71247","087cd58c":"71383",a4c89d62:"71826","86a8bb6c":"71907","4fa4eafa":"71967","71319bec":"72074","83ac10ed":"72132",fe170cc9:"72231",adce8179:"72561","646cbece":"73107","9d779d8b":"73379","2020ed93":"73932","2ed96714":"73939",ce4dbf6d:"74081","4bfca71d":"74583",ebde045d:"74780",d26a73b8:"74834","00d14154":"74860","5390e21f":"75412","307525ba":"75702","2db99065":"75822","071f33a8":"75868",b48f41b9:"75965","7d63aba8":"76093","03b3cfd2":"76224","8615e055":"76238",d802bb56:"76372","8bed5a26":"76768","78ae7ec8":"76973","42abcd4d":"77137",ee65edec:"77313","67e77328":"77318",f6f476f1:"77757","8eead450":"78007","068743c8":"78416",b7b014bf:"78631","82ea7079":"78702",a94703ab:"79048","6d717251":"79052","526e379a":"79225","4118187a":"79354","2d4af3bf":"79825","9e09f891":"79956",a7f483d1:"79983",afde3230:"80549","05fa9a60":"80721","4ead9a95":"81509",f8189ec4:"81657","42a9b3c5":"81790","2e3fc0f9":"81849","056b386b":"82075","18910d94":"82201","0c6fe626":"82261",e4eafb12:"82439","2ca08277":"82477","7af31c45":"83287",efe5610c:"83752","9c5d9512":"83943","51e50f95":"84219","79e0e7f1":"84331","8552f549":"84605","813cfb2f":"84656",aefdd881:"84750",bc03f89b:"84850","9270ba4f":"85462","5143312c":"85527","21e10cde":"85528","21a4ba71":"85556","05fbef88":"85943",da202fdd:"86012",eaeab60b:"86037","9fbfaf6d":"86057","1877d9d5":"86106",e2d6ba1f:"86298","7b33c27b":"86886",reactPlayerFacebook:"86887","3fe65583":"86992","869ae8a7":"87012",b916a1ab:"87126",c3094240:"87402","9d36f238":"87510","0773e78b":"87760","73ca4188":"88048",c2237e68:"88131","504d78e0":"88494","801276a1":"88495","51c7df8c":"88790","45926b62":"88843","95ec96e5":"88946","4b6eee9a":"89598",cc180519:"90049","869d42f3":"90381","07006f9e":"90642","098f2604":"90780","468d57a9":"91131","227d1fc4":"91258",a0aa5253:"91395","32b8fafb":"92113","4951b372":"92170",cd64d641:"92687","8093477b":"92811",bc69c5bc:"92896",c342bcae:"93036",b0f19176:"93087","26398b18":"93842",c7507218:"94594",da19ecb4:"94642",dd31e7e9:"94725",da071cb8:"94811",c75d145e:"95191","94f11012":"95409","19a6be06":"96449","8d02075b":"96815","4eee9c87":"96991","31b73615":"97191",reactPlayerFilePlayer:"97458","50a12feb":"97499",ac5db01d:"97785","819b642a":"98042","5a96e453":"98175",ae22b856:"98498","44a83f6a":"98548","65c67349":"98996","08aab21d":"99094","32ebcda7":"99180",reactPlayerWistia:"99340",a1154d73:"99341",e0bec135:"99591","51ddac88":"99989"}[e]||e,t.p+t.u(e)},(()=>{var e={45354:0,71869:0};t.f.j=(a,c)=>{var f=t.o(e,a)?e[a]:void 0;if(0!==f)if(f)c.push(f[2]);else if(/^(45354|71869)$/.test(a))e[a]=0;else{var d=new Promise(((c,d)=>f=e[a]=[c,d]));c.push(f[2]=d);var b=t.p+t.u(a),r=new Error;t.l(b,(c=>{if(t.o(e,a)&&(0!==(f=e[a])&&(e[a]=void 0),f)){var d=c&&("load"===c.type?"missing":c.type),b=c&&c.target&&c.target.src;r.message="Loading chunk "+a+" failed.\n("+d+": "+b+")",r.name="ChunkLoadError",r.type=d,r.request=b,f[1](r)}}),"chunk-"+a,a)}},t.O.j=a=>0===e[a];var a=(a,c)=>{var f,d,b=c[0],r=c[1],o=c[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(c);l{"use strict";var e,a,c,f,d,b={},r={};function t(e){var a=r[e];if(void 0!==a)return a.exports;var c=r[e]={exports:{}};return b[e].call(c.exports,c,c.exports,t),c.exports}t.m=b,e=[],t.O=(a,c,f,d)=>{if(!c){var b=1/0;for(n=0;n=d)&&Object.keys(t.O).every((e=>t.O[e](c[o])))?c.splice(o--,1):(r=!1,d0&&e[n-1][2]>d;n--)e[n]=e[n-1];e[n]=[c,f,d]},t.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return t.d(a,{a:a}),a},c=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 d=Object.create(null);t.r(d);var b={};a=a||[null,c({}),c([]),c(c)];for(var r=2&f&&e;"object"==typeof r&&!~a.indexOf(r);r=c(r))Object.getOwnPropertyNames(r).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,t.d(d,b),d},t.d=(e,a)=>{for(var c in a)t.o(a,c)&&!t.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:a[c]})},t.f={},t.e=e=>Promise.all(Object.keys(t.f).reduce(((a,c)=>(t.f[c](e,a),a)),[])),t.u=e=>"assets/js/"+({456:"cb867d98",565:"3f04b2f3",762:"cdc118a8",1160:"638e38ae",1171:"b685e31b",1572:"02c0cfe0",1705:"1921e4ca",1832:"bdc5a52e",1923:"b32c213b",1970:"dbf9e27d",2278:"27e827f8",2295:"0a5c01b2",2496:"3874f1bf",2730:"ac6e050c",3202:"8e7261c9",3230:"9d217e1f",3249:"05ec9480",3392:"reactPlayerVidyard",3607:"d8d6d57b",3783:"a6c3ea4a",3877:"79840965",3900:"ecb3c634",4272:"17dc776d",4276:"7a3d47b3",4499:"f149b10e",4550:"e3443ce0",4574:"976a2d80",4645:"9644aa4e",5e3:"da698f4c",5344:"8baf194b",5352:"52f87500",5441:"af1c5d2b",5623:"10ad1fa6",5819:"e4a796aa",5827:"3d277f18",5885:"3e4a4cb2",6157:"cce58fe7",6215:"f3467f26",6262:"27b43779",6265:"46b54090",6308:"2890c80c",6463:"reactPlayerKaltura",6486:"2e1ee4ed",6497:"5112ebe3",6615:"7b06977d",6918:"89b55a09",7161:"19e323d1",7267:"2db5c390",7606:"7517a61c",7701:"c2b45dbb",7785:"95bf5f56",8271:"94b2bc9a",8349:"06a408fe",8500:"4c5c4c2e",8734:"82e43b76",8927:"b8787c81",9264:"1caa8cdb",9524:"daec0d60",9606:"4519f039",9640:"5589c54d",9647:"5e95c892",9671:"e64edb60",9837:"5a0a1617",10348:"fca5fdb4",10700:"313c9eb1",10845:"5c1eff22",10907:"f7ae65ac",11139:"dc7352a7",11184:"8af032d3",11301:"f584139f",11567:"22dd74f7",11607:"ef2492df",11784:"45dd886d",11934:"b809d820",11965:"1457ddcd",12007:"90ec8c6b",12042:"reactPlayerTwitch",12237:"b6f81eaa",12716:"d2aa311d",12766:"4934de22",12827:"28967b3e",13018:"076cf272",13019:"d3938b1f",13455:"5839343c",13535:"e84b4e80",13585:"ea237062",13650:"2d11a680",14237:"95a5d2b2",14715:"fc8c8cde",14936:"7c8e5227",15066:"fe3f3783",15246:"83c6f999",15447:"30bd0f5b",16328:"reactPlayerDailyMotion",16602:"616631fd",16678:"710ac1c1",16869:"444a6d4e",16884:"4ed1e0ac",16945:"5596dd05",17021:"828ace52",17209:"f9bde383",17289:"45939ed5",17320:"55f37562",17776:"070c8c93",17820:"ebd05845",18093:"0841186f",18401:"17896441",18446:"reactPlayerYouTube",19049:"2fca5c64",19738:"87ab7385",20033:"986f0f98",20210:"68401255",20423:"22f51758",20515:"704545ab",20681:"e66f2658",20773:"d4fc3158",20826:"4ab30eec",21611:"82444e58",21983:"57012fa6",22422:"d3af5b3c",22451:"f5a589e7",22611:"59df87e8",22750:"141135bb",23321:"676f1bdb",23452:"5af30237",23453:"ed64c12e",23619:"f6affd6e",23870:"956829f8",24078:"ec91ff36",24158:"1d39c85d",24295:"96523456",24832:"02e41de2",25362:"5bc657fa",25427:"3edac44d",25504:"0f2c2e36",25666:"522ca66b",25691:"9a594c98",25692:"7ca2e59a",26173:"reactPlayerVimeo",26376:"431ffdb5",26499:"a4adf53f",26622:"d9107a6a",27168:"7ac69e68",27350:"65e04ea3",27646:"12407b36",27685:"6aee17c2",27740:"38e32826",28235:"965931d7",29248:"4a49065b",29250:"dec2bd4a",29436:"dc8c27bd",29773:"1a84c7fd",30248:"b1218054",30418:"6feb7661",30473:"3141060a",30528:"1323771c",30765:"85d514f3",30799:"1a39ee04",30941:"4aa94ec1",31165:"926056c1",31267:"08d55cf7",31471:"3f80bb14",31474:"564db590",31727:"2e18ba50",32055:"9037180b",32096:"c090764b",32141:"df1414bb",32163:"3d150a24",32178:"16116660",32406:"5cde491b",32461:"a6311318",32492:"4e689a0b",32504:"7de3e81f",32741:"d9e7b984",32759:"7800d508",32944:"272aa200",33048:"25c6d77a",33098:"71ba2dc1",33460:"9107c65f",33577:"a32c313f",33992:"cbf3c4ec",34321:"6f56eca8",34438:"54cab4d4",34662:"cf3c245e",34726:"1b6591f7",34750:"07e708e9",34935:"6da448d1",34975:"ff5ed6ba",35223:"db7d4591",35540:"ce86e3e6",35563:"e7977816",35654:"dc4059b2",35742:"aba21aa0",35748:"1312139a",35884:"9c9052d1",36058:"a2a1c245",36132:"e8f4756d",36353:"reactPlayerPreview",36731:"bd568e77",36886:"8abbb0ee",36920:"ed772d97",37107:"3817c387",37296:"a2757506",37516:"9f1829f0",37710:"abd13aa2",37850:"b28bd8b1",37990:"441fd5fc",38031:"8ee9837e",38419:"bd6f2233",38471:"caf7731d",38527:"5e7d099e",38610:"c868bccf",38691:"036b5431",38717:"897331c0",38792:"4f0519c7",38853:"fc67ad3d",38864:"fac0eceb",39026:"c7156cf2",39056:"5f6b1733",39080:"511f9951",39408:"fe2e2e26",39431:"cdd4a9c6",39482:"327b0a57",39558:"50f2f9f3",39757:"9e0c2c37",39911:"92466816",40271:"6a734661",40374:"b5dcbe95",40563:"39dec3ba",40575:"33c1d41a",41237:"88a48c42",41507:"16b03284",41865:"fe76eed8",42083:"4048090e",42206:"91aed80e",42434:"5b2d7e3c",42800:"3aa0ab0a",42901:"2115313f",43174:"6ba85e75",43246:"2d16d24d",43444:"d2f6d210",43773:"a81cb65f",43848:"44145933",43888:"ad61550a",43903:"8186ecf9",44046:"5d707891",44486:"c0650537",44602:"69fcd2fc",44609:"c5313007",44630:"65b7208a",44816:"36fcb744",44947:"39ec0930",45141:"b1394c86",45268:"ef4456b5",45295:"f29fc884",45474:"79d28454",45655:"4a55fe3a",45724:"8dfd8953",45742:"c377a04b",46119:"d58f1ee2",46364:"fe522f67",46563:"aeef55f7",46688:"ac3101e9",46921:"d0b9ca74",46961:"2bbc2deb",47120:"dcbfe205",47127:"999788b8",47264:"b9ec56c8",47341:"7f0714d1",47527:"93dcedec",47627:"reactPlayerStreamable",47719:"b7ea99f7",48124:"8f509517",48134:"356ce494",48235:"df15bc7d",48276:"b467d32a",48436:"f6adf820",48552:"954e932f",48579:"566f49fb",48665:"0f4a5c74",49316:"510b9307",49406:"b26210db",49455:"c8139b75",49658:"0d76317c",49921:"fc8b5a5d",50041:"ac002d2b",50404:"98f4e1ec",50765:"bf519c8d",50908:"3fbaac07",51143:"fc6f07d2",51205:"db42f242",51349:"4aec9039",51379:"17f04a83",51637:"81e4ed6a",51780:"eecc43ff",52302:"e7ee6027",52365:"280af06a",52529:"e3d58533",52723:"reactPlayerMux",53084:"23975af2",53148:"9b4ab8cd",53357:"1577f7ed",53774:"53998120",54049:"4867e743",54220:"092bf57d",54530:"a271ef09",54582:"984d6493",54905:"98d962c5",55011:"49145cdf",55388:"b2419a00",55664:"169f3d24",56264:"46eeb6cb",56282:"d636c09f",56383:"ecaa7076",56420:"fd4b36bb",56684:"378935ce",56764:"805a59dc",57035:"f527bef3",57356:"bb9c591b",57694:"21b7a589",57790:"1b218eaa",57869:"a7edc2bd",58022:"c134ef8a",58215:"1111b27e",58718:"afb7a97b",58800:"5144cf5e",59075:"6e29a506",59221:"76259cc3",59332:"857097c6",59409:"a64b2578",59599:"1e1f8072",59600:"ac9d9d69",59949:"5c6f6ba9",60365:"bd118f84",60759:"719163ad",60880:"640696ee",60886:"c10a0985",60893:"6fbf0c67",60908:"0eebd274",61114:"3cc71396",61252:"3b66921f",61273:"099a3596",61291:"d38e3f9f",61358:"3d1ae229",61368:"f28f059c",61505:"e58556b2",61977:"7570de64",62059:"0893faed",62134:"0d7acd84",62357:"6d2a4d3f",62362:"44463284",62573:"bd1cffff",62921:"1d7c691c",62929:"f5fed352",63474:"98c94590",63538:"06393fc1",63706:"2b67eda4",63737:"53e9dd7a",63747:"fb72d7b2",63960:"a6397568",64558:"b91fbf2a",64641:"eac16e1d",64651:"4c781063",64665:"6f44ab90",65110:"063d75bd",65142:"eb4c176e",65433:"616bfcf6",65542:"af754a1f",65655:"1ebbfca8",65755:"bafd283f",65784:"90239e6e",65866:"419cd6b8",66225:"9f8e6d57",66339:"03b2528f",66811:"3e87058f",66850:"0c695afe",66868:"3c4af576",66885:"5e253f2f",66929:"da54b976",67068:"ae0eacdd",67098:"a7bd4aaa",67217:"726a6c22",67349:"61ff6850",67458:"0d271e1e",67532:"49fed513",67570:"reactPlayerMixcloud",67714:"9d7352c0",68230:"3cf6fa35",68364:"812775a4",68391:"24557dbc",68700:"96331245",68874:"10ea0b82",68912:"2c2832e4",68915:"62de5d73",68960:"358c2507",68962:"af68ae04",69050:"4ac2e930",69779:"3c9432f0",69816:"20d56cb7",69891:"62037464",69979:"reactPlayerSoundCloud",70326:"c3373259",70934:"d44e0d1c",71247:"308471de",71383:"087cd58c",71826:"a4c89d62",71907:"86a8bb6c",71967:"4fa4eafa",72074:"71319bec",72132:"83ac10ed",72231:"fe170cc9",72561:"adce8179",73107:"646cbece",73379:"9d779d8b",73932:"2020ed93",73939:"2ed96714",74081:"ce4dbf6d",74583:"4bfca71d",74780:"ebde045d",74834:"d26a73b8",74860:"00d14154",75412:"5390e21f",75702:"307525ba",75822:"2db99065",75868:"071f33a8",75965:"b48f41b9",76093:"7d63aba8",76224:"03b3cfd2",76238:"8615e055",76372:"d802bb56",76768:"8bed5a26",76973:"78ae7ec8",77137:"42abcd4d",77313:"ee65edec",77318:"67e77328",77757:"f6f476f1",78007:"8eead450",78416:"068743c8",78631:"b7b014bf",78702:"82ea7079",79048:"a94703ab",79052:"6d717251",79225:"526e379a",79354:"4118187a",79825:"2d4af3bf",79956:"9e09f891",79983:"a7f483d1",80549:"afde3230",80721:"05fa9a60",81509:"4ead9a95",81657:"f8189ec4",81790:"42a9b3c5",81849:"2e3fc0f9",82075:"056b386b",82201:"18910d94",82261:"0c6fe626",82439:"e4eafb12",82477:"2ca08277",83287:"7af31c45",83752:"efe5610c",83943:"9c5d9512",84219:"51e50f95",84331:"79e0e7f1",84605:"8552f549",84656:"813cfb2f",84750:"aefdd881",84850:"bc03f89b",85462:"9270ba4f",85527:"5143312c",85528:"21e10cde",85556:"21a4ba71",85943:"05fbef88",86012:"da202fdd",86037:"eaeab60b",86057:"9fbfaf6d",86106:"1877d9d5",86298:"e2d6ba1f",86886:"7b33c27b",86887:"reactPlayerFacebook",86992:"3fe65583",87012:"869ae8a7",87126:"b916a1ab",87402:"c3094240",87510:"9d36f238",87760:"0773e78b",88048:"73ca4188",88131:"c2237e68",88494:"504d78e0",88495:"801276a1",88790:"51c7df8c",88843:"45926b62",88946:"95ec96e5",89598:"4b6eee9a",90049:"cc180519",90381:"869d42f3",90642:"07006f9e",90780:"098f2604",91131:"468d57a9",91258:"227d1fc4",91395:"a0aa5253",92113:"32b8fafb",92170:"4951b372",92687:"cd64d641",92811:"8093477b",92896:"bc69c5bc",93036:"c342bcae",93087:"b0f19176",93842:"26398b18",94594:"c7507218",94642:"da19ecb4",94725:"dd31e7e9",94811:"da071cb8",95191:"c75d145e",95409:"94f11012",96449:"19a6be06",96815:"8d02075b",96991:"4eee9c87",97191:"31b73615",97458:"reactPlayerFilePlayer",97499:"50a12feb",97785:"ac5db01d",98042:"819b642a",98116:"49849746",98175:"5a96e453",98498:"ae22b856",98548:"44a83f6a",98601:"13798859",98996:"65c67349",99094:"08aab21d",99180:"32ebcda7",99340:"reactPlayerWistia",99341:"a1154d73",99591:"e0bec135",99989:"51ddac88"}[e]||e)+"."+{456:"5c30ecdd",565:"94a09b6c",762:"df50c981",1160:"918efc1f",1171:"de34cd0e",1572:"ffbe0cfc",1705:"038460b6",1832:"9614689c",1923:"cb2bc5be",1970:"cac2a9b8",2278:"d475be2b",2295:"e81bbf25",2496:"b540b729",2730:"923b54e1",3202:"f35694a9",3230:"4129121e",3249:"82c7846c",3392:"8464e17b",3607:"2981ded1",3783:"71a2f8e8",3877:"58749100",3900:"0ba32b97",4272:"0900e2a1",4276:"8faf83a5",4499:"ca8d1432",4550:"46f5f770",4574:"1c78d390",4645:"e160e737",5e3:"e340e97d",5344:"1d1077a2",5352:"5ee75c06",5441:"151c62bf",5623:"9548c1a1",5819:"a4a89c82",5827:"5cc9996e",5885:"fcb3bbcb",6157:"dbb843db",6215:"51944600",6262:"794fd95d",6265:"83c21074",6308:"350484bc",6463:"bec1a06c",6486:"4b0eb0a1",6497:"42707b0b",6615:"7db76aa6",6918:"031ec4ab",7161:"2c411627",7267:"ce74b45c",7606:"45b626ad",7701:"316b1161",7785:"f569d217",8271:"bce6ddee",8349:"03f95123",8500:"a390a5ca",8734:"2de05990",8927:"f986535a",9264:"6ae52032",9524:"e7c42f6f",9606:"bff55b72",9640:"b703cc22",9647:"cac24016",9671:"0a30cd6c",9837:"ede23a01",10348:"ec8b3811",10700:"708d8037",10845:"2bc04da3",10907:"eb9d65c3",11139:"303df097",11184:"9d69cbad",11301:"8387b5bf",11567:"432c7b35",11607:"b64b2d67",11784:"9d3408ab",11934:"da61538a",11965:"d6e5dd4d",12007:"fb425a62",12042:"a0c42814",12237:"8a850fa6",12716:"faed95e1",12766:"97abbc05",12827:"144f3020",13018:"c5ad98c6",13019:"c5e3aef7",13455:"1451755d",13535:"88a06537",13585:"a746e017",13650:"62810914",14237:"8c2a2bc3",14715:"95abf808",14936:"6ee147d1",15066:"38ece79e",15246:"fd5943dc",15447:"82977fde",16328:"4fa8d3c8",16602:"f2bf07f8",16678:"cb38a105",16869:"995c6ef6",16884:"bf9abfa1",16945:"1eaf58e9",17021:"6c74822a",17209:"e94a64b5",17289:"e2e7eec1",17320:"9ddeadd7",17776:"f89fd2b8",17820:"623e6e0e",18093:"d4afddde",18401:"30c4f83a",18446:"150ff8a0",19049:"08036f4e",19738:"a816c680",20033:"fa674d6a",20210:"4ea135dd",20423:"076d2946",20515:"85d707fe",20681:"7e97a650",20773:"a2cebc00",20826:"8b874cbc",21611:"6e533a7e",21983:"f9a941e2",22422:"feb00a9e",22451:"ef972e5e",22611:"18587ae4",22750:"a52908e5",23321:"84054f56",23452:"ebba4448",23453:"2ff5cbe7",23619:"c27273de",23870:"3742bfab",24078:"730ca41c",24158:"ce6a000b",24295:"4aae9b71",24832:"af6b73df",25362:"f0170814",25427:"3244da9c",25504:"28938478",25666:"2f0c77bf",25691:"426557b6",25692:"585ab289",26173:"076fef9c",26376:"a1f11cb7",26499:"dd7640ab",26622:"f0629b1b",27168:"07813519",27350:"5fd6e6d7",27646:"0678c8f9",27685:"f20ffda9",27740:"8f7d4d98",28235:"f6cbcccb",29248:"d7c12529",29250:"925abd2b",29436:"7ca95c22",29773:"b8c6f670",30248:"0ad8a16e",30418:"5fc7b2a0",30473:"0abc4692",30528:"435813db",30765:"d86090af",30799:"388c9414",30941:"49876b37",31165:"02614496",31267:"933156b4",31471:"450344fc",31474:"dbbf8152",31727:"d3f3b0b1",32055:"a95bfc3b",32096:"04828676",32141:"bcdc361b",32163:"70936a3c",32178:"36e60316",32406:"bd1dc0ac",32461:"6b4a958d",32492:"30cd7c7f",32504:"754ac7de",32741:"552767cd",32759:"d8e2798a",32944:"6f349f74",33048:"1a010730",33098:"480f07f7",33460:"8f3f92e4",33577:"ce38b0c8",33992:"a7260a35",34321:"ab8e5c20",34438:"8f46a7dd",34662:"8da76618",34726:"90739fe9",34750:"13529313",34935:"59f5597e",34975:"41c5c4bb",35223:"2367e813",35540:"daa770e8",35563:"22b8fd33",35654:"72cb9c74",35742:"e08a145a",35748:"816249d7",35884:"a0bf4e6b",36058:"b63b94d9",36132:"75cbf3f9",36353:"4de9bab6",36731:"1ab1d6ee",36886:"9c9e515a",36920:"3a69befa",37107:"f19c047b",37296:"20763684",37516:"2ab4897d",37710:"5cf4ff57",37850:"ed2f760b",37990:"c6c289b1",38031:"396006c8",38419:"a12c2499",38471:"93b2d4dd",38527:"73056614",38610:"37df5efb",38691:"137dc0f8",38717:"6dbb7b59",38792:"7deb9f3e",38853:"5c9e45fe",38864:"4813ef31",39026:"f2f8a69b",39056:"60f70f39",39080:"b0c77b48",39408:"88db313c",39431:"2bcf2e6d",39482:"7e3b08ef",39503:"18fac5cf",39558:"41945f10",39757:"47703e3b",39911:"646e7dec",40271:"f790e023",40374:"179979e4",40563:"94247613",40575:"4d0b112e",41237:"3bbdf534",41507:"77c30778",41865:"c835f8b0",42083:"2aff9481",42206:"18d5693f",42434:"1f6d6607",42800:"bf6545c0",42901:"2fdbe13a",43174:"013544f4",43246:"ddc98077",43444:"cff02423",43773:"3cc7db7d",43848:"57247e24",43888:"d74ff318",43903:"41a52d13",44046:"a946825c",44486:"28ccbcec",44602:"aaf93cb1",44609:"32c1fd2c",44630:"f2d8976e",44816:"0e7f93b4",44947:"a24467f3",45141:"e3968051",45268:"7006193f",45295:"b0715bed",45474:"1abec566",45655:"c2164e90",45724:"b59ddc1b",45742:"2497dd34",46119:"7805de88",46364:"fdfddfc0",46563:"2e6253c5",46688:"a1d131c8",46921:"260d54e0",46961:"94b493aa",47120:"723a0b3e",47127:"de5390c4",47264:"44b44216",47341:"18ca620e",47527:"d950e87e",47627:"bb35fa43",47719:"646275e7",48124:"55af4038",48134:"b6137268",48235:"bc75728e",48276:"231a1e55",48436:"89305d4a",48552:"c704b5f4",48579:"bbd9e592",48665:"b81074e2",49316:"5e345ac8",49406:"a3ecaee8",49455:"15c58fe1",49658:"3da918b0",49921:"f2c2a1f0",50041:"f7cb55c7",50404:"eb1ab0f9",50765:"479f1916",50908:"a5b524ad",51143:"136727d9",51205:"ee2e77cb",51349:"1e076875",51379:"27ea6246",51637:"ffb79940",51780:"ce9149be",52302:"340b0e6b",52365:"d23ef6a9",52529:"e7cefacb",52723:"3e4df075",53084:"315da40f",53148:"4212deb6",53357:"b5a1c415",53774:"72126425",54049:"4089600b",54220:"d4f185d8",54530:"0bd12311",54582:"4e5700b0",54905:"feb41c26",55011:"95879cb0",55388:"33179a2f",55664:"258a4e6b",56264:"6318e439",56282:"b46c91af",56383:"1ff19ca5",56420:"1972625f",56684:"ab8eab18",56764:"ac5b41d7",57035:"ad79c7ab",57356:"42441995",57694:"a34951a6",57790:"7f79a47a",57869:"89931416",58022:"7b3238f1",58215:"5be13c8d",58718:"a820c36e",58800:"e98ceb1d",59075:"25749229",59221:"658e6207",59332:"84712487",59409:"be73a79d",59599:"780630f8",59600:"ca1b31c5",59949:"0c457c29",60365:"1fd2fa70",60759:"d322d307",60880:"f6ba7287",60886:"67c47b8d",60893:"fe1ea3f9",60908:"e76a5e92",61114:"46cf560e",61252:"c36d8746",61273:"05750299",61291:"0f509abf",61358:"9defced7",61368:"88200516",61505:"1a21d780",61977:"3a915ac8",62059:"27a610be",62134:"136bb77a",62357:"dd821bdf",62362:"8db1be48",62573:"09b3ebf3",62921:"9d42f085",62929:"c76283aa",63474:"bb220697",63538:"7b7f0e14",63706:"6f94bc8f",63737:"af78b6a2",63747:"7c5b8fbd",63960:"9f0fe283",64558:"25e0c733",64641:"4002d9f9",64651:"7df9a0dc",64665:"b140ef8f",65110:"0c2123d1",65142:"d226848c",65433:"d959ad9b",65542:"a7c67c53",65655:"3f647a48",65755:"c46f5968",65784:"b94d85b3",65866:"f9e10c84",66225:"f10f224f",66339:"800c2e61",66811:"945f99d9",66850:"7753ee7f",66868:"65080ded",66885:"1bd3e9c3",66929:"d218d95f",67068:"046fc798",67098:"03929b29",67217:"c9c29188",67349:"b94a3a6a",67458:"f760b356",67532:"60df9b16",67570:"12aff88e",67714:"973cd9fc",68230:"835eaee7",68364:"53e94f68",68391:"262895ce",68700:"64fe7812",68874:"d1febe02",68912:"0c81f713",68915:"57e00474",68960:"18b5e3ad",68962:"d845c0a4",69050:"358b5513",69779:"faba2980",69816:"58af7b00",69891:"80af80ae",69979:"f8f19bc3",70326:"fafebdcb",70934:"73854ef9",71247:"5a63971c",71383:"75b257bc",71826:"9f1c6fe5",71907:"0751c0f3",71967:"1af4694c",72074:"522fdb31",72132:"6e4054d2",72231:"e3c174bf",72561:"1f9fbc90",73107:"ecc6be9c",73379:"16b17994",73932:"b35fd796",73939:"aba6bb06",74081:"b57cba4e",74583:"ce4c9b2f",74780:"b7d71cb3",74834:"15357603",74860:"426c5862",75412:"d72a934a",75702:"3926a131",75822:"1d9852b1",75868:"3118d0c9",75965:"19020673",76093:"8e28eeb6",76224:"8f29238e",76238:"46cbd86e",76372:"297afbc9",76768:"c3ca6e24",76973:"a72e321d",77137:"daff0432",77313:"b92d7b2e",77318:"44e1adab",77757:"eb1c1544",78007:"2b6a8f00",78416:"2ad246f2",78631:"b6f33b62",78702:"ed155bd3",79048:"0f54d2a9",79052:"634be361",79225:"bad5b331",79354:"d6957fa9",79825:"8c4cf900",79956:"4d5ec1eb",79983:"52b6f63f",80549:"a1b3777a",80721:"cdf43ae5",81509:"5a98113a",81657:"d230bb30",81790:"c56f6a89",81849:"0f44253c",82075:"7a5a588a",82201:"c855be90",82237:"787c04ec",82261:"2fc96e72",82439:"18a56b6c",82477:"12d174de",83287:"084dde1a",83752:"d91cc53e",83943:"a64bf43a",84219:"d24c437b",84331:"b37577e8",84605:"8cf0495c",84656:"73c53ede",84750:"1857e769",84850:"f287e029",85462:"ddca2c18",85527:"3afd894d",85528:"74b87448",85556:"fee97575",85943:"e5b4cdd6",86012:"ab7bdaa5",86037:"04050011",86057:"db95e34c",86106:"1290858d",86298:"92e42ef4",86886:"dad3b87b",86887:"508da014",86992:"82004d70",87012:"fd4f4b30",87126:"89adbb17",87402:"abdfd46c",87510:"720f0f93",87760:"72f8f4bb",88048:"2a1833d8",88131:"e11652fa",88494:"7d33658e",88495:"efabda4c",88790:"c5a360b0",88843:"ba8ab281",88946:"350ed3aa",89598:"30bcd67d",90049:"70470979",90381:"4acaccf6",90642:"83acf9a9",90780:"75e3e359",91131:"759062e1",91258:"0a10d55b",91395:"31f57203",92113:"d51c7aa0",92170:"f7b1e9bd",92687:"bed1a1d3",92811:"8a204457",92896:"b265749e",93036:"7c8d08ac",93087:"0090bbd7",93842:"d418eca4",94594:"42c52295",94642:"c0efeaa4",94725:"7118b112",94811:"933445a7",95191:"0ee87f70",95409:"6f87b63a",96449:"9cfed380",96815:"362b1a69",96991:"eca5cf70",97191:"ca75b3a5",97458:"036de6e1",97499:"1a4e721e",97785:"433c50c6",98042:"14a96714",98116:"a22cb511",98175:"b8bdaaeb",98498:"1128c3c9",98548:"0250dbf6",98601:"75b6fdce",98996:"433b1eca",99094:"54319916",99180:"e5d0a4e7",99340:"c5c0cf6c",99341:"4403c816",99591:"4e74c25b",99989:"1ffc7914"}[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={},d="serverpod-docs:",t.l=(e,a,c,b)=>{if(f[e])f[e].push(a);else{var r,o;if(void 0!==c)for(var l=document.getElementsByTagName("script"),n=0;n{r.onerror=r.onload=null,clearTimeout(s);var d=f[e];if(delete f[e],r.parentNode&&r.parentNode.removeChild(r),d&&d.forEach((e=>e(c))),a)return a(c)},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:"98601",16116660:"32178",17896441:"18401",44145933:"43848",44463284:"62362",49849746:"98116",53998120:"53774",62037464:"69891",68401255:"20210",79840965:"3877",92466816:"39911",96331245:"68700",96523456:"24295",cb867d98:"456","3f04b2f3":"565",cdc118a8:"762","638e38ae":"1160",b685e31b:"1171","02c0cfe0":"1572","1921e4ca":"1705",bdc5a52e:"1832",b32c213b:"1923",dbf9e27d:"1970","27e827f8":"2278","0a5c01b2":"2295","3874f1bf":"2496",ac6e050c:"2730","8e7261c9":"3202","9d217e1f":"3230","05ec9480":"3249",reactPlayerVidyard:"3392",d8d6d57b:"3607",a6c3ea4a:"3783",ecb3c634:"3900","17dc776d":"4272","7a3d47b3":"4276",f149b10e:"4499",e3443ce0:"4550","976a2d80":"4574","9644aa4e":"4645",da698f4c:"5000","8baf194b":"5344","52f87500":"5352",af1c5d2b:"5441","10ad1fa6":"5623",e4a796aa:"5819","3d277f18":"5827","3e4a4cb2":"5885",cce58fe7:"6157",f3467f26:"6215","27b43779":"6262","46b54090":"6265","2890c80c":"6308",reactPlayerKaltura:"6463","2e1ee4ed":"6486","5112ebe3":"6497","7b06977d":"6615","89b55a09":"6918","19e323d1":"7161","2db5c390":"7267","7517a61c":"7606",c2b45dbb:"7701","95bf5f56":"7785","94b2bc9a":"8271","06a408fe":"8349","4c5c4c2e":"8500","82e43b76":"8734",b8787c81:"8927","1caa8cdb":"9264",daec0d60:"9524","4519f039":"9606","5589c54d":"9640","5e95c892":"9647",e64edb60:"9671","5a0a1617":"9837",fca5fdb4:"10348","313c9eb1":"10700","5c1eff22":"10845",f7ae65ac:"10907",dc7352a7:"11139","8af032d3":"11184",f584139f:"11301","22dd74f7":"11567",ef2492df:"11607","45dd886d":"11784",b809d820:"11934","1457ddcd":"11965","90ec8c6b":"12007",reactPlayerTwitch:"12042",b6f81eaa:"12237",d2aa311d:"12716","4934de22":"12766","28967b3e":"12827","076cf272":"13018",d3938b1f:"13019","5839343c":"13455",e84b4e80:"13535",ea237062:"13585","2d11a680":"13650","95a5d2b2":"14237",fc8c8cde:"14715","7c8e5227":"14936",fe3f3783:"15066","83c6f999":"15246","30bd0f5b":"15447",reactPlayerDailyMotion:"16328","616631fd":"16602","710ac1c1":"16678","444a6d4e":"16869","4ed1e0ac":"16884","5596dd05":"16945","828ace52":"17021",f9bde383:"17209","45939ed5":"17289","55f37562":"17320","070c8c93":"17776",ebd05845:"17820","0841186f":"18093",reactPlayerYouTube:"18446","2fca5c64":"19049","87ab7385":"19738","986f0f98":"20033","22f51758":"20423","704545ab":"20515",e66f2658:"20681",d4fc3158:"20773","4ab30eec":"20826","82444e58":"21611","57012fa6":"21983",d3af5b3c:"22422",f5a589e7:"22451","59df87e8":"22611","141135bb":"22750","676f1bdb":"23321","5af30237":"23452",ed64c12e:"23453",f6affd6e:"23619","956829f8":"23870",ec91ff36:"24078","1d39c85d":"24158","02e41de2":"24832","5bc657fa":"25362","3edac44d":"25427","0f2c2e36":"25504","522ca66b":"25666","9a594c98":"25691","7ca2e59a":"25692",reactPlayerVimeo:"26173","431ffdb5":"26376",a4adf53f:"26499",d9107a6a:"26622","7ac69e68":"27168","65e04ea3":"27350","12407b36":"27646","6aee17c2":"27685","38e32826":"27740","965931d7":"28235","4a49065b":"29248",dec2bd4a:"29250",dc8c27bd:"29436","1a84c7fd":"29773",b1218054:"30248","6feb7661":"30418","3141060a":"30473","1323771c":"30528","85d514f3":"30765","1a39ee04":"30799","4aa94ec1":"30941","926056c1":"31165","08d55cf7":"31267","3f80bb14":"31471","564db590":"31474","2e18ba50":"31727","9037180b":"32055",c090764b:"32096",df1414bb:"32141","3d150a24":"32163","5cde491b":"32406",a6311318:"32461","4e689a0b":"32492","7de3e81f":"32504",d9e7b984:"32741","7800d508":"32759","272aa200":"32944","25c6d77a":"33048","71ba2dc1":"33098","9107c65f":"33460",a32c313f:"33577",cbf3c4ec:"33992","6f56eca8":"34321","54cab4d4":"34438",cf3c245e:"34662","1b6591f7":"34726","07e708e9":"34750","6da448d1":"34935",ff5ed6ba:"34975",db7d4591:"35223",ce86e3e6:"35540",e7977816:"35563",dc4059b2:"35654",aba21aa0:"35742","1312139a":"35748","9c9052d1":"35884",a2a1c245:"36058",e8f4756d:"36132",reactPlayerPreview:"36353",bd568e77:"36731","8abbb0ee":"36886",ed772d97:"36920","3817c387":"37107",a2757506:"37296","9f1829f0":"37516",abd13aa2:"37710",b28bd8b1:"37850","441fd5fc":"37990","8ee9837e":"38031",bd6f2233:"38419",caf7731d:"38471","5e7d099e":"38527",c868bccf:"38610","036b5431":"38691","897331c0":"38717","4f0519c7":"38792",fc67ad3d:"38853",fac0eceb:"38864",c7156cf2:"39026","5f6b1733":"39056","511f9951":"39080",fe2e2e26:"39408",cdd4a9c6:"39431","327b0a57":"39482","50f2f9f3":"39558","9e0c2c37":"39757","6a734661":"40271",b5dcbe95:"40374","39dec3ba":"40563","33c1d41a":"40575","88a48c42":"41237","16b03284":"41507",fe76eed8:"41865","4048090e":"42083","91aed80e":"42206","5b2d7e3c":"42434","3aa0ab0a":"42800","2115313f":"42901","6ba85e75":"43174","2d16d24d":"43246",d2f6d210:"43444",a81cb65f:"43773",ad61550a:"43888","8186ecf9":"43903","5d707891":"44046",c0650537:"44486","69fcd2fc":"44602",c5313007:"44609","65b7208a":"44630","36fcb744":"44816","39ec0930":"44947",b1394c86:"45141",ef4456b5:"45268",f29fc884:"45295","79d28454":"45474","4a55fe3a":"45655","8dfd8953":"45724",c377a04b:"45742",d58f1ee2:"46119",fe522f67:"46364",aeef55f7:"46563",ac3101e9:"46688",d0b9ca74:"46921","2bbc2deb":"46961",dcbfe205:"47120","999788b8":"47127",b9ec56c8:"47264","7f0714d1":"47341","93dcedec":"47527",reactPlayerStreamable:"47627",b7ea99f7:"47719","8f509517":"48124","356ce494":"48134",df15bc7d:"48235",b467d32a:"48276",f6adf820:"48436","954e932f":"48552","566f49fb":"48579","0f4a5c74":"48665","510b9307":"49316",b26210db:"49406",c8139b75:"49455","0d76317c":"49658",fc8b5a5d:"49921",ac002d2b:"50041","98f4e1ec":"50404",bf519c8d:"50765","3fbaac07":"50908",fc6f07d2:"51143",db42f242:"51205","4aec9039":"51349","17f04a83":"51379","81e4ed6a":"51637",eecc43ff:"51780",e7ee6027:"52302","280af06a":"52365",e3d58533:"52529",reactPlayerMux:"52723","23975af2":"53084","9b4ab8cd":"53148","1577f7ed":"53357","4867e743":"54049","092bf57d":"54220",a271ef09:"54530","984d6493":"54582","98d962c5":"54905","49145cdf":"55011",b2419a00:"55388","169f3d24":"55664","46eeb6cb":"56264",d636c09f:"56282",ecaa7076:"56383",fd4b36bb:"56420","378935ce":"56684","805a59dc":"56764",f527bef3:"57035",bb9c591b:"57356","21b7a589":"57694","1b218eaa":"57790",a7edc2bd:"57869",c134ef8a:"58022","1111b27e":"58215",afb7a97b:"58718","5144cf5e":"58800","6e29a506":"59075","76259cc3":"59221","857097c6":"59332",a64b2578:"59409","1e1f8072":"59599",ac9d9d69:"59600","5c6f6ba9":"59949",bd118f84:"60365","719163ad":"60759","640696ee":"60880",c10a0985:"60886","6fbf0c67":"60893","0eebd274":"60908","3cc71396":"61114","3b66921f":"61252","099a3596":"61273",d38e3f9f:"61291","3d1ae229":"61358",f28f059c:"61368",e58556b2:"61505","7570de64":"61977","0893faed":"62059","0d7acd84":"62134","6d2a4d3f":"62357",bd1cffff:"62573","1d7c691c":"62921",f5fed352:"62929","98c94590":"63474","06393fc1":"63538","2b67eda4":"63706","53e9dd7a":"63737",fb72d7b2:"63747",a6397568:"63960",b91fbf2a:"64558",eac16e1d:"64641","4c781063":"64651","6f44ab90":"64665","063d75bd":"65110",eb4c176e:"65142","616bfcf6":"65433",af754a1f:"65542","1ebbfca8":"65655",bafd283f:"65755","90239e6e":"65784","419cd6b8":"65866","9f8e6d57":"66225","03b2528f":"66339","3e87058f":"66811","0c695afe":"66850","3c4af576":"66868","5e253f2f":"66885",da54b976:"66929",ae0eacdd:"67068",a7bd4aaa:"67098","726a6c22":"67217","61ff6850":"67349","0d271e1e":"67458","49fed513":"67532",reactPlayerMixcloud:"67570","9d7352c0":"67714","3cf6fa35":"68230","812775a4":"68364","24557dbc":"68391","10ea0b82":"68874","2c2832e4":"68912","62de5d73":"68915","358c2507":"68960",af68ae04:"68962","4ac2e930":"69050","3c9432f0":"69779","20d56cb7":"69816",reactPlayerSoundCloud:"69979",c3373259:"70326",d44e0d1c:"70934","308471de":"71247","087cd58c":"71383",a4c89d62:"71826","86a8bb6c":"71907","4fa4eafa":"71967","71319bec":"72074","83ac10ed":"72132",fe170cc9:"72231",adce8179:"72561","646cbece":"73107","9d779d8b":"73379","2020ed93":"73932","2ed96714":"73939",ce4dbf6d:"74081","4bfca71d":"74583",ebde045d:"74780",d26a73b8:"74834","00d14154":"74860","5390e21f":"75412","307525ba":"75702","2db99065":"75822","071f33a8":"75868",b48f41b9:"75965","7d63aba8":"76093","03b3cfd2":"76224","8615e055":"76238",d802bb56:"76372","8bed5a26":"76768","78ae7ec8":"76973","42abcd4d":"77137",ee65edec:"77313","67e77328":"77318",f6f476f1:"77757","8eead450":"78007","068743c8":"78416",b7b014bf:"78631","82ea7079":"78702",a94703ab:"79048","6d717251":"79052","526e379a":"79225","4118187a":"79354","2d4af3bf":"79825","9e09f891":"79956",a7f483d1:"79983",afde3230:"80549","05fa9a60":"80721","4ead9a95":"81509",f8189ec4:"81657","42a9b3c5":"81790","2e3fc0f9":"81849","056b386b":"82075","18910d94":"82201","0c6fe626":"82261",e4eafb12:"82439","2ca08277":"82477","7af31c45":"83287",efe5610c:"83752","9c5d9512":"83943","51e50f95":"84219","79e0e7f1":"84331","8552f549":"84605","813cfb2f":"84656",aefdd881:"84750",bc03f89b:"84850","9270ba4f":"85462","5143312c":"85527","21e10cde":"85528","21a4ba71":"85556","05fbef88":"85943",da202fdd:"86012",eaeab60b:"86037","9fbfaf6d":"86057","1877d9d5":"86106",e2d6ba1f:"86298","7b33c27b":"86886",reactPlayerFacebook:"86887","3fe65583":"86992","869ae8a7":"87012",b916a1ab:"87126",c3094240:"87402","9d36f238":"87510","0773e78b":"87760","73ca4188":"88048",c2237e68:"88131","504d78e0":"88494","801276a1":"88495","51c7df8c":"88790","45926b62":"88843","95ec96e5":"88946","4b6eee9a":"89598",cc180519:"90049","869d42f3":"90381","07006f9e":"90642","098f2604":"90780","468d57a9":"91131","227d1fc4":"91258",a0aa5253:"91395","32b8fafb":"92113","4951b372":"92170",cd64d641:"92687","8093477b":"92811",bc69c5bc:"92896",c342bcae:"93036",b0f19176:"93087","26398b18":"93842",c7507218:"94594",da19ecb4:"94642",dd31e7e9:"94725",da071cb8:"94811",c75d145e:"95191","94f11012":"95409","19a6be06":"96449","8d02075b":"96815","4eee9c87":"96991","31b73615":"97191",reactPlayerFilePlayer:"97458","50a12feb":"97499",ac5db01d:"97785","819b642a":"98042","5a96e453":"98175",ae22b856:"98498","44a83f6a":"98548","65c67349":"98996","08aab21d":"99094","32ebcda7":"99180",reactPlayerWistia:"99340",a1154d73:"99341",e0bec135:"99591","51ddac88":"99989"}[e]||e,t.p+t.u(e)},(()=>{var e={45354:0,71869:0};t.f.j=(a,c)=>{var f=t.o(e,a)?e[a]:void 0;if(0!==f)if(f)c.push(f[2]);else if(/^(45354|71869)$/.test(a))e[a]=0;else{var d=new Promise(((c,d)=>f=e[a]=[c,d]));c.push(f[2]=d);var b=t.p+t.u(a),r=new Error;t.l(b,(c=>{if(t.o(e,a)&&(0!==(f=e[a])&&(e[a]=void 0),f)){var d=c&&("load"===c.type?"missing":c.type),b=c&&c.target&&c.target.src;r.message="Loading chunk "+a+" failed.\n("+d+": "+b+")",r.name="ChunkLoadError",r.type=d,r.request=b,f[1](r)}}),"chunk-"+a,a)}},t.O.j=a=>0===e[a];var a=(a,c)=>{var f,d,b=c[0],r=c[1],o=c[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(c);l Capabilities | Serverpod - + diff --git a/docs/concepts/authentication/basics.html b/docs/concepts/authentication/basics.html index cd47c0aea..82372cfc6 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 388a4fd8a..b06904b21 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 97467d310..95ef388f2 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 248716da5..6a4b3af03 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 412d77cb0..f27de17f8 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 eabb5a531..3653aefaf 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 e12301219..5b60e3929 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 16fb2f262..bda9d2d2d 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 b11821d66..f153aceec 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 f36d85154..384396f64 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 610d4c298..af6a7b4ec 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 3083eadd8..9f3c34e67 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 f26867a08..978fce4cf 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 52e040213..546d6b7fe 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 a1cf5734b..9141f7369 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 7ae004c46..84743b8e7 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 776f93fe7..3ff5aba90 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 8d9dcb985..33cd7d054 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 03bc34c5e..05d82f91f 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 add05ab98..03d41a638 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 afa428a0e..4d6579a8f 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 df2b64391..4b17937f3 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 72275d727..1ab9d74e3 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 d0ece4b86..7827ff858 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 3583bfe4a..0f49be039 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 cc62f380e..68621f4b2 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 80ea0942f..4de5e2d9d 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 ef1670d0c..cf8746499 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 d1160556a..00610b026 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 c320244a1..736f180e9 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 6a1b7c8b3..9fd91e625 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 503eb6016..5ad828eb8 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 823aace9c..7e5f57ff4 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 2a6b8829c..cdffa06df 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 cda5fe153..36a367171 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 d2d263972..24bbbcd45 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 e17a4f045..90e13cb57 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 828102578..3da35ec3d 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 9953847a7..99cd8c3f1 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 ec2ada58f..f20aafdae 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 e581ece01..1c306d81d 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 97f0dc23f..87be06e05 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 f28d06e14..7d9b60bbf 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 f02a5b800..9d1bb00e0 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 1e9e19ef2..6a2f6654a 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 9d5b3d22d..18211dd11 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 48c4a751e..9f0fc569e 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 8aa68484d..02c99bbed 100644 --- a/docs/get-started-with-mini.html +++ b/docs/get-started-with-mini.html @@ -4,7 +4,7 @@ Get started with Mini | Serverpod - + diff --git a/docs/get-started.html b/docs/get-started.html index c88e8efcf..f73947d55 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 301b65dd1..4847d0789 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 a3092d07e..54618af80 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 603c6e620..d3b1138a0 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 7489a7319..9262c6eae 100644 --- a/docs/next/concepts/authentication/basics.html +++ b/docs/next/concepts/authentication/basics.html @@ -4,14 +4,14 @@ The basics | Serverpod - +
Version: Next

The basics

Serverpod automatically checks if the user is logged in and if the user has the right privileges to access the endpoint. When using the serverpod_auth module you will not have to worry about keeping track of tokens, refreshing them or, even including them in requests as this all happens automatically under the hood.

-

The Session object provides information about the current user. A unique userId identifies a user. You should use this id whenever you a referring to a user. Access the id of a signed-in user through the auth field of the Session object.

-
Future<void> myMethod(Session session) async {
var userId = await session.auth.authenticatedUserId;
...
}
+

The Session object provides information about the current user. A unique userId identifies a user. You should use this id whenever you a referring to a user. Access the id of a signed-in user through the authenticated field of the Session object.

+
Future<void> myMethod(Session session) async {
var userId = (await session.authenticated)?.userId;
...
}

You can also use the Session object to check if a user is authenticated:

Future<void> myMethod(Session session) async {
var isSignedIn = await session.isUserSignedIn;
...
}

Requiring authentication on endpoints

@@ -28,6 +28,18 @@

Custom scopes<
class CustomScope extends Scope {
const CustomScope(String name) : super(name);

static const userRead = CustomScope('userRead');
static const userWrite = CustomScope('userWrite');
}

Then use the custom scopes like this:

class MyEndpoint extends Endpoint {

bool get requireLogin => true;


Set<Scope> get requiredScopes => {CustomScope.userRead, CustomScope.userWrite};

Future<void> myMethod(Session session) async {
...
}
...
}
-
caution

Keep in mind that a scope is merely an arbitrary string and can be written in any format you prefer. However, it's crucial to use unique strings for each scope, as duplicated scope strings may lead to unintentional data exposure.

+
caution

Keep in mind that a scope is merely an arbitrary string and can be written in any format you prefer. However, it's crucial to use unique strings for each scope, as duplicated scope strings may lead to unintentional data exposure.

+

User authentication

+

The StatusEndpoint class includes methods for handling user sign-outs, whether from a single device or all devices.

+
info

In addition to the StatusEndpoint methods, Serverpod provides more comprehensive tools for managing user authentication and sign-out processes across multiple devices.

For more detailed information on managing and revoking authentication keys, please refer to the Revoking authentication keys section.

+

Sign out device

+

To sign out a single device:

+
await client.modules.auth.status.signOutDevice();
+

This status endpoint method obtains the authentication key from session's authentication information, then revokes that key.

+

Sign out all devices

+

To sign the user out across all devices:

+
await client.modules.auth.status.signOutAllDevices();
+

This status endpoint retrieves the user ID from session's authentication information, then revokes all authentication keys related to that user.

+
info

The signOut status endpoint is deprecated. Use signOutDevice or signOutAllDevices instead.

await client.modules.auth.status.signOut();  // Deprecated

The behavior of signOut is controlled by legacyUserSignOutBehavior, which you can adjust in the configure authentication section. This allows you to control the signout behaviour of already shipped clients.

\ No newline at end of file diff --git a/docs/next/concepts/authentication/custom-overrides.html b/docs/next/concepts/authentication/custom-overrides.html index b41388533..5dfab443c 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 77b1e83a6..90a5d270b 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 4f25cbce4..962d58473 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 - + @@ -34,19 +34,43 @@

Se

Once the auth token is created, it should be sent to the client. We recommend doing this using an AuthenticationResponse. This ensures compatibility with the client-side authentication module.

class MyAuthenticationEndpoint extends Endpoint {
Future<AuthenticationResponse> login(
Session session,
String username,
String password,
) async {
// Authenticates a user with email and password.
if (!authenticateUser(session, username, password)) {
return AuthenticationResponse(success: false);
}

// Finds or creates a user in the database using the User methods.
var userInfo = findOrCreateUser(session, username);

// Creates an authentication key for the user.
var authToken = await UserAuthentication.signInUser(
session,
userInfo.id!,
'myAuth',
scopes: {},
);

// Returns the authentication response.
return AuthenticationResponse(
success: true,
keyId: authToken.id,
key: authToken.key,
userInfo: userInfo,
);
}
}

The example above shows how to create an AuthenticationResponse with the auth token and user information.

-

Remove auth token

-

Signing out a user on all devices is made simple with the signOutUser method in the UserAuthentication class. The method removes all auth tokens associated with the user.

-
class AuthenticatedEndpoint extends Endpoint {

bool get requireLogin => true;
Future<void> logout(Session session) async {
await UserAuthentication.signOutUser(session);
}
}
-

In the above example, the logout endpoint removes all auth tokens associated with the user. The user is then signed out and loses access to any protected endpoints.

-

Remove specific tokens

-

The AuthKey table stores all auth tokens and can be interacted with in the same way as any other model with a database in Serverpod. To remove specific tokens, the AuthKey table can be interacted with directly.

+

Revoking authentication keys

+

Serverpod provides built-in methods for managing user authentication across multiple devices. These methods handle several critical security and state management processes automatically, ensuring consistent and secure authentication state across your servers. When using the authentication management methods (signOutUser or revokeAuthKey), the following key actions are automatically handled:

+
    +
  • Closing all affected method streaming connections to maintain connection integrity.
  • +
  • Synchronizing authentication state across all connected servers.
  • +
  • Updating the session's authentication state with session.updateAuthenticated(null) if the affected user is currently authenticated.
  • +
+

Revoking specific keys

+

To revoke specific authentication keys, use the revokeAuthKey method:

+
await UserAuthentication.revokeAuthKey(
session,
authKeyId: 'auth-key-id-here',
);
+
Fetching and revoking an authentication key using AuthenticationInfo
+

To revoke a specific authentication key for the current session, you can directly access the session's authentication information and call the revokeAuthKey method:

+
// Fetch the authentication information for the current session
var authId = (await session.authenticated)?.authId;

// Revoke the authentication key if the session is authenticated and has an authId
if (authId != null) {
await UserAuthentication.revokeAuthKey(
session,
authKeyId: authId,
);
}
+
Fetching and revoking a specific authentication key for a user
+

To revoke a specific authentication key associated with a user, you can retrieve all authentication keys for that user and select the key you wish to revoke:

+
// Fetch all authentication keys for the user
var authKeys = await AuthKey.db.find(
session,
where: (t) => t.userId.equals(userId),
);

// Revoke a specific key (for example, the last one)
if (authKeys.isNotEmpty) {
var authKeyId = authKeys.last.id.toString(); // Convert the ID to string
await UserAuthentication.revokeAuthKey(
session,
authKeyId: authKeyId,
);
}
+
Removing specific tokens (direct deletion)
await AuthKey.db.deleteWhere(
session,
where: (t) => t.userId.equals(userId) & t.method.equals('username'),
);
-

In the above example, all auth tokens associated with the user userId and created with the method username are removed from the AuthKey table.

+
warning

Directly removing authentication tokens from the AuthKey table bypasses necessary processes such as closing method streaming connections and synchronizing servers state. It is strongly recommended to use UserAuthentication.revokeAuthKey to ensure a complete and consistent sign-out.

+

Signing out all devices

+

The signOutUser method signs a user out from all devices:

+
await UserAuthentication.signOutUser(
session,
userId: 123, // Optional: If omitted, the currently authenticated user will be signed out
);
+

This method deletes all authentication keys associated with the user.

+
Signing out a specific user
+

In this example, a specific userId is provided to sign out that user from all their devices:

+
// Sign out the user with ID 123 from all devices
await UserAuthentication.signOutUser(
session,
userId: 123,
);
+
Signing out the currently authenticated user
+

If no userId is provided, signOutUser will automatically sign out the user who is currently authenticated in the session:

+
// Sign out the currently authenticated user
await UserAuthentication.signOutUser(
session, // No userId provided, signs out the current user
);
+

Creating a logout endpoint

+

To sign out a user on all devices using an endpoint, the signOutUser method in the UserAuthentication class can be used:

+
class AuthenticatedEndpoint extends Endpoint {

bool get requireLogin => true;

Future<void> logout(Session session) async {
await UserAuthentication.signOutUser(session);
}
}

Client setup

The client must store and include the auth token in communication with the server. Luckily, the client-side authentication module handles this for you through the SessionManager.

The session manager is responsible for storing the auth token and user information. It is initialized on client startup and will restore any existing user session from local storage.

After a successful authentication where an authentication response is returned from the server, the user should be registered in the session manager through the sessionManager.registerSignedInUser(...) method. The session manager singleton is accessible by calling SessionManager.instance.

var serverResponse = await caller.myAuthentication.login(username, password);

if (serverResponse.success) {
// Store the user info in the session manager.
SessionManager sessionManager = await SessionManager.instance;
await sessionManager.registerSignedInUser(
serverResponse.userInfo!,
serverResponse.keyId!,
serverResponse.key!,
);
}
-

The example above shows how to register a signed-in user in the session manager.

+

The example above shows how to register a signed-in user in the session manager.

\ No newline at end of file diff --git a/docs/next/concepts/authentication/providers/email.html b/docs/next/concepts/authentication/providers/email.html index 932f320b2..f80c0611a 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 491f584ef..46fc1cb3f 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 25ec7b169..fba9a12ba 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 7023f1fd5..67864bb49 100644 --- a/docs/next/concepts/authentication/setup.html +++ b/docs/next/concepts/authentication/setup.html @@ -4,7 +4,7 @@ Setup | Serverpod - + @@ -34,7 +34,7 @@

Configure Authentication

Serverpod's auth module comes with a default Authentication Configuration. To customize it, go to your main server.dart file, import the serverpod_auth_server module and set up the authentication configuration:

import 'package:serverpod_auth_server/module.dart' as auth;  

void run(List<String> args) async {

auth.AuthConfig.set(auth.AuthConfig(
minPasswordLength: 12,
));

// Start the Serverpod server.
await pod.start();
}

-
PropertyDescriptionDefault
maxAllowedEmailSignInAttemptsMax allowed failed email sign in attempts within the reset period.5
emailSignInFailureResetTimeThe reset period for email sign in attempts. Defaults to 5 minutes.5min
userCanEditUserImageTrue if users can update their profile images.true
userCanEditUserNameTrue if users can edit their user names.true
userCanEditFullNameTrue if users can edit their full name.false
userCanSeeUserNameTrue if users can view their user name.true
userCanSeeFullNameTrue if users can view their full name.true
enableUserImagesTrue if user images are enabled.true
importUserImagesFromGoogleSignInTrue if user images should be imported when signing in with Google.true
userImageSizeThe size of user images.256
userImageFormatThe format used to store user imagesjpg
userImageQualityThe quality setting for images if JPG format is used.70
userImageGeneratorGenerator used to produce default user images.-
userInfoCacheLifetimeThe duration which user infos are cached locally in the server.1min
onUserWillBeCreatedCalled when a user is about to be created, gives a chance to abort the creation by returning false.-
onUserCreatedCalled after a user has been created. Listen to this callback if you need to do additional setup.-
onUserUpdatedCalled whenever a user has been updated. This can be when the user name is changed or if the user uploads a new profile picture.-
sendPasswordResetEmailCalled when a user should be sent a reset code by email.-
sendValidationEmailCalled when a user should be sent a validation code on account setup.-
validationCodeLengthThe length of the validation code used in the authentication process. This value determines the number of digits in the validation code. Setting this value to less than 3 reduces security.8
passwordResetExpirationTimeThe time for password resets to be valid.24h
extraSaltyHashTrue if the server should use the accounts email address as part of the salt when storing password hashes (strongly recommended).true
firebaseServiceAccountKeyJsonFirebase service account key JSON file. Generate and download from the Firebase console.-
maxPasswordLengthThe maximum length of passwords when signing up with email.128
minPasswordLengthThe minimum length of passwords when signing up with email.8
allowUnsecureRandomTrue if unsecure random number generation is allowed. If set to false, an error will be thrown if the platform does not support secure random number generation.false
+
PropertyDescriptionDefault
allowUnsecureRandomTrue if unsecure random number generation is allowed. If set to false, an error will be thrown if the platform does not support secure random number generation.false
emailSignInFailureResetTimeThe reset period for email sign in attempts. Defaults to 5 minutes.5min
enableUserImagesTrue if user images are enabled.true
extraSaltyHashTrue if the server should use the accounts email address as part of the salt when storing password hashes (strongly recommended).true
firebaseServiceAccountKeyJsonFirebase service account key JSON file. Generate and download from the Firebase console.-
importUserImagesFromGoogleSignInTrue if user images should be imported when signing in with Google.true
legacyUserSignOutBehaviorDefines the default behavior for the deprecated signOut method used in the status endpoint. This setting controls whether users are signed out from all active devices (SignOutOption.allDevices) or just the current device (SignOutOption.currentDevice).SignOutOption.allDevices
maxAllowedEmailSignInAttemptsMax allowed failed email sign in attempts within the reset period.5
maxPasswordLengthThe maximum length of passwords when signing up with email.128
minPasswordLengthThe minimum length of passwords when signing up with email.8
onUserCreatedCalled after a user has been created. Listen to this callback if you need to do additional setup.-
onUserUpdatedCalled whenever a user has been updated. This can be when the user name is changed or if the user uploads a new profile picture.-
onUserWillBeCreatedCalled when a user is about to be created, gives a chance to abort the creation by returning false.-
passwordResetExpirationTimeThe time for password resets to be valid.24h
sendPasswordResetEmailCalled when a user should be sent a reset code by email.-
sendValidationEmailCalled when a user should be sent a validation code on account setup.-
userCanEditFullNameTrue if users can edit their full name.false
userCanEditUserImageTrue if users can update their profile images.true
userCanEditUserNameTrue if users can edit their user names.true
userCanSeeFullNameTrue if users can view their full name.true
userCanSeeUserNameTrue if users can view their user name.true
userImageFormatThe format used to store user images.jpg
userImageGeneratorGenerator used to produce default user images.-
userImageQualityThe quality setting for images if JPG format is used.70
userImageSizeThe size of user images.256
userInfoCacheLifetimeThe duration which user infos are cached locally in the server.1min
validationCodeLengthThe length of the validation code used in the authentication process. This value determines the number of digits in the validation code. Setting this value to less than 3 reduces security.8

Client setup

Add the auth client in your client project's pubspec.yaml.

dependencies:
...
serverpod_auth_client: ^1.x.x
@@ -43,13 +43,31 @@

App setup
dependencies:
flutter:
sdk: flutter
serverpod_flutter: ^1.x.x
auth_example_client:
path: ../auth_example_client

serverpod_auth_shared_flutter: ^1.x.x

Next, you need to set up a SessionManager, which keeps track of the user's state. It will also handle the authentication keys passed to the client from the server, upload user profile images, etc.

late SessionManager sessionManager;
late Client client;

void main() async {
// Need to call this as we are using Flutter bindings before runApp is called.
WidgetsFlutterBinding.ensureInitialized();

// The android emulator does not have access to the localhost of the machine.
// const ipAddress = '10.0.2.2'; // Android emulator ip for the host

// On a real device replace the ipAddress with the IP address of your computer.
const ipAddress = 'localhost';

// Sets up a singleton client object that can be used to talk to the server from
// anywhere in our app. The client is generated from your server code.
// The client is set up to connect to a Serverpod running on a local server on
// the default port. You will need to modify this to connect to staging or
// production servers.
client = Client(
'http://$ipAddress:8080/',
authenticationKeyManager: FlutterAuthenticationKeyManager(),
)..connectivityMonitor = FlutterConnectivityMonitor();

// The session manager keeps track of the signed-in state of the user. You
// can query it to see if the user is currently signed in and get information
// about the user.
sessionManager = SessionManager(
caller: client.modules.auth,
);
await sessionManager.initialize();

runApp(MyApp());
}
-

The SessionManager has useful methods for viewing and monitoring the user's current state:

-
    -
  • The signedInUser will return a UserInfo if the user is currently signed in (or null if the user isn't signed in).
  • -
  • Use the addListener method to get notified of changes to the user's signed in state.
  • -
  • Sign out a user by calling the signOut method.
  • -
-

For example it can be useful to subscribe to changes in the SessionManager and force a rerender of your app.

-

void initState() {
super.initState();

// Rebuild the page if signed in status changes.
sessionManager.addListener(() {
setState(() {});
});
}
+

The SessionManager has useful methods for viewing and monitoring the user's current state.

+

Check authentication state

+

To check if the user is signed in:

+
sessionManager.isSignedIn;
+

Returns true if the user is signed in, or false otherwise.

+

Access current user

+

To retrieve information about the current user:

+
sessionManager.signedInUser;
+

Returns a UserInfo object if the user is currently signed in, or null if the user is not.

+

Register authentication

+

To register a signed in user in the session manager:

+
await sessionManager.registerSignedInUser(
userInfo,
keyId,
authKey,
);
+

This will persist the user information and refresh any open streaming connection, see Custom Providers - Client Setup for more details.

+

Monitor authentication changes

+

To add a listener that tracks changes in the user's authentication state, useful for updating the UI:

+

void initState() {
super.initState();

// Rebuild the page if authentication state changes.
sessionManager.addListener(() {
setState(() {});
});
}
+

The listener is triggered whenever the user's sign-in state changes.

+

Sign out current device

+

To sign the user out on from the current device:

+
await sessionManager.signOutDevice();
+

Returns true if the sign-out is successful, or false if it fails.

+

Sign out all devices

+

To sign the user out across all devices:

+
await sessionManager.signOutAllDevices();
+

Returns true if the user is successfully signed out from all devices, or false if it fails.

+
info

The signOut method is deprecated. This method calls the deprecated signOut status endpoint. For additional details, see the deprecated signout endpoint section. Use signOutDevice or signOutAllDevices instead.

await sessionManager.signOut();  // Deprecated
\ No newline at end of file diff --git a/docs/next/concepts/authentication/working-with-users.html b/docs/next/concepts/authentication/working-with-users.html index ba0250b13..581973563 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 5a6572f34..2c564f11d 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 f740a6e2e..d641fcdc9 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 316397eb2..8470cdc96 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 1b6aa9482..71de181e5 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 e422dd920..4027f8d41 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 1f7f061f0..388dbcec4 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 e06d2a975..0835a11ef 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 4864d4d28..5d50d1024 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 04af4c36e..a4c24f649 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 276c2f548..3859ae39e 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 cc0a2ec1e..92d80dab3 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 532218db0..993cc593d 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 468f2777c..6c1461258 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 b84cb5e55..cfa149eee 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 71b3843d4..138f58e01 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 ee2208359..dd6d5f32d 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 fe942ca17..4278f2cc8 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 ad98f6faf..ddc0ddea3 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 80c1d7cf1..c14a07007 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 f5545b665..ac3354c8e 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 d73deda75..dfca8228d 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/experimental.html b/docs/next/concepts/experimental.html index 99290b4be..d5a18660f 100644 --- a/docs/next/concepts/experimental.html +++ b/docs/next/concepts/experimental.html @@ -4,7 +4,7 @@ Experimental features | Serverpod - + diff --git a/docs/next/concepts/file-uploads.html b/docs/next/concepts/file-uploads.html index 55f266004..36844c269 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 c064e8651..24ad946f7 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 a9f542cb2..6ddd47591 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 cf2cda70b..31eb1112f 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 1695335c6..81acbec9f 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 615c94afe..e6ba1df83 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 694a2bb31..fc17a18b4 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 dc1a9a195..fe120f289 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 7decb9b79..699e0059c 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/testing/advanced-examples.html b/docs/next/concepts/testing/advanced-examples.html index a54e0437a..4ac78133c 100644 --- a/docs/next/concepts/testing/advanced-examples.html +++ b/docs/next/concepts/testing/advanced-examples.html @@ -4,7 +4,7 @@ Advanced examples | Serverpod - + diff --git a/docs/next/concepts/testing/best-practises.html b/docs/next/concepts/testing/best-practises.html index 5aa1487e8..4696e0f63 100644 --- a/docs/next/concepts/testing/best-practises.html +++ b/docs/next/concepts/testing/best-practises.html @@ -4,7 +4,7 @@ Best practises | Serverpod - + diff --git a/docs/next/concepts/testing/get-started.html b/docs/next/concepts/testing/get-started.html index d755e58f7..c04cd45e3 100644 --- a/docs/next/concepts/testing/get-started.html +++ b/docs/next/concepts/testing/get-started.html @@ -4,7 +4,7 @@ Get started | Serverpod - + diff --git a/docs/next/concepts/testing/the-basics.html b/docs/next/concepts/testing/the-basics.html index c5dfa9fb5..6a22a534c 100644 --- a/docs/next/concepts/testing/the-basics.html +++ b/docs/next/concepts/testing/the-basics.html @@ -4,7 +4,7 @@ The basics | Serverpod - + diff --git a/docs/next/concepts/webserver.html b/docs/next/concepts/webserver.html index fc7b43f7c..2366ca037 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 83c2a9eb9..a4a236f1f 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 603cfcb02..086a7c5f0 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 0865010e7..4f7a27254 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 0d53b01ef..0da6eebcc 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 40645c321..86592a136 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 4e138aea7..06010a1a7 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 8acde76ba..a7ba7dc06 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 6f0404d15..36007bcaa 100644 --- a/docs/next/get-started-with-mini.html +++ b/docs/next/get-started-with-mini.html @@ -4,7 +4,7 @@ Get started with Mini | Serverpod - + diff --git a/docs/next/get-started.html b/docs/next/get-started.html index 7dffa08b6..7397fdfb3 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 02c5ca6d6..409d202df 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 c0ed9a017..3cc74fe41 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 f4c977d69..bfdae84d4 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 fe7d3111e..3bede765b 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 2107bec42..529b9c933 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 c2db8b787..a6c98076d 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 b0675a4da..9b4b765bb 100644 --- a/docs/next/tutorials/real-time-communication.html +++ b/docs/next/tutorials/real-time-communication.html @@ -4,7 +4,7 @@ Real-time communication | Serverpod - + diff --git a/docs/next/upgrading/upgrade-from-mini.html b/docs/next/upgrading/upgrade-from-mini.html index 9543e091f..dd8d05f58 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 64b77a5e5..5e5fc599d 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 5e412d8c5..eabdda89a 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 0b1522f42..4cd4a0ffa 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 184b4d9e8..810b244aa 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 eec413482..c28697ce8 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 26592e9b2..1bbe04e52 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 77c3e26d4..6ee6a0e89 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 e7a38a9c1..650cea1eb 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 caea4d963..6b6f80d2f 100644 --- a/docs/tutorials/real-time-communication.html +++ b/docs/tutorials/real-time-communication.html @@ -4,7 +4,7 @@ Real-time communication | Serverpod - + diff --git a/docs/upgrading/upgrade-from-mini.html b/docs/upgrading/upgrade-from-mini.html index 8d9a88a57..f423f0312 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 0428cc02a..dd82fb1da 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 1cabf3246..d102e76a7 100644 --- a/docs/upgrading/upgrade-to-two.html +++ b/docs/upgrading/upgrade-to-two.html @@ -4,7 +4,7 @@ Upgrade to 2.0 | Serverpod - +