1
1
import * as initDebug from 'debug' ;
2
2
import * as _fetch from 'node-fetch' ;
3
- import { IContentRangeType , IHeadRequestInfo , IRangeRequestResponse } from '@tokenizer/range' ; // Add 'fetch' API for node.js
4
- import { IHttpClient } from './types' ;
3
+ import { IContentRangeType , IHeadRequestInfo , IRangeRequestResponse , IRangeRequestClient , parseContentRange } from '@tokenizer/range' ; // Add 'fetch' API for node.js
5
4
6
5
const debug = initDebug ( 'streaming-http-token-reader:http-client' ) ;
7
6
8
- export function parseContentRange ( contentRange : string ) : IContentRangeType {
9
- debug ( `_parseContentRang response: contentRange=${ contentRange } ` ) ;
10
-
11
- if ( contentRange ) {
12
- const parsedContentRange = contentRange . match (
13
- / b y t e s ( \d + ) - ( \d + ) \/ (?: ( \d + ) | \* ) / i
14
- ) ;
15
- if ( ! parsedContentRange ) {
16
- throw new Error ( 'FIXME: Unknown Content-Range syntax: ' + contentRange ) ;
17
- }
18
-
19
- return {
20
- firstBytePosition : parseInt ( parsedContentRange [ 1 ] , 10 ) ,
21
- lastBytePosition : parseInt ( parsedContentRange [ 2 ] , 10 ) ,
22
- instanceLength : parsedContentRange [ 3 ] ? parseInt ( parsedContentRange [ 3 ] , 10 ) : null
23
- } ;
24
- } else {
25
- return null ;
26
- }
27
- }
28
-
29
7
/**
30
8
* Simple HTTP-client, which both works in node.js and browser
31
9
*/
32
- export class HttpClient implements IHttpClient {
10
+ export class HttpClient implements IRangeRequestClient {
33
11
34
12
private static getContentLength ( headers : _fetch . Headers ) : number {
35
13
const contentLength = headers . get ( 'Content-Length' ) ;
@@ -57,14 +35,13 @@ export class HttpClient implements IHttpClient {
57
35
constructor ( private url : string ) {
58
36
}
59
37
60
- public getHeadInfo ( ) : Promise < IHeadRequestInfo > {
61
- return _fetch ( this . url , { method : 'HEAD' } ) . then ( resp => {
62
- this . resolvedUrl = resp . url ;
63
- return HttpClient . makeResponse ( resp ) ;
64
- } ) ;
38
+ public async getHeadInfo ( ) : Promise < IHeadRequestInfo > {
39
+ const response = await _fetch ( this . url , { method : 'HEAD' } ) ;
40
+ this . resolvedUrl = response . url ;
41
+ return HttpClient . makeResponse ( response ) ;
65
42
}
66
43
67
- public getResponse ( method : string , range ?: [ number , number ] ) : Promise < IRangeRequestResponse > {
44
+ public async getResponse ( method : string , range ?: [ number , number ] ) : Promise < IRangeRequestResponse > {
68
45
if ( range ) {
69
46
debug ( `_getResponse ${ method } ${ range [ 0 ] } ..${ range [ 1 ] } ` ) ;
70
47
} else {
@@ -74,14 +51,13 @@ export class HttpClient implements IHttpClient {
74
51
const headers = new _fetch . Headers ( ) ;
75
52
headers . set ( 'Range' , 'bytes=' + range [ 0 ] + '-' + range [ 1 ] ) ;
76
53
77
- return _fetch ( this . resolvedUrl || this . url , { method, headers} ) . then ( response => {
78
- if ( response . ok ) {
79
- this . resolvedUrl = response . url ;
80
- return HttpClient . makeResponse ( response ) ;
81
- } else {
82
- throw new Error ( `Unexpected HTTP response status=${ response . status } ` ) ;
83
- }
84
- } ) ;
54
+ const response = await _fetch ( this . resolvedUrl || this . url , { method, headers} ) ;
55
+ if ( response . ok ) {
56
+ this . resolvedUrl = response . url ;
57
+ return HttpClient . makeResponse ( response ) ;
58
+ } else {
59
+ throw new Error ( `Unexpected HTTP response status=${ response . status } ` ) ;
60
+ }
85
61
}
86
62
87
63
}
0 commit comments