1
1
import { Models } from './models' ;
2
- import { Payload } from './payload' ;
3
- import { MultipartParser } from './multipart' ;
4
2
5
3
/**
6
4
* Payload type representing a key-value pair with string keys and any values.
7
5
*/
8
- type Params = {
6
+ type Payload = {
9
7
[ key : string ] : any ;
10
8
}
11
9
@@ -576,7 +574,7 @@ class Client {
576
574
}
577
575
}
578
576
579
- async prepareRequest ( method : string , url : URL , headers : Headers = { } , params : Params = { } ) : Promise < { uri : string , options : RequestInit } > {
577
+ prepareRequest ( method : string , url : URL , headers : Headers = { } , params : Payload = { } ) : { uri : string , options : RequestInit } {
580
578
method = method . toUpperCase ( ) ;
581
579
582
580
headers = Object . assign ( { } , this . headers , headers ) ;
@@ -607,63 +605,56 @@ class Client {
607
605
case 'multipart/form-data' :
608
606
const formData = new FormData ( ) ;
609
607
610
- for ( const [ name , value ] of Object . entries ( params ) ) {
611
- if ( value instanceof Payload ) {
612
- if ( value . filename ) {
613
- formData . append ( name , await value . toFile ( ) , value . filename ) ;
614
- } else {
615
- formData . append ( name , await value . toString ( ) ) ;
616
- }
608
+ for ( const [ key , value ] of Object . entries ( params ) ) {
609
+ if ( value instanceof File ) {
610
+ formData . append ( key , value , value . name ) ;
617
611
} else if ( Array . isArray ( value ) ) {
618
612
for ( const nestedValue of value ) {
619
- formData . append ( `${ name } []` , nestedValue ) ;
613
+ formData . append ( `${ key } []` , nestedValue ) ;
620
614
}
621
615
} else {
622
- formData . append ( name , value ) ;
616
+ formData . append ( key , value ) ;
623
617
}
624
618
}
625
-
619
+
626
620
options . body = formData ;
627
621
delete headers [ 'content-type' ] ;
628
- headers [ 'accept' ] = 'multipart/form-data' ;
629
622
break ;
630
623
}
631
624
}
632
625
633
626
return { uri : url . toString ( ) , options } ;
634
627
}
635
628
636
- async chunkedUpload ( method : string , url : URL , headers : Headers = { } , params : Params = { } , onProgress : ( progress : UploadProgress ) => void ) {
637
- const entry = Object . entries ( params ) . find ( ( [ _key , value ] ) => value instanceof Payload ) ;
638
- if ( ! entry ) {
639
- throw new Error ( 'No payload found in params' ) ;
640
- }
629
+ async chunkedUpload ( method : string , url : URL , headers : Headers = { } , originalPayload : Payload = { } , onProgress : ( progress : UploadProgress ) => void ) {
630
+ const file = Object . values ( originalPayload ) . find ( ( value ) => value instanceof File ) ;
641
631
642
- const [ paramName , payload ] = entry as [ string , Payload ] ;
643
-
644
- if ( payload . size <= Client . CHUNK_SIZE ) {
645
- return await this . call ( method , url , headers , params ) ;
632
+ if ( file . size <= Client . CHUNK_SIZE ) {
633
+ return await this . call ( method , url , headers , originalPayload ) ;
646
634
}
647
635
648
636
let start = 0 ;
649
637
let response = null ;
650
638
651
- while ( start < payload . size ) {
652
- const end = Math . min ( start + Client . CHUNK_SIZE , payload . size ) ;
639
+ while ( start < file . size ) {
640
+ let end = start + Client . CHUNK_SIZE ; // Prepare end for the next chunk
641
+ if ( end >= file . size ) {
642
+ end = file . size ; // Adjust for the last chunk to include the last byte
643
+ }
653
644
654
- headers [ 'content-range' ] = `bytes ${ start } -${ end - 1 } /${ payload . size } ` ;
645
+ headers [ 'content-range' ] = `bytes ${ start } -${ end - 1 } /${ file . size } ` ;
646
+ const chunk = file . slice ( start , end ) ;
655
647
656
- const buffer = await payload . toBinary ( start , end - start ) ;
657
- params [ paramName ] = Payload . fromBinary ( buffer , payload . filename ) ;
648
+ let payload = { ...originalPayload , file : new File ( [ chunk ] , file . name ) } ;
658
649
659
- response = await this . call ( method , url , headers , params ) ;
650
+ response = await this . call ( method , url , headers , payload ) ;
660
651
661
652
if ( onProgress && typeof onProgress === 'function' ) {
662
653
onProgress ( {
663
654
$id : response . $id ,
664
- progress : Math . round ( ( end / payload . size ) * 100 ) ,
655
+ progress : Math . round ( ( end / file . size ) * 100 ) ,
665
656
sizeUploaded : end ,
666
- chunksTotal : Math . ceil ( payload . size / Client . CHUNK_SIZE ) ,
657
+ chunksTotal : Math . ceil ( file . size / Client . CHUNK_SIZE ) ,
667
658
chunksUploaded : Math . ceil ( end / Client . CHUNK_SIZE )
668
659
} ) ;
669
660
}
@@ -678,8 +669,12 @@ class Client {
678
669
return response ;
679
670
}
680
671
681
- async call ( method : string , url : URL , headers : Headers = { } , params : Params = { } , responseType = 'json' ) : Promise < any > {
682
- const { uri, options } = await this . prepareRequest ( method , url , headers , params ) ;
672
+ async ping ( ) : Promise < string > {
673
+ return this . call ( 'GET' , new URL ( this . config . endpoint + '/ping' ) ) ;
674
+ }
675
+
676
+ async call ( method : string , url : URL , headers : Headers = { } , params : Payload = { } , responseType = 'json' ) : Promise < any > {
677
+ const { uri, options } = this . prepareRequest ( method , url , headers , params ) ;
683
678
684
679
let data : any = null ;
685
680
@@ -692,12 +687,6 @@ class Client {
692
687
693
688
if ( response . headers . get ( 'content-type' ) ?. includes ( 'application/json' ) ) {
694
689
data = await response . json ( ) ;
695
-
696
- } else if ( response . headers . get ( 'content-type' ) ?. includes ( 'multipart/form-data' ) ) {
697
- const buffer = await response . arrayBuffer ( ) ;
698
- const multipart = new MultipartParser ( buffer , response . headers . get ( 'content-type' ) ! ) ;
699
- data = multipart . toObject ( ) ;
700
-
701
690
} else if ( responseType === 'arrayBuffer' ) {
702
691
data = await response . arrayBuffer ( ) ;
703
692
} else {
@@ -720,8 +709,8 @@ class Client {
720
709
return data ;
721
710
}
722
711
723
- static flatten ( data : Params , prefix = '' ) : Params {
724
- let output : Params = { } ;
712
+ static flatten ( data : Payload , prefix = '' ) : Payload {
713
+ let output : Payload = { } ;
725
714
726
715
for ( const [ key , value ] of Object . entries ( data ) ) {
727
716
let finalKey = prefix ? prefix + '[' + key + ']' : key ;
@@ -738,6 +727,6 @@ class Client {
738
727
739
728
export { Client , AppwriteException } ;
740
729
export { Query } from './query' ;
741
- export type { Models , Params , UploadProgress } ;
730
+ export type { Models , Payload , UploadProgress } ;
742
731
export type { RealtimeResponseEvent } ;
743
732
export type { QueryTypes , QueryTypesList } from './query' ;
0 commit comments