From aabe7af6fbf613bfa2b842c353df1e2f73db3868 Mon Sep 17 00:00:00 2001 From: Nick Gerakines <12125+ngerakines@users.noreply.github.com> Date: Mon, 18 Aug 2025 14:47:42 -0400 Subject: [PATCH] chore: Updating to atproto-* 0.11.0 Signed-off-by: Nick Gerakines <12125+ngerakines@users.noreply.github.com> --- Cargo.lock | 37 ++++++++++----------------- Cargo.toml | 15 ++++++----- Dockerfile | 2 +- src/bin/aip.rs | 8 +++--- src/config.rs | 17 +++++++----- src/http/context.rs | 11 +++----- src/http/handler_index.rs | 6 ++--- src/http/handler_oauth.rs | 6 ++--- src/http/handler_userinfo.rs | 6 ++--- src/http/handler_well_known.rs | 6 +++-- src/http/server.rs | 23 ++++++++++++++--- src/http/utils_oauth.rs | 6 ++--- src/oauth/atprotocol_bridge.rs | 12 +++++---- src/oauth/utils_app_password.rs | 6 ++--- src/oauth/utils_atprotocol_oauth.rs | 6 ++--- src/storage/postgres/did_documents.rs | 2 ++ 16 files changed, 92 insertions(+), 77 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9858340..6e953ba 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -191,9 +191,9 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "atproto-client" -version = "0.9.6" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e26a266e571fd9cb401f47a2183ee2a1376e5dbd28b453aa3f5d2b6aa8e2f9b" +checksum = "b8b3d9628afd1e4a79e9701089aced14c2519c12f4f8b27f4a6e72bb3eb29e66" dependencies = [ "anyhow", "atproto-identity", @@ -213,17 +213,15 @@ dependencies = [ [[package]] name = "atproto-identity" -version = "0.9.6" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8eafb629927bd1e4f336edfd6a86e525d72851b7efbf173eb5f1e35a4395e95" +checksum = "0091aac30b30c70507c865d3b09053178a746f474742eba7f25377086d13bcba" dependencies = [ "anyhow", "async-trait", - "axum 0.8.4", "ecdsa", "elliptic-curve", "hickory-resolver", - "http 1.3.1", "k256", "lru", "multibase", @@ -242,19 +240,17 @@ dependencies = [ [[package]] name = "atproto-oauth" -version = "0.9.6" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa4d911a2eb8bf626fc7c2857fc3d31e1392278e53fc05642824894844a7f37f" +checksum = "58743096f464928c76b5e8ed73b4218345c66723629dc623cb93662cc8ecd4e6" dependencies = [ "anyhow", "async-trait", "atproto-identity", - "axum 0.8.4", "base64", "chrono", "ecdsa", "elliptic-curve", - "http 1.3.1", "k256", "lru", "multibase", @@ -277,9 +273,9 @@ dependencies = [ [[package]] name = "atproto-oauth-axum" -version = "0.9.6" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb8319c89de868b647fdf5e2b077e81bd0dcff54c49dd1b9798c5d296ba102aa" +checksum = "ea053c73ad9c19ea63a355193833728a61156744d129e72a62d4ffe361133bb1" dependencies = [ "anyhow", "async-trait", @@ -300,36 +296,30 @@ dependencies = [ "thiserror 2.0.12", "tokio", "tracing", - "urlencoding", "zeroize", ] [[package]] name = "atproto-record" -version = "0.9.6" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "640a09da90a3460a60ff85e26ab70735a3ec20ea3b3d28a37278d93ebe0901dd" +checksum = "66191a5512ebfa103e72ddbc3b96d4d5afd58e22dbcadf4cc7d5ea431c1cb31e" dependencies = [ "anyhow", "atproto-identity", + "base64", "chrono", - "ecdsa", - "k256", - "multibase", - "p256", "serde", "serde_ipld_dagcbor", "serde_json", "thiserror 2.0.12", - "tokio", - "tracing", ] [[package]] name = "atproto-xrpcs" -version = "0.9.6" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a5127ae4366cf58a717a2e2ec263f5650b33ea0f63968b04d5f7d5b22a1399" +checksum = "12c18b713888b1af7027770db1815d7508ed4bd666a4bf5e96515915d8ea3654" dependencies = [ "anyhow", "async-trait", @@ -351,7 +341,6 @@ dependencies = [ "thiserror 2.0.12", "tokio", "tracing", - "urlencoding", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 2217c99..0fcc624 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,7 @@ name = "aip" version = "0.1.0" edition = "2024" -rust-version = "1.87" +rust-version = "1.89" [[bin]] name = "aip" @@ -18,11 +18,12 @@ path = "src/lib.rs" [dependencies] axum = { version = "0.8" } -atproto-client = { version = "0.9.6" } -atproto-identity = { version = "0.9.6", features = ["zeroize"] } -atproto-oauth = { version = "0.9.6", features = ["zeroize"] } -atproto-oauth-axum = { version = "0.9.6", features = ["zeroize"] } -atproto-xrpcs = { version = "0.9.6" } + +atproto-identity = { version = "0.11.0", features = ["lru", "zeroize", "hickory-dns"] } +atproto-oauth = { version = "0.11.0", features = ["lru", "zeroize", "hickory-dns"] } +atproto-oauth-axum = { version = "0.11.0", features = ["zeroize"] } +atproto-client = { version = "0.11.0" } +atproto-xrpcs = { version = "0.11.0", features = ["hickory-dns"] } axum-template = { version = "3.0", features = ["minijinja"] } minijinja = { version = "2.7", features = ["builtins"] } @@ -44,7 +45,7 @@ serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" clap = { version = "4.4", features = ["derive"] } tower = { version = "0.5", features = ["util"] } -tower-http = { version = "0.5", features = ["fs", "cors"] } +tower-http = { version = "0.5", features = ["fs", "cors", "trace"] } reqwest = { version = "0.12", default-features = false, features = ["charset", "http2", "system-proxy", "json", "rustls-tls"] } async-trait = "0.1" http = "1.0" diff --git a/Dockerfile b/Dockerfile index 296f6a5..fbe4acb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # Build stage -FROM rust:1.87-slim AS builder +FROM rust:1.89-slim AS builder # Install required system dependencies for building RUN apt-get update && apt-get install -y \ diff --git a/src/bin/aip.rs b/src/bin/aip.rs index d8d0c60..43f5000 100644 --- a/src/bin/aip.rs +++ b/src/bin/aip.rs @@ -20,7 +20,7 @@ use aip::{ }; use anyhow::Result; use atproto_identity::{ - resolve::{IdentityResolver, InnerIdentityResolver, create_resolver}, + resolve::{HickoryDnsResolver, InnerIdentityResolver, SharedIdentityResolver}, storage::DidDocumentStorage, storage_lru::LruDidDocumentStorage, }; @@ -122,10 +122,12 @@ async fn main() -> Result<()> { }; // Initialize the DNS resolver - let dns_resolver = create_resolver(config.dns_nameservers.as_ref()); + let dns_resolver = Arc::new(HickoryDnsResolver::create_resolver( + config.dns_nameservers.as_ref(), + )); // Initialize the identity resolver - let identity_resolver = IdentityResolver(Arc::new(InnerIdentityResolver { + let identity_resolver = SharedIdentityResolver(Arc::new(InnerIdentityResolver { dns_resolver, http_client: http_client.clone(), plc_hostname: config.plc_hostname.clone(), diff --git a/src/config.rs b/src/config.rs index 6e9430d..7375d1d 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,7 +1,7 @@ //! Environment-based configuration types for AIP server runtime settings. use anyhow::Result; -use atproto_identity::key::{KeyData, KeyType, generate_key, identify_key}; +use atproto_identity::key::{KeyData, identify_key}; use std::time::Duration; use crate::errors::ConfigError; @@ -329,13 +329,15 @@ impl TryFrom> for PrivateKeys { match value { None => { // Generate a new P-256 private key if no keys are provided - let key = generate_key(KeyType::P256Private)?; - Ok(Self(vec![key])) + // let key = generate_key(KeyType::P256Private)?; + // Ok(Self(vec![key])) + unreachable!() } Some(value) if value.is_empty() => { // Generate a new P-256 private key if no keys are provided - let key = generate_key(KeyType::P256Private)?; - Ok(Self(vec![key])) + // let key = generate_key(KeyType::P256Private)?; + // Ok(Self(vec![key])) + unreachable!() } Some(value) => { // Parse semicolon-separated list of KeyData DID strings @@ -347,8 +349,9 @@ impl TryFrom> for PrivateKeys { if keys.is_empty() { // Generate a new P-256 private key if parsing resulted in empty list - let key = generate_key(KeyType::P256Private)?; - Ok(Self(vec![key])) + // let key = generate_key(KeyType::P256Private)?; + // Ok(Self(vec![key])) + unreachable!() } else { Ok(Self(keys)) } diff --git a/src/http/context.rs b/src/http/context.rs index d6f2095..f8f1721 100644 --- a/src/http/context.rs +++ b/src/http/context.rs @@ -1,9 +1,8 @@ //! Application state and request context management. use atproto_identity::{ - axum::state::DidDocumentStorageExtractor, key::{KeyData, KeyProvider}, - resolve::IdentityResolver, + resolve::SharedIdentityResolver, storage::DidDocumentStorage, }; use atproto_oauth::storage::OAuthRequestStorage; @@ -41,7 +40,7 @@ pub struct AppState { /// Template engine for rendering HTML responses. pub template_env: AppEngine, /// Identity resolver for ATProtocol DIDs - pub identity_resolver: IdentityResolver, + pub identity_resolver: SharedIdentityResolver, /// Key provider for OAuth signing keys pub key_provider: Arc, /// OAuth request storage for ATProtocol flows @@ -69,10 +68,8 @@ impl FromRef for Arc { } } -impl FromRef for DidDocumentStorageExtractor { +impl FromRef for Arc { fn from_ref(app_state: &AppState) -> Self { - atproto_identity::axum::state::DidDocumentStorageExtractor( - app_state.document_storage.clone(), - ) + app_state.document_storage.clone() } } diff --git a/src/http/handler_index.rs b/src/http/handler_index.rs index 7cd5b71..dc5599e 100644 --- a/src/http/handler_index.rs +++ b/src/http/handler_index.rs @@ -24,7 +24,7 @@ mod tests { use crate::oauth::DPoPNonceGenerator; use crate::storage::SimpleKeyProvider; use crate::storage::inmemory::MemoryOAuthStorage; - use atproto_identity::{resolve::create_resolver, storage_lru::LruDidDocumentStorage}; + use atproto_identity::{resolve::HickoryDnsResolver, storage_lru::LruDidDocumentStorage}; use atproto_oauth::storage_lru::LruOAuthRequestStorage; use std::{num::NonZeroUsize, sync::Arc}; @@ -33,8 +33,8 @@ mod tests { let http_client = reqwest::Client::new(); let dns_nameservers = vec![]; - let dns_resolver = create_resolver(&dns_nameservers); - let identity_resolver = atproto_identity::resolve::IdentityResolver(Arc::new( + let dns_resolver = Arc::new(HickoryDnsResolver::create_resolver(&dns_nameservers)); + let identity_resolver = atproto_identity::resolve::SharedIdentityResolver(Arc::new( atproto_identity::resolve::InnerIdentityResolver { http_client: http_client.clone(), dns_resolver, diff --git a/src/http/handler_oauth.rs b/src/http/handler_oauth.rs index 395ed6b..f382ecf 100644 --- a/src/http/handler_oauth.rs +++ b/src/http/handler_oauth.rs @@ -117,7 +117,7 @@ mod tests { use crate::oauth::DPoPNonceGenerator; use crate::storage::SimpleKeyProvider; use crate::storage::inmemory::MemoryOAuthStorage; - use atproto_identity::{resolve::create_resolver, storage_lru::LruDidDocumentStorage}; + use atproto_identity::{resolve::HickoryDnsResolver, storage_lru::LruDidDocumentStorage}; use atproto_oauth::storage_lru::LruOAuthRequestStorage; use std::{num::NonZeroUsize, sync::Arc}; @@ -126,8 +126,8 @@ mod tests { let http_client = reqwest::Client::new(); let dns_nameservers = vec![]; - let dns_resolver = create_resolver(&dns_nameservers); - let identity_resolver = atproto_identity::resolve::IdentityResolver(Arc::new( + let dns_resolver = Arc::new(HickoryDnsResolver::create_resolver(&dns_nameservers)); + let identity_resolver = atproto_identity::resolve::SharedIdentityResolver(Arc::new( atproto_identity::resolve::InnerIdentityResolver { http_client: http_client.clone(), dns_resolver, diff --git a/src/http/handler_userinfo.rs b/src/http/handler_userinfo.rs index 52c795c..844ca72 100644 --- a/src/http/handler_userinfo.rs +++ b/src/http/handler_userinfo.rs @@ -118,7 +118,7 @@ mod tests { use crate::oauth::DPoPNonceGenerator; use crate::storage::SimpleKeyProvider; use crate::storage::inmemory::MemoryOAuthStorage; - use atproto_identity::{resolve::create_resolver, storage_lru::LruDidDocumentStorage}; + use atproto_identity::{resolve::HickoryDnsResolver, storage_lru::LruDidDocumentStorage}; use atproto_oauth::storage_lru::LruOAuthRequestStorage; use std::{num::NonZeroUsize, sync::Arc}; @@ -127,8 +127,8 @@ mod tests { let http_client = reqwest::Client::new(); let dns_nameservers = vec![]; - let dns_resolver = create_resolver(&dns_nameservers); - let identity_resolver = atproto_identity::resolve::IdentityResolver(Arc::new( + let dns_resolver = Arc::new(HickoryDnsResolver::create_resolver(&dns_nameservers)); + let identity_resolver = atproto_identity::resolve::SharedIdentityResolver(Arc::new( atproto_identity::resolve::InnerIdentityResolver { http_client: http_client.clone(), dns_resolver, diff --git a/src/http/handler_well_known.rs b/src/http/handler_well_known.rs index 3c7d71d..a171d92 100644 --- a/src/http/handler_well_known.rs +++ b/src/http/handler_well_known.rs @@ -128,8 +128,10 @@ mod tests { let http_client = reqwest::Client::new(); let dns_nameservers = vec![]; - let dns_resolver = atproto_identity::resolve::create_resolver(&dns_nameservers); - let identity_resolver = atproto_identity::resolve::IdentityResolver(Arc::new( + let dns_resolver = Arc::new( + atproto_identity::resolve::HickoryDnsResolver::create_resolver(&dns_nameservers), + ); + let identity_resolver = atproto_identity::resolve::SharedIdentityResolver(Arc::new( atproto_identity::resolve::InnerIdentityResolver { http_client: http_client.clone(), dns_resolver, diff --git a/src/http/server.rs b/src/http/server.rs index 2e4d35d..675cd5e 100644 --- a/src/http/server.rs +++ b/src/http/server.rs @@ -4,7 +4,11 @@ use axum::{ Router, middleware, routing::{get, post}, }; +use std::time::Duration; +use tower_http::classify::ServerErrorsFailureClass; +use tower_http::trace::{self, TraceLayer}; use tower_http::{cors::CorsLayer, services::ServeDir}; +use tracing::Span; use super::{ context::AppState, @@ -120,6 +124,19 @@ pub fn build_router(ctx: AppState) -> Router { post(xrpc_clients_update_handler), ) .nest_service("/static", ServeDir::new(&ctx.config.http_static_path)) + .layer( + TraceLayer::new_for_http() + .make_span_with( + trace::DefaultMakeSpan::new() + .level(tracing::Level::INFO) + .include_headers(true), + ) + .on_failure( + |err: ServerErrorsFailureClass, _latency: Duration, _span: &Span| { + tracing::error!(error = ?err, "Unhandled error: {err}"); + }, + ), + ) .layer(cors) .with_state(ctx) } @@ -130,7 +147,7 @@ mod tests { use crate::oauth::DPoPNonceGenerator; use crate::storage::SimpleKeyProvider; use crate::storage::inmemory::MemoryOAuthStorage; - use atproto_identity::{resolve::create_resolver, storage_lru::LruDidDocumentStorage}; + use atproto_identity::{resolve::HickoryDnsResolver, storage_lru::LruDidDocumentStorage}; use atproto_oauth::storage_lru::LruOAuthRequestStorage; use std::{num::NonZeroUsize, sync::Arc}; @@ -145,8 +162,8 @@ mod tests { let http_client = reqwest::Client::new(); let dns_nameservers = vec![]; - let dns_resolver = create_resolver(&dns_nameservers); - let identity_resolver = atproto_identity::resolve::IdentityResolver(Arc::new( + let dns_resolver = Arc::new(HickoryDnsResolver::create_resolver(&dns_nameservers)); + let identity_resolver = atproto_identity::resolve::SharedIdentityResolver(Arc::new( atproto_identity::resolve::InnerIdentityResolver { http_client: http_client.clone(), dns_resolver, diff --git a/src/http/utils_oauth.rs b/src/http/utils_oauth.rs index 52388ff..d18cceb 100644 --- a/src/http/utils_oauth.rs +++ b/src/http/utils_oauth.rs @@ -119,7 +119,7 @@ mod tests { use crate::oauth::DPoPNonceGenerator; use crate::storage::SimpleKeyProvider; use crate::storage::inmemory::MemoryOAuthStorage; - use atproto_identity::{resolve::create_resolver, storage_lru::LruDidDocumentStorage}; + use atproto_identity::{resolve::HickoryDnsResolver, storage_lru::LruDidDocumentStorage}; use atproto_oauth::storage_lru::LruOAuthRequestStorage; use std::{num::NonZeroUsize, sync::Arc}; @@ -128,8 +128,8 @@ mod tests { let http_client = reqwest::Client::new(); let dns_nameservers = vec![]; - let dns_resolver = create_resolver(&dns_nameservers); - let identity_resolver = atproto_identity::resolve::IdentityResolver(Arc::new( + let dns_resolver = Arc::new(HickoryDnsResolver::create_resolver(&dns_nameservers)); + let identity_resolver = atproto_identity::resolve::SharedIdentityResolver(Arc::new( atproto_identity::resolve::InnerIdentityResolver { http_client: http_client.clone(), dns_resolver, diff --git a/src/oauth/atprotocol_bridge.rs b/src/oauth/atprotocol_bridge.rs index 52bad9d..0b3aec8 100644 --- a/src/oauth/atprotocol_bridge.rs +++ b/src/oauth/atprotocol_bridge.rs @@ -89,7 +89,7 @@ pub struct AtpBackedAuthorizationServer { /// Base OAuth authorization server base_auth_server: Arc, /// ATProtocol identity resolver - identity_resolver: atproto_identity::resolve::IdentityResolver, + identity_resolver: atproto_identity::resolve::SharedIdentityResolver, /// HTTP client for making requests http_client: reqwest::Client, /// OAuth request storage for ATProtocol flows @@ -110,7 +110,7 @@ impl AtpBackedAuthorizationServer { /// Create a new ATProtocol-backed authorization server pub fn new( base_auth_server: Arc, - identity_resolver: atproto_identity::resolve::IdentityResolver, + identity_resolver: atproto_identity::resolve::SharedIdentityResolver, http_client: reqwest::Client, oauth_request_storage: Arc, client_config: atproto_oauth_axum::state::OAuthClientConfig, @@ -868,7 +868,9 @@ mod tests { UnifiedAtpOAuthSessionStorageAdapter, UnifiedAuthorizationRequestStorageAdapter, }; use crate::storage::inmemory::MemoryOAuthStorage; - use atproto_identity::resolve::{IdentityResolver, InnerIdentityResolver, create_resolver}; + use atproto_identity::resolve::{ + HickoryDnsResolver, InnerIdentityResolver, SharedIdentityResolver, + }; use atproto_identity::storage_lru::LruDidDocumentStorage; use atproto_oauth::storage_lru::LruOAuthRequestStorage; use std::num::NonZeroUsize; @@ -887,8 +889,8 @@ mod tests { // Create identity resolver let http_client = reqwest::Client::new(); let dns_nameservers = vec![]; - let dns_resolver = create_resolver(&dns_nameservers); - let identity_resolver = IdentityResolver(Arc::new(InnerIdentityResolver { + let dns_resolver = Arc::new(HickoryDnsResolver::create_resolver(&dns_nameservers)); + let identity_resolver = SharedIdentityResolver(Arc::new(InnerIdentityResolver { http_client: http_client.clone(), dns_resolver, plc_hostname: "plc.directory".to_string(), diff --git a/src/oauth/utils_app_password.rs b/src/oauth/utils_app_password.rs index 0d76c04..ed35d09 100644 --- a/src/oauth/utils_app_password.rs +++ b/src/oauth/utils_app_password.rs @@ -343,7 +343,7 @@ mod tests { use crate::storage::SimpleKeyProvider; use crate::storage::inmemory::MemoryOAuthStorage; use crate::storage::traits::AppPassword; - use atproto_identity::{resolve::create_resolver, storage_lru::LruDidDocumentStorage}; + use atproto_identity::{resolve::HickoryDnsResolver, storage_lru::LruDidDocumentStorage}; use atproto_oauth::storage_lru::LruOAuthRequestStorage; use std::{num::NonZeroUsize, sync::Arc}; @@ -352,8 +352,8 @@ mod tests { let http_client = reqwest::Client::new(); let dns_nameservers = vec![]; - let dns_resolver = create_resolver(&dns_nameservers); - let identity_resolver = atproto_identity::resolve::IdentityResolver(Arc::new( + let dns_resolver = Arc::new(HickoryDnsResolver::create_resolver(&dns_nameservers)); + let identity_resolver = atproto_identity::resolve::SharedIdentityResolver(Arc::new( atproto_identity::resolve::InnerIdentityResolver { http_client: http_client.clone(), dns_resolver, diff --git a/src/oauth/utils_atprotocol_oauth.rs b/src/oauth/utils_atprotocol_oauth.rs index d76fded..256997e 100644 --- a/src/oauth/utils_atprotocol_oauth.rs +++ b/src/oauth/utils_atprotocol_oauth.rs @@ -395,7 +395,7 @@ mod tests { use crate::oauth::DPoPNonceGenerator; use crate::storage::SimpleKeyProvider; use crate::storage::inmemory::MemoryOAuthStorage; - use atproto_identity::{resolve::create_resolver, storage_lru::LruDidDocumentStorage}; + use atproto_identity::{resolve::HickoryDnsResolver, storage_lru::LruDidDocumentStorage}; use atproto_oauth::storage_lru::LruOAuthRequestStorage; use std::{num::NonZeroUsize, sync::Arc}; @@ -404,8 +404,8 @@ mod tests { let http_client = reqwest::Client::new(); let dns_nameservers = vec![]; - let dns_resolver = create_resolver(&dns_nameservers); - let identity_resolver = atproto_identity::resolve::IdentityResolver(Arc::new( + let dns_resolver = Arc::new(HickoryDnsResolver::create_resolver(&dns_nameservers)); + let identity_resolver = atproto_identity::resolve::SharedIdentityResolver(Arc::new( atproto_identity::resolve::InnerIdentityResolver { http_client: http_client.clone(), dns_resolver, diff --git a/src/storage/postgres/did_documents.rs b/src/storage/postgres/did_documents.rs index 4b40fbc..efd015f 100644 --- a/src/storage/postgres/did_documents.rs +++ b/src/storage/postgres/did_documents.rs @@ -91,6 +91,7 @@ mod tests { let storage = PostgresDidDocumentStorage::new(pool); let document = Document { + context: vec![], id: "did:plc:test123".to_string(), also_known_as: vec!["at://test.bsky.social".to_string()], service: vec![Service { @@ -138,6 +139,7 @@ mod tests { let storage = PostgresDidDocumentStorage::new(pool); let mut document = Document { + context: vec![], id: "did:plc:test456".to_string(), also_known_as: vec!["at://original.bsky.social".to_string()], service: vec![],