swift-source/all/Generated/fxa_client.swift (3,065 lines of code) (raw):
// This file was autogenerated by some hot garbage in the `uniffi` crate.
// Trust me, you don't want to mess with it!
// swiftlint:disable all
/**
* # Firefox Accounts Client
*
* The fxa-client component lets applications integrate with the
* [Firefox Accounts](https://mozilla.github.io/ecosystem-platform/docs/features/firefox-accounts/fxa-overview)
* identity service. The shape of a typical integration would look
* something like:
*
* * Out-of-band, register your application with the Firefox Accounts service,
* providing an OAuth `redirect_uri` controlled by your application and
* obtaining an OAuth `client_id`.
*
* * On application startup, create a [`FirefoxAccount`] object to represent the
* signed-in state of the application.
* * On first startup, a new [`FirefoxAccount`] can be created by calling
* [`FirefoxAccount::new`] and passing the application's `client_id`.
* * For subsequent startups the object can be persisted using the
* [`to_json`](FirefoxAccount::to_json) method and re-created by
* calling [`FirefoxAccount::from_json`].
*
* * When the user wants to sign in to your application, direct them through
* a web-based OAuth flow using [`begin_oauth_flow`](FirefoxAccount::begin_oauth_flow)
* or [`begin_pairing_flow`](FirefoxAccount::begin_pairing_flow); when they return
* to your registered `redirect_uri`, pass the resulting authorization state back to
* [`complete_oauth_flow`](FirefoxAccount::complete_oauth_flow) to sign them in.
*
* * Display information about the signed-in user by using the data from
* [`get_profile`](FirefoxAccount::get_profile).
*
* * Access account-related services on behalf of the user by obtaining OAuth
* access tokens via [`get_access_token`](FirefoxAccount::get_access_token).
*
* * If the user opts to sign out of the application, calling [`disconnect`](FirefoxAccount::disconnect)
* and then discarding any persisted account data.
*/
import Foundation
// Depending on the consumer's build setup, the low-level FFI code
// might be in a separate module, or it might be compiled inline into
// this module. This is a bit of light hackery to work with both.
#if canImport(MozillaRustComponents)
import MozillaRustComponents
#endif
fileprivate extension RustBuffer {
// Allocate a new buffer, copying the contents of a `UInt8` array.
init(bytes: [UInt8]) {
let rbuf = bytes.withUnsafeBufferPointer { ptr in
RustBuffer.from(ptr)
}
self.init(capacity: rbuf.capacity, len: rbuf.len, data: rbuf.data)
}
static func empty() -> RustBuffer {
RustBuffer(capacity: 0, len:0, data: nil)
}
static func from(_ ptr: UnsafeBufferPointer<UInt8>) -> RustBuffer {
try! rustCall { ffi_fxa_client_rustbuffer_from_bytes(ForeignBytes(bufferPointer: ptr), $0) }
}
// Frees the buffer in place.
// The buffer must not be used after this is called.
func deallocate() {
try! rustCall { ffi_fxa_client_rustbuffer_free(self, $0) }
}
}
fileprivate extension ForeignBytes {
init(bufferPointer: UnsafeBufferPointer<UInt8>) {
self.init(len: Int32(bufferPointer.count), data: bufferPointer.baseAddress)
}
}
// For every type used in the interface, we provide helper methods for conveniently
// lifting and lowering that type from C-compatible data, and for reading and writing
// values of that type in a buffer.
// Helper classes/extensions that don't change.
// Someday, this will be in a library of its own.
fileprivate extension Data {
init(rustBuffer: RustBuffer) {
self.init(
bytesNoCopy: rustBuffer.data!,
count: Int(rustBuffer.len),
deallocator: .none
)
}
}
// Define reader functionality. Normally this would be defined in a class or
// struct, but we use standalone functions instead in order to make external
// types work.
//
// With external types, one swift source file needs to be able to call the read
// method on another source file's FfiConverter, but then what visibility
// should Reader have?
// - If Reader is fileprivate, then this means the read() must also
// be fileprivate, which doesn't work with external types.
// - If Reader is internal/public, we'll get compile errors since both source
// files will try define the same type.
//
// Instead, the read() method and these helper functions input a tuple of data
fileprivate func createReader(data: Data) -> (data: Data, offset: Data.Index) {
(data: data, offset: 0)
}
// Reads an integer at the current offset, in big-endian order, and advances
// the offset on success. Throws if reading the integer would move the
// offset past the end of the buffer.
fileprivate func readInt<T: FixedWidthInteger>(_ reader: inout (data: Data, offset: Data.Index)) throws -> T {
let range = reader.offset..<reader.offset + MemoryLayout<T>.size
guard reader.data.count >= range.upperBound else {
throw UniffiInternalError.bufferOverflow
}
if T.self == UInt8.self {
let value = reader.data[reader.offset]
reader.offset += 1
return value as! T
}
var value: T = 0
let _ = withUnsafeMutableBytes(of: &value, { reader.data.copyBytes(to: $0, from: range)})
reader.offset = range.upperBound
return value.bigEndian
}
// Reads an arbitrary number of bytes, to be used to read
// raw bytes, this is useful when lifting strings
fileprivate func readBytes(_ reader: inout (data: Data, offset: Data.Index), count: Int) throws -> Array<UInt8> {
let range = reader.offset..<(reader.offset+count)
guard reader.data.count >= range.upperBound else {
throw UniffiInternalError.bufferOverflow
}
var value = [UInt8](repeating: 0, count: count)
value.withUnsafeMutableBufferPointer({ buffer in
reader.data.copyBytes(to: buffer, from: range)
})
reader.offset = range.upperBound
return value
}
// Reads a float at the current offset.
fileprivate func readFloat(_ reader: inout (data: Data, offset: Data.Index)) throws -> Float {
return Float(bitPattern: try readInt(&reader))
}
// Reads a float at the current offset.
fileprivate func readDouble(_ reader: inout (data: Data, offset: Data.Index)) throws -> Double {
return Double(bitPattern: try readInt(&reader))
}
// Indicates if the offset has reached the end of the buffer.
fileprivate func hasRemaining(_ reader: (data: Data, offset: Data.Index)) -> Bool {
return reader.offset < reader.data.count
}
// Define writer functionality. Normally this would be defined in a class or
// struct, but we use standalone functions instead in order to make external
// types work. See the above discussion on Readers for details.
fileprivate func createWriter() -> [UInt8] {
return []
}
fileprivate func writeBytes<S>(_ writer: inout [UInt8], _ byteArr: S) where S: Sequence, S.Element == UInt8 {
writer.append(contentsOf: byteArr)
}
// Writes an integer in big-endian order.
//
// Warning: make sure what you are trying to write
// is in the correct type!
fileprivate func writeInt<T: FixedWidthInteger>(_ writer: inout [UInt8], _ value: T) {
var value = value.bigEndian
withUnsafeBytes(of: &value) { writer.append(contentsOf: $0) }
}
fileprivate func writeFloat(_ writer: inout [UInt8], _ value: Float) {
writeInt(&writer, value.bitPattern)
}
fileprivate func writeDouble(_ writer: inout [UInt8], _ value: Double) {
writeInt(&writer, value.bitPattern)
}
// Protocol for types that transfer other types across the FFI. This is
// analogous to the Rust trait of the same name.
fileprivate protocol FfiConverter {
associatedtype FfiType
associatedtype SwiftType
static func lift(_ value: FfiType) throws -> SwiftType
static func lower(_ value: SwiftType) -> FfiType
static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> SwiftType
static func write(_ value: SwiftType, into buf: inout [UInt8])
}
// Types conforming to `Primitive` pass themselves directly over the FFI.
fileprivate protocol FfiConverterPrimitive: FfiConverter where FfiType == SwiftType { }
extension FfiConverterPrimitive {
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public static func lift(_ value: FfiType) throws -> SwiftType {
return value
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public static func lower(_ value: SwiftType) -> FfiType {
return value
}
}
// Types conforming to `FfiConverterRustBuffer` lift and lower into a `RustBuffer`.
// Used for complex types where it's hard to write a custom lift/lower.
fileprivate protocol FfiConverterRustBuffer: FfiConverter where FfiType == RustBuffer {}
extension FfiConverterRustBuffer {
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public static func lift(_ buf: RustBuffer) throws -> SwiftType {
var reader = createReader(data: Data(rustBuffer: buf))
let value = try read(from: &reader)
if hasRemaining(reader) {
throw UniffiInternalError.incompleteData
}
buf.deallocate()
return value
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public static func lower(_ value: SwiftType) -> RustBuffer {
var writer = createWriter()
write(value, into: &writer)
return RustBuffer(bytes: writer)
}
}
// An error type for FFI errors. These errors occur at the UniFFI level, not
// the library level.
fileprivate enum UniffiInternalError: LocalizedError {
case bufferOverflow
case incompleteData
case unexpectedOptionalTag
case unexpectedEnumCase
case unexpectedNullPointer
case unexpectedRustCallStatusCode
case unexpectedRustCallError
case unexpectedStaleHandle
case rustPanic(_ message: String)
public var errorDescription: String? {
switch self {
case .bufferOverflow: return "Reading the requested value would read past the end of the buffer"
case .incompleteData: return "The buffer still has data after lifting its containing value"
case .unexpectedOptionalTag: return "Unexpected optional tag; should be 0 or 1"
case .unexpectedEnumCase: return "Raw enum value doesn't match any cases"
case .unexpectedNullPointer: return "Raw pointer value was null"
case .unexpectedRustCallStatusCode: return "Unexpected RustCallStatus code"
case .unexpectedRustCallError: return "CALL_ERROR but no errorClass specified"
case .unexpectedStaleHandle: return "The object in the handle map has been dropped already"
case let .rustPanic(message): return message
}
}
}
fileprivate extension NSLock {
func withLock<T>(f: () throws -> T) rethrows -> T {
self.lock()
defer { self.unlock() }
return try f()
}
}
fileprivate let CALL_SUCCESS: Int8 = 0
fileprivate let CALL_ERROR: Int8 = 1
fileprivate let CALL_UNEXPECTED_ERROR: Int8 = 2
fileprivate let CALL_CANCELLED: Int8 = 3
fileprivate extension RustCallStatus {
init() {
self.init(
code: CALL_SUCCESS,
errorBuf: RustBuffer.init(
capacity: 0,
len: 0,
data: nil
)
)
}
}
private func rustCall<T>(_ callback: (UnsafeMutablePointer<RustCallStatus>) -> T) throws -> T {
let neverThrow: ((RustBuffer) throws -> Never)? = nil
return try makeRustCall(callback, errorHandler: neverThrow)
}
private func rustCallWithError<T, E: Swift.Error>(
_ errorHandler: @escaping (RustBuffer) throws -> E,
_ callback: (UnsafeMutablePointer<RustCallStatus>) -> T) throws -> T {
try makeRustCall(callback, errorHandler: errorHandler)
}
private func makeRustCall<T, E: Swift.Error>(
_ callback: (UnsafeMutablePointer<RustCallStatus>) -> T,
errorHandler: ((RustBuffer) throws -> E)?
) throws -> T {
uniffiEnsureFxaClientInitialized()
var callStatus = RustCallStatus.init()
let returnedVal = callback(&callStatus)
try uniffiCheckCallStatus(callStatus: callStatus, errorHandler: errorHandler)
return returnedVal
}
private func uniffiCheckCallStatus<E: Swift.Error>(
callStatus: RustCallStatus,
errorHandler: ((RustBuffer) throws -> E)?
) throws {
switch callStatus.code {
case CALL_SUCCESS:
return
case CALL_ERROR:
if let errorHandler = errorHandler {
throw try errorHandler(callStatus.errorBuf)
} else {
callStatus.errorBuf.deallocate()
throw UniffiInternalError.unexpectedRustCallError
}
case CALL_UNEXPECTED_ERROR:
// When the rust code sees a panic, it tries to construct a RustBuffer
// with the message. But if that code panics, then it just sends back
// an empty buffer.
if callStatus.errorBuf.len > 0 {
throw UniffiInternalError.rustPanic(try FfiConverterString.lift(callStatus.errorBuf))
} else {
callStatus.errorBuf.deallocate()
throw UniffiInternalError.rustPanic("Rust panic")
}
case CALL_CANCELLED:
fatalError("Cancellation not supported yet")
default:
throw UniffiInternalError.unexpectedRustCallStatusCode
}
}
private func uniffiTraitInterfaceCall<T>(
callStatus: UnsafeMutablePointer<RustCallStatus>,
makeCall: () throws -> T,
writeReturn: (T) -> ()
) {
do {
try writeReturn(makeCall())
} catch let error {
callStatus.pointee.code = CALL_UNEXPECTED_ERROR
callStatus.pointee.errorBuf = FfiConverterString.lower(String(describing: error))
}
}
private func uniffiTraitInterfaceCallWithError<T, E>(
callStatus: UnsafeMutablePointer<RustCallStatus>,
makeCall: () throws -> T,
writeReturn: (T) -> (),
lowerError: (E) -> RustBuffer
) {
do {
try writeReturn(makeCall())
} catch let error as E {
callStatus.pointee.code = CALL_ERROR
callStatus.pointee.errorBuf = lowerError(error)
} catch {
callStatus.pointee.code = CALL_UNEXPECTED_ERROR
callStatus.pointee.errorBuf = FfiConverterString.lower(String(describing: error))
}
}
fileprivate final class UniffiHandleMap<T>: @unchecked Sendable {
// All mutation happens with this lock held, which is why we implement @unchecked Sendable.
private let lock = NSLock()
private var map: [UInt64: T] = [:]
private var currentHandle: UInt64 = 1
func insert(obj: T) -> UInt64 {
lock.withLock {
let handle = currentHandle
currentHandle += 1
map[handle] = obj
return handle
}
}
func get(handle: UInt64) throws -> T {
try lock.withLock {
guard let obj = map[handle] else {
throw UniffiInternalError.unexpectedStaleHandle
}
return obj
}
}
@discardableResult
func remove(handle: UInt64) throws -> T {
try lock.withLock {
guard let obj = map.removeValue(forKey: handle) else {
throw UniffiInternalError.unexpectedStaleHandle
}
return obj
}
}
var count: Int {
get {
map.count
}
}
}
// Public interface members begin here.
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
fileprivate struct FfiConverterInt64: FfiConverterPrimitive {
typealias FfiType = Int64
typealias SwiftType = Int64
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> Int64 {
return try lift(readInt(&buf))
}
public static func write(_ value: Int64, into buf: inout [UInt8]) {
writeInt(&buf, lower(value))
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
fileprivate struct FfiConverterBool : FfiConverter {
typealias FfiType = Int8
typealias SwiftType = Bool
public static func lift(_ value: Int8) throws -> Bool {
return value != 0
}
public static func lower(_ value: Bool) -> Int8 {
return value ? 1 : 0
}
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> Bool {
return try lift(readInt(&buf))
}
public static func write(_ value: Bool, into buf: inout [UInt8]) {
writeInt(&buf, lower(value))
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
fileprivate struct FfiConverterString: FfiConverter {
typealias SwiftType = String
typealias FfiType = RustBuffer
public static func lift(_ value: RustBuffer) throws -> String {
defer {
value.deallocate()
}
if value.data == nil {
return String()
}
let bytes = UnsafeBufferPointer<UInt8>(start: value.data!, count: Int(value.len))
return String(bytes: bytes, encoding: String.Encoding.utf8)!
}
public static func lower(_ value: String) -> RustBuffer {
return value.utf8CString.withUnsafeBufferPointer { ptr in
// The swift string gives us int8_t, we want uint8_t.
ptr.withMemoryRebound(to: UInt8.self) { ptr in
// The swift string gives us a trailing null byte, we don't want it.
let buf = UnsafeBufferPointer(rebasing: ptr.prefix(upTo: ptr.count - 1))
return RustBuffer.from(buf)
}
}
}
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> String {
let len: Int32 = try readInt(&buf)
return String(bytes: try readBytes(&buf, count: Int(len)), encoding: String.Encoding.utf8)!
}
public static func write(_ value: String, into buf: inout [UInt8]) {
let len = Int32(value.utf8.count)
writeInt(&buf, len)
writeBytes(&buf, value.utf8)
}
}
/**
* Object representing the signed-in state of an application.
*
* The `FirefoxAccount` object is the main interface provided by this crate.
* It represents the signed-in state of an application that may be connected to
* user's Firefox Account, and provides methods for inspecting the state of the
* account and accessing other services on behalf of the user.
*/
public protocol FirefoxAccountProtocol: AnyObject {
/**
* Create a new OAuth authorization code using the stored session token.
*
* When a signed-in application receives an incoming device pairing request, it can
* use this method to grant the request and generate a corresponding OAuth authorization
* code. This code would then be passed back to the connecting device over the
* pairing channel (a process which is not currently supported by any code in this
* component).
*
* # Arguments
*
* - `params` - the OAuth parameters from the incoming authorization request
*/
func authorizeCodeUsingSessionToken(params: AuthorizationParameters) throws -> String
/**
* Initiate a web-based OAuth sign-in flow.
*
* This method initializes some internal state and then returns a URL at which the
* user may perform a web-based authorization flow to connect the application to
* their account. The application should direct the user to the provided URL.
*
* When the resulting OAuth flow redirects back to the configured `redirect_uri`,
* the query parameters should be extracting from the URL and passed to the
* [`complete_oauth_flow`](FirefoxAccount::complete_oauth_flow) method to finalize
* the signin.
*
* # Arguments
*
* - `scopes` - list of OAuth scopes to request.
* - The requested scopes will determine what account-related data
* the application is able to access.
* - `entrypoint` - metrics identifier for UX entrypoint.
* - This parameter is used for metrics purposes, to identify the
* UX entrypoint from which the user triggered the signin request.
* For example, the application toolbar, on the onboarding flow.
* - `metrics` - optionally, additional metrics tracking parameters.
* - These will be included as query parameters in the resulting URL.
*/
func beginOauthFlow(scopes: [String], entrypoint: String) throws -> String
/**
* Initiate a device-pairing sign-in flow.
*
* Once the user has scanned a pairing QR code, pass the scanned value to this
* method. It will return a URL to which the application should redirect the user
* in order to continue the sign-in flow.
*
* When the resulting flow redirects back to the configured `redirect_uri`,
* the resulting OAuth parameters should be extracting from the URL and passed
* to [`complete_oauth_flow`](FirefoxAccount::complete_oauth_flow) to finalize
* the signin.
*
* # Arguments
*
* - `pairing_url` - the URL scanned from a QR code on another device.
* - `scopes` - list of OAuth scopes to request.
* - The requested scopes will determine what account-related data
* the application is able to access.
* - `entrypoint` - metrics identifier for UX entrypoint.
* - This parameter is used for metrics purposes, to identify the
* UX entrypoint from which the user triggered the signin request.
* For example, the application toolbar, on the onboarding flow.
* - `metrics` - optionally, additional metrics tracking parameters.
* - These will be included as query parameters in the resulting URL.
*/
func beginPairingFlow(pairingUrl: String, scopes: [String], entrypoint: String) throws -> String
/**
* Check authorization status for this application.
*
* **💾 This method alters the persisted account state.**
*
* Applications may call this method to check with the FxA server about the status
* of their authentication tokens. It returns an [`AuthorizationInfo`] struct
* with details about whether the tokens are still active.
*/
func checkAuthorizationStatus() throws -> AuthorizationInfo
/**
* Clear the access token cache in response to an auth failure.
*
* **💾 This method alters the persisted account state.**
*
* Applications that receive an authentication error when trying to use an access token,
* should call this method before creating a new token and retrying the failed operation.
* It ensures that the expired token is removed and a fresh one generated.
*/
func clearAccessTokenCache()
/**
* Clear any custom display name used for this application instance.
*
* **💾 This method alters the persisted account state.**
*
* This method clears the name of the current application's device record, causing other
* applications or the user's account management pages to have to fill in some sort of
* default name when displaying this device.
*
* # Notes
*
* - Device registration is only available to applications that have been
* granted the `https:///identity.mozilla.com/apps/oldsync` scope.
*/
func clearDeviceName() throws
/**
* Use device commands to close one or more tabs on another device.
*
* **💾 This method alters the persisted account state.**
*
* If a device on the account has registered the [`CloseTabs`](DeviceCapability::CloseTabs)
* capability, this method can be used to close its tabs.
*/
func closeTabs(targetDeviceId: String, urls: [String]) throws -> CloseTabsResult
/**
* Complete an OAuth flow.
*
* **💾 This method alters the persisted account state.**
*
* At the conclusion of an OAuth flow, the user will be redirect to the
* application's registered `redirect_uri`. It should extract the `code`
* and `state` parameters from the resulting URL and pass them to this
* method in order to complete the sign-in.
*
* # Arguments
*
* - `code` - the OAuth authorization code obtained from the redirect URI.
* - `state` - the OAuth state parameter obtained from the redirect URI.
*/
func completeOauthFlow(code: String, state: String) throws
/**
* Disconnect from the user's account.
*
* **💾 This method alters the persisted account state.**
*
* This method destroys any tokens held by the client, effectively disconnecting
* from the user's account. Applications should call this when the user opts to
* sign out.
*
* The persisted account state after calling this method will contain only the
* user's last-seen profile information, if any. This may be useful in helping
* the user to reconnnect to their account. If reconnecting to the same account
* is not desired then the application should discard the persisted account state.
*/
func disconnect()
/**
* Ensure that the device record has a specific set of capabilities.
*
* **💾 This method alters the persisted account state.**
*
* This method checks that the currently-registered device record is advertising the
* given set of capabilities in the FxA "device commands" ecosystem. If not, then it
* updates the device record to do so.
*
* Applications should call this method on each startup as a way to ensure that their
* expected set of capabilities is being accurately reflected on the FxA server, and
* to handle the rollout of new capabilities over time.
*
* # Arguments
*
* - `supported_capabilities` - the set of [capabilities](DeviceCapability) to register
* for this device in the "device commands" ecosystem.
*
* # Notes
*
* - Device registration is only available to applications that have been
* granted the `https:///identity.mozilla.com/apps/oldsync` scope.
*/
func ensureCapabilities(supportedCapabilities: [DeviceCapability]) throws -> LocalDevice
/**
* Collect and return telemetry about incoming and outgoing device commands.
*
* Applications that have registered one or more [`DeviceCapability`]s
* should also arrange to submit "sync ping" telemetry. Calling this method will
* return a JSON string of telemetry data that can be incorporated into that ping.
*
* Sorry, this is not particularly carefully documented because it is intended
* as a stop-gap until we get native Glean support. If you know how to submit
* a sync ping, you'll know what to do with the contents of the JSON string.
*/
func gatherTelemetry() throws -> String
/**
* Get a short-lived OAuth access token for the user's account.
*
* **💾 This method alters the persisted account state.**
*
* Applications that need to access resources on behalf of the user must obtain an
* `access_token` in order to do so. For example, an access token is required when
* fetching the user's profile data, or when accessing their data stored in Firefox Sync.
*
* This method will obtain and return an access token bearing the requested scopes, either
* from a local cache of previously-issued tokens, or by creating a new one from the server.
*
* # Arguments
*
* - `scope` - the OAuth scope to be granted by the token.
* - This must be one of the scopes requested during the signin flow.
* - Only a single scope is supported; for multiple scopes request multiple tokens.
* - `ttl` - optionally, the time for which the token should be valid, in seconds.
*
* # Notes
*
* - If the application receives an authorization error when trying to use the resulting
* token, it should call [`clear_access_token_cache`](FirefoxAccount::clear_access_token_cache)
* before requesting a fresh token.
*/
func getAccessToken(scope: String, ttl: Int64?) throws -> AccessTokenInfo
/**
* Get the list of all client applications attached to the user's account.
*
* This method returns a list of [`AttachedClient`] structs representing all the applications
* connected to the user's account. This includes applications that are registered as a device
* as well as server-side services that the user has connected.
*
* This information is really only useful for targeted messaging or marketing purposes,
* e.g. if the application wants to advertize a related product, but first wants to check
* whether the user is already using that product.
*
* # Notes
*
* - Attached client metadata is only visible to applications that have been
* granted the `https:///identity.mozilla.com/apps/oldsync` scope.
*/
func getAttachedClients() throws -> [AttachedClient]
/**
* Get the high-level authentication state of the client
*
* Deprecated: Use get_state() instead
*/
func getAuthState() -> FxaRustAuthState
/**
* Get a URL which shows a "successfully connceted!" message.
*
* **💾 This method alters the persisted account state.**
*
* Applications can use this method after a successful signin, to redirect the
* user to a success message displayed in web content rather than having to
* implement their own native success UI.
*/
func getConnectionSuccessUrl() throws -> String
/**
* Get the device id registered for this application.
*
* # Notes
*
* - If the application has not registered a device record, this method will
* throw an [`Other`](FxaError::Other) error.
* - (Yeah...sorry. This should be changed to do something better.)
* - Device metadata is only visible to applications that have been
* granted the `https:///identity.mozilla.com/apps/oldsync` scope.
*/
func getCurrentDeviceId() throws -> String
/**
* Get the list of devices registered on the user's account.
*
* **💾 This method alters the persisted account state.**
*
* This method returns a list of [`Device`] structs representing all the devices
* currently attached to the user's account (including the current device).
* The application might use this information to e.g. display a list of appropriate
* send-tab targets.
*
* # Arguments
*
* - `ignore_cache` - if true, always hit the server for fresh profile information.
*
* # Notes
*
* - Device metadata is only visible to applications that have been
* granted the `https:///identity.mozilla.com/apps/oldsync` scope.
*/
func getDevices(ignoreCache: Bool) throws -> [Device]
/**
* Get a URL at which the user can manage their account and profile data.
*
* **💾 This method alters the persisted account state.**
*
* Applications should link the user out to this URL from an appropriate place
* in their signed-in settings UI.
*
* # Arguments
*
* - `entrypoint` - metrics identifier for UX entrypoint.
* - This parameter is used for metrics purposes, to identify the
* UX entrypoint from which the user followed the link.
*/
func getManageAccountUrl(entrypoint: String) throws -> String
/**
* Get a URL at which the user can manage the devices connected to their account.
*
* **💾 This method alters the persisted account state.**
*
* Applications should link the user out to this URL from an appropriate place
* in their signed-in settings UI. For example, "Manage your devices..." may be
* a useful link to place somewhere near the device list in the send-tab UI.
*
* # Arguments
*
* - `entrypoint` - metrics identifier for UX entrypoint.
* - This parameter is used for metrics purposes, to identify the
* UX entrypoint from which the user followed the link.
*/
func getManageDevicesUrl(entrypoint: String) throws -> String
/**
* Get the URL at which to begin a device-pairing signin flow.
*
* If the user wants to sign in using device pairing, call this method and then
* direct them to visit the resulting URL on an already-signed-in device. Doing
* so will trigger the other device to show a QR code to be scanned, and the result
* from said QR code can be passed to [`begin_pairing_flow`](FirefoxAccount::begin_pairing_flow).
*/
func getPairingAuthorityUrl() throws -> String
/**
* Get profile information for the signed-in user, if any.
*
* **💾 This method alters the persisted account state.**
*
* This method fetches a [`Profile`] struct with information about the currently-signed-in
* user, either by using locally-cached profile information or by fetching fresh data from
* the server.
*
* # Arguments
*
* - `ignore_cache` - if true, always hit the server for fresh profile information.
*
* # Notes
*
* - Profile information is only available to applications that have been
* granted the `profile` scope.
* - There is currently no API for fetching cached profile information without
* potentially hitting the server.
* - If there is no signed-in user, this method will throw an
* [`Authentication`](FxaError::Authentication) error.
*/
func getProfile(ignoreCache: Bool) throws -> Profile
/**
* Get the session token for the user's account, if one is available.
*
* **💾 This method alters the persisted account state.**
*
* Applications that function as a web browser may need to hold on to a session token
* on behalf of Firefox Accounts web content. This method exists so that they can retrieve
* it an pass it back to said web content when required.
*
* # Notes
*
* - Please do not attempt to use the resulting token to directly make calls to the
* Firefox Accounts servers! All account management functionality should be performed
* in web content.
* - A session token is only available to applications that have requested the
* `https:///identity.mozilla.com/tokens/session` scope.
*/
func getSessionToken() throws -> String
/**
* Get the current state
*/
func getState() -> FxaState
/**
* Get the URL at which to access the user's sync data.
*
* **💾 This method alters the persisted account state.**
*/
func getTokenServerEndpointUrl() throws -> String
/**
* Process and respond to a server-delivered account update message
*
* **💾 This method alters the persisted account state.**
*
* Applications should call this method whenever they receive a push notification from the Firefox Accounts server.
* Such messages typically indicate a noteworthy change of state on the user's account, such as an update to their profile information
* or the disconnection of a client. The [`FirefoxAccount`] struct will update its internal state
* accordingly and return an individual [`AccountEvent`] struct describing the event, which the application
* may use for further processing.
*
* It's important to note if the event is [`AccountEvent::CommandReceived`], the caller should call
* [`FirefoxAccount::poll_device_commands`]
*/
func handlePushMessage(payload: String) throws -> AccountEvent
/**
* Update the stored session token for the user's account.
*
* **💾 This method alters the persisted account state.**
*
* Applications that function as a web browser may need to hold on to a session token
* on behalf of Firefox Accounts web content. This method exists so that said web content
* signals that it has generated a new session token, the stored value can be updated
* to match.
*
* # Arguments
*
* - `session_token` - the new session token value provided from web content.
*/
func handleSessionTokenChange(sessionToken: String) throws
/**
* Create a new device record for this application.
*
* **💾 This method alters the persisted account state.**
*
* This method registered a device record for the application, providing basic metadata for
* the device along with a list of supported [Device Capabilities](DeviceCapability) for
* participating in the "device commands" ecosystem.
*
* Applications should call this method soon after a successful sign-in, to ensure
* they they appear correctly in the user's account-management pages and when discovered
* by other devices connected to the account.
*
* # Arguments
*
* - `name` - human-readable display name to use for this application
* - `device_type` - the [type](DeviceType) of device the application is installed on
* - `supported_capabilities` - the set of [capabilities](DeviceCapability) to register
* for this device in the "device commands" ecosystem.
*
* # Notes
*
* - Device registration is only available to applications that have been
* granted the `https:///identity.mozilla.com/apps/oldsync` scope.
*/
func initializeDevice(name: String, deviceType: DeviceType, supportedCapabilities: [DeviceCapability]) throws -> LocalDevice
/**
* Update the state based on authentication issues.
*
* **💾 This method alters the persisted account state.**
*
* Call this if you know there's an authentication / authorization issue that requires the
* user to re-authenticated. It transitions the user to the [FxaRustAuthState.AuthIssues] state.
*/
func onAuthIssues()
/**
* Poll the server for any pending device commands.
*
* **💾 This method alters the persisted account state.**
*
* Applications that have registered one or more [`DeviceCapability`]s with the server can use
* this method to check whether other devices on the account have sent them any commands.
* It will return a list of [`IncomingDeviceCommand`] structs for the application to process.
*
* # Notes
*
* - Device commands are typically delivered via push message and the [`CommandReceived`](
* AccountEvent::CommandReceived) event. Polling should only be used as a backup delivery
* mechanism, f the application has reason to believe that push messages may have been missed.
* - Device commands functionality is only available to applications that have been
* granted the `https:///identity.mozilla.com/apps/oldsync` scope.
*/
func pollDeviceCommands() throws -> [IncomingDeviceCommand]
/**
* Process an event (login, logout, etc).
*
* On success, update the current state and return it.
* On error, the current state will remain the same.
*/
func processEvent(event: FxaEvent) throws -> FxaState
/**
* Use device commands to send a single tab to another device.
*
* **💾 This method alters the persisted account state.**
*
* If a device on the account has registered the [`SendTab`](DeviceCapability::SendTab)
* capability, this method can be used to send it a tab.
*
* # Notes
*
* - If the given device id does not existing or is not capable of receiving tabs,
* this method will throw an [`Other`](FxaError::Other) error.
* - (Yeah...sorry. This should be changed to do something better.)
* - It is not currently possible to send a full [`SendTabPayload`] to another device,
* but that's purely an API limitation that should go away in future.
* - Device commands functionality is only available to applications that have been
* granted the `https:///identity.mozilla.com/apps/oldsync` scope.
*/
func sendSingleTab(targetDeviceId: String, title: String, url: String) throws
/**
* Update the display name used for this application instance.
*
* **💾 This method alters the persisted account state.**
*
* This method modifies the name of the current application's device record, as seen by
* other applications and in the user's account management pages.
*
* # Arguments
*
* - `display_name` - the new name for the current device.
*
* # Notes
*
* - Device registration is only available to applications that have been
* granted the `https:///identity.mozilla.com/apps/oldsync` scope.
*/
func setDeviceName(displayName: String) throws -> LocalDevice
/**
* Set or update a push subscription endpoint for this device.
*
* **💾 This method alters the persisted account state.**
*
* This method registers the given webpush subscription with the FxA server, requesting
* that is send notifications in the event of any significant changes to the user's
* account. When the application receives a push message at the registered subscription
* endpoint, it should decrypt the payload and pass it to the [`handle_push_message`](
* FirefoxAccount::handle_push_message) method for processing.
*
* # Arguments
*
* - `subscription` - the [`DevicePushSubscription`] details to register with the server.
*
* # Notes
*
* - Device registration is only available to applications that have been
* granted the `https:///identity.mozilla.com/apps/oldsync` scope.
*/
func setPushSubscription(subscription: DevicePushSubscription) throws -> LocalDevice
/**
* Sets the users information based on the web content's login information
* This is intended to only be used by user agents (eg: Firefox) to set the users
* session token and tie it to the refresh token that will be issued at the end of the
* oauth flow.
*/
func setUserData(userData: UserData)
/**
* Used by the application to test auth token issues
*/
func simulateNetworkError()
/**
* Used by the application to test auth token issues
*/
func simulatePermanentAuthTokenIssue()
/**
* Used by the application to test auth token issues
*/
func simulateTemporaryAuthTokenIssue()
/**
* Save current state to a JSON string.
*
* This method serializes the current account state into a JSON string, which
* the application can use to persist the user's signed-in state across restarts.
* The application should call this method and update its persisted state after
* any potentially-state-changing operation.
*
* **⚠️ Warning:** the serialized state may contain encryption keys and access
* tokens that let anyone holding them access the user's data in Firefox Sync
* and/or other FxA services. Applications should take care to store the resulting
* data in a secure fashion, as appropriate for their target platform.
*/
func toJson() throws -> String
}
/**
* Object representing the signed-in state of an application.
*
* The `FirefoxAccount` object is the main interface provided by this crate.
* It represents the signed-in state of an application that may be connected to
* user's Firefox Account, and provides methods for inspecting the state of the
* account and accessing other services on behalf of the user.
*/
open class FirefoxAccount: FirefoxAccountProtocol, @unchecked Sendable {
fileprivate let pointer: UnsafeMutableRawPointer!
/// Used to instantiate a [FFIObject] without an actual pointer, for fakes in tests, mostly.
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public struct NoPointer {
public init() {}
}
// TODO: We'd like this to be `private` but for Swifty reasons,
// we can't implement `FfiConverter` without making this `required` and we can't
// make it `required` without making it `public`.
required public init(unsafeFromRawPointer pointer: UnsafeMutableRawPointer) {
self.pointer = pointer
}
// This constructor can be used to instantiate a fake object.
// - Parameter noPointer: Placeholder value so we can have a constructor separate from the default empty one that may be implemented for classes extending [FFIObject].
//
// - Warning:
// Any object instantiated with this constructor cannot be passed to an actual Rust-backed object. Since there isn't a backing [Pointer] the FFI lower functions will crash.
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public init(noPointer: NoPointer) {
self.pointer = nil
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func uniffiClonePointer() -> UnsafeMutableRawPointer {
return try! rustCall { uniffi_fxa_client_fn_clone_firefoxaccount(self.pointer, $0) }
}
/**
* Create a new [`FirefoxAccount`] instance, not connected to any account.
*
* **💾 This method alters the persisted account state.**
*
* This method constructs as new [`FirefoxAccount`] instance configured to connect
* the application to a user's account.
*/
public convenience init(config: FxaConfig) {
let pointer =
try! rustCall() {
uniffi_fxa_client_fn_constructor_firefoxaccount_new(
FfiConverterTypeFxaConfig_lower(config),$0
)
}
self.init(unsafeFromRawPointer: pointer)
}
deinit {
guard let pointer = pointer else {
return
}
try! rustCall { uniffi_fxa_client_fn_free_firefoxaccount(pointer, $0) }
}
/**
* Restore a [`FirefoxAccount`] instance from serialized state.
*
* Given a JSON string previously obtained from [`FirefoxAccount::to_json`], this
* method will deserialize it and return a live [`FirefoxAccount`] instance.
*
* **⚠️ Warning:** since the serialized state contains access tokens, you should
* not call `from_json` multiple times on the same data. This would result
* in multiple live objects sharing the same access tokens and is likely to
* produce unexpected behaviour.
*/
public static func fromJson(data: String)throws -> FirefoxAccount {
return try FfiConverterTypeFirefoxAccount_lift(try rustCallWithError(FfiConverterTypeFxaError_lift) {
uniffi_fxa_client_fn_constructor_firefoxaccount_from_json(
FfiConverterString.lower(data),$0
)
})
}
/**
* Create a new OAuth authorization code using the stored session token.
*
* When a signed-in application receives an incoming device pairing request, it can
* use this method to grant the request and generate a corresponding OAuth authorization
* code. This code would then be passed back to the connecting device over the
* pairing channel (a process which is not currently supported by any code in this
* component).
*
* # Arguments
*
* - `params` - the OAuth parameters from the incoming authorization request
*/
open func authorizeCodeUsingSessionToken(params: AuthorizationParameters)throws -> String {
return try FfiConverterString.lift(try rustCallWithError(FfiConverterTypeFxaError_lift) {
uniffi_fxa_client_fn_method_firefoxaccount_authorize_code_using_session_token(self.uniffiClonePointer(),
FfiConverterTypeAuthorizationParameters_lower(params),$0
)
})
}
/**
* Initiate a web-based OAuth sign-in flow.
*
* This method initializes some internal state and then returns a URL at which the
* user may perform a web-based authorization flow to connect the application to
* their account. The application should direct the user to the provided URL.
*
* When the resulting OAuth flow redirects back to the configured `redirect_uri`,
* the query parameters should be extracting from the URL and passed to the
* [`complete_oauth_flow`](FirefoxAccount::complete_oauth_flow) method to finalize
* the signin.
*
* # Arguments
*
* - `scopes` - list of OAuth scopes to request.
* - The requested scopes will determine what account-related data
* the application is able to access.
* - `entrypoint` - metrics identifier for UX entrypoint.
* - This parameter is used for metrics purposes, to identify the
* UX entrypoint from which the user triggered the signin request.
* For example, the application toolbar, on the onboarding flow.
* - `metrics` - optionally, additional metrics tracking parameters.
* - These will be included as query parameters in the resulting URL.
*/
open func beginOauthFlow(scopes: [String], entrypoint: String)throws -> String {
return try FfiConverterString.lift(try rustCallWithError(FfiConverterTypeFxaError_lift) {
uniffi_fxa_client_fn_method_firefoxaccount_begin_oauth_flow(self.uniffiClonePointer(),
FfiConverterSequenceString.lower(scopes),
FfiConverterString.lower(entrypoint),$0
)
})
}
/**
* Initiate a device-pairing sign-in flow.
*
* Once the user has scanned a pairing QR code, pass the scanned value to this
* method. It will return a URL to which the application should redirect the user
* in order to continue the sign-in flow.
*
* When the resulting flow redirects back to the configured `redirect_uri`,
* the resulting OAuth parameters should be extracting from the URL and passed
* to [`complete_oauth_flow`](FirefoxAccount::complete_oauth_flow) to finalize
* the signin.
*
* # Arguments
*
* - `pairing_url` - the URL scanned from a QR code on another device.
* - `scopes` - list of OAuth scopes to request.
* - The requested scopes will determine what account-related data
* the application is able to access.
* - `entrypoint` - metrics identifier for UX entrypoint.
* - This parameter is used for metrics purposes, to identify the
* UX entrypoint from which the user triggered the signin request.
* For example, the application toolbar, on the onboarding flow.
* - `metrics` - optionally, additional metrics tracking parameters.
* - These will be included as query parameters in the resulting URL.
*/
open func beginPairingFlow(pairingUrl: String, scopes: [String], entrypoint: String)throws -> String {
return try FfiConverterString.lift(try rustCallWithError(FfiConverterTypeFxaError_lift) {
uniffi_fxa_client_fn_method_firefoxaccount_begin_pairing_flow(self.uniffiClonePointer(),
FfiConverterString.lower(pairingUrl),
FfiConverterSequenceString.lower(scopes),
FfiConverterString.lower(entrypoint),$0
)
})
}
/**
* Check authorization status for this application.
*
* **💾 This method alters the persisted account state.**
*
* Applications may call this method to check with the FxA server about the status
* of their authentication tokens. It returns an [`AuthorizationInfo`] struct
* with details about whether the tokens are still active.
*/
open func checkAuthorizationStatus()throws -> AuthorizationInfo {
return try FfiConverterTypeAuthorizationInfo_lift(try rustCallWithError(FfiConverterTypeFxaError_lift) {
uniffi_fxa_client_fn_method_firefoxaccount_check_authorization_status(self.uniffiClonePointer(),$0
)
})
}
/**
* Clear the access token cache in response to an auth failure.
*
* **💾 This method alters the persisted account state.**
*
* Applications that receive an authentication error when trying to use an access token,
* should call this method before creating a new token and retrying the failed operation.
* It ensures that the expired token is removed and a fresh one generated.
*/
open func clearAccessTokenCache() {try! rustCall() {
uniffi_fxa_client_fn_method_firefoxaccount_clear_access_token_cache(self.uniffiClonePointer(),$0
)
}
}
/**
* Clear any custom display name used for this application instance.
*
* **💾 This method alters the persisted account state.**
*
* This method clears the name of the current application's device record, causing other
* applications or the user's account management pages to have to fill in some sort of
* default name when displaying this device.
*
* # Notes
*
* - Device registration is only available to applications that have been
* granted the `https:///identity.mozilla.com/apps/oldsync` scope.
*/
open func clearDeviceName()throws {try rustCallWithError(FfiConverterTypeFxaError_lift) {
uniffi_fxa_client_fn_method_firefoxaccount_clear_device_name(self.uniffiClonePointer(),$0
)
}
}
/**
* Use device commands to close one or more tabs on another device.
*
* **💾 This method alters the persisted account state.**
*
* If a device on the account has registered the [`CloseTabs`](DeviceCapability::CloseTabs)
* capability, this method can be used to close its tabs.
*/
open func closeTabs(targetDeviceId: String, urls: [String])throws -> CloseTabsResult {
return try FfiConverterTypeCloseTabsResult_lift(try rustCallWithError(FfiConverterTypeFxaError_lift) {
uniffi_fxa_client_fn_method_firefoxaccount_close_tabs(self.uniffiClonePointer(),
FfiConverterString.lower(targetDeviceId),
FfiConverterSequenceString.lower(urls),$0
)
})
}
/**
* Complete an OAuth flow.
*
* **💾 This method alters the persisted account state.**
*
* At the conclusion of an OAuth flow, the user will be redirect to the
* application's registered `redirect_uri`. It should extract the `code`
* and `state` parameters from the resulting URL and pass them to this
* method in order to complete the sign-in.
*
* # Arguments
*
* - `code` - the OAuth authorization code obtained from the redirect URI.
* - `state` - the OAuth state parameter obtained from the redirect URI.
*/
open func completeOauthFlow(code: String, state: String)throws {try rustCallWithError(FfiConverterTypeFxaError_lift) {
uniffi_fxa_client_fn_method_firefoxaccount_complete_oauth_flow(self.uniffiClonePointer(),
FfiConverterString.lower(code),
FfiConverterString.lower(state),$0
)
}
}
/**
* Disconnect from the user's account.
*
* **💾 This method alters the persisted account state.**
*
* This method destroys any tokens held by the client, effectively disconnecting
* from the user's account. Applications should call this when the user opts to
* sign out.
*
* The persisted account state after calling this method will contain only the
* user's last-seen profile information, if any. This may be useful in helping
* the user to reconnnect to their account. If reconnecting to the same account
* is not desired then the application should discard the persisted account state.
*/
open func disconnect() {try! rustCall() {
uniffi_fxa_client_fn_method_firefoxaccount_disconnect(self.uniffiClonePointer(),$0
)
}
}
/**
* Ensure that the device record has a specific set of capabilities.
*
* **💾 This method alters the persisted account state.**
*
* This method checks that the currently-registered device record is advertising the
* given set of capabilities in the FxA "device commands" ecosystem. If not, then it
* updates the device record to do so.
*
* Applications should call this method on each startup as a way to ensure that their
* expected set of capabilities is being accurately reflected on the FxA server, and
* to handle the rollout of new capabilities over time.
*
* # Arguments
*
* - `supported_capabilities` - the set of [capabilities](DeviceCapability) to register
* for this device in the "device commands" ecosystem.
*
* # Notes
*
* - Device registration is only available to applications that have been
* granted the `https:///identity.mozilla.com/apps/oldsync` scope.
*/
open func ensureCapabilities(supportedCapabilities: [DeviceCapability])throws -> LocalDevice {
return try FfiConverterTypeLocalDevice_lift(try rustCallWithError(FfiConverterTypeFxaError_lift) {
uniffi_fxa_client_fn_method_firefoxaccount_ensure_capabilities(self.uniffiClonePointer(),
FfiConverterSequenceTypeDeviceCapability.lower(supportedCapabilities),$0
)
})
}
/**
* Collect and return telemetry about incoming and outgoing device commands.
*
* Applications that have registered one or more [`DeviceCapability`]s
* should also arrange to submit "sync ping" telemetry. Calling this method will
* return a JSON string of telemetry data that can be incorporated into that ping.
*
* Sorry, this is not particularly carefully documented because it is intended
* as a stop-gap until we get native Glean support. If you know how to submit
* a sync ping, you'll know what to do with the contents of the JSON string.
*/
open func gatherTelemetry()throws -> String {
return try FfiConverterString.lift(try rustCallWithError(FfiConverterTypeFxaError_lift) {
uniffi_fxa_client_fn_method_firefoxaccount_gather_telemetry(self.uniffiClonePointer(),$0
)
})
}
/**
* Get a short-lived OAuth access token for the user's account.
*
* **💾 This method alters the persisted account state.**
*
* Applications that need to access resources on behalf of the user must obtain an
* `access_token` in order to do so. For example, an access token is required when
* fetching the user's profile data, or when accessing their data stored in Firefox Sync.
*
* This method will obtain and return an access token bearing the requested scopes, either
* from a local cache of previously-issued tokens, or by creating a new one from the server.
*
* # Arguments
*
* - `scope` - the OAuth scope to be granted by the token.
* - This must be one of the scopes requested during the signin flow.
* - Only a single scope is supported; for multiple scopes request multiple tokens.
* - `ttl` - optionally, the time for which the token should be valid, in seconds.
*
* # Notes
*
* - If the application receives an authorization error when trying to use the resulting
* token, it should call [`clear_access_token_cache`](FirefoxAccount::clear_access_token_cache)
* before requesting a fresh token.
*/
open func getAccessToken(scope: String, ttl: Int64? = nil)throws -> AccessTokenInfo {
return try FfiConverterTypeAccessTokenInfo_lift(try rustCallWithError(FfiConverterTypeFxaError_lift) {
uniffi_fxa_client_fn_method_firefoxaccount_get_access_token(self.uniffiClonePointer(),
FfiConverterString.lower(scope),
FfiConverterOptionInt64.lower(ttl),$0
)
})
}
/**
* Get the list of all client applications attached to the user's account.
*
* This method returns a list of [`AttachedClient`] structs representing all the applications
* connected to the user's account. This includes applications that are registered as a device
* as well as server-side services that the user has connected.
*
* This information is really only useful for targeted messaging or marketing purposes,
* e.g. if the application wants to advertize a related product, but first wants to check
* whether the user is already using that product.
*
* # Notes
*
* - Attached client metadata is only visible to applications that have been
* granted the `https:///identity.mozilla.com/apps/oldsync` scope.
*/
open func getAttachedClients()throws -> [AttachedClient] {
return try FfiConverterSequenceTypeAttachedClient.lift(try rustCallWithError(FfiConverterTypeFxaError_lift) {
uniffi_fxa_client_fn_method_firefoxaccount_get_attached_clients(self.uniffiClonePointer(),$0
)
})
}
/**
* Get the high-level authentication state of the client
*
* Deprecated: Use get_state() instead
*/
open func getAuthState() -> FxaRustAuthState {
return try! FfiConverterTypeFxaRustAuthState_lift(try! rustCall() {
uniffi_fxa_client_fn_method_firefoxaccount_get_auth_state(self.uniffiClonePointer(),$0
)
})
}
/**
* Get a URL which shows a "successfully connceted!" message.
*
* **💾 This method alters the persisted account state.**
*
* Applications can use this method after a successful signin, to redirect the
* user to a success message displayed in web content rather than having to
* implement their own native success UI.
*/
open func getConnectionSuccessUrl()throws -> String {
return try FfiConverterString.lift(try rustCallWithError(FfiConverterTypeFxaError_lift) {
uniffi_fxa_client_fn_method_firefoxaccount_get_connection_success_url(self.uniffiClonePointer(),$0
)
})
}
/**
* Get the device id registered for this application.
*
* # Notes
*
* - If the application has not registered a device record, this method will
* throw an [`Other`](FxaError::Other) error.
* - (Yeah...sorry. This should be changed to do something better.)
* - Device metadata is only visible to applications that have been
* granted the `https:///identity.mozilla.com/apps/oldsync` scope.
*/
open func getCurrentDeviceId()throws -> String {
return try FfiConverterString.lift(try rustCallWithError(FfiConverterTypeFxaError_lift) {
uniffi_fxa_client_fn_method_firefoxaccount_get_current_device_id(self.uniffiClonePointer(),$0
)
})
}
/**
* Get the list of devices registered on the user's account.
*
* **💾 This method alters the persisted account state.**
*
* This method returns a list of [`Device`] structs representing all the devices
* currently attached to the user's account (including the current device).
* The application might use this information to e.g. display a list of appropriate
* send-tab targets.
*
* # Arguments
*
* - `ignore_cache` - if true, always hit the server for fresh profile information.
*
* # Notes
*
* - Device metadata is only visible to applications that have been
* granted the `https:///identity.mozilla.com/apps/oldsync` scope.
*/
open func getDevices(ignoreCache: Bool)throws -> [Device] {
return try FfiConverterSequenceTypeDevice.lift(try rustCallWithError(FfiConverterTypeFxaError_lift) {
uniffi_fxa_client_fn_method_firefoxaccount_get_devices(self.uniffiClonePointer(),
FfiConverterBool.lower(ignoreCache),$0
)
})
}
/**
* Get a URL at which the user can manage their account and profile data.
*
* **💾 This method alters the persisted account state.**
*
* Applications should link the user out to this URL from an appropriate place
* in their signed-in settings UI.
*
* # Arguments
*
* - `entrypoint` - metrics identifier for UX entrypoint.
* - This parameter is used for metrics purposes, to identify the
* UX entrypoint from which the user followed the link.
*/
open func getManageAccountUrl(entrypoint: String)throws -> String {
return try FfiConverterString.lift(try rustCallWithError(FfiConverterTypeFxaError_lift) {
uniffi_fxa_client_fn_method_firefoxaccount_get_manage_account_url(self.uniffiClonePointer(),
FfiConverterString.lower(entrypoint),$0
)
})
}
/**
* Get a URL at which the user can manage the devices connected to their account.
*
* **💾 This method alters the persisted account state.**
*
* Applications should link the user out to this URL from an appropriate place
* in their signed-in settings UI. For example, "Manage your devices..." may be
* a useful link to place somewhere near the device list in the send-tab UI.
*
* # Arguments
*
* - `entrypoint` - metrics identifier for UX entrypoint.
* - This parameter is used for metrics purposes, to identify the
* UX entrypoint from which the user followed the link.
*/
open func getManageDevicesUrl(entrypoint: String)throws -> String {
return try FfiConverterString.lift(try rustCallWithError(FfiConverterTypeFxaError_lift) {
uniffi_fxa_client_fn_method_firefoxaccount_get_manage_devices_url(self.uniffiClonePointer(),
FfiConverterString.lower(entrypoint),$0
)
})
}
/**
* Get the URL at which to begin a device-pairing signin flow.
*
* If the user wants to sign in using device pairing, call this method and then
* direct them to visit the resulting URL on an already-signed-in device. Doing
* so will trigger the other device to show a QR code to be scanned, and the result
* from said QR code can be passed to [`begin_pairing_flow`](FirefoxAccount::begin_pairing_flow).
*/
open func getPairingAuthorityUrl()throws -> String {
return try FfiConverterString.lift(try rustCallWithError(FfiConverterTypeFxaError_lift) {
uniffi_fxa_client_fn_method_firefoxaccount_get_pairing_authority_url(self.uniffiClonePointer(),$0
)
})
}
/**
* Get profile information for the signed-in user, if any.
*
* **💾 This method alters the persisted account state.**
*
* This method fetches a [`Profile`] struct with information about the currently-signed-in
* user, either by using locally-cached profile information or by fetching fresh data from
* the server.
*
* # Arguments
*
* - `ignore_cache` - if true, always hit the server for fresh profile information.
*
* # Notes
*
* - Profile information is only available to applications that have been
* granted the `profile` scope.
* - There is currently no API for fetching cached profile information without
* potentially hitting the server.
* - If there is no signed-in user, this method will throw an
* [`Authentication`](FxaError::Authentication) error.
*/
open func getProfile(ignoreCache: Bool)throws -> Profile {
return try FfiConverterTypeProfile_lift(try rustCallWithError(FfiConverterTypeFxaError_lift) {
uniffi_fxa_client_fn_method_firefoxaccount_get_profile(self.uniffiClonePointer(),
FfiConverterBool.lower(ignoreCache),$0
)
})
}
/**
* Get the session token for the user's account, if one is available.
*
* **💾 This method alters the persisted account state.**
*
* Applications that function as a web browser may need to hold on to a session token
* on behalf of Firefox Accounts web content. This method exists so that they can retrieve
* it an pass it back to said web content when required.
*
* # Notes
*
* - Please do not attempt to use the resulting token to directly make calls to the
* Firefox Accounts servers! All account management functionality should be performed
* in web content.
* - A session token is only available to applications that have requested the
* `https:///identity.mozilla.com/tokens/session` scope.
*/
open func getSessionToken()throws -> String {
return try FfiConverterString.lift(try rustCallWithError(FfiConverterTypeFxaError_lift) {
uniffi_fxa_client_fn_method_firefoxaccount_get_session_token(self.uniffiClonePointer(),$0
)
})
}
/**
* Get the current state
*/
open func getState() -> FxaState {
return try! FfiConverterTypeFxaState_lift(try! rustCall() {
uniffi_fxa_client_fn_method_firefoxaccount_get_state(self.uniffiClonePointer(),$0
)
})
}
/**
* Get the URL at which to access the user's sync data.
*
* **💾 This method alters the persisted account state.**
*/
open func getTokenServerEndpointUrl()throws -> String {
return try FfiConverterString.lift(try rustCallWithError(FfiConverterTypeFxaError_lift) {
uniffi_fxa_client_fn_method_firefoxaccount_get_token_server_endpoint_url(self.uniffiClonePointer(),$0
)
})
}
/**
* Process and respond to a server-delivered account update message
*
* **💾 This method alters the persisted account state.**
*
* Applications should call this method whenever they receive a push notification from the Firefox Accounts server.
* Such messages typically indicate a noteworthy change of state on the user's account, such as an update to their profile information
* or the disconnection of a client. The [`FirefoxAccount`] struct will update its internal state
* accordingly and return an individual [`AccountEvent`] struct describing the event, which the application
* may use for further processing.
*
* It's important to note if the event is [`AccountEvent::CommandReceived`], the caller should call
* [`FirefoxAccount::poll_device_commands`]
*/
open func handlePushMessage(payload: String)throws -> AccountEvent {
return try FfiConverterTypeAccountEvent_lift(try rustCallWithError(FfiConverterTypeFxaError_lift) {
uniffi_fxa_client_fn_method_firefoxaccount_handle_push_message(self.uniffiClonePointer(),
FfiConverterString.lower(payload),$0
)
})
}
/**
* Update the stored session token for the user's account.
*
* **💾 This method alters the persisted account state.**
*
* Applications that function as a web browser may need to hold on to a session token
* on behalf of Firefox Accounts web content. This method exists so that said web content
* signals that it has generated a new session token, the stored value can be updated
* to match.
*
* # Arguments
*
* - `session_token` - the new session token value provided from web content.
*/
open func handleSessionTokenChange(sessionToken: String)throws {try rustCallWithError(FfiConverterTypeFxaError_lift) {
uniffi_fxa_client_fn_method_firefoxaccount_handle_session_token_change(self.uniffiClonePointer(),
FfiConverterString.lower(sessionToken),$0
)
}
}
/**
* Create a new device record for this application.
*
* **💾 This method alters the persisted account state.**
*
* This method registered a device record for the application, providing basic metadata for
* the device along with a list of supported [Device Capabilities](DeviceCapability) for
* participating in the "device commands" ecosystem.
*
* Applications should call this method soon after a successful sign-in, to ensure
* they they appear correctly in the user's account-management pages and when discovered
* by other devices connected to the account.
*
* # Arguments
*
* - `name` - human-readable display name to use for this application
* - `device_type` - the [type](DeviceType) of device the application is installed on
* - `supported_capabilities` - the set of [capabilities](DeviceCapability) to register
* for this device in the "device commands" ecosystem.
*
* # Notes
*
* - Device registration is only available to applications that have been
* granted the `https:///identity.mozilla.com/apps/oldsync` scope.
*/
open func initializeDevice(name: String, deviceType: DeviceType, supportedCapabilities: [DeviceCapability])throws -> LocalDevice {
return try FfiConverterTypeLocalDevice_lift(try rustCallWithError(FfiConverterTypeFxaError_lift) {
uniffi_fxa_client_fn_method_firefoxaccount_initialize_device(self.uniffiClonePointer(),
FfiConverterString.lower(name),
FfiConverterTypeDeviceType_lower(deviceType),
FfiConverterSequenceTypeDeviceCapability.lower(supportedCapabilities),$0
)
})
}
/**
* Update the state based on authentication issues.
*
* **💾 This method alters the persisted account state.**
*
* Call this if you know there's an authentication / authorization issue that requires the
* user to re-authenticated. It transitions the user to the [FxaRustAuthState.AuthIssues] state.
*/
open func onAuthIssues() {try! rustCall() {
uniffi_fxa_client_fn_method_firefoxaccount_on_auth_issues(self.uniffiClonePointer(),$0
)
}
}
/**
* Poll the server for any pending device commands.
*
* **💾 This method alters the persisted account state.**
*
* Applications that have registered one or more [`DeviceCapability`]s with the server can use
* this method to check whether other devices on the account have sent them any commands.
* It will return a list of [`IncomingDeviceCommand`] structs for the application to process.
*
* # Notes
*
* - Device commands are typically delivered via push message and the [`CommandReceived`](
* AccountEvent::CommandReceived) event. Polling should only be used as a backup delivery
* mechanism, f the application has reason to believe that push messages may have been missed.
* - Device commands functionality is only available to applications that have been
* granted the `https:///identity.mozilla.com/apps/oldsync` scope.
*/
open func pollDeviceCommands()throws -> [IncomingDeviceCommand] {
return try FfiConverterSequenceTypeIncomingDeviceCommand.lift(try rustCallWithError(FfiConverterTypeFxaError_lift) {
uniffi_fxa_client_fn_method_firefoxaccount_poll_device_commands(self.uniffiClonePointer(),$0
)
})
}
/**
* Process an event (login, logout, etc).
*
* On success, update the current state and return it.
* On error, the current state will remain the same.
*/
open func processEvent(event: FxaEvent)throws -> FxaState {
return try FfiConverterTypeFxaState_lift(try rustCallWithError(FfiConverterTypeFxaError_lift) {
uniffi_fxa_client_fn_method_firefoxaccount_process_event(self.uniffiClonePointer(),
FfiConverterTypeFxaEvent_lower(event),$0
)
})
}
/**
* Use device commands to send a single tab to another device.
*
* **💾 This method alters the persisted account state.**
*
* If a device on the account has registered the [`SendTab`](DeviceCapability::SendTab)
* capability, this method can be used to send it a tab.
*
* # Notes
*
* - If the given device id does not existing or is not capable of receiving tabs,
* this method will throw an [`Other`](FxaError::Other) error.
* - (Yeah...sorry. This should be changed to do something better.)
* - It is not currently possible to send a full [`SendTabPayload`] to another device,
* but that's purely an API limitation that should go away in future.
* - Device commands functionality is only available to applications that have been
* granted the `https:///identity.mozilla.com/apps/oldsync` scope.
*/
open func sendSingleTab(targetDeviceId: String, title: String, url: String)throws {try rustCallWithError(FfiConverterTypeFxaError_lift) {
uniffi_fxa_client_fn_method_firefoxaccount_send_single_tab(self.uniffiClonePointer(),
FfiConverterString.lower(targetDeviceId),
FfiConverterString.lower(title),
FfiConverterString.lower(url),$0
)
}
}
/**
* Update the display name used for this application instance.
*
* **💾 This method alters the persisted account state.**
*
* This method modifies the name of the current application's device record, as seen by
* other applications and in the user's account management pages.
*
* # Arguments
*
* - `display_name` - the new name for the current device.
*
* # Notes
*
* - Device registration is only available to applications that have been
* granted the `https:///identity.mozilla.com/apps/oldsync` scope.
*/
open func setDeviceName(displayName: String)throws -> LocalDevice {
return try FfiConverterTypeLocalDevice_lift(try rustCallWithError(FfiConverterTypeFxaError_lift) {
uniffi_fxa_client_fn_method_firefoxaccount_set_device_name(self.uniffiClonePointer(),
FfiConverterString.lower(displayName),$0
)
})
}
/**
* Set or update a push subscription endpoint for this device.
*
* **💾 This method alters the persisted account state.**
*
* This method registers the given webpush subscription with the FxA server, requesting
* that is send notifications in the event of any significant changes to the user's
* account. When the application receives a push message at the registered subscription
* endpoint, it should decrypt the payload and pass it to the [`handle_push_message`](
* FirefoxAccount::handle_push_message) method for processing.
*
* # Arguments
*
* - `subscription` - the [`DevicePushSubscription`] details to register with the server.
*
* # Notes
*
* - Device registration is only available to applications that have been
* granted the `https:///identity.mozilla.com/apps/oldsync` scope.
*/
open func setPushSubscription(subscription: DevicePushSubscription)throws -> LocalDevice {
return try FfiConverterTypeLocalDevice_lift(try rustCallWithError(FfiConverterTypeFxaError_lift) {
uniffi_fxa_client_fn_method_firefoxaccount_set_push_subscription(self.uniffiClonePointer(),
FfiConverterTypeDevicePushSubscription_lower(subscription),$0
)
})
}
/**
* Sets the users information based on the web content's login information
* This is intended to only be used by user agents (eg: Firefox) to set the users
* session token and tie it to the refresh token that will be issued at the end of the
* oauth flow.
*/
open func setUserData(userData: UserData) {try! rustCall() {
uniffi_fxa_client_fn_method_firefoxaccount_set_user_data(self.uniffiClonePointer(),
FfiConverterTypeUserData_lower(userData),$0
)
}
}
/**
* Used by the application to test auth token issues
*/
open func simulateNetworkError() {try! rustCall() {
uniffi_fxa_client_fn_method_firefoxaccount_simulate_network_error(self.uniffiClonePointer(),$0
)
}
}
/**
* Used by the application to test auth token issues
*/
open func simulatePermanentAuthTokenIssue() {try! rustCall() {
uniffi_fxa_client_fn_method_firefoxaccount_simulate_permanent_auth_token_issue(self.uniffiClonePointer(),$0
)
}
}
/**
* Used by the application to test auth token issues
*/
open func simulateTemporaryAuthTokenIssue() {try! rustCall() {
uniffi_fxa_client_fn_method_firefoxaccount_simulate_temporary_auth_token_issue(self.uniffiClonePointer(),$0
)
}
}
/**
* Save current state to a JSON string.
*
* This method serializes the current account state into a JSON string, which
* the application can use to persist the user's signed-in state across restarts.
* The application should call this method and update its persisted state after
* any potentially-state-changing operation.
*
* **⚠️ Warning:** the serialized state may contain encryption keys and access
* tokens that let anyone holding them access the user's data in Firefox Sync
* and/or other FxA services. Applications should take care to store the resulting
* data in a secure fashion, as appropriate for their target platform.
*/
open func toJson()throws -> String {
return try FfiConverterString.lift(try rustCallWithError(FfiConverterTypeFxaError_lift) {
uniffi_fxa_client_fn_method_firefoxaccount_to_json(self.uniffiClonePointer(),$0
)
})
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public struct FfiConverterTypeFirefoxAccount: FfiConverter {
typealias FfiType = UnsafeMutableRawPointer
typealias SwiftType = FirefoxAccount
public static func lift(_ pointer: UnsafeMutableRawPointer) throws -> FirefoxAccount {
return FirefoxAccount(unsafeFromRawPointer: pointer)
}
public static func lower(_ value: FirefoxAccount) -> UnsafeMutableRawPointer {
return value.uniffiClonePointer()
}
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> FirefoxAccount {
let v: UInt64 = try readInt(&buf)
// The Rust code won't compile if a pointer won't fit in a UInt64.
// We have to go via `UInt` because that's the thing that's the size of a pointer.
let ptr = UnsafeMutableRawPointer(bitPattern: UInt(truncatingIfNeeded: v))
if (ptr == nil) {
throw UniffiInternalError.unexpectedNullPointer
}
return try lift(ptr!)
}
public static func write(_ value: FirefoxAccount, into buf: inout [UInt8]) {
// This fiddling is because `Int` is the thing that's the same size as a pointer.
// The Rust code won't compile if a pointer won't fit in a `UInt64`.
writeInt(&buf, UInt64(bitPattern: Int64(Int(bitPattern: lower(value)))))
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeFirefoxAccount_lift(_ pointer: UnsafeMutableRawPointer) throws -> FirefoxAccount {
return try FfiConverterTypeFirefoxAccount.lift(pointer)
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeFirefoxAccount_lower(_ value: FirefoxAccount) -> UnsafeMutableRawPointer {
return FfiConverterTypeFirefoxAccount.lower(value)
}
/**
* Machinery for dry-run testing of FxaAuthStateMachine
*
* Remove this once we've migrated the firefox-android and firefox-ios code to using FxaAuthStateMachine
* https:///bugzilla.mozilla.org/show_bug.cgi?id=1867793
*/
public protocol FxaStateMachineCheckerProtocol: AnyObject {
func checkInternalState(state: FxaStateCheckerState)
func checkPublicState(state: FxaState)
func handleInternalEvent(event: FxaStateCheckerEvent)
func handlePublicEvent(event: FxaEvent)
}
/**
* Machinery for dry-run testing of FxaAuthStateMachine
*
* Remove this once we've migrated the firefox-android and firefox-ios code to using FxaAuthStateMachine
* https:///bugzilla.mozilla.org/show_bug.cgi?id=1867793
*/
open class FxaStateMachineChecker: FxaStateMachineCheckerProtocol, @unchecked Sendable {
fileprivate let pointer: UnsafeMutableRawPointer!
/// Used to instantiate a [FFIObject] without an actual pointer, for fakes in tests, mostly.
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public struct NoPointer {
public init() {}
}
// TODO: We'd like this to be `private` but for Swifty reasons,
// we can't implement `FfiConverter` without making this `required` and we can't
// make it `required` without making it `public`.
required public init(unsafeFromRawPointer pointer: UnsafeMutableRawPointer) {
self.pointer = pointer
}
// This constructor can be used to instantiate a fake object.
// - Parameter noPointer: Placeholder value so we can have a constructor separate from the default empty one that may be implemented for classes extending [FFIObject].
//
// - Warning:
// Any object instantiated with this constructor cannot be passed to an actual Rust-backed object. Since there isn't a backing [Pointer] the FFI lower functions will crash.
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public init(noPointer: NoPointer) {
self.pointer = nil
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func uniffiClonePointer() -> UnsafeMutableRawPointer {
return try! rustCall { uniffi_fxa_client_fn_clone_fxastatemachinechecker(self.pointer, $0) }
}
public convenience init() {
let pointer =
try! rustCall() {
uniffi_fxa_client_fn_constructor_fxastatemachinechecker_new($0
)
}
self.init(unsafeFromRawPointer: pointer)
}
deinit {
guard let pointer = pointer else {
return
}
try! rustCall { uniffi_fxa_client_fn_free_fxastatemachinechecker(pointer, $0) }
}
open func checkInternalState(state: FxaStateCheckerState) {try! rustCall() {
uniffi_fxa_client_fn_method_fxastatemachinechecker_check_internal_state(self.uniffiClonePointer(),
FfiConverterTypeFxaStateCheckerState_lower(state),$0
)
}
}
open func checkPublicState(state: FxaState) {try! rustCall() {
uniffi_fxa_client_fn_method_fxastatemachinechecker_check_public_state(self.uniffiClonePointer(),
FfiConverterTypeFxaState_lower(state),$0
)
}
}
open func handleInternalEvent(event: FxaStateCheckerEvent) {try! rustCall() {
uniffi_fxa_client_fn_method_fxastatemachinechecker_handle_internal_event(self.uniffiClonePointer(),
FfiConverterTypeFxaStateCheckerEvent_lower(event),$0
)
}
}
open func handlePublicEvent(event: FxaEvent) {try! rustCall() {
uniffi_fxa_client_fn_method_fxastatemachinechecker_handle_public_event(self.uniffiClonePointer(),
FfiConverterTypeFxaEvent_lower(event),$0
)
}
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public struct FfiConverterTypeFxaStateMachineChecker: FfiConverter {
typealias FfiType = UnsafeMutableRawPointer
typealias SwiftType = FxaStateMachineChecker
public static func lift(_ pointer: UnsafeMutableRawPointer) throws -> FxaStateMachineChecker {
return FxaStateMachineChecker(unsafeFromRawPointer: pointer)
}
public static func lower(_ value: FxaStateMachineChecker) -> UnsafeMutableRawPointer {
return value.uniffiClonePointer()
}
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> FxaStateMachineChecker {
let v: UInt64 = try readInt(&buf)
// The Rust code won't compile if a pointer won't fit in a UInt64.
// We have to go via `UInt` because that's the thing that's the size of a pointer.
let ptr = UnsafeMutableRawPointer(bitPattern: UInt(truncatingIfNeeded: v))
if (ptr == nil) {
throw UniffiInternalError.unexpectedNullPointer
}
return try lift(ptr!)
}
public static func write(_ value: FxaStateMachineChecker, into buf: inout [UInt8]) {
// This fiddling is because `Int` is the thing that's the same size as a pointer.
// The Rust code won't compile if a pointer won't fit in a `UInt64`.
writeInt(&buf, UInt64(bitPattern: Int64(Int(bitPattern: lower(value)))))
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeFxaStateMachineChecker_lift(_ pointer: UnsafeMutableRawPointer) throws -> FxaStateMachineChecker {
return try FfiConverterTypeFxaStateMachineChecker.lift(pointer)
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeFxaStateMachineChecker_lower(_ value: FxaStateMachineChecker) -> UnsafeMutableRawPointer {
return FfiConverterTypeFxaStateMachineChecker.lower(value)
}
/**
* An OAuth access token, with its associated keys and metadata.
*
* This struct represents an FxA OAuth access token, which can be used to access a resource
* or service on behalf of the user. For example, accessing the user's data in Firefox Sync
* an access token for the scope `https:///identity.mozilla.com/apps/sync` along with the
* associated encryption key.
*/
public struct AccessTokenInfo {
/**
* The scope of access granted by token.
*/
public var scope: String
/**
* The access token itself.
*
* This is the value that should be included in the `Authorization` header when
* accessing an OAuth protected resource on behalf of the user.
*/
public var token: String
/**
* The client-side encryption key associated with this scope.
*
* **⚠️ Warning:** the value of this field should never be revealed outside of the
* application. For example, it should never to sent to a server or logged in a log file.
*/
public var key: ScopedKey?
/**
* The expiry time of the token, in seconds.
*
* This is the timestamp at which the token is set to expire, in seconds since
* unix epoch. Note that it is a signed integer, for compatibility with languages
* that do not have an unsigned integer type.
*
* This timestamp is for guidance only. Access tokens are not guaranteed to remain
* value for any particular lengthof time, and consumers should be prepared to handle
* auth failures even if the token has not yet expired.
*/
public var expiresAt: Int64
// Default memberwise initializers are never public by default, so we
// declare one manually.
public init(
/**
* The scope of access granted by token.
*/scope: String,
/**
* The access token itself.
*
* This is the value that should be included in the `Authorization` header when
* accessing an OAuth protected resource on behalf of the user.
*/token: String,
/**
* The client-side encryption key associated with this scope.
*
* **⚠️ Warning:** the value of this field should never be revealed outside of the
* application. For example, it should never to sent to a server or logged in a log file.
*/key: ScopedKey?,
/**
* The expiry time of the token, in seconds.
*
* This is the timestamp at which the token is set to expire, in seconds since
* unix epoch. Note that it is a signed integer, for compatibility with languages
* that do not have an unsigned integer type.
*
* This timestamp is for guidance only. Access tokens are not guaranteed to remain
* value for any particular lengthof time, and consumers should be prepared to handle
* auth failures even if the token has not yet expired.
*/expiresAt: Int64) {
self.scope = scope
self.token = token
self.key = key
self.expiresAt = expiresAt
}
}
#if compiler(>=6)
extension AccessTokenInfo: Sendable {}
#endif
extension AccessTokenInfo: Equatable, Hashable {
public static func ==(lhs: AccessTokenInfo, rhs: AccessTokenInfo) -> Bool {
if lhs.scope != rhs.scope {
return false
}
if lhs.token != rhs.token {
return false
}
if lhs.key != rhs.key {
return false
}
if lhs.expiresAt != rhs.expiresAt {
return false
}
return true
}
public func hash(into hasher: inout Hasher) {
hasher.combine(scope)
hasher.combine(token)
hasher.combine(key)
hasher.combine(expiresAt)
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public struct FfiConverterTypeAccessTokenInfo: FfiConverterRustBuffer {
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> AccessTokenInfo {
return
try AccessTokenInfo(
scope: FfiConverterString.read(from: &buf),
token: FfiConverterString.read(from: &buf),
key: FfiConverterOptionTypeScopedKey.read(from: &buf),
expiresAt: FfiConverterInt64.read(from: &buf)
)
}
public static func write(_ value: AccessTokenInfo, into buf: inout [UInt8]) {
FfiConverterString.write(value.scope, into: &buf)
FfiConverterString.write(value.token, into: &buf)
FfiConverterOptionTypeScopedKey.write(value.key, into: &buf)
FfiConverterInt64.write(value.expiresAt, into: &buf)
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeAccessTokenInfo_lift(_ buf: RustBuffer) throws -> AccessTokenInfo {
return try FfiConverterTypeAccessTokenInfo.lift(buf)
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeAccessTokenInfo_lower(_ value: AccessTokenInfo) -> RustBuffer {
return FfiConverterTypeAccessTokenInfo.lower(value)
}
/**
* A client connected to the user's account.
*
* This struct provides metadata about a client connected to the user's account.
* Unlike the [`Device`] struct, "clients" encompasses both client-side and server-side
* applications - basically anything where the user is able to sign in with their
* Firefox Account.
*
*
* This data would typically be used for targeted messaging purposes, catering the
* contents of the message to what other applications the user has on their account.
*/
public struct AttachedClient {
public var clientId: String?
public var deviceId: String?
public var deviceType: DeviceType
public var isCurrentSession: Bool
public var name: String?
public var createdTime: Int64?
public var lastAccessTime: Int64?
public var scope: [String]?
// Default memberwise initializers are never public by default, so we
// declare one manually.
public init(clientId: String?, deviceId: String?, deviceType: DeviceType, isCurrentSession: Bool, name: String?, createdTime: Int64?, lastAccessTime: Int64?, scope: [String]?) {
self.clientId = clientId
self.deviceId = deviceId
self.deviceType = deviceType
self.isCurrentSession = isCurrentSession
self.name = name
self.createdTime = createdTime
self.lastAccessTime = lastAccessTime
self.scope = scope
}
}
#if compiler(>=6)
extension AttachedClient: Sendable {}
#endif
extension AttachedClient: Equatable, Hashable {
public static func ==(lhs: AttachedClient, rhs: AttachedClient) -> Bool {
if lhs.clientId != rhs.clientId {
return false
}
if lhs.deviceId != rhs.deviceId {
return false
}
if lhs.deviceType != rhs.deviceType {
return false
}
if lhs.isCurrentSession != rhs.isCurrentSession {
return false
}
if lhs.name != rhs.name {
return false
}
if lhs.createdTime != rhs.createdTime {
return false
}
if lhs.lastAccessTime != rhs.lastAccessTime {
return false
}
if lhs.scope != rhs.scope {
return false
}
return true
}
public func hash(into hasher: inout Hasher) {
hasher.combine(clientId)
hasher.combine(deviceId)
hasher.combine(deviceType)
hasher.combine(isCurrentSession)
hasher.combine(name)
hasher.combine(createdTime)
hasher.combine(lastAccessTime)
hasher.combine(scope)
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public struct FfiConverterTypeAttachedClient: FfiConverterRustBuffer {
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> AttachedClient {
return
try AttachedClient(
clientId: FfiConverterOptionString.read(from: &buf),
deviceId: FfiConverterOptionString.read(from: &buf),
deviceType: FfiConverterTypeDeviceType.read(from: &buf),
isCurrentSession: FfiConverterBool.read(from: &buf),
name: FfiConverterOptionString.read(from: &buf),
createdTime: FfiConverterOptionInt64.read(from: &buf),
lastAccessTime: FfiConverterOptionInt64.read(from: &buf),
scope: FfiConverterOptionSequenceString.read(from: &buf)
)
}
public static func write(_ value: AttachedClient, into buf: inout [UInt8]) {
FfiConverterOptionString.write(value.clientId, into: &buf)
FfiConverterOptionString.write(value.deviceId, into: &buf)
FfiConverterTypeDeviceType.write(value.deviceType, into: &buf)
FfiConverterBool.write(value.isCurrentSession, into: &buf)
FfiConverterOptionString.write(value.name, into: &buf)
FfiConverterOptionInt64.write(value.createdTime, into: &buf)
FfiConverterOptionInt64.write(value.lastAccessTime, into: &buf)
FfiConverterOptionSequenceString.write(value.scope, into: &buf)
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeAttachedClient_lift(_ buf: RustBuffer) throws -> AttachedClient {
return try FfiConverterTypeAttachedClient.lift(buf)
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeAttachedClient_lower(_ value: AttachedClient) -> RustBuffer {
return FfiConverterTypeAttachedClient.lower(value)
}
/**
* Information about the authorization state of the application.
*
* This struct represents metadata about whether the application is currently
* connected to the user's account.
*/
public struct AuthorizationInfo {
public var active: Bool
// Default memberwise initializers are never public by default, so we
// declare one manually.
public init(active: Bool) {
self.active = active
}
}
#if compiler(>=6)
extension AuthorizationInfo: Sendable {}
#endif
extension AuthorizationInfo: Equatable, Hashable {
public static func ==(lhs: AuthorizationInfo, rhs: AuthorizationInfo) -> Bool {
if lhs.active != rhs.active {
return false
}
return true
}
public func hash(into hasher: inout Hasher) {
hasher.combine(active)
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public struct FfiConverterTypeAuthorizationInfo: FfiConverterRustBuffer {
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> AuthorizationInfo {
return
try AuthorizationInfo(
active: FfiConverterBool.read(from: &buf)
)
}
public static func write(_ value: AuthorizationInfo, into buf: inout [UInt8]) {
FfiConverterBool.write(value.active, into: &buf)
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeAuthorizationInfo_lift(_ buf: RustBuffer) throws -> AuthorizationInfo {
return try FfiConverterTypeAuthorizationInfo.lift(buf)
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeAuthorizationInfo_lower(_ value: AuthorizationInfo) -> RustBuffer {
return FfiConverterTypeAuthorizationInfo.lower(value)
}
/**
* Parameters provided in an incoming OAuth request.
*
* This struct represents parameters obtained from an incoming OAuth request - that is,
* the values that an OAuth client would append to the authorization URL when initiating
* an OAuth sign-in flow.
*/
public struct AuthorizationParameters {
public var clientId: String
public var scope: [String]
public var state: String
public var accessType: String
public var codeChallenge: String?
public var codeChallengeMethod: String?
public var keysJwk: String?
// Default memberwise initializers are never public by default, so we
// declare one manually.
public init(clientId: String, scope: [String], state: String, accessType: String, codeChallenge: String?, codeChallengeMethod: String?, keysJwk: String?) {
self.clientId = clientId
self.scope = scope
self.state = state
self.accessType = accessType
self.codeChallenge = codeChallenge
self.codeChallengeMethod = codeChallengeMethod
self.keysJwk = keysJwk
}
}
#if compiler(>=6)
extension AuthorizationParameters: Sendable {}
#endif
extension AuthorizationParameters: Equatable, Hashable {
public static func ==(lhs: AuthorizationParameters, rhs: AuthorizationParameters) -> Bool {
if lhs.clientId != rhs.clientId {
return false
}
if lhs.scope != rhs.scope {
return false
}
if lhs.state != rhs.state {
return false
}
if lhs.accessType != rhs.accessType {
return false
}
if lhs.codeChallenge != rhs.codeChallenge {
return false
}
if lhs.codeChallengeMethod != rhs.codeChallengeMethod {
return false
}
if lhs.keysJwk != rhs.keysJwk {
return false
}
return true
}
public func hash(into hasher: inout Hasher) {
hasher.combine(clientId)
hasher.combine(scope)
hasher.combine(state)
hasher.combine(accessType)
hasher.combine(codeChallenge)
hasher.combine(codeChallengeMethod)
hasher.combine(keysJwk)
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public struct FfiConverterTypeAuthorizationParameters: FfiConverterRustBuffer {
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> AuthorizationParameters {
return
try AuthorizationParameters(
clientId: FfiConverterString.read(from: &buf),
scope: FfiConverterSequenceString.read(from: &buf),
state: FfiConverterString.read(from: &buf),
accessType: FfiConverterString.read(from: &buf),
codeChallenge: FfiConverterOptionString.read(from: &buf),
codeChallengeMethod: FfiConverterOptionString.read(from: &buf),
keysJwk: FfiConverterOptionString.read(from: &buf)
)
}
public static func write(_ value: AuthorizationParameters, into buf: inout [UInt8]) {
FfiConverterString.write(value.clientId, into: &buf)
FfiConverterSequenceString.write(value.scope, into: &buf)
FfiConverterString.write(value.state, into: &buf)
FfiConverterString.write(value.accessType, into: &buf)
FfiConverterOptionString.write(value.codeChallenge, into: &buf)
FfiConverterOptionString.write(value.codeChallengeMethod, into: &buf)
FfiConverterOptionString.write(value.keysJwk, into: &buf)
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeAuthorizationParameters_lift(_ buf: RustBuffer) throws -> AuthorizationParameters {
return try FfiConverterTypeAuthorizationParameters.lift(buf)
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeAuthorizationParameters_lower(_ value: AuthorizationParameters) -> RustBuffer {
return FfiConverterTypeAuthorizationParameters.lower(value)
}
/**
* The payload sent when invoking a "close tabs" command.
*/
public struct CloseTabsPayload {
/**
* The URLs of the tabs to close.
*/
public var urls: [String]
// Default memberwise initializers are never public by default, so we
// declare one manually.
public init(
/**
* The URLs of the tabs to close.
*/urls: [String]) {
self.urls = urls
}
}
#if compiler(>=6)
extension CloseTabsPayload: Sendable {}
#endif
extension CloseTabsPayload: Equatable, Hashable {
public static func ==(lhs: CloseTabsPayload, rhs: CloseTabsPayload) -> Bool {
if lhs.urls != rhs.urls {
return false
}
return true
}
public func hash(into hasher: inout Hasher) {
hasher.combine(urls)
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public struct FfiConverterTypeCloseTabsPayload: FfiConverterRustBuffer {
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> CloseTabsPayload {
return
try CloseTabsPayload(
urls: FfiConverterSequenceString.read(from: &buf)
)
}
public static func write(_ value: CloseTabsPayload, into buf: inout [UInt8]) {
FfiConverterSequenceString.write(value.urls, into: &buf)
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeCloseTabsPayload_lift(_ buf: RustBuffer) throws -> CloseTabsPayload {
return try FfiConverterTypeCloseTabsPayload.lift(buf)
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeCloseTabsPayload_lower(_ value: CloseTabsPayload) -> RustBuffer {
return FfiConverterTypeCloseTabsPayload.lower(value)
}
/**
* A device connected to the user's account.
*
* This struct provides metadata about a device connected to the user's account.
* This data would typically be used to display e.g. the list of candidate devices
* in a "send tab" menu.
*/
public struct Device {
public var id: String
public var displayName: String
public var deviceType: DeviceType
public var capabilities: [DeviceCapability]
public var pushSubscription: DevicePushSubscription?
public var pushEndpointExpired: Bool
public var isCurrentDevice: Bool
public var lastAccessTime: Int64?
// Default memberwise initializers are never public by default, so we
// declare one manually.
public init(id: String, displayName: String, deviceType: DeviceType, capabilities: [DeviceCapability], pushSubscription: DevicePushSubscription?, pushEndpointExpired: Bool, isCurrentDevice: Bool, lastAccessTime: Int64?) {
self.id = id
self.displayName = displayName
self.deviceType = deviceType
self.capabilities = capabilities
self.pushSubscription = pushSubscription
self.pushEndpointExpired = pushEndpointExpired
self.isCurrentDevice = isCurrentDevice
self.lastAccessTime = lastAccessTime
}
}
#if compiler(>=6)
extension Device: Sendable {}
#endif
extension Device: Equatable, Hashable {
public static func ==(lhs: Device, rhs: Device) -> Bool {
if lhs.id != rhs.id {
return false
}
if lhs.displayName != rhs.displayName {
return false
}
if lhs.deviceType != rhs.deviceType {
return false
}
if lhs.capabilities != rhs.capabilities {
return false
}
if lhs.pushSubscription != rhs.pushSubscription {
return false
}
if lhs.pushEndpointExpired != rhs.pushEndpointExpired {
return false
}
if lhs.isCurrentDevice != rhs.isCurrentDevice {
return false
}
if lhs.lastAccessTime != rhs.lastAccessTime {
return false
}
return true
}
public func hash(into hasher: inout Hasher) {
hasher.combine(id)
hasher.combine(displayName)
hasher.combine(deviceType)
hasher.combine(capabilities)
hasher.combine(pushSubscription)
hasher.combine(pushEndpointExpired)
hasher.combine(isCurrentDevice)
hasher.combine(lastAccessTime)
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public struct FfiConverterTypeDevice: FfiConverterRustBuffer {
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> Device {
return
try Device(
id: FfiConverterString.read(from: &buf),
displayName: FfiConverterString.read(from: &buf),
deviceType: FfiConverterTypeDeviceType.read(from: &buf),
capabilities: FfiConverterSequenceTypeDeviceCapability.read(from: &buf),
pushSubscription: FfiConverterOptionTypeDevicePushSubscription.read(from: &buf),
pushEndpointExpired: FfiConverterBool.read(from: &buf),
isCurrentDevice: FfiConverterBool.read(from: &buf),
lastAccessTime: FfiConverterOptionInt64.read(from: &buf)
)
}
public static func write(_ value: Device, into buf: inout [UInt8]) {
FfiConverterString.write(value.id, into: &buf)
FfiConverterString.write(value.displayName, into: &buf)
FfiConverterTypeDeviceType.write(value.deviceType, into: &buf)
FfiConverterSequenceTypeDeviceCapability.write(value.capabilities, into: &buf)
FfiConverterOptionTypeDevicePushSubscription.write(value.pushSubscription, into: &buf)
FfiConverterBool.write(value.pushEndpointExpired, into: &buf)
FfiConverterBool.write(value.isCurrentDevice, into: &buf)
FfiConverterOptionInt64.write(value.lastAccessTime, into: &buf)
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeDevice_lift(_ buf: RustBuffer) throws -> Device {
return try FfiConverterTypeDevice.lift(buf)
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeDevice_lower(_ value: Device) -> RustBuffer {
return FfiConverterTypeDevice.lower(value)
}
/**
* Device configuration
*/
public struct DeviceConfig {
public var name: String
public var deviceType: DeviceType
public var capabilities: [DeviceCapability]
// Default memberwise initializers are never public by default, so we
// declare one manually.
public init(name: String, deviceType: DeviceType, capabilities: [DeviceCapability]) {
self.name = name
self.deviceType = deviceType
self.capabilities = capabilities
}
}
#if compiler(>=6)
extension DeviceConfig: Sendable {}
#endif
extension DeviceConfig: Equatable, Hashable {
public static func ==(lhs: DeviceConfig, rhs: DeviceConfig) -> Bool {
if lhs.name != rhs.name {
return false
}
if lhs.deviceType != rhs.deviceType {
return false
}
if lhs.capabilities != rhs.capabilities {
return false
}
return true
}
public func hash(into hasher: inout Hasher) {
hasher.combine(name)
hasher.combine(deviceType)
hasher.combine(capabilities)
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public struct FfiConverterTypeDeviceConfig: FfiConverterRustBuffer {
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> DeviceConfig {
return
try DeviceConfig(
name: FfiConverterString.read(from: &buf),
deviceType: FfiConverterTypeDeviceType.read(from: &buf),
capabilities: FfiConverterSequenceTypeDeviceCapability.read(from: &buf)
)
}
public static func write(_ value: DeviceConfig, into buf: inout [UInt8]) {
FfiConverterString.write(value.name, into: &buf)
FfiConverterTypeDeviceType.write(value.deviceType, into: &buf)
FfiConverterSequenceTypeDeviceCapability.write(value.capabilities, into: &buf)
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeDeviceConfig_lift(_ buf: RustBuffer) throws -> DeviceConfig {
return try FfiConverterTypeDeviceConfig.lift(buf)
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeDeviceConfig_lower(_ value: DeviceConfig) -> RustBuffer {
return FfiConverterTypeDeviceConfig.lower(value)
}
/**
* Details of a web-push subscription endpoint.
*
* This struct encapsulates the details of a web-push subscription endpoint,
* including all the information necessary to send a notification to its owner.
* Devices attached to the user's account may register one of these in order
* to receive timely updates about account-related events.
*
* Managing a web-push subscription is outside of the scope of this component.
*/
public struct DevicePushSubscription {
public var endpoint: String
public var publicKey: String
public var authKey: String
// Default memberwise initializers are never public by default, so we
// declare one manually.
public init(endpoint: String, publicKey: String, authKey: String) {
self.endpoint = endpoint
self.publicKey = publicKey
self.authKey = authKey
}
}
#if compiler(>=6)
extension DevicePushSubscription: Sendable {}
#endif
extension DevicePushSubscription: Equatable, Hashable {
public static func ==(lhs: DevicePushSubscription, rhs: DevicePushSubscription) -> Bool {
if lhs.endpoint != rhs.endpoint {
return false
}
if lhs.publicKey != rhs.publicKey {
return false
}
if lhs.authKey != rhs.authKey {
return false
}
return true
}
public func hash(into hasher: inout Hasher) {
hasher.combine(endpoint)
hasher.combine(publicKey)
hasher.combine(authKey)
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public struct FfiConverterTypeDevicePushSubscription: FfiConverterRustBuffer {
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> DevicePushSubscription {
return
try DevicePushSubscription(
endpoint: FfiConverterString.read(from: &buf),
publicKey: FfiConverterString.read(from: &buf),
authKey: FfiConverterString.read(from: &buf)
)
}
public static func write(_ value: DevicePushSubscription, into buf: inout [UInt8]) {
FfiConverterString.write(value.endpoint, into: &buf)
FfiConverterString.write(value.publicKey, into: &buf)
FfiConverterString.write(value.authKey, into: &buf)
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeDevicePushSubscription_lift(_ buf: RustBuffer) throws -> DevicePushSubscription {
return try FfiConverterTypeDevicePushSubscription.lift(buf)
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeDevicePushSubscription_lower(_ value: DevicePushSubscription) -> RustBuffer {
return FfiConverterTypeDevicePushSubscription.lower(value)
}
public struct FxaConfig {
/**
* FxaServer to connect with
*/
public var server: FxaServer
/**
* Registered OAuth client id of the application.
*/
public var clientId: String
/**
* `redirect_uri` - the registered OAuth redirect URI of the application.
*/
public var redirectUri: String
/**
* URL for the user's Sync Tokenserver. This can be used to support users who self-host their
* sync data. If `None` then it will default to the Mozilla-hosted Sync server.
*/
public var tokenServerUrlOverride: String?
// Default memberwise initializers are never public by default, so we
// declare one manually.
public init(
/**
* FxaServer to connect with
*/server: FxaServer,
/**
* Registered OAuth client id of the application.
*/clientId: String,
/**
* `redirect_uri` - the registered OAuth redirect URI of the application.
*/redirectUri: String,
/**
* URL for the user's Sync Tokenserver. This can be used to support users who self-host their
* sync data. If `None` then it will default to the Mozilla-hosted Sync server.
*/tokenServerUrlOverride: String? = nil) {
self.server = server
self.clientId = clientId
self.redirectUri = redirectUri
self.tokenServerUrlOverride = tokenServerUrlOverride
}
}
#if compiler(>=6)
extension FxaConfig: Sendable {}
#endif
extension FxaConfig: Equatable, Hashable {
public static func ==(lhs: FxaConfig, rhs: FxaConfig) -> Bool {
if lhs.server != rhs.server {
return false
}
if lhs.clientId != rhs.clientId {
return false
}
if lhs.redirectUri != rhs.redirectUri {
return false
}
if lhs.tokenServerUrlOverride != rhs.tokenServerUrlOverride {
return false
}
return true
}
public func hash(into hasher: inout Hasher) {
hasher.combine(server)
hasher.combine(clientId)
hasher.combine(redirectUri)
hasher.combine(tokenServerUrlOverride)
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public struct FfiConverterTypeFxaConfig: FfiConverterRustBuffer {
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> FxaConfig {
return
try FxaConfig(
server: FfiConverterTypeFxaServer.read(from: &buf),
clientId: FfiConverterString.read(from: &buf),
redirectUri: FfiConverterString.read(from: &buf),
tokenServerUrlOverride: FfiConverterOptionString.read(from: &buf)
)
}
public static func write(_ value: FxaConfig, into buf: inout [UInt8]) {
FfiConverterTypeFxaServer.write(value.server, into: &buf)
FfiConverterString.write(value.clientId, into: &buf)
FfiConverterString.write(value.redirectUri, into: &buf)
FfiConverterOptionString.write(value.tokenServerUrlOverride, into: &buf)
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeFxaConfig_lift(_ buf: RustBuffer) throws -> FxaConfig {
return try FfiConverterTypeFxaConfig.lift(buf)
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeFxaConfig_lower(_ value: FxaConfig) -> RustBuffer {
return FfiConverterTypeFxaConfig.lower(value)
}
/**
* Local device that's connecting to FxA
*
* This is returned by the device update methods and represents the server's view of the local
* device.
*/
public struct LocalDevice {
public var id: String
public var displayName: String
public var deviceType: DeviceType
public var capabilities: [DeviceCapability]
public var pushSubscription: DevicePushSubscription?
public var pushEndpointExpired: Bool
// Default memberwise initializers are never public by default, so we
// declare one manually.
public init(id: String, displayName: String, deviceType: DeviceType, capabilities: [DeviceCapability], pushSubscription: DevicePushSubscription?, pushEndpointExpired: Bool) {
self.id = id
self.displayName = displayName
self.deviceType = deviceType
self.capabilities = capabilities
self.pushSubscription = pushSubscription
self.pushEndpointExpired = pushEndpointExpired
}
}
#if compiler(>=6)
extension LocalDevice: Sendable {}
#endif
extension LocalDevice: Equatable, Hashable {
public static func ==(lhs: LocalDevice, rhs: LocalDevice) -> Bool {
if lhs.id != rhs.id {
return false
}
if lhs.displayName != rhs.displayName {
return false
}
if lhs.deviceType != rhs.deviceType {
return false
}
if lhs.capabilities != rhs.capabilities {
return false
}
if lhs.pushSubscription != rhs.pushSubscription {
return false
}
if lhs.pushEndpointExpired != rhs.pushEndpointExpired {
return false
}
return true
}
public func hash(into hasher: inout Hasher) {
hasher.combine(id)
hasher.combine(displayName)
hasher.combine(deviceType)
hasher.combine(capabilities)
hasher.combine(pushSubscription)
hasher.combine(pushEndpointExpired)
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public struct FfiConverterTypeLocalDevice: FfiConverterRustBuffer {
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> LocalDevice {
return
try LocalDevice(
id: FfiConverterString.read(from: &buf),
displayName: FfiConverterString.read(from: &buf),
deviceType: FfiConverterTypeDeviceType.read(from: &buf),
capabilities: FfiConverterSequenceTypeDeviceCapability.read(from: &buf),
pushSubscription: FfiConverterOptionTypeDevicePushSubscription.read(from: &buf),
pushEndpointExpired: FfiConverterBool.read(from: &buf)
)
}
public static func write(_ value: LocalDevice, into buf: inout [UInt8]) {
FfiConverterString.write(value.id, into: &buf)
FfiConverterString.write(value.displayName, into: &buf)
FfiConverterTypeDeviceType.write(value.deviceType, into: &buf)
FfiConverterSequenceTypeDeviceCapability.write(value.capabilities, into: &buf)
FfiConverterOptionTypeDevicePushSubscription.write(value.pushSubscription, into: &buf)
FfiConverterBool.write(value.pushEndpointExpired, into: &buf)
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeLocalDevice_lift(_ buf: RustBuffer) throws -> LocalDevice {
return try FfiConverterTypeLocalDevice.lift(buf)
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeLocalDevice_lower(_ value: LocalDevice) -> RustBuffer {
return FfiConverterTypeLocalDevice.lower(value)
}
/**
* Information about the user that controls a Firefox Account.
*
* This struct represents details about the user themselves, and would typically be
* used to customize account-related UI in the browser so that it is personalize
* for the current user.
*/
public struct Profile {
/**
* The user's account uid
*
* This is an opaque immutable unique identifier for their account.
*/
public var uid: String
/**
* The user's current primary email address.
*
* Note that unlike the `uid` field, the email address may change over time.
*/
public var email: String
/**
* The user's preferred textual display name.
*/
public var displayName: String?
/**
* The URL of a profile picture representing the user.
*
* All accounts have a corresponding profile picture. If the user has not
* provided one then a default image is used.
*/
public var avatar: String
/**
* Whether the `avatar` URL represents the default avatar image.
*/
public var isDefaultAvatar: Bool
// Default memberwise initializers are never public by default, so we
// declare one manually.
public init(
/**
* The user's account uid
*
* This is an opaque immutable unique identifier for their account.
*/uid: String,
/**
* The user's current primary email address.
*
* Note that unlike the `uid` field, the email address may change over time.
*/email: String,
/**
* The user's preferred textual display name.
*/displayName: String?,
/**
* The URL of a profile picture representing the user.
*
* All accounts have a corresponding profile picture. If the user has not
* provided one then a default image is used.
*/avatar: String,
/**
* Whether the `avatar` URL represents the default avatar image.
*/isDefaultAvatar: Bool) {
self.uid = uid
self.email = email
self.displayName = displayName
self.avatar = avatar
self.isDefaultAvatar = isDefaultAvatar
}
}
#if compiler(>=6)
extension Profile: Sendable {}
#endif
extension Profile: Equatable, Hashable {
public static func ==(lhs: Profile, rhs: Profile) -> Bool {
if lhs.uid != rhs.uid {
return false
}
if lhs.email != rhs.email {
return false
}
if lhs.displayName != rhs.displayName {
return false
}
if lhs.avatar != rhs.avatar {
return false
}
if lhs.isDefaultAvatar != rhs.isDefaultAvatar {
return false
}
return true
}
public func hash(into hasher: inout Hasher) {
hasher.combine(uid)
hasher.combine(email)
hasher.combine(displayName)
hasher.combine(avatar)
hasher.combine(isDefaultAvatar)
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public struct FfiConverterTypeProfile: FfiConverterRustBuffer {
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> Profile {
return
try Profile(
uid: FfiConverterString.read(from: &buf),
email: FfiConverterString.read(from: &buf),
displayName: FfiConverterOptionString.read(from: &buf),
avatar: FfiConverterString.read(from: &buf),
isDefaultAvatar: FfiConverterBool.read(from: &buf)
)
}
public static func write(_ value: Profile, into buf: inout [UInt8]) {
FfiConverterString.write(value.uid, into: &buf)
FfiConverterString.write(value.email, into: &buf)
FfiConverterOptionString.write(value.displayName, into: &buf)
FfiConverterString.write(value.avatar, into: &buf)
FfiConverterBool.write(value.isDefaultAvatar, into: &buf)
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeProfile_lift(_ buf: RustBuffer) throws -> Profile {
return try FfiConverterTypeProfile.lift(buf)
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeProfile_lower(_ value: Profile) -> RustBuffer {
return FfiConverterTypeProfile.lower(value)
}
/**
* A cryptographic key associated with an OAuth scope.
*
* Some OAuth scopes have a corresponding client-side encryption key that is required
* in order to access protected data. This struct represents such key material in a
* format compatible with the common "JWK" standard.
*/
public struct ScopedKey {
/**
* The type of key.
*
* In practice for FxA, this will always be string string "oct" (short for "octal")
* to represent a raw symmetric key.
*/
public var kty: String
/**
* The OAuth scope with which this key is associated.
*/
public var scope: String
/**
* The key material, as base64-url-encoded bytes.
*
* **⚠️ Warning:** the value of this field should never be revealed outside of the
* application. For example, it should never to sent to a server or logged in a log file.
*/
public var k: String
/**
* An opaque unique identifier for this key.
*
* Unlike the `k` field, this value is not secret and may be revealed to the server.
*/
public var kid: String
// Default memberwise initializers are never public by default, so we
// declare one manually.
public init(
/**
* The type of key.
*
* In practice for FxA, this will always be string string "oct" (short for "octal")
* to represent a raw symmetric key.
*/kty: String,
/**
* The OAuth scope with which this key is associated.
*/scope: String,
/**
* The key material, as base64-url-encoded bytes.
*
* **⚠️ Warning:** the value of this field should never be revealed outside of the
* application. For example, it should never to sent to a server or logged in a log file.
*/k: String,
/**
* An opaque unique identifier for this key.
*
* Unlike the `k` field, this value is not secret and may be revealed to the server.
*/kid: String) {
self.kty = kty
self.scope = scope
self.k = k
self.kid = kid
}
}
#if compiler(>=6)
extension ScopedKey: Sendable {}
#endif
extension ScopedKey: Equatable, Hashable {
public static func ==(lhs: ScopedKey, rhs: ScopedKey) -> Bool {
if lhs.kty != rhs.kty {
return false
}
if lhs.scope != rhs.scope {
return false
}
if lhs.k != rhs.k {
return false
}
if lhs.kid != rhs.kid {
return false
}
return true
}
public func hash(into hasher: inout Hasher) {
hasher.combine(kty)
hasher.combine(scope)
hasher.combine(k)
hasher.combine(kid)
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public struct FfiConverterTypeScopedKey: FfiConverterRustBuffer {
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> ScopedKey {
return
try ScopedKey(
kty: FfiConverterString.read(from: &buf),
scope: FfiConverterString.read(from: &buf),
k: FfiConverterString.read(from: &buf),
kid: FfiConverterString.read(from: &buf)
)
}
public static func write(_ value: ScopedKey, into buf: inout [UInt8]) {
FfiConverterString.write(value.kty, into: &buf)
FfiConverterString.write(value.scope, into: &buf)
FfiConverterString.write(value.k, into: &buf)
FfiConverterString.write(value.kid, into: &buf)
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeScopedKey_lift(_ buf: RustBuffer) throws -> ScopedKey {
return try FfiConverterTypeScopedKey.lift(buf)
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeScopedKey_lower(_ value: ScopedKey) -> RustBuffer {
return FfiConverterTypeScopedKey.lower(value)
}
/**
* The payload sent when invoking a "send tab" command.
*/
public struct SendTabPayload {
/**
* The navigation history of the sent tab.
*
* The last item in this list represents the page to be displayed,
* while earlier items may be included in the navigation history
* as a convenience to the user.
*/
public var entries: [TabHistoryEntry]
/**
* A unique identifier to be included in send-tab metrics.
*
* The application should treat this as opaque.
*/
public var flowId: String
/**
* A unique identifier to be included in send-tab metrics.
*
* The application should treat this as opaque.
*/
public var streamId: String
// Default memberwise initializers are never public by default, so we
// declare one manually.
public init(
/**
* The navigation history of the sent tab.
*
* The last item in this list represents the page to be displayed,
* while earlier items may be included in the navigation history
* as a convenience to the user.
*/entries: [TabHistoryEntry],
/**
* A unique identifier to be included in send-tab metrics.
*
* The application should treat this as opaque.
*/flowId: String = "",
/**
* A unique identifier to be included in send-tab metrics.
*
* The application should treat this as opaque.
*/streamId: String = "") {
self.entries = entries
self.flowId = flowId
self.streamId = streamId
}
}
#if compiler(>=6)
extension SendTabPayload: Sendable {}
#endif
extension SendTabPayload: Equatable, Hashable {
public static func ==(lhs: SendTabPayload, rhs: SendTabPayload) -> Bool {
if lhs.entries != rhs.entries {
return false
}
if lhs.flowId != rhs.flowId {
return false
}
if lhs.streamId != rhs.streamId {
return false
}
return true
}
public func hash(into hasher: inout Hasher) {
hasher.combine(entries)
hasher.combine(flowId)
hasher.combine(streamId)
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public struct FfiConverterTypeSendTabPayload: FfiConverterRustBuffer {
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> SendTabPayload {
return
try SendTabPayload(
entries: FfiConverterSequenceTypeTabHistoryEntry.read(from: &buf),
flowId: FfiConverterString.read(from: &buf),
streamId: FfiConverterString.read(from: &buf)
)
}
public static func write(_ value: SendTabPayload, into buf: inout [UInt8]) {
FfiConverterSequenceTypeTabHistoryEntry.write(value.entries, into: &buf)
FfiConverterString.write(value.flowId, into: &buf)
FfiConverterString.write(value.streamId, into: &buf)
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeSendTabPayload_lift(_ buf: RustBuffer) throws -> SendTabPayload {
return try FfiConverterTypeSendTabPayload.lift(buf)
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeSendTabPayload_lower(_ value: SendTabPayload) -> RustBuffer {
return FfiConverterTypeSendTabPayload.lower(value)
}
/**
* An individual entry in the navigation history of a sent tab.
*/
public struct TabHistoryEntry {
public var title: String
public var url: String
// Default memberwise initializers are never public by default, so we
// declare one manually.
public init(title: String, url: String) {
self.title = title
self.url = url
}
}
#if compiler(>=6)
extension TabHistoryEntry: Sendable {}
#endif
extension TabHistoryEntry: Equatable, Hashable {
public static func ==(lhs: TabHistoryEntry, rhs: TabHistoryEntry) -> Bool {
if lhs.title != rhs.title {
return false
}
if lhs.url != rhs.url {
return false
}
return true
}
public func hash(into hasher: inout Hasher) {
hasher.combine(title)
hasher.combine(url)
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public struct FfiConverterTypeTabHistoryEntry: FfiConverterRustBuffer {
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> TabHistoryEntry {
return
try TabHistoryEntry(
title: FfiConverterString.read(from: &buf),
url: FfiConverterString.read(from: &buf)
)
}
public static func write(_ value: TabHistoryEntry, into buf: inout [UInt8]) {
FfiConverterString.write(value.title, into: &buf)
FfiConverterString.write(value.url, into: &buf)
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeTabHistoryEntry_lift(_ buf: RustBuffer) throws -> TabHistoryEntry {
return try FfiConverterTypeTabHistoryEntry.lift(buf)
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeTabHistoryEntry_lower(_ value: TabHistoryEntry) -> RustBuffer {
return FfiConverterTypeTabHistoryEntry.lower(value)
}
public struct UserData {
public var sessionToken: String
public var uid: String
public var email: String
public var verified: Bool
// Default memberwise initializers are never public by default, so we
// declare one manually.
public init(sessionToken: String, uid: String, email: String, verified: Bool) {
self.sessionToken = sessionToken
self.uid = uid
self.email = email
self.verified = verified
}
}
#if compiler(>=6)
extension UserData: Sendable {}
#endif
extension UserData: Equatable, Hashable {
public static func ==(lhs: UserData, rhs: UserData) -> Bool {
if lhs.sessionToken != rhs.sessionToken {
return false
}
if lhs.uid != rhs.uid {
return false
}
if lhs.email != rhs.email {
return false
}
if lhs.verified != rhs.verified {
return false
}
return true
}
public func hash(into hasher: inout Hasher) {
hasher.combine(sessionToken)
hasher.combine(uid)
hasher.combine(email)
hasher.combine(verified)
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public struct FfiConverterTypeUserData: FfiConverterRustBuffer {
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> UserData {
return
try UserData(
sessionToken: FfiConverterString.read(from: &buf),
uid: FfiConverterString.read(from: &buf),
email: FfiConverterString.read(from: &buf),
verified: FfiConverterBool.read(from: &buf)
)
}
public static func write(_ value: UserData, into buf: inout [UInt8]) {
FfiConverterString.write(value.sessionToken, into: &buf)
FfiConverterString.write(value.uid, into: &buf)
FfiConverterString.write(value.email, into: &buf)
FfiConverterBool.write(value.verified, into: &buf)
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeUserData_lift(_ buf: RustBuffer) throws -> UserData {
return try FfiConverterTypeUserData.lift(buf)
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeUserData_lower(_ value: UserData) -> RustBuffer {
return FfiConverterTypeUserData.lower(value)
}
// Note that we don't yet support `indirect` for enums.
// See https://github.com/mozilla/uniffi-rs/issues/396 for further discussion.
/**
* An event that happened on the user's account.
*
* If the application has registered a [`DevicePushSubscription`] as part of its
* device record, then the Firefox Accounts server can send push notifications
* about important events that happen on the user's account. This enum represents
* the different kinds of event that can occur.
*/
public enum AccountEvent {
/**
* Sent when another device has invoked a command for this device to execute.
*
* When receiving this event, the application should inspect the contained
* command and react appropriately.
*/
case commandReceived(command: IncomingDeviceCommand
)
/**
* Sent when the user has modified their account profile information.
*
* When receiving this event, the application should request fresh profile
* information by calling [`get_profile`](FirefoxAccount::get_profile) with
* `ignore_cache` set to true, and update any profile information displayed
* in its UI.
*/
case profileUpdated
/**
* Sent when when there has been a change in authorization status.
*
* When receiving this event, the application should check whether it is
* still connected to the user's account by calling [`check_authorization_status`](
* FirefoxAccount::check_authorization_status), and updating its UI as appropriate.
*/
case accountAuthStateChanged
/**
* Sent when the user deletes their Firefox Account.
*
* When receiving this event, the application should act as though the user had
* signed out, discarding any persisted account state.
*/
case accountDestroyed
/**
* Sent when a new device connects to the user's account.
*
* When receiving this event, the application may use it to trigger an update
* of any UI that shows the list of connected devices. It may also show the
* user an informational notice about the new device, as a security measure.
*/
case deviceConnected(deviceName: String
)
/**
* Sent when a device disconnects from the user's account.
*
* When receiving this event, the application may use it to trigger an update
* of any UI that shows the list of connected devices.
*/
case deviceDisconnected(deviceId: String, isLocalDevice: Bool
)
/**
* An unknown event, most likely an event the client doesn't support yet.
*
* When receiving this event, the application should gracefully ignore it.
*/
case unknown
}
#if compiler(>=6)
extension AccountEvent: Sendable {}
#endif
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public struct FfiConverterTypeAccountEvent: FfiConverterRustBuffer {
typealias SwiftType = AccountEvent
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> AccountEvent {
let variant: Int32 = try readInt(&buf)
switch variant {
case 1: return .commandReceived(command: try FfiConverterTypeIncomingDeviceCommand.read(from: &buf)
)
case 2: return .profileUpdated
case 3: return .accountAuthStateChanged
case 4: return .accountDestroyed
case 5: return .deviceConnected(deviceName: try FfiConverterString.read(from: &buf)
)
case 6: return .deviceDisconnected(deviceId: try FfiConverterString.read(from: &buf), isLocalDevice: try FfiConverterBool.read(from: &buf)
)
case 7: return .unknown
default: throw UniffiInternalError.unexpectedEnumCase
}
}
public static func write(_ value: AccountEvent, into buf: inout [UInt8]) {
switch value {
case let .commandReceived(command):
writeInt(&buf, Int32(1))
FfiConverterTypeIncomingDeviceCommand.write(command, into: &buf)
case .profileUpdated:
writeInt(&buf, Int32(2))
case .accountAuthStateChanged:
writeInt(&buf, Int32(3))
case .accountDestroyed:
writeInt(&buf, Int32(4))
case let .deviceConnected(deviceName):
writeInt(&buf, Int32(5))
FfiConverterString.write(deviceName, into: &buf)
case let .deviceDisconnected(deviceId,isLocalDevice):
writeInt(&buf, Int32(6))
FfiConverterString.write(deviceId, into: &buf)
FfiConverterBool.write(isLocalDevice, into: &buf)
case .unknown:
writeInt(&buf, Int32(7))
}
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeAccountEvent_lift(_ buf: RustBuffer) throws -> AccountEvent {
return try FfiConverterTypeAccountEvent.lift(buf)
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeAccountEvent_lower(_ value: AccountEvent) -> RustBuffer {
return FfiConverterTypeAccountEvent.lower(value)
}
extension AccountEvent: Equatable, Hashable {}
// Note that we don't yet support `indirect` for enums.
// See https://github.com/mozilla/uniffi-rs/issues/396 for further discussion.
/**
* The result of invoking a "close tabs" command.
*
* If [`FirefoxAccount::close_tabs`] is called with more URLs than can fit
* into a single command payload, the URLs will be chunked and sent in
* multiple commands.
*
* Chunking breaks the atomicity of a "close tabs" command, but
* reduces the number of these commands that FxA sends to other devices.
* This is critical for platforms like iOS, where every command triggers a
* push message that must show a user-visible notification.
*/
public enum CloseTabsResult {
/**
* All URLs passed to [`FirefoxAccount::close_tabs`] were chunked and sent
* in one or more device commands.
*/
case ok
/**
* One or more URLs passed to [`FirefoxAccount::close_tabs`] couldn't be sent
* in a device command. The caller can assume that:
*
* 1. Any URL in the returned list of `urls` was not sent, and
* should be retried.
* 2. All other URLs that were passed to [`FirefoxAccount::close_tabs`], and
* that are _not_ in the list of `urls`, were chunked and sent.
*/
case tabsNotClosed(urls: [String]
)
}
#if compiler(>=6)
extension CloseTabsResult: Sendable {}
#endif
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public struct FfiConverterTypeCloseTabsResult: FfiConverterRustBuffer {
typealias SwiftType = CloseTabsResult
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> CloseTabsResult {
let variant: Int32 = try readInt(&buf)
switch variant {
case 1: return .ok
case 2: return .tabsNotClosed(urls: try FfiConverterSequenceString.read(from: &buf)
)
default: throw UniffiInternalError.unexpectedEnumCase
}
}
public static func write(_ value: CloseTabsResult, into buf: inout [UInt8]) {
switch value {
case .ok:
writeInt(&buf, Int32(1))
case let .tabsNotClosed(urls):
writeInt(&buf, Int32(2))
FfiConverterSequenceString.write(urls, into: &buf)
}
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeCloseTabsResult_lift(_ buf: RustBuffer) throws -> CloseTabsResult {
return try FfiConverterTypeCloseTabsResult.lift(buf)
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeCloseTabsResult_lower(_ value: CloseTabsResult) -> RustBuffer {
return FfiConverterTypeCloseTabsResult.lower(value)
}
extension CloseTabsResult: Equatable, Hashable {}
// Note that we don't yet support `indirect` for enums.
// See https://github.com/mozilla/uniffi-rs/issues/396 for further discussion.
/**
* A "capability" offered by a device.
*
* In the FxA ecosystem, connected devices may advertize their ability to respond
* to various "commands" that can be invoked by other devices. The details of
* executing these commands are encapsulated as part of the FxA Client component,
* so consumers simply need to select which ones they want to support, and can
* use the variants of this enum to do so.
*/
public enum DeviceCapability {
case sendTab
case closeTabs
}
#if compiler(>=6)
extension DeviceCapability: Sendable {}
#endif
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public struct FfiConverterTypeDeviceCapability: FfiConverterRustBuffer {
typealias SwiftType = DeviceCapability
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> DeviceCapability {
let variant: Int32 = try readInt(&buf)
switch variant {
case 1: return .sendTab
case 2: return .closeTabs
default: throw UniffiInternalError.unexpectedEnumCase
}
}
public static func write(_ value: DeviceCapability, into buf: inout [UInt8]) {
switch value {
case .sendTab:
writeInt(&buf, Int32(1))
case .closeTabs:
writeInt(&buf, Int32(2))
}
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeDeviceCapability_lift(_ buf: RustBuffer) throws -> DeviceCapability {
return try FfiConverterTypeDeviceCapability.lift(buf)
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeDeviceCapability_lower(_ value: DeviceCapability) -> RustBuffer {
return FfiConverterTypeDeviceCapability.lower(value)
}
extension DeviceCapability: Equatable, Hashable {}
/**
* Generic error type thrown by many [`FirefoxAccount`] operations.
*
* Precise details of the error are hidden from consumers, mostly due to limitations of
* how we expose this API to other languages. The type of the error indicates how the
* calling code should respond.
*/
public enum FxaError {
/**
* Thrown when there was a problem with the authentication status of the account,
* such as an expired token. The application should [check its authorization status](
* FirefoxAccount::check_authorization_status) to see whether it has been disconnected,
* or retry the operation with a freshly-generated token.
*/
case Authentication(message: String)
/**
* Thrown if an operation fails due to network access problems.
* The application may retry at a later time once connectivity is restored.
*/
case Network(message: String)
/**
* Thrown if the application attempts to complete an OAuth flow when no OAuth flow has been initiated for that state.
* This may indicate a user who navigated directly to the OAuth `redirect_uri` for the application.
*/
case NoExistingAuthFlow(message: String)
/**
* Thrown if the application attempts to complete an OAuth flow, but the state
* tokens returned from the Firefox Account server do not match with the ones
* expected by the client.
* This may indicate a stale OAuth flow, or potentially an attempted hijacking
* of the flow by an attacker. The signin attempt cannot be completed.
*
* **Note:** This error is currently only thrown in the Swift language bindings.
*/
case WrongAuthFlow(message: String)
/**
* Origin mismatch when handling a pairing flow
*
* The most likely cause of this is that a user tried to pair together two firefox instances
* that are configured to use different servers.
*/
case OriginMismatch(message: String)
/**
* The sync scoped key was missing in the server response
*/
case SyncScopedKeyMissingInServerResponse(message: String)
/**
* Thrown if there is a panic in the underlying Rust code.
*
* **Note:** This error is currently only thrown in the Kotlin language bindings.
*/
case Panic(message: String)
/**
* A catch-all for other unspecified errors.
*/
case Other(message: String)
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public struct FfiConverterTypeFxaError: FfiConverterRustBuffer {
typealias SwiftType = FxaError
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> FxaError {
let variant: Int32 = try readInt(&buf)
switch variant {
case 1: return .Authentication(
message: try FfiConverterString.read(from: &buf)
)
case 2: return .Network(
message: try FfiConverterString.read(from: &buf)
)
case 3: return .NoExistingAuthFlow(
message: try FfiConverterString.read(from: &buf)
)
case 4: return .WrongAuthFlow(
message: try FfiConverterString.read(from: &buf)
)
case 5: return .OriginMismatch(
message: try FfiConverterString.read(from: &buf)
)
case 6: return .SyncScopedKeyMissingInServerResponse(
message: try FfiConverterString.read(from: &buf)
)
case 7: return .Panic(
message: try FfiConverterString.read(from: &buf)
)
case 8: return .Other(
message: try FfiConverterString.read(from: &buf)
)
default: throw UniffiInternalError.unexpectedEnumCase
}
}
public static func write(_ value: FxaError, into buf: inout [UInt8]) {
switch value {
case .Authentication(_ /* message is ignored*/):
writeInt(&buf, Int32(1))
case .Network(_ /* message is ignored*/):
writeInt(&buf, Int32(2))
case .NoExistingAuthFlow(_ /* message is ignored*/):
writeInt(&buf, Int32(3))
case .WrongAuthFlow(_ /* message is ignored*/):
writeInt(&buf, Int32(4))
case .OriginMismatch(_ /* message is ignored*/):
writeInt(&buf, Int32(5))
case .SyncScopedKeyMissingInServerResponse(_ /* message is ignored*/):
writeInt(&buf, Int32(6))
case .Panic(_ /* message is ignored*/):
writeInt(&buf, Int32(7))
case .Other(_ /* message is ignored*/):
writeInt(&buf, Int32(8))
}
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeFxaError_lift(_ buf: RustBuffer) throws -> FxaError {
return try FfiConverterTypeFxaError.lift(buf)
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeFxaError_lower(_ value: FxaError) -> RustBuffer {
return FfiConverterTypeFxaError.lower(value)
}
extension FxaError: Equatable, Hashable {}
extension FxaError: Foundation.LocalizedError {
public var errorDescription: String? {
String(reflecting: self)
}
}
// Note that we don't yet support `indirect` for enums.
// See https://github.com/mozilla/uniffi-rs/issues/396 for further discussion.
public enum FxaEvent {
case initialize(deviceConfig: DeviceConfig
)
case beginOAuthFlow(scopes: [String], entrypoint: String
)
case beginPairingFlow(pairingUrl: String, scopes: [String], entrypoint: String
)
case completeOAuthFlow(code: String, state: String
)
case cancelOAuthFlow
case checkAuthorizationStatus
case disconnect
case callGetProfile
}
#if compiler(>=6)
extension FxaEvent: Sendable {}
#endif
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public struct FfiConverterTypeFxaEvent: FfiConverterRustBuffer {
typealias SwiftType = FxaEvent
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> FxaEvent {
let variant: Int32 = try readInt(&buf)
switch variant {
case 1: return .initialize(deviceConfig: try FfiConverterTypeDeviceConfig.read(from: &buf)
)
case 2: return .beginOAuthFlow(scopes: try FfiConverterSequenceString.read(from: &buf), entrypoint: try FfiConverterString.read(from: &buf)
)
case 3: return .beginPairingFlow(pairingUrl: try FfiConverterString.read(from: &buf), scopes: try FfiConverterSequenceString.read(from: &buf), entrypoint: try FfiConverterString.read(from: &buf)
)
case 4: return .completeOAuthFlow(code: try FfiConverterString.read(from: &buf), state: try FfiConverterString.read(from: &buf)
)
case 5: return .cancelOAuthFlow
case 6: return .checkAuthorizationStatus
case 7: return .disconnect
case 8: return .callGetProfile
default: throw UniffiInternalError.unexpectedEnumCase
}
}
public static func write(_ value: FxaEvent, into buf: inout [UInt8]) {
switch value {
case let .initialize(deviceConfig):
writeInt(&buf, Int32(1))
FfiConverterTypeDeviceConfig.write(deviceConfig, into: &buf)
case let .beginOAuthFlow(scopes,entrypoint):
writeInt(&buf, Int32(2))
FfiConverterSequenceString.write(scopes, into: &buf)
FfiConverterString.write(entrypoint, into: &buf)
case let .beginPairingFlow(pairingUrl,scopes,entrypoint):
writeInt(&buf, Int32(3))
FfiConverterString.write(pairingUrl, into: &buf)
FfiConverterSequenceString.write(scopes, into: &buf)
FfiConverterString.write(entrypoint, into: &buf)
case let .completeOAuthFlow(code,state):
writeInt(&buf, Int32(4))
FfiConverterString.write(code, into: &buf)
FfiConverterString.write(state, into: &buf)
case .cancelOAuthFlow:
writeInt(&buf, Int32(5))
case .checkAuthorizationStatus:
writeInt(&buf, Int32(6))
case .disconnect:
writeInt(&buf, Int32(7))
case .callGetProfile:
writeInt(&buf, Int32(8))
}
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeFxaEvent_lift(_ buf: RustBuffer) throws -> FxaEvent {
return try FfiConverterTypeFxaEvent.lift(buf)
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeFxaEvent_lower(_ value: FxaEvent) -> RustBuffer {
return FfiConverterTypeFxaEvent.lower(value)
}
extension FxaEvent: Equatable, Hashable {}
// Note that we don't yet support `indirect` for enums.
// See https://github.com/mozilla/uniffi-rs/issues/396 for further discussion.
public enum FxaRustAuthState {
case disconnected
case connected
case authIssues
}
#if compiler(>=6)
extension FxaRustAuthState: Sendable {}
#endif
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public struct FfiConverterTypeFxaRustAuthState: FfiConverterRustBuffer {
typealias SwiftType = FxaRustAuthState
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> FxaRustAuthState {
let variant: Int32 = try readInt(&buf)
switch variant {
case 1: return .disconnected
case 2: return .connected
case 3: return .authIssues
default: throw UniffiInternalError.unexpectedEnumCase
}
}
public static func write(_ value: FxaRustAuthState, into buf: inout [UInt8]) {
switch value {
case .disconnected:
writeInt(&buf, Int32(1))
case .connected:
writeInt(&buf, Int32(2))
case .authIssues:
writeInt(&buf, Int32(3))
}
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeFxaRustAuthState_lift(_ buf: RustBuffer) throws -> FxaRustAuthState {
return try FfiConverterTypeFxaRustAuthState.lift(buf)
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeFxaRustAuthState_lower(_ value: FxaRustAuthState) -> RustBuffer {
return FfiConverterTypeFxaRustAuthState.lower(value)
}
extension FxaRustAuthState: Equatable, Hashable {}
// Note that we don't yet support `indirect` for enums.
// See https://github.com/mozilla/uniffi-rs/issues/396 for further discussion.
/**
* FxA server to connect to
*/
public enum FxaServer {
case release
case stable
case stage
case china
case localDev
case custom(url: String
)
}
#if compiler(>=6)
extension FxaServer: Sendable {}
#endif
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public struct FfiConverterTypeFxaServer: FfiConverterRustBuffer {
typealias SwiftType = FxaServer
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> FxaServer {
let variant: Int32 = try readInt(&buf)
switch variant {
case 1: return .release
case 2: return .stable
case 3: return .stage
case 4: return .china
case 5: return .localDev
case 6: return .custom(url: try FfiConverterString.read(from: &buf)
)
default: throw UniffiInternalError.unexpectedEnumCase
}
}
public static func write(_ value: FxaServer, into buf: inout [UInt8]) {
switch value {
case .release:
writeInt(&buf, Int32(1))
case .stable:
writeInt(&buf, Int32(2))
case .stage:
writeInt(&buf, Int32(3))
case .china:
writeInt(&buf, Int32(4))
case .localDev:
writeInt(&buf, Int32(5))
case let .custom(url):
writeInt(&buf, Int32(6))
FfiConverterString.write(url, into: &buf)
}
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeFxaServer_lift(_ buf: RustBuffer) throws -> FxaServer {
return try FfiConverterTypeFxaServer.lift(buf)
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeFxaServer_lower(_ value: FxaServer) -> RustBuffer {
return FfiConverterTypeFxaServer.lower(value)
}
extension FxaServer: Equatable, Hashable {}
// Note that we don't yet support `indirect` for enums.
// See https://github.com/mozilla/uniffi-rs/issues/396 for further discussion.
public enum FxaState {
case uninitialized
case disconnected
case authenticating(oauthUrl: String
)
case connected
case authIssues
}
#if compiler(>=6)
extension FxaState: Sendable {}
#endif
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public struct FfiConverterTypeFxaState: FfiConverterRustBuffer {
typealias SwiftType = FxaState
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> FxaState {
let variant: Int32 = try readInt(&buf)
switch variant {
case 1: return .uninitialized
case 2: return .disconnected
case 3: return .authenticating(oauthUrl: try FfiConverterString.read(from: &buf)
)
case 4: return .connected
case 5: return .authIssues
default: throw UniffiInternalError.unexpectedEnumCase
}
}
public static func write(_ value: FxaState, into buf: inout [UInt8]) {
switch value {
case .uninitialized:
writeInt(&buf, Int32(1))
case .disconnected:
writeInt(&buf, Int32(2))
case let .authenticating(oauthUrl):
writeInt(&buf, Int32(3))
FfiConverterString.write(oauthUrl, into: &buf)
case .connected:
writeInt(&buf, Int32(4))
case .authIssues:
writeInt(&buf, Int32(5))
}
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeFxaState_lift(_ buf: RustBuffer) throws -> FxaState {
return try FfiConverterTypeFxaState.lift(buf)
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeFxaState_lower(_ value: FxaState) -> RustBuffer {
return FfiConverterTypeFxaState.lower(value)
}
extension FxaState: Equatable, Hashable {}
// Note that we don't yet support `indirect` for enums.
// See https://github.com/mozilla/uniffi-rs/issues/396 for further discussion.
public enum FxaStateCheckerEvent {
case getAuthStateSuccess(authState: FxaRustAuthState
)
case beginOAuthFlowSuccess(oauthUrl: String
)
case beginPairingFlowSuccess(oauthUrl: String
)
case completeOAuthFlowSuccess
case initializeDeviceSuccess
case ensureDeviceCapabilitiesSuccess
case checkAuthorizationStatusSuccess(active: Bool
)
case disconnectSuccess
case getProfileSuccess
case callError
case ensureCapabilitiesAuthError
}
#if compiler(>=6)
extension FxaStateCheckerEvent: Sendable {}
#endif
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public struct FfiConverterTypeFxaStateCheckerEvent: FfiConverterRustBuffer {
typealias SwiftType = FxaStateCheckerEvent
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> FxaStateCheckerEvent {
let variant: Int32 = try readInt(&buf)
switch variant {
case 1: return .getAuthStateSuccess(authState: try FfiConverterTypeFxaRustAuthState.read(from: &buf)
)
case 2: return .beginOAuthFlowSuccess(oauthUrl: try FfiConverterString.read(from: &buf)
)
case 3: return .beginPairingFlowSuccess(oauthUrl: try FfiConverterString.read(from: &buf)
)
case 4: return .completeOAuthFlowSuccess
case 5: return .initializeDeviceSuccess
case 6: return .ensureDeviceCapabilitiesSuccess
case 7: return .checkAuthorizationStatusSuccess(active: try FfiConverterBool.read(from: &buf)
)
case 8: return .disconnectSuccess
case 9: return .getProfileSuccess
case 10: return .callError
case 11: return .ensureCapabilitiesAuthError
default: throw UniffiInternalError.unexpectedEnumCase
}
}
public static func write(_ value: FxaStateCheckerEvent, into buf: inout [UInt8]) {
switch value {
case let .getAuthStateSuccess(authState):
writeInt(&buf, Int32(1))
FfiConverterTypeFxaRustAuthState.write(authState, into: &buf)
case let .beginOAuthFlowSuccess(oauthUrl):
writeInt(&buf, Int32(2))
FfiConverterString.write(oauthUrl, into: &buf)
case let .beginPairingFlowSuccess(oauthUrl):
writeInt(&buf, Int32(3))
FfiConverterString.write(oauthUrl, into: &buf)
case .completeOAuthFlowSuccess:
writeInt(&buf, Int32(4))
case .initializeDeviceSuccess:
writeInt(&buf, Int32(5))
case .ensureDeviceCapabilitiesSuccess:
writeInt(&buf, Int32(6))
case let .checkAuthorizationStatusSuccess(active):
writeInt(&buf, Int32(7))
FfiConverterBool.write(active, into: &buf)
case .disconnectSuccess:
writeInt(&buf, Int32(8))
case .getProfileSuccess:
writeInt(&buf, Int32(9))
case .callError:
writeInt(&buf, Int32(10))
case .ensureCapabilitiesAuthError:
writeInt(&buf, Int32(11))
}
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeFxaStateCheckerEvent_lift(_ buf: RustBuffer) throws -> FxaStateCheckerEvent {
return try FfiConverterTypeFxaStateCheckerEvent.lift(buf)
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeFxaStateCheckerEvent_lower(_ value: FxaStateCheckerEvent) -> RustBuffer {
return FfiConverterTypeFxaStateCheckerEvent.lower(value)
}
extension FxaStateCheckerEvent: Equatable, Hashable {}
// Note that we don't yet support `indirect` for enums.
// See https://github.com/mozilla/uniffi-rs/issues/396 for further discussion.
public enum FxaStateCheckerState {
case getAuthState
case beginOAuthFlow(scopes: [String], entrypoint: String
)
case beginPairingFlow(pairingUrl: String, scopes: [String], entrypoint: String
)
case completeOAuthFlow(code: String, state: String
)
case initializeDevice
case ensureDeviceCapabilities
case checkAuthorizationStatus
case disconnect
case getProfile
case complete(newState: FxaState
)
case cancel
}
#if compiler(>=6)
extension FxaStateCheckerState: Sendable {}
#endif
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public struct FfiConverterTypeFxaStateCheckerState: FfiConverterRustBuffer {
typealias SwiftType = FxaStateCheckerState
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> FxaStateCheckerState {
let variant: Int32 = try readInt(&buf)
switch variant {
case 1: return .getAuthState
case 2: return .beginOAuthFlow(scopes: try FfiConverterSequenceString.read(from: &buf), entrypoint: try FfiConverterString.read(from: &buf)
)
case 3: return .beginPairingFlow(pairingUrl: try FfiConverterString.read(from: &buf), scopes: try FfiConverterSequenceString.read(from: &buf), entrypoint: try FfiConverterString.read(from: &buf)
)
case 4: return .completeOAuthFlow(code: try FfiConverterString.read(from: &buf), state: try FfiConverterString.read(from: &buf)
)
case 5: return .initializeDevice
case 6: return .ensureDeviceCapabilities
case 7: return .checkAuthorizationStatus
case 8: return .disconnect
case 9: return .getProfile
case 10: return .complete(newState: try FfiConverterTypeFxaState.read(from: &buf)
)
case 11: return .cancel
default: throw UniffiInternalError.unexpectedEnumCase
}
}
public static func write(_ value: FxaStateCheckerState, into buf: inout [UInt8]) {
switch value {
case .getAuthState:
writeInt(&buf, Int32(1))
case let .beginOAuthFlow(scopes,entrypoint):
writeInt(&buf, Int32(2))
FfiConverterSequenceString.write(scopes, into: &buf)
FfiConverterString.write(entrypoint, into: &buf)
case let .beginPairingFlow(pairingUrl,scopes,entrypoint):
writeInt(&buf, Int32(3))
FfiConverterString.write(pairingUrl, into: &buf)
FfiConverterSequenceString.write(scopes, into: &buf)
FfiConverterString.write(entrypoint, into: &buf)
case let .completeOAuthFlow(code,state):
writeInt(&buf, Int32(4))
FfiConverterString.write(code, into: &buf)
FfiConverterString.write(state, into: &buf)
case .initializeDevice:
writeInt(&buf, Int32(5))
case .ensureDeviceCapabilities:
writeInt(&buf, Int32(6))
case .checkAuthorizationStatus:
writeInt(&buf, Int32(7))
case .disconnect:
writeInt(&buf, Int32(8))
case .getProfile:
writeInt(&buf, Int32(9))
case let .complete(newState):
writeInt(&buf, Int32(10))
FfiConverterTypeFxaState.write(newState, into: &buf)
case .cancel:
writeInt(&buf, Int32(11))
}
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeFxaStateCheckerState_lift(_ buf: RustBuffer) throws -> FxaStateCheckerState {
return try FfiConverterTypeFxaStateCheckerState.lift(buf)
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeFxaStateCheckerState_lower(_ value: FxaStateCheckerState) -> RustBuffer {
return FfiConverterTypeFxaStateCheckerState.lower(value)
}
extension FxaStateCheckerState: Equatable, Hashable {}
// Note that we don't yet support `indirect` for enums.
// See https://github.com/mozilla/uniffi-rs/issues/396 for further discussion.
/**
* A command invoked by another device.
*
* This enum represents all possible commands that can be invoked on
* the device. It is the responsibility of the application to interpret
* each command.
*/
public enum IncomingDeviceCommand {
/**
* Indicates that a tab has been sent to this device.
*/
case tabReceived(sender: Device?, payload: SendTabPayload
)
/**
* Indicates that the sender wants to close one or more tabs on this device.
*/
case tabsClosed(sender: Device?, payload: CloseTabsPayload
)
}
#if compiler(>=6)
extension IncomingDeviceCommand: Sendable {}
#endif
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public struct FfiConverterTypeIncomingDeviceCommand: FfiConverterRustBuffer {
typealias SwiftType = IncomingDeviceCommand
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> IncomingDeviceCommand {
let variant: Int32 = try readInt(&buf)
switch variant {
case 1: return .tabReceived(sender: try FfiConverterOptionTypeDevice.read(from: &buf), payload: try FfiConverterTypeSendTabPayload.read(from: &buf)
)
case 2: return .tabsClosed(sender: try FfiConverterOptionTypeDevice.read(from: &buf), payload: try FfiConverterTypeCloseTabsPayload.read(from: &buf)
)
default: throw UniffiInternalError.unexpectedEnumCase
}
}
public static func write(_ value: IncomingDeviceCommand, into buf: inout [UInt8]) {
switch value {
case let .tabReceived(sender,payload):
writeInt(&buf, Int32(1))
FfiConverterOptionTypeDevice.write(sender, into: &buf)
FfiConverterTypeSendTabPayload.write(payload, into: &buf)
case let .tabsClosed(sender,payload):
writeInt(&buf, Int32(2))
FfiConverterOptionTypeDevice.write(sender, into: &buf)
FfiConverterTypeCloseTabsPayload.write(payload, into: &buf)
}
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeIncomingDeviceCommand_lift(_ buf: RustBuffer) throws -> IncomingDeviceCommand {
return try FfiConverterTypeIncomingDeviceCommand.lift(buf)
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
public func FfiConverterTypeIncomingDeviceCommand_lower(_ value: IncomingDeviceCommand) -> RustBuffer {
return FfiConverterTypeIncomingDeviceCommand.lower(value)
}
extension IncomingDeviceCommand: Equatable, Hashable {}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
fileprivate struct FfiConverterOptionInt64: FfiConverterRustBuffer {
typealias SwiftType = Int64?
public static func write(_ value: SwiftType, into buf: inout [UInt8]) {
guard let value = value else {
writeInt(&buf, Int8(0))
return
}
writeInt(&buf, Int8(1))
FfiConverterInt64.write(value, into: &buf)
}
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> SwiftType {
switch try readInt(&buf) as Int8 {
case 0: return nil
case 1: return try FfiConverterInt64.read(from: &buf)
default: throw UniffiInternalError.unexpectedOptionalTag
}
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
fileprivate struct FfiConverterOptionString: FfiConverterRustBuffer {
typealias SwiftType = String?
public static func write(_ value: SwiftType, into buf: inout [UInt8]) {
guard let value = value else {
writeInt(&buf, Int8(0))
return
}
writeInt(&buf, Int8(1))
FfiConverterString.write(value, into: &buf)
}
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> SwiftType {
switch try readInt(&buf) as Int8 {
case 0: return nil
case 1: return try FfiConverterString.read(from: &buf)
default: throw UniffiInternalError.unexpectedOptionalTag
}
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
fileprivate struct FfiConverterOptionTypeDevice: FfiConverterRustBuffer {
typealias SwiftType = Device?
public static func write(_ value: SwiftType, into buf: inout [UInt8]) {
guard let value = value else {
writeInt(&buf, Int8(0))
return
}
writeInt(&buf, Int8(1))
FfiConverterTypeDevice.write(value, into: &buf)
}
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> SwiftType {
switch try readInt(&buf) as Int8 {
case 0: return nil
case 1: return try FfiConverterTypeDevice.read(from: &buf)
default: throw UniffiInternalError.unexpectedOptionalTag
}
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
fileprivate struct FfiConverterOptionTypeDevicePushSubscription: FfiConverterRustBuffer {
typealias SwiftType = DevicePushSubscription?
public static func write(_ value: SwiftType, into buf: inout [UInt8]) {
guard let value = value else {
writeInt(&buf, Int8(0))
return
}
writeInt(&buf, Int8(1))
FfiConverterTypeDevicePushSubscription.write(value, into: &buf)
}
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> SwiftType {
switch try readInt(&buf) as Int8 {
case 0: return nil
case 1: return try FfiConverterTypeDevicePushSubscription.read(from: &buf)
default: throw UniffiInternalError.unexpectedOptionalTag
}
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
fileprivate struct FfiConverterOptionTypeScopedKey: FfiConverterRustBuffer {
typealias SwiftType = ScopedKey?
public static func write(_ value: SwiftType, into buf: inout [UInt8]) {
guard let value = value else {
writeInt(&buf, Int8(0))
return
}
writeInt(&buf, Int8(1))
FfiConverterTypeScopedKey.write(value, into: &buf)
}
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> SwiftType {
switch try readInt(&buf) as Int8 {
case 0: return nil
case 1: return try FfiConverterTypeScopedKey.read(from: &buf)
default: throw UniffiInternalError.unexpectedOptionalTag
}
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
fileprivate struct FfiConverterOptionSequenceString: FfiConverterRustBuffer {
typealias SwiftType = [String]?
public static func write(_ value: SwiftType, into buf: inout [UInt8]) {
guard let value = value else {
writeInt(&buf, Int8(0))
return
}
writeInt(&buf, Int8(1))
FfiConverterSequenceString.write(value, into: &buf)
}
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> SwiftType {
switch try readInt(&buf) as Int8 {
case 0: return nil
case 1: return try FfiConverterSequenceString.read(from: &buf)
default: throw UniffiInternalError.unexpectedOptionalTag
}
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
fileprivate struct FfiConverterSequenceString: FfiConverterRustBuffer {
typealias SwiftType = [String]
public static func write(_ value: [String], into buf: inout [UInt8]) {
let len = Int32(value.count)
writeInt(&buf, len)
for item in value {
FfiConverterString.write(item, into: &buf)
}
}
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> [String] {
let len: Int32 = try readInt(&buf)
var seq = [String]()
seq.reserveCapacity(Int(len))
for _ in 0 ..< len {
seq.append(try FfiConverterString.read(from: &buf))
}
return seq
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
fileprivate struct FfiConverterSequenceTypeAttachedClient: FfiConverterRustBuffer {
typealias SwiftType = [AttachedClient]
public static func write(_ value: [AttachedClient], into buf: inout [UInt8]) {
let len = Int32(value.count)
writeInt(&buf, len)
for item in value {
FfiConverterTypeAttachedClient.write(item, into: &buf)
}
}
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> [AttachedClient] {
let len: Int32 = try readInt(&buf)
var seq = [AttachedClient]()
seq.reserveCapacity(Int(len))
for _ in 0 ..< len {
seq.append(try FfiConverterTypeAttachedClient.read(from: &buf))
}
return seq
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
fileprivate struct FfiConverterSequenceTypeDevice: FfiConverterRustBuffer {
typealias SwiftType = [Device]
public static func write(_ value: [Device], into buf: inout [UInt8]) {
let len = Int32(value.count)
writeInt(&buf, len)
for item in value {
FfiConverterTypeDevice.write(item, into: &buf)
}
}
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> [Device] {
let len: Int32 = try readInt(&buf)
var seq = [Device]()
seq.reserveCapacity(Int(len))
for _ in 0 ..< len {
seq.append(try FfiConverterTypeDevice.read(from: &buf))
}
return seq
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
fileprivate struct FfiConverterSequenceTypeTabHistoryEntry: FfiConverterRustBuffer {
typealias SwiftType = [TabHistoryEntry]
public static func write(_ value: [TabHistoryEntry], into buf: inout [UInt8]) {
let len = Int32(value.count)
writeInt(&buf, len)
for item in value {
FfiConverterTypeTabHistoryEntry.write(item, into: &buf)
}
}
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> [TabHistoryEntry] {
let len: Int32 = try readInt(&buf)
var seq = [TabHistoryEntry]()
seq.reserveCapacity(Int(len))
for _ in 0 ..< len {
seq.append(try FfiConverterTypeTabHistoryEntry.read(from: &buf))
}
return seq
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
fileprivate struct FfiConverterSequenceTypeDeviceCapability: FfiConverterRustBuffer {
typealias SwiftType = [DeviceCapability]
public static func write(_ value: [DeviceCapability], into buf: inout [UInt8]) {
let len = Int32(value.count)
writeInt(&buf, len)
for item in value {
FfiConverterTypeDeviceCapability.write(item, into: &buf)
}
}
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> [DeviceCapability] {
let len: Int32 = try readInt(&buf)
var seq = [DeviceCapability]()
seq.reserveCapacity(Int(len))
for _ in 0 ..< len {
seq.append(try FfiConverterTypeDeviceCapability.read(from: &buf))
}
return seq
}
}
#if swift(>=5.8)
@_documentation(visibility: private)
#endif
fileprivate struct FfiConverterSequenceTypeIncomingDeviceCommand: FfiConverterRustBuffer {
typealias SwiftType = [IncomingDeviceCommand]
public static func write(_ value: [IncomingDeviceCommand], into buf: inout [UInt8]) {
let len = Int32(value.count)
writeInt(&buf, len)
for item in value {
FfiConverterTypeIncomingDeviceCommand.write(item, into: &buf)
}
}
public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> [IncomingDeviceCommand] {
let len: Int32 = try readInt(&buf)
var seq = [IncomingDeviceCommand]()
seq.reserveCapacity(Int(len))
for _ in 0 ..< len {
seq.append(try FfiConverterTypeIncomingDeviceCommand.read(from: &buf))
}
return seq
}
}
private enum InitializationResult {
case ok
case contractVersionMismatch
case apiChecksumMismatch
}
// Use a global variable to perform the versioning checks. Swift ensures that
// the code inside is only computed once.
private let initializationResult: InitializationResult = {
// Get the bindings contract version from our ComponentInterface
let bindings_contract_version = 29
// Get the scaffolding contract version by calling the into the dylib
let scaffolding_contract_version = ffi_fxa_client_uniffi_contract_version()
if bindings_contract_version != scaffolding_contract_version {
return InitializationResult.contractVersionMismatch
}
if (uniffi_fxa_client_checksum_method_firefoxaccount_authorize_code_using_session_token() != 17083) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_firefoxaccount_begin_oauth_flow() != 2998) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_firefoxaccount_begin_pairing_flow() != 21843) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_firefoxaccount_check_authorization_status() != 52519) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_firefoxaccount_clear_access_token_cache() != 36203) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_firefoxaccount_clear_device_name() != 42324) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_firefoxaccount_close_tabs() != 55044) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_firefoxaccount_complete_oauth_flow() != 41338) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_firefoxaccount_disconnect() != 807) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_firefoxaccount_ensure_capabilities() != 807) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_firefoxaccount_gather_telemetry() != 61296) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_firefoxaccount_get_access_token() != 23448) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_firefoxaccount_get_attached_clients() != 14470) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_firefoxaccount_get_auth_state() != 38375) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_firefoxaccount_get_connection_success_url() != 7413) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_firefoxaccount_get_current_device_id() != 45188) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_firefoxaccount_get_devices() != 41982) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_firefoxaccount_get_manage_account_url() != 29173) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_firefoxaccount_get_manage_devices_url() != 42582) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_firefoxaccount_get_pairing_authority_url() != 50743) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_firefoxaccount_get_profile() != 26069) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_firefoxaccount_get_session_token() != 45648) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_firefoxaccount_get_state() != 37802) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_firefoxaccount_get_token_server_endpoint_url() != 42568) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_firefoxaccount_handle_push_message() != 41561) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_firefoxaccount_handle_session_token_change() != 23593) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_firefoxaccount_initialize_device() != 37216) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_firefoxaccount_on_auth_issues() != 21675) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_firefoxaccount_poll_device_commands() != 37725) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_firefoxaccount_process_event() != 31348) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_firefoxaccount_send_single_tab() != 46148) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_firefoxaccount_set_device_name() != 49257) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_firefoxaccount_set_push_subscription() != 65018) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_firefoxaccount_set_user_data() != 1025) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_firefoxaccount_simulate_network_error() != 61828) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_firefoxaccount_simulate_permanent_auth_token_issue() != 25986) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_firefoxaccount_simulate_temporary_auth_token_issue() != 32382) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_firefoxaccount_to_json() != 27972) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_fxastatemachinechecker_check_internal_state() != 47586) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_fxastatemachinechecker_check_public_state() != 35267) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_fxastatemachinechecker_handle_internal_event() != 54231) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_method_fxastatemachinechecker_handle_public_event() != 63696) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_constructor_firefoxaccount_from_json() != 17872) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_constructor_firefoxaccount_new() != 56529) {
return InitializationResult.apiChecksumMismatch
}
if (uniffi_fxa_client_checksum_constructor_fxastatemachinechecker_new() != 33739) {
return InitializationResult.apiChecksumMismatch
}
uniffiEnsureSync15Initialized()
return InitializationResult.ok
}()
// Make the ensure init function public so that other modules which have external type references to
// our types can call it.
public func uniffiEnsureFxaClientInitialized() {
switch initializationResult {
case .ok:
break
case .contractVersionMismatch:
fatalError("UniFFI contract version mismatch: try cleaning and rebuilding your project")
case .apiChecksumMismatch:
fatalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project")
}
}
// swiftlint:enable all