@backstage/backend-app-api 0.2.4-next.3 → 0.2.5-next.0
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.
Potentially problematic release.
This version of @backstage/backend-app-api might be problematic. Click here for more details.
- package/CHANGELOG.md +29 -0
- package/alpha/package.json +1 -1
- package/dist/index.alpha.d.ts +13 -8
- package/dist/index.beta.d.ts +13 -8
- package/dist/index.cjs.js +168 -130
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +13 -8
- package/package.json +7 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,34 @@
|
|
|
1
1
|
# @backstage/backend-app-api
|
|
2
2
|
|
|
3
|
+
## 0.2.5-next.0
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 6cfd4d7073: Updated implementations for the new `RootLifecycleService`.
|
|
8
|
+
- Updated dependencies
|
|
9
|
+
- @backstage/backend-plugin-api@0.2.1-next.0
|
|
10
|
+
- @backstage/backend-common@0.18.0-next.0
|
|
11
|
+
- @backstage/backend-tasks@0.4.1-next.0
|
|
12
|
+
- @backstage/errors@1.1.4
|
|
13
|
+
- @backstage/plugin-permission-node@0.7.3-next.0
|
|
14
|
+
|
|
15
|
+
## 0.2.4
|
|
16
|
+
|
|
17
|
+
### Patch Changes
|
|
18
|
+
|
|
19
|
+
- cb1c2781c0: Updated logger implementations to match interface changes.
|
|
20
|
+
- 884d749b14: Refactored to use `coreServices` from `@backstage/backend-plugin-api`.
|
|
21
|
+
- afa3bf5657: Added `.stop()` method to `Backend`.
|
|
22
|
+
- d6dbf1792b: Added `lifecycleFactory` implementation.
|
|
23
|
+
- 05a928e296: Updated usages of types from `@backstage/backend-plugin-api`.
|
|
24
|
+
- 5260d8fc7d: Root scoped services are now always initialized, regardless of whether they're used by any features.
|
|
25
|
+
- Updated dependencies
|
|
26
|
+
- @backstage/backend-common@0.17.0
|
|
27
|
+
- @backstage/backend-tasks@0.4.0
|
|
28
|
+
- @backstage/plugin-permission-node@0.7.2
|
|
29
|
+
- @backstage/errors@1.1.4
|
|
30
|
+
- @backstage/backend-plugin-api@0.2.0
|
|
31
|
+
|
|
3
32
|
## 0.2.4-next.3
|
|
4
33
|
|
|
5
34
|
### Patch Changes
|
package/alpha/package.json
CHANGED
package/dist/index.alpha.d.ts
CHANGED
|
@@ -5,13 +5,12 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import { BackendFeature } from '@backstage/backend-plugin-api';
|
|
8
|
-
import { BackendLifecycle } from '@backstage/backend-plugin-api';
|
|
9
8
|
import { Config } from '@backstage/config';
|
|
10
9
|
import { ExtensionPoint } from '@backstage/backend-plugin-api';
|
|
11
10
|
import { HttpRouterService } from '@backstage/backend-plugin-api';
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
11
|
+
import { LifecycleService } from '@backstage/backend-plugin-api';
|
|
12
|
+
import { LoggerService } from '@backstage/backend-plugin-api';
|
|
13
|
+
import { PermissionsService } from '@backstage/backend-plugin-api';
|
|
15
14
|
import { PluginCacheManager } from '@backstage/backend-common';
|
|
16
15
|
import { PluginDatabaseManager } from '@backstage/backend-common';
|
|
17
16
|
import { PluginEndpointDiscovery } from '@backstage/backend-common';
|
|
@@ -27,6 +26,7 @@ import { UrlReader } from '@backstage/backend-common';
|
|
|
27
26
|
export declare interface Backend {
|
|
28
27
|
add(feature: BackendFeature): void;
|
|
29
28
|
start(): Promise<void>;
|
|
29
|
+
stop(): Promise<void>;
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
/** @public */
|
|
@@ -69,16 +69,21 @@ export declare type HttpRouterFactoryOptions = {
|
|
|
69
69
|
/**
|
|
70
70
|
* Allows plugins to register shutdown hooks that are run when the process is about to exit.
|
|
71
71
|
* @public */
|
|
72
|
-
export declare const lifecycleFactory: (options?: undefined) => ServiceFactory<
|
|
72
|
+
export declare const lifecycleFactory: (options?: undefined) => ServiceFactory<LifecycleService>;
|
|
73
73
|
|
|
74
74
|
/** @public */
|
|
75
|
-
export declare const loggerFactory: (options?: undefined) => ServiceFactory<
|
|
75
|
+
export declare const loggerFactory: (options?: undefined) => ServiceFactory<LoggerService>;
|
|
76
76
|
|
|
77
77
|
/** @public */
|
|
78
|
-
export declare const permissionsFactory: (options?: undefined) => ServiceFactory<
|
|
78
|
+
export declare const permissionsFactory: (options?: undefined) => ServiceFactory<PermissionsService>;
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Allows plugins to register shutdown hooks that are run when the process is about to exit.
|
|
82
|
+
* @public */
|
|
83
|
+
export declare const rootLifecycleFactory: (options?: undefined) => ServiceFactory<LifecycleService>;
|
|
79
84
|
|
|
80
85
|
/** @public */
|
|
81
|
-
export declare const rootLoggerFactory: (options?: undefined) => ServiceFactory<
|
|
86
|
+
export declare const rootLoggerFactory: (options?: undefined) => ServiceFactory<LoggerService>;
|
|
82
87
|
|
|
83
88
|
/** @public */
|
|
84
89
|
export declare const schedulerFactory: (options?: undefined) => ServiceFactory<PluginTaskScheduler>;
|
package/dist/index.beta.d.ts
CHANGED
|
@@ -5,13 +5,12 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import { BackendFeature } from '@backstage/backend-plugin-api';
|
|
8
|
-
import { BackendLifecycle } from '@backstage/backend-plugin-api';
|
|
9
8
|
import { Config } from '@backstage/config';
|
|
10
9
|
import { ExtensionPoint } from '@backstage/backend-plugin-api';
|
|
11
10
|
import { HttpRouterService } from '@backstage/backend-plugin-api';
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
11
|
+
import { LifecycleService } from '@backstage/backend-plugin-api';
|
|
12
|
+
import { LoggerService } from '@backstage/backend-plugin-api';
|
|
13
|
+
import { PermissionsService } from '@backstage/backend-plugin-api';
|
|
15
14
|
import { PluginCacheManager } from '@backstage/backend-common';
|
|
16
15
|
import { PluginDatabaseManager } from '@backstage/backend-common';
|
|
17
16
|
import { PluginEndpointDiscovery } from '@backstage/backend-common';
|
|
@@ -27,6 +26,7 @@ import { UrlReader } from '@backstage/backend-common';
|
|
|
27
26
|
export declare interface Backend {
|
|
28
27
|
add(feature: BackendFeature): void;
|
|
29
28
|
start(): Promise<void>;
|
|
29
|
+
stop(): Promise<void>;
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
/** @public */
|
|
@@ -69,16 +69,21 @@ export declare type HttpRouterFactoryOptions = {
|
|
|
69
69
|
/**
|
|
70
70
|
* Allows plugins to register shutdown hooks that are run when the process is about to exit.
|
|
71
71
|
* @public */
|
|
72
|
-
export declare const lifecycleFactory: (options?: undefined) => ServiceFactory<
|
|
72
|
+
export declare const lifecycleFactory: (options?: undefined) => ServiceFactory<LifecycleService>;
|
|
73
73
|
|
|
74
74
|
/** @public */
|
|
75
|
-
export declare const loggerFactory: (options?: undefined) => ServiceFactory<
|
|
75
|
+
export declare const loggerFactory: (options?: undefined) => ServiceFactory<LoggerService>;
|
|
76
76
|
|
|
77
77
|
/** @public */
|
|
78
|
-
export declare const permissionsFactory: (options?: undefined) => ServiceFactory<
|
|
78
|
+
export declare const permissionsFactory: (options?: undefined) => ServiceFactory<PermissionsService>;
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Allows plugins to register shutdown hooks that are run when the process is about to exit.
|
|
82
|
+
* @public */
|
|
83
|
+
export declare const rootLifecycleFactory: (options?: undefined) => ServiceFactory<LifecycleService>;
|
|
79
84
|
|
|
80
85
|
/** @public */
|
|
81
|
-
export declare const rootLoggerFactory: (options?: undefined) => ServiceFactory<
|
|
86
|
+
export declare const rootLoggerFactory: (options?: undefined) => ServiceFactory<LoggerService>;
|
|
82
87
|
|
|
83
88
|
/** @public */
|
|
84
89
|
export declare const schedulerFactory: (options?: undefined) => ServiceFactory<PluginTaskScheduler>;
|
package/dist/index.cjs.js
CHANGED
|
@@ -31,34 +31,99 @@ var __privateSet$3 = (obj, member, value, setter) => {
|
|
|
31
31
|
setter ? setter.call(obj, value) : member.set(obj, value);
|
|
32
32
|
return value;
|
|
33
33
|
};
|
|
34
|
+
var _isCalled, _shutdownTasks;
|
|
35
|
+
const CALLBACKS = ["SIGTERM", "SIGINT", "beforeExit"];
|
|
36
|
+
class BackendLifecycleImpl {
|
|
37
|
+
constructor(logger) {
|
|
38
|
+
this.logger = logger;
|
|
39
|
+
__privateAdd$3(this, _isCalled, false);
|
|
40
|
+
__privateAdd$3(this, _shutdownTasks, []);
|
|
41
|
+
CALLBACKS.map((signal) => process.on(signal, () => this.shutdown()));
|
|
42
|
+
}
|
|
43
|
+
addShutdownHook(options) {
|
|
44
|
+
__privateGet$3(this, _shutdownTasks).push(options);
|
|
45
|
+
}
|
|
46
|
+
async shutdown() {
|
|
47
|
+
if (__privateGet$3(this, _isCalled)) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
__privateSet$3(this, _isCalled, true);
|
|
51
|
+
this.logger.info(`Running ${__privateGet$3(this, _shutdownTasks).length} shutdown tasks...`);
|
|
52
|
+
await Promise.all(
|
|
53
|
+
__privateGet$3(this, _shutdownTasks).map(async (hook) => {
|
|
54
|
+
try {
|
|
55
|
+
await hook.fn();
|
|
56
|
+
this.logger.info(`Shutdown hook succeeded`, hook.labels);
|
|
57
|
+
} catch (error) {
|
|
58
|
+
this.logger.error(`Shutdown hook failed, ${error}`, hook.labels);
|
|
59
|
+
}
|
|
60
|
+
})
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
_isCalled = new WeakMap();
|
|
65
|
+
_shutdownTasks = new WeakMap();
|
|
66
|
+
const rootLifecycleFactory = backendPluginApi.createServiceFactory({
|
|
67
|
+
service: backendPluginApi.coreServices.rootLifecycle,
|
|
68
|
+
deps: {
|
|
69
|
+
logger: backendPluginApi.coreServices.rootLogger
|
|
70
|
+
},
|
|
71
|
+
async factory({ logger }) {
|
|
72
|
+
return new BackendLifecycleImpl(backendPluginApi.loggerToWinstonLogger(logger));
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
var __accessCheck$2 = (obj, member, msg) => {
|
|
77
|
+
if (!member.has(obj))
|
|
78
|
+
throw TypeError("Cannot " + msg);
|
|
79
|
+
};
|
|
80
|
+
var __privateGet$2 = (obj, member, getter) => {
|
|
81
|
+
__accessCheck$2(obj, member, "read from private field");
|
|
82
|
+
return getter ? getter.call(obj) : member.get(obj);
|
|
83
|
+
};
|
|
84
|
+
var __privateAdd$2 = (obj, member, value) => {
|
|
85
|
+
if (member.has(obj))
|
|
86
|
+
throw TypeError("Cannot add the same private member more than once");
|
|
87
|
+
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
88
|
+
};
|
|
89
|
+
var __privateSet$2 = (obj, member, value, setter) => {
|
|
90
|
+
__accessCheck$2(obj, member, "write to private field");
|
|
91
|
+
setter ? setter.call(obj, value) : member.set(obj, value);
|
|
92
|
+
return value;
|
|
93
|
+
};
|
|
34
94
|
var __privateMethod$1 = (obj, member, method) => {
|
|
35
|
-
__accessCheck$
|
|
95
|
+
__accessCheck$2(obj, member, "access private method");
|
|
36
96
|
return method;
|
|
37
97
|
};
|
|
38
98
|
var _started, _features, _registerInits, _extensionPoints, _serviceHolder, _getInitDeps, getInitDeps_fn, _resolveInitOrder, resolveInitOrder_fn;
|
|
39
99
|
class BackendInitializer {
|
|
40
100
|
constructor(serviceHolder) {
|
|
41
|
-
__privateAdd$
|
|
42
|
-
__privateAdd$
|
|
43
|
-
__privateAdd$
|
|
44
|
-
__privateAdd$
|
|
45
|
-
__privateAdd$
|
|
46
|
-
__privateAdd$
|
|
47
|
-
__privateAdd$
|
|
48
|
-
__privateSet$
|
|
101
|
+
__privateAdd$2(this, _getInitDeps);
|
|
102
|
+
__privateAdd$2(this, _resolveInitOrder);
|
|
103
|
+
__privateAdd$2(this, _started, false);
|
|
104
|
+
__privateAdd$2(this, _features, /* @__PURE__ */ new Map());
|
|
105
|
+
__privateAdd$2(this, _registerInits, new Array());
|
|
106
|
+
__privateAdd$2(this, _extensionPoints, /* @__PURE__ */ new Map());
|
|
107
|
+
__privateAdd$2(this, _serviceHolder, void 0);
|
|
108
|
+
__privateSet$2(this, _serviceHolder, serviceHolder);
|
|
49
109
|
}
|
|
50
110
|
add(feature, options) {
|
|
51
|
-
if (__privateGet$
|
|
111
|
+
if (__privateGet$2(this, _started)) {
|
|
52
112
|
throw new Error("feature can not be added after the backend has started");
|
|
53
113
|
}
|
|
54
|
-
__privateGet$
|
|
114
|
+
__privateGet$2(this, _features).set(feature, options);
|
|
55
115
|
}
|
|
56
116
|
async start() {
|
|
57
|
-
if (__privateGet$
|
|
117
|
+
if (__privateGet$2(this, _started)) {
|
|
58
118
|
throw new Error("Backend has already started");
|
|
59
119
|
}
|
|
60
|
-
__privateSet$
|
|
61
|
-
for (const
|
|
120
|
+
__privateSet$2(this, _started, true);
|
|
121
|
+
for (const ref of __privateGet$2(this, _serviceHolder).getServiceRefs()) {
|
|
122
|
+
if (ref.scope === "root") {
|
|
123
|
+
await __privateGet$2(this, _serviceHolder).get(ref, "root");
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
for (const [feature] of __privateGet$2(this, _features)) {
|
|
62
127
|
const provides = /* @__PURE__ */ new Set();
|
|
63
128
|
let registerInit = void 0;
|
|
64
129
|
feature.register({
|
|
@@ -66,10 +131,10 @@ class BackendInitializer {
|
|
|
66
131
|
if (registerInit) {
|
|
67
132
|
throw new Error("registerExtensionPoint called after registerInit");
|
|
68
133
|
}
|
|
69
|
-
if (__privateGet$
|
|
134
|
+
if (__privateGet$2(this, _extensionPoints).has(extensionPointRef)) {
|
|
70
135
|
throw new Error(`API ${extensionPointRef.id} already registered`);
|
|
71
136
|
}
|
|
72
|
-
__privateGet$
|
|
137
|
+
__privateGet$2(this, _extensionPoints).set(extensionPointRef, impl);
|
|
73
138
|
provides.add(extensionPointRef);
|
|
74
139
|
},
|
|
75
140
|
registerInit: (registerOptions) => {
|
|
@@ -90,14 +155,28 @@ class BackendInitializer {
|
|
|
90
155
|
`registerInit was not called by register in ${feature.id}`
|
|
91
156
|
);
|
|
92
157
|
}
|
|
93
|
-
__privateGet$
|
|
158
|
+
__privateGet$2(this, _registerInits).push(registerInit);
|
|
94
159
|
}
|
|
95
|
-
const orderedRegisterResults = __privateMethod$1(this, _resolveInitOrder, resolveInitOrder_fn).call(this, __privateGet$
|
|
160
|
+
const orderedRegisterResults = __privateMethod$1(this, _resolveInitOrder, resolveInitOrder_fn).call(this, __privateGet$2(this, _registerInits));
|
|
96
161
|
for (const registerInit of orderedRegisterResults) {
|
|
97
162
|
const deps = await __privateMethod$1(this, _getInitDeps, getInitDeps_fn).call(this, registerInit.deps, registerInit.id);
|
|
98
163
|
await registerInit.init(deps);
|
|
99
164
|
}
|
|
100
165
|
}
|
|
166
|
+
async stop() {
|
|
167
|
+
if (!__privateGet$2(this, _started)) {
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
const lifecycleService = await __privateGet$2(this, _serviceHolder).get(
|
|
171
|
+
backendPluginApi.coreServices.rootLifecycle,
|
|
172
|
+
"root"
|
|
173
|
+
);
|
|
174
|
+
if (lifecycleService instanceof BackendLifecycleImpl) {
|
|
175
|
+
await lifecycleService.shutdown();
|
|
176
|
+
} else {
|
|
177
|
+
throw new Error("Unexpected lifecycle service implementation");
|
|
178
|
+
}
|
|
179
|
+
}
|
|
101
180
|
}
|
|
102
181
|
_started = new WeakMap();
|
|
103
182
|
_features = new WeakMap();
|
|
@@ -109,13 +188,13 @@ getInitDeps_fn = async function(deps, pluginId) {
|
|
|
109
188
|
const result = /* @__PURE__ */ new Map();
|
|
110
189
|
const missingRefs = /* @__PURE__ */ new Set();
|
|
111
190
|
for (const [name, ref] of Object.entries(deps)) {
|
|
112
|
-
const extensionPoint = __privateGet$
|
|
191
|
+
const extensionPoint = __privateGet$2(this, _extensionPoints).get(
|
|
113
192
|
ref
|
|
114
193
|
);
|
|
115
194
|
if (extensionPoint) {
|
|
116
195
|
result.set(name, extensionPoint);
|
|
117
196
|
} else {
|
|
118
|
-
const impl = await __privateGet$
|
|
197
|
+
const impl = await __privateGet$2(this, _serviceHolder).get(
|
|
119
198
|
ref,
|
|
120
199
|
pluginId
|
|
121
200
|
);
|
|
@@ -159,38 +238,38 @@ resolveInitOrder_fn = function(registerInits) {
|
|
|
159
238
|
return orderedRegisterInits;
|
|
160
239
|
};
|
|
161
240
|
|
|
162
|
-
var __accessCheck$
|
|
241
|
+
var __accessCheck$1 = (obj, member, msg) => {
|
|
163
242
|
if (!member.has(obj))
|
|
164
243
|
throw TypeError("Cannot " + msg);
|
|
165
244
|
};
|
|
166
|
-
var __privateGet$
|
|
167
|
-
__accessCheck$
|
|
245
|
+
var __privateGet$1 = (obj, member, getter) => {
|
|
246
|
+
__accessCheck$1(obj, member, "read from private field");
|
|
168
247
|
return getter ? getter.call(obj) : member.get(obj);
|
|
169
248
|
};
|
|
170
|
-
var __privateAdd$
|
|
249
|
+
var __privateAdd$1 = (obj, member, value) => {
|
|
171
250
|
if (member.has(obj))
|
|
172
251
|
throw TypeError("Cannot add the same private member more than once");
|
|
173
252
|
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
174
253
|
};
|
|
175
|
-
var __privateSet$
|
|
176
|
-
__accessCheck$
|
|
254
|
+
var __privateSet$1 = (obj, member, value, setter) => {
|
|
255
|
+
__accessCheck$1(obj, member, "write to private field");
|
|
177
256
|
setter ? setter.call(obj, value) : member.set(obj, value);
|
|
178
257
|
return value;
|
|
179
258
|
};
|
|
180
259
|
var __privateMethod = (obj, member, method) => {
|
|
181
|
-
__accessCheck$
|
|
260
|
+
__accessCheck$1(obj, member, "access private method");
|
|
182
261
|
return method;
|
|
183
262
|
};
|
|
184
263
|
var _providedFactories, _loadedDefaultFactories, _implementations, _resolveFactory, resolveFactory_fn, _separateMapForTheRootService, _checkForMissingDeps, checkForMissingDeps_fn;
|
|
185
264
|
class ServiceRegistry {
|
|
186
265
|
constructor(factories) {
|
|
187
|
-
__privateAdd$
|
|
188
|
-
__privateAdd$
|
|
189
|
-
__privateAdd$
|
|
190
|
-
__privateAdd$
|
|
191
|
-
__privateAdd$
|
|
192
|
-
__privateAdd$
|
|
193
|
-
__privateSet$
|
|
266
|
+
__privateAdd$1(this, _resolveFactory);
|
|
267
|
+
__privateAdd$1(this, _checkForMissingDeps);
|
|
268
|
+
__privateAdd$1(this, _providedFactories, void 0);
|
|
269
|
+
__privateAdd$1(this, _loadedDefaultFactories, void 0);
|
|
270
|
+
__privateAdd$1(this, _implementations, void 0);
|
|
271
|
+
__privateAdd$1(this, _separateMapForTheRootService, /* @__PURE__ */ new Map());
|
|
272
|
+
__privateSet$1(this, _providedFactories, new Map(
|
|
194
273
|
factories.map((f) => {
|
|
195
274
|
if (typeof f === "function") {
|
|
196
275
|
const cf = f();
|
|
@@ -199,14 +278,17 @@ class ServiceRegistry {
|
|
|
199
278
|
return [f.service.id, f];
|
|
200
279
|
})
|
|
201
280
|
));
|
|
202
|
-
__privateSet$
|
|
203
|
-
__privateSet$
|
|
281
|
+
__privateSet$1(this, _loadedDefaultFactories, /* @__PURE__ */ new Map());
|
|
282
|
+
__privateSet$1(this, _implementations, /* @__PURE__ */ new Map());
|
|
283
|
+
}
|
|
284
|
+
getServiceRefs() {
|
|
285
|
+
return Array.from(__privateGet$1(this, _providedFactories).values()).map((f) => f.service);
|
|
204
286
|
}
|
|
205
287
|
get(ref, pluginId) {
|
|
206
288
|
var _a;
|
|
207
289
|
return (_a = __privateMethod(this, _resolveFactory, resolveFactory_fn).call(this, ref, pluginId)) == null ? void 0 : _a.then((factory) => {
|
|
208
290
|
if (factory.scope === "root") {
|
|
209
|
-
let existing = __privateGet$
|
|
291
|
+
let existing = __privateGet$1(this, _separateMapForTheRootService).get(factory);
|
|
210
292
|
if (!existing) {
|
|
211
293
|
__privateMethod(this, _checkForMissingDeps, checkForMissingDeps_fn).call(this, factory, pluginId);
|
|
212
294
|
const rootDeps = new Array();
|
|
@@ -222,11 +304,11 @@ class ServiceRegistry {
|
|
|
222
304
|
existing = Promise.all(rootDeps).then(
|
|
223
305
|
(entries) => factory.factory(Object.fromEntries(entries))
|
|
224
306
|
);
|
|
225
|
-
__privateGet$
|
|
307
|
+
__privateGet$1(this, _separateMapForTheRootService).set(factory, existing);
|
|
226
308
|
}
|
|
227
309
|
return existing;
|
|
228
310
|
}
|
|
229
|
-
let implementation = __privateGet$
|
|
311
|
+
let implementation = __privateGet$1(this, _implementations).get(factory);
|
|
230
312
|
if (!implementation) {
|
|
231
313
|
__privateMethod(this, _checkForMissingDeps, checkForMissingDeps_fn).call(this, factory, pluginId);
|
|
232
314
|
const rootDeps = new Array();
|
|
@@ -245,7 +327,7 @@ class ServiceRegistry {
|
|
|
245
327
|
}),
|
|
246
328
|
byPlugin: /* @__PURE__ */ new Map()
|
|
247
329
|
};
|
|
248
|
-
__privateGet$
|
|
330
|
+
__privateGet$1(this, _implementations).set(factory, implementation);
|
|
249
331
|
}
|
|
250
332
|
let result = implementation.byPlugin.get(pluginId);
|
|
251
333
|
if (!result) {
|
|
@@ -287,18 +369,18 @@ resolveFactory_fn = function(ref, pluginId) {
|
|
|
287
369
|
})
|
|
288
370
|
});
|
|
289
371
|
}
|
|
290
|
-
let resolvedFactory = __privateGet$
|
|
372
|
+
let resolvedFactory = __privateGet$1(this, _providedFactories).get(ref.id);
|
|
291
373
|
const { __defaultFactory: defaultFactory } = ref;
|
|
292
374
|
if (!resolvedFactory && !defaultFactory) {
|
|
293
375
|
return void 0;
|
|
294
376
|
}
|
|
295
377
|
if (!resolvedFactory) {
|
|
296
|
-
let loadedFactory = __privateGet$
|
|
378
|
+
let loadedFactory = __privateGet$1(this, _loadedDefaultFactories).get(defaultFactory);
|
|
297
379
|
if (!loadedFactory) {
|
|
298
380
|
loadedFactory = Promise.resolve().then(() => defaultFactory(ref)).then(
|
|
299
381
|
(f) => typeof f === "function" ? f() : f
|
|
300
382
|
);
|
|
301
|
-
__privateGet$
|
|
383
|
+
__privateGet$1(this, _loadedDefaultFactories).set(defaultFactory, loadedFactory);
|
|
302
384
|
}
|
|
303
385
|
resolvedFactory = loadedFactory.catch((error) => {
|
|
304
386
|
throw new Error(
|
|
@@ -317,7 +399,7 @@ checkForMissingDeps_fn = function(factory, pluginId) {
|
|
|
317
399
|
if (ref.id === backendPluginApi.coreServices.pluginMetadata.id) {
|
|
318
400
|
return false;
|
|
319
401
|
}
|
|
320
|
-
if (__privateGet$
|
|
402
|
+
if (__privateGet$1(this, _providedFactories).get(ref.id)) {
|
|
321
403
|
return false;
|
|
322
404
|
}
|
|
323
405
|
return !ref.__defaultFactory;
|
|
@@ -330,37 +412,40 @@ checkForMissingDeps_fn = function(factory, pluginId) {
|
|
|
330
412
|
}
|
|
331
413
|
};
|
|
332
414
|
|
|
333
|
-
var __accessCheck
|
|
415
|
+
var __accessCheck = (obj, member, msg) => {
|
|
334
416
|
if (!member.has(obj))
|
|
335
417
|
throw TypeError("Cannot " + msg);
|
|
336
418
|
};
|
|
337
|
-
var __privateGet
|
|
338
|
-
__accessCheck
|
|
419
|
+
var __privateGet = (obj, member, getter) => {
|
|
420
|
+
__accessCheck(obj, member, "read from private field");
|
|
339
421
|
return getter ? getter.call(obj) : member.get(obj);
|
|
340
422
|
};
|
|
341
|
-
var __privateAdd
|
|
423
|
+
var __privateAdd = (obj, member, value) => {
|
|
342
424
|
if (member.has(obj))
|
|
343
425
|
throw TypeError("Cannot add the same private member more than once");
|
|
344
426
|
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
345
427
|
};
|
|
346
|
-
var __privateSet
|
|
347
|
-
__accessCheck
|
|
428
|
+
var __privateSet = (obj, member, value, setter) => {
|
|
429
|
+
__accessCheck(obj, member, "write to private field");
|
|
348
430
|
setter ? setter.call(obj, value) : member.set(obj, value);
|
|
349
431
|
return value;
|
|
350
432
|
};
|
|
351
433
|
var _services, _initializer;
|
|
352
434
|
class BackstageBackend {
|
|
353
435
|
constructor(apiFactories) {
|
|
354
|
-
__privateAdd
|
|
355
|
-
__privateAdd
|
|
356
|
-
__privateSet
|
|
357
|
-
__privateSet
|
|
436
|
+
__privateAdd(this, _services, void 0);
|
|
437
|
+
__privateAdd(this, _initializer, void 0);
|
|
438
|
+
__privateSet(this, _services, new ServiceRegistry(apiFactories));
|
|
439
|
+
__privateSet(this, _initializer, new BackendInitializer(__privateGet(this, _services)));
|
|
358
440
|
}
|
|
359
441
|
add(feature) {
|
|
360
|
-
__privateGet
|
|
442
|
+
__privateGet(this, _initializer).add(feature);
|
|
361
443
|
}
|
|
362
444
|
async start() {
|
|
363
|
-
await __privateGet
|
|
445
|
+
await __privateGet(this, _initializer).start();
|
|
446
|
+
}
|
|
447
|
+
async stop() {
|
|
448
|
+
await __privateGet(this, _initializer).stop();
|
|
364
449
|
}
|
|
365
450
|
}
|
|
366
451
|
_services = new WeakMap();
|
|
@@ -447,11 +532,20 @@ class BackstageLogger {
|
|
|
447
532
|
static fromWinston(logger) {
|
|
448
533
|
return new BackstageLogger(logger);
|
|
449
534
|
}
|
|
450
|
-
|
|
451
|
-
this.winston.
|
|
535
|
+
error(message, meta) {
|
|
536
|
+
this.winston.error(message, meta);
|
|
537
|
+
}
|
|
538
|
+
warn(message, meta) {
|
|
539
|
+
this.winston.warn(message, meta);
|
|
540
|
+
}
|
|
541
|
+
info(message, meta) {
|
|
542
|
+
this.winston.info(message, meta);
|
|
543
|
+
}
|
|
544
|
+
debug(message, meta) {
|
|
545
|
+
this.winston.debug(message, meta);
|
|
452
546
|
}
|
|
453
|
-
child(
|
|
454
|
-
return new BackstageLogger(this.winston.child(
|
|
547
|
+
child(meta) {
|
|
548
|
+
return new BackstageLogger(this.winston.child(meta));
|
|
455
549
|
}
|
|
456
550
|
}
|
|
457
551
|
const rootLoggerFactory = backendPluginApi.createServiceFactory({
|
|
@@ -552,80 +646,23 @@ const httpRouterFactory = backendPluginApi.createServiceFactory({
|
|
|
552
646
|
}
|
|
553
647
|
});
|
|
554
648
|
|
|
555
|
-
var __accessCheck = (obj, member, msg) => {
|
|
556
|
-
if (!member.has(obj))
|
|
557
|
-
throw TypeError("Cannot " + msg);
|
|
558
|
-
};
|
|
559
|
-
var __privateGet = (obj, member, getter) => {
|
|
560
|
-
__accessCheck(obj, member, "read from private field");
|
|
561
|
-
return getter ? getter.call(obj) : member.get(obj);
|
|
562
|
-
};
|
|
563
|
-
var __privateAdd = (obj, member, value) => {
|
|
564
|
-
if (member.has(obj))
|
|
565
|
-
throw TypeError("Cannot add the same private member more than once");
|
|
566
|
-
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
567
|
-
};
|
|
568
|
-
var __privateSet = (obj, member, value, setter) => {
|
|
569
|
-
__accessCheck(obj, member, "write to private field");
|
|
570
|
-
setter ? setter.call(obj, value) : member.set(obj, value);
|
|
571
|
-
return value;
|
|
572
|
-
};
|
|
573
|
-
var _isCalled, _shutdownTasks;
|
|
574
|
-
const CALLBACKS = ["SIGTERM", "SIGINT", "beforeExit"];
|
|
575
|
-
class BackendLifecycleImpl {
|
|
576
|
-
constructor(logger) {
|
|
577
|
-
this.logger = logger;
|
|
578
|
-
__privateAdd(this, _isCalled, false);
|
|
579
|
-
__privateAdd(this, _shutdownTasks, []);
|
|
580
|
-
CALLBACKS.map((signal) => process.on(signal, () => this.shutdown()));
|
|
581
|
-
}
|
|
582
|
-
addShutdownHook(options) {
|
|
583
|
-
__privateGet(this, _shutdownTasks).push(options);
|
|
584
|
-
}
|
|
585
|
-
async shutdown() {
|
|
586
|
-
if (__privateGet(this, _isCalled)) {
|
|
587
|
-
return;
|
|
588
|
-
}
|
|
589
|
-
__privateSet(this, _isCalled, true);
|
|
590
|
-
this.logger.info(`Running ${__privateGet(this, _shutdownTasks).length} shutdown tasks...`);
|
|
591
|
-
await Promise.all(
|
|
592
|
-
__privateGet(this, _shutdownTasks).map(
|
|
593
|
-
(hook) => Promise.resolve().then(() => hook.fn()).catch((e) => {
|
|
594
|
-
this.logger.error(
|
|
595
|
-
`Shutdown hook registered by plugin '${hook.pluginId}' failed with: ${e}`
|
|
596
|
-
);
|
|
597
|
-
}).then(
|
|
598
|
-
() => this.logger.info(
|
|
599
|
-
`Successfully ran shutdown hook registered by plugin ${hook.pluginId}`
|
|
600
|
-
)
|
|
601
|
-
)
|
|
602
|
-
)
|
|
603
|
-
);
|
|
604
|
-
}
|
|
605
|
-
}
|
|
606
|
-
_isCalled = new WeakMap();
|
|
607
|
-
_shutdownTasks = new WeakMap();
|
|
608
|
-
class PluginScopedLifecycleImpl {
|
|
609
|
-
constructor(lifecycle, pluginId) {
|
|
610
|
-
this.lifecycle = lifecycle;
|
|
611
|
-
this.pluginId = pluginId;
|
|
612
|
-
}
|
|
613
|
-
addShutdownHook(options) {
|
|
614
|
-
this.lifecycle.addShutdownHook({ ...options, pluginId: this.pluginId });
|
|
615
|
-
}
|
|
616
|
-
}
|
|
617
649
|
const lifecycleFactory = backendPluginApi.createServiceFactory({
|
|
618
650
|
service: backendPluginApi.coreServices.lifecycle,
|
|
619
651
|
deps: {
|
|
620
|
-
|
|
621
|
-
|
|
652
|
+
rootLifecycle: backendPluginApi.coreServices.rootLifecycle,
|
|
653
|
+
pluginMetadata: backendPluginApi.coreServices.pluginMetadata
|
|
622
654
|
},
|
|
623
|
-
async factory({
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
655
|
+
async factory({ rootLifecycle }) {
|
|
656
|
+
return async ({ pluginMetadata }) => {
|
|
657
|
+
const plugin = pluginMetadata.getId();
|
|
658
|
+
return {
|
|
659
|
+
addShutdownHook(options) {
|
|
660
|
+
rootLifecycle.addShutdownHook({
|
|
661
|
+
...options,
|
|
662
|
+
labels: { ...options == null ? void 0 : options.labels, plugin }
|
|
663
|
+
});
|
|
664
|
+
}
|
|
665
|
+
};
|
|
629
666
|
};
|
|
630
667
|
}
|
|
631
668
|
});
|
|
@@ -639,6 +676,7 @@ exports.httpRouterFactory = httpRouterFactory;
|
|
|
639
676
|
exports.lifecycleFactory = lifecycleFactory;
|
|
640
677
|
exports.loggerFactory = loggerFactory;
|
|
641
678
|
exports.permissionsFactory = permissionsFactory;
|
|
679
|
+
exports.rootLifecycleFactory = rootLifecycleFactory;
|
|
642
680
|
exports.rootLoggerFactory = rootLoggerFactory;
|
|
643
681
|
exports.schedulerFactory = schedulerFactory;
|
|
644
682
|
exports.tokenManagerFactory = tokenManagerFactory;
|
package/dist/index.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../src/wiring/BackendInitializer.ts","../src/wiring/ServiceRegistry.ts","../src/wiring/BackstageBackend.ts","../src/wiring/types.ts","../src/services/implementations/cacheService.ts","../src/services/implementations/configService.ts","../src/services/implementations/databaseService.ts","../src/services/implementations/discoveryService.ts","../src/services/implementations/loggerService.ts","../src/services/implementations/rootLoggerService.ts","../src/services/implementations/permissionsService.ts","../src/services/implementations/schedulerService.ts","../src/services/implementations/tokenManagerService.ts","../src/services/implementations/urlReaderService.ts","../src/services/implementations/httpRouterService.ts","../src/services/implementations/lifecycleService.ts"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n BackendFeature,\n ExtensionPoint,\n ServiceRef,\n} from '@backstage/backend-plugin-api';\nimport {\n BackendRegisterInit,\n ServiceHolder,\n ServiceOrExtensionPoint,\n} from './types';\n\nexport class BackendInitializer {\n #started = false;\n #features = new Map<BackendFeature, unknown>();\n #registerInits = new Array<BackendRegisterInit>();\n #extensionPoints = new Map<ExtensionPoint<unknown>, unknown>();\n #serviceHolder: ServiceHolder;\n\n constructor(serviceHolder: ServiceHolder) {\n this.#serviceHolder = serviceHolder;\n }\n\n async #getInitDeps(\n deps: { [name: string]: ServiceOrExtensionPoint },\n pluginId: string,\n ) {\n const result = new Map<string, unknown>();\n const missingRefs = new Set<ServiceOrExtensionPoint>();\n\n for (const [name, ref] of Object.entries(deps)) {\n const extensionPoint = this.#extensionPoints.get(\n ref as ExtensionPoint<unknown>,\n );\n if (extensionPoint) {\n result.set(name, extensionPoint);\n } else {\n const impl = await this.#serviceHolder.get(\n ref as ServiceRef<unknown>,\n pluginId,\n );\n if (impl) {\n result.set(name, impl);\n } else {\n missingRefs.add(ref);\n }\n }\n }\n\n if (missingRefs.size > 0) {\n const missing = Array.from(missingRefs).join(', ');\n throw new Error(\n `No extension point or service available for the following ref(s): ${missing}`,\n );\n }\n\n return Object.fromEntries(result);\n }\n\n add<TOptions>(feature: BackendFeature, options?: TOptions) {\n if (this.#started) {\n throw new Error('feature can not be added after the backend has started');\n }\n this.#features.set(feature, options);\n }\n\n async start(): Promise<void> {\n if (this.#started) {\n throw new Error('Backend has already started');\n }\n this.#started = true;\n\n for (const [feature] of this.#features) {\n const provides = new Set<ExtensionPoint<unknown>>();\n\n let registerInit: BackendRegisterInit | undefined = undefined;\n\n feature.register({\n registerExtensionPoint: (extensionPointRef, impl) => {\n if (registerInit) {\n throw new Error('registerExtensionPoint called after registerInit');\n }\n if (this.#extensionPoints.has(extensionPointRef)) {\n throw new Error(`API ${extensionPointRef.id} already registered`);\n }\n this.#extensionPoints.set(extensionPointRef, impl);\n provides.add(extensionPointRef);\n },\n registerInit: registerOptions => {\n if (registerInit) {\n throw new Error('registerInit must only be called once');\n }\n registerInit = {\n id: feature.id,\n provides,\n consumes: new Set(Object.values(registerOptions.deps)),\n deps: registerOptions.deps,\n init: registerOptions.init as BackendRegisterInit['init'],\n };\n },\n });\n\n if (!registerInit) {\n throw new Error(\n `registerInit was not called by register in ${feature.id}`,\n );\n }\n\n this.#registerInits.push(registerInit);\n }\n\n const orderedRegisterResults = this.#resolveInitOrder(this.#registerInits);\n\n for (const registerInit of orderedRegisterResults) {\n const deps = await this.#getInitDeps(registerInit.deps, registerInit.id);\n await registerInit.init(deps);\n }\n }\n\n #resolveInitOrder(registerInits: Array<BackendRegisterInit>) {\n let registerInitsToOrder = registerInits.slice();\n const orderedRegisterInits = new Array<BackendRegisterInit>();\n\n // TODO: Validate duplicates\n\n while (registerInitsToOrder.length > 0) {\n const toRemove = new Set<unknown>();\n\n for (const registerInit of registerInitsToOrder) {\n const unInitializedDependents = [];\n\n for (const provided of registerInit.provides) {\n if (\n registerInitsToOrder.some(\n init => init !== registerInit && init.consumes.has(provided),\n )\n ) {\n unInitializedDependents.push(provided);\n }\n }\n\n if (unInitializedDependents.length === 0) {\n orderedRegisterInits.push(registerInit);\n toRemove.add(registerInit);\n }\n }\n\n registerInitsToOrder = registerInitsToOrder.filter(r => !toRemove.has(r));\n }\n\n return orderedRegisterInits;\n }\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n ServiceFactory,\n ServiceRef,\n coreServices,\n} from '@backstage/backend-plugin-api';\nimport { stringifyError } from '@backstage/errors';\n\n/**\n * Keep in sync with `@backstage/backend-plugin-api/src/services/system/types.ts`\n * @internal\n */\nexport type InternalServiceRef<T> = ServiceRef<T> & {\n __defaultFactory?: (\n service: ServiceRef<T>,\n ) => Promise<ServiceFactory<T> | (() => ServiceFactory<T>)>;\n};\n\nexport class ServiceRegistry {\n readonly #providedFactories: Map<string, ServiceFactory>;\n readonly #loadedDefaultFactories: Map<Function, Promise<ServiceFactory>>;\n readonly #implementations: Map<\n ServiceFactory,\n {\n factoryFunc: Promise<\n (deps: { [name in string]: unknown }) => Promise<unknown>\n >;\n byPlugin: Map<string, Promise<unknown>>;\n }\n >;\n\n constructor(\n factories: Array<ServiceFactory<unknown> | (() => ServiceFactory<unknown>)>,\n ) {\n this.#providedFactories = new Map(\n factories.map(f => {\n if (typeof f === 'function') {\n const cf = f();\n return [cf.service.id, cf];\n }\n return [f.service.id, f];\n }),\n );\n this.#loadedDefaultFactories = new Map();\n this.#implementations = new Map();\n }\n\n #resolveFactory(\n ref: ServiceRef<unknown>,\n pluginId: string,\n ): Promise<ServiceFactory> | undefined {\n // Special case handling of the plugin metadata service, generating a custom factory for it each time\n if (ref.id === coreServices.pluginMetadata.id) {\n return Promise.resolve({\n scope: 'plugin',\n service: coreServices.pluginMetadata,\n deps: {},\n factory: async () => async () => ({\n getId() {\n return pluginId;\n },\n }),\n });\n }\n\n let resolvedFactory: Promise<ServiceFactory> | ServiceFactory | undefined =\n this.#providedFactories.get(ref.id);\n const { __defaultFactory: defaultFactory } =\n ref as InternalServiceRef<unknown>;\n if (!resolvedFactory && !defaultFactory) {\n return undefined;\n }\n\n if (!resolvedFactory) {\n let loadedFactory = this.#loadedDefaultFactories.get(defaultFactory!);\n if (!loadedFactory) {\n loadedFactory = Promise.resolve()\n .then(() => defaultFactory!(ref))\n .then(f =>\n typeof f === 'function' ? f() : f,\n ) as Promise<ServiceFactory>;\n this.#loadedDefaultFactories.set(defaultFactory!, loadedFactory);\n }\n resolvedFactory = loadedFactory.catch(error => {\n throw new Error(\n `Failed to instantiate service '${\n ref.id\n }' because the default factory loader threw an error, ${stringifyError(\n error,\n )}`,\n );\n });\n }\n\n return Promise.resolve(resolvedFactory);\n }\n\n #separateMapForTheRootService = new Map<ServiceFactory, Promise<unknown>>();\n\n #checkForMissingDeps(factory: ServiceFactory, pluginId: string) {\n const missingDeps = Object.values(factory.deps).filter(ref => {\n if (ref.id === coreServices.pluginMetadata.id) {\n return false;\n }\n if (this.#providedFactories.get(ref.id)) {\n return false;\n }\n\n return !(ref as InternalServiceRef<unknown>).__defaultFactory;\n });\n\n if (missingDeps.length) {\n const missing = missingDeps.map(r => `'${r.id}'`).join(', ');\n throw new Error(\n `Failed to instantiate service '${factory.service.id}' for '${pluginId}' because the following dependent services are missing: ${missing}`,\n );\n }\n }\n\n get<T>(ref: ServiceRef<T>, pluginId: string): Promise<T> | undefined {\n return this.#resolveFactory(ref, pluginId)?.then(factory => {\n if (factory.scope === 'root') {\n let existing = this.#separateMapForTheRootService.get(factory);\n if (!existing) {\n this.#checkForMissingDeps(factory, pluginId);\n const rootDeps = new Array<Promise<[name: string, impl: unknown]>>();\n\n for (const [name, serviceRef] of Object.entries(factory.deps)) {\n if (serviceRef.scope !== 'root') {\n throw new Error(\n `Failed to instantiate 'root' scoped service '${ref.id}' because it depends on '${serviceRef.scope}' scoped service '${serviceRef.id}'.`,\n );\n }\n const target = this.get(serviceRef, pluginId)!;\n rootDeps.push(target.then(impl => [name, impl]));\n }\n\n existing = Promise.all(rootDeps).then(entries =>\n factory.factory(Object.fromEntries(entries)),\n );\n this.#separateMapForTheRootService.set(factory, existing);\n }\n return existing as Promise<T>;\n }\n\n let implementation = this.#implementations.get(factory);\n if (!implementation) {\n this.#checkForMissingDeps(factory, pluginId);\n const rootDeps = new Array<Promise<[name: string, impl: unknown]>>();\n\n for (const [name, serviceRef] of Object.entries(factory.deps)) {\n if (serviceRef.scope === 'root') {\n const target = this.get(serviceRef, pluginId)!;\n rootDeps.push(target.then(impl => [name, impl]));\n }\n }\n\n implementation = {\n factoryFunc: Promise.all(rootDeps)\n .then(entries => factory.factory(Object.fromEntries(entries)))\n .catch(error => {\n const cause = stringifyError(error);\n throw new Error(\n `Failed to instantiate service '${ref.id}' because the top-level factory function threw an error, ${cause}`,\n );\n }),\n byPlugin: new Map(),\n };\n\n this.#implementations.set(factory, implementation);\n }\n\n let result = implementation.byPlugin.get(pluginId) as Promise<any>;\n if (!result) {\n const allDeps = new Array<Promise<[name: string, impl: unknown]>>();\n\n for (const [name, serviceRef] of Object.entries(factory.deps)) {\n const target = this.get(serviceRef, pluginId)!;\n allDeps.push(target.then(impl => [name, impl]));\n }\n\n result = implementation.factoryFunc\n .then(func =>\n Promise.all(allDeps).then(entries =>\n func(Object.fromEntries(entries)),\n ),\n )\n .catch(error => {\n const cause = stringifyError(error);\n throw new Error(\n `Failed to instantiate service '${ref.id}' for '${pluginId}' because the factory function threw an error, ${cause}`,\n );\n });\n implementation.byPlugin.set(pluginId, result);\n }\n\n return result;\n });\n }\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ServiceFactory, BackendFeature } from '@backstage/backend-plugin-api';\nimport { BackendInitializer } from './BackendInitializer';\nimport { ServiceRegistry } from './ServiceRegistry';\nimport { Backend } from './types';\n\nexport class BackstageBackend implements Backend {\n #services: ServiceRegistry;\n #initializer: BackendInitializer;\n\n constructor(apiFactories: ServiceFactory[]) {\n this.#services = new ServiceRegistry(apiFactories);\n this.#initializer = new BackendInitializer(this.#services);\n }\n\n add(feature: BackendFeature): void {\n this.#initializer.add(feature);\n }\n\n async start(): Promise<void> {\n await this.#initializer.start();\n }\n\n // async stop(): Promise<void> {\n // await this.#initializer.stop();\n // }\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n ServiceFactory,\n BackendFeature,\n ExtensionPoint,\n ServiceRef,\n} from '@backstage/backend-plugin-api';\nimport { BackstageBackend } from './BackstageBackend';\n\n/**\n * @public\n */\nexport interface Backend {\n add(feature: BackendFeature): void;\n start(): Promise<void>;\n}\n\nexport interface BackendRegisterInit {\n id: string;\n consumes: Set<ServiceOrExtensionPoint>;\n provides: Set<ServiceOrExtensionPoint>;\n deps: { [name: string]: ServiceOrExtensionPoint };\n init: (deps: { [name: string]: unknown }) => Promise<void>;\n}\n\n/**\n * @public\n */\nexport interface CreateSpecializedBackendOptions {\n services: (ServiceFactory | (() => ServiceFactory))[];\n}\n\nexport type ServiceHolder = {\n get<T>(api: ServiceRef<T>, pluginId: string): Promise<T> | undefined;\n};\n\n/**\n * @public\n */\nexport function createSpecializedBackend(\n options: CreateSpecializedBackendOptions,\n): Backend {\n return new BackstageBackend(\n options.services.map(s => (typeof s === 'function' ? s() : s)),\n );\n}\n\n/**\n * @public\n */\nexport type ServiceOrExtensionPoint<T = unknown> =\n | ExtensionPoint<T>\n | ServiceRef<T>;\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { CacheManager } from '@backstage/backend-common';\nimport {\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\n\n/** @public */\nexport const cacheFactory = createServiceFactory({\n service: coreServices.cache,\n deps: {\n config: coreServices.config,\n plugin: coreServices.pluginMetadata,\n },\n async factory({ config }) {\n const cacheManager = CacheManager.fromConfig(config);\n return async ({ plugin }) => {\n return cacheManager.forPlugin(plugin.getId());\n };\n },\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { loadBackendConfig } from '@backstage/backend-common';\nimport {\n coreServices,\n createServiceFactory,\n loggerToWinstonLogger,\n} from '@backstage/backend-plugin-api';\n\n/** @public */\nexport const configFactory = createServiceFactory({\n service: coreServices.config,\n deps: {\n logger: coreServices.rootLogger,\n },\n async factory({ logger }) {\n const config = await loadBackendConfig({\n argv: process.argv,\n logger: loggerToWinstonLogger(logger),\n });\n return config;\n },\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DatabaseManager } from '@backstage/backend-common';\nimport {\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\n\n/** @public */\nexport const databaseFactory = createServiceFactory({\n service: coreServices.database,\n deps: {\n config: coreServices.config,\n plugin: coreServices.pluginMetadata,\n },\n async factory({ config }) {\n const databaseManager = DatabaseManager.fromConfig(config);\n return async ({ plugin }) => {\n return databaseManager.forPlugin(plugin.getId());\n };\n },\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SingleHostDiscovery } from '@backstage/backend-common';\nimport {\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\n\n/** @public */\nexport const discoveryFactory = createServiceFactory({\n service: coreServices.discovery,\n deps: {\n config: coreServices.config,\n },\n async factory({ config }) {\n const discovery = SingleHostDiscovery.fromConfig(config);\n return async () => {\n return discovery;\n };\n },\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n createServiceFactory,\n coreServices,\n} from '@backstage/backend-plugin-api';\n\n/** @public */\nexport const loggerFactory = createServiceFactory({\n service: coreServices.logger,\n deps: {\n rootLogger: coreServices.rootLogger,\n plugin: coreServices.pluginMetadata,\n },\n async factory({ rootLogger }) {\n return async ({ plugin }) => {\n return rootLogger.child({ pluginId: plugin.getId() });\n };\n },\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { createRootLogger } from '@backstage/backend-common';\nimport {\n createServiceFactory,\n Logger,\n coreServices,\n} from '@backstage/backend-plugin-api';\nimport { Logger as WinstonLogger } from 'winston';\n\nclass BackstageLogger implements Logger {\n static fromWinston(logger: WinstonLogger): BackstageLogger {\n return new BackstageLogger(logger);\n }\n\n private constructor(private readonly winston: WinstonLogger) {}\n\n info(message: string, ...meta: any[]): void {\n this.winston.info(message, ...meta);\n }\n\n child(fields: { [name: string]: string }): Logger {\n return new BackstageLogger(this.winston.child(fields));\n }\n}\n\n/** @public */\nexport const rootLoggerFactory = createServiceFactory({\n service: coreServices.rootLogger,\n deps: {},\n async factory() {\n return BackstageLogger.fromWinston(createRootLogger());\n },\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\nimport { ServerPermissionClient } from '@backstage/plugin-permission-node';\n\n/** @public */\nexport const permissionsFactory = createServiceFactory({\n service: coreServices.permissions,\n deps: {\n config: coreServices.config,\n discovery: coreServices.discovery,\n tokenManager: coreServices.tokenManager,\n },\n async factory({ config }) {\n return async ({ discovery, tokenManager }) => {\n return ServerPermissionClient.fromConfig(config, {\n discovery,\n tokenManager,\n });\n };\n },\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\nimport { TaskScheduler } from '@backstage/backend-tasks';\n\n/** @public */\nexport const schedulerFactory = createServiceFactory({\n service: coreServices.scheduler,\n deps: {\n config: coreServices.config,\n plugin: coreServices.pluginMetadata,\n },\n async factory({ config }) {\n const taskScheduler = TaskScheduler.fromConfig(config);\n return async ({ plugin }) => {\n return taskScheduler.forPlugin(plugin.getId());\n };\n },\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n coreServices,\n createServiceFactory,\n loggerToWinstonLogger,\n} from '@backstage/backend-plugin-api';\nimport { ServerTokenManager } from '@backstage/backend-common';\n\n/** @public */\nexport const tokenManagerFactory = createServiceFactory({\n service: coreServices.tokenManager,\n deps: {\n config: coreServices.config,\n logger: coreServices.logger,\n },\n async factory() {\n return async ({ config, logger }) => {\n return ServerTokenManager.fromConfig(config, {\n logger: loggerToWinstonLogger(logger),\n });\n };\n },\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { UrlReaders } from '@backstage/backend-common';\nimport {\n coreServices,\n createServiceFactory,\n loggerToWinstonLogger,\n} from '@backstage/backend-plugin-api';\n\n/** @public */\nexport const urlReaderFactory = createServiceFactory({\n service: coreServices.urlReader,\n deps: {\n config: coreServices.config,\n logger: coreServices.logger,\n },\n async factory() {\n return async ({ config, logger }) => {\n return UrlReaders.default({\n config,\n logger: loggerToWinstonLogger(logger),\n });\n };\n },\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n createServiceFactory,\n coreServices,\n} from '@backstage/backend-plugin-api';\nimport Router from 'express-promise-router';\nimport { Handler } from 'express';\nimport { createServiceBuilder } from '@backstage/backend-common';\n\n/**\n * @public\n */\nexport type HttpRouterFactoryOptions = {\n /**\n * The plugin ID used for the index route. Defaults to 'app'\n */\n indexPlugin?: string;\n};\n\n/** @public */\nexport const httpRouterFactory = createServiceFactory({\n service: coreServices.httpRouter,\n deps: {\n config: coreServices.config,\n plugin: coreServices.pluginMetadata,\n },\n async factory({ config }, options?: HttpRouterFactoryOptions) {\n const defaultPluginId = options?.indexPlugin ?? 'app';\n\n const apiRouter = Router();\n const rootRouter = Router();\n\n const service = createServiceBuilder(module)\n .loadConfig(config)\n .addRouter('/api', apiRouter)\n .addRouter('', rootRouter);\n\n await service.start();\n\n return async ({ plugin }) => {\n const pluginId = plugin.getId();\n return {\n use(handler: Handler) {\n if (pluginId === defaultPluginId) {\n rootRouter.use(handler);\n } else {\n apiRouter.use(`/${pluginId}`, handler);\n }\n },\n };\n };\n },\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n BackendLifecycle,\n createServiceFactory,\n coreServices,\n loggerToWinstonLogger,\n BackendLifecycleShutdownHook,\n} from '@backstage/backend-plugin-api';\nimport { Logger } from 'winston';\n\nconst CALLBACKS = ['SIGTERM', 'SIGINT', 'beforeExit'];\nexport class BackendLifecycleImpl {\n constructor(private readonly logger: Logger) {\n CALLBACKS.map(signal => process.on(signal, () => this.shutdown()));\n }\n\n #isCalled = false;\n #shutdownTasks: Array<BackendLifecycleShutdownHook & { pluginId: string }> =\n [];\n\n addShutdownHook(\n options: BackendLifecycleShutdownHook & { pluginId: string },\n ): void {\n this.#shutdownTasks.push(options);\n }\n\n async shutdown(): Promise<void> {\n if (this.#isCalled) {\n return;\n }\n this.#isCalled = true;\n\n this.logger.info(`Running ${this.#shutdownTasks.length} shutdown tasks...`);\n await Promise.all(\n this.#shutdownTasks.map(hook =>\n Promise.resolve()\n .then(() => hook.fn())\n .catch(e => {\n this.logger.error(\n `Shutdown hook registered by plugin '${hook.pluginId}' failed with: ${e}`,\n );\n })\n .then(() =>\n this.logger.info(\n `Successfully ran shutdown hook registered by plugin ${hook.pluginId}`,\n ),\n ),\n ),\n );\n }\n}\n\nclass PluginScopedLifecycleImpl implements BackendLifecycle {\n constructor(\n private readonly lifecycle: BackendLifecycleImpl,\n private readonly pluginId: string,\n ) {}\n addShutdownHook(options: BackendLifecycleShutdownHook): void {\n this.lifecycle.addShutdownHook({ ...options, pluginId: this.pluginId });\n }\n}\n\n/**\n * Allows plugins to register shutdown hooks that are run when the process is about to exit.\n * @public */\nexport const lifecycleFactory = createServiceFactory({\n service: coreServices.lifecycle,\n deps: {\n logger: coreServices.rootLogger,\n plugin: coreServices.pluginMetadata,\n },\n async factory({ logger }) {\n const rootLifecycle = new BackendLifecycleImpl(\n loggerToWinstonLogger(logger),\n );\n return async ({ plugin }) => {\n return new PluginScopedLifecycleImpl(rootLifecycle, plugin.getId());\n };\n },\n});\n"],"names":["__privateAdd","__privateSet","__privateGet","__privateMethod","stringifyError","coreServices","createServiceFactory","CacheManager","loadBackendConfig","loggerToWinstonLogger","DatabaseManager","SingleHostDiscovery","createRootLogger","ServerPermissionClient","TaskScheduler","ServerTokenManager","UrlReaders","Router","createServiceBuilder"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../src/services/implementations/rootLifecycleService.ts","../src/wiring/BackendInitializer.ts","../src/wiring/ServiceRegistry.ts","../src/wiring/BackstageBackend.ts","../src/wiring/types.ts","../src/services/implementations/cacheService.ts","../src/services/implementations/configService.ts","../src/services/implementations/databaseService.ts","../src/services/implementations/discoveryService.ts","../src/services/implementations/loggerService.ts","../src/services/implementations/rootLoggerService.ts","../src/services/implementations/permissionsService.ts","../src/services/implementations/schedulerService.ts","../src/services/implementations/tokenManagerService.ts","../src/services/implementations/urlReaderService.ts","../src/services/implementations/httpRouterService.ts","../src/services/implementations/lifecycleService.ts"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n createServiceFactory,\n coreServices,\n loggerToWinstonLogger,\n LifecycleServiceShutdownHook,\n RootLifecycleService,\n} from '@backstage/backend-plugin-api';\nimport { Logger } from 'winston';\n\nconst CALLBACKS = ['SIGTERM', 'SIGINT', 'beforeExit'];\nexport class BackendLifecycleImpl implements RootLifecycleService {\n constructor(private readonly logger: Logger) {\n CALLBACKS.map(signal => process.on(signal, () => this.shutdown()));\n }\n\n #isCalled = false;\n #shutdownTasks: Array<LifecycleServiceShutdownHook> = [];\n\n addShutdownHook(options: LifecycleServiceShutdownHook): void {\n this.#shutdownTasks.push(options);\n }\n\n async shutdown(): Promise<void> {\n if (this.#isCalled) {\n return;\n }\n this.#isCalled = true;\n\n this.logger.info(`Running ${this.#shutdownTasks.length} shutdown tasks...`);\n await Promise.all(\n this.#shutdownTasks.map(async hook => {\n try {\n await hook.fn();\n this.logger.info(`Shutdown hook succeeded`, hook.labels);\n } catch (error) {\n this.logger.error(`Shutdown hook failed, ${error}`, hook.labels);\n }\n }),\n );\n }\n}\n\n/**\n * Allows plugins to register shutdown hooks that are run when the process is about to exit.\n * @public */\nexport const rootLifecycleFactory = createServiceFactory({\n service: coreServices.rootLifecycle,\n deps: {\n logger: coreServices.rootLogger,\n },\n async factory({ logger }) {\n return new BackendLifecycleImpl(loggerToWinstonLogger(logger));\n },\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n BackendFeature,\n ExtensionPoint,\n coreServices,\n ServiceRef,\n} from '@backstage/backend-plugin-api';\nimport { BackendLifecycleImpl } from '../services/implementations/rootLifecycleService';\nimport {\n BackendRegisterInit,\n EnumerableServiceHolder,\n ServiceOrExtensionPoint,\n} from './types';\n\nexport class BackendInitializer {\n #started = false;\n #features = new Map<BackendFeature, unknown>();\n #registerInits = new Array<BackendRegisterInit>();\n #extensionPoints = new Map<ExtensionPoint<unknown>, unknown>();\n #serviceHolder: EnumerableServiceHolder;\n\n constructor(serviceHolder: EnumerableServiceHolder) {\n this.#serviceHolder = serviceHolder;\n }\n\n async #getInitDeps(\n deps: { [name: string]: ServiceOrExtensionPoint },\n pluginId: string,\n ) {\n const result = new Map<string, unknown>();\n const missingRefs = new Set<ServiceOrExtensionPoint>();\n\n for (const [name, ref] of Object.entries(deps)) {\n const extensionPoint = this.#extensionPoints.get(\n ref as ExtensionPoint<unknown>,\n );\n if (extensionPoint) {\n result.set(name, extensionPoint);\n } else {\n const impl = await this.#serviceHolder.get(\n ref as ServiceRef<unknown>,\n pluginId,\n );\n if (impl) {\n result.set(name, impl);\n } else {\n missingRefs.add(ref);\n }\n }\n }\n\n if (missingRefs.size > 0) {\n const missing = Array.from(missingRefs).join(', ');\n throw new Error(\n `No extension point or service available for the following ref(s): ${missing}`,\n );\n }\n\n return Object.fromEntries(result);\n }\n\n add<TOptions>(feature: BackendFeature, options?: TOptions) {\n if (this.#started) {\n throw new Error('feature can not be added after the backend has started');\n }\n this.#features.set(feature, options);\n }\n\n async start(): Promise<void> {\n if (this.#started) {\n throw new Error('Backend has already started');\n }\n this.#started = true;\n\n // Initialize all root scoped services\n for (const ref of this.#serviceHolder.getServiceRefs()) {\n if (ref.scope === 'root') {\n await this.#serviceHolder.get(ref, 'root');\n }\n }\n\n // Initialize all features\n for (const [feature] of this.#features) {\n const provides = new Set<ExtensionPoint<unknown>>();\n\n let registerInit: BackendRegisterInit | undefined = undefined;\n\n feature.register({\n registerExtensionPoint: (extensionPointRef, impl) => {\n if (registerInit) {\n throw new Error('registerExtensionPoint called after registerInit');\n }\n if (this.#extensionPoints.has(extensionPointRef)) {\n throw new Error(`API ${extensionPointRef.id} already registered`);\n }\n this.#extensionPoints.set(extensionPointRef, impl);\n provides.add(extensionPointRef);\n },\n registerInit: registerOptions => {\n if (registerInit) {\n throw new Error('registerInit must only be called once');\n }\n registerInit = {\n id: feature.id,\n provides,\n consumes: new Set(Object.values(registerOptions.deps)),\n deps: registerOptions.deps,\n init: registerOptions.init as BackendRegisterInit['init'],\n };\n },\n });\n\n if (!registerInit) {\n throw new Error(\n `registerInit was not called by register in ${feature.id}`,\n );\n }\n\n this.#registerInits.push(registerInit);\n }\n\n const orderedRegisterResults = this.#resolveInitOrder(this.#registerInits);\n\n for (const registerInit of orderedRegisterResults) {\n const deps = await this.#getInitDeps(registerInit.deps, registerInit.id);\n await registerInit.init(deps);\n }\n }\n\n #resolveInitOrder(registerInits: Array<BackendRegisterInit>) {\n let registerInitsToOrder = registerInits.slice();\n const orderedRegisterInits = new Array<BackendRegisterInit>();\n\n // TODO: Validate duplicates\n\n while (registerInitsToOrder.length > 0) {\n const toRemove = new Set<unknown>();\n\n for (const registerInit of registerInitsToOrder) {\n const unInitializedDependents = [];\n\n for (const provided of registerInit.provides) {\n if (\n registerInitsToOrder.some(\n init => init !== registerInit && init.consumes.has(provided),\n )\n ) {\n unInitializedDependents.push(provided);\n }\n }\n\n if (unInitializedDependents.length === 0) {\n orderedRegisterInits.push(registerInit);\n toRemove.add(registerInit);\n }\n }\n\n registerInitsToOrder = registerInitsToOrder.filter(r => !toRemove.has(r));\n }\n\n return orderedRegisterInits;\n }\n\n async stop(): Promise<void> {\n if (!this.#started) {\n return;\n }\n\n const lifecycleService = await this.#serviceHolder.get(\n coreServices.rootLifecycle,\n 'root',\n );\n\n // TODO(Rugvip): Find a better way to do this\n if (lifecycleService instanceof BackendLifecycleImpl) {\n await lifecycleService.shutdown();\n } else {\n throw new Error('Unexpected lifecycle service implementation');\n }\n }\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n ServiceFactory,\n ServiceRef,\n coreServices,\n} from '@backstage/backend-plugin-api';\nimport { stringifyError } from '@backstage/errors';\nimport { EnumerableServiceHolder } from './types';\n/**\n * Keep in sync with `@backstage/backend-plugin-api/src/services/system/types.ts`\n * @internal\n */\nexport type InternalServiceRef<T> = ServiceRef<T> & {\n __defaultFactory?: (\n service: ServiceRef<T>,\n ) => Promise<ServiceFactory<T> | (() => ServiceFactory<T>)>;\n};\n\nexport class ServiceRegistry implements EnumerableServiceHolder {\n readonly #providedFactories: Map<string, ServiceFactory>;\n readonly #loadedDefaultFactories: Map<Function, Promise<ServiceFactory>>;\n readonly #implementations: Map<\n ServiceFactory,\n {\n factoryFunc: Promise<\n (deps: { [name in string]: unknown }) => Promise<unknown>\n >;\n byPlugin: Map<string, Promise<unknown>>;\n }\n >;\n\n constructor(\n factories: Array<ServiceFactory<unknown> | (() => ServiceFactory<unknown>)>,\n ) {\n this.#providedFactories = new Map(\n factories.map(f => {\n if (typeof f === 'function') {\n const cf = f();\n return [cf.service.id, cf];\n }\n return [f.service.id, f];\n }),\n );\n this.#loadedDefaultFactories = new Map();\n this.#implementations = new Map();\n }\n\n #resolveFactory(\n ref: ServiceRef<unknown>,\n pluginId: string,\n ): Promise<ServiceFactory> | undefined {\n // Special case handling of the plugin metadata service, generating a custom factory for it each time\n if (ref.id === coreServices.pluginMetadata.id) {\n return Promise.resolve({\n scope: 'plugin',\n service: coreServices.pluginMetadata,\n deps: {},\n factory: async () => async () => ({\n getId() {\n return pluginId;\n },\n }),\n });\n }\n\n let resolvedFactory: Promise<ServiceFactory> | ServiceFactory | undefined =\n this.#providedFactories.get(ref.id);\n const { __defaultFactory: defaultFactory } =\n ref as InternalServiceRef<unknown>;\n if (!resolvedFactory && !defaultFactory) {\n return undefined;\n }\n\n if (!resolvedFactory) {\n let loadedFactory = this.#loadedDefaultFactories.get(defaultFactory!);\n if (!loadedFactory) {\n loadedFactory = Promise.resolve()\n .then(() => defaultFactory!(ref))\n .then(f =>\n typeof f === 'function' ? f() : f,\n ) as Promise<ServiceFactory>;\n this.#loadedDefaultFactories.set(defaultFactory!, loadedFactory);\n }\n resolvedFactory = loadedFactory.catch(error => {\n throw new Error(\n `Failed to instantiate service '${\n ref.id\n }' because the default factory loader threw an error, ${stringifyError(\n error,\n )}`,\n );\n });\n }\n\n return Promise.resolve(resolvedFactory);\n }\n\n #separateMapForTheRootService = new Map<ServiceFactory, Promise<unknown>>();\n\n #checkForMissingDeps(factory: ServiceFactory, pluginId: string) {\n const missingDeps = Object.values(factory.deps).filter(ref => {\n if (ref.id === coreServices.pluginMetadata.id) {\n return false;\n }\n if (this.#providedFactories.get(ref.id)) {\n return false;\n }\n\n return !(ref as InternalServiceRef<unknown>).__defaultFactory;\n });\n\n if (missingDeps.length) {\n const missing = missingDeps.map(r => `'${r.id}'`).join(', ');\n throw new Error(\n `Failed to instantiate service '${factory.service.id}' for '${pluginId}' because the following dependent services are missing: ${missing}`,\n );\n }\n }\n\n getServiceRefs(): ServiceRef<unknown>[] {\n return Array.from(this.#providedFactories.values()).map(f => f.service);\n }\n\n get<T>(ref: ServiceRef<T>, pluginId: string): Promise<T> | undefined {\n return this.#resolveFactory(ref, pluginId)?.then(factory => {\n if (factory.scope === 'root') {\n let existing = this.#separateMapForTheRootService.get(factory);\n if (!existing) {\n this.#checkForMissingDeps(factory, pluginId);\n const rootDeps = new Array<Promise<[name: string, impl: unknown]>>();\n\n for (const [name, serviceRef] of Object.entries(factory.deps)) {\n if (serviceRef.scope !== 'root') {\n throw new Error(\n `Failed to instantiate 'root' scoped service '${ref.id}' because it depends on '${serviceRef.scope}' scoped service '${serviceRef.id}'.`,\n );\n }\n const target = this.get(serviceRef, pluginId)!;\n rootDeps.push(target.then(impl => [name, impl]));\n }\n\n existing = Promise.all(rootDeps).then(entries =>\n factory.factory(Object.fromEntries(entries)),\n );\n this.#separateMapForTheRootService.set(factory, existing);\n }\n return existing as Promise<T>;\n }\n\n let implementation = this.#implementations.get(factory);\n if (!implementation) {\n this.#checkForMissingDeps(factory, pluginId);\n const rootDeps = new Array<Promise<[name: string, impl: unknown]>>();\n\n for (const [name, serviceRef] of Object.entries(factory.deps)) {\n if (serviceRef.scope === 'root') {\n const target = this.get(serviceRef, pluginId)!;\n rootDeps.push(target.then(impl => [name, impl]));\n }\n }\n\n implementation = {\n factoryFunc: Promise.all(rootDeps)\n .then(entries => factory.factory(Object.fromEntries(entries)))\n .catch(error => {\n const cause = stringifyError(error);\n throw new Error(\n `Failed to instantiate service '${ref.id}' because the top-level factory function threw an error, ${cause}`,\n );\n }),\n byPlugin: new Map(),\n };\n\n this.#implementations.set(factory, implementation);\n }\n\n let result = implementation.byPlugin.get(pluginId) as Promise<any>;\n if (!result) {\n const allDeps = new Array<Promise<[name: string, impl: unknown]>>();\n\n for (const [name, serviceRef] of Object.entries(factory.deps)) {\n const target = this.get(serviceRef, pluginId)!;\n allDeps.push(target.then(impl => [name, impl]));\n }\n\n result = implementation.factoryFunc\n .then(func =>\n Promise.all(allDeps).then(entries =>\n func(Object.fromEntries(entries)),\n ),\n )\n .catch(error => {\n const cause = stringifyError(error);\n throw new Error(\n `Failed to instantiate service '${ref.id}' for '${pluginId}' because the factory function threw an error, ${cause}`,\n );\n });\n implementation.byPlugin.set(pluginId, result);\n }\n\n return result;\n });\n }\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ServiceFactory, BackendFeature } from '@backstage/backend-plugin-api';\nimport { BackendInitializer } from './BackendInitializer';\nimport { ServiceRegistry } from './ServiceRegistry';\nimport { Backend } from './types';\n\nexport class BackstageBackend implements Backend {\n #services: ServiceRegistry;\n #initializer: BackendInitializer;\n\n constructor(apiFactories: ServiceFactory[]) {\n this.#services = new ServiceRegistry(apiFactories);\n this.#initializer = new BackendInitializer(this.#services);\n }\n\n add(feature: BackendFeature): void {\n this.#initializer.add(feature);\n }\n\n async start(): Promise<void> {\n await this.#initializer.start();\n }\n\n async stop(): Promise<void> {\n await this.#initializer.stop();\n }\n}\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n ServiceFactory,\n BackendFeature,\n ExtensionPoint,\n ServiceRef,\n} from '@backstage/backend-plugin-api';\nimport { BackstageBackend } from './BackstageBackend';\n\n/**\n * @public\n */\nexport interface Backend {\n add(feature: BackendFeature): void;\n start(): Promise<void>;\n stop(): Promise<void>;\n}\n\nexport interface BackendRegisterInit {\n id: string;\n consumes: Set<ServiceOrExtensionPoint>;\n provides: Set<ServiceOrExtensionPoint>;\n deps: { [name: string]: ServiceOrExtensionPoint };\n init: (deps: { [name: string]: unknown }) => Promise<void>;\n}\n\n/**\n * @public\n */\nexport interface CreateSpecializedBackendOptions {\n services: (ServiceFactory | (() => ServiceFactory))[];\n}\n\nexport interface ServiceHolder {\n get<T>(api: ServiceRef<T>, pluginId: string): Promise<T> | undefined;\n}\n\n/**\n * @internal\n */\nexport interface EnumerableServiceHolder extends ServiceHolder {\n getServiceRefs(): ServiceRef<unknown>[];\n}\n\n/**\n * @public\n */\nexport function createSpecializedBackend(\n options: CreateSpecializedBackendOptions,\n): Backend {\n return new BackstageBackend(\n options.services.map(s => (typeof s === 'function' ? s() : s)),\n );\n}\n\n/**\n * @public\n */\nexport type ServiceOrExtensionPoint<T = unknown> =\n | ExtensionPoint<T>\n | ServiceRef<T>;\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { CacheManager } from '@backstage/backend-common';\nimport {\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\n\n/** @public */\nexport const cacheFactory = createServiceFactory({\n service: coreServices.cache,\n deps: {\n config: coreServices.config,\n plugin: coreServices.pluginMetadata,\n },\n async factory({ config }) {\n const cacheManager = CacheManager.fromConfig(config);\n return async ({ plugin }) => {\n return cacheManager.forPlugin(plugin.getId());\n };\n },\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { loadBackendConfig } from '@backstage/backend-common';\nimport {\n coreServices,\n createServiceFactory,\n loggerToWinstonLogger,\n} from '@backstage/backend-plugin-api';\n\n/** @public */\nexport const configFactory = createServiceFactory({\n service: coreServices.config,\n deps: {\n logger: coreServices.rootLogger,\n },\n async factory({ logger }) {\n const config = await loadBackendConfig({\n argv: process.argv,\n logger: loggerToWinstonLogger(logger),\n });\n return config;\n },\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DatabaseManager } from '@backstage/backend-common';\nimport {\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\n\n/** @public */\nexport const databaseFactory = createServiceFactory({\n service: coreServices.database,\n deps: {\n config: coreServices.config,\n plugin: coreServices.pluginMetadata,\n },\n async factory({ config }) {\n const databaseManager = DatabaseManager.fromConfig(config);\n return async ({ plugin }) => {\n return databaseManager.forPlugin(plugin.getId());\n };\n },\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SingleHostDiscovery } from '@backstage/backend-common';\nimport {\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\n\n/** @public */\nexport const discoveryFactory = createServiceFactory({\n service: coreServices.discovery,\n deps: {\n config: coreServices.config,\n },\n async factory({ config }) {\n const discovery = SingleHostDiscovery.fromConfig(config);\n return async () => {\n return discovery;\n };\n },\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n createServiceFactory,\n coreServices,\n} from '@backstage/backend-plugin-api';\n\n/** @public */\nexport const loggerFactory = createServiceFactory({\n service: coreServices.logger,\n deps: {\n rootLogger: coreServices.rootLogger,\n plugin: coreServices.pluginMetadata,\n },\n async factory({ rootLogger }) {\n return async ({ plugin }) => {\n return rootLogger.child({ pluginId: plugin.getId() });\n };\n },\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { createRootLogger } from '@backstage/backend-common';\nimport {\n createServiceFactory,\n LoggerService,\n coreServices,\n} from '@backstage/backend-plugin-api';\nimport { LogMeta } from '@backstage/backend-plugin-api';\nimport { Logger as WinstonLogger } from 'winston';\n\nclass BackstageLogger implements LoggerService {\n static fromWinston(logger: WinstonLogger): BackstageLogger {\n return new BackstageLogger(logger);\n }\n\n private constructor(private readonly winston: WinstonLogger) {}\n\n error(message: string, meta?: LogMeta): void {\n this.winston.error(message, meta);\n }\n\n warn(message: string, meta?: LogMeta): void {\n this.winston.warn(message, meta);\n }\n\n info(message: string, meta?: LogMeta): void {\n this.winston.info(message, meta);\n }\n\n debug(message: string, meta?: LogMeta): void {\n this.winston.debug(message, meta);\n }\n\n child(meta: LogMeta): LoggerService {\n return new BackstageLogger(this.winston.child(meta));\n }\n}\n\n/** @public */\nexport const rootLoggerFactory = createServiceFactory({\n service: coreServices.rootLogger,\n deps: {},\n async factory() {\n return BackstageLogger.fromWinston(createRootLogger());\n },\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\nimport { ServerPermissionClient } from '@backstage/plugin-permission-node';\n\n/** @public */\nexport const permissionsFactory = createServiceFactory({\n service: coreServices.permissions,\n deps: {\n config: coreServices.config,\n discovery: coreServices.discovery,\n tokenManager: coreServices.tokenManager,\n },\n async factory({ config }) {\n return async ({ discovery, tokenManager }) => {\n return ServerPermissionClient.fromConfig(config, {\n discovery,\n tokenManager,\n });\n };\n },\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n coreServices,\n createServiceFactory,\n} from '@backstage/backend-plugin-api';\nimport { TaskScheduler } from '@backstage/backend-tasks';\n\n/** @public */\nexport const schedulerFactory = createServiceFactory({\n service: coreServices.scheduler,\n deps: {\n config: coreServices.config,\n plugin: coreServices.pluginMetadata,\n },\n async factory({ config }) {\n const taskScheduler = TaskScheduler.fromConfig(config);\n return async ({ plugin }) => {\n return taskScheduler.forPlugin(plugin.getId());\n };\n },\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n coreServices,\n createServiceFactory,\n loggerToWinstonLogger,\n} from '@backstage/backend-plugin-api';\nimport { ServerTokenManager } from '@backstage/backend-common';\n\n/** @public */\nexport const tokenManagerFactory = createServiceFactory({\n service: coreServices.tokenManager,\n deps: {\n config: coreServices.config,\n logger: coreServices.logger,\n },\n async factory() {\n return async ({ config, logger }) => {\n return ServerTokenManager.fromConfig(config, {\n logger: loggerToWinstonLogger(logger),\n });\n };\n },\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { UrlReaders } from '@backstage/backend-common';\nimport {\n coreServices,\n createServiceFactory,\n loggerToWinstonLogger,\n} from '@backstage/backend-plugin-api';\n\n/** @public */\nexport const urlReaderFactory = createServiceFactory({\n service: coreServices.urlReader,\n deps: {\n config: coreServices.config,\n logger: coreServices.logger,\n },\n async factory() {\n return async ({ config, logger }) => {\n return UrlReaders.default({\n config,\n logger: loggerToWinstonLogger(logger),\n });\n };\n },\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n createServiceFactory,\n coreServices,\n} from '@backstage/backend-plugin-api';\nimport Router from 'express-promise-router';\nimport { Handler } from 'express';\nimport { createServiceBuilder } from '@backstage/backend-common';\n\n/**\n * @public\n */\nexport type HttpRouterFactoryOptions = {\n /**\n * The plugin ID used for the index route. Defaults to 'app'\n */\n indexPlugin?: string;\n};\n\n/** @public */\nexport const httpRouterFactory = createServiceFactory({\n service: coreServices.httpRouter,\n deps: {\n config: coreServices.config,\n plugin: coreServices.pluginMetadata,\n },\n async factory({ config }, options?: HttpRouterFactoryOptions) {\n const defaultPluginId = options?.indexPlugin ?? 'app';\n\n const apiRouter = Router();\n const rootRouter = Router();\n\n const service = createServiceBuilder(module)\n .loadConfig(config)\n .addRouter('/api', apiRouter)\n .addRouter('', rootRouter);\n\n await service.start();\n\n return async ({ plugin }) => {\n const pluginId = plugin.getId();\n return {\n use(handler: Handler) {\n if (pluginId === defaultPluginId) {\n rootRouter.use(handler);\n } else {\n apiRouter.use(`/${pluginId}`, handler);\n }\n },\n };\n };\n },\n});\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n createServiceFactory,\n coreServices,\n LifecycleServiceShutdownHook,\n} from '@backstage/backend-plugin-api';\n\n/**\n * Allows plugins to register shutdown hooks that are run when the process is about to exit.\n * @public */\nexport const lifecycleFactory = createServiceFactory({\n service: coreServices.lifecycle,\n deps: {\n rootLifecycle: coreServices.rootLifecycle,\n pluginMetadata: coreServices.pluginMetadata,\n },\n async factory({ rootLifecycle }) {\n return async ({ pluginMetadata }) => {\n const plugin = pluginMetadata.getId();\n return {\n addShutdownHook(options: LifecycleServiceShutdownHook): void {\n rootLifecycle.addShutdownHook({\n ...options,\n labels: { ...options?.labels, plugin },\n });\n },\n };\n };\n },\n});\n"],"names":["__privateAdd","__privateGet","__privateSet","createServiceFactory","coreServices","loggerToWinstonLogger","__privateMethod","stringifyError","CacheManager","loadBackendConfig","DatabaseManager","SingleHostDiscovery","createRootLogger","ServerPermissionClient","TaskScheduler","ServerTokenManager","UrlReaders","Router","createServiceBuilder"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -5,13 +5,12 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import { BackendFeature } from '@backstage/backend-plugin-api';
|
|
8
|
-
import { BackendLifecycle } from '@backstage/backend-plugin-api';
|
|
9
8
|
import { Config } from '@backstage/config';
|
|
10
9
|
import { ExtensionPoint } from '@backstage/backend-plugin-api';
|
|
11
10
|
import { HttpRouterService } from '@backstage/backend-plugin-api';
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
11
|
+
import { LifecycleService } from '@backstage/backend-plugin-api';
|
|
12
|
+
import { LoggerService } from '@backstage/backend-plugin-api';
|
|
13
|
+
import { PermissionsService } from '@backstage/backend-plugin-api';
|
|
15
14
|
import { PluginCacheManager } from '@backstage/backend-common';
|
|
16
15
|
import { PluginDatabaseManager } from '@backstage/backend-common';
|
|
17
16
|
import { PluginEndpointDiscovery } from '@backstage/backend-common';
|
|
@@ -27,6 +26,7 @@ import { UrlReader } from '@backstage/backend-common';
|
|
|
27
26
|
export declare interface Backend {
|
|
28
27
|
add(feature: BackendFeature): void;
|
|
29
28
|
start(): Promise<void>;
|
|
29
|
+
stop(): Promise<void>;
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
/** @public */
|
|
@@ -69,16 +69,21 @@ export declare type HttpRouterFactoryOptions = {
|
|
|
69
69
|
/**
|
|
70
70
|
* Allows plugins to register shutdown hooks that are run when the process is about to exit.
|
|
71
71
|
* @public */
|
|
72
|
-
export declare const lifecycleFactory: (options?: undefined) => ServiceFactory<
|
|
72
|
+
export declare const lifecycleFactory: (options?: undefined) => ServiceFactory<LifecycleService>;
|
|
73
73
|
|
|
74
74
|
/** @public */
|
|
75
|
-
export declare const loggerFactory: (options?: undefined) => ServiceFactory<
|
|
75
|
+
export declare const loggerFactory: (options?: undefined) => ServiceFactory<LoggerService>;
|
|
76
76
|
|
|
77
77
|
/** @public */
|
|
78
|
-
export declare const permissionsFactory: (options?: undefined) => ServiceFactory<
|
|
78
|
+
export declare const permissionsFactory: (options?: undefined) => ServiceFactory<PermissionsService>;
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Allows plugins to register shutdown hooks that are run when the process is about to exit.
|
|
82
|
+
* @public */
|
|
83
|
+
export declare const rootLifecycleFactory: (options?: undefined) => ServiceFactory<LifecycleService>;
|
|
79
84
|
|
|
80
85
|
/** @public */
|
|
81
|
-
export declare const rootLoggerFactory: (options?: undefined) => ServiceFactory<
|
|
86
|
+
export declare const rootLoggerFactory: (options?: undefined) => ServiceFactory<LoggerService>;
|
|
82
87
|
|
|
83
88
|
/** @public */
|
|
84
89
|
export declare const schedulerFactory: (options?: undefined) => ServiceFactory<PluginTaskScheduler>;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage/backend-app-api",
|
|
3
3
|
"description": "Core API used by Backstage backend apps",
|
|
4
|
-
"version": "0.2.
|
|
4
|
+
"version": "0.2.5-next.0",
|
|
5
5
|
"main": "dist/index.cjs.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"publishConfig": {
|
|
@@ -33,17 +33,17 @@
|
|
|
33
33
|
"start": "backstage-cli package start"
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@backstage/backend-common": "^0.
|
|
37
|
-
"@backstage/backend-plugin-api": "^0.2.
|
|
38
|
-
"@backstage/backend-tasks": "^0.4.
|
|
39
|
-
"@backstage/errors": "^1.1.4
|
|
40
|
-
"@backstage/plugin-permission-node": "^0.7.
|
|
36
|
+
"@backstage/backend-common": "^0.18.0-next.0",
|
|
37
|
+
"@backstage/backend-plugin-api": "^0.2.1-next.0",
|
|
38
|
+
"@backstage/backend-tasks": "^0.4.1-next.0",
|
|
39
|
+
"@backstage/errors": "^1.1.4",
|
|
40
|
+
"@backstage/plugin-permission-node": "^0.7.3-next.0",
|
|
41
41
|
"express": "^4.17.1",
|
|
42
42
|
"express-promise-router": "^4.1.0",
|
|
43
43
|
"winston": "^3.2.1"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
|
-
"@backstage/cli": "^0.22.
|
|
46
|
+
"@backstage/cli": "^0.22.1-next.1"
|
|
47
47
|
},
|
|
48
48
|
"files": [
|
|
49
49
|
"dist",
|