const std = @import("std"); const zds = @import("zds"); const Io = std.Io; var app_threaded_io: Io.Threaded = undefined; pub const std_options_debug_threaded_io: ?*Io.Threaded = &app_threaded_io; const io_worker_limit = 16; pub fn main(init: std.process.Init) !void { const allocator = std.heap.smp_allocator; app_threaded_io = Io.Threaded.init(allocator, .{ .async_limit = .limited(io_worker_limit), .concurrent_limit = .limited(io_worker_limit), }); const io = app_threaded_io.io(); const options = zds.internal.cli.parse(init.minimal) catch |err| switch (err) { error.Help => { zds.internal.cli.usage(); return; }, else => return err, }; if (options.public_url) |value| zds.core.config.setPublicUrl(value); if (options.server_did) |value| zds.core.config.setServerDid(value); if (options.plc_directory) |value| zds.core.config.setPlcDirectory(value); zds.core.config.setPlcRotationKey(options.plc_rotation_key); zds.core.config.setRecoveryDidKey(options.recovery_did_key); if (options.mail_provider) |value| { const parsed = zds.core.config.parseMailProvider(value) orelse return error.InvalidMailProvider; zds.core.config.setMailProvider(parsed); } zds.core.config.setEmailFrom(options.email_from); zds.core.config.setResendApiKey(options.resend_api_key); zds.core.config.setComailApiKey(options.comail_api_key); zds.core.config.setComailDid(options.comail_did); if (options.blob_upload_limit) |value| zds.core.config.setBlobUploadLimit(value); if (options.blobstore_path) |value| zds.core.config.setBlobstorePath(value); if (options.handle_domains) |value| { try zds.internal.handles.validateDomains(value); zds.core.config.setHandleDomains(value); } if (options.crawlers) |value| zds.core.config.setCrawlers(value); if (options.max_concurrent_repo_exports) |value| zds.core.config.setMaxConcurrentRepoExports(value); if (options.proxy_service_did) |value| zds.core.config.setProxyServiceDid(value); if (options.proxy_service_id) |value| zds.core.config.setProxyServiceId(value); if (options.proxy_service_url) |value| zds.core.config.setProxyServiceUrl(value); if (options.jwt_secret) |value| zds.core.config.setJwtSecret(value); zds.core.config.setDpopSecret(options.dpop_secret); zds.core.config.setAdminToken(options.admin_token); zds.core.config.setInviteRequired(options.invite_required); zds.core.config.setPermissionedData(options.permissioned_data); zds.core.config.setDevTools(options.dev_tools); if (options.log_level) |value| { const parsed = zds.core.config.parseLogLevel(value) orelse return error.InvalidLogLevel; zds.core.config.setLogLevel(parsed); } zds.storage.blobstore.init(io, zds.core.config.blobstorePath()); zds.storage.eventlog.init(io); try zds.storage.store.init(io, options.db_path); if (zds.core.config.inviteRequired()) { if (try zds.storage.store.ensureBootstrapInviteCode(allocator, zds.core.config.publicUrl())) |code| { zds.core.log.info("bootstrap invite code: {s}\n", .{code}); } } zds.atproto.sync.notifyCrawlers(true); try zds.http.server.listen(io, .{ .host = options.host, .port = options.port }); }