Skip to content
Merged
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
19 changes: 4 additions & 15 deletions workspaces/bulk-import/app-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -96,26 +96,11 @@ catalog:
target: ../../examples/entities.yaml

# Local example templates
- type: file
target: ../../examples/template/get-default-branch.yaml
rules:
- allow: [Template]

- type: file
target: ../../examples/template/create-repo-with-catalog-info.yaml
rules:
- allow: [Template]

- type: file
target: ../../examples/template/create-pr-with-catalog-info.yaml
rules:
- allow: [Template]

- type: file
target: ../../examples/template/import-components-from-existing-repo.yaml
rules:
- allow: [Template]

# Local example organizational data
- type: file
target: ../../examples/org.yaml
Expand All @@ -136,3 +121,7 @@ catalog:
permission:
# setting this to `false` will disable permissions
enabled: true
# scaffolder template execution configuration. Disabled by default.
# bulkImport:
# importTemplate: template:default/create-pr-with-catalog-info
# importAPI: scaffolder
Original file line number Diff line number Diff line change
Expand Up @@ -53,11 +53,11 @@
"@backstage/plugin-permission-common": "^0.9.1",
"@backstage/plugin-permission-node": "^0.10.3",
"@gitbeaker/rest": "^43.4.0",
"@microsoft/fetch-event-source": "^2.0.1",
"@octokit/auth-app": "^6.0.3",
"@octokit/rest": "^20.0.2",
"@red-hat-developer-hub/backstage-plugin-bulk-import-common": "workspace:^",
"ajv-formats": "^3.0.1",
"eventsource-client": "^1.2.0",
"express": "^4.17.1",
"git-url-parse": "^14.0.0",
"js-yaml": "^4.1.0",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import {
} from '@backstage/backend-plugin-api';
import { Config } from '@backstage/config';

import { fetchEventSource } from '@microsoft/fetch-event-source';
import { createEventSource } from 'eventsource-client';
import gitUrlParse from 'git-url-parse';

import { getCatalogFilename } from '../../../catalog/catalogUtils';
Expand Down Expand Up @@ -54,78 +54,35 @@ async function* getEvents(
scaffolderUrl: string,
token: string,
logger: LoggerService,
) {
): AsyncGenerator<ScaffolderEvent> {
const url = `${scaffolderUrl}/v2/tasks/${taskId}/eventstream`;

const queue: ScaffolderEvent[] = [];
let resolver: ((event: ScaffolderEvent) => void) | undefined;

const handleEvent = (data: any) => {
logger.info('Received event:', data);
if (resolver) {
resolver(data);
resolver = undefined;
} else {
queue.push(data);
}
};

const controller = new AbortController();

fetchEventSource(url, {
method: 'GET',
const eventSource = createEventSource({
url,
headers: {
Authorization: `Bearer ${token}`,
},
signal: controller.signal,
onopen: async response => {
logger.info('SSE connection opened', { status: response.status });
},
onmessage: event => {
});
try {
for await (const event of eventSource) {
try {
const data: ScaffolderEvent = JSON.parse(event.data);
handleEvent(data);
yield data;
if (data.type === 'completion' || data.type === 'error') {
break;
}
} catch (err) {
logger.error('==== Failed to parse SSE event', err);
logger.error('Failed to parse SSE event', err);
}
},
onclose: () => {
logger.info('SSE connection closed');
},
onerror: err => {
logger.error('==== SSE error', err);
handleEvent({
type: 'error',
error: err,
id: -1,
isTaskRecoverable: false,
taskId,
body: { message: err?.message ?? '' },
createdAt: new Date().toISOString(),
});
controller.abort();
},
}).catch(err => logger.error('==== fetchEventSource failed', err));

const nextEvent = (): Promise<ScaffolderEvent> =>
new Promise(resolve => {
resolver = resolve;
});

while (true) {
const event: ScaffolderEvent =
queue.length > 0 ? queue.shift()! : await nextEvent();

yield event;

if (event.type === 'completion' || event.type === 'error') {
controller.abort();
break;
}
} catch (err) {
logger.error('SSE error', err);
} finally {
eventSource.close();
}
}

async function processTaskEvents(
export async function processTaskEvents(
taskId: string,
scaffolderUrl: string,
token: string,
Expand All @@ -143,7 +100,7 @@ async function processTaskEvents(
}
}
} catch (e) {
logger.error(`==== Failed to process events for task ${taskId}`, e);
logger.error(`Failed to process events for task ${taskId}`, e);
}
}

Expand Down
18 changes: 17 additions & 1 deletion workspaces/bulk-import/yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -9071,7 +9071,6 @@ __metadata:
"@backstage/plugin-permission-node": ^0.10.3
"@backstage/types": ^1.2.1
"@gitbeaker/rest": ^43.4.0
"@microsoft/fetch-event-source": ^2.0.1
"@octokit/auth-app": ^6.0.3
"@octokit/rest": ^20.0.2
"@openapitools/openapi-generator-cli": 2.20.2
Expand All @@ -9083,6 +9082,7 @@ __metadata:
"@types/node-fetch": ^2.5.12
"@types/supertest": 2.0.16
ajv-formats: ^3.0.1
eventsource-client: ^1.2.0
express: ^4.17.1
git-url-parse: ^14.0.0
js-yaml: ^4.1.0
Expand Down Expand Up @@ -18320,6 +18320,22 @@ __metadata:
languageName: node
linkType: hard

"eventsource-client@npm:^1.2.0":
version: 1.2.0
resolution: "eventsource-client@npm:1.2.0"
dependencies:
eventsource-parser: ^3.0.0
checksum: 744b772176d09feab761244575cbf74b57d6fb6746e0863ece3549bfe606d38fc86d7d704e5ffa69bfb7b586929c29e29ce0059f194de20c2630b148c346d9bc
languageName: node
linkType: hard

"eventsource-parser@npm:^3.0.0":
version: 3.0.6
resolution: "eventsource-parser@npm:3.0.6"
checksum: b90ec27f8d992afa7df171db202faaedb1782214f64e50690cbf78bc2629f7751575aa27a72d8ae447e5a7094938406b1a3ea1d89e5f0f2d6916cc8a694b6587
languageName: node
linkType: hard

"evp_bytestokey@npm:^1.0.0, evp_bytestokey@npm:^1.0.3":
version: 1.0.3
resolution: "evp_bytestokey@npm:1.0.3"
Expand Down