@@ -4,38 +4,50 @@ import * as deepmerge from 'deepmerge';
4
4
import * as getNested from 'get-nested' ;
5
5
import { stringify } from 'query-string' ;
6
6
import SiteInitializeParams from './SiteInitializeParams' ;
7
+ import HnServerResponse from './HnServerResponse' ;
7
8
8
9
polyfill ( ) ;
9
10
10
11
const propertiesToHydrate = [ 'tokensToVerify' , 'user' , 'data' ] ;
11
12
12
13
class Site {
13
14
14
- private initialized : boolean = false ;
15
+ private initialized : boolean ;
15
16
16
17
// Created when initializing
17
18
private url : string ;
18
19
19
20
// Can be hydrated and dehydrated
20
- private tokensToVerify : string [ ] = [ ] ;
21
+ private tokensToVerify : string [ ] ;
21
22
private user : string ;
22
- private data = {
23
- data : { } ,
24
- paths : { } ,
25
- } ;
23
+ private data : HnServerResponse ;
26
24
27
25
// Not hydrated
28
- private pagesLoading = { } ;
26
+ private pagesLoading : { [ s : string ] : Promise < string > } ;
29
27
30
28
constructor ( initParams ?: SiteInitializeParams ) {
29
+ this . reset ( ) ;
31
30
if ( initParams ) this . initialize ( initParams ) ;
32
31
}
33
32
34
33
initialize ( { url } : SiteInitializeParams ) {
34
+ if ( this . initialized ) throw Error ( 'The site is already initialized.' ) ;
35
35
this . initialized = true ;
36
36
this . url = url ;
37
37
}
38
38
39
+ reset ( ) {
40
+ this . initialized = false ;
41
+ this . url = null ;
42
+ this . tokensToVerify = [ ] ;
43
+ this . user = null ;
44
+ this . data = {
45
+ data : { } ,
46
+ paths : { } ,
47
+ } ;
48
+ this . pagesLoading = { } ;
49
+ }
50
+
39
51
/**
40
52
* Creates an object that can be hydrated by the hydrate function.
41
53
*/
@@ -56,7 +68,7 @@ class Site {
56
68
} ) ;
57
69
}
58
70
59
- private fetch ( path , options = { } ) : Promise < object > {
71
+ private fetch ( path , options = { } ) : Promise < HnServerResponse > {
60
72
if ( ! this . initialized ) {
61
73
throw Error ( 'Site is not intitialized. Pass an object when creating a site, or use the ' +
62
74
'initialize method.' ) ;
@@ -77,7 +89,7 @@ class Site {
77
89
} ) ;
78
90
}
79
91
80
- public getPage ( path , loadFromServer = false ) : Promise < void > {
92
+ public getPage ( path , loadFromServer = false ) : Promise < string > {
81
93
if ( ! this . pagesLoading [ path ] ) {
82
94
const dataMaybeAlreadyLoaded = getNested ( ( ) => this . data . data [ this . data . paths [ path ] ] ) ;
83
95
if ( getNested ( ( ) => dataMaybeAlreadyLoaded . __hn . view_modes . includes ( 'default' ) ) ) {
@@ -96,16 +108,16 @@ class Site {
96
108
_hn_user : this . user ? this . user : undefined ,
97
109
_hn_verify : tokensToVerify ,
98
110
} ) )
99
- . then ( ( page : Response ) => {
111
+ . then ( ( page : HnServerResponse ) => {
100
112
101
113
// Get the user id, to pass to all new requests.
102
- this . user = getNested ( ( ) => page [ ' __hn' ] . request . user , this . user ) ;
114
+ this . user = getNested ( ( ) => page . __hn . request . user , this . user ) ;
103
115
104
116
// Remove all sent tokens from the tokensToVerify.
105
117
this . tokensToVerify = this . tokensToVerify . filter ( t => tokensToVerify . indexOf ( t ) === - 1 ) ;
106
118
107
119
// Add new token to tokensToVerify.
108
- const newToken = getNested ( ( ) => page [ ' __hn' ] . request . token ) ;
120
+ const newToken = getNested ( ( ) => page . __hn . request . token ) ;
109
121
if ( newToken ) this . tokensToVerify . push ( newToken ) ;
110
122
111
123
// Add all data to the global data storage.
@@ -119,12 +131,13 @@ class Site {
119
131
[ path ] : '500' ,
120
132
} ,
121
133
} ) ;
122
- } ) ;
134
+ } )
135
+ . then ( ( ) => this . data . paths [ path ] ) ;
123
136
}
124
- return this . pagesLoading [ path ] . then ( ( ) => this . data . paths [ path ] ) ;
137
+ return this . pagesLoading [ path ] ;
125
138
}
126
139
127
- private addData ( data : object ) {
140
+ private addData ( data : HnServerResponse ) {
128
141
this . data = deepmerge ( this . data , data , { arrayMerge : ( a , b ) => b } ) ;
129
142
}
130
143
0 commit comments