1
+ import { stat } from "fs/promises"
1
2
import { createReadStream , createWriteStream } from "fs"
2
3
import { once } from "events"
3
4
import fetch , { Request } from "node-fetch"
@@ -12,13 +13,15 @@ import fetch, { Request } from "node-fetch"
12
13
* @returns {Request } Configured fetch Request object
13
14
*/
14
15
export function keyRequest ( state , key , options ) {
15
- const headers = new Headers ( )
16
+ const headers = new Headers (
17
+ "headers" in options && options . headers || undefined ,
18
+ )
16
19
headers . set (
17
20
"Authorization" ,
18
21
"Basic " + Buffer . from ( `openneuro-cli:${ state . token } ` ) . toString ( "base64" ) ,
19
22
)
20
23
const requestUrl = `${ state . url } /annex/${ key } `
21
- return new Request ( requestUrl , { headers , ...options } )
24
+ return new Request ( requestUrl , { ...options , headers } )
22
25
}
23
26
24
27
/**
@@ -30,13 +33,16 @@ export function keyRequest(state, key, options) {
30
33
* @param {string } file File path
31
34
*/
32
35
export async function storeKey ( state , key , file ) {
36
+ const fileStat = await stat ( file )
33
37
const body = createReadStream ( file )
34
38
const requestOptions = {
35
- body,
36
39
method : "POST" ,
40
+ headers : {
41
+ "Content-Length" : fileStat . size ,
42
+ } ,
37
43
}
38
44
const request = keyRequest ( state , key , requestOptions )
39
- const response = await fetch ( request )
45
+ const response = await fetch ( request , { body } )
40
46
if ( response . status === 200 ) {
41
47
return true
42
48
} else {
@@ -58,9 +64,8 @@ export async function retrieveKey(state, key, file) {
58
64
const response = await fetch ( request )
59
65
if ( response . status === 200 ) {
60
66
const writable = createWriteStream ( file )
61
- const readable = await response . readable ( )
62
- readable . pipe ( writable )
63
- await once ( readable , "close" )
67
+ response . body . pipe ( writable )
68
+ await once ( response . body , "close" )
64
69
return true
65
70
} else {
66
71
return false
0 commit comments