@backstage/backend-app-api 0.1.0 → 0.2.1-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of @backstage/backend-app-api might be problematic. Click here for more details.

package/CHANGELOG.md CHANGED
@@ -1,5 +1,42 @@
1
1
  # @backstage/backend-app-api
2
2
 
3
+ ## 0.2.1-next.0
4
+
5
+ ### Patch Changes
6
+
7
+ - de3347ca74: Updated usages of `ServiceFactory`.
8
+ - Updated dependencies
9
+ - @backstage/backend-common@0.15.1-next.0
10
+ - @backstage/backend-tasks@0.3.5-next.0
11
+ - @backstage/backend-plugin-api@0.1.2-next.0
12
+ - @backstage/plugin-permission-node@0.6.5-next.0
13
+
14
+ ## 0.2.0
15
+
16
+ ### Minor Changes
17
+
18
+ - 5df230d48c: Introduced a new `backend-defaults` package carrying `createBackend` which was previously exported from `backend-app-api`.
19
+ The `backend-app-api` package now exports the `createSpecializedBacked` that does not add any service factories by default.
20
+
21
+ ### Patch Changes
22
+
23
+ - 0599732ec0: Refactored experimental backend system with new type names.
24
+ - Updated dependencies
25
+ - @backstage/backend-common@0.15.0
26
+ - @backstage/backend-plugin-api@0.1.1
27
+ - @backstage/backend-tasks@0.3.4
28
+ - @backstage/plugin-permission-node@0.6.4
29
+
30
+ ## 0.1.1-next.0
31
+
32
+ ### Patch Changes
33
+
34
+ - Updated dependencies
35
+ - @backstage/backend-common@0.15.0-next.0
36
+ - @backstage/backend-tasks@0.3.4-next.0
37
+ - @backstage/backend-plugin-api@0.1.1-next.0
38
+ - @backstage/plugin-permission-node@0.6.4-next.0
39
+
3
40
  ## 0.1.0
4
41
 
5
42
  ### Minor Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/backend-app-api",
3
- "version": "0.1.0",
3
+ "version": "0.2.1-next.0",
4
4
  "main": "../dist/index.cjs.js",
5
5
  "types": "../dist/index.alpha.d.ts"
6
6
  }
@@ -4,27 +4,75 @@
4
4
  * @packageDocumentation
5
5
  */
6
6
 
7
- import { AnyServiceFactory } from '@backstage/backend-plugin-api';
8
- import { BackendRegistrable } from '@backstage/backend-plugin-api';
7
+ import { BackendFeature } from '@backstage/backend-plugin-api';
8
+ import { Config } from '@backstage/config';
9
+ import { ExtensionPoint } from '@backstage/backend-plugin-api';
10
+ import { HttpRouterService } from '@backstage/backend-plugin-api';
11
+ import { Logger } from '@backstage/backend-plugin-api';
12
+ import { PermissionAuthorizer } from '@backstage/plugin-permission-common';
13
+ import { PermissionEvaluator } from '@backstage/plugin-permission-common';
14
+ import { PluginCacheManager } from '@backstage/backend-common';
15
+ import { PluginDatabaseManager } from '@backstage/backend-common';
16
+ import { PluginEndpointDiscovery } from '@backstage/backend-common';
17
+ import { PluginTaskScheduler } from '@backstage/backend-tasks';
18
+ import { ServiceFactory } from '@backstage/backend-plugin-api';
19
+ import { ServiceRef } from '@backstage/backend-plugin-api';
20
+ import { TokenManager } from '@backstage/backend-common';
21
+ import { UrlReader } from '@backstage/backend-common';
9
22
 
10
23
  /**
11
24
  * @public
12
25
  */
13
26
  export declare interface Backend {
14
- add(extension: BackendRegistrable): void;
27
+ add(feature: BackendFeature): void;
15
28
  start(): Promise<void>;
16
29
  }
17
30
 
31
+ /** @public */
32
+ export declare const cacheFactory: ServiceFactory<PluginCacheManager>;
33
+
34
+ /** @public */
35
+ export declare const configFactory: ServiceFactory<Config>;
36
+
18
37
  /**
19
38
  * @public
20
39
  */
21
- export declare function createBackend(options?: CreateBackendOptions): Backend;
40
+ export declare function createSpecializedBackend(options: CreateSpecializedBackendOptions): Backend;
22
41
 
23
42
  /**
24
43
  * @public
25
44
  */
