@@ -92,86 +92,108 @@ const nodeToSupporter = (node) => ({
92
92
} ) ;
93
93
94
94
const getAllNodes = async ( graphqlQuery , getNodes ) => {
95
- const body = {
96
- query : graphqlQuery ,
97
- variables : {
98
- limit : graphqlPageSize ,
99
- offset : 0 ,
100
- dateFrom : new Date (
101
- new Date ( ) . setFullYear ( new Date ( ) . getFullYear ( ) - 1 )
102
- ) . toISOString ( ) , // data from last year
103
- } ,
104
- } ;
105
-
106
- let allNodes = [ ] ;
107
-
108
- let limit = 10 ,
109
- remaining = 10 ,
110
- reset ;
111
- if ( process . env . OPENCOLLECTIVE_API_KEY ) {
112
- limit = 100 ;
113
- remaining = 100 ;
114
- }
115
- // Handling pagination if necessary
116
-
117
- while ( true ) {
118
- if ( remaining === 0 ) {
119
- console . log ( `Rate limit exceeded. Sleeping until ${ new Date ( reset ) } .` ) ;
120
- await new Promise ( ( resolve ) =>
121
- setTimeout ( resolve , reset - Date . now ( ) + 100 )
122
- ) ;
95
+ // Store original value
96
+ const originalTlsRejectUnauthorized =
97
+ process . env . NODE_TLS_REJECT_UNAUTHORIZED ;
98
+ const isCI = process . env . CI === 'true' || ( process . env . CI && process . env . VERCEL ) ;
99
+
100
+ try {
101
+ // Only disable SSL verification in local development
102
+ if ( ! isCI ) {
103
+ process . env . NODE_TLS_REJECT_UNAUTHORIZED = '0' ;
104
+ console . log ( 'Running locally - SSL verification disabled' ) ;
123
105
}
124
- const result = await fetch ( graphqlEndpoint , {
125
- method : 'POST' ,
126
- body : JSON . stringify ( body ) ,
127
- headers : {
128
- 'Content-Type' : 'application/json' ,
106
+
107
+ const body = {
108
+ query : graphqlQuery ,
109
+ variables : {
110
+ limit : graphqlPageSize ,
111
+ offset : 0 ,
112
+ dateFrom : new Date (
113
+ new Date ( ) . setFullYear ( new Date ( ) . getFullYear ( ) - 1 )
114
+ ) . toISOString ( ) , // data from last year
129
115
} ,
130
- } ) . then ( async ( response ) => {
131
- if ( response . headers . get ( 'content-type' ) . includes ( 'json' ) ) {
132
- const json = await response . json ( ) ;
133
- console . log ( 'json' , json ) ;
134
- if ( json . error ) {
135
- // when rate limit exceeded, api won't return headers data like x-ratelimit-limit, etc.
136
- remaining = 0 ;
137
- reset = Date . now ( ) + 1000 * 60 ; // 1 minute
138
- } else {
139
- limit = response . headers . get ( 'x-ratelimit-limit' ) * 1 ;
140
- remaining = response . headers . get ( 'x-ratelimit-remaining' ) * 1 ;
141
- reset = response . headers . get ( 'x-ratelimit-reset' ) * 1000 ;
142
- console . log (
143
- `Rate limit: ${ remaining } /${ limit } remaining. Reset in ${ new Date (
144
- reset
145
- ) } `
146
- ) ;
147
- }
148
- return json ;
149
- } else {
150
- // utilities/fetch-supporters: SyntaxError: Unexpected token < in JSON at position 0
151
- console . log ( 'something wrong when fetching supporters' ) ;
152
- return {
153
- error : {
154
- message : await response . text ( ) ,
155
- } ,
156
- } ;
116
+ } ;
117
+
118
+ let allNodes = [ ] ;
119
+
120
+ let limit = 10 ,
121
+ remaining = 10 ,
122
+ reset ;
123
+ if ( process . env . OPENCOLLECTIVE_API_KEY ) {
124
+ limit = 100 ;
125
+ remaining = 100 ;
126
+ }
127
+ // Handling pagination if necessary
128
+
129
+ while ( true ) {
130
+ if ( remaining === 0 ) {
131
+ console . log ( `Rate limit exceeded. Sleeping until ${ new Date ( reset ) } .` ) ;
132
+ await new Promise ( ( resolve ) =>
133
+ setTimeout ( resolve , reset - Date . now ( ) + 100 )
134
+ ) ;
157
135
}
158
- } ) ;
159
- // when rate limit exceeded, api will return {error: {message: ''}}
160
- // but we could hopefully avoid rate limit by sleeping in the beginning of the loop
161
- // however, when there're multiple task running simultaneously, it's still possible to hit the rate limit
162
- if ( result . error ) {
163
- console . log ( 'error' , result . error ) ;
164
- // let the loop continue
165
- } else {
166
- const nodes = getNodes ( result . data ) ;
167
- allNodes = [ ...allNodes , ...nodes ] ;
168
- body . variables . offset += graphqlPageSize ;
169
- if ( nodes . length < graphqlPageSize ) {
170
- return allNodes ;
136
+ const fetchOptions = {
137
+ method : 'POST' ,
138
+ body : JSON . stringify ( body ) ,
139
+ headers : {
140
+ 'Content-Type' : 'application/json' ,
141
+ } ,
142
+ } ;
143
+
144
+ const result = await fetch ( graphqlEndpoint , fetchOptions ) . then (
145
+ async ( response ) => {
146
+ if ( response . headers . get ( 'content-type' ) . includes ( 'json' ) ) {
147
+ const json = await response . json ( ) ;
148
+ console . log ( 'json' , json ) ;
149
+ if ( json . error ) {
150
+ // when rate limit exceeded, api won't return headers data like x-ratelimit-limit, etc.
151
+ remaining = 0 ;
152
+ reset = Date . now ( ) + 1000 * 60 ; // 1 minute
153
+ } else {
154
+ limit = response . headers . get ( 'x-ratelimit-limit' ) * 1 ;
155
+ remaining = response . headers . get ( 'x-ratelimit-remaining' ) * 1 ;
156
+ reset = response . headers . get ( 'x-ratelimit-reset' ) * 1000 ;
157
+ console . log (
158
+ `Rate limit: ${ remaining } /${ limit } remaining. Reset in ${ new Date (
159
+ reset
160
+ ) } `
161
+ ) ;
162
+ }
163
+ return json ;
164
+ } else {
165
+ // utilities/fetch-supporters: SyntaxError: Unexpected token < in JSON at position 0
166
+ console . log ( 'something wrong when fetching supporters' ) ;
167
+ return {
168
+ error : {
169
+ message : await response . text ( ) ,
170
+ } ,
171
+ } ;
172
+ }
173
+ }
174
+ ) ;
175
+ // when rate limit exceeded, api will return {error: {message: ''}}
176
+ // but we could hopefully avoid rate limit by sleeping in the beginning of the loop
177
+ // however, when there're multiple task running simultaneously, it's still possible to hit the rate limit
178
+ if ( result . error ) {
179
+ console . log ( 'error' , result . error ) ;
180
+ // let the loop continue
171
181
} else {
172
- // more nodes to fetch
182
+ const nodes = getNodes ( result . data ) ;
183
+ allNodes = [ ...allNodes , ...nodes ] ;
184
+ body . variables . offset += graphqlPageSize ;
185
+ if ( nodes . length < graphqlPageSize ) {
186
+ return allNodes ;
187
+ } else {
188
+ // more nodes to fetch
189
+ }
173
190
}
174
191
}
192
+ } finally {
193
+ // Only restore if we modified it
194
+ if ( ! isCI ) {
195
+ process . env . NODE_TLS_REJECT_UNAUTHORIZED = originalTlsRejectUnauthorized ;
196
+ }
175
197
}
176
198
} ;
177
199
0 commit comments