@@ -20,7 +20,7 @@ open class Client {
20
20
21
21
open var headers : [ String : String ] = [
22
22
" content-type " : " " ,
23
- " x-sdk-version " : " appwrite:swift:0.3.1 " ,
23
+ " x-sdk-version " : " appwrite:swift:0.4.0 " ,
24
24
" X-Appwrite-Response-Format " : " 0.13.0 "
25
25
]
26
26
@@ -264,7 +264,7 @@ open class Client {
264
264
headers: [ String : String ] = [ : ] ,
265
265
params: [ String : Any ? ] = [ : ] ,
266
266
sink: ( ( ByteBuffer ) -> Void ) ? = nil ,
267
- convert : ( ( [ String : Any ] ) -> T ) ? = nil
267
+ converter : ( ( [ String : Any ] ) -> T ) ? = nil
268
268
) async throws -> T {
269
269
let validParams = params. filter { $0. value != nil }
270
270
@@ -283,12 +283,12 @@ open class Client {
283
283
request. addDomainCookies ( )
284
284
285
285
if " GET " == method {
286
- return try await execute ( request, convert : convert )
286
+ return try await execute ( request, converter : converter )
287
287
}
288
288
289
289
try buildBody ( for: & request, with: validParams)
290
290
291
- return try await execute ( request, withSink: sink, convert : convert )
291
+ return try await execute ( request, withSink: sink, converter : converter )
292
292
}
293
293
294
294
private func buildBody(
@@ -305,7 +305,7 @@ open class Client {
305
305
private func execute< T> (
306
306
_ request: HTTPClientRequest ,
307
307
withSink bufferSink: ( ( ByteBuffer ) -> Void ) ? = nil ,
308
- convert : ( ( [ String : Any ] ) -> T ) ? = nil
308
+ converter : ( ( [ String : Any ] ) -> T ) ? = nil
309
309
) async throws -> T {
310
310
func complete( with response: HTTPClientResponse ) async throws -> T {
311
311
switch response. status. code {
@@ -325,7 +325,7 @@ open class Client {
325
325
let data = try await response. body. collect ( upTo: Int . max)
326
326
let dict = try JSONSerialization . jsonObject ( with: data) as? [ String : Any ]
327
327
328
- return convert ? ( dict!) ?? dict! as! T
328
+ return converter ? ( dict!) ?? dict! as! T
329
329
}
330
330
default :
331
331
var message = " "
@@ -366,7 +366,8 @@ open class Client {
366
366
headers: inout [ String : String ] ,
367
367
params: inout [ String : Any ? ] ,
368
368
paramName: String ,
369
- convert: ( ( [ String : Any ] ) -> T ) ? = nil ,
369
+ idParamName: String ? = nil ,
370
+ converter: ( ( [ String : Any ] ) -> T ) ? = nil ,
370
371
onProgress: ( ( UploadProgress ) -> Void ) ? = nil
371
372
) async throws -> T {
372
373
let file = params [ paramName] as! File
@@ -378,18 +379,31 @@ open class Client {
378
379
path: path,
379
380
headers: headers,
380
381
params: params,
381
- convert : convert
382
+ converter : converter
382
383
)
383
384
}
384
385
385
- var input = file. buffer
386
+ let input = file. buffer
386
387
var offset = 0
387
388
var result = [ String: Any] ( )
388
389
389
- while offset < size {
390
- let slice = input. readSlice ( length: Client . chunkSize)
391
- ?? input. readSlice ( length: Int ( size - offset) )
390
+ if idParamName != nil && params [ idParamName!] as! String != " unique() " {
391
+ // Make a request to check if a file already exists
392
+ let map = try ! await call (
393
+ method: " GET " ,
394
+ path: path + " / " + ( params [ idParamName!] as! String ) ,
395
+ headers: headers,
396
+ params: [ : ] ,
397
+ converter: { return $0 }
398
+ )
399
+ let chunksUploaded = map [ " chunksUploaded " ] as! Int
400
+ offset = min ( size, ( chunksUploaded * Client. chunkSize) )
401
+ }
392
402
403
+ while offset < size {
404
+ let slice = input. getSlice ( at: offset, length: Client . chunkSize)
405
+ ?? input. getSlice ( at: offset, length: Int ( size - offset) )
406
+
393
407
params [ paramName] = File (
394
408
name: file. name,
395
409
buffer: slice!
@@ -402,7 +416,7 @@ open class Client {
402
416
path: path,
403
417
headers: headers,
404
418
params: params,
405
- convert : { return $0 }
419
+ converter : { return $0 }
406
420
)
407
421
408
422
offset += Client . chunkSize
@@ -416,7 +430,7 @@ open class Client {
416
430
) )
417
431
}
418
432
419
- return convert !( result)
433
+ return converter !( result)
420
434
}
421
435
422
436
private static func randomBoundary( ) -> String {
0 commit comments