@matterbridge/utils 3.9.3-dev-20260627-f5f8623 → 3.9.3-dev-20260627-5d60de5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,36 +3,50 @@ export async function getGitHubUpdate(branch, file, timeout = 10000) {
3
3
  const https = await import('node:https');
4
4
  return new Promise((resolve, reject) => {
5
5
  const url = `https://matterbridge.io/${branch}_${file}`;
6
- const controller = new AbortController();
7
- const timeoutId = setTimeout(() => {
8
- controller.abort();
9
- reject(new Error(`Request timed out after ${timeout / 1000} seconds`));
10
- }, timeout);
11
- const req = https.get(url, { signal: controller.signal }, (res) => {
6
+ let settled = false;
7
+ let req;
8
+ let timeoutId;
9
+ const rejectOnce = (error) => {
10
+ if (settled)
11
+ return;
12
+ settled = true;
13
+ clearTimeout(timeoutId);
14
+ reject(error);
15
+ };
16
+ const resolveOnce = (updateJson) => {
17
+ if (settled)
18
+ return;
19
+ settled = true;
20
+ clearTimeout(timeoutId);
21
+ resolve(updateJson);
22
+ };
23
+ const timeoutError = new Error(`Request timed out after ${timeout / 1000} seconds`);
24
+ timeoutId = setTimeout(() => {
25
+ req?.destroy?.(timeoutError);
26
+ rejectOnce(timeoutError);
27
+ }, timeout).unref();
28
+ req = https.get(url, {}, (res) => {
12
29
  let data = '';
13
30
  if (res.statusCode !== 200) {
14
- clearTimeout(timeoutId);
15
31
  res.resume();
16
- reject(new Error(`Failed to fetch data. Status code: ${res.statusCode}`));
32
+ rejectOnce(new Error(`Failed to fetch data. Status code: ${res.statusCode}`));
17
33
  return;
18
34
  }
19
35
  res.on('data', (chunk) => {
20
36
  data += chunk;
21
37
  });
22
38
  res.on('end', () => {
23
- clearTimeout(timeoutId);
24
39
  try {
25
40
  const jsonData = JSON.parse(data);
26
- resolve(jsonData);
41
+ resolveOnce(jsonData);
27
42
  }
28
43
  catch (error) {
29
- reject(new Error(`Failed to parse response JSON: ${getErrorMessage(error)}`));
44
+ rejectOnce(new Error(`Failed to parse response JSON: ${getErrorMessage(error)}`));
30
45
  }
31
46
  });
32
47
  });
33
48
  req.on('error', (error) => {
34
- clearTimeout(timeoutId);
35
- reject(new Error(`Request failed: ${getErrorMessage(error)}`));
49
+ rejectOnce(new Error(`Request failed: ${getErrorMessage(error)}`));
36
50
  });
37
51
  });
38
52
  }
@@ -3,42 +3,56 @@ export async function getNpmPackageVersion(packageName, tag = 'latest', timeout
3
3
  const https = await import('node:https');
4
4
  return new Promise((resolve, reject) => {
5
5
  const url = `https://registry.npmjs.org/${packageName}`;
6
- const controller = new AbortController();
7
- const timeoutId = setTimeout(() => {
8
- controller.abort();
9
- reject(new Error(`Request timed out after ${timeout / 1000} seconds`));
10
- }, timeout);
11
- const req = https.get(url, { signal: controller.signal }, (res) => {
6
+ let settled = false;
7
+ let req;
8
+ let timeoutId;
9
+ const rejectOnce = (error) => {
10
+ if (settled)
11
+ return;
12
+ settled = true;
13
+ clearTimeout(timeoutId);
14
+ reject(error);
15
+ };
16
+ const resolveOnce = (version) => {
17
+ if (settled)
18
+ return;
19
+ settled = true;
20
+ clearTimeout(timeoutId);
21
+ resolve(version);
22
+ };
23
+ const timeoutError = new Error(`Request timed out after ${timeout / 1000} seconds`);
24
+ timeoutId = setTimeout(() => {
25
+ req?.destroy?.(timeoutError);
26
+ rejectOnce(timeoutError);
27
+ }, timeout).unref();
28
+ req = https.get(url, {}, (res) => {
12
29
  let data = '';
13
30
  if (res.statusCode !== 200) {
14
- clearTimeout(timeoutId);
15
31
  res.resume();
16
- reject(new Error(`Failed to fetch data. Status code: ${res.statusCode}`));
32
+ rejectOnce(new Error(`Failed to fetch data. Status code: ${res.statusCode}`));
17
33
  return;
18
34
  }
19
35
  res.on('data', (chunk) => {
20
36
  data += chunk;
21
37
  });
22
38
  res.on('end', () => {
23
- clearTimeout(timeoutId);
24
39
  try {
25
40
  const jsonData = JSON.parse(data);
26
41
  const version = jsonData['dist-tags']?.[tag];
27
42
  if (version) {
28
- resolve(version);
43
+ resolveOnce(version);
29
44
  }
30
45
  else {
31
- reject(new Error(`Tag "${tag}" not found for package "${packageName}"`));
46
+ rejectOnce(new Error(`Tag "${tag}" not found for package "${packageName}"`));
32
47
  }
33
48
  }
34
49
  catch (error) {
35
- reject(new Error(`Failed to parse response JSON: ${getErrorMessage(error)}`));
50
+ rejectOnce(new Error(`Failed to parse response JSON: ${getErrorMessage(error)}`));
36
51
  }
37
52
  });
38
53
  });
39
54
  req.on('error', (error) => {
40
- clearTimeout(timeoutId);
41
- reject(new Error(`Request failed: ${getErrorMessage(error)}`));
55
+ rejectOnce(new Error(`Request failed: ${getErrorMessage(error)}`));
42
56
  });
43
57
  });
44
58
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@matterbridge/utils",
3
- "version": "3.9.3-dev-20260627-f5f8623",
3
+ "version": "3.9.3-dev-20260627-5d60de5",
4
4
  "description": "Matterbridge utils library",
5
5
  "author": "https://github.com/Luligu",
6
6
  "homepage": "https://matterbridge.io/",