Skip to content

Commit 1bfe15e

Browse files
author
DominicGBauer
committed
chore: merge main
2 parents d6c22bb + 7591c29 commit 1bfe15e

File tree

6 files changed

+116
-40
lines changed

6 files changed

+116
-40
lines changed

Demo/PowerSyncExample/PowerSync/SupabaseConnector.swift

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import Auth
22
import SwiftUI
33
import Supabase
44
import PowerSyncSwift
5-
import PowerSync
65
import AnyCodable
76

87
@Observable
@@ -16,7 +15,6 @@ class SupabaseConnector: PowerSyncBackendConnector {
1615

1716
override init() {
1817
super.init()
19-
2018
observeAuthStateChangesTask = Task { [weak self] in
2119
guard let self = self else { return }
2220

@@ -49,7 +47,7 @@ class SupabaseConnector: PowerSyncBackendConnector {
4947
return PowerSyncCredentials(endpoint: self.powerSyncEndpoint, token: token, userId: currentUserID)
5048
}
5149

52-
override func uploadData(database: PowerSyncDatabase) async throws {
50+
override func uploadData(database: PowerSyncDatabaseProtocol) async throws {
5351

5452
guard let transaction = try await database.getNextCrudTransaction() else { return }
5553

@@ -75,7 +73,7 @@ class SupabaseConnector: PowerSyncBackendConnector {
7573
}
7674
}
7775

78-
try await transaction.complete.invoke(p1: nil)
76+
_ = try await transaction.complete.invoke(p1: nil)
7977

8078
} catch {
8179
print("Data upload error - retrying last entry: \(lastEntry!), \(error)")

Sources/PowerSyncSwift/Kotlin/KotlinPowerSyncDatabaseImpl.swift

Lines changed: 39 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2,110 +2,116 @@ import Foundation
22
import PowerSync
33

44
final class KotlinPowerSyncDatabaseImpl: PowerSyncDatabaseProtocol {
5-
private let kmpDatabase: PowerSync.PowerSyncDatabase
6-
5+
private let kotlinDatabase: PowerSync.PowerSyncDatabase
6+
77
var currentStatus: SyncStatus {
8-
get { kmpDatabase.currentStatus }
8+
get { kotlinDatabase.currentStatus }
99
}
10-
10+
1111
init(
1212
schema: Schema,
1313
dbFilename: String
1414
) {
1515
let factory = PowerSync.DatabaseDriverFactory()
16-
self.kmpDatabase = PowerSyncDatabase(
16+
self.kotlinDatabase = PowerSyncDatabase(
1717
factory: factory,
1818
schema: KotlinAdapter.Schema.toKotlin(schema),
1919
dbFilename: dbFilename
2020
)
2121
}
2222

23+
init(kotlinDatabase: KotlinPowerSyncDatabase) {
24+
self.kotlinDatabase = kotlinDatabase
25+
}
26+
2327
func waitForFirstSync() async throws {
24-
try await kmpDatabase.waitForFirstSync()
28+
try await kotlinDatabase.waitForFirstSync()
2529
}
26-
30+
2731
func connect(
2832
connector: PowerSyncBackendConnector,
2933
crudThrottleMs: Int64 = 1000,
3034
retryDelayMs: Int64 = 5000,
3135
params: [String: JsonParam?] = [:]
3236
) async throws {
33-
try await kmpDatabase.connect(
34-
connector: connector,
37+
let connectorAdapter = PowerSyncBackendConnectorAdapter(swiftBackendConnector: connector)
38+
39+
try await kotlinDatabase.connect(
40+
connector: connectorAdapter,
3541
crudThrottleMs: crudThrottleMs,
3642
retryDelayMs: retryDelayMs,
3743
params: params
3844
)
3945
}
40-
46+
4147
func getCrudBatch(limit: Int32 = 100) async throws -> CrudBatch? {
42-
try await kmpDatabase.getCrudBatch(limit: limit)
48+
try await kotlinDatabase.getCrudBatch(limit: limit)
4349
}
44-
50+
4551
func getNextCrudTransaction() async throws -> CrudTransaction? {
46-
try await kmpDatabase.getNextCrudTransaction()
52+
try await kotlinDatabase.getNextCrudTransaction()
4753
}
48-
54+
4955
func getPowerSyncVersion() async throws -> String {
50-
try await kmpDatabase.getPowerSyncVersion()
56+
try await kotlinDatabase.getPowerSyncVersion()
5157
}
52-
58+
5359
func disconnect() async throws {
54-
try await kmpDatabase.disconnect()
60+
try await kotlinDatabase.disconnect()
5561
}
56-
62+
5763
func disconnectAndClear(clearLocal: Bool = true) async throws {
58-
try await kmpDatabase.disconnectAndClear(clearLocal: clearLocal)
64+
try await kotlinDatabase.disconnectAndClear(clearLocal: clearLocal)
5965
}
60-
66+
6167
func execute(sql: String, parameters: [Any]?) async throws -> Int64 {
62-
Int64(truncating: try await kmpDatabase.execute(sql: sql, parameters: parameters))
68+
Int64(truncating: try await kotlinDatabase.execute(sql: sql, parameters: parameters))
6369
}
64-
70+
6571
func get<RowType>(
6672
sql: String,
6773
parameters: [Any]?,
6874
mapper: @escaping (SqlCursor) -> RowType
6975
) async throws -> RowType {
70-
try await kmpDatabase.get(
76+
try await kotlinDatabase.get(
7177
sql: sql,
7278
parameters: parameters,
7379
mapper: mapper
7480
) as! RowType
7581
}
76-
82+
7783
func getAll<RowType>(
7884
sql: String,
7985
parameters: [Any]?,
8086
mapper: @escaping (SqlCursor) -> RowType
8187
) async throws -> [RowType] {
82-
try await kmpDatabase.getAll(
88+
try await kotlinDatabase.getAll(
8389
sql: sql,
8490
parameters: parameters,
8591
mapper: mapper
8692
) as! [RowType]
8793
}
88-
94+
8995
func getOptional<RowType>(
9096
sql: String,
9197
parameters: [Any]?,
9298
mapper: @escaping (SqlCursor) -> RowType
9399
) async throws -> RowType? {
94-
try await kmpDatabase.getOptional(
100+
try await kotlinDatabase.getOptional(
95101
sql: sql,
96102
parameters: parameters,
97103
mapper: mapper
98104
) as! RowType?
99105
}
100-
106+
101107
func watch<RowType>(
102108
sql: String,
103109
parameters: [Any]?,
104110
mapper: @escaping (SqlCursor) -> RowType
105111
) -> AsyncStream<[RowType]> {
106112
AsyncStream { continuation in
107113
Task {
108-
for await values in self.kmpDatabase.watch(
114+
for await values in self.kotlinDatabase.watch(
109115
sql: sql,
110116
parameters: parameters,
111117
mapper: mapper
@@ -116,15 +122,15 @@ final class KotlinPowerSyncDatabaseImpl: PowerSyncDatabaseProtocol {
116122
}
117123
}
118124
}
119-
125+
120126
public func writeTransaction<R>(callback: @escaping (any PowerSyncTransaction) async throws -> R) async throws -> R {
121-
return try await kmpDatabase.writeTransaction(callback: SuspendTaskWrapper { transaction in
127+
return try await kotlinDatabase.writeTransaction(callback: SuspendTaskWrapper { transaction in
122128
return try await callback(transaction)
123129
}) as! R
124130
}
125-
131+
126132
public func readTransaction<R>(callback: @escaping (any PowerSyncTransaction) async throws -> R) async throws -> R {
127-
return try await kmpDatabase.writeTransaction(callback: SuspendTaskWrapper { transaction in
133+
return try await kotlinDatabase.writeTransaction(callback: SuspendTaskWrapper { transaction in
128134
return try await callback(transaction)
129135
}) as! R
130136
}
@@ -152,4 +158,3 @@ class SuspendTaskWrapper: KotlinSuspendFunction1 {
152158
}
153159
}
154160
}
155-
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import PowerSync
22

3-
public typealias PowerSyncBackendConnector = PowerSync.PowerSyncBackendConnector
3+
public typealias KotlinPowerSyncBackendConnector = PowerSync.PowerSyncBackendConnector
44
public typealias CrudEntry = PowerSync.CrudEntry
55
public typealias CrudBatch = PowerSync.CrudBatch
66
public typealias SyncStatus = PowerSync.SyncStatus
77
public typealias SqlCursor = PowerSync.RuntimeSqlCursor
88
public typealias JsonParam = PowerSync.JsonParam
99
public typealias CrudTransaction = PowerSync.CrudTransaction
10-
public typealias PowerSyncCredentials = PowerSync.PowerSyncCredentials
10+
public typealias KotlinPowerSyncCredentials = PowerSync.PowerSyncCredentials
11+
public typealias KotlinPowerSyncDatabase = PowerSync.PowerSyncDatabase
1112

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
public protocol PowerSyncBackendConnectorProtocol {
2+
func uploadData(database: PowerSyncDatabaseProtocol) async throws
3+
4+
func fetchCredentials() async throws -> PowerSyncCredentials?
5+
}
6+
7+
open class PowerSyncBackendConnector: PowerSyncBackendConnectorProtocol {
8+
public init() {}
9+
10+
open func uploadData(database: PowerSyncDatabaseProtocol) async throws {}
11+
12+
open func fetchCredentials() async throws -> PowerSyncCredentials? {
13+
return nil
14+
}
15+
}
16+
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class PowerSyncBackendConnectorAdapter: KotlinPowerSyncBackendConnector {
2+
let swiftBackendConnector: PowerSyncBackendConnector
3+
4+
init(
5+
swiftBackendConnector: PowerSyncBackendConnector
6+
) {
7+
self.swiftBackendConnector = swiftBackendConnector
8+
}
9+
10+
override func __fetchCredentials() async throws -> KotlinPowerSyncCredentials? {
11+
try await swiftBackendConnector.fetchCredentials()?.kotlinCredentials
12+
}
13+
14+
override func __uploadData(database: KotlinPowerSyncDatabase) async throws {
15+
let swiftDatabase = KotlinPowerSyncDatabaseImpl(kotlinDatabase: database)
16+
try await swiftBackendConnector.uploadData(database: swiftDatabase)
17+
}
18+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import Foundation
2+
3+
public struct PowerSyncCredentials: Codable {
4+
/// PowerSync endpoint, e.g. "https://myinstance.powersync.co".
5+
public let endpoint: String
6+
7+
/// Temporary token to authenticate against the service.
8+
public let token: String
9+
10+
/// User ID.
11+
public let userId: String?
12+
13+
public init(endpoint: String, token: String, userId: String?) {
14+
self.endpoint = endpoint
15+
self.token = token
16+
self.userId = userId
17+
}
18+
19+
internal init(kotlin: KotlinPowerSyncCredentials) {
20+
self.endpoint = kotlin.endpoint
21+
self.token = kotlin.token
22+
self.userId = kotlin.userId
23+
}
24+
25+
internal var kotlinCredentials: KotlinPowerSyncCredentials {
26+
return KotlinPowerSyncCredentials(endpoint: endpoint, token: token, userId: userId)
27+
}
28+
29+
public func endpointUri(path: String) -> String {
30+
return "\(endpoint)/\(path)"
31+
}
32+
}
33+
34+
extension PowerSyncCredentials: CustomStringConvertible {
35+
public var description: String {
36+
return "PowerSyncCredentials<endpoint: \(endpoint) userId: \(userId ?? "nil")>"
37+
}
38+
}

0 commit comments

Comments
 (0)