halkyon/halkyon_learn_client/lib/src/protocol/client.dart
Tizian 「ティツィアーン」 863f0899e3
feat(server): the instance names where its source is
Both licences (AGPL for the app, SSPL for the server) require offering the source of what an instance runs to the people who use it. instance.info() now carries sourceCodeUrl: the operator's SOURCE_URL, which they must set when running modified code, and otherwise this project's repository. Serverpod validates its configuration files strictly, so the value comes from the environment; deploy/compose.yaml passes it on from deploy/.env, whose example explains it. A test covers the default.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-09-30 20:38:18 +02:00

286 lines
9.5 KiB
Dart

/* AUTOMATICALLY GENERATED CODE DO NOT MODIFY */
/* To generate run: "serverpod generate" */
// ignore_for_file: implementation_imports
// ignore_for_file: library_private_types_in_public_api
// ignore_for_file: non_constant_identifier_names
// ignore_for_file: public_member_api_docs
// ignore_for_file: type_literal_in_constant_pattern
// ignore_for_file: use_super_parameters
// ignore_for_file: invalid_use_of_internal_member
// ignore_for_file: no_leading_underscores_for_library_prefixes
import 'dart:async' as _ida;
import 'package:halkyon_learn_client/src/protocol/auth/device.dart'
as _ieqh4yr9;
import 'package:halkyon_learn_client/src/protocol/instance/instance_info.dart'
as _i26u8vl4;
import 'package:http/http.dart' as _i85jenna;
import 'package:serverpod_auth_core_client/serverpod_auth_core_client.dart'
as _iacc;
import 'package:serverpod_auth_idp_client/serverpod_auth_idp_client.dart'
as _iaic;
import 'package:serverpod_client/serverpod_client.dart' as _isc;
import 'package:serverpod_database/serverpod_database.dart' as _isd;
import 'package:serverpod_offline_sync_client/serverpod_offline_sync_client.dart'
as _ipulbpi2;
import 'protocol.dart' as _il2as5qe;
import 'sync_tables.dart' as _ii3f3u05;
import 'package:halkyon_learn_client/migrations/migration_registry.dart';
/// Signs people in anonymously; the app calls it on first launch. Creating an
/// account is rate-limited per IP address (see `auth_config.dart`).
/// {@category Endpoint}
class EndpointAnonymousIdp extends _iaic.EndpointAnonymousIdpBase {
EndpointAnonymousIdp(_isc.EndpointCaller caller) : super(caller);
@override
String get name => 'anonymousIdp';
/// Creates a new anonymous account and returns its session.
///
/// Invokes the [AnonymousIdp.beforeAnonymousAccount] callback if configured,
/// which may prevent account creation if the endpoint is protected.
@override
_ida.Future<_iacc.AuthSuccess> login({String? token}) =>
caller.callServerEndpoint<_iacc.AuthSuccess>(
'anonymousIdp',
'login',
{'token': token},
);
}
/// Your devices: the sessions you're signed in with, and signing one of them
/// out, for example a lost phone.
///
/// Serverpod has no row-level security, so this endpoint enforces access
/// itself, like every endpoint: the person always comes from the session,
/// never from the client; every query filters by them; and someone else's
/// device answers exactly like a missing one.
/// {@category Endpoint}
class EndpointDevices extends _isc.EndpointRef {
EndpointDevices(_isc.EndpointCaller caller) : super(caller);
@override
String get name => 'devices';
/// Your devices, the most recently used first.
_ida.Future<List<_ieqh4yr9.Device>> list() =>
caller.callServerEndpoint<List<_ieqh4yr9.Device>>(
'devices',
'list',
{},
);
/// Signs out one of your devices. Throws [NotFoundException] when it isn't
/// yours, exactly as when it doesn't exist.
_ida.Future<void> signOut(_isc.UuidValue sessionId) =>
caller.callServerEndpoint<void>(
'devices',
'signOut',
{'sessionId': sessionId},
);
}
/// Signs in the person who already has a GitHub account, e.g. when they switch
/// to it on another device. Called without a session: Serverpod issues no
/// session for another person inside a signed-in call.
/// {@category Endpoint}
class EndpointGitHubSignIn extends _isc.EndpointRef {
EndpointGitHubSignIn(_isc.EndpointCaller caller) : super(caller);
@override
String get name => 'gitHubSignIn';
/// A session for the person with the GitHub account that [code] proves;
/// refusals as in [signInWithGitHubAccount].
_ida.Future<_iacc.AuthSuccess> signIn({
required String code,
required String codeVerifier,
required String redirectUri,
}) => caller.callServerEndpoint<_iacc.AuthSuccess>(
'gitHubSignIn',
'signIn',
{
'code': code,
'codeVerifier': codeVerifier,
'redirectUri': redirectUri,
},
);
}
/// Links a GitHub account to the signed-in person: the lossless upgrade from
/// an anonymous account. The person, their spaces and their studysets stay
/// where they are; only the way they sign in changes.
/// {@category Endpoint}
class EndpointGitHubUpgrade extends _isc.EndpointRef {
EndpointGitHubUpgrade(_isc.EndpointCaller caller) : super(caller);
@override
String get name => 'gitHubUpgrade';
/// Links the GitHub account that [code] proves to the caller; refusals as in
/// [linkGitHubAccount].
_ida.Future<void> upgrade({
required String code,
required String codeVerifier,
required String redirectUri,
}) => caller.callServerEndpoint<void>(
'gitHubUpgrade',
'upgrade',
{
'code': code,
'codeVerifier': codeVerifier,
'redirectUri': redirectUri,
},
);
}
/// What this instance offers. Public: the app asks before anyone is signed in.
/// {@category Endpoint}
class EndpointInstance extends _isc.EndpointRef {
EndpointInstance(_isc.EndpointCaller caller) : super(caller);
@override
String get name => 'instance';
/// This instance's offer: GitHub sign-in only with the operator's OAuth
/// app, and where its source is.
_ida.Future<_i26u8vl4.InstanceInfo> info() =>
caller.callServerEndpoint<_i26u8vl4.InstanceInfo>(
'instance',
'info',
{},
);
}
class Modules {
Modules(Client client) {
serverpod_auth_idp = _iaic.Caller(client);
offline_sync = _ipulbpi2.Caller(client);
serverpod_auth_core = _iacc.Caller(client);
}
late final _iaic.Caller serverpod_auth_idp;
late final _ipulbpi2.Caller offline_sync;
late final _iacc.Caller serverpod_auth_core;
}
class Client extends _isc.ServerpodClientShared {
Client(
String host, {
dynamic securityContext,
Duration? streamingConnectionTimeout,
Duration? connectionTimeout,
Function(
_isc.MethodCallContext,
Object,
StackTrace,
)?
onFailedCall,
Function(_isc.MethodCallContext)? onSucceededCall,
bool? disconnectStreamsOnLostInternetConnection,
_i85jenna.Client? httpClientOverride,
}) : super(
host,
_il2as5qe.Protocol(),
securityContext: securityContext,
streamingConnectionTimeout: streamingConnectionTimeout,
connectionTimeout: connectionTimeout,
onFailedCall: onFailedCall,
onSucceededCall: onSucceededCall,
disconnectStreamsOnLostInternetConnection:
disconnectStreamsOnLostInternetConnection,
httpClientOverride: httpClientOverride,
) {
anonymousIdp = EndpointAnonymousIdp(this);
devices = EndpointDevices(this);
gitHubSignIn = EndpointGitHubSignIn(this);
gitHubUpgrade = EndpointGitHubUpgrade(this);
instance = EndpointInstance(this);
modules = Modules(this);
}
late final EndpointAnonymousIdp anonymousIdp;
late final EndpointDevices devices;
late final EndpointGitHubSignIn gitHubSignIn;
late final EndpointGitHubUpgrade gitHubUpgrade;
late final EndpointInstance instance;
late final Modules modules;
@override
Map<String, _isc.EndpointRef> get endpointRefLookup => {
'anonymousIdp': anonymousIdp,
'devices': devices,
'gitHubSignIn': gitHubSignIn,
'gitHubUpgrade': gitHubUpgrade,
'instance': instance,
};
@override
Map<String, _isc.ModuleEndpointCaller> get moduleLookup => {
'serverpod_auth_idp': modules.serverpod_auth_idp,
'offline_sync': modules.offline_sync,
'serverpod_auth_core': modules.serverpod_auth_core,
};
/// Creates a new client-side database session for the given path.
///
/// The [path] is the file path to the SQLite database file. Since SQLite uses
/// WAL mode, note that `[path]-shm` and `[path]-wal` files might also exist
/// transiently for the database while the session is open.
///
/// If [runMigrations] is true, pending migrations will be applied when
/// opening the database. Be careful when setting this to false, as it might
/// lead to inconsistencies between the models and the database.
///
/// If [isDebugMode] is true, the database integrity will be verified after
/// the migrations are applied to provide feedback of possible issues. On a
/// Flutter application, this should be set to [kDebugMode].
_ida.Future<_isd.ClientDatabaseSession> createSession(
String path, {
bool runMigrations = true,
bool isDebugMode = false,
}) async {
return await _isd.ClientDatabaseSession.open(
path,
_il2as5qe.Protocol(),
clientMigrations: MigrationRegistry.migrations,
runMigrations: runMigrations,
isDebugMode: isDebugMode,
);
}
/// Creates a new client-side database session for the given path, wrapped
/// with the `serverpod_offline_sync` engine for the tables declared with
/// `database: sync`. See [createSession] for the [path], [runMigrations] and
/// [isDebugMode] parameters.
///
/// The [persistentUserId] is the user all local operations belong to. When
/// omitted, the user must be passed through the transaction.
_ida.Future<_ipulbpi2.OfflineSyncDatabaseSession> createSyncSession(
String path, {
bool runMigrations = true,
bool isDebugMode = false,
_isc.UuidValue? persistentUserId,
}) async {
final session = _ipulbpi2.OfflineSyncDatabaseSession.wraps(
await createSession(
path,
runMigrations: runMigrations,
isDebugMode: isDebugMode,
),
syncTables: _ii3f3u05.syncTables,
persistentUserId: persistentUserId,
);
await session.db.initialize();
return session;
}
}