Skip to content

Commit cbfa135

Browse files
authored
Add callback for node20 timeouts in npm registry (#377)
* Add callback npm registry * Update test methods * Better event listener handling, adding event emitter to tests
1 parent 9f5f3eb commit cbfa135

File tree

4 files changed

+57
-12
lines changed

4 files changed

+57
-12
lines changed

common-npm-packages/packaging-common/Tests/npm/npmL0.ts

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import * as assert from "assert";
22
import * as mocker from "azure-pipelines-task-lib/lib-mocker";
33

44
import Lazy_NpmRegistry = require('../../npm/npmregistry');
5+
const EventEmitter = require('events');
56

67
const BASIC_AUTH_PAT_PASSWD_REGEX = /\/\/.*\/:_password=.*/g;
78
const BEARER_AUTH_REGEX = /\/\/.*\/:_authToken=AUTHTOKEN.*/g;
@@ -160,12 +161,20 @@ export function npmcommon() {
160161
HttpClient: function() {
161162
return {
162163
get: function(url, headers) {
164+
const emitter = new EventEmitter();
165+
process.nextTick(() => {
166+
emitter.emit('data', 'somedata');
167+
emitter.emit('end');
168+
});
163169
return {
164170
then: function(handler) {
165171
handler({
166172
message: {
167173
statusCode: 401,
168-
rawHeaders: ['x-tfs-foo: abc', 'x-content-type-options: nosniff', 'X-Powered-By: ASP.NET']
174+
rawHeaders: ['x-tfs-foo: abc', 'x-content-type-options: nosniff', 'X-Powered-By: ASP.NET'],
175+
on: emitter.on.bind(emitter),
176+
once: emitter.once.bind(emitter),
177+
removeListener: emitter.removeListener.bind(emitter)
169178
}
170179
});
171180
}
@@ -215,12 +224,20 @@ export function npmcommon() {
215224
HttpClient: function() {
216225
return {
217226
get: function(url, headers) {
227+
const emitter = new EventEmitter();
228+
process.nextTick(() => {
229+
emitter.emit('data', 'somedata');
230+
emitter.emit('end');
231+
});
218232
return {
219233
then: function(handler) {
220234
handler({
221235
message: {
222236
statusCode: 401,
223-
rawHeaders: ['x-content-type-options: nosniff', 'X-Powered-By: ASP.NET']
237+
rawHeaders: ['x-content-type-options: nosniff', 'X-Powered-By: ASP.NET'],
238+
on: emitter.on.bind(emitter),
239+
once: emitter.once.bind(emitter),
240+
removeListener: emitter.removeListener.bind(emitter)
224241
}
225242
});
226243
}

common-npm-packages/packaging-common/npm/npmregistry.ts

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -107,13 +107,41 @@ export class NpmRegistry implements INpmRegistry {
107107
headers['X-TFS-FedAuthRedirect'] = 'Suppress';
108108

109109
const endpointClient = new HttpClient(tl.getVariable('AZURE_HTTP_USER_AGENT'), null, requestOptions);
110-
try {
111-
const resp = await endpointClient.get(endpointUri, headers);
112-
return resp.message.rawHeaders !== null && resp.message.rawHeaders.some( t => t.toLowerCase().indexOf('x-tfs') >= 0 || t.toLowerCase().indexOf('x-vss') >= 0 );
113-
} catch (error) {
114-
tl.debug(error);
115-
return false;
116-
}
110+
111+
return new Promise<boolean>((resolve, reject) => {
112+
try {
113+
endpointClient.get(endpointUri, headers).then((res) => {
114+
if (res.message.statusCode) {
115+
// Define event listener functions
116+
const onData = () => {};
117+
const onEnd = () => {
118+
cleanup();
119+
resolve (res.message.rawHeaders !== null && res.message.rawHeaders.some(t => t.toLowerCase().indexOf('x-tfs') >= 0 || t.toLowerCase().indexOf('x-vss') >= 0));
120+
};
121+
const onError = (err) => {
122+
cleanup();
123+
throw(err);
124+
};
125+
126+
const cleanup = () => {
127+
res.message.removeListener('data', onData);
128+
res.message.removeListener('end', onEnd);
129+
res.message.removeListener('error', onError);
130+
};
131+
132+
// Attach event listeners
133+
res.message.on('data', onData);
134+
res.message.once('end', onEnd);
135+
res.message.once('error', onError);
136+
} else {
137+
throw new Error('No status code received from the response');
138+
}
139+
});
140+
} catch (error) {
141+
tl.debug(error);
142+
reject(false);
143+
}
144+
});
117145
}
118146

119147
public static async FromFeedId(packagingUri: string, feedId: string, project: string, authOnly?: boolean, useSession?: boolean): Promise<NpmRegistry> {

common-npm-packages/packaging-common/package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

common-npm-packages/packaging-common/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "azure-pipelines-tasks-packaging-common",
3-
"version": "3.245.0",
3+
"version": "3.245.1",
44
"description": "Azure Pipelines Packaging Tasks Common",
55
"scripts": {
66
"test": "mocha _build/Tests/L0.js",

0 commit comments

Comments
 (0)