diff --git a/build.gradle.kts b/build.gradle.kts index 2257e18..9647020 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -40,6 +40,9 @@ allprojects { substitute(module("$group:api-gen-runtime-internal:$version")) .using(project(":api-gen-runtime-internal")) + + substitute(module("$group:bluesky:$version")) + .using(project(":bluesky")) } } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c78acc4..75a443e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -68,4 +68,6 @@ maven-publish = { module = "com.vanniktech:gradle-maven-publish-plugin", version workflow-core = { module = "com.squareup.workflow1:workflow-core", version.ref = "workflow" } workflow-runtime = { module = "com.squareup.workflow1:workflow-runtime", version.ref = "workflow" } +zstd = { module = "com.github.luben:zstd-jni", version = "1.5.6-7" } + bluesky = { module = "sh.christian.ozone:bluesky", version = "0.2.0" } diff --git a/jetstream/.gitignore b/jetstream/.gitignore new file mode 100644 index 0000000..84c048a --- /dev/null +++ b/jetstream/.gitignore @@ -0,0 +1 @@ +/build/ diff --git a/jetstream/api/jetstream.api b/jetstream/api/jetstream.api new file mode 100644 index 0000000..b705c58 --- /dev/null +++ b/jetstream/api/jetstream.api @@ -0,0 +1,342 @@ +public final class app/bsky/jetstream/SubscribeAccount { + public static final field Companion Lapp/bsky/jetstream/SubscribeAccount$Companion; + public synthetic fun (ZLjava/lang/String;JLjava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Z + public final fun component2-715Ygxc ()Ljava/lang/String; + public final fun component3 ()J + public final fun component4 ()Ljava/lang/String; + public final fun copy-b3ibVOY (ZLjava/lang/String;JLjava/lang/String;)Lapp/bsky/jetstream/SubscribeAccount; + public static synthetic fun copy-b3ibVOY$default (Lapp/bsky/jetstream/SubscribeAccount;ZLjava/lang/String;JLjava/lang/String;ILjava/lang/Object;)Lapp/bsky/jetstream/SubscribeAccount; + public fun equals (Ljava/lang/Object;)Z + public final fun getActive ()Z + public final fun getDid-715Ygxc ()Ljava/lang/String; + public final fun getSeq ()J + public final fun getTime ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class app/bsky/jetstream/SubscribeAccount$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class app/bsky/jetstream/SubscribeCommit { + public static final field Companion Lapp/bsky/jetstream/SubscribeCommit$Companion; + public synthetic fun (Ljava/lang/String;Lapp/bsky/jetstream/SubscribeOperation;Ljava/lang/String;Ljava/lang/String;Lsh/christian/ozone/api/model/JsonContent;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Ljava/lang/String;Lapp/bsky/jetstream/SubscribeOperation;Ljava/lang/String;Ljava/lang/String;Lsh/christian/ozone/api/model/JsonContent;Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Lapp/bsky/jetstream/SubscribeOperation; + public final fun component3-Ley70Jo ()Ljava/lang/String; + public final fun component4-I04nEKc ()Ljava/lang/String; + public final fun component5 ()Lsh/christian/ozone/api/model/JsonContent; + public final fun component6-OC6CE0s ()Ljava/lang/String; + public final fun copy-gGKcm70 (Ljava/lang/String;Lapp/bsky/jetstream/SubscribeOperation;Ljava/lang/String;Ljava/lang/String;Lsh/christian/ozone/api/model/JsonContent;Ljava/lang/String;)Lapp/bsky/jetstream/SubscribeCommit; + public static synthetic fun copy-gGKcm70$default (Lapp/bsky/jetstream/SubscribeCommit;Ljava/lang/String;Lapp/bsky/jetstream/SubscribeOperation;Ljava/lang/String;Ljava/lang/String;Lsh/christian/ozone/api/model/JsonContent;Ljava/lang/String;ILjava/lang/Object;)Lapp/bsky/jetstream/SubscribeCommit; + public fun equals (Ljava/lang/Object;)Z + public final fun getCid-OC6CE0s ()Ljava/lang/String; + public final fun getCollection-Ley70Jo ()Ljava/lang/String; + public final fun getOperation ()Lapp/bsky/jetstream/SubscribeOperation; + public final fun getRecord ()Lsh/christian/ozone/api/model/JsonContent; + public final fun getRev ()Ljava/lang/String; + public final fun getRkey-I04nEKc ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class app/bsky/jetstream/SubscribeCommit$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class app/bsky/jetstream/SubscribeEvent { + public static final field Companion Lapp/bsky/jetstream/SubscribeEvent$Companion; + public synthetic fun (Ljava/lang/String;JLapp/bsky/jetstream/SubscribeKind;Lapp/bsky/jetstream/SubscribeCommit;Lapp/bsky/jetstream/SubscribeIdentity;Lapp/bsky/jetstream/SubscribeAccount;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Ljava/lang/String;JLapp/bsky/jetstream/SubscribeKind;Lapp/bsky/jetstream/SubscribeCommit;Lapp/bsky/jetstream/SubscribeIdentity;Lapp/bsky/jetstream/SubscribeAccount;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1-715Ygxc ()Ljava/lang/String; + public final fun component2 ()J + public final fun component3 ()Lapp/bsky/jetstream/SubscribeKind; + public final fun component4 ()Lapp/bsky/jetstream/SubscribeCommit; + public final fun component5 ()Lapp/bsky/jetstream/SubscribeIdentity; + public final fun component6 ()Lapp/bsky/jetstream/SubscribeAccount; + public final fun copy-cWm1TCM (Ljava/lang/String;JLapp/bsky/jetstream/SubscribeKind;Lapp/bsky/jetstream/SubscribeCommit;Lapp/bsky/jetstream/SubscribeIdentity;Lapp/bsky/jetstream/SubscribeAccount;)Lapp/bsky/jetstream/SubscribeEvent; + public static synthetic fun copy-cWm1TCM$default (Lapp/bsky/jetstream/SubscribeEvent;Ljava/lang/String;JLapp/bsky/jetstream/SubscribeKind;Lapp/bsky/jetstream/SubscribeCommit;Lapp/bsky/jetstream/SubscribeIdentity;Lapp/bsky/jetstream/SubscribeAccount;ILjava/lang/Object;)Lapp/bsky/jetstream/SubscribeEvent; + public fun equals (Ljava/lang/Object;)Z + public final fun getAccount ()Lapp/bsky/jetstream/SubscribeAccount; + public final fun getCommit ()Lapp/bsky/jetstream/SubscribeCommit; + public final fun getDid-715Ygxc ()Ljava/lang/String; + public final fun getIdentity ()Lapp/bsky/jetstream/SubscribeIdentity; + public final fun getKind ()Lapp/bsky/jetstream/SubscribeKind; + public final fun getTime_us ()J + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class app/bsky/jetstream/SubscribeEvent$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class app/bsky/jetstream/SubscribeIdentity { + public static final field Companion Lapp/bsky/jetstream/SubscribeIdentity$Companion; + public synthetic fun (Ljava/lang/String;Ljava/lang/String;JLjava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1-715Ygxc ()Ljava/lang/String; + public final fun component2-hDwCUG8 ()Ljava/lang/String; + public final fun component3 ()J + public final fun component4 ()Ljava/lang/String; + public final fun copy-dB0H9Ao (Ljava/lang/String;Ljava/lang/String;JLjava/lang/String;)Lapp/bsky/jetstream/SubscribeIdentity; + public static synthetic fun copy-dB0H9Ao$default (Lapp/bsky/jetstream/SubscribeIdentity;Ljava/lang/String;Ljava/lang/String;JLjava/lang/String;ILjava/lang/Object;)Lapp/bsky/jetstream/SubscribeIdentity; + public fun equals (Ljava/lang/Object;)Z + public final fun getDid-715Ygxc ()Ljava/lang/String; + public final fun getHandle-hDwCUG8 ()Ljava/lang/String; + public final fun getSeq ()J + public final fun getTime ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class app/bsky/jetstream/SubscribeIdentity$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract class app/bsky/jetstream/SubscribeKind : sh/christian/ozone/api/model/AtpEnum { + public static final field Companion Lapp/bsky/jetstream/SubscribeKind$Companion; + public synthetic fun (Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun getValue ()Ljava/lang/String; +} + +public final class app/bsky/jetstream/SubscribeKind$Account : app/bsky/jetstream/SubscribeKind { + public static final field INSTANCE Lapp/bsky/jetstream/SubscribeKind$Account; + public fun equals (Ljava/lang/Object;)Z + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class app/bsky/jetstream/SubscribeKind$Commit : app/bsky/jetstream/SubscribeKind { + public static final field INSTANCE Lapp/bsky/jetstream/SubscribeKind$Commit; + public fun equals (Ljava/lang/Object;)Z + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class app/bsky/jetstream/SubscribeKind$Companion { + public final fun safeValueOf (Ljava/lang/String;)Lapp/bsky/jetstream/SubscribeKind; + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class app/bsky/jetstream/SubscribeKind$Identity : app/bsky/jetstream/SubscribeKind { + public static final field INSTANCE Lapp/bsky/jetstream/SubscribeKind$Identity; + public fun equals (Ljava/lang/Object;)Z + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class app/bsky/jetstream/SubscribeKind$Unknown : app/bsky/jetstream/SubscribeKind { + public fun (Ljava/lang/String;)V + public final fun component1 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;)Lapp/bsky/jetstream/SubscribeKind$Unknown; + public static synthetic fun copy$default (Lapp/bsky/jetstream/SubscribeKind$Unknown;Ljava/lang/String;ILjava/lang/Object;)Lapp/bsky/jetstream/SubscribeKind$Unknown; + public fun equals (Ljava/lang/Object;)Z + public final fun getRawValue ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class app/bsky/jetstream/SubscribeKindSerializer : kotlinx/serialization/KSerializer { + public fun ()V + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lapp/bsky/jetstream/SubscribeKind; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lapp/bsky/jetstream/SubscribeKind;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V +} + +public abstract class app/bsky/jetstream/SubscribeOperation : sh/christian/ozone/api/model/AtpEnum { + public static final field Companion Lapp/bsky/jetstream/SubscribeOperation$Companion; + public synthetic fun (Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun getValue ()Ljava/lang/String; +} + +public final class app/bsky/jetstream/SubscribeOperation$Companion { + public final fun safeValueOf (Ljava/lang/String;)Lapp/bsky/jetstream/SubscribeOperation; + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class app/bsky/jetstream/SubscribeOperation$Create : app/bsky/jetstream/SubscribeOperation { + public static final field INSTANCE Lapp/bsky/jetstream/SubscribeOperation$Create; + public fun equals (Ljava/lang/Object;)Z + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class app/bsky/jetstream/SubscribeOperation$Delete : app/bsky/jetstream/SubscribeOperation { + public static final field INSTANCE Lapp/bsky/jetstream/SubscribeOperation$Delete; + public fun equals (Ljava/lang/Object;)Z + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class app/bsky/jetstream/SubscribeOperation$Unknown : app/bsky/jetstream/SubscribeOperation { + public fun (Ljava/lang/String;)V + public final fun component1 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;)Lapp/bsky/jetstream/SubscribeOperation$Unknown; + public static synthetic fun copy$default (Lapp/bsky/jetstream/SubscribeOperation$Unknown;Ljava/lang/String;ILjava/lang/Object;)Lapp/bsky/jetstream/SubscribeOperation$Unknown; + public fun equals (Ljava/lang/Object;)Z + public final fun getRawValue ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class app/bsky/jetstream/SubscribeOperation$Update : app/bsky/jetstream/SubscribeOperation { + public static final field INSTANCE Lapp/bsky/jetstream/SubscribeOperation$Update; + public fun equals (Ljava/lang/Object;)Z + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class app/bsky/jetstream/SubscribeOperationSerializer : kotlinx/serialization/KSerializer { + public fun ()V + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lapp/bsky/jetstream/SubscribeOperation; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lapp/bsky/jetstream/SubscribeOperation;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V +} + +public final class app/bsky/jetstream/SubscribeOptionsUpdate { + public static final field Companion Lapp/bsky/jetstream/SubscribeOptionsUpdate$Companion; + public fun ()V + public fun (Lkotlinx/collections/immutable/ImmutableList;Lkotlinx/collections/immutable/ImmutableList;Ljava/lang/Long;)V + public synthetic fun (Lkotlinx/collections/immutable/ImmutableList;Lkotlinx/collections/immutable/ImmutableList;Ljava/lang/Long;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lkotlinx/collections/immutable/ImmutableList; + public final fun component2 ()Lkotlinx/collections/immutable/ImmutableList; + public final fun component3 ()Ljava/lang/Long; + public final fun copy (Lkotlinx/collections/immutable/ImmutableList;Lkotlinx/collections/immutable/ImmutableList;Ljava/lang/Long;)Lapp/bsky/jetstream/SubscribeOptionsUpdate; + public static synthetic fun copy$default (Lapp/bsky/jetstream/SubscribeOptionsUpdate;Lkotlinx/collections/immutable/ImmutableList;Lkotlinx/collections/immutable/ImmutableList;Ljava/lang/Long;ILjava/lang/Object;)Lapp/bsky/jetstream/SubscribeOptionsUpdate; + public fun equals (Ljava/lang/Object;)Z + public final fun getMaxMessageSizeBytes ()Ljava/lang/Long; + public final fun getWantedCollections ()Lkotlinx/collections/immutable/ImmutableList; + public final fun getWantedDids ()Lkotlinx/collections/immutable/ImmutableList; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class app/bsky/jetstream/SubscribeOptionsUpdate$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class app/bsky/jetstream/SubscribeQueryParams { + public static final field Companion Lapp/bsky/jetstream/SubscribeQueryParams$Companion; + public fun ()V + public fun (Lkotlinx/collections/immutable/ImmutableList;Lkotlinx/collections/immutable/ImmutableList;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Boolean;Ljava/lang/Boolean;)V + public synthetic fun (Lkotlinx/collections/immutable/ImmutableList;Lkotlinx/collections/immutable/ImmutableList;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Boolean;Ljava/lang/Boolean;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun asList ()Lkotlinx/collections/immutable/ImmutableList; + public final fun component1 ()Lkotlinx/collections/immutable/ImmutableList; + public final fun component2 ()Lkotlinx/collections/immutable/ImmutableList; + public final fun component3 ()Ljava/lang/Long; + public final fun component4 ()Ljava/lang/Long; + public final fun component5 ()Ljava/lang/Boolean; + public final fun component6 ()Ljava/lang/Boolean; + public final fun copy (Lkotlinx/collections/immutable/ImmutableList;Lkotlinx/collections/immutable/ImmutableList;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Boolean;Ljava/lang/Boolean;)Lapp/bsky/jetstream/SubscribeQueryParams; + public static synthetic fun copy$default (Lapp/bsky/jetstream/SubscribeQueryParams;Lkotlinx/collections/immutable/ImmutableList;Lkotlinx/collections/immutable/ImmutableList;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Boolean;Ljava/lang/Boolean;ILjava/lang/Object;)Lapp/bsky/jetstream/SubscribeQueryParams; + public fun equals (Ljava/lang/Object;)Z + public final fun getCompress ()Ljava/lang/Boolean; + public final fun getCursor ()Ljava/lang/Long; + public final fun getMaxMessageSizeBytes ()Ljava/lang/Long; + public final fun getRequireHello ()Ljava/lang/Boolean; + public final fun getWantedCollections ()Lkotlinx/collections/immutable/ImmutableList; + public final fun getWantedDids ()Lkotlinx/collections/immutable/ImmutableList; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class app/bsky/jetstream/SubscribeQueryParams$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class app/bsky/jetstream/SubscribeSourcedMessage { + public static final field Companion Lapp/bsky/jetstream/SubscribeSourcedMessage$Companion; + public fun (Ljava/lang/String;Lsh/christian/ozone/api/model/JsonContent;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Lsh/christian/ozone/api/model/JsonContent; + public final fun copy (Ljava/lang/String;Lsh/christian/ozone/api/model/JsonContent;)Lapp/bsky/jetstream/SubscribeSourcedMessage; + public static synthetic fun copy$default (Lapp/bsky/jetstream/SubscribeSourcedMessage;Ljava/lang/String;Lsh/christian/ozone/api/model/JsonContent;ILjava/lang/Object;)Lapp/bsky/jetstream/SubscribeSourcedMessage; + public fun equals (Ljava/lang/Object;)Z + public final fun getPayload ()Lsh/christian/ozone/api/model/JsonContent; + public final fun getType ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class app/bsky/jetstream/SubscribeSourcedMessage$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class sh/christian/ozone/jetstream/JetstreamApi : sh/christian/ozone/jetstream/JetstreamInterface { + public fun ()V + public fun (Lio/ktor/client/HttpClient;)V + public fun (Ljava/lang/String;)V + public fun (Lsh/christian/ozone/jetstream/JetstreamHost;)V + public fun subscribe (Lapp/bsky/jetstream/SubscribeQueryParams;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun subscribe (Lapp/bsky/jetstream/SubscribeQueryParams;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class sh/christian/ozone/jetstream/JetstreamHost : java/lang/Enum { + public static final field JETSTREAM_1_US_EAST Lsh/christian/ozone/jetstream/JetstreamHost; + public static final field JETSTREAM_1_US_WEST Lsh/christian/ozone/jetstream/JetstreamHost; + public static final field JETSTREAM_2_US_EAST Lsh/christian/ozone/jetstream/JetstreamHost; + public static final field JETSTREAM_2_US_WEST Lsh/christian/ozone/jetstream/JetstreamHost; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public final fun getInstance ()I + public final fun getRegion ()Ljava/lang/String; + public static fun valueOf (Ljava/lang/String;)Lsh/christian/ozone/jetstream/JetstreamHost; + public static fun values ()[Lsh/christian/ozone/jetstream/JetstreamHost; +} + +public abstract interface class sh/christian/ozone/jetstream/JetstreamInterface { + public abstract fun subscribe (Lapp/bsky/jetstream/SubscribeQueryParams;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public abstract fun subscribe (Lapp/bsky/jetstream/SubscribeQueryParams;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public abstract interface class sh/christian/ozone/jetstream/SubscribeEventContent { +} + +public final class sh/christian/ozone/jetstream/SubscribeEventContent$Account : sh/christian/ozone/jetstream/SubscribeEventContent { + public fun (Lapp/bsky/jetstream/SubscribeAccount;)V + public final fun component1 ()Lapp/bsky/jetstream/SubscribeAccount; + public final fun copy (Lapp/bsky/jetstream/SubscribeAccount;)Lsh/christian/ozone/jetstream/SubscribeEventContent$Account; + public static synthetic fun copy$default (Lsh/christian/ozone/jetstream/SubscribeEventContent$Account;Lapp/bsky/jetstream/SubscribeAccount;ILjava/lang/Object;)Lsh/christian/ozone/jetstream/SubscribeEventContent$Account; + public fun equals (Ljava/lang/Object;)Z + public final fun getAccount ()Lapp/bsky/jetstream/SubscribeAccount; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class sh/christian/ozone/jetstream/SubscribeEventContent$Commit : sh/christian/ozone/jetstream/SubscribeEventContent { + public fun (Lapp/bsky/jetstream/SubscribeCommit;)V + public final fun component1 ()Lapp/bsky/jetstream/SubscribeCommit; + public final fun copy (Lapp/bsky/jetstream/SubscribeCommit;)Lsh/christian/ozone/jetstream/SubscribeEventContent$Commit; + public static synthetic fun copy$default (Lsh/christian/ozone/jetstream/SubscribeEventContent$Commit;Lapp/bsky/jetstream/SubscribeCommit;ILjava/lang/Object;)Lsh/christian/ozone/jetstream/SubscribeEventContent$Commit; + public fun equals (Ljava/lang/Object;)Z + public final fun getCommit ()Lapp/bsky/jetstream/SubscribeCommit; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class sh/christian/ozone/jetstream/SubscribeEventContent$Identity : sh/christian/ozone/jetstream/SubscribeEventContent { + public fun (Lapp/bsky/jetstream/SubscribeIdentity;)V + public final fun component1 ()Lapp/bsky/jetstream/SubscribeIdentity; + public final fun copy (Lapp/bsky/jetstream/SubscribeIdentity;)Lsh/christian/ozone/jetstream/SubscribeEventContent$Identity; + public static synthetic fun copy$default (Lsh/christian/ozone/jetstream/SubscribeEventContent$Identity;Lapp/bsky/jetstream/SubscribeIdentity;ILjava/lang/Object;)Lsh/christian/ozone/jetstream/SubscribeEventContent$Identity; + public fun equals (Ljava/lang/Object;)Z + public final fun getIdentity ()Lapp/bsky/jetstream/SubscribeIdentity; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class sh/christian/ozone/jetstream/SubscribeEventKt { + public static final fun getContent (Lapp/bsky/jetstream/SubscribeEvent;)Lsh/christian/ozone/jetstream/SubscribeEventContent; +} + +public abstract interface class sh/christian/ozone/jetstream/SubscriptionContext { + public abstract fun getMessages ()Lkotlinx/coroutines/flow/Flow; + public abstract fun updateSubscription (Lapp/bsky/jetstream/SubscribeOptionsUpdate;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + diff --git a/jetstream/build.gradle.kts b/jetstream/build.gradle.kts new file mode 100644 index 0000000..f2ac55a --- /dev/null +++ b/jetstream/build.gradle.kts @@ -0,0 +1,49 @@ +import org.jetbrains.dokka.gradle.AbstractDokkaTask +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + id("ozone-dokka") + id("ozone-multiplatform") + id("ozone-publish") + id("sh.christian.ozone.generator") + id("org.jetbrains.kotlinx.binary-compatibility-validator") +} + +ozone { + js() + jvm() +} + +dependencies { + lexicons(fileTree("schemas") { + include("**/*.json") + }) +} + +kotlin { + sourceSets { + val commonMain by getting { + dependencies { + implementation(libs.ktor.logging) + } + } + val jvmMain by getting { + dependencies { + implementation(libs.zstd) + } + } + val jsMain by getting { + dependencies { + implementation(npm("zstd-codec", "0.1.5")) + } + } + } +} + +val generateLexicons = tasks.generateLexicons +tasks.apiDump.configure { dependsOn(generateLexicons) } +tasks.apiCheck.configure { dependsOn(generateLexicons) } + +tasks.withType().configureEach { + dependsOn(tasks.withType()) +} diff --git a/jetstream/gradle.properties b/jetstream/gradle.properties new file mode 100644 index 0000000..7ab4abf --- /dev/null +++ b/jetstream/gradle.properties @@ -0,0 +1,2 @@ +POM_NAME=AT Protocol for Kotlin - Jetstream API +POM_DESCRIPTION=Jetstream API bindings for Kotlin. diff --git a/jetstream/schemas/app/bsky/jetstream/subscribe.json b/jetstream/schemas/app/bsky/jetstream/subscribe.json new file mode 100644 index 0000000..cbe2204 --- /dev/null +++ b/jetstream/schemas/app/bsky/jetstream/subscribe.json @@ -0,0 +1,182 @@ +{ + "lexicon": 1, + "id": "app.bsky.jetstream.subscribe", + "defs": { + "main": { + "type": "subscription", + "description": "Consume lightweight, friendly JSON converted from an ATProto `com.atproto.sync.subscribeRepos` stream.", + "parameters": { + "type": "params", + "properties": { + "wantedCollections": { + "type": "array", + "maxLength": 100, + "items": { + "type": "string", + "format": "nsid" + }, + "description": "Which records you receive on your stream (default empty = all collections)." + }, + "wantedDids": { + "type": "array", + "maxLength": 10000, + "items": { + "type": "string", + "format": "did" + }, + "description": "Which records you receive on your stream (default empty = all repos)." + }, + "maxMessageSizeBytes": { + "type": "integer", + "minimum": 0, + "default": 0, + "description": "The maximum size of a payload that this client would like to receive." + }, + "cursor": { + "type": "integer", + "description": "A unix microseconds timestamp cursor to begin playback from." + }, + "compress": { + "type": "boolean", + "default": false, + "description": "Set to true to enable zstd compression." + }, + "requireHello": { + "type": "boolean", + "default": false, + "description": "Set to true to pause replay/live-tail until the server receives a SubscribeOptionsUpdate." + } + } + }, + "message": { + "schema": { + "type": "ref", + "ref": "#event" + } + } + }, + "event": { + "type": "object", + "required": ["did", "time_us", "kind"], + "nullable": ["commit", "identity", "account"], + "properties": { + "did": { + "type": "string", + "format": "did" + }, + "time_us": { + "type": "integer" + }, + "kind": { + "type": "string", + "knownValues": ["commit", "identity", "account"] + }, + "commit": { + "type": "ref", + "ref": "#commit" + }, + "identity": { + "type": "ref", + "ref": "#identity" + }, + "account": { + "type": "ref", + "ref": "#account" + } + } + }, + "commit": { + "type": "object", + "required": ["rev", "operation", "collection", "rkey"], + "nullable": ["record"], + "properties": { + "rev": { "type": "string" }, + "operation": { + "type": "string", + "knownValues": ["create", "update", "delete"] + }, + "collection": { + "type": "string", + "format": "nsid" + }, + "rkey": { + "type": "string", + "format": "record-key" + }, + "record": { "type": "unknown" }, + "cid": { + "type": "string", + "format": "cid" + } + } + }, + "identity": { + "type": "object", + "required": ["did", "handle", "seq", "time"], + "properties": { + "did": { + "type": "string", + "format": "did" + }, + "handle": { + "type": "string", + "format": "handle" + }, + "seq": { "type": "integer" }, + "time": { "type": "string" } + } + }, + "account": { + "type": "object", + "required": ["active", "did", "seq", "time"], + "properties": { + "active": { "type": "boolean" }, + "did": { + "type": "string", + "format": "did" + }, + "seq": { "type": "integer" }, + "time": { "type": "string" } + } + }, + "sourcedMessage": { + "type": "object", + "description": "Send messages back to Jetstream over the websocket.", + "required": ["type", "payload"], + "properties": { + "type": { "type": "string" }, + "payload": { "type": "unknown" } + } + }, + "optionsUpdate": { + "type": "object", + "description": "Update subscription filter after connecting to the socket.", + "properties": { + "wantedCollections": { + "type": "array", + "maxLength": 100, + "items": { + "type": "string", + "format": "nsid" + }, + "description": "Which records you receive on your stream (default empty = all collections)." + }, + "wantedDids": { + "type": "array", + "maxLength": 10000, + "items": { + "type": "string", + "format": "did" + }, + "description": "Which records you receive on your stream (default empty = all repos)." + }, + "maxMessageSizeBytes": { + "type": "integer", + "minimum": 0, + "default": 0, + "description": "The maximum size of a payload that this client would like to receive." + } + } + } + } +} diff --git a/jetstream/src/commonMain/kotlin/sh/christian/ozone/jetstream/JetstreamApi.kt b/jetstream/src/commonMain/kotlin/sh/christian/ozone/jetstream/JetstreamApi.kt new file mode 100644 index 0000000..b4866c0 --- /dev/null +++ b/jetstream/src/commonMain/kotlin/sh/christian/ozone/jetstream/JetstreamApi.kt @@ -0,0 +1,136 @@ +package sh.christian.ozone.jetstream + +import app.bsky.jetstream.SubscribeMessage +import app.bsky.jetstream.SubscribeOptionsUpdate +import app.bsky.jetstream.SubscribeQueryParams +import app.bsky.jetstream.SubscribeSourcedMessage +import io.ktor.client.HttpClient +import io.ktor.client.plugins.DefaultRequest +import io.ktor.client.plugins.websocket.DefaultClientWebSocketSession +import io.ktor.client.plugins.websocket.WebSockets +import io.ktor.client.plugins.websocket.wss +import io.ktor.client.request.parameter +import io.ktor.websocket.Frame +import kotlinx.coroutines.cancelAndJoin +import kotlinx.coroutines.channels.ReceiveChannel +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.emitAll +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.mapNotNull +import kotlinx.coroutines.flow.receiveAsFlow +import kotlinx.coroutines.launch +import kotlinx.serialization.encodeToString +import sh.christian.ozone.api.model.JsonContent +import sh.christian.ozone.api.runtime.BlueskyJson +import sh.christian.ozone.api.xrpc.defaultHttpClient + +/** + * Implementation to interact with a hosted Jetstream service. + * + * @constructor Construct a new instance using an existing [HttpClient]. + */ +class JetstreamApi(httpClient: HttpClient) : JetstreamInterface { + + /** Construct a new instance using a free-form [hostName]. */ + constructor(hostName: String) : this( + defaultHttpClient.config { + install(DefaultRequest) { + url.host = hostName + } + } + ) + + /** Construct a new instance using a well-known [JetstreamHost] instance. */ + constructor(host: JetstreamHost) : this("jetstream${host.instance}.${host.region}.bsky.network") + + /** Construct a new instance that connects to the [JetstreamHost.JETSTREAM_1_US_EAST] instance. */ + constructor() : this(JetstreamHost.JETSTREAM_1_US_EAST) + + private val client: HttpClient = httpClient.config { + install(WebSockets) + } + + override suspend fun subscribe(params: SubscribeQueryParams): Flow = flow { + withSubscribe(params) { + emitAll(incoming.messages()) + } + } + + override suspend fun subscribe( + params: SubscribeQueryParams, + block: suspend SubscriptionContext.() -> Unit, + ) { + withSubscribe(params) { + val incomingMessages = incoming.messages() + val outgoingMessages = MutableSharedFlow() + + val outgoingJob = launch { + outgoingMessages.collect { sourcedMessage -> + outgoing.send(Frame.Text(BlueskyJson.encodeToString(sourcedMessage))) + } + } + + try { + DefaultSubscriptionContext(outgoingMessages, incomingMessages).apply { + block() + } + } finally { + outgoingJob.cancelAndJoin() + } + } + } + + private suspend fun withSubscribe( + params: SubscribeQueryParams, + block: suspend DefaultClientWebSocketSession.() -> Unit + ) { + client.wss( + path = "/subscribe", + request = { params.asList().forEach { (key, value) -> parameter(key, value) } }, + ) { + initZstd() + block() + } + } + + private fun ReceiveChannel.messages(): Flow { + return receiveAsFlow() + .mapNotNull { frame -> + when (frame) { + // zstd-compressed json + is Frame.Binary -> decompressZstd(frame.data) + // raw json + is Frame.Text -> frame.data + // ignored + is Frame.Close, + is Frame.Ping, + is Frame.Pong -> null + else -> null + } + } + .map { data -> + BlueskyJson.decodeFromString( + deserializer = SubscribeMessage.serializer(), + string = data.decodeToString(), + ) + } + .catch { it.printStackTrace() } + } + + private inner class DefaultSubscriptionContext( + private val sourcedMessages: MutableSharedFlow, + override val messages: Flow, + ) : SubscriptionContext { + override suspend fun updateSubscription(message: SubscribeOptionsUpdate) { + sourcedMessages.emit( + SubscribeSourcedMessage( + type = "options_update", + payload = JsonContent.encodeFrom(message), + ) + ) + } + } +} diff --git a/jetstream/src/commonMain/kotlin/sh/christian/ozone/jetstream/JetstreamHost.kt b/jetstream/src/commonMain/kotlin/sh/christian/ozone/jetstream/JetstreamHost.kt new file mode 100644 index 0000000..9be8c94 --- /dev/null +++ b/jetstream/src/commonMain/kotlin/sh/christian/ozone/jetstream/JetstreamHost.kt @@ -0,0 +1,14 @@ +package sh.christian.ozone.jetstream + +/** + * Known hosted instances of the Jetstream service. + */ +enum class JetstreamHost( + val instance: Int, + val region: String, +) { + JETSTREAM_1_US_EAST(1, "us-east"), + JETSTREAM_2_US_EAST(2, "us-east"), + JETSTREAM_1_US_WEST(1, "us-west"), + JETSTREAM_2_US_WEST(2, "us-west"), +} diff --git a/jetstream/src/commonMain/kotlin/sh/christian/ozone/jetstream/JetstreamInterface.kt b/jetstream/src/commonMain/kotlin/sh/christian/ozone/jetstream/JetstreamInterface.kt new file mode 100644 index 0000000..554fd71 --- /dev/null +++ b/jetstream/src/commonMain/kotlin/sh/christian/ozone/jetstream/JetstreamInterface.kt @@ -0,0 +1,34 @@ +package sh.christian.ozone.jetstream + +import app.bsky.jetstream.SubscribeMessage +import app.bsky.jetstream.SubscribeOptionsUpdate +import app.bsky.jetstream.SubscribeQueryParams +import kotlinx.coroutines.flow.Flow + +interface JetstreamInterface { + /** + * Subscribe to a Jetstream firehose with the given [params]. + * + * Messages will be emitted as they are received via the returned [Flow<SubscribeMessage>][Flow]. + */ + suspend fun subscribe(params: SubscribeQueryParams): Flow + + /** + * Subscribe to a Jetstream firehose with the given [params]. + * + * Messages will be emitted as they are received via [messages][SubscriptionContext.messages]. Options that affect the + * messages being received can be updated via [updateSubscription()][SubscriptionContext.updateSubscription]. + */ + suspend fun subscribe( + params: SubscribeQueryParams, + block: suspend SubscriptionContext.() -> Unit, + ) +} + +interface SubscriptionContext { + /** Messages received from a Jetstream instance. */ + val messages: Flow + + /** Update the filter options for the current [messages] subscription. */ + suspend fun updateSubscription(message: SubscribeOptionsUpdate) +} diff --git a/jetstream/src/commonMain/kotlin/sh/christian/ozone/jetstream/subscribeEvent.kt b/jetstream/src/commonMain/kotlin/sh/christian/ozone/jetstream/subscribeEvent.kt new file mode 100644 index 0000000..00d6e7b --- /dev/null +++ b/jetstream/src/commonMain/kotlin/sh/christian/ozone/jetstream/subscribeEvent.kt @@ -0,0 +1,37 @@ +package sh.christian.ozone.jetstream + +import app.bsky.jetstream.SubscribeAccount +import app.bsky.jetstream.SubscribeCommit +import app.bsky.jetstream.SubscribeIdentity +import app.bsky.jetstream.SubscribeMessage + +/** + * Union field property that represents the expected data contained within a [SubscribeMessage]. + */ +val SubscribeMessage.content: SubscribeEventContent + get() = when { + commit != null -> SubscribeEventContent.Commit(commit) + identity != null -> SubscribeEventContent.Identity(identity) + account != null -> SubscribeEventContent.Account(account) + else -> error("SubscribeEvent has no content") + } + +/** + * Represents any of the expected data contained within a [SubscribeMessage]. + */ +sealed interface SubscribeEventContent { + /** Represents a [SubscribeCommit] contained within a [SubscribeMessage]. */ + data class Commit( + val commit: SubscribeCommit, + ) : SubscribeEventContent + + /** Represents a [SubscribeIdentity] contained within a [SubscribeMessage]. */ + data class Identity( + val identity: SubscribeIdentity, + ) : SubscribeEventContent + + /** Represents a [SubscribeAccount] contained within a [SubscribeMessage]. */ + data class Account( + val account: SubscribeAccount, + ) : SubscribeEventContent +} diff --git a/jetstream/src/commonMain/kotlin/sh/christian/ozone/jetstream/zstd.kt b/jetstream/src/commonMain/kotlin/sh/christian/ozone/jetstream/zstd.kt new file mode 100644 index 0000000..fc12e3c --- /dev/null +++ b/jetstream/src/commonMain/kotlin/sh/christian/ozone/jetstream/zstd.kt @@ -0,0 +1,8 @@ +package sh.christian.ozone.jetstream + +internal expect suspend fun initZstd() + +/** + * Decompress a Zstandard-compressed byte array and return the decompressed data. + */ +internal expect suspend fun decompressZstd(data: ByteArray): ByteArray? diff --git a/jetstream/src/jsMain/kotlin/sh/christian/ozone/jetstream/ZstdCodec.kt b/jetstream/src/jsMain/kotlin/sh/christian/ozone/jetstream/ZstdCodec.kt new file mode 100644 index 0000000..1ad5600 --- /dev/null +++ b/jetstream/src/jsMain/kotlin/sh/christian/ozone/jetstream/ZstdCodec.kt @@ -0,0 +1,20 @@ +@file:JsModule("zstd-codec") +@file:JsNonModule + +package sh.christian.ozone.jetstream + +internal external object ZstdCodec { + fun run(callback: (Zstd) -> Unit) +} + +internal external class Zstd { + class Simple { + fun compressUsingDict(data: ByteArray, dict: Dict.Compression): ByteArray + fun decompressUsingDict(data: ByteArray, dict: Dict.Decompression): ByteArray? + } + + class Dict { + class Compression(dictBytes: ByteArray, compressionLevel: Int) + class Decompression(dictBytes: ByteArray) + } +} diff --git a/jetstream/src/jsMain/kotlin/sh/christian/ozone/jetstream/strings.kt b/jetstream/src/jsMain/kotlin/sh/christian/ozone/jetstream/strings.kt new file mode 100644 index 0000000..ccc9495 --- /dev/null +++ b/jetstream/src/jsMain/kotlin/sh/christian/ozone/jetstream/strings.kt @@ -0,0 +1,23 @@ +package sh.christian.ozone.jetstream + +/** + * Encodes a URI by replacing each instance of certain characters by one, two, three, or four escape sequences + * representing the UTF-8 encoding of the character (will only be four escape sequences for characters composed of two + * surrogate characters). + */ +internal external fun encodeURIComponent(encodedURI: String): String + +/** + * Decodes a Uniform Resource Identifier (URI) component previously created by [encodeURIComponent]. + */ +internal external fun decodeURIComponent(encodedURI: String): String + +/** + * Computes a new string in which certain characters have been replaced by hexadecimal escape sequences. + */ +internal external fun escape(str: String): String + +/** + * Computes a new string in which hexadecimal escape sequences are replaced with the characters that they represent. + */ +internal external fun unescape(str: String): String diff --git a/jetstream/src/jsMain/kotlin/sh/christian/ozone/jetstream/zstd.js.kt b/jetstream/src/jsMain/kotlin/sh/christian/ozone/jetstream/zstd.js.kt new file mode 100644 index 0000000..4a962b9 --- /dev/null +++ b/jetstream/src/jsMain/kotlin/sh/christian/ozone/jetstream/zstd.js.kt @@ -0,0 +1,43 @@ +package sh.christian.ozone.jetstream + +import kotlinx.browser.window +import kotlinx.coroutines.CompletableDeferred +import kotlinx.coroutines.await +import org.khronos.webgl.Int8Array + +private val decompressor = CompletableDeferred() + +internal actual suspend fun initZstd() { + if (!decompressor.isCompleted) { + val dictionaryBytes = window.fetch("/files/zstd_dictionary.bin") + .then { it.arrayBuffer() } + .then { Int8Array(it) } + .await() + + decompressor.complete(Decompressor(dictionaryBytes)) + } +} + +internal actual suspend fun decompressZstd(data: ByteArray): ByteArray? { + val decompressed = decompressor.await().decompress(data)?.decodeToString() ?: return null + val decoded = decodeURIComponent(escape(decompressed)) + return decoded.encodeToByteArray() +} + +@Suppress("UnsafeCastFromDynamic", "UNUSED_ANONYMOUS_PARAMETER", "UNUSED_VARIABLE") +private class Decompressor(private val dictionaryBytes: Int8Array) { + private val decompressor = CompletableDeferred() + private val decompressDictionary = CompletableDeferred() + + init { + ZstdCodec.run { zstd -> + val bytes = dictionaryBytes + decompressor.complete(js("new zstd.Simple()")) + decompressDictionary.complete(js("new zstd.Dict.Decompression(bytes)")) + } + } + + suspend fun decompress(data: ByteArray): ByteArray? { + return decompressor.await().decompressUsingDict(data, decompressDictionary.await()) + } +} diff --git a/jetstream/src/jsMain/resources/files/zstd_dictionary.bin b/jetstream/src/jsMain/resources/files/zstd_dictionary.bin new file mode 100644 index 0000000..106847e Binary files /dev/null and b/jetstream/src/jsMain/resources/files/zstd_dictionary.bin differ diff --git a/jetstream/src/jvmMain/kotlin/sh/christian/ozone/jetstream/zstd.jvm.kt b/jetstream/src/jvmMain/kotlin/sh/christian/ozone/jetstream/zstd.jvm.kt new file mode 100644 index 0000000..493c999 --- /dev/null +++ b/jetstream/src/jvmMain/kotlin/sh/christian/ozone/jetstream/zstd.jvm.kt @@ -0,0 +1,17 @@ +package sh.christian.ozone.jetstream + +import com.github.luben.zstd.Zstd +import com.github.luben.zstd.ZstdDictDecompress + +private lateinit var dictionary: ZstdDictDecompress + +internal actual suspend fun initZstd() { + if (!::dictionary.isInitialized) { + val dictionaryFile = JetstreamApi::class.java.getResourceAsStream("/files/zstd_dictionary.bin")!! + dictionary = ZstdDictDecompress(dictionaryFile.readBytes()) + } +} + +internal actual suspend fun decompressZstd(data: ByteArray): ByteArray? { + return Zstd.decompress(data, dictionary, 10 * 1024 * 1024) +} diff --git a/jetstream/src/jvmMain/resources/files/zstd_dictionary.bin b/jetstream/src/jvmMain/resources/files/zstd_dictionary.bin new file mode 100644 index 0000000..106847e Binary files /dev/null and b/jetstream/src/jvmMain/resources/files/zstd_dictionary.bin differ diff --git a/kotlin-js-store/yarn.lock b/kotlin-js-store/yarn.lock index 8e04769..bd78f71 100644 --- a/kotlin-js-store/yarn.lock +++ b/kotlin-js-store/yarn.lock @@ -504,6 +504,13 @@ array-flatten@1.1.1: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== +arraybuffer-loader@1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/arraybuffer-loader/-/arraybuffer-loader-1.0.8.tgz#3e326be5cdf6454782362823d43a8c33bb1dd276" + integrity sha512-CwUVCcxCgcgZUu2w741OV6Xj1tvRVQebq22RCyGXiLgJOJ4e4M/59EPYdtK2MLfIN28t1TDvuh2ojstNq3Kh5g== + dependencies: + loader-utils "^1.1.0" + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -519,6 +526,11 @@ batch@0.6.1: resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" @@ -935,6 +947,11 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" @@ -1589,6 +1606,13 @@ json-schema-traverse@^1.0.0: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== +json5@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -1674,6 +1698,15 @@ loader-runner@^4.2.0: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== +loader-utils@^1.1.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.2.tgz#29a957f3a63973883eb684f10ffd3d151fec01a3" + integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + locate-path@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" @@ -1800,7 +1833,7 @@ minimatch@^9.0.3: dependencies: brace-expansion "^2.0.1" -minimist@^1.2.3, minimist@^1.2.6: +minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.6: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -2901,3 +2934,8 @@ yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zstd-codec@0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/zstd-codec/-/zstd-codec-0.1.5.tgz#c180193e4603ef74ddf704bcc835397d30a60e42" + integrity sha512-v3fyjpK8S/dpY/X5WxqTK3IoCnp/ZOLxn144GZVlNUjtwAchzrVo03h+oMATFhCIiJ5KTr4V3vDQQYz4RU684g== diff --git a/settings.gradle.kts b/settings.gradle.kts index 9fc2688..bae65ff 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -34,6 +34,7 @@ include(":app:web") include(":api-gen-runtime") include(":api-gen-runtime-internal") include(":bluesky") +include(":jetstream") include(":lexicons") includeBuild("build-logic")