Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 59 additions & 0 deletions workspaces/lightspeed/.changeset/blue-donuts-wash.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
---
'@red-hat-developer-hub/backstage-plugin-lightspeed-backend': minor
---

**BREAKING** Replaces `fetch` function with built-in one and refactors source to fit the change. This change comes from [ADR014](https://github.com/backstage/backstage/blob/master/docs/architecture-decisions/adr014-use-fetch.md) that now recommends the use of the global built-in `fetch` function since Node v20.

The changes are contained for the `lightspeed-backend` plugin, the `node-fetch` direct dependency is removed from `package.json` and makes the following changes to the `router.ts` source:

```diff
import { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter';
import { NotAllowedError } from '@backstage/errors';
import { createPermissionIntegrationRouter } from '@backstage/plugin-permission-node';

import express, { Router } from 'express';
import { createProxyMiddleware } from 'http-proxy-middleware';
-import fetch from 'node-fetch';

import {
lightspeedChatCreatePermission,
lightspeedChatDeletePermission,
lightspeedChatReadPermission,
lightspeedPermissions,
} from '@red-hat-developer-hub/backstage-plugin-lightspeed-common';

+import { Readable } from 'node:stream';
+
import { userPermissionAuthorization } from './permission';
import {
DEFAULT_HISTORY_LENGTH,
QueryRequestBody,
RouterOptions,
} from './types';
import { validateCompletionsRequest } from './validation';
```

Response piping has changed for the result of the built-in `fetch`:

```diff
if (!fetchResponse.ok) {
// Read the error body
const errorBody = await fetchResponse.json();
const errormsg = `Error from lightspeed-core server: ${errorBody.error?.message || errorBody?.detail?.cause || 'Unknown error'}`;
logger.error(errormsg);

// Return a 500 status for any upstream error
response.status(500).json({
error: errormsg,
});
+
+ return
}

// Pipe the response back to the original response
-fetchResponse.body.pipe(response);
+if (fetchResponse.body) {
+ const nodeStream = Readable.fromWeb(fetchResponse.body as any);
+ nodeStream.pipe(response);
+}
```
1 change: 1 addition & 0 deletions workspaces/lightspeed/.yarnrc.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
yarnPath: ../../.yarn/releases/yarn-4.12.0.cjs
2 changes: 1 addition & 1 deletion workspaces/lightspeed/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"version": "1.0.0",
"private": true,
"engines": {
"node": "18 || 20"
"node": "22"
},
"scripts": {
"dev": "backstage-cli repo start",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,7 @@
"@langchain/openai": "^0.6.0",
"@red-hat-developer-hub/backstage-plugin-lightspeed-common": "workspace:^",
"express": "^4.21.1",
"http-proxy-middleware": "^3.0.2",
"node-fetch": "2.7.0"
"http-proxy-middleware": "^3.0.2"
},
"devDependencies": {
"@backstage/backend-test-utils": "^1.10.4",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ import { createPermissionIntegrationRouter } from '@backstage/plugin-permission-

import express, { Router } from 'express';
import { createProxyMiddleware } from 'http-proxy-middleware';
import fetch from 'node-fetch';

import {
lightspeedChatCreatePermission,
Expand All @@ -29,6 +28,8 @@ import {
lightspeedPermissions,
} from '@red-hat-developer-hub/backstage-plugin-lightspeed-common';

import { Readable } from 'node:stream';

import { userPermissionAuthorization } from './permission';
import {
DEFAULT_HISTORY_LENGTH,
Expand Down Expand Up @@ -241,10 +242,15 @@ export async function createRouter(
response.status(500).json({
error: errormsg,
});

return;
}

// Pipe the response back to the original response
fetchResponse.body.pipe(response);
if (fetchResponse.body) {
const nodeStream = Readable.fromWeb(fetchResponse.body as any);
nodeStream.pipe(response);
}
} catch (error) {
const errormsg = `Error fetching completions from ${provider}: ${error}`;
logger.error(errormsg);
Expand Down
33 changes: 16 additions & 17 deletions workspaces/lightspeed/yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -10368,7 +10368,6 @@ __metadata:
express: "npm:^4.21.1"
http-proxy-middleware: "npm:^3.0.2"
msw: "npm:2.12.10"
node-fetch: "npm:2.7.0"
prettier: "npm:3.8.1"
supertest: "npm:6.3.4"
languageName: unknown
Expand Down Expand Up @@ -18606,11 +18605,11 @@ __metadata:
linkType: hard

"error-ex@npm:^1.3.1":
version: 1.3.2
resolution: "error-ex@npm:1.3.2"
version: 1.3.4
resolution: "error-ex@npm:1.3.4"
dependencies:
is-arrayish: "npm:^0.2.1"
checksum: 10c0/ba827f89369b4c93382cfca5a264d059dfefdaa56ecc5e338ffa58a6471f5ed93b71a20add1d52290a4873d92381174382658c885ac1a2305f7baca363ce9cce
checksum: 10c0/b9e34ff4778b8f3b31a8377e1c654456f4c41aeaa3d10a1138c3b7635d8b7b2e03eb2475d46d8ae055c1f180a1063e100bffabf64ea7e7388b37735df5328664
languageName: node
linkType: hard

Expand Down Expand Up @@ -22103,7 +22102,7 @@ __metadata:
languageName: node
linkType: hard

"is-core-module@npm:^2.13.0, is-core-module@npm:^2.15.1, is-core-module@npm:^2.16.0":
"is-core-module@npm:^2.13.0, is-core-module@npm:^2.15.1, is-core-module@npm:^2.16.1":
version: 2.16.1
resolution: "is-core-module@npm:2.16.1"
dependencies:
Expand Down Expand Up @@ -22424,11 +22423,11 @@ __metadata:
linkType: hard

"is-ssh@npm:^1.4.0":
version: 1.4.0
resolution: "is-ssh@npm:1.4.0"
version: 1.4.1
resolution: "is-ssh@npm:1.4.1"
dependencies:
protocols: "npm:^2.0.1"
checksum: 10c0/3eb30d1bcb4507cd25562e7ac61a1c0aa31772134c67cec9c3afe6f4d57ec17e8c2892600a608e8e583f32f53f36465b8968c0305f2855cfbff95acfd049e113
checksum: 10c0/021a7355cb032625d58db3cc8266ad9aa698cbabf460b71376a0307405577fd7d3aa0826c0bf1951d7809f134c0ee80403306f6d7633db94a5a3600a0106b398
languageName: node
linkType: hard

Expand Down Expand Up @@ -26266,7 +26265,7 @@ __metadata:
languageName: node
linkType: hard

"node-fetch@npm:2.7.0, node-fetch@npm:^2.6.0, node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.12, node-fetch@npm:^2.6.7, node-fetch@npm:^2.6.9, node-fetch@npm:^2.7.0":
"node-fetch@npm:^2.6.0, node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.12, node-fetch@npm:^2.6.7, node-fetch@npm:^2.6.9, node-fetch@npm:^2.7.0":
version: 2.7.0
resolution: "node-fetch@npm:2.7.0"
dependencies:
Expand Down Expand Up @@ -30065,15 +30064,15 @@ __metadata:
linkType: hard

"resolve@npm:^1.17.0, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.22.4, resolve@npm:~1.22.1, resolve@npm:~1.22.2":
version: 1.22.10
resolution: "resolve@npm:1.22.10"
version: 1.22.11
resolution: "resolve@npm:1.22.11"
dependencies:
is-core-module: "npm:^2.16.0"
is-core-module: "npm:^2.16.1"
path-parse: "npm:^1.0.7"
supports-preserve-symlinks-flag: "npm:^1.0.0"
bin:
resolve: bin/resolve
checksum: 10c0/8967e1f4e2cc40f79b7e080b4582b9a8c5ee36ffb46041dccb20e6461161adf69f843b43067b4a375de926a2cd669157e29a29578191def399dd5ef89a1b5203
checksum: 10c0/f657191507530f2cbecb5815b1ee99b20741ea6ee02a59c57028e9ec4c2c8d7681afcc35febbd554ac0ded459db6f2d8153382c53a2f266cee2575e512674409
languageName: node
linkType: hard

Expand Down Expand Up @@ -30104,15 +30103,15 @@ __metadata:
linkType: hard

"resolve@patch:resolve@npm%3A^1.17.0#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A~1.22.1#optional!builtin<compat/resolve>, resolve@patch:resolve@npm%3A~1.22.2#optional!builtin<compat/resolve>":
version: 1.22.10
resolution: "resolve@patch:resolve@npm%3A1.22.10#optional!builtin<compat/resolve>::version=1.22.10&hash=c3c19d"
version: 1.22.11
resolution: "resolve@patch:resolve@npm%3A1.22.11#optional!builtin<compat/resolve>::version=1.22.11&hash=c3c19d"
dependencies:
is-core-module: "npm:^2.16.0"
is-core-module: "npm:^2.16.1"
path-parse: "npm:^1.0.7"
supports-preserve-symlinks-flag: "npm:^1.0.0"
bin:
resolve: bin/resolve
checksum: 10c0/52a4e505bbfc7925ac8f4cd91fd8c4e096b6a89728b9f46861d3b405ac9a1ccf4dcbf8befb4e89a2e11370dacd0160918163885cbc669369590f2f31f4c58939
checksum: 10c0/ee5b182f2e37cb1165465e58c6abc797fec0a80b5ba3231607beb4677db0c9291ac010c47cf092b6daa2b7f518d69a0e21888e7e2b633f68d501a874212a8c63
languageName: node
linkType: hard

Expand Down