@backstage/backend-app-api 0.2.4-next.2 → 0.2.4
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 +28 -0
- package/alpha/package.json +1 -1
- package/dist/index.alpha.d.ts +8 -8
- package/dist/index.beta.d.ts +8 -8
- package/dist/index.cjs.js +173 -138
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +8 -8
- package/package.json +7 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,33 @@
|
|
|
1
1
|
# @backstage/backend-app-api
|
|
2
2
|
|
|
3
|
+
## 0.2.4
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- cb1c2781c0: Updated logger implementations to match interface changes.
|
|
8
|
+
- 884d749b14: Refactored to use `coreServices` from `@backstage/backend-plugin-api`.
|
|
9
|
+
- afa3bf5657: Added `.stop()` method to `Backend`.
|
|
10
|
+
- d6dbf1792b: Added `lifecycleFactory` implementation.
|
|
11
|
+
- 05a928e296: Updated usages of types from `@backstage/backend-plugin-api`.
|
|
12
|
+
- 5260d8fc7d: Root scoped services are now always initialized, regardless of whether they're used by any features.
|
|
13
|
+
- Updated dependencies
|
|
14
|
+
- @backstage/backend-common@0.17.0
|
|
15
|
+
- @backstage/backend-tasks@0.4.0
|
|
16
|
+
- @backstage/plugin-permission-node@0.7.2
|
|
17
|
+
- @backstage/errors@1.1.4
|
|
18
|
+
- @backstage/backend-plugin-api@0.2.0
|
|
19
|
+
|
|
20
|
+
## 0.2.4-next.3
|
|
21
|
+
|
|
22
|
+
### Patch Changes
|
|
23
|
+
|
|
24
|
+
- Updated dependencies
|
|
25
|
+
- @backstage/backend-tasks@0.4.0-next.3
|
|
26
|
+
- @backstage/plugin-permission-node@0.7.2-next.3
|
|
27
|
+
- @backstage/backend-common@0.17.0-next.3
|
|
28
|
+
- @backstage/backend-plugin-api@0.2.0-next.3
|
|
29
|
+
- @backstage/errors@1.1.4-next.1
|
|
30
|
+
|
|
3
31
|
## 0.2.4-next.2
|
|
4
32
|
|
|
5
33
|
### 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,16 @@ 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
79
|
|
|
80
80
|
/** @public */
|
|
81
|
-
export declare const rootLoggerFactory: (options?: undefined) => ServiceFactory<
|
|
81
|
+
export declare const rootLoggerFactory: (options?: undefined) => ServiceFactory<LoggerService>;
|
|
82
82
|
|
|
83
83
|
/** @public */
|
|
84
84
|
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,16 @@ 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
79
|
|
|
80
80
|
/** @public */
|
|
81
|
-
export declare const rootLoggerFactory: (options?: undefined) => ServiceFactory<
|
|
81
|
+
export declare const rootLoggerFactory: (options?: undefined) => ServiceFactory<LoggerService>;
|
|
82
82
|
|
|
83
83
|
/** @public */
|
|
84
84
|
export declare const schedulerFactory: (options?: undefined) => ServiceFactory<PluginTaskScheduler>;
|
package/dist/index.cjs.js
CHANGED
|
@@ -31,34 +31,117 @@ 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(
|
|
54
|
+
(hook) => Promise.resolve().then(() => hook.fn()).catch((e) => {
|
|
55
|
+
this.logger.error(
|
|
56
|
+
`Shutdown hook registered by plugin '${hook.pluginId}' failed with: ${e}`
|
|
57
|
+
);
|
|
58
|
+
}).then(
|
|
59
|
+
() => this.logger.info(
|
|
60
|
+
`Successfully ran shutdown hook registered by plugin ${hook.pluginId}`
|
|
61
|
+
)
|
|
62
|
+
)
|
|
63
|
+
)
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
_isCalled = new WeakMap();
|
|
68
|
+
_shutdownTasks = new WeakMap();
|
|
69
|
+
class PluginScopedLifecycleImpl {
|
|
70
|
+
constructor(lifecycle, pluginId) {
|
|
71
|
+
this.lifecycle = lifecycle;
|
|
72
|
+
this.pluginId = pluginId;
|
|
73
|
+
}
|
|
74
|
+
addShutdownHook(options) {
|
|
75
|
+
this.lifecycle.addShutdownHook({ ...options, pluginId: this.pluginId });
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
const lifecycleFactory = backendPluginApi.createServiceFactory({
|
|
79
|
+
service: backendPluginApi.coreServices.lifecycle,
|
|
80
|
+
deps: {
|
|
81
|
+
logger: backendPluginApi.coreServices.rootLogger,
|
|
82
|
+
plugin: backendPluginApi.coreServices.pluginMetadata
|
|
83
|
+
},
|
|
84
|
+
async factory({ logger }) {
|
|
85
|
+
const rootLifecycle = new BackendLifecycleImpl(
|
|
86
|
+
backendPluginApi.loggerToWinstonLogger(logger)
|
|
87
|
+
);
|
|
88
|
+
return async ({ plugin }) => {
|
|
89
|
+
return new PluginScopedLifecycleImpl(rootLifecycle, plugin.getId());
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
var __accessCheck$2 = (obj, member, msg) => {
|
|
95
|
+
if (!member.has(obj))
|
|
96
|
+
throw TypeError("Cannot " + msg);
|
|
97
|
+
};
|
|
98
|
+
var __privateGet$2 = (obj, member, getter) => {
|
|
99
|
+
__accessCheck$2(obj, member, "read from private field");
|
|
100
|
+
return getter ? getter.call(obj) : member.get(obj);
|
|
101
|
+
};
|
|
102
|
+
var __privateAdd$2 = (obj, member, value) => {
|
|
103
|
+
if (member.has(obj))
|
|
104
|
+
throw TypeError("Cannot add the same private member more than once");
|
|
105
|
+
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
106
|
+
};
|
|
107
|
+
var __privateSet$2 = (obj, member, value, setter) => {
|
|
108
|
+
__accessCheck$2(obj, member, "write to private field");
|
|
109
|
+
setter ? setter.call(obj, value) : member.set(obj, value);
|
|
110
|
+
return value;
|
|
111
|
+
};
|
|
34
112
|
var __privateMethod$1 = (obj, member, method) => {
|
|
35
|
-
__accessCheck$
|
|
113
|
+
__accessCheck$2(obj, member, "access private method");
|
|
36
114
|
return method;
|
|
37
115
|
};
|
|
38
116
|
var _started, _features, _registerInits, _extensionPoints, _serviceHolder, _getInitDeps, getInitDeps_fn, _resolveInitOrder, resolveInitOrder_fn;
|
|
39
117
|
class BackendInitializer {
|
|
40
118
|
constructor(serviceHolder) {
|
|
41
|
-
__privateAdd$
|
|
42
|
-
__privateAdd$
|
|
43
|
-
__privateAdd$
|
|
44
|
-
__privateAdd$
|
|
45
|
-
__privateAdd$
|
|
46
|
-
__privateAdd$
|
|
47
|
-
__privateAdd$
|
|
48
|
-
__privateSet$
|
|
119
|
+
__privateAdd$2(this, _getInitDeps);
|
|
120
|
+
__privateAdd$2(this, _resolveInitOrder);
|
|
121
|
+
__privateAdd$2(this, _started, false);
|
|
122
|
+
__privateAdd$2(this, _features, /* @__PURE__ */ new Map());
|
|
123
|
+
__privateAdd$2(this, _registerInits, new Array());
|
|
124
|
+
__privateAdd$2(this, _extensionPoints, /* @__PURE__ */ new Map());
|
|
125
|
+
__privateAdd$2(this, _serviceHolder, void 0);
|
|
126
|
+
__privateSet$2(this, _serviceHolder, serviceHolder);
|
|
49
127
|
}
|
|
50
128
|
add(feature, options) {
|
|
51
|
-
if (__privateGet$
|
|
129
|
+
if (__privateGet$2(this, _started)) {
|
|
52
130
|
throw new Error("feature can not be added after the backend has started");
|
|
53
131
|
}
|
|
54
|
-
__privateGet$
|
|
132
|
+
__privateGet$2(this, _features).set(feature, options);
|
|
55
133
|
}
|
|
56
134
|
async start() {
|
|
57
|
-
if (__privateGet$
|
|
135
|
+
if (__privateGet$2(this, _started)) {
|
|
58
136
|
throw new Error("Backend has already started");
|
|
59
137
|
}
|
|
60
|
-
__privateSet$
|
|
61
|
-
for (const
|
|
138
|
+
__privateSet$2(this, _started, true);
|
|
139
|
+
for (const ref of __privateGet$2(this, _serviceHolder).getServiceRefs()) {
|
|
140
|
+
if (ref.scope === "root") {
|
|
141
|
+
await __privateGet$2(this, _serviceHolder).get(ref, "root");
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
for (const [feature] of __privateGet$2(this, _features)) {
|
|
62
145
|
const provides = /* @__PURE__ */ new Set();
|
|
63
146
|
let registerInit = void 0;
|
|
64
147
|
feature.register({
|
|
@@ -66,10 +149,10 @@ class BackendInitializer {
|
|
|
66
149
|
if (registerInit) {
|
|
67
150
|
throw new Error("registerExtensionPoint called after registerInit");
|
|
68
151
|
}
|
|
69
|
-
if (__privateGet$
|
|
152
|
+
if (__privateGet$2(this, _extensionPoints).has(extensionPointRef)) {
|
|
70
153
|
throw new Error(`API ${extensionPointRef.id} already registered`);
|
|
71
154
|
}
|
|
72
|
-
__privateGet$
|
|
155
|
+
__privateGet$2(this, _extensionPoints).set(extensionPointRef, impl);
|
|
73
156
|
provides.add(extensionPointRef);
|
|
74
157
|
},
|
|
75
158
|
registerInit: (registerOptions) => {
|
|
@@ -90,14 +173,29 @@ class BackendInitializer {
|
|
|
90
173
|
`registerInit was not called by register in ${feature.id}`
|
|
91
174
|
);
|
|
92
175
|
}
|
|
93
|
-
__privateGet$
|
|
176
|
+
__privateGet$2(this, _registerInits).push(registerInit);
|
|
94
177
|
}
|
|
95
|
-
const orderedRegisterResults = __privateMethod$1(this, _resolveInitOrder, resolveInitOrder_fn).call(this, __privateGet$
|
|
178
|
+
const orderedRegisterResults = __privateMethod$1(this, _resolveInitOrder, resolveInitOrder_fn).call(this, __privateGet$2(this, _registerInits));
|
|
96
179
|
for (const registerInit of orderedRegisterResults) {
|
|
97
180
|
const deps = await __privateMethod$1(this, _getInitDeps, getInitDeps_fn).call(this, registerInit.deps, registerInit.id);
|
|
98
181
|
await registerInit.init(deps);
|
|
99
182
|
}
|
|
100
183
|
}
|
|
184
|
+
async stop() {
|
|
185
|
+
if (!__privateGet$2(this, _started)) {
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
const lifecycleService = await __privateGet$2(this, _serviceHolder).get(
|
|
189
|
+
backendPluginApi.coreServices.lifecycle,
|
|
190
|
+
"root"
|
|
191
|
+
);
|
|
192
|
+
const lifecycle = lifecycleService == null ? void 0 : lifecycleService.lifecycle;
|
|
193
|
+
if (lifecycle instanceof BackendLifecycleImpl) {
|
|
194
|
+
await lifecycle.shutdown();
|
|
195
|
+
} else {
|
|
196
|
+
throw new Error("Unexpected lifecycle service implementation");
|
|
197
|
+
}
|
|
198
|
+
}
|
|
101
199
|
}
|
|
102
200
|
_started = new WeakMap();
|
|
103
201
|
_features = new WeakMap();
|
|
@@ -109,13 +207,13 @@ getInitDeps_fn = async function(deps, pluginId) {
|
|
|
109
207
|
const result = /* @__PURE__ */ new Map();
|
|
110
208
|
const missingRefs = /* @__PURE__ */ new Set();
|
|
111
209
|
for (const [name, ref] of Object.entries(deps)) {
|
|
112
|
-
const extensionPoint = __privateGet$
|
|
210
|
+
const extensionPoint = __privateGet$2(this, _extensionPoints).get(
|
|
113
211
|
ref
|
|
114
212
|
);
|
|
115
213
|
if (extensionPoint) {
|
|
116
214
|
result.set(name, extensionPoint);
|
|
117
215
|
} else {
|
|
118
|
-
const impl = await __privateGet$
|
|
216
|
+
const impl = await __privateGet$2(this, _serviceHolder).get(
|
|
119
217
|
ref,
|
|
120
218
|
pluginId
|
|
121
219
|
);
|
|
@@ -159,38 +257,38 @@ resolveInitOrder_fn = function(registerInits) {
|
|
|
159
257
|
return orderedRegisterInits;
|
|
160
258
|
};
|
|
161
259
|
|
|
162
|
-
var __accessCheck$
|
|
260
|
+
var __accessCheck$1 = (obj, member, msg) => {
|
|
163
261
|
if (!member.has(obj))
|
|
164
262
|
throw TypeError("Cannot " + msg);
|
|
165
263
|
};
|
|
166
|
-
var __privateGet$
|
|
167
|
-
__accessCheck$
|
|
264
|
+
var __privateGet$1 = (obj, member, getter) => {
|
|
265
|
+
__accessCheck$1(obj, member, "read from private field");
|
|
168
266
|
return getter ? getter.call(obj) : member.get(obj);
|
|
169
267
|
};
|
|
170
|
-
var __privateAdd$
|
|
268
|
+
var __privateAdd$1 = (obj, member, value) => {
|
|
171
269
|
if (member.has(obj))
|
|
172
270
|
throw TypeError("Cannot add the same private member more than once");
|
|
173
271
|
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
174
272
|
};
|
|
175
|
-
var __privateSet$
|
|
176
|
-
__accessCheck$
|
|
273
|
+
var __privateSet$1 = (obj, member, value, setter) => {
|
|
274
|
+
__accessCheck$1(obj, member, "write to private field");
|
|
177
275
|
setter ? setter.call(obj, value) : member.set(obj, value);
|
|
178
276
|
return value;
|
|
179
277
|
};
|
|
180
278
|
var __privateMethod = (obj, member, method) => {
|
|
181
|
-
__accessCheck$
|
|
279
|
+
__accessCheck$1(obj, member, "access private method");
|
|
182
280
|
return method;
|
|
183
281
|
};
|
|
184
282
|
var _providedFactories, _loadedDefaultFactories, _implementations, _resolveFactory, resolveFactory_fn, _separateMapForTheRootService, _checkForMissingDeps, checkForMissingDeps_fn;
|
|
185
283
|
class ServiceRegistry {
|
|
186
284
|
constructor(factories) {
|
|
187
|
-
__privateAdd$
|
|
188
|
-
__privateAdd$
|
|
189
|
-
__privateAdd$
|
|
190
|
-
__privateAdd$
|
|
191
|
-
__privateAdd$
|
|
192
|
-
__privateAdd$
|
|
193
|
-
__privateSet$
|
|
285
|
+
__privateAdd$1(this, _resolveFactory);
|
|
286
|
+
__privateAdd$1(this, _checkForMissingDeps);
|
|
287
|
+
__privateAdd$1(this, _providedFactories, void 0);
|
|
288
|
+
__privateAdd$1(this, _loadedDefaultFactories, void 0);
|
|
289
|
+
__privateAdd$1(this, _implementations, void 0);
|
|
290
|
+
__privateAdd$1(this, _separateMapForTheRootService, /* @__PURE__ */ new Map());
|
|
291
|
+
__privateSet$1(this, _providedFactories, new Map(
|
|
194
292
|
factories.map((f) => {
|
|
195
293
|
if (typeof f === "function") {
|
|
196
294
|
const cf = f();
|
|
@@ -199,14 +297,17 @@ class ServiceRegistry {
|
|
|
199
297
|
return [f.service.id, f];
|
|
200
298
|
})
|
|
201
299
|
));
|
|
202
|
-
__privateSet$
|
|
203
|
-
__privateSet$
|
|
300
|
+
__privateSet$1(this, _loadedDefaultFactories, /* @__PURE__ */ new Map());
|
|
301
|
+
__privateSet$1(this, _implementations, /* @__PURE__ */ new Map());
|
|
302
|
+
}
|
|
303
|
+
getServiceRefs() {
|
|
304
|
+
return Array.from(__privateGet$1(this, _providedFactories).values()).map((f) => f.service);
|
|
204
305
|
}
|
|
205
306
|
get(ref, pluginId) {
|
|
206
307
|
var _a;
|
|
207
308
|
return (_a = __privateMethod(this, _resolveFactory, resolveFactory_fn).call(this, ref, pluginId)) == null ? void 0 : _a.then((factory) => {
|
|
208
309
|
if (factory.scope === "root") {
|
|
209
|
-
let existing = __privateGet$
|
|
310
|
+
let existing = __privateGet$1(this, _separateMapForTheRootService).get(factory);
|
|
210
311
|
if (!existing) {
|
|
211
312
|
__privateMethod(this, _checkForMissingDeps, checkForMissingDeps_fn).call(this, factory, pluginId);
|
|
212
313
|
const rootDeps = new Array();
|
|
@@ -222,11 +323,11 @@ class ServiceRegistry {
|
|
|
222
323
|
existing = Promise.all(rootDeps).then(
|
|
223
324
|
(entries) => factory.factory(Object.fromEntries(entries))
|
|
224
325
|
);
|
|
225
|
-
__privateGet$
|
|
326
|
+
__privateGet$1(this, _separateMapForTheRootService).set(factory, existing);
|
|
226
327
|
}
|
|
227
328
|
return existing;
|
|
228
329
|
}
|
|
229
|
-
let implementation = __privateGet$
|
|
330
|
+
let implementation = __privateGet$1(this, _implementations).get(factory);
|
|
230
331
|
if (!implementation) {
|
|
231
332
|
__privateMethod(this, _checkForMissingDeps, checkForMissingDeps_fn).call(this, factory, pluginId);
|
|
232
333
|
const rootDeps = new Array();
|
|
@@ -245,7 +346,7 @@ class ServiceRegistry {
|
|
|
245
346
|
}),
|
|
246
347
|
byPlugin: /* @__PURE__ */ new Map()
|
|
247
348
|
};
|
|
248
|
-
__privateGet$
|
|
349
|
+
__privateGet$1(this, _implementations).set(factory, implementation);
|
|
249
350
|
}
|
|
250
351
|
let result = implementation.byPlugin.get(pluginId);
|
|
251
352
|
if (!result) {
|
|
@@ -287,18 +388,18 @@ resolveFactory_fn = function(ref, pluginId) {
|
|
|
287
388
|
})
|
|
288
389
|
});
|
|
289
390
|
}
|
|
290
|
-
let resolvedFactory = __privateGet$
|
|
391
|
+
let resolvedFactory = __privateGet$1(this, _providedFactories).get(ref.id);
|
|
291
392
|
const { __defaultFactory: defaultFactory } = ref;
|
|
292
393
|
if (!resolvedFactory && !defaultFactory) {
|
|
293
394
|
return void 0;
|
|
294
395
|
}
|
|
295
396
|
if (!resolvedFactory) {
|
|
296
|
-
let loadedFactory = __privateGet$
|
|
397
|
+
let loadedFactory = __privateGet$1(this, _loadedDefaultFactories).get(defaultFactory);
|
|
297
398
|
if (!loadedFactory) {
|
|
298
399
|
loadedFactory = Promise.resolve().then(() => defaultFactory(ref)).then(
|
|
299
400
|
(f) => typeof f === "function" ? f() : f
|
|
300
401
|
);
|
|
301
|
-
__privateGet$
|
|
402
|
+
__privateGet$1(this, _loadedDefaultFactories).set(defaultFactory, loadedFactory);
|
|
302
403
|
}
|
|
303
404
|
resolvedFactory = loadedFactory.catch((error) => {
|
|
304
405
|
throw new Error(
|
|
@@ -317,7 +418,7 @@ checkForMissingDeps_fn = function(factory, pluginId) {
|
|
|
317
418
|
if (ref.id === backendPluginApi.coreServices.pluginMetadata.id) {
|
|
318
419
|
return false;
|
|
319
420
|
}
|
|
320
|
-
if (__privateGet$
|
|
421
|
+
if (__privateGet$1(this, _providedFactories).get(ref.id)) {
|
|
321
422
|
return false;
|
|
322
423
|
}
|
|
323
424
|
return !ref.__defaultFactory;
|
|
@@ -330,37 +431,40 @@ checkForMissingDeps_fn = function(factory, pluginId) {
|
|
|
330
431
|
}
|
|
331
432
|
};
|
|
332
433
|
|
|
333
|
-
var __accessCheck
|
|
434
|
+
var __accessCheck = (obj, member, msg) => {
|
|
334
435
|
if (!member.has(obj))
|
|
335
436
|
throw TypeError("Cannot " + msg);
|
|
336
437
|
};
|
|
337
|
-
var __privateGet
|
|
338
|
-
__accessCheck
|
|
438
|
+
var __privateGet = (obj, member, getter) => {
|
|
439
|
+
__accessCheck(obj, member, "read from private field");
|
|
339
440
|
return getter ? getter.call(obj) : member.get(obj);
|
|
340
441
|
};
|
|
341
|
-
var __privateAdd
|
|
442
|
+
var __privateAdd = (obj, member, value) => {
|
|
342
443
|
if (member.has(obj))
|
|
343
444
|
throw TypeError("Cannot add the same private member more than once");
|
|
344
445
|
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
345
446
|
};
|
|
346
|
-
var __privateSet
|
|
347
|
-
__accessCheck
|
|
447
|
+
var __privateSet = (obj, member, value, setter) => {
|
|
448
|
+
__accessCheck(obj, member, "write to private field");
|
|
348
449
|
setter ? setter.call(obj, value) : member.set(obj, value);
|
|
349
450
|
return value;
|
|
350
451
|
};
|
|
351
452
|
var _services, _initializer;
|
|
352
453
|
class BackstageBackend {
|
|
353
454
|
constructor(apiFactories) {
|
|
354
|
-
__privateAdd
|
|
355
|
-
__privateAdd
|
|
356
|
-
__privateSet
|
|
357
|
-
__privateSet
|
|
455
|
+
__privateAdd(this, _services, void 0);
|
|
456
|
+
__privateAdd(this, _initializer, void 0);
|
|
457
|
+
__privateSet(this, _services, new ServiceRegistry(apiFactories));
|
|
458
|
+
__privateSet(this, _initializer, new BackendInitializer(__privateGet(this, _services)));
|
|
358
459
|
}
|
|
359
460
|
add(feature) {
|
|
360
|
-
__privateGet
|
|
461
|
+
__privateGet(this, _initializer).add(feature);
|
|
361
462
|
}
|
|
362
463
|
async start() {
|
|
363
|
-
await __privateGet
|
|
464
|
+
await __privateGet(this, _initializer).start();
|
|
465
|
+
}
|
|
466
|
+
async stop() {
|
|
467
|
+
await __privateGet(this, _initializer).stop();
|
|
364
468
|
}
|
|
365
469
|
}
|
|
366
470
|
_services = new WeakMap();
|
|
@@ -447,11 +551,20 @@ class BackstageLogger {
|
|
|
447
551
|
static fromWinston(logger) {
|
|
448
552
|
return new BackstageLogger(logger);
|
|
449
553
|
}
|
|
450
|
-
|
|
451
|
-
this.winston.
|
|
554
|
+
error(message, meta) {
|
|
555
|
+
this.winston.error(message, meta);
|
|
556
|
+
}
|
|
557
|
+
warn(message, meta) {
|
|
558
|
+
this.winston.warn(message, meta);
|
|
559
|
+
}
|
|
560
|
+
info(message, meta) {
|
|
561
|
+
this.winston.info(message, meta);
|
|
452
562
|
}
|
|
453
|
-
|
|
454
|
-
|
|
563
|
+
debug(message, meta) {
|
|
564
|
+
this.winston.debug(message, meta);
|
|
565
|
+
}
|
|
566
|
+
child(meta) {
|
|
567
|
+
return new BackstageLogger(this.winston.child(meta));
|
|
455
568
|
}
|
|
456
569
|
}
|
|
457
570
|
const rootLoggerFactory = backendPluginApi.createServiceFactory({
|
|
@@ -552,84 +665,6 @@ const httpRouterFactory = backendPluginApi.createServiceFactory({
|
|
|
552
665
|
}
|
|
553
666
|
});
|
|
554
667
|
|
|
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
|
-
const lifecycleFactory = backendPluginApi.createServiceFactory({
|
|
618
|
-
service: backendPluginApi.coreServices.lifecycle,
|
|
619
|
-
deps: {
|
|
620
|
-
logger: backendPluginApi.coreServices.rootLogger,
|
|
621
|
-
plugin: backendPluginApi.coreServices.pluginMetadata
|
|
622
|
-
},
|
|
623
|
-
async factory({ logger }) {
|
|
624
|
-
const rootLifecycle = new BackendLifecycleImpl(
|
|
625
|
-
backendPluginApi.loggerToWinstonLogger(logger)
|
|
626
|
-
);
|
|
627
|
-
return async ({ plugin }) => {
|
|
628
|
-
return new PluginScopedLifecycleImpl(rootLifecycle, plugin.getId());
|
|
629
|
-
};
|
|
630
|
-
}
|
|
631
|
-
});
|
|
632
|
-
|
|
633
668
|
exports.cacheFactory = cacheFactory;
|
|
634
669
|
exports.configFactory = configFactory;
|
|
635
670
|
exports.createSpecializedBackend = createSpecializedBackend;
|
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/lifecycleService.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"],"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 LifecycleService,\n createServiceFactory,\n coreServices,\n loggerToWinstonLogger,\n LifecycleServiceShutdownHook,\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<LifecycleServiceShutdownHook & { pluginId: string }> =\n [];\n\n addShutdownHook(\n options: LifecycleServiceShutdownHook & { 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 LifecycleService {\n constructor(\n private readonly lifecycle: BackendLifecycleImpl,\n private readonly pluginId: string,\n ) {}\n addShutdownHook(options: LifecycleServiceShutdownHook): 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","/*\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/lifecycleService';\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.lifecycle,\n 'root',\n );\n\n // TODO(Rugvip): Find a better way to do this\n const lifecycle = (lifecycleService as any)?.lifecycle;\n if (lifecycle instanceof BackendLifecycleImpl) {\n await lifecycle.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"],"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,16 @@ 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
79
|
|
|
80
80
|
/** @public */
|
|
81
|
-
export declare const rootLoggerFactory: (options?: undefined) => ServiceFactory<
|
|
81
|
+
export declare const rootLoggerFactory: (options?: undefined) => ServiceFactory<LoggerService>;
|
|
82
82
|
|
|
83
83
|
/** @public */
|
|
84
84
|
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
|
|
4
|
+
"version": "0.2.4",
|
|
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.17.0
|
|
37
|
-
"@backstage/backend-plugin-api": "^0.2.0
|
|
38
|
-
"@backstage/backend-tasks": "^0.4.0
|
|
39
|
-
"@backstage/errors": "^1.1.4
|
|
40
|
-
"@backstage/plugin-permission-node": "^0.7.2
|
|
36
|
+
"@backstage/backend-common": "^0.17.0",
|
|
37
|
+
"@backstage/backend-plugin-api": "^0.2.0",
|
|
38
|
+
"@backstage/backend-tasks": "^0.4.0",
|
|
39
|
+
"@backstage/errors": "^1.1.4",
|
|
40
|
+
"@backstage/plugin-permission-node": "^0.7.2",
|
|
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.
|
|
46
|
+
"@backstage/cli": "^0.22.0"
|
|
47
47
|
},
|
|
48
48
|
"files": [
|
|
49
49
|
"dist",
|