26
- export declare interface CreateBackendOptions {
27
- apis: AnyServiceFactory[];
45
+ export declare interface CreateSpecializedBackendOptions {
46
+ services: ServiceFactory[];
28
47
  }
29
48
 
49
+ /** @public */
50
+ export declare const databaseFactory: ServiceFactory<PluginDatabaseManager>;
51
+
52
+ /** @public */
53
+ export declare const discoveryFactory: ServiceFactory<PluginEndpointDiscovery>;
54
+
55
+ /** @public */
56
+ export declare const httpRouterFactory: ServiceFactory<HttpRouterService>;
57
+
58
+ /** @public */
59
+ export declare const loggerFactory: ServiceFactory<Logger>;
60
+
61
+ /** @public */
62
+ export declare const permissionsFactory: ServiceFactory<PermissionAuthorizer | PermissionEvaluator>;
63
+
64
+ /** @public */
65
+ export declare const schedulerFactory: ServiceFactory<PluginTaskScheduler>;
66
+
67
+ /**
68
+ * @public
69
+ */
70
+ export declare type ServiceOrExtensionPoint<T = unknown> = ExtensionPoint<T> | ServiceRef<T>;
71
+
72
+ /** @public */
73
+ export declare const tokenManagerFactory: ServiceFactory<TokenManager>;
74
+
75
+ /** @public */
76
+ export declare const urlReaderFactory: ServiceFactory<UrlReader>;
77
+
30
78
  export { }
@@ -4,27 +4,75 @@
4
4
  * @packageDocumentation
5
5
  */
6
6
 
7
- import { AnyServiceFactory } from '@backstage/backend-plugin-api';
8
- import { BackendRegistrable } from '@backstage/backend-plugin-api';
7
+ import { BackendFeature } from '@backstage/backend-plugin-api';
8
+ import { Config } from '@backstage/config';
9
+ import { ExtensionPoint } from '@backstage/backend-plugin-api';
10
+ import { HttpRouterService } from '@backstage/backend-plugin-api';
11
+ import { Logger } from '@backstage/backend-plugin-api';
12
+ import { PermissionAuthorizer } from '@backstage/plugin-permission-common';
13
+ import { PermissionEvaluator } from '@backstage/plugin-permission-common';
14
+ import { PluginCacheManager } from '@backstage/backend-common';
15
+ import { PluginDatabaseManager } from '@backstage/backend-common';
16
+ import { PluginEndpointDiscovery } from '@backstage/backend-common';
17
+ import { PluginTaskScheduler } from '@backstage/backend-tasks';
18
+ import { ServiceFactory } from '@backstage/backend-plugin-api';
19
+ import { ServiceRef } from '@backstage/backend-plugin-api';
20
+ import { TokenManager } from '@backstage/backend-common';
21
+ import { UrlReader } from '@backstage/backend-common';
9
22
 
10
23
  /**
11
24
  * @public
12
25
  */
13
26
  export declare interface Backend {
14
- add(extension: BackendRegistrable): void;
27
+ add(feature: BackendFeature): void;
15
28
  start(): Promise<void>;
16
29
  }
17
30
 
31
+ /** @public */
32
+ export declare const cacheFactory: ServiceFactory<PluginCacheManager>;
33
+
34
+ /** @public */
35
+ export declare const configFactory: ServiceFactory<Config>;
36
+
18
37
  /**
19
38
  * @public
20
39
  */
21
- export declare function createBackend(options?: CreateBackendOptions): Backend;
40
+ export declare function createSpecializedBackend(options: CreateSpecializedBackendOptions): Backend;
22
41
 
23
42
  /**
24
43
  * @public
25
44
  */
26
- export declare interface CreateBackendOptions {
27
- apis: AnyServiceFactory[];
45
+ export declare interface CreateSpecializedBackendOptions {
46
+ services: ServiceFactory[];
28
47
  }
29
48
 
49
+ /** @public */
50
+ export declare const databaseFactory: ServiceFactory<PluginDatabaseManager>;
51
+
52
+ /** @public */
53
+ export declare const discoveryFactory: ServiceFactory<PluginEndpointDiscovery>;
54
+
55
+ /** @public */
56
+ export declare const httpRouterFactory: ServiceFactory<HttpRouterService>;
57
+
58
+ /** @public */
59
+ export declare const loggerFactory: ServiceFactory<Logger>;
60
+
61
+ /** @public */
62
+ export declare const permissionsFactory: ServiceFactory<PermissionAuthorizer | PermissionEvaluator>;
63
+
64
+ /** @public */
65
+ export declare const schedulerFactory: ServiceFactory<PluginTaskScheduler>;
66
+
67
+ /**
68
+ * @public
69
+ */
70
+ export declare type ServiceOrExtensionPoint<T = unknown> = ExtensionPoint<T> | ServiceRef<T>;
71
+
72
+ /** @public */
73
+ export declare const tokenManagerFactory: ServiceFactory<TokenManager>;
74
+
75
+ /** @public */
76
+ export declare const urlReaderFactory: ServiceFactory<UrlReader>;
77
+
30
78
  export { }
package/dist/index.cjs.js CHANGED
@@ -12,192 +12,6 @@ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'defau
12
12
 
13
13
  var Router__default = /*#__PURE__*/_interopDefaultLegacy(Router);
14
14
 
15
- const cacheFactory = backendPluginApi.createServiceFactory({
16
- service: backendPluginApi.cacheServiceRef,
17
- deps: {
18
- configFactory: backendPluginApi.configServiceRef
19
- },
20
- factory: async ({ configFactory }) => {
21
- const config = await configFactory("root");
22
- const cacheManager = backendCommon.CacheManager.fromConfig(config);
23
- return async (pluginId) => {
24
- return cacheManager.forPlugin(pluginId);
25
- };
26
- }
27
- });
28
-
29
- const configFactory = backendPluginApi.createServiceFactory({
30
- service: backendPluginApi.configServiceRef,
31
- deps: {
32
- loggerFactory: backendPluginApi.loggerServiceRef
33
- },
34
- factory: async ({ loggerFactory }) => {
35
- const logger = await loggerFactory("root");
36
- const config = await backendCommon.loadBackendConfig({
37
- argv: process.argv,
38
- logger: backendPluginApi.loggerToWinstonLogger(logger)
39
- });
40
- return async () => {
41
- return config;
42
- };
43
- }
44
- });
45
-
46
- const databaseFactory = backendPluginApi.createServiceFactory({
47
- service: backendPluginApi.databaseServiceRef,
48
- deps: {
49
- configFactory: backendPluginApi.configServiceRef
50
- },
51
- factory: async ({ configFactory }) => {
52
- const config = await configFactory("root");
53
- const databaseManager = backendCommon.DatabaseManager.fromConfig(config);
54
- return async (pluginId) => {
55
- return databaseManager.forPlugin(pluginId);
56
- };
57
- }
58
- });
59
-
60
- const discoveryFactory = backendPluginApi.createServiceFactory({
61
- service: backendPluginApi.discoveryServiceRef,
62
- deps: {
63
- configFactory: backendPluginApi.configServiceRef
64
- },
65
- factory: async ({ configFactory }) => {
66
- const config = await configFactory("root");
67
- const discovery = backendCommon.SingleHostDiscovery.fromConfig(config);
68
- return async () => {
69
- return discovery;
70
- };
71
- }
72
- });
73
-
74
- class BackstageLogger {
75
- constructor(winston) {
76
- this.winston = winston;
77
- }
78
- static fromWinston(logger) {
79
- return new BackstageLogger(logger);
80
- }
81
- info(message, ...meta) {
82
- this.winston.info(message, ...meta);
83
- }
84
- child(fields) {
85
- return new BackstageLogger(this.winston.child(fields));
86
- }
87
- }
88
- const loggerFactory = backendPluginApi.createServiceFactory({
89
- service: backendPluginApi.loggerServiceRef,
90
- deps: {},
91
- factory: async () => {
92
- const root = BackstageLogger.fromWinston(backendCommon.createRootLogger());
93
- return async (pluginId) => {
94
- return root.child({ pluginId });
95
- };
96
- }
97
- });
98
-
99
- const permissionsFactory = backendPluginApi.createServiceFactory({
100
- service: backendPluginApi.permissionsServiceRef,
101
- deps: {
102
- configFactory: backendPluginApi.configServiceRef,
103
- discoveryFactory: backendPluginApi.discoveryServiceRef,
104
- tokenManagerFactory: backendPluginApi.tokenManagerServiceRef
105
- },
106
- factory: async ({ configFactory, discoveryFactory, tokenManagerFactory }) => {
107
- const config = await configFactory("root");
108
- const discovery = await discoveryFactory("root");
109
- const tokenManager = await tokenManagerFactory("root");
110
- const permissions = pluginPermissionNode.ServerPermissionClient.fromConfig(config, {
111
- discovery,
112
- tokenManager
113
- });
114
- return async (_pluginId) => {
115
- return permissions;
116
- };
117
- }
118
- });
119
-
120
- const schedulerFactory = backendPluginApi.createServiceFactory({
121
- service: backendPluginApi.schedulerServiceRef,
122
- deps: {
123
- configFactory: backendPluginApi.configServiceRef
124
- },
125
- factory: async ({ configFactory }) => {
126
- const config = await configFactory("root");
127
- const taskScheduler = backendTasks.TaskScheduler.fromConfig(config);
128
- return async (pluginId) => {
129
- return taskScheduler.forPlugin(pluginId);
130
- };
131
- }
132
- });
133
-
134
- const tokenManagerFactory = backendPluginApi.createServiceFactory({
135
- service: backendPluginApi.tokenManagerServiceRef,
136
- deps: {
137
- configFactory: backendPluginApi.configServiceRef,
138
- loggerFactory: backendPluginApi.loggerServiceRef
139
- },
140
- factory: async ({ configFactory, loggerFactory }) => {
141
- const logger = await loggerFactory("root");
142
- const config = await configFactory("root");
143
- return async (_pluginId) => {
144
- return backendCommon.ServerTokenManager.fromConfig(config, {
145
- logger: backendPluginApi.loggerToWinstonLogger(logger)
146
- });
147
- };
148
- }
149
- });
150
-
151
- const urlReaderFactory = backendPluginApi.createServiceFactory({
152
- service: backendPluginApi.urlReaderServiceRef,
153
- deps: {
154
- configFactory: backendPluginApi.configServiceRef,
155
- loggerFactory: backendPluginApi.loggerServiceRef
156
- },
157
- factory: async ({ configFactory, loggerFactory }) => {
158
- return async (pluginId) => {
159
- const logger = await loggerFactory(pluginId);
160
- return backendCommon.UrlReaders.default({
161
- logger: backendPluginApi.loggerToWinstonLogger(logger),
162
- config: await configFactory(pluginId)
163
- });
164
- };
165
- }
166
- });
167
-
168
- const httpRouterFactory = backendPluginApi.createServiceFactory({
169
- service: backendPluginApi.httpRouterServiceRef,
170
- deps: {
171
- configFactory: backendPluginApi.configServiceRef
172
- },
173
- factory: async ({ configFactory }) => {
174
- const rootRouter = Router__default["default"]();
175
- const service = backendCommon.createServiceBuilder(module).loadConfig(await configFactory("root")).addRouter("", rootRouter);
176
- await service.start();
177
- return async (pluginId) => {
178
- const path = pluginId ? `/api/${pluginId}` : "";
179
- return {
180
- use(handler) {
181
- rootRouter.use(path, handler);
182
- }
183
- };
184
- };
185
- }
186
- });
187
-
188
- const defaultServiceFactories = [
189
- cacheFactory,
190
- configFactory,
191
- databaseFactory,
192
- discoveryFactory,
193
- loggerFactory,
194
- permissionsFactory,
195
- schedulerFactory,
196
- tokenManagerFactory,
197
- urlReaderFactory,
198
- httpRouterFactory
199
- ];
200
-
201
15
  var __accessCheck$2 = (obj, member, msg) => {
202
16
  if (!member.has(obj))
203
17
  throw TypeError("Cannot " + msg);
@@ -220,35 +34,33 @@ var __privateMethod = (obj, member, method) => {
220
34
  __accessCheck$2(obj, member, "access private method");
221
35
  return method;
222
36
  };
223
- var _started, _extensions, _registerInits, _extensionPoints, _serviceHolder, _getInitDeps, getInitDeps_fn, _resolveInitOrder, resolveInitOrder_fn;
37
+ var _started, _features, _registerInits, _extensionPoints, _serviceHolder, _getInitDeps, getInitDeps_fn, _resolveInitOrder, resolveInitOrder_fn;
224
38
  class BackendInitializer {
225
39
  constructor(serviceHolder) {
226
40
  __privateAdd$2(this, _getInitDeps);
227
41
  __privateAdd$2(this, _resolveInitOrder);
228
42
  __privateAdd$2(this, _started, false);
229
- __privateAdd$2(this, _extensions, /* @__PURE__ */ new Map());
43
+ __privateAdd$2(this, _features, /* @__PURE__ */ new Map());
230
44
  __privateAdd$2(this, _registerInits, new Array());
231
45
  __privateAdd$2(this, _extensionPoints, /* @__PURE__ */ new Map());
232
46
  __privateAdd$2(this, _serviceHolder, void 0);
233
47
  __privateSet$2(this, _serviceHolder, serviceHolder);
234
48
  }
235
- add(extension, options) {
49
+ add(feature, options) {
236
50
  if (__privateGet$2(this, _started)) {
237
- throw new Error("extension can not be added after the backend has started");
51
+ throw new Error("feature can not be added after the backend has started");
238
52
  }
239
- __privateGet$2(this, _extensions).set(extension, options);
53
+ __privateGet$2(this, _features).set(feature, options);
240
54
  }
241
55
  async start() {
242
- console.log(`Starting backend`);
243
56
  if (__privateGet$2(this, _started)) {
244
57
  throw new Error("Backend has already started");
245
58
  }
246
59
  __privateSet$2(this, _started, true);
247
- for (const [extension] of __privateGet$2(this, _extensions)) {
60
+ for (const [feature] of __privateGet$2(this, _features)) {
248
61
  const provides = /* @__PURE__ */ new Set();
249
62
  let registerInit = void 0;
250
- console.log("Registering", extension.id);
251
- extension.register({
63
+ feature.register({
252
64
  registerExtensionPoint: (extensionPointRef, impl) => {
253
65
  if (registerInit) {
254
66
  throw new Error("registerExtensionPoint called after registerInit");
@@ -264,7 +76,7 @@ class BackendInitializer {
264
76
  throw new Error("registerInit must only be called once");
265
77
  }
266
78
  registerInit = {
267
- id: extension.id,
79
+ id: feature.id,
268
80
  provides,
269
81
  consumes: new Set(Object.values(registerOptions.deps)),
270
82
  deps: registerOptions.deps,
@@ -273,31 +85,52 @@ class BackendInitializer {
273
85
  }
274
86
  });
275
87
  if (!registerInit) {
276
- throw new Error(`registerInit was not called by register in ${extension.id}`);
88
+ throw new Error(
89
+ `registerInit was not called by register in ${feature.id}`
90
+ );
277
91
  }
278
92
  __privateGet$2(this, _registerInits).push(registerInit);
279
93
  }
280
- this.validateSetup();
281
94
  const orderedRegisterResults = __privateMethod(this, _resolveInitOrder, resolveInitOrder_fn).call(this, __privateGet$2(this, _registerInits));
282
95
  for (const registerInit of orderedRegisterResults) {
283
96
  const deps = await __privateMethod(this, _getInitDeps, getInitDeps_fn).call(this, registerInit.deps, registerInit.id);
284
97
  await registerInit.init(deps);
285
98
  }
286
99
  }
287
- validateSetup() {
288
- }
289
100
  }
290
101
  _started = new WeakMap();
291
- _extensions = new WeakMap();
102
+ _features = new WeakMap();
292
103
  _registerInits = new WeakMap();
293
104
  _extensionPoints = new WeakMap();
294
105
  _serviceHolder = new WeakMap();
295
106
  _getInitDeps = new WeakSet();
296
107
  getInitDeps_fn = async function(deps, pluginId) {
297
- return Object.fromEntries(await Promise.all(Object.entries(deps).map(async ([name, ref]) => [
298
- name,
299
- __privateGet$2(this, _extensionPoints).get(ref) || await __privateGet$2(this, _serviceHolder).get(ref)(pluginId)
300
- ])));
108
+ const result = /* @__PURE__ */ new Map();
109
+ const missingRefs = /* @__PURE__ */ new Set();
110
+ for (const [name, ref] of Object.entries(deps)) {
111
+ const extensionPoint = __privateGet$2(this, _extensionPoints).get(
112
+ ref
113
+ );
114
+ if (extensionPoint) {
115
+ result.set(name, extensionPoint);
116
+ } else {
117
+ const factory = await __privateGet$2(this, _serviceHolder).get(
118
+ ref
119
+ );
120
+ if (factory) {
121
+ result.set(name, await factory(pluginId));
122
+ } else {
123
+ missingRefs.add(ref);
124
+ }
125
+ }
126
+ }
127
+ if (missingRefs.size > 0) {
128
+ const missing = Array.from(missingRefs).join(", ");
129
+ throw new Error(
130
+ `No extension point or service available for the following ref(s): ${missing}`
131
+ );
132
+ }
133
+ return Object.fromEntries(result);
301
134
  };
302
135
  _resolveInitOrder = new WeakSet();
303
136
  resolveInitOrder_fn = function(registerInits) {
@@ -307,13 +140,14 @@ resolveInitOrder_fn = function(registerInits) {
307
140
  const toRemove = /* @__PURE__ */ new Set();
308
141
  for (const registerInit of registerInitsToOrder) {
309
142
  const unInitializedDependents = [];
310
- for (const serviceRef of registerInit.provides) {
311
- if (registerInitsToOrder.some((init) => init !== registerInit && init.consumes.has(serviceRef))) {
312
- unInitializedDependents.push(serviceRef);
143
+ for (const provided of registerInit.provides) {
144
+ if (registerInitsToOrder.some(
145
+ (init) => init !== registerInit && init.consumes.has(provided)
146
+ )) {
147
+ unInitializedDependents.push(provided);
313
148
  }
314
149
  }
315
150
  if (unInitializedDependents.length === 0) {
316
- console.log(`DEBUG: pushed ${registerInit.id} to results`);
317
151
  orderedRegisterInits.push(registerInit);
318
152
  toRemove.add(registerInit);
319
153
  }
@@ -341,33 +175,46 @@ var __privateSet$1 = (obj, member, value, setter) => {
341
175
  setter ? setter.call(obj, value) : member.set(obj, value);
342
176
  return value;
343
177
  };
344
- var _implementations, _factories;
178
+ var _providedFactories, _loadedDefaultFactories, _implementations;
345
179
  class ServiceRegistry {
346
180
  constructor(factories) {
181
+ __privateAdd$1(this, _providedFactories, void 0);
182
+ __privateAdd$1(this, _loadedDefaultFactories, void 0);
347
183
  __privateAdd$1(this, _implementations, void 0);
348
- __privateAdd$1(this, _factories, void 0);
349
- __privateSet$1(this, _factories, new Map(factories.map((f) => [f.service.id, f])));
184
+ __privateSet$1(this, _providedFactories, new Map(factories.map((f) => [f.service.id, f])));
185
+ __privateSet$1(this, _loadedDefaultFactories, /* @__PURE__ */ new Map());
350
186
  __privateSet$1(this, _implementations, /* @__PURE__ */ new Map());
351
187
  }
352
188
  get(ref) {
353
- const factory = __privateGet$1(this, _factories).get(ref.id);
354
- if (!factory) {
189
+ let factory = __privateGet$1(this, _providedFactories).get(ref.id);
190
+ const { defaultFactory } = ref;
191
+ if (!factory && !defaultFactory) {
355
192
  return void 0;
356
193
  }
357
194
  return async (pluginId) => {
358
- let implementations = __privateGet$1(this, _implementations).get(ref.id);
195
+ if (!factory) {
196
+ let loadedFactory = __privateGet$1(this, _loadedDefaultFactories).get(defaultFactory);
197
+ if (!loadedFactory) {
198
+ loadedFactory = await defaultFactory(ref);
199
+ __privateGet$1(this, _loadedDefaultFactories).set(defaultFactory, loadedFactory);
200
+ }
201
+ factory = loadedFactory;
202
+ }
203
+ let implementations = __privateGet$1(this, _implementations).get(factory);
359
204
  if (implementations) {
360
205
  if (implementations.has(pluginId)) {
361
206
  return implementations.get(pluginId);
362
207
  }
363
208
  } else {
364
209
  implementations = /* @__PURE__ */ new Map();
365
- __privateGet$1(this, _implementations).set(ref.id, implementations);
210
+ __privateGet$1(this, _implementations).set(factory, implementations);
366
211
  }
367
- const factoryDeps = Object.fromEntries(Object.entries(factory.deps).map(([name, serviceRef]) => [
368
- name,
369
- this.get(serviceRef)
370
- ]));
212
+ const factoryDeps = Object.fromEntries(
213
+ Object.entries(factory.deps).map(([name, serviceRef]) => [
214
+ name,
215
+ this.get(serviceRef)
216
+ ])
217
+ );
371
218
  const factoryFunc = await factory.factory(factoryDeps);
372
219
  const implementation = await factoryFunc(pluginId);
373
220
  implementations.set(pluginId, implementation);
@@ -375,8 +222,9 @@ class ServiceRegistry {
375
222
  };
376
223
  }
377
224
  }
225
+ _providedFactories = new WeakMap();
226
+ _loadedDefaultFactories = new WeakMap();
378
227
  _implementations = new WeakMap();
379
- _factories = new WeakMap();
380
228
 
381
229
  var __accessCheck = (obj, member, msg) => {
382
230
  if (!member.has(obj))
@@ -404,8 +252,8 @@ class BackstageBackend {
404
252
  __privateSet(this, _services, new ServiceRegistry(apiFactories));
405
253
  __privateSet(this, _initializer, new BackendInitializer(__privateGet(this, _services)));
406
254
  }
407
- add(extension) {
408
- __privateGet(this, _initializer).add(extension);
255
+ add(feature) {
256
+ __privateGet(this, _initializer).add(feature);
409
257
  }
410
258
  async start() {
411
259
  await __privateGet(this, _initializer).start();
@@ -414,13 +262,192 @@ class BackstageBackend {
414
262
  _services = new WeakMap();
415
263
  _initializer = new WeakMap();
416
264
 
417
- function createBackend(options) {
418
- var _a;
419
- return new BackstageBackend([
420
- ...defaultServiceFactories,
421
- ...(_a = options == null ? void 0 : options.apis) != null ? _a : []
422
- ]);
265
+ function createSpecializedBackend(options) {
266
+ return new BackstageBackend(options.services);
423
267
  }
424
268
 
425
- exports.createBackend = createBackend;
269
+ const cacheFactory = backendPluginApi.createServiceFactory({
270
+ service: backendPluginApi.cacheServiceRef,
271
+ deps: {
272
+ configFactory: backendPluginApi.configServiceRef
273
+ },
274
+ factory: async ({ configFactory }) => {
275
+ const config = await configFactory("root");
276
+ const cacheManager = backendCommon.CacheManager.fromConfig(config);
277
+ return async (pluginId) => {
278
+ return cacheManager.forPlugin(pluginId);
279
+ };
280
+ }
281
+ });
282
+
283
+ const configFactory = backendPluginApi.createServiceFactory({
284
+ service: backendPluginApi.configServiceRef,
285
+ deps: {
286
+ loggerFactory: backendPluginApi.loggerServiceRef
287
+ },
288
+ factory: async ({ loggerFactory }) => {
289
+ const logger = await loggerFactory("root");
290
+ const config = await backendCommon.loadBackendConfig({
291
+ argv: process.argv,
292
+ logger: backendPluginApi.loggerToWinstonLogger(logger)
293
+ });
294
+ return async () => {
295
+ return config;
296
+ };
297
+ }
298
+ });
299
+
300
+ const databaseFactory = backendPluginApi.createServiceFactory({
301
+ service: backendPluginApi.databaseServiceRef,
302
+ deps: {
303
+ configFactory: backendPluginApi.configServiceRef
304
+ },
305
+ factory: async ({ configFactory }) => {
306
+ const config = await configFactory("root");
307
+ const databaseManager = backendCommon.DatabaseManager.fromConfig(config);
308
+ return async (pluginId) => {
309
+ return databaseManager.forPlugin(pluginId);
310
+ };
311
+ }
312
+ });
313
+
314
+ const discoveryFactory = backendPluginApi.createServiceFactory({
315
+ service: backendPluginApi.discoveryServiceRef,
316
+ deps: {
317
+ configFactory: backendPluginApi.configServiceRef
318
+ },
319
+ factory: async ({ configFactory }) => {
320
+ const config = await configFactory("root");
321
+ const discovery = backendCommon.SingleHostDiscovery.fromConfig(config);
322
+ return async () => {
323
+ return discovery;
324
+ };
325
+ }
326
+ });
327
+
328
+ class BackstageLogger {
329
+ constructor(winston) {
330
+ this.winston = winston;
331
+ }
332
+ static fromWinston(logger) {
333
+ return new BackstageLogger(logger);
334
+ }
335
+ info(message, ...meta) {
336
+ this.winston.info(message, ...meta);
337
+ }
338
+ child(fields) {
339
+ return new BackstageLogger(this.winston.child(fields));
340
+ }
341
+ }
342
+ const loggerFactory = backendPluginApi.createServiceFactory({
343
+ service: backendPluginApi.loggerServiceRef,
344
+ deps: {},
345
+ factory: async () => {
346
+ const root = BackstageLogger.fromWinston(backendCommon.createRootLogger());
347
+ return async (pluginId) => {
348
+ return root.child({ pluginId });
349
+ };
350
+ }
351
+ });
352
+
353
+ const permissionsFactory = backendPluginApi.createServiceFactory({
354
+ service: backendPluginApi.permissionsServiceRef,
355
+ deps: {
356
+ configFactory: backendPluginApi.configServiceRef,
357
+ discoveryFactory: backendPluginApi.discoveryServiceRef,
358
+ tokenManagerFactory: backendPluginApi.tokenManagerServiceRef
359
+ },
360
+ factory: async ({ configFactory, discoveryFactory, tokenManagerFactory }) => {
361
+ const config = await configFactory("root");
362
+ const discovery = await discoveryFactory("root");
363
+ const tokenManager = await tokenManagerFactory("root");
364
+ const permissions = pluginPermissionNode.ServerPermissionClient.fromConfig(config, {
365
+ discovery,
366
+ tokenManager
367
+ });
368
+ return async (_pluginId) => {
369
+ return permissions;
370
+ };
371
+ }
372
+ });
373
+
374
+ const schedulerFactory = backendPluginApi.createServiceFactory({
375
+ service: backendPluginApi.schedulerServiceRef,
376
+ deps: {
377
+ configFactory: backendPluginApi.configServiceRef
378
+ },
379
+ factory: async ({ configFactory }) => {
380
+ const config = await configFactory("root");
381
+ const taskScheduler = backendTasks.TaskScheduler.fromConfig(config);
382
+ return async (pluginId) => {
383
+ return taskScheduler.forPlugin(pluginId);
384
+ };
385
+ }
386
+ });
387
+
388
+ const tokenManagerFactory = backendPluginApi.createServiceFactory({
389
+ service: backendPluginApi.tokenManagerServiceRef,
390
+ deps: {
391
+ configFactory: backendPluginApi.configServiceRef,
392
+ loggerFactory: backendPluginApi.loggerServiceRef
393
+ },
394
+ factory: async ({ configFactory, loggerFactory }) => {
395
+ const logger = await loggerFactory("root");
396
+ const config = await configFactory("root");
397
+ return async (_pluginId) => {
398
+ return backendCommon.ServerTokenManager.fromConfig(config, {
399
+ logger: backendPluginApi.loggerToWinstonLogger(logger)
400
+ });
401
+ };
402
+ }
403
+ });
404
+
405
+ const urlReaderFactory = backendPluginApi.createServiceFactory({
406
+ service: backendPluginApi.urlReaderServiceRef,
407
+ deps: {
408
+ configFactory: backendPluginApi.configServiceRef,
409
+ loggerFactory: backendPluginApi.loggerServiceRef
410
+ },
411
+ factory: async ({ configFactory, loggerFactory }) => {
412
+ return async (pluginId) => {
413
+ const logger = await loggerFactory(pluginId);
414
+ return backendCommon.UrlReaders.default({
415
+ logger: backendPluginApi.loggerToWinstonLogger(logger),
416
+ config: await configFactory(pluginId)
417
+ });
418
+ };
419
+ }
420
+ });
421
+
422
+ const httpRouterFactory = backendPluginApi.createServiceFactory({
423
+ service: backendPluginApi.httpRouterServiceRef,
424
+ deps: {
425
+ configFactory: backendPluginApi.configServiceRef
426
+ },
427
+ factory: async ({ configFactory }) => {
428
+ const rootRouter = Router__default["default"]();
429
+ const service = backendCommon.createServiceBuilder(module).loadConfig(await configFactory("root")).addRouter("", rootRouter);
430
+ await service.start();
431
+ return async (pluginId) => {
432
+ const path = pluginId ? `/api/${pluginId}` : "";
433
+ return {
434
+ use(handler) {
435
+ rootRouter.use(path, handler);
436
+ }
437
+ };
438
+ };
439
+ }
440
+ });
441
+
442
+ exports.cacheFactory = cacheFactory;
443
+ exports.configFactory = configFactory;
444
+ exports.createSpecializedBackend = createSpecializedBackend;
445
+ exports.databaseFactory = databaseFactory;
446
+ exports.discoveryFactory = discoveryFactory;
447
+ exports.httpRouterFactory = httpRouterFactory;
448
+ exports.loggerFactory = loggerFactory;
449
+ exports.permissionsFactory = permissionsFactory;
450
+ exports.schedulerFactory = schedulerFactory;
451
+ exports.tokenManagerFactory = tokenManagerFactory;
452
+ exports.urlReaderFactory = urlReaderFactory;
426
453
  //# sourceMappingURL=index.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../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/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/index.ts","../src/wiring/BackendInitializer.ts","../src/wiring/ServiceRegistry.ts","../src/wiring/BackstageBackend.ts","../src/wiring/types.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 { CacheManager } from '@backstage/backend-common';\nimport {\n configServiceRef,\n createServiceFactory,\n cacheServiceRef,\n} from '@backstage/backend-plugin-api';\n\n// TODO: Work out some naming and implementation patterns for these\nexport const cacheFactory = createServiceFactory({\n service: cacheServiceRef,\n deps: {\n configFactory: configServiceRef,\n },\n factory: async ({ configFactory }) => {\n const config = await configFactory('root');\n const cacheManager = CacheManager.fromConfig(config);\n return async (pluginId: string) => {\n return cacheManager.forPlugin(pluginId);\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 configServiceRef,\n createServiceFactory,\n loggerToWinstonLogger,\n loggerServiceRef,\n} from '@backstage/backend-plugin-api';\n\nexport const configFactory = createServiceFactory({\n service: configServiceRef,\n deps: {\n loggerFactory: loggerServiceRef,\n },\n factory: async ({ loggerFactory }) => {\n const logger = await loggerFactory('root');\n const config = await loadBackendConfig({\n argv: process.argv,\n logger: loggerToWinstonLogger(logger),\n });\n return async () => {\n return config;\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 { DatabaseManager } from '@backstage/backend-common';\nimport {\n configServiceRef,\n createServiceFactory,\n databaseServiceRef,\n} from '@backstage/backend-plugin-api';\n\nexport const databaseFactory = createServiceFactory({\n service: databaseServiceRef,\n deps: {\n configFactory: configServiceRef,\n },\n factory: async ({ configFactory }) => {\n const config = await configFactory('root');\n const databaseManager = DatabaseManager.fromConfig(config);\n return async (pluginId: string) => {\n return databaseManager.forPlugin(pluginId);\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 configServiceRef,\n createServiceFactory,\n discoveryServiceRef,\n} from '@backstage/backend-plugin-api';\n\nexport const discoveryFactory = createServiceFactory({\n service: discoveryServiceRef,\n deps: {\n configFactory: configServiceRef,\n },\n factory: async ({ configFactory }) => {\n const config = await configFactory('root');\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 { createRootLogger } from '@backstage/backend-common';\nimport {\n createServiceFactory,\n Logger,\n loggerServiceRef,\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\nexport const loggerFactory = createServiceFactory({\n service: loggerServiceRef,\n deps: {},\n factory: async () => {\n const root = BackstageLogger.fromWinston(createRootLogger());\n return async (pluginId: string) => {\n return root.child({ pluginId });\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 configServiceRef,\n createServiceFactory,\n discoveryServiceRef,\n permissionsServiceRef,\n tokenManagerServiceRef,\n} from '@backstage/backend-plugin-api';\nimport { ServerPermissionClient } from '@backstage/plugin-permission-node';\n\nexport const permissionsFactory = createServiceFactory({\n service: permissionsServiceRef,\n deps: {\n configFactory: configServiceRef,\n discoveryFactory: discoveryServiceRef,\n tokenManagerFactory: tokenManagerServiceRef,\n },\n factory: async ({ configFactory, discoveryFactory, tokenManagerFactory }) => {\n const config = await configFactory('root');\n const discovery = await discoveryFactory('root');\n const tokenManager = await tokenManagerFactory('root');\n const permissions = ServerPermissionClient.fromConfig(config, {\n discovery,\n tokenManager,\n });\n return async (_pluginId: string) => {\n return permissions;\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 configServiceRef,\n createServiceFactory,\n schedulerServiceRef,\n} from '@backstage/backend-plugin-api';\nimport { TaskScheduler } from '@backstage/backend-tasks';\n\nexport const schedulerFactory = createServiceFactory({\n service: schedulerServiceRef,\n deps: {\n configFactory: configServiceRef,\n },\n factory: async ({ configFactory }) => {\n const config = await configFactory('root');\n const taskScheduler = TaskScheduler.fromConfig(config);\n return async (pluginId: string) => {\n return taskScheduler.forPlugin(pluginId);\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 configServiceRef,\n loggerServiceRef,\n createServiceFactory,\n tokenManagerServiceRef,\n loggerToWinstonLogger,\n} from '@backstage/backend-plugin-api';\nimport { ServerTokenManager } from '@backstage/backend-common';\n\nexport const tokenManagerFactory = createServiceFactory({\n service: tokenManagerServiceRef,\n deps: {\n configFactory: configServiceRef,\n loggerFactory: loggerServiceRef,\n },\n factory: async ({ configFactory, loggerFactory }) => {\n const logger = await loggerFactory('root');\n const config = await configFactory('root');\n return async (_pluginId: string) => {\n // doesn't the logger want to be inferred from the plugin tho here?\n // maybe ... also why do we recreate it every time otherwise\n // we should memoize on a per plugin right? so I think it's should be fine to re-use the plugin one\n // we shouldn't recreate on a per plugin basis.\n // hm - on the other hand, is this really ever called more than once?\n // not this function right. should only be called when the plugin requests this serviceRef\n // yeah so no need to worry about memo probably\n // but we still want to scope the logger to the ServrTokenmanagfer>?\n // mm sure maybe\n // maybe in this case it doesn't provide so much value b\n // oh hang on - isn't it up to THE MANAGER to make a child internally if it wants to do that\n // so that it becomes a property intrinsic to that class, no matter how it's constructed\n // or is that too much responsibility for it - making the constructor complex so to speak, making it harder to tweak that behavior\n // this is not ultra efficient :)\n\n // I think the naming here is wrong to be gonest\n // this isn't like the cache manager or the database manager\n // the manager name is confusuion i think\n // aye perhaps\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 configServiceRef,\n createServiceFactory,\n loggerServiceRef,\n loggerToWinstonLogger,\n urlReaderServiceRef,\n} from '@backstage/backend-plugin-api';\n\nexport const urlReaderFactory = createServiceFactory({\n service: urlReaderServiceRef,\n deps: {\n configFactory: configServiceRef,\n loggerFactory: loggerServiceRef,\n },\n factory: async ({ configFactory, loggerFactory }) => {\n return async (pluginId: string) => {\n const logger = await loggerFactory(pluginId);\n return UrlReaders.default({\n logger: loggerToWinstonLogger(logger),\n config: await configFactory(pluginId),\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 httpRouterServiceRef,\n configServiceRef,\n} from '@backstage/backend-plugin-api';\nimport Router from 'express-promise-router';\nimport { Handler } from 'express';\nimport { createServiceBuilder } from '@backstage/backend-common';\n\nexport const httpRouterFactory = createServiceFactory({\n service: httpRouterServiceRef,\n deps: {\n configFactory: configServiceRef,\n },\n factory: async ({ configFactory }) => {\n const rootRouter = Router();\n\n const service = createServiceBuilder(module)\n .loadConfig(await configFactory('root'))\n .addRouter('', rootRouter);\n\n await service.start();\n\n return async (pluginId?: string) => {\n const path = pluginId ? `/api/${pluginId}` : '';\n return {\n use(handler: Handler) {\n rootRouter.use(path, handler);\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 */\n\nimport { cacheFactory } from './cacheService';\nimport { configFactory } from './configService';\nimport { databaseFactory } from './databaseService';\nimport { discoveryFactory } from './discoveryService';\nimport { loggerFactory } from './loggerService';\nimport { permissionsFactory } from './permissionsService';\nimport { schedulerFactory } from './schedulerService';\nimport { tokenManagerFactory } from './tokenManagerService';\nimport { urlReaderFactory } from './urlReaderService';\nimport { httpRouterFactory } from './httpRouterService';\n\nexport const defaultServiceFactories = [\n cacheFactory,\n configFactory,\n databaseFactory,\n discoveryFactory,\n loggerFactory,\n permissionsFactory,\n schedulerFactory,\n tokenManagerFactory,\n urlReaderFactory,\n httpRouterFactory,\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 BackendRegistrable,\n ExtensionPoint,\n ServiceRef,\n} from '@backstage/backend-plugin-api';\nimport { BackendRegisterInit, ServiceHolder } from './types';\n\ntype ServiceOrExtensionPoint = ExtensionPoint<unknown> | ServiceRef<unknown>;\n\nexport class BackendInitializer {\n #started = false;\n #extensions = new Map<BackendRegistrable, unknown>();\n #registerInits = new Array<BackendRegisterInit>();\n #extensionPoints = new Map<ServiceOrExtensionPoint, 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 return Object.fromEntries(\n await Promise.all(\n Object.entries(deps).map(async ([name, ref]) => [\n name,\n this.#extensionPoints.get(ref) ||\n (await this.#serviceHolder.get(ref as ServiceRef<unknown>)!(\n pluginId,\n )),\n ]),\n ),\n );\n }\n\n add<TOptions>(extension: BackendRegistrable, options?: TOptions) {\n if (this.#started) {\n throw new Error(\n 'extension can not be added after the backend has started',\n );\n }\n this.#extensions.set(extension, options);\n }\n\n async start(): Promise<void> {\n console.log(`Starting backend`);\n if (this.#started) {\n throw new Error('Backend has already started');\n }\n this.#started = true;\n\n for (const [extension] of this.#extensions) {\n const provides = new Set<ServiceRef<unknown>>();\n\n let registerInit: BackendRegisterInit | undefined = undefined;\n\n console.log('Registering', extension.id);\n extension.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: extension.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 ${extension.id}`,\n );\n }\n\n this.#registerInits.push(registerInit);\n }\n\n this.validateSetup();\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 private validateSetup() {}\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 serviceRef of registerInit.provides) {\n if (\n registerInitsToOrder.some(\n init => init !== registerInit && init.consumes.has(serviceRef),\n )\n ) {\n unInitializedDependents.push(serviceRef);\n }\n }\n\n if (unInitializedDependents.length === 0) {\n console.log(`DEBUG: pushed ${registerInit.id} to results`);\n orderedRegisterInits.push(registerInit);\n toRemove.add(registerInit);\n }\n }\n\n registerInitsToOrder = registerInitsToOrder.filter(r => !toRemove.has(r));\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 */\nimport {\n AnyServiceFactory,\n FactoryFunc,\n ServiceRef,\n} from '@backstage/backend-plugin-api';\n\nexport class ServiceRegistry {\n readonly #implementations: Map<string, Map<string, unknown>>;\n readonly #factories: Map<string, AnyServiceFactory>;\n\n constructor(factories: AnyServiceFactory[]) {\n this.#factories = new Map(factories.map(f => [f.service.id, f]));\n this.#implementations = new Map();\n }\n\n get<T>(ref: ServiceRef<T>): FactoryFunc<T> | undefined {\n const factory = this.#factories.get(ref.id);\n if (!factory) {\n return undefined;\n }\n\n return async (pluginId: string): Promise<T> => {\n let implementations = this.#implementations.get(ref.id);\n if (implementations) {\n if (implementations.has(pluginId)) {\n return implementations.get(pluginId) as T;\n }\n } else {\n implementations = new Map();\n this.#implementations.set(ref.id, implementations);\n }\n\n const factoryDeps = Object.fromEntries(\n Object.entries(factory.deps).map(([name, serviceRef]) => [\n name,\n this.get(serviceRef)!, // TODO: throw\n ]),\n );\n\n const factoryFunc = await factory.factory(factoryDeps);\n const implementation = await factoryFunc(pluginId);\n\n implementations.set(pluginId, implementation);\n\n return implementation as T;\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 AnyServiceFactory,\n BackendRegistrable,\n} 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: AnyServiceFactory[]) {\n this.#services = new ServiceRegistry(apiFactories);\n this.#initializer = new BackendInitializer(this.#services);\n }\n\n add(extension: BackendRegistrable): void {\n this.#initializer.add(extension);\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 AnyServiceFactory,\n BackendRegistrable,\n FactoryFunc,\n ServiceRef,\n} from '@backstage/backend-plugin-api';\nimport { defaultServiceFactories } from '../services/implementations';\nimport { BackstageBackend } from './BackstageBackend';\n\n/**\n * @public\n */\nexport interface Backend {\n add(extension: BackendRegistrable): void;\n start(): Promise<void>;\n}\n\nexport interface BackendRegisterInit {\n id: string;\n consumes: Set<ServiceRef<unknown>>;\n provides: Set<ServiceRef<unknown>>;\n deps: { [name: string]: ServiceRef<unknown> };\n init: (deps: { [name: string]: unknown }) => Promise<void>;\n}\n\n/**\n * @public\n */\nexport interface CreateBackendOptions {\n apis: AnyServiceFactory[];\n}\n\nexport type ServiceHolder = {\n get<T>(api: ServiceRef<T>): FactoryFunc<T> | undefined;\n};\n\n/**\n * @public\n */\nexport function createBackend(options?: CreateBackendOptions): Backend {\n // TODO: merge with provided APIs\n return new BackstageBackend([\n ...defaultServiceFactories,\n ...(options?.apis ?? []),\n ]);\n}\n"],"names":["createServiceFactory","cacheServiceRef","configServiceRef","CacheManager","loggerServiceRef","loadBackendConfig","loggerToWinstonLogger","databaseServiceRef","DatabaseManager","discoveryServiceRef","SingleHostDiscovery","createRootLogger","permissionsServiceRef","tokenManagerServiceRef","ServerPermissionClient","schedulerServiceRef","TaskScheduler","ServerTokenManager","urlReaderServiceRef","UrlReaders","httpRouterServiceRef","Router","createServiceBuilder","__accessCheck","__privateGet","__privateAdd","__privateSet"],"mappings":"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"}
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/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 */\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 factory = await this.#serviceHolder.get(\n ref as ServiceRef<unknown>,\n );\n if (factory) {\n result.set(name, await factory(pluginId));\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 as {\n [name: string]: ServiceOrExtensionPoint;\n },\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 */\nimport {\n ServiceFactory,\n FactoryFunc,\n ServiceRef,\n} from '@backstage/backend-plugin-api';\n\nexport class ServiceRegistry {\n readonly #providedFactories: Map<string, ServiceFactory>;\n readonly #loadedDefaultFactories: Map<Function, ServiceFactory>;\n readonly #implementations: Map<ServiceFactory, Map<string, unknown>>;\n\n constructor(factories: ServiceFactory<any>[]) {\n this.#providedFactories = new Map(factories.map(f => [f.service.id, f]));\n this.#loadedDefaultFactories = new Map();\n this.#implementations = new Map();\n }\n\n get<T>(ref: ServiceRef<T>): FactoryFunc<T> | undefined {\n let factory = this.#providedFactories.get(ref.id);\n const { defaultFactory } = ref;\n if (!factory && !defaultFactory) {\n return undefined;\n }\n\n return async (pluginId: string): Promise<T> => {\n if (!factory) {\n let loadedFactory = this.#loadedDefaultFactories.get(defaultFactory!);\n if (!loadedFactory) {\n loadedFactory = (await defaultFactory!(ref)) as ServiceFactory;\n this.#loadedDefaultFactories.set(defaultFactory!, loadedFactory);\n }\n factory = loadedFactory;\n }\n\n let implementations = this.#implementations.get(factory);\n if (implementations) {\n if (implementations.has(pluginId)) {\n return implementations.get(pluginId) as T;\n }\n } else {\n implementations = new Map();\n this.#implementations.set(factory, implementations);\n }\n\n const factoryDeps = Object.fromEntries(\n Object.entries(factory.deps).map(([name, serviceRef]) => [\n name,\n this.get(serviceRef)!, // TODO: throw\n ]),\n );\n\n const factoryFunc = await factory.factory(factoryDeps);\n const implementation = await factoryFunc(pluginId);\n\n implementations.set(pluginId, implementation);\n\n return implementation as T;\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 FactoryFunc,\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[];\n}\n\nexport type ServiceHolder = {\n get<T>(api: ServiceRef<T>): FactoryFunc<T> | undefined;\n};\n\n/**\n * @public\n */\nexport function createSpecializedBackend(\n options: CreateSpecializedBackendOptions,\n): Backend {\n return new BackstageBackend(options.services);\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 configServiceRef,\n createServiceFactory,\n cacheServiceRef,\n} from '@backstage/backend-plugin-api';\n\n/** @public */\nexport const cacheFactory = createServiceFactory({\n service: cacheServiceRef,\n deps: {\n configFactory: configServiceRef,\n },\n factory: async ({ configFactory }) => {\n const config = await configFactory('root');\n const cacheManager = CacheManager.fromConfig(config);\n return async (pluginId: string) => {\n return cacheManager.forPlugin(pluginId);\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 configServiceRef,\n createServiceFactory,\n loggerToWinstonLogger,\n loggerServiceRef,\n} from '@backstage/backend-plugin-api';\n\n/** @public */\nexport const configFactory = createServiceFactory({\n service: configServiceRef,\n deps: {\n loggerFactory: loggerServiceRef,\n },\n factory: async ({ loggerFactory }) => {\n const logger = await loggerFactory('root');\n const config = await loadBackendConfig({\n argv: process.argv,\n logger: loggerToWinstonLogger(logger),\n });\n return async () => {\n return config;\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 { DatabaseManager } from '@backstage/backend-common';\nimport {\n configServiceRef,\n createServiceFactory,\n databaseServiceRef,\n} from '@backstage/backend-plugin-api';\n\n/** @public */\nexport const databaseFactory = createServiceFactory({\n service: databaseServiceRef,\n deps: {\n configFactory: configServiceRef,\n },\n factory: async ({ configFactory }) => {\n const config = await configFactory('root');\n const databaseManager = DatabaseManager.fromConfig(config);\n return async (pluginId: string) => {\n return databaseManager.forPlugin(pluginId);\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 configServiceRef,\n createServiceFactory,\n discoveryServiceRef,\n} from '@backstage/backend-plugin-api';\n\n/** @public */\nexport const discoveryFactory = createServiceFactory({\n service: discoveryServiceRef,\n deps: {\n configFactory: configServiceRef,\n },\n factory: async ({ configFactory }) => {\n const config = await configFactory('root');\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 { createRootLogger } from '@backstage/backend-common';\nimport {\n createServiceFactory,\n Logger,\n loggerServiceRef,\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 loggerFactory = createServiceFactory({\n service: loggerServiceRef,\n deps: {},\n factory: async () => {\n const root = BackstageLogger.fromWinston(createRootLogger());\n return async (pluginId: string) => {\n return root.child({ pluginId });\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 configServiceRef,\n createServiceFactory,\n discoveryServiceRef,\n permissionsServiceRef,\n tokenManagerServiceRef,\n} from '@backstage/backend-plugin-api';\nimport { ServerPermissionClient } from '@backstage/plugin-permission-node';\n\n/** @public */\nexport const permissionsFactory = createServiceFactory({\n service: permissionsServiceRef,\n deps: {\n configFactory: configServiceRef,\n discoveryFactory: discoveryServiceRef,\n tokenManagerFactory: tokenManagerServiceRef,\n },\n factory: async ({ configFactory, discoveryFactory, tokenManagerFactory }) => {\n const config = await configFactory('root');\n const discovery = await discoveryFactory('root');\n const tokenManager = await tokenManagerFactory('root');\n const permissions = ServerPermissionClient.fromConfig(config, {\n discovery,\n tokenManager,\n });\n return async (_pluginId: string) => {\n return permissions;\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 configServiceRef,\n createServiceFactory,\n schedulerServiceRef,\n} from '@backstage/backend-plugin-api';\nimport { TaskScheduler } from '@backstage/backend-tasks';\n\n/** @public */\nexport const schedulerFactory = createServiceFactory({\n service: schedulerServiceRef,\n deps: {\n configFactory: configServiceRef,\n },\n factory: async ({ configFactory }) => {\n const config = await configFactory('root');\n const taskScheduler = TaskScheduler.fromConfig(config);\n return async (pluginId: string) => {\n return taskScheduler.forPlugin(pluginId);\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 configServiceRef,\n loggerServiceRef,\n createServiceFactory,\n tokenManagerServiceRef,\n loggerToWinstonLogger,\n} from '@backstage/backend-plugin-api';\nimport { ServerTokenManager } from '@backstage/backend-common';\n\n/** @public */\nexport const tokenManagerFactory = createServiceFactory({\n service: tokenManagerServiceRef,\n deps: {\n configFactory: configServiceRef,\n loggerFactory: loggerServiceRef,\n },\n factory: async ({ configFactory, loggerFactory }) => {\n const logger = await loggerFactory('root');\n const config = await configFactory('root');\n return async (_pluginId: string) => {\n // doesn't the logger want to be inferred from the plugin tho here?\n // maybe ... also why do we recreate it every time otherwise\n // we should memoize on a per plugin right? so I think it's should be fine to re-use the plugin one\n // we shouldn't recreate on a per plugin basis.\n // hm - on the other hand, is this really ever called more than once?\n // not this function right. should only be called when the plugin requests this serviceRef\n // yeah so no need to worry about memo probably\n // but we still want to scope the logger to the ServrTokenmanagfer>?\n // mm sure maybe\n // maybe in this case it doesn't provide so much value b\n // oh hang on - isn't it up to THE MANAGER to make a child internally if it wants to do that\n // so that it becomes a property intrinsic to that class, no matter how it's constructed\n // or is that too much responsibility for it - making the constructor complex so to speak, making it harder to tweak that behavior\n // this is not ultra efficient :)\n\n // I think the naming here is wrong to be gonest\n // this isn't like the cache manager or the database manager\n // the manager name is confusuion i think\n // aye perhaps\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 configServiceRef,\n createServiceFactory,\n loggerServiceRef,\n loggerToWinstonLogger,\n urlReaderServiceRef,\n} from '@backstage/backend-plugin-api';\n\n/** @public */\nexport const urlReaderFactory = createServiceFactory({\n service: urlReaderServiceRef,\n deps: {\n configFactory: configServiceRef,\n loggerFactory: loggerServiceRef,\n },\n factory: async ({ configFactory, loggerFactory }) => {\n return async (pluginId: string) => {\n const logger = await loggerFactory(pluginId);\n return UrlReaders.default({\n logger: loggerToWinstonLogger(logger),\n config: await configFactory(pluginId),\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 httpRouterServiceRef,\n configServiceRef,\n} from '@backstage/backend-plugin-api';\nimport Router from 'express-promise-router';\nimport { Handler } from 'express';\nimport { createServiceBuilder } from '@backstage/backend-common';\n\n/** @public */\nexport const httpRouterFactory = createServiceFactory({\n service: httpRouterServiceRef,\n deps: {\n configFactory: configServiceRef,\n },\n factory: async ({ configFactory }) => {\n const rootRouter = Router();\n\n const service = createServiceBuilder(module)\n .loadConfig(await configFactory('root'))\n .addRouter('', rootRouter);\n\n await service.start();\n\n return async (pluginId?: string) => {\n const path = pluginId ? `/api/${pluginId}` : '';\n return {\n use(handler: Handler) {\n rootRouter.use(path, handler);\n },\n };\n };\n },\n});\n"],"names":["__accessCheck","__privateGet","__privateAdd","__privateSet","createServiceFactory","cacheServiceRef","configServiceRef","CacheManager","loggerServiceRef","loadBackendConfig","loggerToWinstonLogger","databaseServiceRef","DatabaseManager","discoveryServiceRef","SingleHostDiscovery","createRootLogger","permissionsServiceRef","tokenManagerServiceRef","ServerPermissionClient","schedulerServiceRef","TaskScheduler","ServerTokenManager","urlReaderServiceRef","UrlReaders","httpRouterServiceRef","Router","createServiceBuilder"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -4,27 +4,75 @@
4
4
  * @packageDocumentation
5
5
  */
6
6
 
7
- import { AnyServiceFactory } from '@backstage/backend-plugin-api';
8
- import { BackendRegistrable } from '@backstage/backend-plugin-api';
7
+ import { BackendFeature } from '@backstage/backend-plugin-api';
8
+ import { Config } from '@backstage/config';
9
+ import { ExtensionPoint } from '@backstage/backend-plugin-api';
10
+ import { HttpRouterService } from '@backstage/backend-plugin-api';
11
+ import { Logger } from '@backstage/backend-plugin-api';
12
+ import { PermissionAuthorizer } from '@backstage/plugin-permission-common';
13
+ import { PermissionEvaluator } from '@backstage/plugin-permission-common';
14
+ import { PluginCacheManager } from '@backstage/backend-common';
15
+ import { PluginDatabaseManager } from '@backstage/backend-common';
16
+ import { PluginEndpointDiscovery } from '@backstage/backend-common';
17
+ import { PluginTaskScheduler } from '@backstage/backend-tasks';
18
+ import { ServiceFactory } from '@backstage/backend-plugin-api';
19
+ import { ServiceRef } from '@backstage/backend-plugin-api';
20
+ import { TokenManager } from '@backstage/backend-common';
21
+ import { UrlReader } from '@backstage/backend-common';
9
22
 
10
23
  /**
11
24
  * @public
12
25
  */
13
26
  export declare interface Backend {
14
- add(extension: BackendRegistrable): void;
27
+ add(feature: BackendFeature): void;
15
28
  start(): Promise<void>;
16
29
  }
17
30
 
31
+ /** @public */
32
+ export declare const cacheFactory: ServiceFactory<PluginCacheManager>;
33
+
34
+ /** @public */
35
+ export declare const configFactory: ServiceFactory<Config>;
36
+
18
37
  /**
19
38
  * @public
20
39
  */
21
- export declare function createBackend(options?: CreateBackendOptions): Backend;
40
+ export declare function createSpecializedBackend(options: CreateSpecializedBackendOptions): Backend;
22
41
 
23
42
  /**
24
43
  * @public
25
44
  */
26
- export declare interface CreateBackendOptions {
27
- apis: AnyServiceFactory[];
45
+ export declare interface CreateSpecializedBackendOptions {
46
+ services: ServiceFactory[];
28
47
  }
29
48
 
49
+ /** @public */
50
+ export declare const databaseFactory: ServiceFactory<PluginDatabaseManager>;
51
+
52
+ /** @public */
53
+ export declare const discoveryFactory: ServiceFactory<PluginEndpointDiscovery>;
54
+
55
+ /** @public */
56
+ export declare const httpRouterFactory: ServiceFactory<HttpRouterService>;
57
+
58
+ /** @public */
59
+ export declare const loggerFactory: ServiceFactory<Logger>;
60
+
61
+ /** @public */
62
+ export declare const permissionsFactory: ServiceFactory<PermissionAuthorizer | PermissionEvaluator>;
63
+
64
+ /** @public */
65
+ export declare const schedulerFactory: ServiceFactory<PluginTaskScheduler>;
66
+
67
+ /**
68
+ * @public
69
+ */
70
+ export declare type ServiceOrExtensionPoint<T = unknown> = ExtensionPoint<T> | ServiceRef<T>;
71
+
72
+ /** @public */
73
+ export declare const tokenManagerFactory: ServiceFactory<TokenManager>;
74
+
75
+ /** @public */
76
+ export declare const urlReaderFactory: ServiceFactory<UrlReader>;
77
+
30
78
  export { }
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.1.0",
4
+ "version": "0.2.1-next.0",
5
5
  "main": "dist/index.cjs.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "private": false,
@@ -34,20 +34,20 @@
34
34
  "start": "backstage-cli package start"
35
35
  },
36
36
  "dependencies": {
37
- "@backstage/backend-common": "^0.14.1",
38
- "@backstage/backend-plugin-api": "^0.1.0",
39
- "@backstage/backend-tasks": "^0.3.3",
40
- "@backstage/plugin-permission-node": "^0.6.3",
37
+ "@backstage/backend-common": "^0.15.1-next.0",
38
+ "@backstage/backend-plugin-api": "^0.1.2-next.0",
39
+ "@backstage/backend-tasks": "^0.3.5-next.0",
40
+ "@backstage/plugin-permission-node": "^0.6.5-next.0",
41
41
  "express": "^4.17.1",
42
42
  "express-promise-router": "^4.1.0",
43
43
  "winston": "^3.2.1"
44
44
  },
45
45
  "devDependencies": {
46
- "@backstage/cli": "^0.18.0"
46
+ "@backstage/cli": "^0.18.2-next.0"
47
47
  },
48
48
  "files": [
49
49
  "dist",
50
50
  "alpha"
51
51
  ],
52
- "gitHead": "999878d8f1ae30f6a15925816af2016cb9d717a1"
52
+ "gitHead": "c6c0b1978a7ab4d29d813996c56beb7e6b48a268"
53
53
  }